000001 # 2003 January 29
000002 #
000003 # The author disclaims copyright to this source code. In place of
000004 # a legal notice, here is a blessing:
000005 #
000006 # May you do good and not evil.
000007 # May you find forgiveness for yourself and forgive others.
000008 # May you share freely, never taking more than you give.
000009 #
000010 #***********************************************************************
000011 # This file implements regression tests for SQLite library. The
000012 # focus of this script testing the callback-free C/C++ API.
000013 #
000014 # $Id: capi3.test,v 1.70 2009/01/09 02:49:32 drh Exp $
000015 #
000016
000017 set testdir [file dirname $argv0]
000018 source $testdir/tester.tcl
000019 set ::testprefix capi3
000020
000021 # Do not use a codec for tests in this file, as the database file is
000022 # manipulated directly using tcl scripts (using the [hexio_write] command).
000023 #
000024 do_not_use_codec
000025
000026 # Return the UTF-16 representation of the supplied UTF-8 string $str.
000027 # If $nt is true, append two 0x00 bytes as a nul terminator.
000028 proc utf16 {str {nt 1}} {
000029 set r [encoding convertto unicode $str]
000030 if {$nt} {
000031 append r "\x00\x00"
000032 }
000033 return $r
000034 }
000035
000036 # Return the UTF-8 representation of the supplied UTF-16 string $str.
000037 proc utf8 {str} {
000038 # If $str ends in two 0x00 0x00 bytes, knock these off before
000039 # converting to UTF-8 using TCL.
000040 binary scan $str \c* vals
000041 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
000042 set str [binary format \c* [lrange $vals 0 end-2]]
000043 }
000044
000045 set r [encoding convertfrom unicode $str]
000046 return $r
000047 }
000048
000049 # These tests complement those in capi2.test. They are organized
000050 # as follows:
000051 #
000052 # capi3-1.*: Test sqlite3_prepare
000053 # capi3-2.*: Test sqlite3_prepare16
000054 # capi3-3.*: Test sqlite3_open
000055 # capi3-4.*: Test sqlite3_open16
000056 # capi3-5.*: Test the various sqlite3_result_* APIs
000057 # capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
000058 #
000059
000060 set DB [sqlite3_connection_pointer db]
000061
000062 do_test capi3-1.0 {
000063 sqlite3_get_autocommit $DB
000064 } 1
000065 do_test capi3-1.1 {
000066 set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
000067 sqlite3_finalize $STMT
000068 set TAIL
000069 } {}
000070 do_test capi3-1.2.1 {
000071 sqlite3_errcode $DB
000072 } {SQLITE_OK}
000073 do_test capi3-1.2.2 {
000074 sqlite3_extended_errcode $DB
000075 } {SQLITE_OK}
000076 do_test capi3-1.3 {
000077 sqlite3_errmsg $DB
000078 } {not an error}
000079 do_test capi3-1.4 {
000080 set sql {SELECT name FROM sqlite_master;SELECT 10}
000081 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000082 sqlite3_finalize $STMT
000083 set TAIL
000084 } {SELECT 10}
000085 do_test capi3-1.5 {
000086 set sql {SELECT name FROM sqlite_master;SELECT 10}
000087 set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL]
000088 sqlite3_finalize $STMT
000089 set TAIL
000090 } {SELECT 10}
000091 do_test capi3-1.6 {
000092 set sql {SELECT name FROM sqlite_master;SELECT 10}
000093 set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL]
000094 sqlite3_finalize $STMT
000095 set TAIL
000096 } {SELECT 10}
000097
000098 do_test capi3-1.7 {
000099 set sql {SELECT namex FROM sqlite_master}
000100 catch {
000101 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000102 }
000103 } {1}
000104 do_test capi3-1.8.1 {
000105 sqlite3_errcode $DB
000106 } {SQLITE_ERROR}
000107 do_test capi3-1.8.2 {
000108 sqlite3_extended_errcode $DB
000109 } {SQLITE_ERROR}
000110 do_test capi3-1.9 {
000111 sqlite3_errmsg $DB
000112 } {no such column: namex}
000113
000114 ifcapable {utf16} {
000115 do_test capi3-2.1 {
000116 set sql16 [utf16 {SELECT name FROM sqlite_master}]
000117 set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
000118 sqlite3_finalize $STMT
000119 utf8 $::TAIL
000120 } {}
000121 do_test capi3-2.2 {
000122 set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
000123 set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
000124 sqlite3_finalize $STMT
000125 utf8 $TAIL
000126 } {SELECT 10}
000127 do_test capi3-2.3 {
000128 set sql [utf16 {SELECT namex FROM sqlite_master}]
000129 catch {
000130 set STMT [sqlite3_prepare16 $DB $sql -1]
000131 }
000132 } {1}
000133 do_test capi3-2.4.1 {
000134 sqlite3_errcode $DB
000135 } {SQLITE_ERROR}
000136 do_test capi3-2.4.2 {
000137 sqlite3_extended_errcode $DB
000138 } {SQLITE_ERROR}
000139 do_test capi3-2.5 {
000140 sqlite3_errmsg $DB
000141 } {no such column: namex}
000142
000143 ifcapable schema_pragmas {
000144 do_test capi3-2.6 {
000145 execsql {CREATE TABLE tablename(x)}
000146 set sql16 [utf16 {PRAGMA table_info("TableName"); --excess text}]
000147 set STMT [sqlite3_prepare16 $DB $sql16 -1]
000148 sqlite3_step $STMT
000149 } SQLITE_ROW
000150 do_test capi3-2.7 {
000151 sqlite3_step $STMT
000152 } SQLITE_DONE
000153 do_test capi3-2.8 {
000154 sqlite3_finalize $STMT
000155 } SQLITE_OK
000156 }
000157
000158 } ;# endif utf16
000159
000160 # rename sqlite3_open sqlite3_open_old
000161 # proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
000162
000163 do_test capi3-3.1 {
000164 set db2 [sqlite3_open test.db {}]
000165 sqlite3_errcode $db2
000166 } {SQLITE_OK}
000167 # FIX ME: Should test the db handle works.
000168 do_test capi3-3.2 {
000169 sqlite3_close $db2
000170 } {SQLITE_OK}
000171 do_test capi3-3.3 {
000172 catch {
000173 set db2 [sqlite3_open /bogus/path/test.db {}]
000174 }
000175 set ::capi3_errno [sqlite3_system_errno $db2]
000176 list [sqlite3_extended_errcode $db2] [expr {$::capi3_errno!=0}]
000177 } {SQLITE_CANTOPEN 1}
000178 do_test capi3-3.4 {
000179 sqlite3_errmsg $db2
000180 } {unable to open database file}
000181 do_test capi3-3.5 {
000182 list [sqlite3_system_errno $db2] [sqlite3_close $db2]
000183 } [list $::capi3_errno SQLITE_OK]
000184 if {[clang_sanitize_address]==0} {
000185 do_test capi3-3.6.1-misuse {
000186 sqlite3_close $db2
000187 } {SQLITE_MISUSE}
000188 do_test capi3-3.6.2-misuse {
000189 sqlite3_errmsg $db2
000190 } {bad parameter or other API misuse}
000191 ifcapable {utf16} {
000192 do_test capi3-3.6.3-misuse {
000193 utf8 [sqlite3_errmsg16 $db2]
000194 } {bad parameter or other API misuse}
000195 }
000196 }
000197
000198 do_test capi3-3.7 {
000199 set db2 [sqlite3_open]
000200 sqlite3_errcode $db2
000201 } {SQLITE_OK}
000202 do_test capi3-3.8 {
000203 sqlite3_close $db2
000204 } {SQLITE_OK}
000205
000206 # rename sqlite3_open ""
000207 # rename sqlite3_open_old sqlite3_open
000208
000209 ifcapable {utf16} {
000210 do_test capi3-4.1 {
000211 set db2 [sqlite3_open16 [utf16 test.db] {}]
000212 sqlite3_errcode $db2
000213 } {SQLITE_OK}
000214 # FIX ME: Should test the db handle works.
000215 do_test capi3-4.2 {
000216 sqlite3_close $db2
000217 } {SQLITE_OK}
000218 do_test capi3-4.3 {
000219 catch {
000220 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
000221 }
000222 sqlite3_errcode $db2
000223 } {SQLITE_CANTOPEN}
000224 do_test capi3-4.4 {
000225 utf8 [sqlite3_errmsg16 $db2]
000226 } {unable to open database file}
000227 do_test capi3-4.5 {
000228 sqlite3_close $db2
000229 } {SQLITE_OK}
000230 } ;# utf16
000231
000232 # This proc is used to test the following API calls:
000233 #
000234 # sqlite3_column_count
000235 # sqlite3_column_name
000236 # sqlite3_column_name16
000237 # sqlite3_column_decltype
000238 # sqlite3_column_decltype16
000239 #
000240 # $STMT is a compiled SQL statement. $test is a prefix
000241 # to use for test names within this proc. $names is a list
000242 # of the column names that should be returned by $STMT.
000243 # $decltypes is a list of column declaration types for $STMT.
000244 #
000245 # Example:
000246 #
000247 # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
000248 # check_header test1.1 {1 2 3} {"" "" ""}
000249 #
000250 proc check_header {STMT test names decltypes} {
000251
000252 # Use the return value of sqlite3_column_count() to build
000253 # a list of column indexes. i.e. If sqlite3_column_count
000254 # is 3, build the list {0 1 2}.
000255 set ::idxlist [list]
000256 set ::numcols [sqlite3_column_count $STMT]
000257 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
000258
000259 # Column names in UTF-8
000260 do_test $test.1 {
000261 set cnamelist [list]
000262 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
000263 set cnamelist
000264 } $names
000265
000266 # Column names in UTF-16
000267 ifcapable {utf16} {
000268 do_test $test.2 {
000269 set cnamelist [list]
000270 foreach i $idxlist {
000271 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
000272 }
000273 set cnamelist
000274 } $names
000275 }
000276
000277 # Column names in UTF-8
000278 do_test $test.3 {
000279 set cnamelist [list]
000280 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
000281 set cnamelist
000282 } $names
000283
000284 # Column names in UTF-16
000285 ifcapable {utf16} {
000286 do_test $test.4 {
000287 set cnamelist [list]
000288 foreach i $idxlist {
000289 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
000290 }
000291 set cnamelist
000292 } $names
000293 }
000294
000295 # Column names in UTF-8
000296 do_test $test.5 {
000297 set cnamelist [list]
000298 foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]}
000299 set cnamelist
000300 } $decltypes
000301
000302 # Column declaration types in UTF-16
000303 ifcapable {utf16} {
000304 do_test $test.6 {
000305 set cnamelist [list]
000306 foreach i $idxlist {
000307 lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
000308 }
000309 set cnamelist
000310 } $decltypes
000311 }
000312
000313
000314 # Test some out of range conditions:
000315 ifcapable {utf16} {
000316 do_test $test.7 {
000317 list \
000318 [sqlite3_column_name $STMT -1] \
000319 [sqlite3_column_name16 $STMT -1] \
000320 [sqlite3_column_decltype $STMT -1] \
000321 [sqlite3_column_decltype16 $STMT -1] \
000322 [sqlite3_column_name $STMT $numcols] \
000323 [sqlite3_column_name16 $STMT $numcols] \
000324 [sqlite3_column_decltype $STMT $numcols] \
000325 [sqlite3_column_decltype16 $STMT $numcols]
000326 } {{} {} {} {} {} {} {} {}}
000327 }
000328 }
000329
000330 # This proc is used to test the following API calls:
000331 #
000332 # sqlite3_column_origin_name
000333 # sqlite3_column_origin_name16
000334 # sqlite3_column_table_name
000335 # sqlite3_column_table_name16
000336 # sqlite3_column_database_name
000337 # sqlite3_column_database_name16
000338 #
000339 # $STMT is a compiled SQL statement. $test is a prefix
000340 # to use for test names within this proc. $names is a list
000341 # of the column names that should be returned by $STMT.
000342 # $decltypes is a list of column declaration types for $STMT.
000343 #
000344 # Example:
000345 #
000346 # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
000347 # check_header test1.1 {1 2 3} {"" "" ""}
000348 #
000349 proc check_origin_header {STMT test dbs tables cols} {
000350 # If sqlite3_column_origin_name() and friends are not compiled into
000351 # this build, this proc is a no-op.
000352 ifcapable columnmetadata {
000353 # Use the return value of sqlite3_column_count() to build
000354 # a list of column indexes. i.e. If sqlite3_column_count
000355 # is 3, build the list {0 1 2}.
000356 set ::idxlist [list]
000357 set ::numcols [sqlite3_column_count $STMT]
000358 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
000359
000360 # Database names in UTF-8
000361 do_test $test.8 {
000362 set cnamelist [list]
000363 foreach i $idxlist {
000364 lappend cnamelist [sqlite3_column_database_name $STMT $i]
000365 }
000366 set cnamelist
000367 } $dbs
000368
000369 # Database names in UTF-16
000370 ifcapable {utf16} {
000371 do_test $test.9 {
000372 set cnamelist [list]
000373 foreach i $idxlist {
000374 lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]]
000375 }
000376 set cnamelist
000377 } $dbs
000378 }
000379
000380 # Table names in UTF-8
000381 do_test $test.10 {
000382 set cnamelist [list]
000383 foreach i $idxlist {
000384 lappend cnamelist [sqlite3_column_table_name $STMT $i]
000385 }
000386 set cnamelist
000387 } $tables
000388
000389 # Table names in UTF-16
000390 ifcapable {utf16} {
000391 do_test $test.11 {
000392 set cnamelist [list]
000393 foreach i $idxlist {
000394 lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]]
000395 }
000396 set cnamelist
000397 } $tables
000398 }
000399
000400 # Origin names in UTF-8
000401 do_test $test.12 {
000402 set cnamelist [list]
000403 foreach i $idxlist {
000404 lappend cnamelist [sqlite3_column_origin_name $STMT $i]
000405 }
000406 set cnamelist
000407 } $cols
000408
000409 # Origin declaration types in UTF-16
000410 ifcapable {utf16} {
000411 do_test $test.13 {
000412 set cnamelist [list]
000413 foreach i $idxlist {
000414 lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]]
000415 }
000416 set cnamelist
000417 } $cols
000418 }
000419 }
000420 }
000421
000422 # This proc is used to test the following APIs:
000423 #
000424 # sqlite3_data_count
000425 # sqlite3_column_type
000426 # sqlite3_column_int
000427 # sqlite3_column_text
000428 # sqlite3_column_text16
000429 # sqlite3_column_double
000430 #
000431 # $STMT is a compiled SQL statement for which the previous call
000432 # to sqlite3_step returned SQLITE_ROW. $test is a prefix to use
000433 # for test names within this proc. $types is a list of the
000434 # manifest types for the current row. $ints, $doubles and $strings
000435 # are lists of the integer, real and string representations of
000436 # the values in the current row.
000437 #
000438 # Example:
000439 #
000440 # set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
000441 # sqlite3_step $STMT
000442 # check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
000443 #
000444 proc check_data {STMT test types ints doubles strings} {
000445
000446 # Use the return value of sqlite3_column_count() to build
000447 # a list of column indexes. i.e. If sqlite3_column_count
000448 # is 3, build the list {0 1 2}.
000449 set ::idxlist [list]
000450 set numcols [sqlite3_data_count $STMT]
000451 for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
000452
000453 # types
000454 do_test $test.1 {
000455 set types [list]
000456 foreach i $idxlist {
000457 set x [sqlite3_column_type $STMT $i]
000458 # EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five
000459 # fundamental datatypes: 64-bit signed integer 64-bit IEEE floating
000460 # point number string BLOB NULL
000461 if {[lsearch {INTEGER FLOAT TEXT BLOB NULL} $x]<0} {
000462 set types ERROR
000463 break
000464 } else {
000465 lappend types $x
000466 }
000467 }
000468 set types
000469 } $types
000470
000471
000472 # Integers
000473 do_test $test.2 {
000474 set ints [list]
000475 foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
000476 set ints
000477 } $ints
000478
000479 # bytes
000480 set lens [list]
000481 foreach i $::idxlist {
000482 lappend lens [string length [lindex $strings $i]]
000483 }
000484 do_test $test.3 {
000485 set bytes [list]
000486 set lens [list]
000487 foreach i $idxlist {
000488 lappend bytes [sqlite3_column_bytes $STMT $i]
000489 }
000490 set bytes
000491 } $lens
000492
000493 # bytes16
000494 ifcapable {utf16} {
000495 set lens [list]
000496 foreach i $::idxlist {
000497 lappend lens [expr 2 * [string length [lindex $strings $i]]]
000498 }
000499 do_test $test.4 {
000500 set bytes [list]
000501 set lens [list]
000502 foreach i $idxlist {
000503 lappend bytes [sqlite3_column_bytes16 $STMT $i]
000504 }
000505 set bytes
000506 } $lens
000507 }
000508
000509 # Blob
000510 do_test $test.5 {
000511 set utf8 [list]
000512 foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
000513 set utf8
000514 } $strings
000515
000516 # UTF-8
000517 do_test $test.6 {
000518 set utf8 [list]
000519 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
000520 set utf8
000521 } $strings
000522
000523 # Floats
000524 do_test $test.7 {
000525 set utf8 [list]
000526 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
000527 set utf8
000528 } $doubles
000529
000530 # UTF-16
000531 ifcapable {utf16} {
000532 do_test $test.8 {
000533 set utf8 [list]
000534 foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
000535 set utf8
000536 } $strings
000537 }
000538
000539 # Integers
000540 do_test $test.9 {
000541 set ints [list]
000542 foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
000543 set ints
000544 } $ints
000545
000546 # Floats
000547 do_test $test.10 {
000548 set utf8 [list]
000549 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
000550 set utf8
000551 } $doubles
000552
000553 # UTF-8
000554 do_test $test.11 {
000555 set utf8 [list]
000556 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
000557 set utf8
000558 } $strings
000559
000560 # Types
000561 do_test $test.12 {
000562 set types [list]
000563 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
000564 set types
000565 } $types
000566
000567 # Test that an out of range request returns the equivalent of NULL
000568 do_test $test.13 {
000569 sqlite3_column_int $STMT -1
000570 } {0}
000571 do_test $test.13 {
000572 sqlite3_column_text $STMT -1
000573 } {}
000574
000575 }
000576
000577 ifcapable !floatingpoint {
000578 finish_test
000579 return
000580 }
000581
000582 do_test capi3-5.0 {
000583 execsql {
000584 CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
000585 INSERT INTO t1 VALUES(1, 2, 3);
000586 INSERT INTO t1 VALUES('one', 'two', NULL);
000587 INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
000588 }
000589 set sql "SELECT * FROM t1"
000590 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000591 sqlite3_column_count $STMT
000592 } 3
000593
000594 check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
000595 check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c}
000596 do_test capi3-5.2 {
000597 sqlite3_step $STMT
000598 } SQLITE_ROW
000599
000600 check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
000601 check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c}
000602 check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
000603
000604 do_test capi3-5.5 {
000605 sqlite3_step $STMT
000606 } SQLITE_ROW
000607
000608 check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
000609 check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c}
000610 check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
000611
000612 do_test capi3-5.8 {
000613 sqlite3_step $STMT
000614 } SQLITE_ROW
000615
000616 check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
000617 check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c}
000618 check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
000619
000620 do_test capi3-5.11 {
000621 sqlite3_step $STMT
000622 } SQLITE_DONE
000623
000624 do_test capi3-5.12 {
000625 sqlite3_finalize $STMT
000626 } SQLITE_OK
000627
000628 do_test capi3-5.20 {
000629 set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a"
000630 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000631 sqlite3_column_count $STMT
000632 } 3
000633
000634 check_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}}
000635 check_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}}
000636 do_test capi3-5.23 {
000637 sqlite3_finalize $STMT
000638 } SQLITE_OK
000639
000640 do_test capi3-5.30 {
000641 set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x"
000642 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000643 sqlite3_column_count $STMT
000644 } 3
000645
000646 check_header $STMT capi3-5.31 {x y z} {VARINT {} {}}
000647 check_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}}
000648 do_test capi3-5.33 {
000649 sqlite3_finalize $STMT
000650 } SQLITE_OK
000651
000652 # 2018-01-09: If a column is the last token if a string, the column name
000653 # was not being set correctly, due to changes in check-in
000654 # https://sqlite.org/src/info/0fdf97efe5df7455
000655 #
000656 # This problem was detected by the community during beta-testing.
000657 #
000658 do_test capi3-5.34 {
000659 set STMT [sqlite3_prepare $DB {SELECT :a, :b} -1 TAIL]
000660 sqlite3_column_count $STMT
000661 } 2
000662 check_header $STMT capi-5.35 {:a :b} {{} {}}
000663 sqlite3_finalize $STMT
000664
000665 set ::ENC [execsql {pragma encoding}]
000666 db close
000667
000668 do_test capi3-6.0 {
000669 sqlite3 db test.db
000670 set DB [sqlite3_connection_pointer db]
000671 if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy }
000672 set sql {SELECT a FROM t1 order by rowid}
000673 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
000674 expr 0
000675 } {0}
000676 do_test capi3-6.1 {
000677 db cache flush
000678 sqlite3_close $DB
000679 } {SQLITE_BUSY}
000680
000681 # 6.2 and 6.3 used to return SQLITE_ERROR and SQLITE_SCHEMA, respectively.
000682 # But since attempting to close a connection no longer resets the internal
000683 # schema and expires all statements, this is no longer the case.
000684 do_test capi3-6.2 {
000685 sqlite3_step $STMT
000686 } {SQLITE_ROW}
000687 #check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
000688 do_test capi3-6.3 {
000689 sqlite3_finalize $STMT
000690 } {SQLITE_OK}
000691
000692 if {[clang_sanitize_address]==0} {
000693 do_test capi3-6.4-misuse {
000694 db cache flush
000695 sqlite3_close $DB
000696 } {SQLITE_OK}
000697 }
000698 db close
000699
000700 # This procedure sets the value of the file-format in file 'test.db'
000701 # to $newval. Also, the schema cookie is incremented.
000702 #
000703 proc set_file_format {newval} {
000704 hexio_write test.db 44 [hexio_render_int32 $newval]
000705 set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
000706 incr schemacookie
000707 hexio_write test.db 40 [hexio_render_int32 $schemacookie]
000708 return {}
000709 }
000710
000711 # This procedure returns the value of the file-format in file 'test.db'.
000712 #
000713 proc get_file_format {{fname test.db}} {
000714 return [hexio_get_int [hexio_read $fname 44 4]]
000715 }
000716
000717 if {![sqlite3 -has-codec]} {
000718 # Test what happens when the library encounters a newer file format.
000719 do_test capi3-7.1 {
000720 set_file_format 5
000721 } {}
000722 do_test capi3-7.2 {
000723 catch { sqlite3 db test.db }
000724 catchsql {
000725 SELECT * FROM sqlite_master;
000726 }
000727 } {1 {unsupported file format}}
000728 db close
000729 }
000730
000731 if {![sqlite3 -has-codec]} {
000732 # Now test that the library correctly handles bogus entries in the
000733 # sqlite_master table (schema corruption).
000734 do_test capi3-8.1 {
000735 forcedelete test.db test.db-journal
000736 sqlite3 db test.db
000737 execsql {
000738 CREATE TABLE t1(a);
000739 }
000740 db close
000741 } {}
000742 do_test capi3-8.2 {
000743 sqlite3 db test.db
000744 sqlite3_db_config db DEFENSIVE 0
000745 execsql {
000746 PRAGMA writable_schema=ON;
000747 INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
000748 }
000749 db close
000750 } {}
000751 do_test capi3-8.3 {
000752 catch { sqlite3 db test.db }
000753 catchsql {
000754 SELECT * FROM sqlite_master;
000755 }
000756 } {1 {malformed database schema (?)}}
000757 do_test capi3-8.4 {
000758 # Build a 5-field row record. The first field is a string 'table', and
000759 # subsequent fields are all NULL.
000760 db close
000761 forcedelete test.db test.db-journal
000762 sqlite3 db test.db
000763 sqlite3_db_config db DEFENSIVE 0
000764 execsql {
000765 CREATE TABLE t1(a);
000766 PRAGMA writable_schema=ON;
000767 INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL);
000768 }
000769 db close
000770 } {};
000771 do_test capi3-8.5 {
000772 catch { sqlite3 db test.db }
000773 catchsql {
000774 SELECT * FROM sqlite_master;
000775 }
000776 } {1 {malformed database schema (?)}}
000777 db close
000778 }
000779 forcedelete test.db
000780 forcedelete test.db-journal
000781
000782
000783 # Test the english language string equivalents for sqlite error codes
000784 set code2english [list \
000785 SQLITE_OK {not an error} \
000786 SQLITE_ERROR {SQL logic error} \
000787 SQLITE_PERM {access permission denied} \
000788 SQLITE_ABORT {query aborted} \
000789 SQLITE_BUSY {database is locked} \
000790 SQLITE_LOCKED {database table is locked} \
000791 SQLITE_NOMEM {out of memory} \
000792 SQLITE_READONLY {attempt to write a readonly database} \
000793 SQLITE_INTERRUPT {interrupted} \
000794 SQLITE_IOERR {disk I/O error} \
000795 SQLITE_CORRUPT {database disk image is malformed} \
000796 SQLITE_FULL {database or disk is full} \
000797 SQLITE_CANTOPEN {unable to open database file} \
000798 SQLITE_SCHEMA {database schema has changed} \
000799 SQLITE_CONSTRAINT {constraint failed} \
000800 SQLITE_MISMATCH {datatype mismatch} \
000801 SQLITE_MISUSE {bad parameter or other API misuse} \
000802 SQLITE_AUTH {authorization denied} \
000803 SQLITE_RANGE {column index out of range} \
000804 SQLITE_NOTADB {file is not a database} \
000805 unknownerror {unknown error} \
000806 ]
000807
000808 set test_number 1
000809 foreach {code english} $code2english {
000810 do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
000811 incr test_number
000812 }
000813
000814 # Test the error message when a "real" out of memory occurs.
000815 if { [permutation] != "nofaultsim" } {
000816 do_test capi3-10-1 {
000817 sqlite3 db test.db
000818 set DB [sqlite3_connection_pointer db]
000819 sqlite3_memdebug_fail 1
000820 catchsql {
000821 select * from sqlite_master;
000822 }
000823 } {1 {out of memory}}
000824 do_test capi3-10-2 {
000825 sqlite3_errmsg $::DB
000826 } {out of memory}
000827 ifcapable {utf16} {
000828 do_test capi3-10-3 {
000829 utf8 [sqlite3_errmsg16 $::DB]
000830 } {out of memory}
000831 }
000832 db close
000833 sqlite3_memdebug_fail -1
000834 do_test capi3-10-4 {
000835 sqlite3 db test.db
000836 set DB [sqlite3_connection_pointer db]
000837 sqlite3_memdebug_fail 1
000838 catchsql {
000839 select * from sqlite_master where rowid>5;
000840 }
000841 } {1 {out of memory}}
000842 do_test capi3-10-5 {
000843 sqlite3_errmsg $::DB
000844 } {out of memory}
000845 ifcapable {utf16} {
000846 do_test capi3-10-6 {
000847 utf8 [sqlite3_errmsg16 $::DB]
000848 } {out of memory}
000849 }
000850 db close
000851 sqlite3_memdebug_fail -1
000852 }
000853
000854 # The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
000855 # statement issued while there are still outstanding VMs that are part of
000856 # the transaction fails.
000857 sqlite3 db test.db
000858 set DB [sqlite3_connection_pointer db]
000859 sqlite_register_test_function $DB func
000860 do_test capi3-11.1 {
000861 execsql {
000862 BEGIN;
000863 CREATE TABLE t1(a, b);
000864 INSERT INTO t1 VALUES(1, 'int');
000865 INSERT INTO t1 VALUES(2, 'notatype');
000866 }
000867 } {}
000868 do_test capi3-11.1.1 {
000869 sqlite3_get_autocommit $DB
000870 } 0
000871 do_test capi3-11.2 {
000872 set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
000873 sqlite3_step $STMT
000874 } {SQLITE_ROW}
000875
000876 # As of 3.6.5 a COMMIT is OK during while a query is still running -
000877 # as long as it is a read-only query and not an incremental BLOB write.
000878 #
000879 do_test capi3-11.3.1 {
000880 catchsql {
000881 COMMIT;
000882 }
000883 } {0 {}}
000884 do_test capi3-11.3.2 {
000885 sqlite3_extended_errcode $DB
000886 } {SQLITE_OK}
000887 do_test capi3-11.3.3 {
000888 sqlite3_get_autocommit $DB
000889 } 1
000890 do_test capi3-11.3.4 {
000891 db eval {PRAGMA lock_status}
000892 } {main shared temp closed}
000893
000894 do_test capi3-11.4 {
000895 sqlite3_step $STMT
000896 } {SQLITE_ERROR}
000897 do_test capi3-11.5 {
000898 sqlite3_finalize $STMT
000899 } {SQLITE_ERROR}
000900 do_test capi3-11.6 {
000901 catchsql {
000902 SELECT * FROM t1;
000903 }
000904 } {0 {1 int 2 notatype}}
000905 do_test capi3-11.7 {
000906 sqlite3_get_autocommit $DB
000907 } 1
000908 do_test capi3-11.8 {
000909 execsql {
000910 CREATE TABLE t2(a);
000911 INSERT INTO t2 VALUES(1);
000912 INSERT INTO t2 VALUES(2);
000913 BEGIN;
000914 INSERT INTO t2 VALUES(3);
000915 }
000916 } {}
000917 do_test capi3-11.8.1 {
000918 sqlite3_get_autocommit $DB
000919 } 0
000920 do_test capi3-11.9 {
000921 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
000922 sqlite3_step $STMT
000923 } {SQLITE_ROW}
000924 do_test capi3-11.9.1 {
000925 sqlite3_get_autocommit $DB
000926 } 0
000927 do_test capi3-11.9.2 {
000928 catchsql {
000929 ROLLBACK;
000930 }
000931 } {0 {}}
000932 do_test capi3-11.9.3 {
000933 sqlite3_get_autocommit $DB
000934 } 1
000935 do_test capi3-11.10 {
000936 sqlite3_step $STMT
000937 } {SQLITE_ROW}
000938 do_test capi3-11.11 {
000939 sqlite3_step $STMT
000940 } {SQLITE_DONE}
000941 ifcapable !autoreset {
000942 do_test capi3-11.12armor {
000943 sqlite3_step $STMT
000944 sqlite3_step $STMT
000945 } {SQLITE_MISUSE}
000946 } else {
000947 do_test capi3-11.12 {
000948 sqlite3_step $STMT
000949 sqlite3_step $STMT
000950 } {SQLITE_ROW}
000951 }
000952 do_test capi3-11.13 {
000953 sqlite3_finalize $STMT
000954 } {SQLITE_OK}
000955 do_test capi3-11.14 {
000956 execsql {
000957 SELECT a FROM t2;
000958 }
000959 } {1 2}
000960 do_test capi3-11.14.1 {
000961 sqlite3_get_autocommit $DB
000962 } 1
000963 do_test capi3-11.15 {
000964 catchsql {
000965 ROLLBACK;
000966 }
000967 } {1 {cannot rollback - no transaction is active}}
000968 do_test capi3-11.15.1 {
000969 sqlite3_get_autocommit $DB
000970 } 1
000971 do_test capi3-11.16 {
000972 execsql {
000973 SELECT a FROM t2;
000974 }
000975 } {1 2}
000976
000977 # Sanity check on the definition of 'outstanding VM'. This means any VM
000978 # that has had sqlite3_step() called more recently than sqlite3_finalize() or
000979 # sqlite3_reset(). So a VM that has just been prepared or reset does not
000980 # count as an active VM.
000981 do_test capi3-11.17 {
000982 execsql {
000983 BEGIN;
000984 }
000985 } {}
000986 do_test capi3-11.18 {
000987 set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
000988 catchsql {
000989 COMMIT;
000990 }
000991 } {0 {}}
000992 do_test capi3-11.19 {
000993 sqlite3_step $STMT
000994 } {SQLITE_ROW}
000995 do_test capi3-11.20 {
000996 catchsql {
000997 BEGIN;
000998 COMMIT;
000999 }
001000 } {0 {}}
001001 do_test capi3-11.20 {
001002 sqlite3_reset $STMT
001003 catchsql {
001004 COMMIT;
001005 }
001006 } {1 {cannot commit - no transaction is active}}
001007 do_test capi3-11.21 {
001008 sqlite3_finalize $STMT
001009 } {SQLITE_OK}
001010
001011 # The following tests - capi3-12.* - check that its Ok to start a
001012 # transaction while other VMs are active, and that its Ok to execute
001013 # atomic updates in the same situation
001014 #
001015 do_test capi3-12.1 {
001016 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
001017 sqlite3_step $STMT
001018 } {SQLITE_ROW}
001019 do_test capi3-12.2 {
001020 catchsql {
001021 INSERT INTO t1 VALUES(3, NULL);
001022 }
001023 } {0 {}}
001024 do_test capi3-12.3 {
001025 catchsql {
001026 INSERT INTO t2 VALUES(4);
001027 }
001028 } {0 {}}
001029 do_test capi3-12.4 {
001030 catchsql {
001031 BEGIN;
001032 INSERT INTO t1 VALUES(4, NULL);
001033 }
001034 } {0 {}}
001035 do_test capi3-12.5 {
001036 sqlite3_step $STMT
001037 } {SQLITE_ROW}
001038 do_test capi3-12.5.1 {
001039 sqlite3_step $STMT
001040 } {SQLITE_ROW}
001041 do_test capi3-12.6 {
001042 sqlite3_step $STMT
001043 } {SQLITE_DONE}
001044 do_test capi3-12.7 {
001045 sqlite3_finalize $STMT
001046 } {SQLITE_OK}
001047 do_test capi3-12.8 {
001048 execsql {
001049 COMMIT;
001050 SELECT a FROM t1;
001051 }
001052 } {1 2 3 4}
001053
001054 # Test cases capi3-13.* test the sqlite3_clear_bindings() and
001055 # sqlite3_sleep APIs.
001056 #
001057 if {[llength [info commands sqlite3_clear_bindings]]>0} {
001058 do_test capi3-13.1 {
001059 execsql {
001060 DELETE FROM t1;
001061 }
001062 set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
001063 sqlite3_step $STMT
001064 } {SQLITE_DONE}
001065 do_test capi3-13.2 {
001066 sqlite3_reset $STMT
001067 sqlite3_bind_text $STMT 1 hello 5
001068 sqlite3_bind_text $STMT 2 world 5
001069 sqlite3_step $STMT
001070 } {SQLITE_DONE}
001071 do_test capi3-13.3 {
001072 sqlite3_reset $STMT
001073 sqlite3_clear_bindings $STMT
001074 sqlite3_step $STMT
001075 } {SQLITE_DONE}
001076 do_test capi3-13-4 {
001077 sqlite3_finalize $STMT
001078 execsql {
001079 SELECT * FROM t1;
001080 }
001081 } {{} {} hello world {} {}}
001082 }
001083 if {[llength [info commands sqlite3_sleep]]>0} {
001084 do_test capi3-13-5 {
001085 set ms [sqlite3_sleep 80]
001086 expr {$ms==80 || $ms==1000}
001087 } {1}
001088 }
001089
001090 # Ticket #1219: Make sure binding APIs can handle a NULL pointer.
001091 #
001092 if {[clang_sanitize_address]==0} {
001093 do_test capi3-14.1-misuse {
001094 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
001095 lappend rc $msg
001096 } {1 SQLITE_MISUSE}
001097 }
001098
001099 # Ticket #1650: Honor the nBytes parameter to sqlite3_prepare.
001100 #
001101 do_test capi3-15.1 {
001102 set sql {SELECT * FROM t2}
001103 set nbytes [string length $sql]
001104 append sql { WHERE a==1}
001105 set STMT [sqlite3_prepare $DB $sql $nbytes TAIL]
001106 sqlite3_step $STMT
001107 sqlite3_column_int $STMT 0
001108 } {1}
001109 do_test capi3-15.2 {
001110 sqlite3_step $STMT
001111 sqlite3_column_int $STMT 0
001112 } {2}
001113 do_test capi3-15.3 {
001114 sqlite3_finalize $STMT
001115 } {SQLITE_OK}
001116 do_test capi3-15.4 {
001117 # 123456789 1234567
001118 set sql {SELECT 1234567890}
001119 set STMT [sqlite3_prepare $DB $sql 8 TAIL]
001120 sqlite3_step $STMT
001121 set v1 [sqlite3_column_int $STMT 0]
001122 sqlite3_finalize $STMT
001123 set v1
001124 } {1}
001125 do_test capi3-15.5 {
001126 # 123456789 1234567
001127 set sql {SELECT 1234567890}
001128 set STMT [sqlite3_prepare $DB $sql 9 TAIL]
001129 sqlite3_step $STMT
001130 set v1 [sqlite3_column_int $STMT 0]
001131 sqlite3_finalize $STMT
001132 set v1
001133 } {12}
001134 do_test capi3-15.6 {
001135 # 123456789 1234567
001136 set sql {SELECT 1234567890}
001137 set STMT [sqlite3_prepare $DB $sql 12 TAIL]
001138 sqlite3_step $STMT
001139 set v1 [sqlite3_column_int $STMT 0]
001140 sqlite3_finalize $STMT
001141 set v1
001142 } {12345}
001143 do_test capi3-15.7 {
001144 # 123456789 1234567
001145 set sql {SELECT 12.34567890}
001146 set STMT [sqlite3_prepare $DB $sql 12 TAIL]
001147 sqlite3_step $STMT
001148 set v1 [sqlite3_column_double $STMT 0]
001149 sqlite3_finalize $STMT
001150 set v1
001151 } {12.34}
001152 do_test capi3-15.8 {
001153 # 123456789 1234567
001154 set sql {SELECT 12.34567890}
001155 set STMT [sqlite3_prepare $DB $sql 14 TAIL]
001156 sqlite3_step $STMT
001157 set v1 [sqlite3_column_double $STMT 0]
001158 sqlite3_finalize $STMT
001159 set v1
001160 } {12.3456}
001161
001162 # Make sure code is always generated even if an IF EXISTS or
001163 # IF NOT EXISTS clause is present that the table does not or
001164 # does exists. That way we will always have a prepared statement
001165 # to expire when the schema changes.
001166 #
001167 do_test capi3-16.1 {
001168 set sql {DROP TABLE IF EXISTS t3}
001169 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
001170 sqlite3_finalize $STMT
001171 expr {$STMT!=""}
001172 } {1}
001173 do_test capi3-16.2 {
001174 set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
001175 set STMT [sqlite3_prepare $DB $sql -1 TAIL]
001176 sqlite3_finalize $STMT
001177 expr {$STMT!=""}
001178 } {1}
001179
001180 # But still we do not generate code if there is no SQL
001181 #
001182 do_test capi3-16.3 {
001183 set STMT [sqlite3_prepare $DB {} -1 TAIL]
001184 sqlite3_finalize $STMT
001185 expr {$STMT==""}
001186 } {1}
001187 do_test capi3-16.4 {
001188 set STMT [sqlite3_prepare $DB {;} -1 TAIL]
001189 sqlite3_finalize $STMT
001190 expr {$STMT==""}
001191 } {1}
001192
001193 # Ticket #2426: Misuse of sqlite3_column_* by calling it after
001194 # a sqlite3_reset should be harmless.
001195 #
001196 do_test capi3-17.1 {
001197 set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
001198 sqlite3_step $STMT
001199 sqlite3_column_int $STMT 0
001200 } {1}
001201 do_test capi3-17.2 {
001202 sqlite3_reset $STMT
001203 sqlite3_column_int $STMT 0
001204 } {0}
001205 do_test capi3-17.3 {
001206 sqlite3_finalize $STMT
001207 } {SQLITE_OK}
001208
001209 # Verify that sqlite3_step() fails with an SQLITE_SCHEMA error
001210 # when the statement is prepared with sqlite3_prepare() (not
001211 # sqlite3_prepare_v2()) and the schema has changed.
001212 #
001213 do_test capi3-18.1 {
001214 set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL]
001215 sqlite3 db2 test.db
001216 db2 eval {CREATE TABLE t3(x)}
001217 db2 close
001218 sqlite3_step $STMT
001219 } {SQLITE_ERROR}
001220 do_test capi3-18.2 {
001221 sqlite3_reset $STMT
001222 sqlite3_errcode db
001223 } {SQLITE_SCHEMA}
001224 do_test capi3-18.3 {
001225 sqlite3_errmsg db
001226 } {database schema has changed}
001227 # The error persist on retry when sqlite3_prepare() has been used.
001228 do_test capi3-18.4 {
001229 sqlite3_step $STMT
001230 } {SQLITE_ERROR}
001231 do_test capi3-18.5 {
001232 sqlite3_reset $STMT
001233 sqlite3_errcode db
001234 } {SQLITE_SCHEMA}
001235 do_test capi3-18.6 {
001236 sqlite3_errmsg db
001237 } {database schema has changed}
001238 sqlite3_finalize $STMT
001239
001240 # Ticket #3134. Prepare a statement with an nBytes parameter of 0.
001241 # Make sure this works correctly and does not reference memory out of
001242 # range.
001243 #
001244 do_test capi3-19.1 {
001245 sqlite3_prepare_tkt3134 db
001246 } {}
001247
001248 # Test that calling sqlite3_column_blob() on a TEXT value does not change
001249 # the return type of subsequent calls to sqlite3_column_type().
001250 #
001251 do_execsql_test 20.1 {
001252 CREATE TABLE t4(x);
001253 INSERT INTO t4 VALUES('abcdefghij');
001254 }
001255 do_test 20.2 {
001256 set stmt [sqlite3_prepare db "SELECT * FROM t4" -1 dummy]
001257 sqlite3_step $stmt
001258 } {SQLITE_ROW}
001259 do_test 20.3 { sqlite3_column_type $stmt 0 } {TEXT}
001260 do_test 20.4 { sqlite3_column_blob $stmt 0 } {abcdefghij}
001261 do_test 20.5 { sqlite3_column_type $stmt 0 } {TEXT}
001262 do_test 20.6 { sqlite3_finalize $stmt } SQLITE_OK
001263
001264
001265 # Tests of the interface when no VFS is registered.
001266 #
001267 if {![info exists tester_do_binarylog]} {
001268 db close
001269 vfs_unregister_all
001270 do_test capi3-20.1 {
001271 sqlite3_sleep 100
001272 } {0}
001273 vfs_reregister_all
001274 }
001275
001276 finish_test