16622cce3Sdanielk1977# 2003 January 29 26622cce3Sdanielk1977# 36622cce3Sdanielk1977# The author disclaims copyright to this source code. In place of 46622cce3Sdanielk1977# a legal notice, here is a blessing: 56622cce3Sdanielk1977# 66622cce3Sdanielk1977# May you do good and not evil. 76622cce3Sdanielk1977# May you find forgiveness for yourself and forgive others. 86622cce3Sdanielk1977# May you share freely, never taking more than you give. 96622cce3Sdanielk1977# 106622cce3Sdanielk1977#*********************************************************************** 116622cce3Sdanielk1977# This file implements regression tests for SQLite library. The 126622cce3Sdanielk1977# focus of this script testing the callback-free C/C++ API. 136622cce3Sdanielk1977# 141c767f0dSdrh# $Id: capi3.test,v 1.70 2009/01/09 02:49:32 drh Exp $ 156622cce3Sdanielk1977# 166622cce3Sdanielk1977 176622cce3Sdanielk1977set testdir [file dirname $argv0] 186622cce3Sdanielk1977source $testdir/tester.tcl 1914965665Sdanset ::testprefix capi3 206622cce3Sdanielk1977 2168928b6cSdan# Do not use a codec for tests in this file, as the database file is 2268928b6cSdan# manipulated directly using tcl scripts (using the [hexio_write] command). 2368928b6cSdan# 2468928b6cSdando_not_use_codec 2568928b6cSdan 266622cce3Sdanielk1977# Return the UTF-16 representation of the supplied UTF-8 string $str. 276622cce3Sdanielk1977# If $nt is true, append two 0x00 bytes as a nul terminator. 286622cce3Sdanielk1977proc utf16 {str {nt 1}} { 296622cce3Sdanielk1977 set r [encoding convertto unicode $str] 306622cce3Sdanielk1977 if {$nt} { 316622cce3Sdanielk1977 append r "\x00\x00" 326622cce3Sdanielk1977 } 336622cce3Sdanielk1977 return $r 346622cce3Sdanielk1977} 356622cce3Sdanielk1977 366622cce3Sdanielk1977# Return the UTF-8 representation of the supplied UTF-16 string $str. 376622cce3Sdanielk1977proc utf8 {str} { 386622cce3Sdanielk1977 # If $str ends in two 0x00 0x00 bytes, knock these off before 396622cce3Sdanielk1977 # converting to UTF-8 using TCL. 406622cce3Sdanielk1977 binary scan $str \c* vals 416622cce3Sdanielk1977 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { 426622cce3Sdanielk1977 set str [binary format \c* [lrange $vals 0 end-2]] 436622cce3Sdanielk1977 } 446622cce3Sdanielk1977 456622cce3Sdanielk1977 set r [encoding convertfrom unicode $str] 466622cce3Sdanielk1977 return $r 476622cce3Sdanielk1977} 486622cce3Sdanielk1977 496622cce3Sdanielk1977# These tests complement those in capi2.test. They are organized 506622cce3Sdanielk1977# as follows: 516622cce3Sdanielk1977# 526622cce3Sdanielk1977# capi3-1.*: Test sqlite3_prepare 536622cce3Sdanielk1977# capi3-2.*: Test sqlite3_prepare16 544ad1713cSdanielk1977# capi3-3.*: Test sqlite3_open 554ad1713cSdanielk1977# capi3-4.*: Test sqlite3_open16 563cf86063Sdanielk1977# capi3-5.*: Test the various sqlite3_result_* APIs 5796d81f99Sdanielk1977# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs. 586622cce3Sdanielk1977# 596622cce3Sdanielk1977 60dddca286Sdrhset DB [sqlite3_connection_pointer db] 616622cce3Sdanielk1977 623e1d8e63Sdrhdo_test capi3-1.0 { 633e1d8e63Sdrh sqlite3_get_autocommit $DB 643e1d8e63Sdrh} 1 656622cce3Sdanielk1977do_test capi3-1.1 { 666622cce3Sdanielk1977 set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL] 67106bb236Sdanielk1977 sqlite3_finalize $STMT 686622cce3Sdanielk1977 set TAIL 696622cce3Sdanielk1977} {} 7099dfe5ebSdrhdo_test capi3-1.2.1 { 716622cce3Sdanielk1977 sqlite3_errcode $DB 726622cce3Sdanielk1977} {SQLITE_OK} 7399dfe5ebSdrhdo_test capi3-1.2.2 { 7499dfe5ebSdrh sqlite3_extended_errcode $DB 7599dfe5ebSdrh} {SQLITE_OK} 766622cce3Sdanielk1977do_test capi3-1.3 { 776622cce3Sdanielk1977 sqlite3_errmsg $DB 786622cce3Sdanielk1977} {not an error} 796622cce3Sdanielk1977do_test capi3-1.4 { 806622cce3Sdanielk1977 set sql {SELECT name FROM sqlite_master;SELECT 10} 816622cce3Sdanielk1977 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 82106bb236Sdanielk1977 sqlite3_finalize $STMT 836622cce3Sdanielk1977 set TAIL 846622cce3Sdanielk1977} {SELECT 10} 856622cce3Sdanielk1977do_test capi3-1.5 { 863a2c8c8bSdanielk1977 set sql {SELECT name FROM sqlite_master;SELECT 10} 873a2c8c8bSdanielk1977 set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL] 883a2c8c8bSdanielk1977 sqlite3_finalize $STMT 893a2c8c8bSdanielk1977 set TAIL 903a2c8c8bSdanielk1977} {SELECT 10} 913a2c8c8bSdanielk1977do_test capi3-1.6 { 923a2c8c8bSdanielk1977 set sql {SELECT name FROM sqlite_master;SELECT 10} 933a2c8c8bSdanielk1977 set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL] 943a2c8c8bSdanielk1977 sqlite3_finalize $STMT 953a2c8c8bSdanielk1977 set TAIL 963a2c8c8bSdanielk1977} {SELECT 10} 973a2c8c8bSdanielk1977 983a2c8c8bSdanielk1977do_test capi3-1.7 { 996622cce3Sdanielk1977 set sql {SELECT namex FROM sqlite_master} 1006622cce3Sdanielk1977 catch { 1016622cce3Sdanielk1977 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 1026622cce3Sdanielk1977 } 1036622cce3Sdanielk1977} {1} 10499dfe5ebSdrhdo_test capi3-1.8.1 { 1056622cce3Sdanielk1977 sqlite3_errcode $DB 1066622cce3Sdanielk1977} {SQLITE_ERROR} 10799dfe5ebSdrhdo_test capi3-1.8.2 { 10899dfe5ebSdrh sqlite3_extended_errcode $DB 10999dfe5ebSdrh} {SQLITE_ERROR} 1103a2c8c8bSdanielk1977do_test capi3-1.9 { 1116622cce3Sdanielk1977 sqlite3_errmsg $DB 1126622cce3Sdanielk1977} {no such column: namex} 1136622cce3Sdanielk1977 1145436dc2dSdrhifcapable {utf16} { 1156622cce3Sdanielk1977 do_test capi3-2.1 { 1166622cce3Sdanielk1977 set sql16 [utf16 {SELECT name FROM sqlite_master}] 1176622cce3Sdanielk1977 set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL] 118106bb236Sdanielk1977 sqlite3_finalize $STMT 1196622cce3Sdanielk1977 utf8 $::TAIL 1206622cce3Sdanielk1977 } {} 1216622cce3Sdanielk1977 do_test capi3-2.2 { 1226622cce3Sdanielk1977 set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] 1236622cce3Sdanielk1977 set STMT [sqlite3_prepare16 $DB $sql -1 TAIL] 124106bb236Sdanielk1977 sqlite3_finalize $STMT 1256622cce3Sdanielk1977 utf8 $TAIL 1266622cce3Sdanielk1977 } {SELECT 10} 1276622cce3Sdanielk1977 do_test capi3-2.3 { 1286622cce3Sdanielk1977 set sql [utf16 {SELECT namex FROM sqlite_master}] 1296622cce3Sdanielk1977 catch { 1301c767f0dSdrh set STMT [sqlite3_prepare16 $DB $sql -1] 1316622cce3Sdanielk1977 } 1326622cce3Sdanielk1977 } {1} 13399dfe5ebSdrh do_test capi3-2.4.1 { 1346622cce3Sdanielk1977 sqlite3_errcode $DB 1356622cce3Sdanielk1977 } {SQLITE_ERROR} 13699dfe5ebSdrh do_test capi3-2.4.2 { 13799dfe5ebSdrh sqlite3_extended_errcode $DB 13899dfe5ebSdrh } {SQLITE_ERROR} 1396622cce3Sdanielk1977 do_test capi3-2.5 { 1406622cce3Sdanielk1977 sqlite3_errmsg $DB 1416622cce3Sdanielk1977 } {no such column: namex} 1423bdca9c9Sdanielk1977 1433bdca9c9Sdanielk1977 ifcapable schema_pragmas { 14483330ed8Sdrh do_test capi3-2.6 { 14583330ed8Sdrh execsql {CREATE TABLE tablename(x)} 1461c767f0dSdrh set sql16 [utf16 {PRAGMA table_info("TableName"); --excess text}] 1471c767f0dSdrh set STMT [sqlite3_prepare16 $DB $sql16 -1] 14883330ed8Sdrh sqlite3_step $STMT 14983330ed8Sdrh } SQLITE_ROW 15083330ed8Sdrh do_test capi3-2.7 { 15183330ed8Sdrh sqlite3_step $STMT 15283330ed8Sdrh } SQLITE_DONE 15383330ed8Sdrh do_test capi3-2.8 { 15483330ed8Sdrh sqlite3_finalize $STMT 15583330ed8Sdrh } SQLITE_OK 1563bdca9c9Sdanielk1977 } 1573bdca9c9Sdanielk1977 1585436dc2dSdrh} ;# endif utf16 1596622cce3Sdanielk1977 1604ad1713cSdanielk1977# rename sqlite3_open sqlite3_open_old 1614ad1713cSdanielk1977# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options} 1624ad1713cSdanielk1977 1634ad1713cSdanielk1977do_test capi3-3.1 { 1644ad1713cSdanielk1977 set db2 [sqlite3_open test.db {}] 1654ad1713cSdanielk1977 sqlite3_errcode $db2 1664ad1713cSdanielk1977} {SQLITE_OK} 1674ad1713cSdanielk1977# FIX ME: Should test the db handle works. 1684ad1713cSdanielk1977do_test capi3-3.2 { 1694ad1713cSdanielk1977 sqlite3_close $db2 17096d81f99Sdanielk1977} {SQLITE_OK} 1714ad1713cSdanielk1977do_test capi3-3.3 { 1724ad1713cSdanielk1977 catch { 1734ad1713cSdanielk1977 set db2 [sqlite3_open /bogus/path/test.db {}] 1744ad1713cSdanielk1977 } 1750e80e509Sdrh set ::capi3_errno [sqlite3_system_errno $db2] 1760e80e509Sdrh list [sqlite3_extended_errcode $db2] [expr {$::capi3_errno!=0}] 1770e80e509Sdrh} {SQLITE_CANTOPEN 1} 1784ad1713cSdanielk1977do_test capi3-3.4 { 1794ad1713cSdanielk1977 sqlite3_errmsg $db2 1804ad1713cSdanielk1977} {unable to open database file} 18196d81f99Sdanielk1977do_test capi3-3.5 { 1820e80e509Sdrh list [sqlite3_system_errno $db2] [sqlite3_close $db2] 1830e80e509Sdrh} [list $::capi3_errno SQLITE_OK] 184afcf9bd8Sdanif {[clang_sanitize_address]==0} { 185dddb2f23Sdrh do_test capi3-3.6.1-misuse { 1868a41449eSdanielk1977 sqlite3_close $db2 1878a41449eSdanielk1977 } {SQLITE_MISUSE} 188dddb2f23Sdrh do_test capi3-3.6.2-misuse { 189312d6b36Sdanielk1977 sqlite3_errmsg $db2 190ff4fa772Sdrh } {bad parameter or other API misuse} 1915436dc2dSdrh ifcapable {utf16} { 192dddb2f23Sdrh do_test capi3-3.6.3-misuse { 193312d6b36Sdanielk1977 utf8 [sqlite3_errmsg16 $db2] 194ff4fa772Sdrh } {bad parameter or other API misuse} 1955436dc2dSdrh } 196afcf9bd8Sdan} 1974ad1713cSdanielk1977 198e4d052a3Sdrhdo_test capi3-3.7 { 199e4d052a3Sdrh set db2 [sqlite3_open] 200e4d052a3Sdrh sqlite3_errcode $db2 201e4d052a3Sdrh} {SQLITE_OK} 202e4d052a3Sdrhdo_test capi3-3.8 { 203e4d052a3Sdrh sqlite3_close $db2 204e4d052a3Sdrh} {SQLITE_OK} 205e4d052a3Sdrh 2064ad1713cSdanielk1977# rename sqlite3_open "" 2074ad1713cSdanielk1977# rename sqlite3_open_old sqlite3_open 2084ad1713cSdanielk1977 2095436dc2dSdrhifcapable {utf16} { 2104ad1713cSdanielk1977do_test capi3-4.1 { 2114ad1713cSdanielk1977 set db2 [sqlite3_open16 [utf16 test.db] {}] 2124ad1713cSdanielk1977 sqlite3_errcode $db2 2134ad1713cSdanielk1977} {SQLITE_OK} 2144ad1713cSdanielk1977# FIX ME: Should test the db handle works. 2154ad1713cSdanielk1977do_test capi3-4.2 { 2164ad1713cSdanielk1977 sqlite3_close $db2 21796d81f99Sdanielk1977} {SQLITE_OK} 2184ad1713cSdanielk1977do_test capi3-4.3 { 2194ad1713cSdanielk1977 catch { 2204ad1713cSdanielk1977 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] 2214ad1713cSdanielk1977 } 2224ad1713cSdanielk1977 sqlite3_errcode $db2 2234ad1713cSdanielk1977} {SQLITE_CANTOPEN} 2244ad1713cSdanielk1977do_test capi3-4.4 { 2254ad1713cSdanielk1977 utf8 [sqlite3_errmsg16 $db2] 2264ad1713cSdanielk1977} {unable to open database file} 227c572ef7fSdanielk1977do_test capi3-4.5 { 2284ad1713cSdanielk1977 sqlite3_close $db2 22996d81f99Sdanielk1977} {SQLITE_OK} 2305436dc2dSdrh} ;# utf16 2314ad1713cSdanielk1977 232ea61b2c4Sdanielk1977# This proc is used to test the following API calls: 2333cf86063Sdanielk1977# 234ea61b2c4Sdanielk1977# sqlite3_column_count 235ea61b2c4Sdanielk1977# sqlite3_column_name 236ea61b2c4Sdanielk1977# sqlite3_column_name16 237ea61b2c4Sdanielk1977# sqlite3_column_decltype 238ea61b2c4Sdanielk1977# sqlite3_column_decltype16 23904f2e68dSdanielk1977# 240ea61b2c4Sdanielk1977# $STMT is a compiled SQL statement. $test is a prefix 241ea61b2c4Sdanielk1977# to use for test names within this proc. $names is a list 242ea61b2c4Sdanielk1977# of the column names that should be returned by $STMT. 243ea61b2c4Sdanielk1977# $decltypes is a list of column declaration types for $STMT. 2443cf86063Sdanielk1977# 245ea61b2c4Sdanielk1977# Example: 2463cf86063Sdanielk1977# 247ea61b2c4Sdanielk1977# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY] 248ea61b2c4Sdanielk1977# check_header test1.1 {1 2 3} {"" "" ""} 249ea61b2c4Sdanielk1977# 250c572ef7fSdanielk1977proc check_header {STMT test names decltypes} { 251ea61b2c4Sdanielk1977 252ea61b2c4Sdanielk1977 # Use the return value of sqlite3_column_count() to build 253ea61b2c4Sdanielk1977 # a list of column indexes. i.e. If sqlite3_column_count 254ea61b2c4Sdanielk1977 # is 3, build the list {0 1 2}. 255c572ef7fSdanielk1977 set ::idxlist [list] 256f4618891Sdanielk1977 set ::numcols [sqlite3_column_count $STMT] 257f4618891Sdanielk1977 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 258ea61b2c4Sdanielk1977 259ea61b2c4Sdanielk1977 # Column names in UTF-8 260ea61b2c4Sdanielk1977 do_test $test.1 { 261ea61b2c4Sdanielk1977 set cnamelist [list] 262ea61b2c4Sdanielk1977 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 263ea61b2c4Sdanielk1977 set cnamelist 264ea61b2c4Sdanielk1977 } $names 265ea61b2c4Sdanielk1977 266ea61b2c4Sdanielk1977 # Column names in UTF-16 2675436dc2dSdrh ifcapable {utf16} { 268ea61b2c4Sdanielk1977 do_test $test.2 { 269ea61b2c4Sdanielk1977 set cnamelist [list] 27076d505baSdanielk1977 foreach i $idxlist { 27176d505baSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 27276d505baSdanielk1977 } 273ea61b2c4Sdanielk1977 set cnamelist 274ea61b2c4Sdanielk1977 } $names 2755436dc2dSdrh } 276ea61b2c4Sdanielk1977 277ea61b2c4Sdanielk1977 # Column names in UTF-8 278ea61b2c4Sdanielk1977 do_test $test.3 { 279ea61b2c4Sdanielk1977 set cnamelist [list] 280ea61b2c4Sdanielk1977 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 281ea61b2c4Sdanielk1977 set cnamelist 282ea61b2c4Sdanielk1977 } $names 283ea61b2c4Sdanielk1977 284ea61b2c4Sdanielk1977 # Column names in UTF-16 2855436dc2dSdrh ifcapable {utf16} { 286ea61b2c4Sdanielk1977 do_test $test.4 { 287ea61b2c4Sdanielk1977 set cnamelist [list] 28876d505baSdanielk1977 foreach i $idxlist { 28976d505baSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] 29076d505baSdanielk1977 } 291ea61b2c4Sdanielk1977 set cnamelist 292ea61b2c4Sdanielk1977 } $names 2935436dc2dSdrh } 29476d505baSdanielk1977 29576d505baSdanielk1977 # Column names in UTF-8 29676d505baSdanielk1977 do_test $test.5 { 29776d505baSdanielk1977 set cnamelist [list] 29876d505baSdanielk1977 foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} 29976d505baSdanielk1977 set cnamelist 30076d505baSdanielk1977 } $decltypes 30176d505baSdanielk1977 30276d505baSdanielk1977 # Column declaration types in UTF-16 3035436dc2dSdrh ifcapable {utf16} { 30476d505baSdanielk1977 do_test $test.6 { 30576d505baSdanielk1977 set cnamelist [list] 30676d505baSdanielk1977 foreach i $idxlist { 30776d505baSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] 30876d505baSdanielk1977 } 30976d505baSdanielk1977 set cnamelist 31076d505baSdanielk1977 } $decltypes 3115436dc2dSdrh } 31276d505baSdanielk1977 313f4618891Sdanielk1977 314f4618891Sdanielk1977 # Test some out of range conditions: 3155436dc2dSdrh ifcapable {utf16} { 316f4618891Sdanielk1977 do_test $test.7 { 317f4618891Sdanielk1977 list \ 318f4618891Sdanielk1977 [sqlite3_column_name $STMT -1] \ 319f4618891Sdanielk1977 [sqlite3_column_name16 $STMT -1] \ 320f4618891Sdanielk1977 [sqlite3_column_decltype $STMT -1] \ 321f4618891Sdanielk1977 [sqlite3_column_decltype16 $STMT -1] \ 322f4618891Sdanielk1977 [sqlite3_column_name $STMT $numcols] \ 323f4618891Sdanielk1977 [sqlite3_column_name16 $STMT $numcols] \ 324f4618891Sdanielk1977 [sqlite3_column_decltype $STMT $numcols] \ 325f4618891Sdanielk1977 [sqlite3_column_decltype16 $STMT $numcols] 326f4618891Sdanielk1977 } {{} {} {} {} {} {} {} {}} 3275436dc2dSdrh } 328955de52cSdanielk1977} 329f4618891Sdanielk1977 330955de52cSdanielk1977# This proc is used to test the following API calls: 331955de52cSdanielk1977# 332955de52cSdanielk1977# sqlite3_column_origin_name 333955de52cSdanielk1977# sqlite3_column_origin_name16 334955de52cSdanielk1977# sqlite3_column_table_name 335955de52cSdanielk1977# sqlite3_column_table_name16 336955de52cSdanielk1977# sqlite3_column_database_name 337955de52cSdanielk1977# sqlite3_column_database_name16 338955de52cSdanielk1977# 339955de52cSdanielk1977# $STMT is a compiled SQL statement. $test is a prefix 340955de52cSdanielk1977# to use for test names within this proc. $names is a list 341955de52cSdanielk1977# of the column names that should be returned by $STMT. 342955de52cSdanielk1977# $decltypes is a list of column declaration types for $STMT. 343955de52cSdanielk1977# 344955de52cSdanielk1977# Example: 345955de52cSdanielk1977# 346955de52cSdanielk1977# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY] 347955de52cSdanielk1977# check_header test1.1 {1 2 3} {"" "" ""} 348955de52cSdanielk1977# 349955de52cSdanielk1977proc check_origin_header {STMT test dbs tables cols} { 3501787ccabSdanielk1977 # If sqlite3_column_origin_name() and friends are not compiled into 3511787ccabSdanielk1977 # this build, this proc is a no-op. 3521787ccabSdanielk1977 ifcapable columnmetadata { 353955de52cSdanielk1977 # Use the return value of sqlite3_column_count() to build 354955de52cSdanielk1977 # a list of column indexes. i.e. If sqlite3_column_count 355955de52cSdanielk1977 # is 3, build the list {0 1 2}. 356955de52cSdanielk1977 set ::idxlist [list] 357955de52cSdanielk1977 set ::numcols [sqlite3_column_count $STMT] 358955de52cSdanielk1977 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} 359955de52cSdanielk1977 360955de52cSdanielk1977 # Database names in UTF-8 361955de52cSdanielk1977 do_test $test.8 { 362955de52cSdanielk1977 set cnamelist [list] 363955de52cSdanielk1977 foreach i $idxlist { 364955de52cSdanielk1977 lappend cnamelist [sqlite3_column_database_name $STMT $i] 365955de52cSdanielk1977 } 366955de52cSdanielk1977 set cnamelist 367955de52cSdanielk1977 } $dbs 368955de52cSdanielk1977 369955de52cSdanielk1977 # Database names in UTF-16 370955de52cSdanielk1977 ifcapable {utf16} { 371955de52cSdanielk1977 do_test $test.9 { 372955de52cSdanielk1977 set cnamelist [list] 373955de52cSdanielk1977 foreach i $idxlist { 374955de52cSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]] 375955de52cSdanielk1977 } 376955de52cSdanielk1977 set cnamelist 377955de52cSdanielk1977 } $dbs 378955de52cSdanielk1977 } 379955de52cSdanielk1977 380955de52cSdanielk1977 # Table names in UTF-8 381955de52cSdanielk1977 do_test $test.10 { 382955de52cSdanielk1977 set cnamelist [list] 3831787ccabSdanielk1977 foreach i $idxlist { 3841787ccabSdanielk1977 lappend cnamelist [sqlite3_column_table_name $STMT $i] 3851787ccabSdanielk1977 } 386955de52cSdanielk1977 set cnamelist 387955de52cSdanielk1977 } $tables 388955de52cSdanielk1977 389955de52cSdanielk1977 # Table names in UTF-16 390955de52cSdanielk1977 ifcapable {utf16} { 391955de52cSdanielk1977 do_test $test.11 { 392955de52cSdanielk1977 set cnamelist [list] 393955de52cSdanielk1977 foreach i $idxlist { 394955de52cSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]] 395955de52cSdanielk1977 } 396955de52cSdanielk1977 set cnamelist 397955de52cSdanielk1977 } $tables 398955de52cSdanielk1977 } 399955de52cSdanielk1977 400955de52cSdanielk1977 # Origin names in UTF-8 401955de52cSdanielk1977 do_test $test.12 { 402955de52cSdanielk1977 set cnamelist [list] 403955de52cSdanielk1977 foreach i $idxlist { 404955de52cSdanielk1977 lappend cnamelist [sqlite3_column_origin_name $STMT $i] 405955de52cSdanielk1977 } 406955de52cSdanielk1977 set cnamelist 407955de52cSdanielk1977 } $cols 408955de52cSdanielk1977 409955de52cSdanielk1977 # Origin declaration types in UTF-16 410955de52cSdanielk1977 ifcapable {utf16} { 411955de52cSdanielk1977 do_test $test.13 { 412955de52cSdanielk1977 set cnamelist [list] 413955de52cSdanielk1977 foreach i $idxlist { 414955de52cSdanielk1977 lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]] 415955de52cSdanielk1977 } 416955de52cSdanielk1977 set cnamelist 417955de52cSdanielk1977 } $cols 418955de52cSdanielk1977 } 419ea61b2c4Sdanielk1977 } 4201787ccabSdanielk1977} 421ea61b2c4Sdanielk1977 422ea61b2c4Sdanielk1977# This proc is used to test the following APIs: 423ea61b2c4Sdanielk1977# 424ea61b2c4Sdanielk1977# sqlite3_data_count 425ea61b2c4Sdanielk1977# sqlite3_column_type 426ea61b2c4Sdanielk1977# sqlite3_column_int 427ea61b2c4Sdanielk1977# sqlite3_column_text 428ea61b2c4Sdanielk1977# sqlite3_column_text16 429ea61b2c4Sdanielk1977# sqlite3_column_double 430ea61b2c4Sdanielk1977# 431ea61b2c4Sdanielk1977# $STMT is a compiled SQL statement for which the previous call 432ea61b2c4Sdanielk1977# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use 433ea61b2c4Sdanielk1977# for test names within this proc. $types is a list of the 434ea61b2c4Sdanielk1977# manifest types for the current row. $ints, $doubles and $strings 435ea61b2c4Sdanielk1977# are lists of the integer, real and string representations of 436ea61b2c4Sdanielk1977# the values in the current row. 437ea61b2c4Sdanielk1977# 438ea61b2c4Sdanielk1977# Example: 439ea61b2c4Sdanielk1977# 440ea61b2c4Sdanielk1977# set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY] 441ea61b2c4Sdanielk1977# sqlite3_step $STMT 442ea61b2c4Sdanielk1977# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}} 443ea61b2c4Sdanielk1977# 444ea61b2c4Sdanielk1977proc check_data {STMT test types ints doubles strings} { 445ea61b2c4Sdanielk1977 446ea61b2c4Sdanielk1977 # Use the return value of sqlite3_column_count() to build 447ea61b2c4Sdanielk1977 # a list of column indexes. i.e. If sqlite3_column_count 448ea61b2c4Sdanielk1977 # is 3, build the list {0 1 2}. 449c572ef7fSdanielk1977 set ::idxlist [list] 450ea61b2c4Sdanielk1977 set numcols [sqlite3_data_count $STMT] 451c572ef7fSdanielk1977 for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i} 452ea61b2c4Sdanielk1977 453ea61b2c4Sdanielk1977# types 454ea61b2c4Sdanielk1977do_test $test.1 { 455ea61b2c4Sdanielk1977 set types [list] 45622ec1346Sdrh foreach i $idxlist { 45722ec1346Sdrh set x [sqlite3_column_type $STMT $i] 45822ec1346Sdrh # EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five 45922ec1346Sdrh # fundamental datatypes: 64-bit signed integer 64-bit IEEE floating 46022ec1346Sdrh # point number string BLOB NULL 46122ec1346Sdrh if {[lsearch {INTEGER FLOAT TEXT BLOB NULL} $x]<0} { 46222ec1346Sdrh set types ERROR 46322ec1346Sdrh break 46422ec1346Sdrh } else { 46522ec1346Sdrh lappend types $x 46622ec1346Sdrh } 46722ec1346Sdrh } 468ea61b2c4Sdanielk1977 set types 469ea61b2c4Sdanielk1977} $types 470ea61b2c4Sdanielk1977 47122ec1346Sdrh 472ea61b2c4Sdanielk1977# Integers 473ea61b2c4Sdanielk1977do_test $test.2 { 474ea61b2c4Sdanielk1977 set ints [list] 475f4618891Sdanielk1977 foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} 476ea61b2c4Sdanielk1977 set ints 477ea61b2c4Sdanielk1977} $ints 478ea61b2c4Sdanielk1977 479f4618891Sdanielk1977# bytes 480f4618891Sdanielk1977set lens [list] 481f4618891Sdanielk1977foreach i $::idxlist { 482f4618891Sdanielk1977 lappend lens [string length [lindex $strings $i]] 483f4618891Sdanielk1977} 484ea61b2c4Sdanielk1977do_test $test.3 { 485f4618891Sdanielk1977 set bytes [list] 486f4618891Sdanielk1977 set lens [list] 487f4618891Sdanielk1977 foreach i $idxlist { 488f4618891Sdanielk1977 lappend bytes [sqlite3_column_bytes $STMT $i] 489f4618891Sdanielk1977 } 490f4618891Sdanielk1977 set bytes 491f4618891Sdanielk1977} $lens 492f4618891Sdanielk1977 493f4618891Sdanielk1977# bytes16 4946c62608fSdrhifcapable {utf16} { 495f4618891Sdanielk1977 set lens [list] 496f4618891Sdanielk1977 foreach i $::idxlist { 497f4618891Sdanielk1977 lappend lens [expr 2 * [string length [lindex $strings $i]]] 498f4618891Sdanielk1977 } 499f4618891Sdanielk1977 do_test $test.4 { 500f4618891Sdanielk1977 set bytes [list] 501f4618891Sdanielk1977 set lens [list] 502f4618891Sdanielk1977 foreach i $idxlist { 503f4618891Sdanielk1977 lappend bytes [sqlite3_column_bytes16 $STMT $i] 504f4618891Sdanielk1977 } 505f4618891Sdanielk1977 set bytes 506f4618891Sdanielk1977 } $lens 5076c62608fSdrh} 508f4618891Sdanielk1977 509f4618891Sdanielk1977# Blob 510f4618891Sdanielk1977do_test $test.5 { 511f4618891Sdanielk1977 set utf8 [list] 512f4618891Sdanielk1977 foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} 513f4618891Sdanielk1977 set utf8 514f4618891Sdanielk1977} $strings 515f4618891Sdanielk1977 516f4618891Sdanielk1977# UTF-8 517f4618891Sdanielk1977do_test $test.6 { 518ea61b2c4Sdanielk1977 set utf8 [list] 519ea61b2c4Sdanielk1977 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 520ea61b2c4Sdanielk1977 set utf8 521ea61b2c4Sdanielk1977} $strings 522ea61b2c4Sdanielk1977 523ea61b2c4Sdanielk1977# Floats 524ea61b2c4Sdanielk1977do_test $test.7 { 525ea61b2c4Sdanielk1977 set utf8 [list] 526ea61b2c4Sdanielk1977 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 527ea61b2c4Sdanielk1977 set utf8 528ea61b2c4Sdanielk1977} $doubles 529ea61b2c4Sdanielk1977 530f4618891Sdanielk1977# UTF-16 5315436dc2dSdrhifcapable {utf16} { 532ea61b2c4Sdanielk1977 do_test $test.8 { 533ea61b2c4Sdanielk1977 set utf8 [list] 534f4618891Sdanielk1977 foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} 535f4618891Sdanielk1977 set utf8 536f4618891Sdanielk1977 } $strings 5375436dc2dSdrh} 538f4618891Sdanielk1977 539f4618891Sdanielk1977# Integers 540f4618891Sdanielk1977do_test $test.9 { 541f4618891Sdanielk1977 set ints [list] 542f4618891Sdanielk1977 foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} 543f4618891Sdanielk1977 set ints 544f4618891Sdanielk1977} $ints 545f4618891Sdanielk1977 546f4618891Sdanielk1977# Floats 547f4618891Sdanielk1977do_test $test.10 { 548f4618891Sdanielk1977 set utf8 [list] 549f4618891Sdanielk1977 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} 550f4618891Sdanielk1977 set utf8 551f4618891Sdanielk1977} $doubles 552f4618891Sdanielk1977 553f4618891Sdanielk1977# UTF-8 554f4618891Sdanielk1977do_test $test.11 { 555f4618891Sdanielk1977 set utf8 [list] 556ea61b2c4Sdanielk1977 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} 557ea61b2c4Sdanielk1977 set utf8 558ea61b2c4Sdanielk1977} $strings 559ea61b2c4Sdanielk1977 560ea61b2c4Sdanielk1977# Types 561f4618891Sdanielk1977do_test $test.12 { 562ea61b2c4Sdanielk1977 set types [list] 563ea61b2c4Sdanielk1977 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} 564ea61b2c4Sdanielk1977 set types 565ea61b2c4Sdanielk1977} $types 566ea61b2c4Sdanielk1977 567f4618891Sdanielk1977# Test that an out of range request returns the equivalent of NULL 568f4618891Sdanielk1977do_test $test.13 { 569f4618891Sdanielk1977 sqlite3_column_int $STMT -1 570f4618891Sdanielk1977} {0} 571f4618891Sdanielk1977do_test $test.13 { 572f4618891Sdanielk1977 sqlite3_column_text $STMT -1 573f4618891Sdanielk1977} {} 574f4618891Sdanielk1977 575ea61b2c4Sdanielk1977} 5763cf86063Sdanielk1977 5771b91c729Sdrhifcapable !floatingpoint { 5781b91c729Sdrh finish_test 5791b91c729Sdrh return 5801b91c729Sdrh} 5811b91c729Sdrh 5823cf86063Sdanielk1977do_test capi3-5.0 { 5833cf86063Sdanielk1977 execsql { 5843cf86063Sdanielk1977 CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); 5853cf86063Sdanielk1977 INSERT INTO t1 VALUES(1, 2, 3); 586b77f5dadSdanielk1977 INSERT INTO t1 VALUES('one', 'two', NULL); 587c572ef7fSdanielk1977 INSERT INTO t1 VALUES(1.2, 1.3, 1.4); 5883cf86063Sdanielk1977 } 5893cf86063Sdanielk1977 set sql "SELECT * FROM t1" 5903cf86063Sdanielk1977 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 5913cf86063Sdanielk1977 sqlite3_column_count $STMT 5923cf86063Sdanielk1977} 3 5933cf86063Sdanielk1977 59476d505baSdanielk1977check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)} 595955de52cSdanielk1977check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c} 5963cf86063Sdanielk1977do_test capi3-5.2 { 5973cf86063Sdanielk1977 sqlite3_step $STMT 5983cf86063Sdanielk1977} SQLITE_ROW 5993cf86063Sdanielk1977 60076d505baSdanielk1977check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)} 601955de52cSdanielk1977check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c} 602f93bbbeaSdanielk1977check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3} 6033cf86063Sdanielk1977 604ea61b2c4Sdanielk1977do_test capi3-5.5 { 6053cf86063Sdanielk1977 sqlite3_step $STMT 6063cf86063Sdanielk1977} SQLITE_ROW 6073cf86063Sdanielk1977 60876d505baSdanielk1977check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)} 609955de52cSdanielk1977check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c} 610f93bbbeaSdanielk1977check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}} 6113cf86063Sdanielk1977 612ea61b2c4Sdanielk1977do_test capi3-5.8 { 6133cf86063Sdanielk1977 sqlite3_step $STMT 614c572ef7fSdanielk1977} SQLITE_ROW 615c572ef7fSdanielk1977 61676d505baSdanielk1977check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)} 617955de52cSdanielk1977check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c} 618f93bbbeaSdanielk1977check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4} 619c572ef7fSdanielk1977 620c572ef7fSdanielk1977do_test capi3-5.11 { 621c572ef7fSdanielk1977 sqlite3_step $STMT 6223cf86063Sdanielk1977} SQLITE_DONE 6233cf86063Sdanielk1977 624c572ef7fSdanielk1977do_test capi3-5.12 { 6253cf86063Sdanielk1977 sqlite3_finalize $STMT 626ea61b2c4Sdanielk1977} SQLITE_OK 6273cf86063Sdanielk1977 62830bcf5dbSdrhdo_test capi3-5.20 { 62930bcf5dbSdrh set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a" 63030bcf5dbSdrh set STMT [sqlite3_prepare $DB $sql -1 TAIL] 63130bcf5dbSdrh sqlite3_column_count $STMT 63230bcf5dbSdrh} 3 63330bcf5dbSdrh 63430bcf5dbSdrhcheck_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}} 63530bcf5dbSdrhcheck_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}} 63630bcf5dbSdrhdo_test capi3-5.23 { 63730bcf5dbSdrh sqlite3_finalize $STMT 63830bcf5dbSdrh} SQLITE_OK 63930bcf5dbSdrh 640bf2564f6Sdrhdo_test capi3-5.30 { 641bf2564f6Sdrh set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x" 642bf2564f6Sdrh set STMT [sqlite3_prepare $DB $sql -1 TAIL] 643bf2564f6Sdrh sqlite3_column_count $STMT 644bf2564f6Sdrh} 3 645bf2564f6Sdrh 646bf2564f6Sdrhcheck_header $STMT capi3-5.31 {x y z} {VARINT {} {}} 647bf2564f6Sdrhcheck_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}} 648bf2564f6Sdrhdo_test capi3-5.33 { 649bf2564f6Sdrh sqlite3_finalize $STMT 650bf2564f6Sdrh} SQLITE_OK 651bf2564f6Sdrh 6526116ee4eSdrh# 2018-01-09: If a column is the last token if a string, the column name 6536116ee4eSdrh# was not being set correctly, due to changes in check-in 6546116ee4eSdrh# https://sqlite.org/src/info/0fdf97efe5df7455 6556116ee4eSdrh# 6566116ee4eSdrh# This problem was detected by the community during beta-testing. 6576116ee4eSdrh# 6586116ee4eSdrhdo_test capi3-5.34 { 6596116ee4eSdrh set STMT [sqlite3_prepare $DB {SELECT :a, :b} -1 TAIL] 6606116ee4eSdrh sqlite3_column_count $STMT 6616116ee4eSdrh} 2 6626116ee4eSdrhcheck_header $STMT capi-5.35 {:a :b} {{} {}} 6636116ee4eSdrhsqlite3_finalize $STMT 66430bcf5dbSdrh 66593cd0395Sdanielk1977set ::ENC [execsql {pragma encoding}] 666106bb236Sdanielk1977db close 667106bb236Sdanielk1977 66896d81f99Sdanielk1977do_test capi3-6.0 { 669dddca286Sdrh sqlite3 db test.db 670dddca286Sdrh set DB [sqlite3_connection_pointer db] 67168928b6cSdan if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy } 67296d81f99Sdanielk1977 set sql {SELECT a FROM t1 order by rowid} 67396d81f99Sdanielk1977 set STMT [sqlite3_prepare $DB $sql -1 TAIL] 67496d81f99Sdanielk1977 expr 0 67596d81f99Sdanielk1977} {0} 67696d81f99Sdanielk1977do_test capi3-6.1 { 67729c636bcSdrh db cache flush 67896d81f99Sdanielk1977 sqlite3_close $DB 67996d81f99Sdanielk1977} {SQLITE_BUSY} 680bba02a95Sdan 681bba02a95Sdan# 6.2 and 6.3 used to return SQLITE_ERROR and SQLITE_SCHEMA, respectively. 682bba02a95Sdan# But since attempting to close a connection no longer resets the internal 683bba02a95Sdan# schema and expires all statements, this is no longer the case. 68496d81f99Sdanielk1977do_test capi3-6.2 { 68596d81f99Sdanielk1977 sqlite3_step $STMT 686bba02a95Sdan} {SQLITE_ROW} 687c2a75551Sdrh#check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1} 68896d81f99Sdanielk1977do_test capi3-6.3 { 68996d81f99Sdanielk1977 sqlite3_finalize $STMT 690bba02a95Sdan} {SQLITE_OK} 691bba02a95Sdan 692afcf9bd8Sdanif {[clang_sanitize_address]==0} { 693dddb2f23Sdrh do_test capi3-6.4-misuse { 69429c636bcSdrh db cache flush 69596d81f99Sdanielk1977 sqlite3_close $DB 69696d81f99Sdanielk1977 } {SQLITE_OK} 697afcf9bd8Sdan} 698dddca286Sdrhdb close 69996d81f99Sdanielk1977 700bb8a279eSdrh# This procedure sets the value of the file-format in file 'test.db' 701bb8a279eSdrh# to $newval. Also, the schema cookie is incremented. 702bb8a279eSdrh# 703bb8a279eSdrhproc set_file_format {newval} { 704bb8a279eSdrh hexio_write test.db 44 [hexio_render_int32 $newval] 705bb8a279eSdrh set schemacookie [hexio_get_int [hexio_read test.db 40 4]] 706bb8a279eSdrh incr schemacookie 707bb8a279eSdrh hexio_write test.db 40 [hexio_render_int32 $schemacookie] 708bb8a279eSdrh return {} 709bb8a279eSdrh} 710bb8a279eSdrh 711bb8a279eSdrh# This procedure returns the value of the file-format in file 'test.db'. 712bb8a279eSdrh# 713bb8a279eSdrhproc get_file_format {{fname test.db}} { 714bb8a279eSdrh return [hexio_get_int [hexio_read $fname 44 4]] 715bb8a279eSdrh} 716bb8a279eSdrh 71725d6543dSdrhif {![sqlite3 -has-codec]} { 7188a41449eSdanielk1977 # Test what happens when the library encounters a newer file format. 7198a41449eSdanielk1977 do_test capi3-7.1 { 720bb8a279eSdrh set_file_format 5 7218a41449eSdanielk1977 } {} 7228a41449eSdanielk1977 do_test capi3-7.2 { 723cb354603Sdan catch { sqlite3 db test.db } 7248a41449eSdanielk1977 catchsql { 7258a41449eSdanielk1977 SELECT * FROM sqlite_master; 7268a41449eSdanielk1977 } 7278a41449eSdanielk1977 } {1 {unsupported file format}} 72825d6543dSdrh db close 72925d6543dSdrh} 7308a41449eSdanielk1977 73125d6543dSdrhif {![sqlite3 -has-codec]} { 732312d6b36Sdanielk1977 # Now test that the library correctly handles bogus entries in the 733312d6b36Sdanielk1977 # sqlite_master table (schema corruption). 734312d6b36Sdanielk1977 do_test capi3-8.1 { 735fda06befSmistachkin forcedelete test.db test.db-journal 736312d6b36Sdanielk1977 sqlite3 db test.db 737312d6b36Sdanielk1977 execsql { 738312d6b36Sdanielk1977 CREATE TABLE t1(a); 739312d6b36Sdanielk1977 } 740312d6b36Sdanielk1977 db close 741312d6b36Sdanielk1977 } {} 742312d6b36Sdanielk1977 do_test capi3-8.2 { 743bb8a279eSdrh sqlite3 db test.db 744*6ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 745bb8a279eSdrh execsql { 746bb8a279eSdrh PRAGMA writable_schema=ON; 747bb8a279eSdrh INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL); 748bb8a279eSdrh } 749bb8a279eSdrh db close 750312d6b36Sdanielk1977 } {} 751312d6b36Sdanielk1977 do_test capi3-8.3 { 752cb354603Sdan catch { sqlite3 db test.db } 753312d6b36Sdanielk1977 catchsql { 754312d6b36Sdanielk1977 SELECT * FROM sqlite_master; 755312d6b36Sdanielk1977 } 75634533150Sdrh } {1 {malformed database schema (?)}} 757312d6b36Sdanielk1977 do_test capi3-8.4 { 758312d6b36Sdanielk1977 # Build a 5-field row record. The first field is a string 'table', and 759bb8a279eSdrh # subsequent fields are all NULL. 760bb8a279eSdrh db close 761fda06befSmistachkin forcedelete test.db test.db-journal 762bb8a279eSdrh sqlite3 db test.db 763*6ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 764bb8a279eSdrh execsql { 765bb8a279eSdrh CREATE TABLE t1(a); 766bb8a279eSdrh PRAGMA writable_schema=ON; 767bb8a279eSdrh INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL); 76893cd0395Sdanielk1977 } 769bb8a279eSdrh db close 77092f02c31Sdrh } {}; 771312d6b36Sdanielk1977 do_test capi3-8.5 { 772cb354603Sdan catch { sqlite3 db test.db } 773312d6b36Sdanielk1977 catchsql { 774312d6b36Sdanielk1977 SELECT * FROM sqlite_master; 775312d6b36Sdanielk1977 } 77634533150Sdrh } {1 {malformed database schema (?)}} 777312d6b36Sdanielk1977 db close 77825d6543dSdrh} 779fda06befSmistachkinforcedelete test.db 780fda06befSmistachkinforcedelete test.db-journal 78125d6543dSdrh 782312d6b36Sdanielk1977 783312d6b36Sdanielk1977# Test the english language string equivalents for sqlite error codes 784312d6b36Sdanielk1977set code2english [list \ 785312d6b36Sdanielk1977SQLITE_OK {not an error} \ 786a690ff36SdrhSQLITE_ERROR {SQL logic error} \ 787312d6b36Sdanielk1977SQLITE_PERM {access permission denied} \ 788ff4fa772SdrhSQLITE_ABORT {query aborted} \ 789312d6b36Sdanielk1977SQLITE_BUSY {database is locked} \ 790312d6b36Sdanielk1977SQLITE_LOCKED {database table is locked} \ 791312d6b36Sdanielk1977SQLITE_NOMEM {out of memory} \ 792312d6b36Sdanielk1977SQLITE_READONLY {attempt to write a readonly database} \ 793312d6b36Sdanielk1977SQLITE_INTERRUPT {interrupted} \ 794312d6b36Sdanielk1977SQLITE_IOERR {disk I/O error} \ 795312d6b36Sdanielk1977SQLITE_CORRUPT {database disk image is malformed} \ 7962db0bbc2SdrhSQLITE_FULL {database or disk is full} \ 797312d6b36Sdanielk1977SQLITE_CANTOPEN {unable to open database file} \ 798312d6b36Sdanielk1977SQLITE_SCHEMA {database schema has changed} \ 799312d6b36Sdanielk1977SQLITE_CONSTRAINT {constraint failed} \ 800312d6b36Sdanielk1977SQLITE_MISMATCH {datatype mismatch} \ 801ff4fa772SdrhSQLITE_MISUSE {bad parameter or other API misuse} \ 802312d6b36Sdanielk1977SQLITE_AUTH {authorization denied} \ 803ff4fa772SdrhSQLITE_RANGE {column index out of range} \ 804ff4fa772SdrhSQLITE_NOTADB {file is not a database} \ 805312d6b36Sdanielk1977unknownerror {unknown error} \ 806312d6b36Sdanielk1977] 807312d6b36Sdanielk1977 808312d6b36Sdanielk1977set test_number 1 809312d6b36Sdanielk1977foreach {code english} $code2english { 810312d6b36Sdanielk1977 do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english 811312d6b36Sdanielk1977 incr test_number 812312d6b36Sdanielk1977} 813312d6b36Sdanielk1977 814312d6b36Sdanielk1977# Test the error message when a "real" out of memory occurs. 815a879342bSdanif { [permutation] != "nofaultsim" } { 816312d6b36Sdanielk1977 do_test capi3-10-1 { 817dddca286Sdrh sqlite3 db test.db 818dddca286Sdrh set DB [sqlite3_connection_pointer db] 819107b25f1Sdrh sqlite3_memdebug_fail 1 820312d6b36Sdanielk1977 catchsql { 821312d6b36Sdanielk1977 select * from sqlite_master; 822312d6b36Sdanielk1977 } 823312d6b36Sdanielk1977 } {1 {out of memory}} 824312d6b36Sdanielk1977 do_test capi3-10-2 { 825312d6b36Sdanielk1977 sqlite3_errmsg $::DB 826312d6b36Sdanielk1977 } {out of memory} 8275436dc2dSdrh ifcapable {utf16} { 828312d6b36Sdanielk1977 do_test capi3-10-3 { 829312d6b36Sdanielk1977 utf8 [sqlite3_errmsg16 $::DB] 830312d6b36Sdanielk1977 } {out of memory} 8315436dc2dSdrh } 832312d6b36Sdanielk1977 db close 833a1644fd8Sdanielk1977 sqlite3_memdebug_fail -1 83452fd7beaSdrh do_test capi3-10-4 { 83552fd7beaSdrh sqlite3 db test.db 83652fd7beaSdrh set DB [sqlite3_connection_pointer db] 83752fd7beaSdrh sqlite3_memdebug_fail 1 83852fd7beaSdrh catchsql { 83952fd7beaSdrh select * from sqlite_master where rowid>5; 84052fd7beaSdrh } 84152fd7beaSdrh } {1 {out of memory}} 84252fd7beaSdrh do_test capi3-10-5 { 84352fd7beaSdrh sqlite3_errmsg $::DB 84452fd7beaSdrh } {out of memory} 84552fd7beaSdrh ifcapable {utf16} { 84652fd7beaSdrh do_test capi3-10-6 { 84752fd7beaSdrh utf8 [sqlite3_errmsg16 $::DB] 84852fd7beaSdrh } {out of memory} 84952fd7beaSdrh } 85052fd7beaSdrh db close 85152fd7beaSdrh sqlite3_memdebug_fail -1 8527939aa87Sdanielk1977} 853312d6b36Sdanielk1977 85446c43eddSdanielk1977# The following tests - capi3-11.* - test that a COMMIT or ROLLBACK 85546c43eddSdanielk1977# statement issued while there are still outstanding VMs that are part of 85646c43eddSdanielk1977# the transaction fails. 857dddca286Sdrhsqlite3 db test.db 858dddca286Sdrhset DB [sqlite3_connection_pointer db] 85946c43eddSdanielk1977sqlite_register_test_function $DB func 86046c43eddSdanielk1977do_test capi3-11.1 { 86146c43eddSdanielk1977 execsql { 86246c43eddSdanielk1977 BEGIN; 86346c43eddSdanielk1977 CREATE TABLE t1(a, b); 86446c43eddSdanielk1977 INSERT INTO t1 VALUES(1, 'int'); 86546c43eddSdanielk1977 INSERT INTO t1 VALUES(2, 'notatype'); 86646c43eddSdanielk1977 } 86746c43eddSdanielk1977} {} 8683e1d8e63Sdrhdo_test capi3-11.1.1 { 8693e1d8e63Sdrh sqlite3_get_autocommit $DB 8703e1d8e63Sdrh} 0 87146c43eddSdanielk1977do_test capi3-11.2 { 87246c43eddSdanielk1977 set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL] 87346c43eddSdanielk1977 sqlite3_step $STMT 87446c43eddSdanielk1977} {SQLITE_ROW} 875ad4a4b80Sdrh 876ad4a4b80Sdrh# As of 3.6.5 a COMMIT is OK during while a query is still running - 877ad4a4b80Sdrh# as long as it is a read-only query and not an incremental BLOB write. 878ad4a4b80Sdrh# 87999dfe5ebSdrhdo_test capi3-11.3.1 { 88046c43eddSdanielk1977 catchsql { 88146c43eddSdanielk1977 COMMIT; 88246c43eddSdanielk1977 } 883ad4a4b80Sdrh} {0 {}} 88499dfe5ebSdrhdo_test capi3-11.3.2 { 88599dfe5ebSdrh sqlite3_extended_errcode $DB 886ad4a4b80Sdrh} {SQLITE_OK} 88799dfe5ebSdrhdo_test capi3-11.3.3 { 8883e1d8e63Sdrh sqlite3_get_autocommit $DB 889ad4a4b80Sdrh} 1 890ad4a4b80Sdrhdo_test capi3-11.3.4 { 891ad4a4b80Sdrh db eval {PRAGMA lock_status} 892ad4a4b80Sdrh} {main shared temp closed} 893ad4a4b80Sdrh 89446c43eddSdanielk1977do_test capi3-11.4 { 89546c43eddSdanielk1977 sqlite3_step $STMT 89646c43eddSdanielk1977} {SQLITE_ERROR} 89746c43eddSdanielk1977do_test capi3-11.5 { 89846c43eddSdanielk1977 sqlite3_finalize $STMT 89946c43eddSdanielk1977} {SQLITE_ERROR} 90046c43eddSdanielk1977do_test capi3-11.6 { 90146c43eddSdanielk1977 catchsql { 90246c43eddSdanielk1977 SELECT * FROM t1; 90346c43eddSdanielk1977 } 90446c43eddSdanielk1977} {0 {1 int 2 notatype}} 90546c43eddSdanielk1977do_test capi3-11.7 { 9063e1d8e63Sdrh sqlite3_get_autocommit $DB 9073e1d8e63Sdrh} 1 90846c43eddSdanielk1977do_test capi3-11.8 { 90946c43eddSdanielk1977 execsql { 91046c43eddSdanielk1977 CREATE TABLE t2(a); 91146c43eddSdanielk1977 INSERT INTO t2 VALUES(1); 91246c43eddSdanielk1977 INSERT INTO t2 VALUES(2); 91346c43eddSdanielk1977 BEGIN; 91446c43eddSdanielk1977 INSERT INTO t2 VALUES(3); 91546c43eddSdanielk1977 } 91646c43eddSdanielk1977} {} 9173e1d8e63Sdrhdo_test capi3-11.8.1 { 9183e1d8e63Sdrh sqlite3_get_autocommit $DB 9193e1d8e63Sdrh} 0 92046c43eddSdanielk1977do_test capi3-11.9 { 92146c43eddSdanielk1977 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL] 92246c43eddSdanielk1977 sqlite3_step $STMT 92346c43eddSdanielk1977} {SQLITE_ROW} 9243e1d8e63Sdrhdo_test capi3-11.9.1 { 9253e1d8e63Sdrh sqlite3_get_autocommit $DB 9263e1d8e63Sdrh} 0 9273e1d8e63Sdrhdo_test capi3-11.9.2 { 92846c43eddSdanielk1977 catchsql { 92946c43eddSdanielk1977 ROLLBACK; 93046c43eddSdanielk1977 } 9310f198a74Sdrh} {0 {}} 9323e1d8e63Sdrhdo_test capi3-11.9.3 { 9333e1d8e63Sdrh sqlite3_get_autocommit $DB 9340f198a74Sdrh} 1 93546c43eddSdanielk1977do_test capi3-11.10 { 93646c43eddSdanielk1977 sqlite3_step $STMT 93747b7fc78Sdrh} {SQLITE_ROW} 93846c43eddSdanielk1977do_test capi3-11.11 { 93946c43eddSdanielk1977 sqlite3_step $STMT 94047b7fc78Sdrh} {SQLITE_DONE} 941231ee688Sdanifcapable !autoreset { 942108e5a9aSdrh do_test capi3-11.12armor { 943108e5a9aSdrh sqlite3_step $STMT 944108e5a9aSdrh sqlite3_step $STMT 945108e5a9aSdrh } {SQLITE_MISUSE} 946108e5a9aSdrh} else { 94746c43eddSdanielk1977 do_test capi3-11.12 { 94846c43eddSdanielk1977 sqlite3_step $STMT 9490f198a74Sdrh sqlite3_step $STMT 95047b7fc78Sdrh } {SQLITE_ROW} 951108e5a9aSdrh} 95246c43eddSdanielk1977do_test capi3-11.13 { 95346c43eddSdanielk1977 sqlite3_finalize $STMT 95446c43eddSdanielk1977} {SQLITE_OK} 95546c43eddSdanielk1977do_test capi3-11.14 { 95646c43eddSdanielk1977 execsql { 95746c43eddSdanielk1977 SELECT a FROM t2; 95846c43eddSdanielk1977 } 9590f198a74Sdrh} {1 2} 9603e1d8e63Sdrhdo_test capi3-11.14.1 { 9613e1d8e63Sdrh sqlite3_get_autocommit $DB 9620f198a74Sdrh} 1 96346c43eddSdanielk1977do_test capi3-11.15 { 96446c43eddSdanielk1977 catchsql { 96546c43eddSdanielk1977 ROLLBACK; 96646c43eddSdanielk1977 } 9670f198a74Sdrh} {1 {cannot rollback - no transaction is active}} 9683e1d8e63Sdrhdo_test capi3-11.15.1 { 9693e1d8e63Sdrh sqlite3_get_autocommit $DB 9703e1d8e63Sdrh} 1 97146c43eddSdanielk1977do_test capi3-11.16 { 97246c43eddSdanielk1977 execsql { 97346c43eddSdanielk1977 SELECT a FROM t2; 97446c43eddSdanielk1977 } 97546c43eddSdanielk1977} {1 2} 97646c43eddSdanielk1977 97746c43eddSdanielk1977# Sanity check on the definition of 'outstanding VM'. This means any VM 97846c43eddSdanielk1977# that has had sqlite3_step() called more recently than sqlite3_finalize() or 97946c43eddSdanielk1977# sqlite3_reset(). So a VM that has just been prepared or reset does not 98046c43eddSdanielk1977# count as an active VM. 98146c43eddSdanielk1977do_test capi3-11.17 { 98246c43eddSdanielk1977 execsql { 98346c43eddSdanielk1977 BEGIN; 98446c43eddSdanielk1977 } 98546c43eddSdanielk1977} {} 98646c43eddSdanielk1977do_test capi3-11.18 { 98746c43eddSdanielk1977 set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL] 98846c43eddSdanielk1977 catchsql { 98946c43eddSdanielk1977 COMMIT; 99046c43eddSdanielk1977 } 99146c43eddSdanielk1977} {0 {}} 99246c43eddSdanielk1977do_test capi3-11.19 { 99346c43eddSdanielk1977 sqlite3_step $STMT 99446c43eddSdanielk1977} {SQLITE_ROW} 99546c43eddSdanielk1977do_test capi3-11.20 { 99646c43eddSdanielk1977 catchsql { 99746c43eddSdanielk1977 BEGIN; 99846c43eddSdanielk1977 COMMIT; 99946c43eddSdanielk1977 } 1000ad4a4b80Sdrh} {0 {}} 100146c43eddSdanielk1977do_test capi3-11.20 { 100246c43eddSdanielk1977 sqlite3_reset $STMT 100346c43eddSdanielk1977 catchsql { 100446c43eddSdanielk1977 COMMIT; 100546c43eddSdanielk1977 } 1006ad4a4b80Sdrh} {1 {cannot commit - no transaction is active}} 100746c43eddSdanielk1977do_test capi3-11.21 { 100846c43eddSdanielk1977 sqlite3_finalize $STMT 100946c43eddSdanielk1977} {SQLITE_OK} 101046c43eddSdanielk1977 101185b623f2Sdrh# The following tests - capi3-12.* - check that its Ok to start a 101285b623f2Sdrh# transaction while other VMs are active, and that its Ok to execute 1013980b1a74Sdrh# atomic updates in the same situation 1014980b1a74Sdrh# 101546c43eddSdanielk1977do_test capi3-12.1 { 101646c43eddSdanielk1977 set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL] 101746c43eddSdanielk1977 sqlite3_step $STMT 101846c43eddSdanielk1977} {SQLITE_ROW} 101946c43eddSdanielk1977do_test capi3-12.2 { 102046c43eddSdanielk1977 catchsql { 102146c43eddSdanielk1977 INSERT INTO t1 VALUES(3, NULL); 102246c43eddSdanielk1977 } 102346c43eddSdanielk1977} {0 {}} 102446c43eddSdanielk1977do_test capi3-12.3 { 102546c43eddSdanielk1977 catchsql { 102646c43eddSdanielk1977 INSERT INTO t2 VALUES(4); 102746c43eddSdanielk1977 } 1028980b1a74Sdrh} {0 {}} 102946c43eddSdanielk1977do_test capi3-12.4 { 103046c43eddSdanielk1977 catchsql { 103146c43eddSdanielk1977 BEGIN; 103246c43eddSdanielk1977 INSERT INTO t1 VALUES(4, NULL); 103346c43eddSdanielk1977 } 103446c43eddSdanielk1977} {0 {}} 103546c43eddSdanielk1977do_test capi3-12.5 { 103646c43eddSdanielk1977 sqlite3_step $STMT 103746c43eddSdanielk1977} {SQLITE_ROW} 1038980b1a74Sdrhdo_test capi3-12.5.1 { 1039980b1a74Sdrh sqlite3_step $STMT 1040980b1a74Sdrh} {SQLITE_ROW} 104146c43eddSdanielk1977do_test capi3-12.6 { 104246c43eddSdanielk1977 sqlite3_step $STMT 1043ed326d70Sdanielk1977} {SQLITE_DONE} 104412b13002Sdanielk1977do_test capi3-12.7 { 104546c43eddSdanielk1977 sqlite3_finalize $STMT 104646c43eddSdanielk1977} {SQLITE_OK} 104712b13002Sdanielk1977do_test capi3-12.8 { 104846c43eddSdanielk1977 execsql { 104946c43eddSdanielk1977 COMMIT; 105046c43eddSdanielk1977 SELECT a FROM t1; 105146c43eddSdanielk1977 } 105246c43eddSdanielk1977} {1 2 3 4} 105346c43eddSdanielk1977 1054600dd0baSdanielk1977# Test cases capi3-13.* test the sqlite3_clear_bindings() and 1055600dd0baSdanielk1977# sqlite3_sleep APIs. 1056600dd0baSdanielk1977# 1057600dd0baSdanielk1977if {[llength [info commands sqlite3_clear_bindings]]>0} { 1058600dd0baSdanielk1977 do_test capi3-13.1 { 1059600dd0baSdanielk1977 execsql { 1060600dd0baSdanielk1977 DELETE FROM t1; 1061600dd0baSdanielk1977 } 1062600dd0baSdanielk1977 set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 1063600dd0baSdanielk1977 sqlite3_step $STMT 1064600dd0baSdanielk1977 } {SQLITE_DONE} 1065600dd0baSdanielk1977 do_test capi3-13.2 { 1066600dd0baSdanielk1977 sqlite3_reset $STMT 1067600dd0baSdanielk1977 sqlite3_bind_text $STMT 1 hello 5 1068600dd0baSdanielk1977 sqlite3_bind_text $STMT 2 world 5 1069600dd0baSdanielk1977 sqlite3_step $STMT 1070600dd0baSdanielk1977 } {SQLITE_DONE} 1071600dd0baSdanielk1977 do_test capi3-13.3 { 1072600dd0baSdanielk1977 sqlite3_reset $STMT 1073600dd0baSdanielk1977 sqlite3_clear_bindings $STMT 1074600dd0baSdanielk1977 sqlite3_step $STMT 1075600dd0baSdanielk1977 } {SQLITE_DONE} 1076600dd0baSdanielk1977 do_test capi3-13-4 { 1077600dd0baSdanielk1977 sqlite3_finalize $STMT 1078600dd0baSdanielk1977 execsql { 1079600dd0baSdanielk1977 SELECT * FROM t1; 1080600dd0baSdanielk1977 } 1081600dd0baSdanielk1977 } {{} {} hello world {} {}} 1082600dd0baSdanielk1977} 1083600dd0baSdanielk1977if {[llength [info commands sqlite3_sleep]]>0} { 1084600dd0baSdanielk1977 do_test capi3-13-5 { 1085600dd0baSdanielk1977 set ms [sqlite3_sleep 80] 1086600dd0baSdanielk1977 expr {$ms==80 || $ms==1000} 1087600dd0baSdanielk1977 } {1} 1088600dd0baSdanielk1977} 1089600dd0baSdanielk1977 1090473d179dSdrh# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 1091473d179dSdrh# 1092afcf9bd8Sdanif {[clang_sanitize_address]==0} { 1093dddb2f23Sdrh do_test capi3-14.1-misuse { 1094473d179dSdrh set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 1095473d179dSdrh lappend rc $msg 1096473d179dSdrh } {1 SQLITE_MISUSE} 1097afcf9bd8Sdan} 1098473d179dSdrh 10999051a420Sdrh# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. 11009051a420Sdrh# 11019051a420Sdrhdo_test capi3-15.1 { 11029051a420Sdrh set sql {SELECT * FROM t2} 11039051a420Sdrh set nbytes [string length $sql] 11049051a420Sdrh append sql { WHERE a==1} 11059051a420Sdrh set STMT [sqlite3_prepare $DB $sql $nbytes TAIL] 11069051a420Sdrh sqlite3_step $STMT 11079051a420Sdrh sqlite3_column_int $STMT 0 11089051a420Sdrh} {1} 11099051a420Sdrhdo_test capi3-15.2 { 11109051a420Sdrh sqlite3_step $STMT 11119051a420Sdrh sqlite3_column_int $STMT 0 11129051a420Sdrh} {2} 11139051a420Sdrhdo_test capi3-15.3 { 11149051a420Sdrh sqlite3_finalize $STMT 11159051a420Sdrh} {SQLITE_OK} 11160cf19ed8Sdrhdo_test capi3-15.4 { 11170cf19ed8Sdrh # 123456789 1234567 11180cf19ed8Sdrh set sql {SELECT 1234567890} 11190cf19ed8Sdrh set STMT [sqlite3_prepare $DB $sql 8 TAIL] 11200cf19ed8Sdrh sqlite3_step $STMT 11210cf19ed8Sdrh set v1 [sqlite3_column_int $STMT 0] 11220cf19ed8Sdrh sqlite3_finalize $STMT 11230cf19ed8Sdrh set v1 11240cf19ed8Sdrh} {1} 11250cf19ed8Sdrhdo_test capi3-15.5 { 11260cf19ed8Sdrh # 123456789 1234567 11270cf19ed8Sdrh set sql {SELECT 1234567890} 11280cf19ed8Sdrh set STMT [sqlite3_prepare $DB $sql 9 TAIL] 11290cf19ed8Sdrh sqlite3_step $STMT 11300cf19ed8Sdrh set v1 [sqlite3_column_int $STMT 0] 11310cf19ed8Sdrh sqlite3_finalize $STMT 11320cf19ed8Sdrh set v1 11330cf19ed8Sdrh} {12} 11340cf19ed8Sdrhdo_test capi3-15.6 { 11350cf19ed8Sdrh # 123456789 1234567 11360cf19ed8Sdrh set sql {SELECT 1234567890} 11370cf19ed8Sdrh set STMT [sqlite3_prepare $DB $sql 12 TAIL] 11380cf19ed8Sdrh sqlite3_step $STMT 11390cf19ed8Sdrh set v1 [sqlite3_column_int $STMT 0] 11400cf19ed8Sdrh sqlite3_finalize $STMT 11410cf19ed8Sdrh set v1 11420cf19ed8Sdrh} {12345} 11430cf19ed8Sdrhdo_test capi3-15.7 { 11440cf19ed8Sdrh # 123456789 1234567 11450cf19ed8Sdrh set sql {SELECT 12.34567890} 11460cf19ed8Sdrh set STMT [sqlite3_prepare $DB $sql 12 TAIL] 11470cf19ed8Sdrh sqlite3_step $STMT 11480cf19ed8Sdrh set v1 [sqlite3_column_double $STMT 0] 11490cf19ed8Sdrh sqlite3_finalize $STMT 11500cf19ed8Sdrh set v1 11510cf19ed8Sdrh} {12.34} 11520cf19ed8Sdrhdo_test capi3-15.8 { 11530cf19ed8Sdrh # 123456789 1234567 11540cf19ed8Sdrh set sql {SELECT 12.34567890} 11550cf19ed8Sdrh set STMT [sqlite3_prepare $DB $sql 14 TAIL] 11560cf19ed8Sdrh sqlite3_step $STMT 11570cf19ed8Sdrh set v1 [sqlite3_column_double $STMT 0] 11580cf19ed8Sdrh sqlite3_finalize $STMT 11590cf19ed8Sdrh set v1 11600cf19ed8Sdrh} {12.3456} 1161473d179dSdrh 1162e134ff1eSdrh# Make sure code is always generated even if an IF EXISTS or 1163e134ff1eSdrh# IF NOT EXISTS clause is present that the table does not or 1164e134ff1eSdrh# does exists. That way we will always have a prepared statement 1165e134ff1eSdrh# to expire when the schema changes. 1166e134ff1eSdrh# 1167e134ff1eSdrhdo_test capi3-16.1 { 1168e134ff1eSdrh set sql {DROP TABLE IF EXISTS t3} 1169e134ff1eSdrh set STMT [sqlite3_prepare $DB $sql -1 TAIL] 1170e134ff1eSdrh sqlite3_finalize $STMT 1171e134ff1eSdrh expr {$STMT!=""} 1172e134ff1eSdrh} {1} 1173e134ff1eSdrhdo_test capi3-16.2 { 1174e134ff1eSdrh set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} 1175e134ff1eSdrh set STMT [sqlite3_prepare $DB $sql -1 TAIL] 1176e134ff1eSdrh sqlite3_finalize $STMT 1177e134ff1eSdrh expr {$STMT!=""} 1178e134ff1eSdrh} {1} 1179e134ff1eSdrh 1180e134ff1eSdrh# But still we do not generate code if there is no SQL 1181e134ff1eSdrh# 1182e134ff1eSdrhdo_test capi3-16.3 { 1183e134ff1eSdrh set STMT [sqlite3_prepare $DB {} -1 TAIL] 1184e134ff1eSdrh sqlite3_finalize $STMT 1185e134ff1eSdrh expr {$STMT==""} 1186e134ff1eSdrh} {1} 1187e134ff1eSdrhdo_test capi3-16.4 { 1188e134ff1eSdrh set STMT [sqlite3_prepare $DB {;} -1 TAIL] 1189e134ff1eSdrh sqlite3_finalize $STMT 1190e134ff1eSdrh expr {$STMT==""} 1191e134ff1eSdrh} {1} 1192e134ff1eSdrh 1193b21f87ddSdrh# Ticket #2426: Misuse of sqlite3_column_* by calling it after 1194b21f87ddSdrh# a sqlite3_reset should be harmless. 1195b21f87ddSdrh# 1196b21f87ddSdrhdo_test capi3-17.1 { 1197b21f87ddSdrh set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 1198b21f87ddSdrh sqlite3_step $STMT 1199b21f87ddSdrh sqlite3_column_int $STMT 0 1200b21f87ddSdrh} {1} 1201b21f87ddSdrhdo_test capi3-17.2 { 1202b21f87ddSdrh sqlite3_reset $STMT 1203b21f87ddSdrh sqlite3_column_int $STMT 0 1204b21f87ddSdrh} {0} 1205b21f87ddSdrhdo_test capi3-17.3 { 1206b21f87ddSdrh sqlite3_finalize $STMT 1207b21f87ddSdrh} {SQLITE_OK} 1208e134ff1eSdrh 1209c4dd3fd2Sdrh# Verify that sqlite3_step() fails with an SQLITE_SCHEMA error 1210c4dd3fd2Sdrh# when the statement is prepared with sqlite3_prepare() (not 1211c4dd3fd2Sdrh# sqlite3_prepare_v2()) and the schema has changed. 1212c4dd3fd2Sdrh# 1213c4dd3fd2Sdrhdo_test capi3-18.1 { 1214c4dd3fd2Sdrh set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL] 1215c4dd3fd2Sdrh sqlite3 db2 test.db 1216c4dd3fd2Sdrh db2 eval {CREATE TABLE t3(x)} 1217c4dd3fd2Sdrh db2 close 1218c4dd3fd2Sdrh sqlite3_step $STMT 1219c4dd3fd2Sdrh} {SQLITE_ERROR} 1220c4dd3fd2Sdrhdo_test capi3-18.2 { 1221c4dd3fd2Sdrh sqlite3_reset $STMT 1222c4dd3fd2Sdrh sqlite3_errcode db 1223c4dd3fd2Sdrh} {SQLITE_SCHEMA} 1224c4dd3fd2Sdrhdo_test capi3-18.3 { 1225c4dd3fd2Sdrh sqlite3_errmsg db 1226c4dd3fd2Sdrh} {database schema has changed} 1227c4dd3fd2Sdrh# The error persist on retry when sqlite3_prepare() has been used. 1228c4dd3fd2Sdrhdo_test capi3-18.4 { 1229c4dd3fd2Sdrh sqlite3_step $STMT 1230c4dd3fd2Sdrh} {SQLITE_ERROR} 1231c4dd3fd2Sdrhdo_test capi3-18.5 { 1232c4dd3fd2Sdrh sqlite3_reset $STMT 1233c4dd3fd2Sdrh sqlite3_errcode db 1234c4dd3fd2Sdrh} {SQLITE_SCHEMA} 1235c4dd3fd2Sdrhdo_test capi3-18.6 { 1236c4dd3fd2Sdrh sqlite3_errmsg db 1237c4dd3fd2Sdrh} {database schema has changed} 1238c4dd3fd2Sdrhsqlite3_finalize $STMT 1239c4dd3fd2Sdrh 12404837f531Sdrh# Ticket #3134. Prepare a statement with an nBytes parameter of 0. 12414837f531Sdrh# Make sure this works correctly and does not reference memory out of 12424837f531Sdrh# range. 12434837f531Sdrh# 12444837f531Sdrhdo_test capi3-19.1 { 12454837f531Sdrh sqlite3_prepare_tkt3134 db 12464837f531Sdrh} {} 1247c4dd3fd2Sdrh 124814965665Sdan# Test that calling sqlite3_column_blob() on a TEXT value does not change 124914965665Sdan# the return type of subsequent calls to sqlite3_column_type(). 125014965665Sdan# 125114965665Sdando_execsql_test 20.1 { 125214965665Sdan CREATE TABLE t4(x); 125314965665Sdan INSERT INTO t4 VALUES('abcdefghij'); 125414965665Sdan} 125514965665Sdando_test 20.2 { 125614965665Sdan set stmt [sqlite3_prepare db "SELECT * FROM t4" -1 dummy] 125714965665Sdan sqlite3_step $stmt 125814965665Sdan} {SQLITE_ROW} 125914965665Sdando_test 20.3 { sqlite3_column_type $stmt 0 } {TEXT} 126014965665Sdando_test 20.4 { sqlite3_column_blob $stmt 0 } {abcdefghij} 126114965665Sdando_test 20.5 { sqlite3_column_type $stmt 0 } {TEXT} 126214965665Sdando_test 20.6 { sqlite3_finalize $stmt } SQLITE_OK 126314965665Sdan 126414965665Sdan 1265a2820970Sdrh# Tests of the interface when no VFS is registered. 1266a2820970Sdrh# 1267185eac95Sdanielk1977if {![info exists tester_do_binarylog]} { 1268a2820970Sdrh db close 1269a2820970Sdrh vfs_unregister_all 1270a2820970Sdrh do_test capi3-20.1 { 1271a2820970Sdrh sqlite3_sleep 100 1272a2820970Sdrh } {0} 1273a2820970Sdrh vfs_reregister_all 1274185eac95Sdanielk1977} 1275a2820970Sdrh 12766622cce3Sdanielk1977finish_test 1277