1b900aaf3Sdrh# 2006 November 08 2b900aaf3Sdrh# 3b900aaf3Sdrh# The author disclaims copyright to this source code. In place of 4b900aaf3Sdrh# a legal notice, here is a blessing: 5b900aaf3Sdrh# 6b900aaf3Sdrh# May you do good and not evil. 7b900aaf3Sdrh# May you find forgiveness for yourself and forgive others. 8b900aaf3Sdrh# May you share freely, never taking more than you give. 9b900aaf3Sdrh# 10b900aaf3Sdrh#*********************************************************************** 11b900aaf3Sdrh# This file implements regression tests for SQLite library. 12b900aaf3Sdrh# 13b900aaf3Sdrh# This is a copy of the capi3.test file that has been adapted to 14b900aaf3Sdrh# test the new sqlite3_prepare_v2 interface. 15b900aaf3Sdrh# 16257d9dc7Sdanielk1977# $Id: capi3c.test,v 1.23 2009/07/22 07:27:57 danielk1977 Exp $ 17b900aaf3Sdrh# 18b900aaf3Sdrh 19b900aaf3Sdrhset testdir [file dirname $argv0] 20b900aaf3Sdrhsource $testdir/tester.tcl 219a8941fcSdanset testprefix capi3c 22b900aaf3Sdrh 2368928b6cSdan# Do not use a codec for tests in this file, as the database file is 2468928b6cSdan# manipulated directly using tcl scripts (using the [hexio_write] command). 2568928b6cSdan# 2668928b6cSdando_not_use_codec 2768928b6cSdan 28b900aaf3Sdrh# Return the UTF-16 representation of the supplied UTF-8 string $str. 29b900aaf3Sdrh# If $nt is true, append two 0x00 bytes as a nul terminator. 30b900aaf3Sdrhproc utf16 {str {nt 1}} { 31b900aaf3Sdrh set r [encoding convertto unicode $str] 32b900aaf3Sdrh if {$nt} { 33b900aaf3Sdrh append r "\x00\x00" 34b900aaf3Sdrh } 35b900aaf3Sdrh return $r 36b900aaf3Sdrh} 37b900aaf3Sdrh 38b900aaf3Sdrh# Return the UTF-8 representation of the supplied UTF-16 string $str. 39b900aaf3Sdrhproc utf8 {str} { 40b900aaf3Sdrh # If $str ends in two 0x00 0x00 bytes, knock these off before 41b900aaf3Sdrh # converting to UTF-8 using TCL. 42b900aaf3Sdrh binary scan $str \c* vals 43b900aaf3Sdrh if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 44b900aaf3Sdrh set str [binary format \c* [lrange $vals 0 end-2]] 45b900aaf3Sdrh } 46b900aaf3Sdrh 47b900aaf3Sdrh set r [encoding convertfrom unicode $str] 48b900aaf3Sdrh return $r 49b900aaf3Sdrh} 50b900aaf3Sdrh 51b900aaf3Sdrh# These tests complement those in capi2.test. They are organized 52b900aaf3Sdrh# as follows: 53b900aaf3Sdrh# 54c5155257Sdrh# capi3c-1.*: Test sqlite3_prepare_v2 55c5155257Sdrh# capi3c-2.*: Test sqlite3_prepare16_v2 56c5155257Sdrh# capi3c-3.*: Test sqlite3_open 57c5155257Sdrh# capi3c-4.*: Test sqlite3_open16 58c5155257Sdrh# capi3c-5.*: Test the various sqlite3_result_* APIs 59c5155257Sdrh# capi3c-6.*: Test that sqlite3_close fails if there are outstanding VMs. 60b900aaf3Sdrh# 61b900aaf3Sdrh 62b900aaf3Sdrhset DB [sqlite3_connection_pointer db] 63b900aaf3Sdrh 64c5155257Sdrhdo_test capi3c-1.0 { 65b900aaf3Sdrh sqlite3_get_autocommit $DB 66b900aaf3Sdrh} 1 67c5155257Sdrhdo_test capi3c-1.1 { 68b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB {SELECT name FROM sqlite_master} -1 TAIL] 69b900aaf3Sdrh sqlite3_finalize $STMT 70b900aaf3Sdrh set TAIL 71b900aaf3Sdrh} {} 7299dfe5ebSdrhdo_test capi3c-1.2.1 { 73b900aaf3Sdrh sqlite3_errcode $DB 74b900aaf3Sdrh} {SQLITE_OK} 7599dfe5ebSdrhdo_test capi3c-1.2.2 { 7699dfe5ebSdrh sqlite3_extended_errcode $DB 7799dfe5ebSdrh} {SQLITE_OK} 78c5155257Sdrhdo_test capi3c-1.3 { 79b900aaf3Sdrh sqlite3_errmsg $DB 80b900aaf3Sdrh} {not an error} 81c5155257Sdrhdo_test capi3c-1.4 { 82b900aaf3Sdrh set sql {SELECT name FROM sqlite_master;SELECT 10} 83b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 84b900aaf3Sdrh sqlite3_finalize $STMT 85b900aaf3Sdrh set TAIL 86b900aaf3Sdrh} {SELECT 10} 87c5155257Sdrhdo_test capi3c-1.5 { 88b900aaf3Sdrh set sql {SELECT namex FROM sqlite_master} 89b900aaf3Sdrh catch { 90b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 91b900aaf3Sdrh } 92b900aaf3Sdrh} {1} 9399dfe5ebSdrhdo_test capi3c-1.6.1 { 94b900aaf3Sdrh sqlite3_errcode $DB 95b900aaf3Sdrh} {SQLITE_ERROR} 9699dfe5ebSdrhdo_test capi3c-1.6.2 { 9799dfe5ebSdrh sqlite3_extended_errcode $DB 9899dfe5ebSdrh} {SQLITE_ERROR} 99c5155257Sdrhdo_test capi3c-1.7 { 100b900aaf3Sdrh sqlite3_errmsg $DB 101b900aaf3Sdrh} {no such column: namex} 102b900aaf3Sdrh 10300e087b2Sdrh 104b900aaf3Sdrhifcapable {utf16} { 105c5155257Sdrh do_test capi3c-2.1 { 106b900aaf3Sdrh set sql16 [utf16 {SELECT name FROM sqlite_master}] 107b900aaf3Sdrh set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 ::TAIL] 108b900aaf3Sdrh sqlite3_finalize $STMT 109b900aaf3Sdrh utf8 $::TAIL 110b900aaf3Sdrh } {} 111c5155257Sdrh do_test capi3c-2.2 { 112b900aaf3Sdrh set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] 113b900aaf3Sdrh set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] 114b900aaf3Sdrh sqlite3_finalize $STMT 115b900aaf3Sdrh utf8 $TAIL 116b900aaf3Sdrh } {SELECT 10} 117c5155257Sdrh do_test capi3c-2.3 { 118b900aaf3Sdrh set sql [utf16 {SELECT namex FROM sqlite_master}] 119b900aaf3Sdrh catch { 120b900aaf3Sdrh set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] 121b900aaf3Sdrh } 122b900aaf3Sdrh } {1} 12399dfe5ebSdrh do_test capi3c-2.4.1 { 124b900aaf3Sdrh sqlite3_errcode $DB 125b900aaf3Sdrh } {SQLITE_ERROR} 12699dfe5ebSdrh do_test capi3c-2.4.2 { 12799dfe5ebSdrh sqlite3_extended_errcode $DB 12899dfe5ebSdrh } {SQLITE_ERROR} 129c5155257Sdrh do_test capi3c-2.5 { 130b900aaf3Sdrh sqlite3_errmsg $DB 131b900aaf3Sdrh } {no such column: namex} 132b900aaf3Sdrh 133b900aaf3Sdrh ifcapable schema_pragmas { 134c5155257Sdrh do_test capi3c-2.6 { 135b900aaf3Sdrh execsql {CREATE TABLE tablename(x)} 136b900aaf3Sdrh set sql16 [utf16 {PRAGMA table_info("TableName")}] 137b900aaf3Sdrh set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 TAIL] 138b900aaf3Sdrh sqlite3_step $STMT 139b900aaf3Sdrh } SQLITE_ROW 140c5155257Sdrh do_test capi3c-2.7 { 141b900aaf3Sdrh sqlite3_step $STMT 142b900aaf3Sdrh } SQLITE_DONE 143c5155257Sdrh do_test capi3c-2.8 { 144b900aaf3Sdrh sqlite3_finalize $STMT 145b900aaf3Sdrh } SQLITE_OK 146b900aaf3Sdrh } 147b900aaf3Sdrh 148b900aaf3Sdrh} ;# endif utf16 149b900aaf3Sdrh 150b900aaf3Sdrh# rename sqlite3_open sqlite3_open_old 151b900aaf3Sdrh# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options} 152b900aaf3Sdrh 153c5155257Sdrhdo_test capi3c-3.1 { 154b900aaf3Sdrh set db2 [sqlite3_open test.db {}] 155b900aaf3Sdrh sqlite3_errcode $db2 156b900aaf3Sdrh} {SQLITE_OK} 157b900aaf3Sdrh# FIX ME: Should test the db handle works. 158c5155257Sdrhdo_test capi3c-3.2 { 159b900aaf3Sdrh sqlite3_close $db2 160b900aaf3Sdrh} {SQLITE_OK} 161c5155257Sdrhdo_test capi3c-3.3 { 162b900aaf3Sdrh catch { 163b900aaf3Sdrh set db2 [sqlite3_open /bogus/path/test.db {}] 164b900aaf3Sdrh } 165b900aaf3Sdrh sqlite3_errcode $db2 166b900aaf3Sdrh} {SQLITE_CANTOPEN} 167c5155257Sdrhdo_test capi3c-3.4 { 168b900aaf3Sdrh sqlite3_errmsg $db2 169b900aaf3Sdrh} {unable to open database file} 170c5155257Sdrhdo_test capi3c-3.5 { 171b900aaf3Sdrh sqlite3_close $db2 172b900aaf3Sdrh} {SQLITE_OK} 173afcf9bd8Sdanif {[clang_sanitize_address]==0} { 174c5155257Sdrh do_test capi3c-3.6.1-misuse { 175b900aaf3Sdrh sqlite3_close $db2 176b900aaf3Sdrh } {SQLITE_MISUSE} 177c5155257Sdrh do_test capi3c-3.6.2-misuse { 178b900aaf3Sdrh sqlite3_errmsg $db2 179ff4fa772Sdrh } {bad parameter or other API misuse} 180b900aaf3Sdrh ifcapable {utf16} { 181c5155257Sdrh do_test capi3c-3.6.3-misuse { 182b900aaf3Sdrh utf8 [sqlite3_errmsg16 $db2] 183ff4fa772Sdrh } {bad parameter or other API misuse} 184b900aaf3Sdrh } 185afcf9bd8Sdan} 186b900aaf3Sdrh 187b900aaf3Sdrh# rename sqlite3_open "" 188b900aaf3Sdrh# rename sqlite3_open_old sqlite3_open 189b900aaf3Sdrh 190b900aaf3Sdrhifcapable {utf16} { 191c5155257Sdrhdo_test capi3c-4.1 { 192b900aaf3Sdrh set db2 [sqlite3_open16 [utf16 test.db] {}] 193b900aaf3Sdrh sqlite3_errcode $db2 194b900aaf3Sdrh} {SQLITE_OK} 195b900aaf3Sdrh# FIX ME: Should test the db handle works. 196c5155257Sdrhdo_test capi3c-4.2 { 197b900aaf3Sdrh sqlite3_close $db2 198b900aaf3Sdrh} {SQLITE_OK} 199c5155257Sdrhdo_test capi3c-4.3 { 200b900aaf3Sdrh catch { 201b900aaf3Sdrh set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] 202b900aaf3Sdrh } 203b900aaf3Sdrh sqlite3_errcode $db2 204b900aaf3Sdrh} {SQLITE_CANTOPEN} 205c5155257Sdrhdo_test capi3c-4.4 { 206b900aaf3Sdrh utf8 [sqlite3_errmsg16 $db2] 207b900aaf3Sdrh} {unable to open database file} 208c5155257Sdrhdo_test capi3c-4.5 { 209b900aaf3Sdrh sqlite3_close $db2 210b900aaf3Sdrh} {SQLITE_OK} 211b900aaf3Sdrh} ;# utf16 212b900aaf3Sdrh 213b900aaf3Sdrh# This proc is used to test the following API calls: 214b900aaf3Sdrh# 215b900aaf3Sdrh# sqlite3_column_count 216b900aaf3Sdrh# sqlite3_column_name 217b900aaf3Sdrh# sqlite3_column_name16 218b900aaf3Sdrh# sqlite3_column_decltype 219b900aaf3Sdrh# sqlite3_column_decltype16 220b900aaf3Sdrh# 221b900aaf3Sdrh# $STMT is a compiled SQL statement. $test is a prefix 222b900aaf3Sdrh# to use for test names within this proc. $names is a list 223b900aaf3Sdrh# of the column names that should be returned by $STMT. 224b900aaf3Sdrh# $decltypes is a list of column declaration types for $STMT. 225b900aaf3Sdrh# 226b900aaf3Sdrh# Example: 227b900aaf3Sdrh# 228b900aaf3Sdrh# set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] 229b900aaf3Sdrh# check_header test1.1 {1 2 3} {"" "" ""} 230b900aaf3Sdrh# 231b900aaf3Sdrhproc check_header {STMT test names decltypes} { 232b900aaf3Sdrh 233b900aaf3Sdrh # Use the return value of sqlite3_column_count() to build 234b900aaf3Sdrh # a list of column indexes. i.e. If sqlite3_column_count 235b900aaf3Sdrh # is 3, build the list {0 1 2}. 236b900aaf3Sdrh set ::idxlist [list] 237b900aaf3Sdrh set ::numcols [sqlite3_column_count $STMT] 238b900aaf3Sdrh for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 239b900aaf3Sdrh 240b900aaf3Sdrh # Column names in UTF-8 241b900aaf3Sdrh do_test $test.1 { 242b900aaf3Sdrh set cnamelist [list] 243b900aaf3Sdrh foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 244b900aaf3Sdrh set cnamelist 245b900aaf3Sdrh } $names 246b900aaf3Sdrh 247b900aaf3Sdrh # Column names in UTF-16 248b900aaf3Sdrh ifcapable {utf16} { 249b900aaf3Sdrh do_test $test.2 { 250b900aaf3Sdrh set cnamelist [list] 251b900aaf3Sdrh foreach i $idxlist { 252b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 253b900aaf3Sdrh } 254b900aaf3Sdrh set cnamelist 255b900aaf3Sdrh } $names 256b900aaf3Sdrh } 257b900aaf3Sdrh 258b900aaf3Sdrh # Column names in UTF-8 259b900aaf3Sdrh do_test $test.3 { 260b900aaf3Sdrh set cnamelist [list] 261b900aaf3Sdrh foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 262b900aaf3Sdrh set cnamelist 263b900aaf3Sdrh } $names 264b900aaf3Sdrh 265b900aaf3Sdrh # Column names in UTF-16 266b900aaf3Sdrh ifcapable {utf16} { 267b900aaf3Sdrh do_test $test.4 { 268b900aaf3Sdrh set cnamelist [list] 269b900aaf3Sdrh foreach i $idxlist { 270b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 271b900aaf3Sdrh } 272b900aaf3Sdrh set cnamelist 273b900aaf3Sdrh } $names 274b900aaf3Sdrh } 275b900aaf3Sdrh 276b900aaf3Sdrh # Column names in UTF-8 277b900aaf3Sdrh do_test $test.5 { 278b900aaf3Sdrh set cnamelist [list] 279b900aaf3Sdrh foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} 280b900aaf3Sdrh set cnamelist 281b900aaf3Sdrh } $decltypes 282b900aaf3Sdrh 283b900aaf3Sdrh # Column declaration types in UTF-16 284b900aaf3Sdrh ifcapable {utf16} { 285b900aaf3Sdrh do_test $test.6 { 286b900aaf3Sdrh set cnamelist [list] 287b900aaf3Sdrh foreach i $idxlist { 288b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] 289b900aaf3Sdrh } 290b900aaf3Sdrh set cnamelist 291b900aaf3Sdrh } $decltypes 292b900aaf3Sdrh } 293b900aaf3Sdrh 294b900aaf3Sdrh 295b900aaf3Sdrh # Test some out of range conditions: 296b900aaf3Sdrh ifcapable {utf16} { 297b900aaf3Sdrh do_test $test.7 { 298b900aaf3Sdrh list \ 299b900aaf3Sdrh [sqlite3_column_name $STMT -1] \ 300b900aaf3Sdrh [sqlite3_column_name16 $STMT -1] \ 301b900aaf3Sdrh [sqlite3_column_decltype $STMT -1] \ 302b900aaf3Sdrh [sqlite3_column_decltype16 $STMT -1] \ 303b900aaf3Sdrh [sqlite3_column_name $STMT $numcols] \ 304b900aaf3Sdrh [sqlite3_column_name16 $STMT $numcols] \ 305b900aaf3Sdrh [sqlite3_column_decltype $STMT $numcols] \ 306b900aaf3Sdrh [sqlite3_column_decltype16 $STMT $numcols] 307b900aaf3Sdrh } {{} {} {} {} {} {} {} {}} 308b900aaf3Sdrh } 309b900aaf3Sdrh} 310b900aaf3Sdrh 311b900aaf3Sdrh# This proc is used to test the following API calls: 312b900aaf3Sdrh# 313b900aaf3Sdrh# sqlite3_column_origin_name 314b900aaf3Sdrh# sqlite3_column_origin_name16 315b900aaf3Sdrh# sqlite3_column_table_name 316b900aaf3Sdrh# sqlite3_column_table_name16 317b900aaf3Sdrh# sqlite3_column_database_name 318b900aaf3Sdrh# sqlite3_column_database_name16 319b900aaf3Sdrh# 320b900aaf3Sdrh# $STMT is a compiled SQL statement. $test is a prefix 321b900aaf3Sdrh# to use for test names within this proc. $names is a list 322b900aaf3Sdrh# of the column names that should be returned by $STMT. 323b900aaf3Sdrh# $decltypes is a list of column declaration types for $STMT. 324b900aaf3Sdrh# 325b900aaf3Sdrh# Example: 326b900aaf3Sdrh# 327b900aaf3Sdrh# set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] 328b900aaf3Sdrh# check_header test1.1 {1 2 3} {"" "" ""} 329b900aaf3Sdrh# 330b900aaf3Sdrhproc check_origin_header {STMT test dbs tables cols} { 331b900aaf3Sdrh # If sqlite3_column_origin_name() and friends are not compiled into 332b900aaf3Sdrh # this build, this proc is a no-op. 333b900aaf3Sdrhifcapable columnmetadata { 334b900aaf3Sdrh 335b900aaf3Sdrh # Use the return value of sqlite3_column_count() to build 336b900aaf3Sdrh # a list of column indexes. i.e. If sqlite3_column_count 337b900aaf3Sdrh # is 3, build the list {0 1 2}. 338b900aaf3Sdrh set ::idxlist [list] 339b900aaf3Sdrh set ::numcols [sqlite3_column_count $STMT] 340b900aaf3Sdrh for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 341b900aaf3Sdrh 342b900aaf3Sdrh # Database names in UTF-8 343b900aaf3Sdrh do_test $test.8 { 344b900aaf3Sdrh set cnamelist [list] 345b900aaf3Sdrh foreach i $idxlist { 346b900aaf3Sdrh lappend cnamelist [sqlite3_column_database_name $STMT $i] 347b900aaf3Sdrh } 348b900aaf3Sdrh set cnamelist 349b900aaf3Sdrh } $dbs 350b900aaf3Sdrh 351b900aaf3Sdrh # Database names in UTF-16 352b900aaf3Sdrh ifcapable {utf16} { 353b900aaf3Sdrh do_test $test.9 { 354b900aaf3Sdrh set cnamelist [list] 355b900aaf3Sdrh foreach i $idxlist { 356b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]] 357b900aaf3Sdrh } 358b900aaf3Sdrh set cnamelist 359b900aaf3Sdrh } $dbs 360b900aaf3Sdrh } 361b900aaf3Sdrh 362b900aaf3Sdrh # Table names in UTF-8 363b900aaf3Sdrh do_test $test.10 { 364b900aaf3Sdrh set cnamelist [list] 365b900aaf3Sdrh foreach i $idxlist { 366b900aaf3Sdrh lappend cnamelist [sqlite3_column_table_name $STMT $i] 367b900aaf3Sdrh } 368b900aaf3Sdrh set cnamelist 369b900aaf3Sdrh } $tables 370b900aaf3Sdrh 371b900aaf3Sdrh # Table names in UTF-16 372b900aaf3Sdrh ifcapable {utf16} { 373b900aaf3Sdrh do_test $test.11 { 374b900aaf3Sdrh set cnamelist [list] 375b900aaf3Sdrh foreach i $idxlist { 376b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]] 377b900aaf3Sdrh } 378b900aaf3Sdrh set cnamelist 379b900aaf3Sdrh } $tables 380b900aaf3Sdrh } 381b900aaf3Sdrh 382b900aaf3Sdrh # Origin names in UTF-8 383b900aaf3Sdrh do_test $test.12 { 384b900aaf3Sdrh set cnamelist [list] 385b900aaf3Sdrh foreach i $idxlist { 386b900aaf3Sdrh lappend cnamelist [sqlite3_column_origin_name $STMT $i] 387b900aaf3Sdrh } 388b900aaf3Sdrh set cnamelist 389b900aaf3Sdrh } $cols 390b900aaf3Sdrh 391b900aaf3Sdrh # Origin declaration types in UTF-16 392b900aaf3Sdrh ifcapable {utf16} { 393b900aaf3Sdrh do_test $test.13 { 394b900aaf3Sdrh set cnamelist [list] 395b900aaf3Sdrh foreach i $idxlist { 396b900aaf3Sdrh lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]] 397b900aaf3Sdrh } 398b900aaf3Sdrh set cnamelist 399b900aaf3Sdrh } $cols 400b900aaf3Sdrh } 401b900aaf3Sdrh } 402b900aaf3Sdrh} 403b900aaf3Sdrh 404b900aaf3Sdrh# This proc is used to test the following APIs: 405b900aaf3Sdrh# 406b900aaf3Sdrh# sqlite3_data_count 407b900aaf3Sdrh# sqlite3_column_type 408b900aaf3Sdrh# sqlite3_column_int 409b900aaf3Sdrh# sqlite3_column_text 410b900aaf3Sdrh# sqlite3_column_text16 411b900aaf3Sdrh# sqlite3_column_double 412b900aaf3Sdrh# 413b900aaf3Sdrh# $STMT is a compiled SQL statement for which the previous call 414b900aaf3Sdrh# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use 415b900aaf3Sdrh# for test names within this proc. $types is a list of the 416b900aaf3Sdrh# manifest types for the current row. $ints, $doubles and $strings 417b900aaf3Sdrh# are lists of the integer, real and string representations of 418b900aaf3Sdrh# the values in the current row. 419b900aaf3Sdrh# 420b900aaf3Sdrh# Example: 421b900aaf3Sdrh# 422b900aaf3Sdrh# set STMT [sqlite3_prepare_v2 "SELECT 'hello', 1.1, NULL" -1 DUMMY] 423b900aaf3Sdrh# sqlite3_step $STMT 424b900aaf3Sdrh# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}} 425b900aaf3Sdrh# 426b900aaf3Sdrhproc check_data {STMT test types ints doubles strings} { 427b900aaf3Sdrh 428b900aaf3Sdrh # Use the return value of sqlite3_column_count() to build 429b900aaf3Sdrh # a list of column indexes. i.e. If sqlite3_column_count 430b900aaf3Sdrh # is 3, build the list {0 1 2}. 431b900aaf3Sdrh set ::idxlist [list] 432b900aaf3Sdrh set numcols [sqlite3_data_count $STMT] 433b900aaf3Sdrh for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i} 434b900aaf3Sdrh 435b900aaf3Sdrh# types 436b900aaf3Sdrhdo_test $test.1 { 437b900aaf3Sdrh set types [list] 438b900aaf3Sdrh foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 439b900aaf3Sdrh set types 440b900aaf3Sdrh} $types 441b900aaf3Sdrh 442b900aaf3Sdrh# Integers 443b900aaf3Sdrhdo_test $test.2 { 444b900aaf3Sdrh set ints [list] 445b900aaf3Sdrh foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} 446b900aaf3Sdrh set ints 447b900aaf3Sdrh} $ints 448b900aaf3Sdrh 449b900aaf3Sdrh# bytes 450b900aaf3Sdrhset lens [list] 451b900aaf3Sdrhforeach i $::idxlist { 452b900aaf3Sdrh lappend lens [string length [lindex $strings $i]] 453b900aaf3Sdrh} 454b900aaf3Sdrhdo_test $test.3 { 455b900aaf3Sdrh set bytes [list] 456b900aaf3Sdrh set lens [list] 457b900aaf3Sdrh foreach i $idxlist { 458b900aaf3Sdrh lappend bytes [sqlite3_column_bytes $STMT $i] 459b900aaf3Sdrh } 460b900aaf3Sdrh set bytes 461b900aaf3Sdrh} $lens 462b900aaf3Sdrh 463b900aaf3Sdrh# bytes16 464b900aaf3Sdrhifcapable {utf16} { 465b900aaf3Sdrh set lens [list] 466b900aaf3Sdrh foreach i $::idxlist { 467b900aaf3Sdrh lappend lens [expr 2 * [string length [lindex $strings $i]]] 468b900aaf3Sdrh } 469b900aaf3Sdrh do_test $test.4 { 470b900aaf3Sdrh set bytes [list] 471b900aaf3Sdrh set lens [list] 472b900aaf3Sdrh foreach i $idxlist { 473b900aaf3Sdrh lappend bytes [sqlite3_column_bytes16 $STMT $i] 474b900aaf3Sdrh } 475b900aaf3Sdrh set bytes 476b900aaf3Sdrh } $lens 477b900aaf3Sdrh} 478b900aaf3Sdrh 479b900aaf3Sdrh# Blob 480b900aaf3Sdrhdo_test $test.5 { 481b900aaf3Sdrh set utf8 [list] 482b900aaf3Sdrh foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} 483b900aaf3Sdrh set utf8 484b900aaf3Sdrh} $strings 485b900aaf3Sdrh 486b900aaf3Sdrh# UTF-8 487b900aaf3Sdrhdo_test $test.6 { 488b900aaf3Sdrh set utf8 [list] 489b900aaf3Sdrh foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 490b900aaf3Sdrh set utf8 491b900aaf3Sdrh} $strings 492b900aaf3Sdrh 493b900aaf3Sdrh# Floats 494b900aaf3Sdrhdo_test $test.7 { 495b900aaf3Sdrh set utf8 [list] 496b900aaf3Sdrh foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 497b900aaf3Sdrh set utf8 498b900aaf3Sdrh} $doubles 499b900aaf3Sdrh 500b900aaf3Sdrh# UTF-16 501b900aaf3Sdrhifcapable {utf16} { 502b900aaf3Sdrh do_test $test.8 { 503b900aaf3Sdrh set utf8 [list] 504b900aaf3Sdrh foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} 505b900aaf3Sdrh set utf8 506b900aaf3Sdrh } $strings 507b900aaf3Sdrh} 508b900aaf3Sdrh 509b900aaf3Sdrh# Integers 510b900aaf3Sdrhdo_test $test.9 { 511b900aaf3Sdrh set ints [list] 512b900aaf3Sdrh foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} 513b900aaf3Sdrh set ints 514b900aaf3Sdrh} $ints 515b900aaf3Sdrh 516b900aaf3Sdrh# Floats 517b900aaf3Sdrhdo_test $test.10 { 518b900aaf3Sdrh set utf8 [list] 519b900aaf3Sdrh foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 520b900aaf3Sdrh set utf8 521b900aaf3Sdrh} $doubles 522b900aaf3Sdrh 523b900aaf3Sdrh# UTF-8 524b900aaf3Sdrhdo_test $test.11 { 525b900aaf3Sdrh set utf8 [list] 526b900aaf3Sdrh foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 527b900aaf3Sdrh set utf8 528b900aaf3Sdrh} $strings 529b900aaf3Sdrh 530b900aaf3Sdrh# Types 531b900aaf3Sdrhdo_test $test.12 { 532b900aaf3Sdrh set types [list] 533b900aaf3Sdrh foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 534b900aaf3Sdrh set types 535b900aaf3Sdrh} $types 536b900aaf3Sdrh 537b900aaf3Sdrh# Test that an out of range request returns the equivalent of NULL 538b900aaf3Sdrhdo_test $test.13 { 539b900aaf3Sdrh sqlite3_column_int $STMT -1 540b900aaf3Sdrh} {0} 541b900aaf3Sdrhdo_test $test.13 { 542b900aaf3Sdrh sqlite3_column_text $STMT -1 543b900aaf3Sdrh} {} 544b900aaf3Sdrh 545b900aaf3Sdrh} 546b900aaf3Sdrh 547b900aaf3Sdrhifcapable !floatingpoint { 548b900aaf3Sdrh finish_test 549b900aaf3Sdrh return 550b900aaf3Sdrh} 551b900aaf3Sdrh 552c5155257Sdrhdo_test capi3c-5.0 { 553b900aaf3Sdrh execsql { 554b900aaf3Sdrh CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); 555b900aaf3Sdrh INSERT INTO t1 VALUES(1, 2, 3); 556b900aaf3Sdrh INSERT INTO t1 VALUES('one', 'two', NULL); 557b900aaf3Sdrh INSERT INTO t1 VALUES(1.2, 1.3, 1.4); 558b900aaf3Sdrh } 559b900aaf3Sdrh set sql "SELECT * FROM t1" 560b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 561b900aaf3Sdrh sqlite3_column_count $STMT 562b900aaf3Sdrh} 3 563b900aaf3Sdrh 564c5155257Sdrhcheck_header $STMT capi3c-5.1 {a b c} {VARINT BLOB VARCHAR(16)} 565c5155257Sdrhcheck_origin_header $STMT capi3c-5.1 {main main main} {t1 t1 t1} {a b c} 566c5155257Sdrhdo_test capi3c-5.2 { 567b900aaf3Sdrh sqlite3_step $STMT 568b900aaf3Sdrh} SQLITE_ROW 569b900aaf3Sdrh 570c5155257Sdrhcheck_header $STMT capi3c-5.3 {a b c} {VARINT BLOB VARCHAR(16)} 571c5155257Sdrhcheck_origin_header $STMT capi3c-5.3 {main main main} {t1 t1 t1} {a b c} 572c5155257Sdrhcheck_data $STMT capi3c-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3} 573b900aaf3Sdrh 574c5155257Sdrhdo_test capi3c-5.5 { 575b900aaf3Sdrh sqlite3_step $STMT 576b900aaf3Sdrh} SQLITE_ROW 577b900aaf3Sdrh 578c5155257Sdrhcheck_header $STMT capi3c-5.6 {a b c} {VARINT BLOB VARCHAR(16)} 579c5155257Sdrhcheck_origin_header $STMT capi3c-5.6 {main main main} {t1 t1 t1} {a b c} 580c5155257Sdrhcheck_data $STMT capi3c-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}} 581b900aaf3Sdrh 582c5155257Sdrhdo_test capi3c-5.8 { 583b900aaf3Sdrh sqlite3_step $STMT 584b900aaf3Sdrh} SQLITE_ROW 585b900aaf3Sdrh 586c5155257Sdrhcheck_header $STMT capi3c-5.9 {a b c} {VARINT BLOB VARCHAR(16)} 587c5155257Sdrhcheck_origin_header $STMT capi3c-5.9 {main main main} {t1 t1 t1} {a b c} 588c5155257Sdrhcheck_data $STMT capi3c-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4} 589b900aaf3Sdrh 590c5155257Sdrhdo_test capi3c-5.11 { 591b900aaf3Sdrh sqlite3_step $STMT 592b900aaf3Sdrh} SQLITE_DONE 593b900aaf3Sdrh 594c5155257Sdrhdo_test capi3c-5.12 { 595b900aaf3Sdrh sqlite3_finalize $STMT 596b900aaf3Sdrh} SQLITE_OK 597b900aaf3Sdrh 598c5155257Sdrhdo_test capi3c-5.20 { 599b900aaf3Sdrh set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a" 600b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 601b900aaf3Sdrh sqlite3_column_count $STMT 602b900aaf3Sdrh} 3 603b900aaf3Sdrh 604c5155257Sdrhcheck_header $STMT capi3c-5.21 {a sum(b) max(c)} {VARINT {} {}} 605c5155257Sdrhcheck_origin_header $STMT capi3c-5.22 {main {} {}} {t1 {} {}} {a {} {}} 606c5155257Sdrhdo_test capi3c-5.23 { 607b900aaf3Sdrh sqlite3_finalize $STMT 608b900aaf3Sdrh} SQLITE_OK 609b900aaf3Sdrh 610b900aaf3Sdrh 611b900aaf3Sdrhset ::ENC [execsql {pragma encoding}] 612b900aaf3Sdrhdb close 613b900aaf3Sdrh 614c5155257Sdrhdo_test capi3c-6.0 { 615b900aaf3Sdrh sqlite3 db test.db 616b900aaf3Sdrh set DB [sqlite3_connection_pointer db] 61768928b6cSdan if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy } 618b900aaf3Sdrh set sql {SELECT a FROM t1 order by rowid} 619b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 620b900aaf3Sdrh expr 0 621b900aaf3Sdrh} {0} 622c5155257Sdrhdo_test capi3c-6.1 { 623b900aaf3Sdrh db cache flush 624b900aaf3Sdrh sqlite3_close $DB 625b900aaf3Sdrh} {SQLITE_BUSY} 626c5155257Sdrhdo_test capi3c-6.2 { 627b900aaf3Sdrh sqlite3_step $STMT 628b900aaf3Sdrh} {SQLITE_ROW} 629c5155257Sdrhcheck_data $STMT capi3c-6.3 {INTEGER} {1} {1.0} {1} 630c5155257Sdrhdo_test capi3c-6.3 { 631b900aaf3Sdrh sqlite3_finalize $STMT 632b900aaf3Sdrh} {SQLITE_OK} 633afcf9bd8Sdanif {[clang_sanitize_address]==0} { 634c5155257Sdrh do_test capi3c-6.4 { 635b900aaf3Sdrh db cache flush 636b900aaf3Sdrh sqlite3_close $DB 637b900aaf3Sdrh } {SQLITE_OK} 638c5155257Sdrh do_test capi3c-6.99-misuse { 639b900aaf3Sdrh db close 640c5155257Sdrh } {} 641afcf9bd8Sdan} else { 642afcf9bd8Sdan db close 643afcf9bd8Sdan} 644b900aaf3Sdrh 645bb8a279eSdrh# This procedure sets the value of the file-format in file 'test.db' 646bb8a279eSdrh# to $newval. Also, the schema cookie is incremented. 647bb8a279eSdrh# 648bb8a279eSdrhproc set_file_format {newval} { 649bb8a279eSdrh hexio_write test.db 44 [hexio_render_int32 $newval] 650bb8a279eSdrh set schemacookie [hexio_get_int [hexio_read test.db 40 4]] 651bb8a279eSdrh incr schemacookie 652bb8a279eSdrh hexio_write test.db 40 [hexio_render_int32 $schemacookie] 653bb8a279eSdrh return {} 654bb8a279eSdrh} 655bb8a279eSdrh 656bb8a279eSdrh# This procedure returns the value of the file-format in file 'test.db'. 657bb8a279eSdrh# 658bb8a279eSdrhproc get_file_format {{fname test.db}} { 659bb8a279eSdrh return [hexio_get_int [hexio_read $fname 44 4]] 660bb8a279eSdrh} 661bb8a279eSdrh 662b900aaf3Sdrhif {![sqlite3 -has-codec]} { 663b900aaf3Sdrh # Test what happens when the library encounters a newer file format. 664c5155257Sdrh do_test capi3c-7.1 { 665bb8a279eSdrh set_file_format 5 666b900aaf3Sdrh } {} 667c5155257Sdrh do_test capi3c-7.2 { 668cb354603Sdan catch { sqlite3 db test.db } 669b900aaf3Sdrh catchsql { 670b900aaf3Sdrh SELECT * FROM sqlite_master; 671b900aaf3Sdrh } 672b900aaf3Sdrh } {1 {unsupported file format}} 673b900aaf3Sdrh db close 674b900aaf3Sdrh} 675b900aaf3Sdrh 676b900aaf3Sdrhif {![sqlite3 -has-codec]} { 677b900aaf3Sdrh # Now test that the library correctly handles bogus entries in the 678b900aaf3Sdrh # sqlite_master table (schema corruption). 679c5155257Sdrh do_test capi3c-8.1 { 680fda06befSmistachkin forcedelete test.db test.db-journal 681b900aaf3Sdrh sqlite3 db test.db 682b900aaf3Sdrh execsql { 683b900aaf3Sdrh CREATE TABLE t1(a); 684b900aaf3Sdrh } 685b900aaf3Sdrh db close 686b900aaf3Sdrh } {} 687c5155257Sdrh do_test capi3c-8.2 { 688bb8a279eSdrh sqlite3 db test.db 689*6ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 690bb8a279eSdrh execsql { 691bb8a279eSdrh PRAGMA writable_schema=ON; 692bb8a279eSdrh INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL); 693bb8a279eSdrh } 694bb8a279eSdrh db close 695b900aaf3Sdrh } {} 696c5155257Sdrh do_test capi3c-8.3 { 697cb354603Sdan catch { sqlite3 db test.db } 698b900aaf3Sdrh catchsql { 699b900aaf3Sdrh SELECT * FROM sqlite_master; 700b900aaf3Sdrh } 70134533150Sdrh } {1 {malformed database schema (?)}} 702c5155257Sdrh do_test capi3c-8.4 { 703b900aaf3Sdrh # Build a 5-field row record. The first field is a string 'table', and 704bb8a279eSdrh # subsequent fields are all NULL. 705bb8a279eSdrh db close 706fda06befSmistachkin forcedelete test.db test.db-journal 707bb8a279eSdrh sqlite3 db test.db 708*6ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 709bb8a279eSdrh execsql { 710bb8a279eSdrh CREATE TABLE t1(a); 711bb8a279eSdrh PRAGMA writable_schema=ON; 712bb8a279eSdrh INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL); 713b900aaf3Sdrh } 714bb8a279eSdrh db close 715b900aaf3Sdrh } {}; 716c5155257Sdrh do_test capi3c-8.5 { 717cb354603Sdan catch { sqlite3 db test.db } 718b900aaf3Sdrh catchsql { 719b900aaf3Sdrh SELECT * FROM sqlite_master; 720b900aaf3Sdrh } 72134533150Sdrh } {1 {malformed database schema (?)}} 722b900aaf3Sdrh db close 723b900aaf3Sdrh} 724fda06befSmistachkinforcedelete test.db 725fda06befSmistachkinforcedelete test.db-journal 726b900aaf3Sdrh 727b900aaf3Sdrh 728b900aaf3Sdrh# Test the english language string equivalents for sqlite error codes 729b900aaf3Sdrhset code2english [list \ 730b900aaf3SdrhSQLITE_OK {not an error} \ 731a690ff36SdrhSQLITE_ERROR {SQL logic error} \ 732b900aaf3SdrhSQLITE_PERM {access permission denied} \ 733ff4fa772SdrhSQLITE_ABORT {query aborted} \ 734b900aaf3SdrhSQLITE_BUSY {database is locked} \ 735b900aaf3SdrhSQLITE_LOCKED {database table is locked} \ 736b900aaf3SdrhSQLITE_NOMEM {out of memory} \ 737b900aaf3SdrhSQLITE_READONLY {attempt to write a readonly database} \ 738b900aaf3SdrhSQLITE_INTERRUPT {interrupted} \ 739b900aaf3SdrhSQLITE_IOERR {disk I/O error} \ 740b900aaf3SdrhSQLITE_CORRUPT {database disk image is malformed} \ 741b900aaf3SdrhSQLITE_FULL {database or disk is full} \ 742b900aaf3SdrhSQLITE_CANTOPEN {unable to open database file} \ 743ff4fa772SdrhSQLITE_EMPTY {unknown error} \ 744b900aaf3SdrhSQLITE_SCHEMA {database schema has changed} \ 745b900aaf3SdrhSQLITE_CONSTRAINT {constraint failed} \ 746b900aaf3SdrhSQLITE_MISMATCH {datatype mismatch} \ 747ff4fa772SdrhSQLITE_MISUSE {bad parameter or other API misuse} \ 748b900aaf3SdrhSQLITE_AUTH {authorization denied} \ 749ff4fa772SdrhSQLITE_RANGE {column index out of range} \ 750ff4fa772SdrhSQLITE_NOTADB {file is not a database} \ 751b900aaf3Sdrhunknownerror {unknown error} \ 752b900aaf3Sdrh] 753b900aaf3Sdrh 754b900aaf3Sdrhset test_number 1 755b900aaf3Sdrhforeach {code english} $code2english { 756c5155257Sdrh do_test capi3c-9.$test_number "sqlite3_test_errstr $code" $english 757b900aaf3Sdrh incr test_number 758b900aaf3Sdrh} 759b900aaf3Sdrh 760b900aaf3Sdrh# Test the error message when a "real" out of memory occurs. 761a879342bSdanif { [permutation] != "nofaultsim" } { 762c5155257Sdrh do_test capi3c-10-1 { 763b900aaf3Sdrh sqlite3 db test.db 764b900aaf3Sdrh set DB [sqlite3_connection_pointer db] 765a1644fd8Sdanielk1977 sqlite3_memdebug_fail 0 766b900aaf3Sdrh catchsql { 767b900aaf3Sdrh select * from sqlite_master; 768b900aaf3Sdrh } 769b900aaf3Sdrh } {1 {out of memory}} 770c5155257Sdrh do_test capi3c-10-2 { 771b900aaf3Sdrh sqlite3_errmsg $::DB 772b900aaf3Sdrh } {out of memory} 773b900aaf3Sdrh ifcapable {utf16} { 774c5155257Sdrh do_test capi3c-10-3 { 775b900aaf3Sdrh utf8 [sqlite3_errmsg16 $::DB] 776b900aaf3Sdrh } {out of memory} 777b900aaf3Sdrh } 778b900aaf3Sdrh db close 779a1644fd8Sdanielk1977 sqlite3_memdebug_fail -1 780b900aaf3Sdrh} 781b900aaf3Sdrh 782c5155257Sdrh# The following tests - capi3c-11.* - test that a COMMIT or ROLLBACK 783b900aaf3Sdrh# statement issued while there are still outstanding VMs that are part of 784b900aaf3Sdrh# the transaction fails. 785b900aaf3Sdrhsqlite3 db test.db 786b900aaf3Sdrhset DB [sqlite3_connection_pointer db] 787b900aaf3Sdrhsqlite_register_test_function $DB func 788c5155257Sdrhdo_test capi3c-11.1 { 789b900aaf3Sdrh execsql { 790b900aaf3Sdrh BEGIN; 791b900aaf3Sdrh CREATE TABLE t1(a, b); 792b900aaf3Sdrh INSERT INTO t1 VALUES(1, 'int'); 793b900aaf3Sdrh INSERT INTO t1 VALUES(2, 'notatype'); 794b900aaf3Sdrh } 795b900aaf3Sdrh} {} 796c5155257Sdrhdo_test capi3c-11.1.1 { 797b900aaf3Sdrh sqlite3_get_autocommit $DB 798b900aaf3Sdrh} 0 799c5155257Sdrhdo_test capi3c-11.2 { 800b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB "SELECT func(b, a) FROM t1" -1 TAIL] 801b900aaf3Sdrh sqlite3_step $STMT 802b900aaf3Sdrh} {SQLITE_ROW} 803ad4a4b80Sdrh 804ad4a4b80Sdrh# As of 3.6.5 a COMMIT is OK during while a query is still running - 805ad4a4b80Sdrh# as long as it is a read-only query and not an incremental BLOB write. 806ad4a4b80Sdrh# 807ad4a4b80Sdrhdo_test capi3-11.3.1 { 808b900aaf3Sdrh catchsql { 809b900aaf3Sdrh COMMIT; 810b900aaf3Sdrh } 811ad4a4b80Sdrh} {0 {}} 812ad4a4b80Sdrhdo_test capi3-11.3.2 { 813ad4a4b80Sdrh sqlite3_extended_errcode $DB 814ad4a4b80Sdrh} {SQLITE_OK} 815ad4a4b80Sdrhdo_test capi3-11.3.3 { 816b900aaf3Sdrh sqlite3_get_autocommit $DB 817ad4a4b80Sdrh} 1 818ad4a4b80Sdrhdo_test capi3-11.3.4 { 819ad4a4b80Sdrh db eval {PRAGMA lock_status} 820ad4a4b80Sdrh} {main shared temp closed} 821ad4a4b80Sdrh 822c5155257Sdrhdo_test capi3c-11.4 { 823b900aaf3Sdrh sqlite3_step $STMT 824b900aaf3Sdrh} {SQLITE_ERROR} 825c5155257Sdrhdo_test capi3c-11.5 { 826b900aaf3Sdrh sqlite3_finalize $STMT 827b900aaf3Sdrh} {SQLITE_ERROR} 828c5155257Sdrhdo_test capi3c-11.6 { 829b900aaf3Sdrh catchsql { 830b900aaf3Sdrh SELECT * FROM t1; 831b900aaf3Sdrh } 832b900aaf3Sdrh} {0 {1 int 2 notatype}} 833c5155257Sdrhdo_test capi3c-11.7 { 834b900aaf3Sdrh sqlite3_get_autocommit $DB 835b900aaf3Sdrh} 1 836c5155257Sdrhdo_test capi3c-11.8 { 837b900aaf3Sdrh execsql { 838b900aaf3Sdrh CREATE TABLE t2(a); 839b900aaf3Sdrh INSERT INTO t2 VALUES(1); 840b900aaf3Sdrh INSERT INTO t2 VALUES(2); 841b900aaf3Sdrh BEGIN; 842b900aaf3Sdrh INSERT INTO t2 VALUES(3); 843b900aaf3Sdrh } 844b900aaf3Sdrh} {} 845c5155257Sdrhdo_test capi3c-11.8.1 { 846b900aaf3Sdrh sqlite3_get_autocommit $DB 847b900aaf3Sdrh} 0 848c5155257Sdrhdo_test capi3c-11.9 { 849b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 850b900aaf3Sdrh sqlite3_step $STMT 851b900aaf3Sdrh} {SQLITE_ROW} 852c5155257Sdrhdo_test capi3c-11.9.1 { 853b900aaf3Sdrh sqlite3_get_autocommit $DB 854b900aaf3Sdrh} 0 855c5155257Sdrhdo_test capi3c-11.9.2 { 856b900aaf3Sdrh catchsql { 857b900aaf3Sdrh ROLLBACK; 858b900aaf3Sdrh } 8590f198a74Sdrh} {0 {}} 860c5155257Sdrhdo_test capi3c-11.9.3 { 861b900aaf3Sdrh sqlite3_get_autocommit $DB 8620f198a74Sdrh} 1 863c5155257Sdrhdo_test capi3c-11.10 { 864b900aaf3Sdrh sqlite3_step $STMT 86547b7fc78Sdrh} {SQLITE_ROW} 866c5155257Sdrhdo_test capi3c-11.11 { 867b900aaf3Sdrh sqlite3_step $STMT 86847b7fc78Sdrh} {SQLITE_DONE} 869231ee688Sdanifcapable !autoreset { 870108e5a9aSdrh do_test capi3c-11.12armor { 871108e5a9aSdrh sqlite3_step $STMT 872108e5a9aSdrh sqlite3_step $STMT 873108e5a9aSdrh } {SQLITE_MISUSE} 874108e5a9aSdrh} else { 875c5155257Sdrh do_test capi3c-11.12 { 876b900aaf3Sdrh sqlite3_step $STMT 8770f198a74Sdrh sqlite3_step $STMT 87847b7fc78Sdrh } {SQLITE_ROW} 879108e5a9aSdrh} 880c5155257Sdrhdo_test capi3c-11.13 { 881b900aaf3Sdrh sqlite3_finalize $STMT 882b900aaf3Sdrh} {SQLITE_OK} 883c5155257Sdrhdo_test capi3c-11.14 { 884b900aaf3Sdrh execsql { 885b900aaf3Sdrh SELECT a FROM t2; 886b900aaf3Sdrh } 8870f198a74Sdrh} {1 2} 888c5155257Sdrhdo_test capi3c-11.14.1 { 889b900aaf3Sdrh sqlite3_get_autocommit $DB 8900f198a74Sdrh} 1 891c5155257Sdrhdo_test capi3c-11.15 { 892b900aaf3Sdrh catchsql { 893b900aaf3Sdrh ROLLBACK; 894b900aaf3Sdrh } 8950f198a74Sdrh} {1 {cannot rollback - no transaction is active}} 896c5155257Sdrhdo_test capi3c-11.15.1 { 897b900aaf3Sdrh sqlite3_get_autocommit $DB 898b900aaf3Sdrh} 1 899c5155257Sdrhdo_test capi3c-11.16 { 900b900aaf3Sdrh execsql { 901b900aaf3Sdrh SELECT a FROM t2; 902b900aaf3Sdrh } 903b900aaf3Sdrh} {1 2} 904b900aaf3Sdrh 905b900aaf3Sdrh# Sanity check on the definition of 'outstanding VM'. This means any VM 906b900aaf3Sdrh# that has had sqlite3_step() called more recently than sqlite3_finalize() or 907b900aaf3Sdrh# sqlite3_reset(). So a VM that has just been prepared or reset does not 908b900aaf3Sdrh# count as an active VM. 909c5155257Sdrhdo_test capi3c-11.17 { 910b900aaf3Sdrh execsql { 911b900aaf3Sdrh BEGIN; 912b900aaf3Sdrh } 913b900aaf3Sdrh} {} 914c5155257Sdrhdo_test capi3c-11.18 { 915b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL] 916b900aaf3Sdrh catchsql { 917b900aaf3Sdrh COMMIT; 918b900aaf3Sdrh } 919b900aaf3Sdrh} {0 {}} 920c5155257Sdrhdo_test capi3c-11.19 { 921b900aaf3Sdrh sqlite3_step $STMT 922b900aaf3Sdrh} {SQLITE_ROW} 923c5155257Sdrhdo_test capi3c-11.20 { 924b900aaf3Sdrh catchsql { 925b900aaf3Sdrh BEGIN; 926b900aaf3Sdrh COMMIT; 927b900aaf3Sdrh } 928ad4a4b80Sdrh} {0 {}} 929c5155257Sdrhdo_test capi3c-11.20 { 930b900aaf3Sdrh sqlite3_reset $STMT 931b900aaf3Sdrh catchsql { 932b900aaf3Sdrh COMMIT; 933b900aaf3Sdrh } 934ad4a4b80Sdrh} {1 {cannot commit - no transaction is active}} 935c5155257Sdrhdo_test capi3c-11.21 { 936b900aaf3Sdrh sqlite3_finalize $STMT 937b900aaf3Sdrh} {SQLITE_OK} 938b900aaf3Sdrh 93985b623f2Sdrh# The following tests - capi3c-12.* - check that its Ok to start a 94085b623f2Sdrh# transaction while other VMs are active, and that its Ok to execute 941b900aaf3Sdrh# atomic updates in the same situation 942b900aaf3Sdrh# 943c5155257Sdrhdo_test capi3c-12.1 { 944b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 945b900aaf3Sdrh sqlite3_step $STMT 946b900aaf3Sdrh} {SQLITE_ROW} 947c5155257Sdrhdo_test capi3c-12.2 { 948b900aaf3Sdrh catchsql { 949b900aaf3Sdrh INSERT INTO t1 VALUES(3, NULL); 950b900aaf3Sdrh } 951b900aaf3Sdrh} {0 {}} 952c5155257Sdrhdo_test capi3c-12.3 { 953b900aaf3Sdrh catchsql { 954b900aaf3Sdrh INSERT INTO t2 VALUES(4); 955b900aaf3Sdrh } 956b900aaf3Sdrh} {0 {}} 957c5155257Sdrhdo_test capi3c-12.4 { 958b900aaf3Sdrh catchsql { 959b900aaf3Sdrh BEGIN; 960b900aaf3Sdrh INSERT INTO t1 VALUES(4, NULL); 961b900aaf3Sdrh } 962b900aaf3Sdrh} {0 {}} 963c5155257Sdrhdo_test capi3c-12.5 { 964b900aaf3Sdrh sqlite3_step $STMT 965b900aaf3Sdrh} {SQLITE_ROW} 966c5155257Sdrhdo_test capi3c-12.5.1 { 967b900aaf3Sdrh sqlite3_step $STMT 968b900aaf3Sdrh} {SQLITE_ROW} 969c5155257Sdrhdo_test capi3c-12.6 { 970b900aaf3Sdrh sqlite3_step $STMT 971b900aaf3Sdrh} {SQLITE_DONE} 972c5155257Sdrhdo_test capi3c-12.7 { 973b900aaf3Sdrh sqlite3_finalize $STMT 974b900aaf3Sdrh} {SQLITE_OK} 975c5155257Sdrhdo_test capi3c-12.8 { 976b900aaf3Sdrh execsql { 977b900aaf3Sdrh COMMIT; 978b900aaf3Sdrh SELECT a FROM t1; 979b900aaf3Sdrh } 980b900aaf3Sdrh} {1 2 3 4} 981b900aaf3Sdrh 982c5155257Sdrh# Test cases capi3c-13.* test the sqlite3_clear_bindings() and 983b900aaf3Sdrh# sqlite3_sleep APIs. 984b900aaf3Sdrh# 985b900aaf3Sdrhif {[llength [info commands sqlite3_clear_bindings]]>0} { 986c5155257Sdrh do_test capi3c-13.1 { 987b900aaf3Sdrh execsql { 988b900aaf3Sdrh DELETE FROM t1; 989b900aaf3Sdrh } 990b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 991b900aaf3Sdrh sqlite3_step $STMT 992b900aaf3Sdrh } {SQLITE_DONE} 993c5155257Sdrh do_test capi3c-13.2 { 994b900aaf3Sdrh sqlite3_reset $STMT 995b900aaf3Sdrh sqlite3_bind_text $STMT 1 hello 5 996b900aaf3Sdrh sqlite3_bind_text $STMT 2 world 5 997b900aaf3Sdrh sqlite3_step $STMT 998b900aaf3Sdrh } {SQLITE_DONE} 999c5155257Sdrh do_test capi3c-13.3 { 1000b900aaf3Sdrh sqlite3_reset $STMT 1001b900aaf3Sdrh sqlite3_clear_bindings $STMT 1002b900aaf3Sdrh sqlite3_step $STMT 1003b900aaf3Sdrh } {SQLITE_DONE} 1004c5155257Sdrh do_test capi3c-13-4 { 1005b900aaf3Sdrh sqlite3_finalize $STMT 1006b900aaf3Sdrh execsql { 1007b900aaf3Sdrh SELECT * FROM t1; 1008b900aaf3Sdrh } 1009b900aaf3Sdrh } {{} {} hello world {} {}} 1010b900aaf3Sdrh} 1011b900aaf3Sdrhif {[llength [info commands sqlite3_sleep]]>0} { 1012c5155257Sdrh do_test capi3c-13-5 { 1013b900aaf3Sdrh set ms [sqlite3_sleep 80] 1014b900aaf3Sdrh expr {$ms==80 || $ms==1000} 1015b900aaf3Sdrh } {1} 1016b900aaf3Sdrh} 1017b900aaf3Sdrh 1018b900aaf3Sdrh# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 1019b900aaf3Sdrh# 1020c5155257Sdrhdo_test capi3c-14.1 { 1021b900aaf3Sdrh set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 1022b900aaf3Sdrh lappend rc $msg 1023b900aaf3Sdrh} {1 SQLITE_MISUSE} 1024b900aaf3Sdrh 1025b900aaf3Sdrh# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. 1026b900aaf3Sdrh# 1027c5155257Sdrhdo_test capi3c-15.1 { 1028b900aaf3Sdrh set sql {SELECT * FROM t2} 1029b900aaf3Sdrh set nbytes [string length $sql] 1030b900aaf3Sdrh append sql { WHERE a==1} 1031b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL] 1032b900aaf3Sdrh sqlite3_step $STMT 1033b900aaf3Sdrh sqlite3_column_int $STMT 0 1034b900aaf3Sdrh} {1} 1035c5155257Sdrhdo_test capi3c-15.2 { 1036b900aaf3Sdrh sqlite3_step $STMT 1037b900aaf3Sdrh sqlite3_column_int $STMT 0 1038b900aaf3Sdrh} {2} 1039c5155257Sdrhdo_test capi3c-15.3 { 1040b900aaf3Sdrh sqlite3_finalize $STMT 1041b900aaf3Sdrh} {SQLITE_OK} 1042b900aaf3Sdrh 1043b900aaf3Sdrh# Make sure code is always generated even if an IF EXISTS or 1044b900aaf3Sdrh# IF NOT EXISTS clause is present that the table does not or 1045b900aaf3Sdrh# does exists. That way we will always have a prepared statement 1046b900aaf3Sdrh# to expire when the schema changes. 1047b900aaf3Sdrh# 1048c5155257Sdrhdo_test capi3c-16.1 { 1049b900aaf3Sdrh set sql {DROP TABLE IF EXISTS t3} 1050b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1051b900aaf3Sdrh sqlite3_finalize $STMT 1052b900aaf3Sdrh expr {$STMT!=""} 1053b900aaf3Sdrh} {1} 1054c5155257Sdrhdo_test capi3c-16.2 { 1055b900aaf3Sdrh set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} 1056b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1057b900aaf3Sdrh sqlite3_finalize $STMT 1058b900aaf3Sdrh expr {$STMT!=""} 1059b900aaf3Sdrh} {1} 1060b900aaf3Sdrh 1061b900aaf3Sdrh# But still we do not generate code if there is no SQL 1062b900aaf3Sdrh# 1063c5155257Sdrhdo_test capi3c-16.3 { 1064b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL] 1065b900aaf3Sdrh sqlite3_finalize $STMT 1066b900aaf3Sdrh expr {$STMT==""} 1067b900aaf3Sdrh} {1} 1068c5155257Sdrhdo_test capi3c-16.4 { 1069b900aaf3Sdrh set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL] 1070b900aaf3Sdrh sqlite3_finalize $STMT 1071b900aaf3Sdrh expr {$STMT==""} 1072b900aaf3Sdrh} {1} 1073b900aaf3Sdrh 1074c5155257Sdrh# Ticket #2154. 1075c5155257Sdrh# 1076c5155257Sdrhdo_test capi3c-17.1 { 1077c5155257Sdrh set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL] 1078c5155257Sdrh sqlite3_step $STMT 1079c5155257Sdrh} SQLITE_ROW 1080c5155257Sdrhdo_test capi3c-17.2 { 1081c5155257Sdrh sqlite3_column_int $STMT 0 1082c5155257Sdrh} 4 1083c5155257Sdrhdo_test capi3c-17.3 { 1084c5155257Sdrh sqlite3_step $STMT 1085c5155257Sdrh} SQLITE_DONE 1086c5155257Sdrhdo_test capi3c-17.4 { 1087c5155257Sdrh sqlite3_reset $STMT 1088c5155257Sdrh db eval {CREATE INDEX i2 ON t2(a)} 1089c5155257Sdrh sqlite3_step $STMT 1090c5155257Sdrh} SQLITE_ROW 1091c5155257Sdrhdo_test capi3c-17.5 { 1092c5155257Sdrh sqlite3_column_int $STMT 0 1093c5155257Sdrh} 4 1094c5155257Sdrhdo_test capi3c-17.6 { 1095c5155257Sdrh sqlite3_step $STMT 1096c5155257Sdrh} SQLITE_DONE 1097c5155257Sdrhdo_test capi3c-17.7 { 1098c5155257Sdrh sqlite3_reset $STMT 1099c5155257Sdrh db eval {DROP INDEX i2} 1100c5155257Sdrh sqlite3_step $STMT 1101c5155257Sdrh} SQLITE_ROW 1102c5155257Sdrhdo_test capi3c-17.8 { 1103c5155257Sdrh sqlite3_column_int $STMT 0 1104c5155257Sdrh} 4 1105c5155257Sdrhdo_test capi3c-17.9 { 1106c5155257Sdrh sqlite3_step $STMT 1107c5155257Sdrh} SQLITE_DONE 1108c5155257Sdrhdo_test capi3c-17.10 { 1109c5155257Sdrh sqlite3_finalize $STMT 1110c5155257Sdrh set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL] 1111c5155257Sdrh sqlite3_bind_int $STMT 1 2 1112c5155257Sdrh db eval { 1113c5155257Sdrh DELETE FROM t1; 1114c5155257Sdrh INSERT INTO t1 VALUES(1,'one'); 1115c5155257Sdrh INSERT INTO t1 VALUES(2,'two'); 1116c5155257Sdrh INSERT INTO t1 VALUES(3,'three'); 1117c5155257Sdrh INSERT INTO t1 VALUES(4,'four'); 1118c5155257Sdrh } 1119c5155257Sdrh sqlite3_step $STMT 1120c5155257Sdrh} SQLITE_ROW 1121c5155257Sdrhdo_test capi3c-17.11 { 1122c5155257Sdrh sqlite3_column_text $STMT 0 1123c5155257Sdrh} two 1124c5155257Sdrhdo_test capi3c-17.12 { 1125c5155257Sdrh sqlite3_step $STMT 1126c5155257Sdrh} SQLITE_DONE 1127c5155257Sdrhdo_test capi3c-17.13 { 1128c5155257Sdrh sqlite3_reset $STMT 1129c5155257Sdrh db eval {CREATE INDEX i1 ON t1(a)} 1130c5155257Sdrh sqlite3_step $STMT 1131c5155257Sdrh} SQLITE_ROW 1132c5155257Sdrhdo_test capi3c-17.14 { 1133c5155257Sdrh sqlite3_column_text $STMT 0 1134c5155257Sdrh} two 1135c5155257Sdrhdo_test capi3c-17.15 { 1136c5155257Sdrh sqlite3_step $STMT 1137c5155257Sdrh} SQLITE_DONE 1138c5155257Sdrhdo_test capi3c-17.16 { 1139c5155257Sdrh sqlite3_reset $STMT 1140c5155257Sdrh db eval {DROP INDEX i1} 1141c5155257Sdrh sqlite3_step $STMT 1142c5155257Sdrh} SQLITE_ROW 1143c5155257Sdrhdo_test capi3c-17.17 { 1144c5155257Sdrh sqlite3_column_text $STMT 0 1145c5155257Sdrh} two 1146c5155257Sdrhdo_test capi3c-17.18 { 1147c5155257Sdrh sqlite3_step $STMT 1148c5155257Sdrh} SQLITE_DONE 1149c5155257Sdrhdo_test capi3c-17.99 { 1150c5155257Sdrh sqlite3_finalize $STMT 1151c5155257Sdrh} SQLITE_OK 1152b900aaf3Sdrh 1153f1d89f0dSdrh# On the mailing list it has been reported that finalizing after 1154f1d89f0dSdrh# an SQLITE_BUSY return leads to a segfault. Here we test that case. 1155f1d89f0dSdrh# 1156f1d89f0dSdrhdo_test capi3c-18.1 { 1157f1d89f0dSdrh sqlite3 db2 test.db 1158f1d89f0dSdrh set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL] 1159f1d89f0dSdrh sqlite3_step $STMT 1160f1d89f0dSdrh} SQLITE_ROW 1161f1d89f0dSdrhdo_test capi3c-18.2 { 1162f1d89f0dSdrh sqlite3_column_int $STMT 0 1163f1d89f0dSdrh} 4 1164f1d89f0dSdrhdo_test capi3c-18.3 { 1165f1d89f0dSdrh sqlite3_reset $STMT 1166f1d89f0dSdrh db2 eval {BEGIN EXCLUSIVE} 1167f1d89f0dSdrh sqlite3_step $STMT 1168f1d89f0dSdrh} SQLITE_BUSY 1169f1d89f0dSdrhdo_test capi3c-18.4 { 1170f1d89f0dSdrh sqlite3_finalize $STMT 1171f1d89f0dSdrh} SQLITE_BUSY 1172f1d89f0dSdrhdo_test capi3c-18.5 { 1173f1d89f0dSdrh db2 eval {COMMIT} 1174f1d89f0dSdrh db2 close 1175f1d89f0dSdrh} {} 1176f1d89f0dSdrh 1177d47bcb9cSdrh# Ticket #2158. The sqlite3_step() will still return SQLITE_SCHEMA 1178d47bcb9cSdrh# if the database schema changes in a way that makes the statement 1179d47bcb9cSdrh# no longer valid. 1180d47bcb9cSdrh# 1181d47bcb9cSdrhdo_test capi3c-19.1 { 1182d47bcb9cSdrh db eval { 1183d47bcb9cSdrh CREATE TABLE t3(x,y); 1184d47bcb9cSdrh INSERT INTO t3 VALUES(1,2); 1185d47bcb9cSdrh } 1186d47bcb9cSdrh set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1187d47bcb9cSdrh sqlite3_step $STMT 1188d47bcb9cSdrh} SQLITE_ROW 1189d47bcb9cSdrhdo_test capi3c-19.2 { 1190d47bcb9cSdrh sqlite3_column_int $STMT 0 1191d47bcb9cSdrh} 1 1192d47bcb9cSdrhdo_test capi3c-19.3 { 1193d47bcb9cSdrh sqlite3_step $STMT 1194d47bcb9cSdrh} SQLITE_DONE 1195d47bcb9cSdrhdo_test capi3c-19.4 { 1196d47bcb9cSdrh sqlite3_reset $STMT 1197d47bcb9cSdrh db eval {DROP TABLE t3} 1198d47bcb9cSdrh sqlite3_step $STMT 119978230060Sdrh} SQLITE_ERROR 1200de4fcfddSdrhdo_test capi3c-19.4.1 { 1201297a66c2Sdrh sqlite3_errmsg $DB 1202297a66c2Sdrh} {no such table: t3} 1203eec556d3Sshaneifcapable deprecated { 1204de4fcfddSdrh do_test capi3c-19.4.2 { 1205de4fcfddSdrh sqlite3_expired $STMT 1206de4fcfddSdrh } 1 1207eec556d3Sshane} 1208de4fcfddSdrhdo_test capi3c-19.4.3 { 1209de4fcfddSdrh sqlite3_errmsg $DB 1210de4fcfddSdrh} {no such table: t3} 1211eec556d3Sshaneifcapable deprecated { 1212de4fcfddSdrh do_test capi3c-19.4.4 { 1213de4fcfddSdrh sqlite3_expired 0 1214de4fcfddSdrh } 1 1215eec556d3Sshane} 1216d47bcb9cSdrhdo_test capi3c-19.5 { 1217d47bcb9cSdrh sqlite3_reset $STMT 1218d47bcb9cSdrh db eval { 1219d47bcb9cSdrh CREATE TABLE t3(x,y); 1220d47bcb9cSdrh INSERT INTO t3 VALUES(1,2); 1221d47bcb9cSdrh } 1222d47bcb9cSdrh sqlite3_step $STMT 1223d47bcb9cSdrh} SQLITE_ROW 1224eec556d3Sshaneifcapable deprecated { 1225de4fcfddSdrh do_test capi3c-19.5.2 { 1226de4fcfddSdrh sqlite3_expired $STMT 1227de4fcfddSdrh } 0 1228eec556d3Sshane} 1229d47bcb9cSdrhdo_test capi3c-19.6 { 1230d47bcb9cSdrh sqlite3_column_int $STMT 1 1231d47bcb9cSdrh} 2 1232d47bcb9cSdrhdo_test capi3c-19.99 { 1233d47bcb9cSdrh sqlite3_finalize $STMT 1234d47bcb9cSdrh} SQLITE_OK 1235b900aaf3Sdrh 1236f6d8ab87Sdrh# Make sure a change in a separate database connection does not 1237f6d8ab87Sdrh# cause an SQLITE_SCHEMA return. 1238f6d8ab87Sdrh# 1239f6d8ab87Sdrhdo_test capi3c-20.1 { 1240f6d8ab87Sdrh set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1241f6d8ab87Sdrh sqlite3 db2 test.db 1242f6d8ab87Sdrh db2 eval {CREATE TABLE t4(x)} 1243f6d8ab87Sdrh sqlite3_step $STMT 1244f6d8ab87Sdrh} SQLITE_ROW 1245f6d8ab87Sdrhdo_test capi3c-20.2 { 1246f6d8ab87Sdrh sqlite3_column_int $STMT 1 1247f6d8ab87Sdrh} 2 1248f6d8ab87Sdrhdo_test capi3c-20.3 { 1249f6d8ab87Sdrh sqlite3_step $STMT 1250f6d8ab87Sdrh} SQLITE_DONE 1251f6d8ab87Sdrhdo_test capi3c-20.4 { 1252f6d8ab87Sdrh db2 close 1253f6d8ab87Sdrh sqlite3_finalize $STMT 1254f6d8ab87Sdrh} SQLITE_OK 1255f6d8ab87Sdrh 1256612642deSdanielk1977# Test that sqlite3_step() sets the database error code correctly. 1257612642deSdanielk1977# See ticket #2497. 1258612642deSdanielk1977# 12593260548bSdrhifcapable progress { 1260612642deSdanielk1977 do_test capi3c-21.1 { 1261612642deSdanielk1977 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1262612642deSdanielk1977 db progress 5 "expr 1" 1263612642deSdanielk1977 sqlite3_step $STMT 1264612642deSdanielk1977 } {SQLITE_INTERRUPT} 1265612642deSdanielk1977 do_test capi3c-21.2 { 126699dfe5ebSdrh sqlite3_extended_errcode $DB 1267612642deSdanielk1977 } {SQLITE_INTERRUPT} 1268612642deSdanielk1977 do_test capi3c-21.3 { 1269612642deSdanielk1977 sqlite3_finalize $STMT 1270612642deSdanielk1977 } {SQLITE_INTERRUPT} 1271612642deSdanielk1977 do_test capi3c-21.4 { 1272612642deSdanielk1977 set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 1273612642deSdanielk1977 db progress 5 "expr 1" 1274612642deSdanielk1977 sqlite3_step $STMT 1275612642deSdanielk1977 } {SQLITE_ERROR} 1276612642deSdanielk1977 do_test capi3c-21.5 { 1277612642deSdanielk1977 sqlite3_errcode $DB 1278612642deSdanielk1977 } {SQLITE_ERROR} 1279612642deSdanielk1977 do_test capi3c-21.6 { 1280612642deSdanielk1977 sqlite3_finalize $STMT 1281612642deSdanielk1977 } {SQLITE_INTERRUPT} 1282612642deSdanielk1977 do_test capi3c-21.7 { 1283612642deSdanielk1977 sqlite3_errcode $DB 1284612642deSdanielk1977 } {SQLITE_INTERRUPT} 128599dfe5ebSdrh do_test capi3c-21.8 { 128699dfe5ebSdrh sqlite3_extended_errcode $DB 128799dfe5ebSdrh } {SQLITE_INTERRUPT} 12883260548bSdrh} 1289612642deSdanielk1977 129000e087b2Sdrh# Make sure sqlite3_result_error_code() returns the correct error code. 129100e087b2Sdrh# See ticket #2940 129200e087b2Sdrh# 129300e087b2Sdrhdo_test capi3c-22.1 { 129400e087b2Sdrh db progress 0 {} 129500e087b2Sdrh set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL] 129600e087b2Sdrh sqlite3_step $STMT 129700e087b2Sdrh} {SQLITE_PERM} 129800e087b2Sdrhsqlite3_finalize $STMT 129900e087b2Sdrhdo_test capi3c-22.2 { 130000e087b2Sdrh set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL] 130100e087b2Sdrh sqlite3_step $STMT 130200e087b2Sdrh} {SQLITE_ABORT} 130300e087b2Sdrhsqlite3_finalize $STMT 130400e087b2Sdrhdo_test capi3c-22.3 { 130500e087b2Sdrh set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL] 130600e087b2Sdrh sqlite3_step $STMT 130700e087b2Sdrh} {SQLITE_EMPTY} 130800e087b2Sdrhsqlite3_finalize $STMT 130900e087b2Sdrh 1310191b54cbSdrh# For a multi-column result set where the same table column is repeated 1311191b54cbSdrh# in multiple columns of the output, verify that doing a UTF-8 to UTF-16 1312191b54cbSdrh# conversion (or vice versa) on one column does not change the value of 1313191b54cbSdrh# the second. 1314191b54cbSdrh# 1315257d9dc7Sdanielk1977ifcapable utf16 { 1316191b54cbSdrh do_test capi3c-23.1 { 1317191b54cbSdrh set STMT [sqlite3_prepare_v2 db {SELECT b,b,b,b FROM t1} -1 TAIL] 1318191b54cbSdrh sqlite3_step $STMT 1319191b54cbSdrh } {SQLITE_ROW} 1320191b54cbSdrh do_test capi3c-23.2 { 1321191b54cbSdrh sqlite3_column_text16 $STMT 0 1322191b54cbSdrh sqlite3_column_text $STMT 1 1323191b54cbSdrh } {one} 1324191b54cbSdrh do_test capi3c-23.3 { 1325191b54cbSdrh sqlite3_column_text16 $STMT 2 1326191b54cbSdrh sqlite3_column_text $STMT 3 1327191b54cbSdrh } {one} 1328191b54cbSdrh sqlite3_finalize $STMT 1329191b54cbSdrh do_test capi3c-23.4 { 1330191b54cbSdrh set STMT [sqlite3_prepare_v2 db {SELECT b||'x',b,b,b FROM t1} -1 TAIL] 1331191b54cbSdrh sqlite3_step $STMT 1332191b54cbSdrh } {SQLITE_ROW} 1333191b54cbSdrh do_test capi3c-23.5 { 1334191b54cbSdrh sqlite3_column_text16 $STMT 0 1335191b54cbSdrh sqlite3_column_text $STMT 1 1336191b54cbSdrh } {one} 1337191b54cbSdrh do_test capi3c-23.6 { 1338191b54cbSdrh sqlite3_column_text16 $STMT 2 1339191b54cbSdrh sqlite3_column_text $STMT 3 1340191b54cbSdrh } {one} 1341191b54cbSdrh sqlite3_finalize $STMT 1342257d9dc7Sdanielk1977} 134300e087b2Sdrh 134443bc88bbSdan# Test decltype on some SELECT statements that contain sub-selects. 134543bc88bbSdan# 134643bc88bbSdanproc decltype {zSql} { 134743bc88bbSdan set ret [list] 134843bc88bbSdan set STMT [sqlite3_prepare_v2 db $zSql -1 TAIL] 134943bc88bbSdan for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 135043bc88bbSdan lappend ret [sqlite3_column_decltype $STMT $i] 135143bc88bbSdan } 135243bc88bbSdan sqlite3_finalize $STMT 135343bc88bbSdan return $ret 135443bc88bbSdan} 135543bc88bbSdando_test capi3c-24.1 { 135643bc88bbSdan execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) } 135743bc88bbSdan decltype {SELECT * FROM t5} 135843bc88bbSdan} {INTEGER STRING DATETIME} 135943bc88bbSdando_test capi3c-24.2 { 136043bc88bbSdan decltype {SELECT (SELECT c) FROM t5} 136143bc88bbSdan} {DATETIME} 136243bc88bbSdando_test capi3c-24.3 { 136343bc88bbSdan decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5} 136443bc88bbSdan} {DATETIME} 136543bc88bbSdando_test capi3c-24.4 { 136643bc88bbSdan decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b} 136743bc88bbSdan} {INTEGER STRING DATETIME} 136843bc88bbSdando_test capi3c-24.5 { 136943bc88bbSdan decltype { 137043bc88bbSdan SELECT (SELECT x FROM (SELECT c AS x)) 137143bc88bbSdan FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b 137243bc88bbSdan } 137343bc88bbSdan} {DATETIME} 137443bc88bbSdando_test capi3c-24.3 { 137543bc88bbSdan decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5} 137643bc88bbSdan} {INTEGER} 137743bc88bbSdan 13789a8941fcSdan 13799a8941fcSdan# Further tests of sqlite3_column_decltype(): 13809a8941fcSdan# 13819a8941fcSdando_execsql_test 25.0 { 13829a8941fcSdan CREATE TABLE t11(a VARCHAR(10), b INTEGER); 13839a8941fcSdan CREATE TABLE t12(a VARCHAR(15), b FLOAT); 13849a8941fcSdan} 13859a8941fcSdan 13869a8941fcSdanforeach {tn sql} { 13879a8941fcSdan 1 "SELECT * FROM t11 UNION ALL SELECT * FROM t12" 13889a8941fcSdan 2 "SELECT * FROM t11 UNION SELECT * FROM t12" 13899a8941fcSdan 3 "SELECT * FROM t11 EXCEPT SELECT * FROM t12" 13909a8941fcSdan 4 "SELECT * FROM t11 INTERSECT SELECT * FROM t12" 13919a8941fcSdan 13929a8941fcSdan 5 "SELECT * FROM t11 UNION ALL SELECT * FROM t12 ORDER BY 1" 13939a8941fcSdan 6 "SELECT * FROM t11 UNION SELECT * FROM t12 ORDER BY 1" 13949a8941fcSdan 7 "SELECT * FROM t11 EXCEPT SELECT * FROM t12 ORDER BY 1" 13959a8941fcSdan 8 "SELECT * FROM t11 INTERSECT SELECT * FROM t12 ORDER BY 1" 13969a8941fcSdan} { 13979a8941fcSdan do_test 25.$tn { decltype $sql } {VARCHAR(10) INTEGER} 13989a8941fcSdan} 13999a8941fcSdan 1400b900aaf3Sdrhfinish_test 1401