PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/test/capi3.test

https://bitbucket.org/aware/sqlite
Unknown | 1229 lines | 1137 code | 92 blank | 0 comment | 0 complexity | c5861df8af98872407d379bf67e571ff MD5 | raw file
  1. # 2003 January 29
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. # This file implements regression tests for SQLite library. The
  12. # focus of this script testing the callback-free C/C++ API.
  13. #
  14. # $Id:$
  15. #
  16. set testdir [file dirname $argv0]
  17. source $testdir/tester.tcl
  18. # Do not use a codec for tests in this file, as the database file is
  19. # manipulated directly using tcl scripts (using the [hexio_write] command).
  20. #
  21. do_not_use_codec
  22. # Return the UTF-16 representation of the supplied UTF-8 string $str.
  23. # If $nt is true, append two 0x00 bytes as a nul terminator.
  24. proc utf16 {str {nt 1}} {
  25. set r [encoding convertto unicode $str]
  26. if {$nt} {
  27. append r "\x00\x00"
  28. }
  29. return $r
  30. }
  31. # Return the UTF-8 representation of the supplied UTF-16 string $str.
  32. proc utf8 {str} {
  33. # If $str ends in two 0x00 0x00 bytes, knock these off before
  34. # converting to UTF-8 using TCL.
  35. binary scan $str \c* vals
  36. if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
  37. set str [binary format \c* [lrange $vals 0 end-2]]
  38. }
  39. set r [encoding convertfrom unicode $str]
  40. return $r
  41. }
  42. # These tests complement those in capi2.test. They are organized
  43. # as follows:
  44. #
  45. # capi3-1.*: Test sqlite3_prepare
  46. # capi3-2.*: Test sqlite3_prepare16
  47. # capi3-3.*: Test sqlite3_open
  48. # capi3-4.*: Test sqlite3_open16
  49. # capi3-5.*: Test the various sqlite3_result_* APIs
  50. # capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
  51. #
  52. set DB [sqlite3_connection_pointer db]
  53. do_test capi3-1.0 {
  54. sqlite3_get_autocommit $DB
  55. } 1
  56. do_test capi3-1.1 {
  57. set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
  58. sqlite3_finalize $STMT
  59. set TAIL
  60. } {}
  61. do_test capi3-1.2.1 {
  62. sqlite3_errcode $DB
  63. } {SQLITE_OK}
  64. do_test capi3-1.2.2 {
  65. sqlite3_extended_errcode $DB
  66. } {SQLITE_OK}
  67. do_test capi3-1.3 {
  68. sqlite3_errmsg $DB
  69. } {not an error}
  70. do_test capi3-1.4 {
  71. set sql {SELECT name FROM sqlite_master;SELECT 10}
  72. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  73. sqlite3_finalize $STMT
  74. set TAIL
  75. } {SELECT 10}
  76. do_test capi3-1.5 {
  77. set sql {SELECT name FROM sqlite_master;SELECT 10}
  78. set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL]
  79. sqlite3_finalize $STMT
  80. set TAIL
  81. } {SELECT 10}
  82. do_test capi3-1.6 {
  83. set sql {SELECT name FROM sqlite_master;SELECT 10}
  84. set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL]
  85. sqlite3_finalize $STMT
  86. set TAIL
  87. } {SELECT 10}
  88. do_test capi3-1.7 {
  89. set sql {SELECT namex FROM sqlite_master}
  90. catch {
  91. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  92. }
  93. } {1}
  94. do_test capi3-1.8.1 {
  95. sqlite3_errcode $DB
  96. } {SQLITE_ERROR}
  97. do_test capi3-1.8.2 {
  98. sqlite3_extended_errcode $DB
  99. } {SQLITE_ERROR}
  100. do_test capi3-1.9 {
  101. sqlite3_errmsg $DB
  102. } {no such column: namex}
  103. ifcapable {utf16} {
  104. do_test capi3-2.1 {
  105. set sql16 [utf16 {SELECT name FROM sqlite_master}]
  106. set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
  107. sqlite3_finalize $STMT
  108. utf8 $::TAIL
  109. } {}
  110. do_test capi3-2.2 {
  111. set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
  112. set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
  113. sqlite3_finalize $STMT
  114. utf8 $TAIL
  115. } {SELECT 10}
  116. do_test capi3-2.3 {
  117. set sql [utf16 {SELECT namex FROM sqlite_master}]
  118. catch {
  119. set STMT [sqlite3_prepare16 $DB $sql -1]
  120. }
  121. } {1}
  122. do_test capi3-2.4.1 {
  123. sqlite3_errcode $DB
  124. } {SQLITE_ERROR}
  125. do_test capi3-2.4.2 {
  126. sqlite3_extended_errcode $DB
  127. } {SQLITE_ERROR}
  128. do_test capi3-2.5 {
  129. sqlite3_errmsg $DB
  130. } {no such column: namex}
  131. ifcapable schema_pragmas {
  132. do_test capi3-2.6 {
  133. execsql {CREATE TABLE tablename(x)}
  134. set sql16 [utf16 {PRAGMA table_info("TableName"); --excess text}]
  135. set STMT [sqlite3_prepare16 $DB $sql16 -1]
  136. sqlite3_step $STMT
  137. } SQLITE_ROW
  138. do_test capi3-2.7 {
  139. sqlite3_step $STMT
  140. } SQLITE_DONE
  141. do_test capi3-2.8 {
  142. sqlite3_finalize $STMT
  143. } SQLITE_OK
  144. }
  145. } ;# endif utf16
  146. # rename sqlite3_open sqlite3_open_old
  147. # proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
  148. do_test capi3-3.1 {
  149. set db2 [sqlite3_open test.db {}]
  150. sqlite3_errcode $db2
  151. } {SQLITE_OK}
  152. # FIX ME: Should test the db handle works.
  153. do_test capi3-3.2 {
  154. sqlite3_close $db2
  155. } {SQLITE_OK}
  156. do_test capi3-3.3 {
  157. catch {
  158. set db2 [sqlite3_open /bogus/path/test.db {}]
  159. }
  160. sqlite3_extended_errcode $db2
  161. } {SQLITE_CANTOPEN}
  162. do_test capi3-3.4 {
  163. sqlite3_errmsg $db2
  164. } {unable to open database file}
  165. do_test capi3-3.5 {
  166. sqlite3_close $db2
  167. } {SQLITE_OK}
  168. do_test capi3-3.6.1-misuse {
  169. sqlite3_close $db2
  170. } {SQLITE_MISUSE}
  171. do_test capi3-3.6.2-misuse {
  172. sqlite3_errmsg $db2
  173. } {library routine called out of sequence}
  174. ifcapable {utf16} {
  175. do_test capi3-3.6.3-misuse {
  176. utf8 [sqlite3_errmsg16 $db2]
  177. } {library routine called out of sequence}
  178. }
  179. do_test capi3-3.7 {
  180. set db2 [sqlite3_open]
  181. sqlite3_errcode $db2
  182. } {SQLITE_OK}
  183. do_test capi3-3.8 {
  184. sqlite3_close $db2
  185. } {SQLITE_OK}
  186. # rename sqlite3_open ""
  187. # rename sqlite3_open_old sqlite3_open
  188. ifcapable {utf16} {
  189. do_test capi3-4.1 {
  190. set db2 [sqlite3_open16 [utf16 test.db] {}]
  191. sqlite3_errcode $db2
  192. } {SQLITE_OK}
  193. # FIX ME: Should test the db handle works.
  194. do_test capi3-4.2 {
  195. sqlite3_close $db2
  196. } {SQLITE_OK}
  197. do_test capi3-4.3 {
  198. catch {
  199. set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
  200. }
  201. sqlite3_errcode $db2
  202. } {SQLITE_CANTOPEN}
  203. do_test capi3-4.4 {
  204. utf8 [sqlite3_errmsg16 $db2]
  205. } {unable to open database file}
  206. do_test capi3-4.5 {
  207. sqlite3_close $db2
  208. } {SQLITE_OK}
  209. } ;# utf16
  210. # This proc is used to test the following API calls:
  211. #
  212. # sqlite3_column_count
  213. # sqlite3_column_name
  214. # sqlite3_column_name16
  215. # sqlite3_column_decltype
  216. # sqlite3_column_decltype16
  217. #
  218. # $STMT is a compiled SQL statement. $test is a prefix
  219. # to use for test names within this proc. $names is a list
  220. # of the column names that should be returned by $STMT.
  221. # $decltypes is a list of column declaration types for $STMT.
  222. #
  223. # Example:
  224. #
  225. # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
  226. # check_header test1.1 {1 2 3} {"" "" ""}
  227. #
  228. proc check_header {STMT test names decltypes} {
  229. # Use the return value of sqlite3_column_count() to build
  230. # a list of column indexes. i.e. If sqlite3_column_count
  231. # is 3, build the list {0 1 2}.
  232. set ::idxlist [list]
  233. set ::numcols [sqlite3_column_count $STMT]
  234. for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
  235. # Column names in UTF-8
  236. do_test $test.1 {
  237. set cnamelist [list]
  238. foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
  239. set cnamelist
  240. } $names
  241. # Column names in UTF-16
  242. ifcapable {utf16} {
  243. do_test $test.2 {
  244. set cnamelist [list]
  245. foreach i $idxlist {
  246. lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
  247. }
  248. set cnamelist
  249. } $names
  250. }
  251. # Column names in UTF-8
  252. do_test $test.3 {
  253. set cnamelist [list]
  254. foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
  255. set cnamelist
  256. } $names
  257. # Column names in UTF-16
  258. ifcapable {utf16} {
  259. do_test $test.4 {
  260. set cnamelist [list]
  261. foreach i $idxlist {
  262. lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
  263. }
  264. set cnamelist
  265. } $names
  266. }
  267. # Column names in UTF-8
  268. do_test $test.5 {
  269. set cnamelist [list]
  270. foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]}
  271. set cnamelist
  272. } $decltypes
  273. # Column declaration types in UTF-16
  274. ifcapable {utf16} {
  275. do_test $test.6 {
  276. set cnamelist [list]
  277. foreach i $idxlist {
  278. lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
  279. }
  280. set cnamelist
  281. } $decltypes
  282. }
  283. # Test some out of range conditions:
  284. ifcapable {utf16} {
  285. do_test $test.7 {
  286. list \
  287. [sqlite3_column_name $STMT -1] \
  288. [sqlite3_column_name16 $STMT -1] \
  289. [sqlite3_column_decltype $STMT -1] \
  290. [sqlite3_column_decltype16 $STMT -1] \
  291. [sqlite3_column_name $STMT $numcols] \
  292. [sqlite3_column_name16 $STMT $numcols] \
  293. [sqlite3_column_decltype $STMT $numcols] \
  294. [sqlite3_column_decltype16 $STMT $numcols]
  295. } {{} {} {} {} {} {} {} {}}
  296. }
  297. }
  298. # This proc is used to test the following API calls:
  299. #
  300. # sqlite3_column_origin_name
  301. # sqlite3_column_origin_name16
  302. # sqlite3_column_table_name
  303. # sqlite3_column_table_name16
  304. # sqlite3_column_database_name
  305. # sqlite3_column_database_name16
  306. #
  307. # $STMT is a compiled SQL statement. $test is a prefix
  308. # to use for test names within this proc. $names is a list
  309. # of the column names that should be returned by $STMT.
  310. # $decltypes is a list of column declaration types for $STMT.
  311. #
  312. # Example:
  313. #
  314. # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
  315. # check_header test1.1 {1 2 3} {"" "" ""}
  316. #
  317. proc check_origin_header {STMT test dbs tables cols} {
  318. # If sqlite3_column_origin_name() and friends are not compiled into
  319. # this build, this proc is a no-op.
  320. ifcapable columnmetadata {
  321. # Use the return value of sqlite3_column_count() to build
  322. # a list of column indexes. i.e. If sqlite3_column_count
  323. # is 3, build the list {0 1 2}.
  324. set ::idxlist [list]
  325. set ::numcols [sqlite3_column_count $STMT]
  326. for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
  327. # Database names in UTF-8
  328. do_test $test.8 {
  329. set cnamelist [list]
  330. foreach i $idxlist {
  331. lappend cnamelist [sqlite3_column_database_name $STMT $i]
  332. }
  333. set cnamelist
  334. } $dbs
  335. # Database names in UTF-16
  336. ifcapable {utf16} {
  337. do_test $test.9 {
  338. set cnamelist [list]
  339. foreach i $idxlist {
  340. lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]]
  341. }
  342. set cnamelist
  343. } $dbs
  344. }
  345. # Table names in UTF-8
  346. do_test $test.10 {
  347. set cnamelist [list]
  348. foreach i $idxlist {
  349. lappend cnamelist [sqlite3_column_table_name $STMT $i]
  350. }
  351. set cnamelist
  352. } $tables
  353. # Table names in UTF-16
  354. ifcapable {utf16} {
  355. do_test $test.11 {
  356. set cnamelist [list]
  357. foreach i $idxlist {
  358. lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]]
  359. }
  360. set cnamelist
  361. } $tables
  362. }
  363. # Origin names in UTF-8
  364. do_test $test.12 {
  365. set cnamelist [list]
  366. foreach i $idxlist {
  367. lappend cnamelist [sqlite3_column_origin_name $STMT $i]
  368. }
  369. set cnamelist
  370. } $cols
  371. # Origin declaration types in UTF-16
  372. ifcapable {utf16} {
  373. do_test $test.13 {
  374. set cnamelist [list]
  375. foreach i $idxlist {
  376. lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]]
  377. }
  378. set cnamelist
  379. } $cols
  380. }
  381. }
  382. }
  383. # This proc is used to test the following APIs:
  384. #
  385. # sqlite3_data_count
  386. # sqlite3_column_type
  387. # sqlite3_column_int
  388. # sqlite3_column_text
  389. # sqlite3_column_text16
  390. # sqlite3_column_double
  391. #
  392. # $STMT is a compiled SQL statement for which the previous call
  393. # to sqlite3_step returned SQLITE_ROW. $test is a prefix to use
  394. # for test names within this proc. $types is a list of the
  395. # manifest types for the current row. $ints, $doubles and $strings
  396. # are lists of the integer, real and string representations of
  397. # the values in the current row.
  398. #
  399. # Example:
  400. #
  401. # set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
  402. # sqlite3_step $STMT
  403. # check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
  404. #
  405. proc check_data {STMT test types ints doubles strings} {
  406. # Use the return value of sqlite3_column_count() to build
  407. # a list of column indexes. i.e. If sqlite3_column_count
  408. # is 3, build the list {0 1 2}.
  409. set ::idxlist [list]
  410. set numcols [sqlite3_data_count $STMT]
  411. for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
  412. # types
  413. do_test $test.1 {
  414. set types [list]
  415. foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
  416. set types
  417. } $types
  418. # Integers
  419. do_test $test.2 {
  420. set ints [list]
  421. foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
  422. set ints
  423. } $ints
  424. # bytes
  425. set lens [list]
  426. foreach i $::idxlist {
  427. lappend lens [string length [lindex $strings $i]]
  428. }
  429. do_test $test.3 {
  430. set bytes [list]
  431. set lens [list]
  432. foreach i $idxlist {
  433. lappend bytes [sqlite3_column_bytes $STMT $i]
  434. }
  435. set bytes
  436. } $lens
  437. # bytes16
  438. ifcapable {utf16} {
  439. set lens [list]
  440. foreach i $::idxlist {
  441. lappend lens [expr 2 * [string length [lindex $strings $i]]]
  442. }
  443. do_test $test.4 {
  444. set bytes [list]
  445. set lens [list]
  446. foreach i $idxlist {
  447. lappend bytes [sqlite3_column_bytes16 $STMT $i]
  448. }
  449. set bytes
  450. } $lens
  451. }
  452. # Blob
  453. do_test $test.5 {
  454. set utf8 [list]
  455. foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
  456. set utf8
  457. } $strings
  458. # UTF-8
  459. do_test $test.6 {
  460. set utf8 [list]
  461. foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
  462. set utf8
  463. } $strings
  464. # Floats
  465. do_test $test.7 {
  466. set utf8 [list]
  467. foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
  468. set utf8
  469. } $doubles
  470. # UTF-16
  471. ifcapable {utf16} {
  472. do_test $test.8 {
  473. set utf8 [list]
  474. foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
  475. set utf8
  476. } $strings
  477. }
  478. # Integers
  479. do_test $test.9 {
  480. set ints [list]
  481. foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
  482. set ints
  483. } $ints
  484. # Floats
  485. do_test $test.10 {
  486. set utf8 [list]
  487. foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
  488. set utf8
  489. } $doubles
  490. # UTF-8
  491. do_test $test.11 {
  492. set utf8 [list]
  493. foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
  494. set utf8
  495. } $strings
  496. # Types
  497. do_test $test.12 {
  498. set types [list]
  499. foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
  500. set types
  501. } $types
  502. # Test that an out of range request returns the equivalent of NULL
  503. do_test $test.13 {
  504. sqlite3_column_int $STMT -1
  505. } {0}
  506. do_test $test.13 {
  507. sqlite3_column_text $STMT -1
  508. } {}
  509. }
  510. ifcapable !floatingpoint {
  511. finish_test
  512. return
  513. }
  514. do_test capi3-5.0 {
  515. execsql {
  516. CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
  517. INSERT INTO t1 VALUES(1, 2, 3);
  518. INSERT INTO t1 VALUES('one', 'two', NULL);
  519. INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
  520. }
  521. set sql "SELECT * FROM t1"
  522. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  523. sqlite3_column_count $STMT
  524. } 3
  525. check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
  526. check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c}
  527. do_test capi3-5.2 {
  528. sqlite3_step $STMT
  529. } SQLITE_ROW
  530. check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
  531. check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c}
  532. check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
  533. do_test capi3-5.5 {
  534. sqlite3_step $STMT
  535. } SQLITE_ROW
  536. check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
  537. check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c}
  538. check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
  539. do_test capi3-5.8 {
  540. sqlite3_step $STMT
  541. } SQLITE_ROW
  542. check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
  543. check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c}
  544. check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
  545. do_test capi3-5.11 {
  546. sqlite3_step $STMT
  547. } SQLITE_DONE
  548. do_test capi3-5.12 {
  549. sqlite3_finalize $STMT
  550. } SQLITE_OK
  551. do_test capi3-5.20 {
  552. set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a"
  553. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  554. sqlite3_column_count $STMT
  555. } 3
  556. check_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}}
  557. check_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}}
  558. do_test capi3-5.23 {
  559. sqlite3_finalize $STMT
  560. } SQLITE_OK
  561. do_test capi3-5.30 {
  562. set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x"
  563. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  564. sqlite3_column_count $STMT
  565. } 3
  566. check_header $STMT capi3-5.31 {x y z} {VARINT {} {}}
  567. check_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}}
  568. do_test capi3-5.33 {
  569. sqlite3_finalize $STMT
  570. } SQLITE_OK
  571. set ::ENC [execsql {pragma encoding}]
  572. db close
  573. do_test capi3-6.0 {
  574. sqlite3 db test.db
  575. set DB [sqlite3_connection_pointer db]
  576. if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy }
  577. set sql {SELECT a FROM t1 order by rowid}
  578. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  579. expr 0
  580. } {0}
  581. do_test capi3-6.1 {
  582. db cache flush
  583. sqlite3_close $DB
  584. } {SQLITE_BUSY}
  585. # 6.2 and 6.3 used to return SQLITE_ERROR and SQLITE_SCHEMA, respectively.
  586. # But since attempting to close a connection no longer resets the internal
  587. # schema and expires all statements, this is no longer the case.
  588. do_test capi3-6.2 {
  589. sqlite3_step $STMT
  590. } {SQLITE_ROW}
  591. #check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
  592. do_test capi3-6.3 {
  593. sqlite3_finalize $STMT
  594. } {SQLITE_OK}
  595. do_test capi3-6.4-misuse {
  596. db cache flush
  597. sqlite3_close $DB
  598. } {SQLITE_OK}
  599. db close
  600. # This procedure sets the value of the file-format in file 'test.db'
  601. # to $newval. Also, the schema cookie is incremented.
  602. #
  603. proc set_file_format {newval} {
  604. hexio_write test.db 44 [hexio_render_int32 $newval]
  605. set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
  606. incr schemacookie
  607. hexio_write test.db 40 [hexio_render_int32 $schemacookie]
  608. return {}
  609. }
  610. # This procedure returns the value of the file-format in file 'test.db'.
  611. #
  612. proc get_file_format {{fname test.db}} {
  613. return [hexio_get_int [hexio_read $fname 44 4]]
  614. }
  615. if {![sqlite3 -has-codec]} {
  616. # Test what happens when the library encounters a newer file format.
  617. do_test capi3-7.1 {
  618. set_file_format 5
  619. } {}
  620. do_test capi3-7.2 {
  621. catch { sqlite3 db test.db }
  622. catchsql {
  623. SELECT * FROM sqlite_master;
  624. }
  625. } {1 {unsupported file format}}
  626. db close
  627. }
  628. if {![sqlite3 -has-codec]} {
  629. # Now test that the library correctly handles bogus entries in the
  630. # sqlite_master table (schema corruption).
  631. do_test capi3-8.1 {
  632. forcedelete test.db test.db-journal
  633. sqlite3 db test.db
  634. execsql {
  635. CREATE TABLE t1(a);
  636. }
  637. db close
  638. } {}
  639. do_test capi3-8.2 {
  640. sqlite3 db test.db
  641. execsql {
  642. PRAGMA writable_schema=ON;
  643. INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
  644. }
  645. db close
  646. } {}
  647. do_test capi3-8.3 {
  648. catch { sqlite3 db test.db }
  649. catchsql {
  650. SELECT * FROM sqlite_master;
  651. }
  652. } {1 {malformed database schema (?)}}
  653. do_test capi3-8.4 {
  654. # Build a 5-field row record. The first field is a string 'table', and
  655. # subsequent fields are all NULL.
  656. db close
  657. forcedelete test.db test.db-journal
  658. sqlite3 db test.db
  659. execsql {
  660. CREATE TABLE t1(a);
  661. PRAGMA writable_schema=ON;
  662. INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL);
  663. }
  664. db close
  665. } {};
  666. do_test capi3-8.5 {
  667. catch { sqlite3 db test.db }
  668. catchsql {
  669. SELECT * FROM sqlite_master;
  670. }
  671. } {1 {malformed database schema (?)}}
  672. db close
  673. }
  674. forcedelete test.db
  675. forcedelete test.db-journal
  676. # Test the english language string equivalents for sqlite error codes
  677. set code2english [list \
  678. SQLITE_OK {not an error} \
  679. SQLITE_ERROR {SQL logic error or missing database} \
  680. SQLITE_PERM {access permission denied} \
  681. SQLITE_ABORT {callback requested query abort} \
  682. SQLITE_BUSY {database is locked} \
  683. SQLITE_LOCKED {database table is locked} \
  684. SQLITE_NOMEM {out of memory} \
  685. SQLITE_READONLY {attempt to write a readonly database} \
  686. SQLITE_INTERRUPT {interrupted} \
  687. SQLITE_IOERR {disk I/O error} \
  688. SQLITE_CORRUPT {database disk image is malformed} \
  689. SQLITE_FULL {database or disk is full} \
  690. SQLITE_CANTOPEN {unable to open database file} \
  691. SQLITE_EMPTY {table contains no data} \
  692. SQLITE_SCHEMA {database schema has changed} \
  693. SQLITE_CONSTRAINT {constraint failed} \
  694. SQLITE_MISMATCH {datatype mismatch} \
  695. SQLITE_MISUSE {library routine called out of sequence} \
  696. SQLITE_NOLFS {large file support is disabled} \
  697. SQLITE_AUTH {authorization denied} \
  698. SQLITE_FORMAT {auxiliary database format error} \
  699. SQLITE_RANGE {bind or column index out of range} \
  700. SQLITE_NOTADB {file is encrypted or is not a database} \
  701. unknownerror {unknown error} \
  702. ]
  703. set test_number 1
  704. foreach {code english} $code2english {
  705. do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
  706. incr test_number
  707. }
  708. # Test the error message when a "real" out of memory occurs.
  709. if { [permutation] != "nofaultsim" } {
  710. ifcapable memdebug {
  711. do_test capi3-10-1 {
  712. sqlite3 db test.db
  713. set DB [sqlite3_connection_pointer db]
  714. sqlite3_memdebug_fail 1
  715. catchsql {
  716. select * from sqlite_master;
  717. }
  718. } {1 {out of memory}}
  719. do_test capi3-10-2 {
  720. sqlite3_errmsg $::DB
  721. } {out of memory}
  722. ifcapable {utf16} {
  723. do_test capi3-10-3 {
  724. utf8 [sqlite3_errmsg16 $::DB]
  725. } {out of memory}
  726. }
  727. db close
  728. sqlite3_memdebug_fail -1
  729. do_test capi3-10-4 {
  730. sqlite3 db test.db
  731. set DB [sqlite3_connection_pointer db]
  732. sqlite3_memdebug_fail 1
  733. catchsql {
  734. select * from sqlite_master where rowid>5;
  735. }
  736. } {1 {out of memory}}
  737. do_test capi3-10-5 {
  738. sqlite3_errmsg $::DB
  739. } {out of memory}
  740. ifcapable {utf16} {
  741. do_test capi3-10-6 {
  742. utf8 [sqlite3_errmsg16 $::DB]
  743. } {out of memory}
  744. }
  745. db close
  746. sqlite3_memdebug_fail -1
  747. }
  748. }
  749. # The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
  750. # statement issued while there are still outstanding VMs that are part of
  751. # the transaction fails.
  752. sqlite3 db test.db
  753. set DB [sqlite3_connection_pointer db]
  754. sqlite_register_test_function $DB func
  755. do_test capi3-11.1 {
  756. execsql {
  757. BEGIN;
  758. CREATE TABLE t1(a, b);
  759. INSERT INTO t1 VALUES(1, 'int');
  760. INSERT INTO t1 VALUES(2, 'notatype');
  761. }
  762. } {}
  763. do_test capi3-11.1.1 {
  764. sqlite3_get_autocommit $DB
  765. } 0
  766. do_test capi3-11.2 {
  767. set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
  768. sqlite3_step $STMT
  769. } {SQLITE_ROW}
  770. # As of 3.6.5 a COMMIT is OK during while a query is still running -
  771. # as long as it is a read-only query and not an incremental BLOB write.
  772. #
  773. do_test capi3-11.3.1 {
  774. catchsql {
  775. COMMIT;
  776. }
  777. } {0 {}}
  778. do_test capi3-11.3.2 {
  779. sqlite3_extended_errcode $DB
  780. } {SQLITE_OK}
  781. do_test capi3-11.3.3 {
  782. sqlite3_get_autocommit $DB
  783. } 1
  784. do_test capi3-11.3.4 {
  785. db eval {PRAGMA lock_status}
  786. } {main shared temp closed}
  787. do_test capi3-11.4 {
  788. sqlite3_step $STMT
  789. } {SQLITE_ERROR}
  790. do_test capi3-11.5 {
  791. sqlite3_finalize $STMT
  792. } {SQLITE_ERROR}
  793. do_test capi3-11.6 {
  794. catchsql {
  795. SELECT * FROM t1;
  796. }
  797. } {0 {1 int 2 notatype}}
  798. do_test capi3-11.7 {
  799. sqlite3_get_autocommit $DB
  800. } 1
  801. do_test capi3-11.8 {
  802. execsql {
  803. CREATE TABLE t2(a);
  804. INSERT INTO t2 VALUES(1);
  805. INSERT INTO t2 VALUES(2);
  806. BEGIN;
  807. INSERT INTO t2 VALUES(3);
  808. }
  809. } {}
  810. do_test capi3-11.8.1 {
  811. sqlite3_get_autocommit $DB
  812. } 0
  813. do_test capi3-11.9 {
  814. set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
  815. sqlite3_step $STMT
  816. } {SQLITE_ROW}
  817. do_test capi3-11.9.1 {
  818. sqlite3_get_autocommit $DB
  819. } 0
  820. do_test capi3-11.9.2 {
  821. catchsql {
  822. ROLLBACK;
  823. }
  824. } {0 {}}
  825. do_test capi3-11.9.3 {
  826. sqlite3_get_autocommit $DB
  827. } 1
  828. do_test capi3-11.10 {
  829. sqlite3_step $STMT
  830. } {SQLITE_ERROR}
  831. ifcapable !autoreset {
  832. # If SQLITE_OMIT_AUTORESET is defined, then the statement must be
  833. # reset() before it can be passed to step() again.
  834. do_test capi3-11.11a { sqlite3_step $STMT } {SQLITE_MISUSE}
  835. do_test capi3-11.11b { sqlite3_reset $STMT } {SQLITE_ABORT}
  836. }
  837. do_test capi3-11.11 {
  838. sqlite3_step $STMT
  839. } {SQLITE_ROW}
  840. do_test capi3-11.12 {
  841. sqlite3_step $STMT
  842. sqlite3_step $STMT
  843. } {SQLITE_DONE}
  844. do_test capi3-11.13 {
  845. sqlite3_finalize $STMT
  846. } {SQLITE_OK}
  847. do_test capi3-11.14 {
  848. execsql {
  849. SELECT a FROM t2;
  850. }
  851. } {1 2}
  852. do_test capi3-11.14.1 {
  853. sqlite3_get_autocommit $DB
  854. } 1
  855. do_test capi3-11.15 {
  856. catchsql {
  857. ROLLBACK;
  858. }
  859. } {1 {cannot rollback - no transaction is active}}
  860. do_test capi3-11.15.1 {
  861. sqlite3_get_autocommit $DB
  862. } 1
  863. do_test capi3-11.16 {
  864. execsql {
  865. SELECT a FROM t2;
  866. }
  867. } {1 2}
  868. # Sanity check on the definition of 'outstanding VM'. This means any VM
  869. # that has had sqlite3_step() called more recently than sqlite3_finalize() or
  870. # sqlite3_reset(). So a VM that has just been prepared or reset does not
  871. # count as an active VM.
  872. do_test capi3-11.17 {
  873. execsql {
  874. BEGIN;
  875. }
  876. } {}
  877. do_test capi3-11.18 {
  878. set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
  879. catchsql {
  880. COMMIT;
  881. }
  882. } {0 {}}
  883. do_test capi3-11.19 {
  884. sqlite3_step $STMT
  885. } {SQLITE_ROW}
  886. do_test capi3-11.20 {
  887. catchsql {
  888. BEGIN;
  889. COMMIT;
  890. }
  891. } {0 {}}
  892. do_test capi3-11.20 {
  893. sqlite3_reset $STMT
  894. catchsql {
  895. COMMIT;
  896. }
  897. } {1 {cannot commit - no transaction is active}}
  898. do_test capi3-11.21 {
  899. sqlite3_finalize $STMT
  900. } {SQLITE_OK}
  901. # The following tests - capi3-12.* - check that its Ok to start a
  902. # transaction while other VMs are active, and that its Ok to execute
  903. # atomic updates in the same situation
  904. #
  905. do_test capi3-12.1 {
  906. set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
  907. sqlite3_step $STMT
  908. } {SQLITE_ROW}
  909. do_test capi3-12.2 {
  910. catchsql {
  911. INSERT INTO t1 VALUES(3, NULL);
  912. }
  913. } {0 {}}
  914. do_test capi3-12.3 {
  915. catchsql {
  916. INSERT INTO t2 VALUES(4);
  917. }
  918. } {0 {}}
  919. do_test capi3-12.4 {
  920. catchsql {
  921. BEGIN;
  922. INSERT INTO t1 VALUES(4, NULL);
  923. }
  924. } {0 {}}
  925. do_test capi3-12.5 {
  926. sqlite3_step $STMT
  927. } {SQLITE_ROW}
  928. do_test capi3-12.5.1 {
  929. sqlite3_step $STMT
  930. } {SQLITE_ROW}
  931. do_test capi3-12.6 {
  932. sqlite3_step $STMT
  933. } {SQLITE_DONE}
  934. do_test capi3-12.7 {
  935. sqlite3_finalize $STMT
  936. } {SQLITE_OK}
  937. do_test capi3-12.8 {
  938. execsql {
  939. COMMIT;
  940. SELECT a FROM t1;
  941. }
  942. } {1 2 3 4}
  943. # Test cases capi3-13.* test the sqlite3_clear_bindings() and
  944. # sqlite3_sleep APIs.
  945. #
  946. if {[llength [info commands sqlite3_clear_bindings]]>0} {
  947. do_test capi3-13.1 {
  948. execsql {
  949. DELETE FROM t1;
  950. }
  951. set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
  952. sqlite3_step $STMT
  953. } {SQLITE_DONE}
  954. do_test capi3-13.2 {
  955. sqlite3_reset $STMT
  956. sqlite3_bind_text $STMT 1 hello 5
  957. sqlite3_bind_text $STMT 2 world 5
  958. sqlite3_step $STMT
  959. } {SQLITE_DONE}
  960. do_test capi3-13.3 {
  961. sqlite3_reset $STMT
  962. sqlite3_clear_bindings $STMT
  963. sqlite3_step $STMT
  964. } {SQLITE_DONE}
  965. do_test capi3-13-4 {
  966. sqlite3_finalize $STMT
  967. execsql {
  968. SELECT * FROM t1;
  969. }
  970. } {{} {} hello world {} {}}
  971. }
  972. if {[llength [info commands sqlite3_sleep]]>0} {
  973. do_test capi3-13-5 {
  974. set ms [sqlite3_sleep 80]
  975. expr {$ms==80 || $ms==1000}
  976. } {1}
  977. }
  978. # Ticket #1219: Make sure binding APIs can handle a NULL pointer.
  979. #
  980. do_test capi3-14.1-misuse {
  981. set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
  982. lappend rc $msg
  983. } {1 SQLITE_MISUSE}
  984. # Ticket #1650: Honor the nBytes parameter to sqlite3_prepare.
  985. #
  986. do_test capi3-15.1 {
  987. set sql {SELECT * FROM t2}
  988. set nbytes [string length $sql]
  989. append sql { WHERE a==1}
  990. set STMT [sqlite3_prepare $DB $sql $nbytes TAIL]
  991. sqlite3_step $STMT
  992. sqlite3_column_int $STMT 0
  993. } {1}
  994. do_test capi3-15.2 {
  995. sqlite3_step $STMT
  996. sqlite3_column_int $STMT 0
  997. } {2}
  998. do_test capi3-15.3 {
  999. sqlite3_finalize $STMT
  1000. } {SQLITE_OK}
  1001. do_test capi3-15.4 {
  1002. # 123456789 1234567
  1003. set sql {SELECT 1234567890}
  1004. set STMT [sqlite3_prepare $DB $sql 8 TAIL]
  1005. sqlite3_step $STMT
  1006. set v1 [sqlite3_column_int $STMT 0]
  1007. sqlite3_finalize $STMT
  1008. set v1
  1009. } {1}
  1010. do_test capi3-15.5 {
  1011. # 123456789 1234567
  1012. set sql {SELECT 1234567890}
  1013. set STMT [sqlite3_prepare $DB $sql 9 TAIL]
  1014. sqlite3_step $STMT
  1015. set v1 [sqlite3_column_int $STMT 0]
  1016. sqlite3_finalize $STMT
  1017. set v1
  1018. } {12}
  1019. do_test capi3-15.6 {
  1020. # 123456789 1234567
  1021. set sql {SELECT 1234567890}
  1022. set STMT [sqlite3_prepare $DB $sql 12 TAIL]
  1023. sqlite3_step $STMT
  1024. set v1 [sqlite3_column_int $STMT 0]
  1025. sqlite3_finalize $STMT
  1026. set v1
  1027. } {12345}
  1028. do_test capi3-15.7 {
  1029. # 123456789 1234567
  1030. set sql {SELECT 12.34567890}
  1031. set STMT [sqlite3_prepare $DB $sql 12 TAIL]
  1032. sqlite3_step $STMT
  1033. set v1 [sqlite3_column_double $STMT 0]
  1034. sqlite3_finalize $STMT
  1035. set v1
  1036. } {12.34}
  1037. do_test capi3-15.8 {
  1038. # 123456789 1234567
  1039. set sql {SELECT 12.34567890}
  1040. set STMT [sqlite3_prepare $DB $sql 14 TAIL]
  1041. sqlite3_step $STMT
  1042. set v1 [sqlite3_column_double $STMT 0]
  1043. sqlite3_finalize $STMT
  1044. set v1
  1045. } {12.3456}
  1046. # Make sure code is always generated even if an IF EXISTS or
  1047. # IF NOT EXISTS clause is present that the table does not or
  1048. # does exists. That way we will always have a prepared statement
  1049. # to expire when the schema changes.
  1050. #
  1051. do_test capi3-16.1 {
  1052. set sql {DROP TABLE IF EXISTS t3}
  1053. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  1054. sqlite3_finalize $STMT
  1055. expr {$STMT!=""}
  1056. } {1}
  1057. do_test capi3-16.2 {
  1058. set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
  1059. set STMT [sqlite3_prepare $DB $sql -1 TAIL]
  1060. sqlite3_finalize $STMT
  1061. expr {$STMT!=""}
  1062. } {1}
  1063. # But still we do not generate code if there is no SQL
  1064. #
  1065. do_test capi3-16.3 {
  1066. set STMT [sqlite3_prepare $DB {} -1 TAIL]
  1067. sqlite3_finalize $STMT
  1068. expr {$STMT==""}
  1069. } {1}
  1070. do_test capi3-16.4 {
  1071. set STMT [sqlite3_prepare $DB {;} -1 TAIL]
  1072. sqlite3_finalize $STMT
  1073. expr {$STMT==""}
  1074. } {1}
  1075. # Ticket #2426: Misuse of sqlite3_column_* by calling it after
  1076. # a sqlite3_reset should be harmless.
  1077. #
  1078. do_test capi3-17.1 {
  1079. set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
  1080. sqlite3_step $STMT
  1081. sqlite3_column_int $STMT 0
  1082. } {1}
  1083. do_test capi3-17.2 {
  1084. sqlite3_reset $STMT
  1085. sqlite3_column_int $STMT 0
  1086. } {0}
  1087. do_test capi3-17.3 {
  1088. sqlite3_finalize $STMT
  1089. } {SQLITE_OK}
  1090. # Verify that sqlite3_step() fails with an SQLITE_SCHEMA error
  1091. # when the statement is prepared with sqlite3_prepare() (not
  1092. # sqlite3_prepare_v2()) and the schema has changed.
  1093. #
  1094. do_test capi3-18.1 {
  1095. set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL]
  1096. sqlite3 db2 test.db
  1097. db2 eval {CREATE TABLE t3(x)}
  1098. db2 close
  1099. sqlite3_step $STMT
  1100. } {SQLITE_ERROR}
  1101. do_test capi3-18.2 {
  1102. sqlite3_reset $STMT
  1103. sqlite3_errcode db
  1104. } {SQLITE_SCHEMA}
  1105. do_test capi3-18.3 {
  1106. sqlite3_errmsg db
  1107. } {database schema has changed}
  1108. # The error persist on retry when sqlite3_prepare() has been used.
  1109. do_test capi3-18.4 {
  1110. sqlite3_step $STMT
  1111. } {SQLITE_ERROR}
  1112. do_test capi3-18.5 {
  1113. sqlite3_reset $STMT
  1114. sqlite3_errcode db
  1115. } {SQLITE_SCHEMA}
  1116. do_test capi3-18.6 {
  1117. sqlite3_errmsg db
  1118. } {database schema has changed}
  1119. sqlite3_finalize $STMT
  1120. # Ticket #3134. Prepare a statement with an nBytes parameter of 0.
  1121. # Make sure this works correctly and does not reference memory out of
  1122. # range.
  1123. #
  1124. do_test capi3-19.1 {
  1125. sqlite3_prepare_tkt3134 db
  1126. } {}
  1127. # Tests of the interface when no VFS is registered.
  1128. #
  1129. if {![info exists tester_do_binarylog]} {
  1130. db close
  1131. vfs_unregister_all
  1132. do_test capi3-20.1 {
  1133. sqlite3_sleep 100
  1134. } {0}
  1135. vfs_reregister_all
  1136. }
  1137. finish_test