1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/capi3.test Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,1200 @@
1.4 +# 2003 January 29
1.5 +#
1.6 +# The author disclaims copyright to this source code. In place of
1.7 +# a legal notice, here is a blessing:
1.8 +#
1.9 +# May you do good and not evil.
1.10 +# May you find forgiveness for yourself and forgive others.
1.11 +# May you share freely, never taking more than you give.
1.12 +#
1.13 +#***********************************************************************
1.14 +# This file implements regression tests for SQLite library. The
1.15 +# focus of this script testing the callback-free C/C++ API.
1.16 +#
1.17 +# $Id: capi3.test,v 1.67 2008/07/12 15:55:55 danielk1977 Exp $
1.18 +#
1.19 +
1.20 +set testdir [file dirname $argv0]
1.21 +source $testdir/tester.tcl
1.22 +
1.23 +# Return the UTF-16 representation of the supplied UTF-8 string $str.
1.24 +# If $nt is true, append two 0x00 bytes as a nul terminator.
1.25 +proc utf16 {str {nt 1}} {
1.26 + set r [encoding convertto unicode $str]
1.27 + if {$nt} {
1.28 + append r "\x00\x00"
1.29 + }
1.30 + return $r
1.31 +}
1.32 +
1.33 +# Return the UTF-8 representation of the supplied UTF-16 string $str.
1.34 +proc utf8 {str} {
1.35 + # If $str ends in two 0x00 0x00 bytes, knock these off before
1.36 + # converting to UTF-8 using TCL.
1.37 + binary scan $str \c* vals
1.38 + if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
1.39 + set str [binary format \c* [lrange $vals 0 end-2]]
1.40 + }
1.41 +
1.42 + set r [encoding convertfrom unicode $str]
1.43 + return $r
1.44 +}
1.45 +
1.46 +# These tests complement those in capi2.test. They are organized
1.47 +# as follows:
1.48 +#
1.49 +# capi3-1.*: Test sqlite3_prepare
1.50 +# capi3-2.*: Test sqlite3_prepare16
1.51 +# capi3-3.*: Test sqlite3_open
1.52 +# capi3-4.*: Test sqlite3_open16
1.53 +# capi3-5.*: Test the various sqlite3_result_* APIs
1.54 +# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
1.55 +#
1.56 +
1.57 +set DB [sqlite3_connection_pointer db]
1.58 +
1.59 +do_test capi3-1.0 {
1.60 + sqlite3_get_autocommit $DB
1.61 +} 1
1.62 +do_test capi3-1.1 {
1.63 + set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
1.64 + sqlite3_finalize $STMT
1.65 + set TAIL
1.66 +} {}
1.67 +do_test capi3-1.2 {
1.68 + sqlite3_errcode $DB
1.69 +} {SQLITE_OK}
1.70 +do_test capi3-1.3 {
1.71 + sqlite3_errmsg $DB
1.72 +} {not an error}
1.73 +do_test capi3-1.4 {
1.74 + set sql {SELECT name FROM sqlite_master;SELECT 10}
1.75 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.76 + sqlite3_finalize $STMT
1.77 + set TAIL
1.78 +} {SELECT 10}
1.79 +do_test capi3-1.5 {
1.80 + set sql {SELECT name FROM sqlite_master;SELECT 10}
1.81 + set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL]
1.82 + sqlite3_finalize $STMT
1.83 + set TAIL
1.84 +} {SELECT 10}
1.85 +do_test capi3-1.6 {
1.86 + set sql {SELECT name FROM sqlite_master;SELECT 10}
1.87 + set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL]
1.88 + sqlite3_finalize $STMT
1.89 + set TAIL
1.90 +} {SELECT 10}
1.91 +
1.92 +do_test capi3-1.7 {
1.93 + set sql {SELECT namex FROM sqlite_master}
1.94 + catch {
1.95 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.96 + }
1.97 +} {1}
1.98 +do_test capi3-1.8 {
1.99 + sqlite3_errcode $DB
1.100 +} {SQLITE_ERROR}
1.101 +do_test capi3-1.9 {
1.102 + sqlite3_errmsg $DB
1.103 +} {no such column: namex}
1.104 +
1.105 +ifcapable {utf16} {
1.106 + do_test capi3-2.1 {
1.107 + set sql16 [utf16 {SELECT name FROM sqlite_master}]
1.108 + set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
1.109 + sqlite3_finalize $STMT
1.110 + utf8 $::TAIL
1.111 + } {}
1.112 + do_test capi3-2.2 {
1.113 + set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
1.114 + set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
1.115 + sqlite3_finalize $STMT
1.116 + utf8 $TAIL
1.117 + } {SELECT 10}
1.118 + do_test capi3-2.3 {
1.119 + set sql [utf16 {SELECT namex FROM sqlite_master}]
1.120 + catch {
1.121 + set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
1.122 + }
1.123 + } {1}
1.124 + do_test capi3-2.4 {
1.125 + sqlite3_errcode $DB
1.126 + } {SQLITE_ERROR}
1.127 + do_test capi3-2.5 {
1.128 + sqlite3_errmsg $DB
1.129 + } {no such column: namex}
1.130 +
1.131 + ifcapable schema_pragmas {
1.132 + do_test capi3-2.6 {
1.133 + execsql {CREATE TABLE tablename(x)}
1.134 + set sql16 [utf16 {PRAGMA table_info("TableName")}]
1.135 + set STMT [sqlite3_prepare16 $DB $sql16 -1 TAIL]
1.136 + sqlite3_step $STMT
1.137 + } SQLITE_ROW
1.138 + do_test capi3-2.7 {
1.139 + sqlite3_step $STMT
1.140 + } SQLITE_DONE
1.141 + do_test capi3-2.8 {
1.142 + sqlite3_finalize $STMT
1.143 + } SQLITE_OK
1.144 + }
1.145 +
1.146 +} ;# endif utf16
1.147 +
1.148 +# rename sqlite3_open sqlite3_open_old
1.149 +# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
1.150 +
1.151 +do_test capi3-3.1 {
1.152 + set db2 [sqlite3_open test.db {}]
1.153 + sqlite3_errcode $db2
1.154 +} {SQLITE_OK}
1.155 +# FIX ME: Should test the db handle works.
1.156 +do_test capi3-3.2 {
1.157 + sqlite3_close $db2
1.158 +} {SQLITE_OK}
1.159 +# Symbian OS: '/' in the file name replaced with '\\'
1.160 +do_test capi3-3.3 {
1.161 + catch {
1.162 + set db2 [sqlite3_open \\bogus\\path\\test.db {}]
1.163 + }
1.164 + sqlite3_errcode $db2
1.165 +} {SQLITE_CANTOPEN}
1.166 +do_test capi3-3.4 {
1.167 + sqlite3_errmsg $db2
1.168 +} {unable to open database file}
1.169 +do_test capi3-3.5 {
1.170 + sqlite3_close $db2
1.171 +} {SQLITE_OK}
1.172 +do_test capi3-3.6.1-misuse {
1.173 + sqlite3_close $db2
1.174 +} {SQLITE_MISUSE}
1.175 +do_test capi3-3.6.2-misuse {
1.176 + sqlite3_errmsg $db2
1.177 +} {library routine called out of sequence}
1.178 +ifcapable {utf16} {
1.179 + do_test capi3-3.6.3-misuse {
1.180 + utf8 [sqlite3_errmsg16 $db2]
1.181 + } {library routine called out of sequence}
1.182 +}
1.183 +
1.184 +do_test capi3-3.7 {
1.185 + set db2 [sqlite3_open]
1.186 + sqlite3_errcode $db2
1.187 +} {SQLITE_OK}
1.188 +do_test capi3-3.8 {
1.189 + sqlite3_close $db2
1.190 +} {SQLITE_OK}
1.191 +
1.192 +# rename sqlite3_open ""
1.193 +# rename sqlite3_open_old sqlite3_open
1.194 +
1.195 +ifcapable {utf16} {
1.196 +do_test capi3-4.1 {
1.197 + set db2 [sqlite3_open16 [utf16 test.db] {}]
1.198 + sqlite3_errcode $db2
1.199 +} {SQLITE_OK}
1.200 +# FIX ME: Should test the db handle works.
1.201 +do_test capi3-4.2 {
1.202 + sqlite3_close $db2
1.203 +} {SQLITE_OK}
1.204 +# Symbian OS: '/' in the file name replaced with '\\'
1.205 +do_test capi3-4.3 {
1.206 + catch {
1.207 + set db2 [sqlite3_open16 [utf16 \\bogus\\path\\test.db] {}]
1.208 + }
1.209 + sqlite3_errcode $db2
1.210 +} {SQLITE_CANTOPEN}
1.211 +do_test capi3-4.4 {
1.212 + utf8 [sqlite3_errmsg16 $db2]
1.213 +} {unable to open database file}
1.214 +do_test capi3-4.5 {
1.215 + sqlite3_close $db2
1.216 +} {SQLITE_OK}
1.217 +} ;# utf16
1.218 +
1.219 +# This proc is used to test the following API calls:
1.220 +#
1.221 +# sqlite3_column_count
1.222 +# sqlite3_column_name
1.223 +# sqlite3_column_name16
1.224 +# sqlite3_column_decltype
1.225 +# sqlite3_column_decltype16
1.226 +#
1.227 +# $STMT is a compiled SQL statement. $test is a prefix
1.228 +# to use for test names within this proc. $names is a list
1.229 +# of the column names that should be returned by $STMT.
1.230 +# $decltypes is a list of column declaration types for $STMT.
1.231 +#
1.232 +# Example:
1.233 +#
1.234 +# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
1.235 +# check_header test1.1 {1 2 3} {"" "" ""}
1.236 +#
1.237 +proc check_header {STMT test names decltypes} {
1.238 +
1.239 + # Use the return value of sqlite3_column_count() to build
1.240 + # a list of column indexes. i.e. If sqlite3_column_count
1.241 + # is 3, build the list {0 1 2}.
1.242 + set ::idxlist [list]
1.243 + set ::numcols [sqlite3_column_count $STMT]
1.244 + for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
1.245 +
1.246 + # Column names in UTF-8
1.247 + do_test $test.1 {
1.248 + set cnamelist [list]
1.249 + foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
1.250 + set cnamelist
1.251 + } $names
1.252 +
1.253 + # Column names in UTF-16
1.254 + ifcapable {utf16} {
1.255 + do_test $test.2 {
1.256 + set cnamelist [list]
1.257 + foreach i $idxlist {
1.258 + lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
1.259 + }
1.260 + set cnamelist
1.261 + } $names
1.262 + }
1.263 +
1.264 + # Column names in UTF-8
1.265 + do_test $test.3 {
1.266 + set cnamelist [list]
1.267 + foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
1.268 + set cnamelist
1.269 + } $names
1.270 +
1.271 + # Column names in UTF-16
1.272 + ifcapable {utf16} {
1.273 + do_test $test.4 {
1.274 + set cnamelist [list]
1.275 + foreach i $idxlist {
1.276 + lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
1.277 + }
1.278 + set cnamelist
1.279 + } $names
1.280 + }
1.281 +
1.282 + # Column names in UTF-8
1.283 + do_test $test.5 {
1.284 + set cnamelist [list]
1.285 + foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]}
1.286 + set cnamelist
1.287 + } $decltypes
1.288 +
1.289 + # Column declaration types in UTF-16
1.290 + ifcapable {utf16} {
1.291 + do_test $test.6 {
1.292 + set cnamelist [list]
1.293 + foreach i $idxlist {
1.294 + lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
1.295 + }
1.296 + set cnamelist
1.297 + } $decltypes
1.298 + }
1.299 +
1.300 +
1.301 + # Test some out of range conditions:
1.302 + ifcapable {utf16} {
1.303 + do_test $test.7 {
1.304 + list \
1.305 + [sqlite3_column_name $STMT -1] \
1.306 + [sqlite3_column_name16 $STMT -1] \
1.307 + [sqlite3_column_decltype $STMT -1] \
1.308 + [sqlite3_column_decltype16 $STMT -1] \
1.309 + [sqlite3_column_name $STMT $numcols] \
1.310 + [sqlite3_column_name16 $STMT $numcols] \
1.311 + [sqlite3_column_decltype $STMT $numcols] \
1.312 + [sqlite3_column_decltype16 $STMT $numcols]
1.313 + } {{} {} {} {} {} {} {} {}}
1.314 + }
1.315 +}
1.316 +
1.317 +# This proc is used to test the following API calls:
1.318 +#
1.319 +# sqlite3_column_origin_name
1.320 +# sqlite3_column_origin_name16
1.321 +# sqlite3_column_table_name
1.322 +# sqlite3_column_table_name16
1.323 +# sqlite3_column_database_name
1.324 +# sqlite3_column_database_name16
1.325 +#
1.326 +# $STMT is a compiled SQL statement. $test is a prefix
1.327 +# to use for test names within this proc. $names is a list
1.328 +# of the column names that should be returned by $STMT.
1.329 +# $decltypes is a list of column declaration types for $STMT.
1.330 +#
1.331 +# Example:
1.332 +#
1.333 +# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
1.334 +# check_header test1.1 {1 2 3} {"" "" ""}
1.335 +#
1.336 +proc check_origin_header {STMT test dbs tables cols} {
1.337 + # If sqlite3_column_origin_name() and friends are not compiled into
1.338 + # this build, this proc is a no-op.
1.339 + ifcapable columnmetadata {
1.340 + # Use the return value of sqlite3_column_count() to build
1.341 + # a list of column indexes. i.e. If sqlite3_column_count
1.342 + # is 3, build the list {0 1 2}.
1.343 + set ::idxlist [list]
1.344 + set ::numcols [sqlite3_column_count $STMT]
1.345 + for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
1.346 +
1.347 + # Database names in UTF-8
1.348 + do_test $test.8 {
1.349 + set cnamelist [list]
1.350 + foreach i $idxlist {
1.351 + lappend cnamelist [sqlite3_column_database_name $STMT $i]
1.352 + }
1.353 + set cnamelist
1.354 + } $dbs
1.355 +
1.356 + # Database names in UTF-16
1.357 + ifcapable {utf16} {
1.358 + do_test $test.9 {
1.359 + set cnamelist [list]
1.360 + foreach i $idxlist {
1.361 + lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]]
1.362 + }
1.363 + set cnamelist
1.364 + } $dbs
1.365 + }
1.366 +
1.367 + # Table names in UTF-8
1.368 + do_test $test.10 {
1.369 + set cnamelist [list]
1.370 + foreach i $idxlist {
1.371 + lappend cnamelist [sqlite3_column_table_name $STMT $i]
1.372 + }
1.373 + set cnamelist
1.374 + } $tables
1.375 +
1.376 + # Table names in UTF-16
1.377 + ifcapable {utf16} {
1.378 + do_test $test.11 {
1.379 + set cnamelist [list]
1.380 + foreach i $idxlist {
1.381 + lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]]
1.382 + }
1.383 + set cnamelist
1.384 + } $tables
1.385 + }
1.386 +
1.387 + # Origin names in UTF-8
1.388 + do_test $test.12 {
1.389 + set cnamelist [list]
1.390 + foreach i $idxlist {
1.391 + lappend cnamelist [sqlite3_column_origin_name $STMT $i]
1.392 + }
1.393 + set cnamelist
1.394 + } $cols
1.395 +
1.396 + # Origin declaration types in UTF-16
1.397 + ifcapable {utf16} {
1.398 + do_test $test.13 {
1.399 + set cnamelist [list]
1.400 + foreach i $idxlist {
1.401 + lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]]
1.402 + }
1.403 + set cnamelist
1.404 + } $cols
1.405 + }
1.406 + }
1.407 +}
1.408 +
1.409 +# This proc is used to test the following APIs:
1.410 +#
1.411 +# sqlite3_data_count
1.412 +# sqlite3_column_type
1.413 +# sqlite3_column_int
1.414 +# sqlite3_column_text
1.415 +# sqlite3_column_text16
1.416 +# sqlite3_column_double
1.417 +#
1.418 +# $STMT is a compiled SQL statement for which the previous call
1.419 +# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use
1.420 +# for test names within this proc. $types is a list of the
1.421 +# manifest types for the current row. $ints, $doubles and $strings
1.422 +# are lists of the integer, real and string representations of
1.423 +# the values in the current row.
1.424 +#
1.425 +# Example:
1.426 +#
1.427 +# set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
1.428 +# sqlite3_step $STMT
1.429 +# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
1.430 +#
1.431 +proc check_data {STMT test types ints doubles strings} {
1.432 +
1.433 + # Use the return value of sqlite3_column_count() to build
1.434 + # a list of column indexes. i.e. If sqlite3_column_count
1.435 + # is 3, build the list {0 1 2}.
1.436 + set ::idxlist [list]
1.437 + set numcols [sqlite3_data_count $STMT]
1.438 + for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
1.439 +
1.440 +# types
1.441 +do_test $test.1 {
1.442 + set types [list]
1.443 + foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
1.444 + set types
1.445 +} $types
1.446 +
1.447 +# Integers
1.448 +do_test $test.2 {
1.449 + set ints [list]
1.450 + foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
1.451 + set ints
1.452 +} $ints
1.453 +
1.454 +# bytes
1.455 +set lens [list]
1.456 +foreach i $::idxlist {
1.457 + lappend lens [string length [lindex $strings $i]]
1.458 +}
1.459 +do_test $test.3 {
1.460 + set bytes [list]
1.461 + set lens [list]
1.462 + foreach i $idxlist {
1.463 + lappend bytes [sqlite3_column_bytes $STMT $i]
1.464 + }
1.465 + set bytes
1.466 +} $lens
1.467 +
1.468 +# bytes16
1.469 +ifcapable {utf16} {
1.470 + set lens [list]
1.471 + foreach i $::idxlist {
1.472 + lappend lens [expr 2 * [string length [lindex $strings $i]]]
1.473 + }
1.474 + do_test $test.4 {
1.475 + set bytes [list]
1.476 + set lens [list]
1.477 + foreach i $idxlist {
1.478 + lappend bytes [sqlite3_column_bytes16 $STMT $i]
1.479 + }
1.480 + set bytes
1.481 + } $lens
1.482 +}
1.483 +
1.484 +# Blob
1.485 +do_test $test.5 {
1.486 + set utf8 [list]
1.487 + foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
1.488 + set utf8
1.489 +} $strings
1.490 +
1.491 +# UTF-8
1.492 +do_test $test.6 {
1.493 + set utf8 [list]
1.494 + foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
1.495 + set utf8
1.496 +} $strings
1.497 +
1.498 +# Floats
1.499 +do_test $test.7 {
1.500 + set utf8 [list]
1.501 + foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
1.502 + set utf8
1.503 +} $doubles
1.504 +
1.505 +# UTF-16
1.506 +ifcapable {utf16} {
1.507 + do_test $test.8 {
1.508 + set utf8 [list]
1.509 + foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
1.510 + set utf8
1.511 + } $strings
1.512 +}
1.513 +
1.514 +# Integers
1.515 +do_test $test.9 {
1.516 + set ints [list]
1.517 + foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
1.518 + set ints
1.519 +} $ints
1.520 +
1.521 +# Floats
1.522 +do_test $test.10 {
1.523 + set utf8 [list]
1.524 + foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
1.525 + set utf8
1.526 +} $doubles
1.527 +
1.528 +# UTF-8
1.529 +do_test $test.11 {
1.530 + set utf8 [list]
1.531 + foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
1.532 + set utf8
1.533 +} $strings
1.534 +
1.535 +# Types
1.536 +do_test $test.12 {
1.537 + set types [list]
1.538 + foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
1.539 + set types
1.540 +} $types
1.541 +
1.542 +# Test that an out of range request returns the equivalent of NULL
1.543 +do_test $test.13 {
1.544 + sqlite3_column_int $STMT -1
1.545 +} {0}
1.546 +do_test $test.13 {
1.547 + sqlite3_column_text $STMT -1
1.548 +} {}
1.549 +
1.550 +}
1.551 +
1.552 +ifcapable !floatingpoint {
1.553 + finish_test
1.554 + return
1.555 +}
1.556 +
1.557 +do_test capi3-5.0 {
1.558 + execsql {
1.559 + CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
1.560 + INSERT INTO t1 VALUES(1, 2, 3);
1.561 + INSERT INTO t1 VALUES('one', 'two', NULL);
1.562 + INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
1.563 + }
1.564 + set sql "SELECT * FROM t1"
1.565 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.566 + sqlite3_column_count $STMT
1.567 +} 3
1.568 +
1.569 +check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
1.570 +check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c}
1.571 +do_test capi3-5.2 {
1.572 + sqlite3_step $STMT
1.573 +} SQLITE_ROW
1.574 +
1.575 +check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
1.576 +check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c}
1.577 +check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
1.578 +
1.579 +do_test capi3-5.5 {
1.580 + sqlite3_step $STMT
1.581 +} SQLITE_ROW
1.582 +
1.583 +check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
1.584 +check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c}
1.585 +check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
1.586 +
1.587 +do_test capi3-5.8 {
1.588 + sqlite3_step $STMT
1.589 +} SQLITE_ROW
1.590 +
1.591 +check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
1.592 +check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c}
1.593 +check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
1.594 +
1.595 +do_test capi3-5.11 {
1.596 + sqlite3_step $STMT
1.597 +} SQLITE_DONE
1.598 +
1.599 +do_test capi3-5.12 {
1.600 + sqlite3_finalize $STMT
1.601 +} SQLITE_OK
1.602 +
1.603 +do_test capi3-5.20 {
1.604 + set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a"
1.605 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.606 + sqlite3_column_count $STMT
1.607 +} 3
1.608 +
1.609 +check_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}}
1.610 +check_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}}
1.611 +do_test capi3-5.23 {
1.612 + sqlite3_finalize $STMT
1.613 +} SQLITE_OK
1.614 +
1.615 +do_test capi3-5.30 {
1.616 + set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x"
1.617 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.618 + sqlite3_column_count $STMT
1.619 +} 3
1.620 +
1.621 +check_header $STMT capi3-5.31 {x y z} {VARINT {} {}}
1.622 +check_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}}
1.623 +do_test capi3-5.33 {
1.624 + sqlite3_finalize $STMT
1.625 +} SQLITE_OK
1.626 +
1.627 +
1.628 +set ::ENC [execsql {pragma encoding}]
1.629 +db close
1.630 +
1.631 +do_test capi3-6.0 {
1.632 + sqlite3 db test.db
1.633 + set DB [sqlite3_connection_pointer db]
1.634 + sqlite3_key $DB xyzzy
1.635 + set sql {SELECT a FROM t1 order by rowid}
1.636 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.637 + expr 0
1.638 +} {0}
1.639 +do_test capi3-6.1 {
1.640 + db cache flush
1.641 + sqlite3_close $DB
1.642 +} {SQLITE_BUSY}
1.643 +do_test capi3-6.2 {
1.644 + sqlite3_step $STMT
1.645 +} {SQLITE_ROW}
1.646 +check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
1.647 +do_test capi3-6.3 {
1.648 + sqlite3_finalize $STMT
1.649 +} {SQLITE_OK}
1.650 +do_test capi3-6.4-misuse {
1.651 + db cache flush
1.652 + sqlite3_close $DB
1.653 +} {SQLITE_OK}
1.654 +db close
1.655 +
1.656 +# This procedure sets the value of the file-format in file 'test.db'
1.657 +# to $newval. Also, the schema cookie is incremented.
1.658 +#
1.659 +proc set_file_format {newval} {
1.660 + hexio_write test.db 44 [hexio_render_int32 $newval]
1.661 + set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
1.662 + incr schemacookie
1.663 + hexio_write test.db 40 [hexio_render_int32 $schemacookie]
1.664 + return {}
1.665 +}
1.666 +
1.667 +# This procedure returns the value of the file-format in file 'test.db'.
1.668 +#
1.669 +proc get_file_format {{fname test.db}} {
1.670 + return [hexio_get_int [hexio_read $fname 44 4]]
1.671 +}
1.672 +
1.673 +if {![sqlite3 -has-codec]} {
1.674 + # Test what happens when the library encounters a newer file format.
1.675 + do_test capi3-7.1 {
1.676 + set_file_format 5
1.677 + } {}
1.678 + do_test capi3-7.2 {
1.679 + sqlite3 db test.db
1.680 + catchsql {
1.681 + SELECT * FROM sqlite_master;
1.682 + }
1.683 + } {1 {unsupported file format}}
1.684 + db close
1.685 +}
1.686 +
1.687 +if {![sqlite3 -has-codec]} {
1.688 + # Now test that the library correctly handles bogus entries in the
1.689 + # sqlite_master table (schema corruption).
1.690 + do_test capi3-8.1 {
1.691 + file delete -force test.db test.db-journal
1.692 + sqlite3 db test.db
1.693 + execsql {
1.694 + CREATE TABLE t1(a);
1.695 + }
1.696 + db close
1.697 + } {}
1.698 + do_test capi3-8.2 {
1.699 + sqlite3 db test.db
1.700 + execsql {
1.701 + PRAGMA writable_schema=ON;
1.702 + INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
1.703 + }
1.704 + db close
1.705 + } {}
1.706 + do_test capi3-8.3 {
1.707 + sqlite3 db test.db
1.708 + catchsql {
1.709 + SELECT * FROM sqlite_master;
1.710 + }
1.711 + } {1 {malformed database schema (?)}}
1.712 + do_test capi3-8.4 {
1.713 + # Build a 5-field row record. The first field is a string 'table', and
1.714 + # subsequent fields are all NULL.
1.715 + db close
1.716 + file delete -force test.db test.db-journal
1.717 + sqlite3 db test.db
1.718 + execsql {
1.719 + CREATE TABLE t1(a);
1.720 + PRAGMA writable_schema=ON;
1.721 + INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL);
1.722 + }
1.723 + db close
1.724 + } {};
1.725 + do_test capi3-8.5 {
1.726 + sqlite3 db test.db
1.727 + catchsql {
1.728 + SELECT * FROM sqlite_master;
1.729 + }
1.730 + } {1 {malformed database schema (?)}}
1.731 + db close
1.732 +}
1.733 +file delete -force test.db
1.734 +file delete -force test.db-journal
1.735 +
1.736 +
1.737 +# Test the english language string equivalents for sqlite error codes
1.738 +set code2english [list \
1.739 +SQLITE_OK {not an error} \
1.740 +SQLITE_ERROR {SQL logic error or missing database} \
1.741 +SQLITE_PERM {access permission denied} \
1.742 +SQLITE_ABORT {callback requested query abort} \
1.743 +SQLITE_BUSY {database is locked} \
1.744 +SQLITE_LOCKED {database table is locked} \
1.745 +SQLITE_NOMEM {out of memory} \
1.746 +SQLITE_READONLY {attempt to write a readonly database} \
1.747 +SQLITE_INTERRUPT {interrupted} \
1.748 +SQLITE_IOERR {disk I/O error} \
1.749 +SQLITE_CORRUPT {database disk image is malformed} \
1.750 +SQLITE_FULL {database or disk is full} \
1.751 +SQLITE_CANTOPEN {unable to open database file} \
1.752 +SQLITE_EMPTY {table contains no data} \
1.753 +SQLITE_SCHEMA {database schema has changed} \
1.754 +SQLITE_CONSTRAINT {constraint failed} \
1.755 +SQLITE_MISMATCH {datatype mismatch} \
1.756 +SQLITE_MISUSE {library routine called out of sequence} \
1.757 +SQLITE_NOLFS {large file support is disabled} \
1.758 +SQLITE_AUTH {authorization denied} \
1.759 +SQLITE_FORMAT {auxiliary database format error} \
1.760 +SQLITE_RANGE {bind or column index out of range} \
1.761 +SQLITE_NOTADB {file is encrypted or is not a database} \
1.762 +unknownerror {unknown error} \
1.763 +]
1.764 +
1.765 +set test_number 1
1.766 +foreach {code english} $code2english {
1.767 + do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
1.768 + incr test_number
1.769 +}
1.770 +
1.771 +# Test the error message when a "real" out of memory occurs.
1.772 +ifcapable memdebug {
1.773 + do_test capi3-10-1 {
1.774 + sqlite3 db test.db
1.775 + set DB [sqlite3_connection_pointer db]
1.776 + sqlite3_memdebug_fail 1
1.777 + catchsql {
1.778 + select * from sqlite_master;
1.779 + }
1.780 + } {1 {out of memory}}
1.781 + do_test capi3-10-2 {
1.782 + sqlite3_errmsg $::DB
1.783 + } {out of memory}
1.784 + ifcapable {utf16} {
1.785 + do_test capi3-10-3 {
1.786 + utf8 [sqlite3_errmsg16 $::DB]
1.787 + } {out of memory}
1.788 + }
1.789 + db close
1.790 + sqlite3_memdebug_fail -1
1.791 + do_test capi3-10-4 {
1.792 + sqlite3 db test.db
1.793 + set DB [sqlite3_connection_pointer db]
1.794 + sqlite3_memdebug_fail 1
1.795 + catchsql {
1.796 + select * from sqlite_master where rowid>5;
1.797 + }
1.798 + } {1 {out of memory}}
1.799 + do_test capi3-10-5 {
1.800 + sqlite3_errmsg $::DB
1.801 + } {out of memory}
1.802 + ifcapable {utf16} {
1.803 + do_test capi3-10-6 {
1.804 + utf8 [sqlite3_errmsg16 $::DB]
1.805 + } {out of memory}
1.806 + }
1.807 + db close
1.808 + sqlite3_memdebug_fail -1
1.809 +}
1.810 +
1.811 +# The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
1.812 +# statement issued while there are still outstanding VMs that are part of
1.813 +# the transaction fails.
1.814 +sqlite3 db test.db
1.815 +set DB [sqlite3_connection_pointer db]
1.816 +sqlite_register_test_function $DB func
1.817 +do_test capi3-11.1 {
1.818 + execsql {
1.819 + BEGIN;
1.820 + CREATE TABLE t1(a, b);
1.821 + INSERT INTO t1 VALUES(1, 'int');
1.822 + INSERT INTO t1 VALUES(2, 'notatype');
1.823 + }
1.824 +} {}
1.825 +do_test capi3-11.1.1 {
1.826 + sqlite3_get_autocommit $DB
1.827 +} 0
1.828 +do_test capi3-11.2 {
1.829 + set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
1.830 + sqlite3_step $STMT
1.831 +} {SQLITE_ROW}
1.832 +do_test capi3-11.3 {
1.833 + catchsql {
1.834 + COMMIT;
1.835 + }
1.836 +} {1 {cannot commit transaction - SQL statements in progress}}
1.837 +do_test capi3-11.3.1 {
1.838 + sqlite3_get_autocommit $DB
1.839 +} 0
1.840 +do_test capi3-11.4 {
1.841 + sqlite3_step $STMT
1.842 +} {SQLITE_ERROR}
1.843 +do_test capi3-11.5 {
1.844 + sqlite3_finalize $STMT
1.845 +} {SQLITE_ERROR}
1.846 +do_test capi3-11.6 {
1.847 + catchsql {
1.848 + SELECT * FROM t1;
1.849 + }
1.850 +} {0 {1 int 2 notatype}}
1.851 +do_test capi3-11.6.1 {
1.852 + sqlite3_get_autocommit $DB
1.853 +} 0
1.854 +do_test capi3-11.7 {
1.855 + catchsql {
1.856 + COMMIT;
1.857 + }
1.858 +} {0 {}}
1.859 +do_test capi3-11.7.1 {
1.860 + sqlite3_get_autocommit $DB
1.861 +} 1
1.862 +do_test capi3-11.8 {
1.863 + execsql {
1.864 + CREATE TABLE t2(a);
1.865 + INSERT INTO t2 VALUES(1);
1.866 + INSERT INTO t2 VALUES(2);
1.867 + BEGIN;
1.868 + INSERT INTO t2 VALUES(3);
1.869 + }
1.870 +} {}
1.871 +do_test capi3-11.8.1 {
1.872 + sqlite3_get_autocommit $DB
1.873 +} 0
1.874 +do_test capi3-11.9 {
1.875 + set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
1.876 + sqlite3_step $STMT
1.877 +} {SQLITE_ROW}
1.878 +do_test capi3-11.9.1 {
1.879 + sqlite3_get_autocommit $DB
1.880 +} 0
1.881 +do_test capi3-11.9.2 {
1.882 + catchsql {
1.883 + ROLLBACK;
1.884 + }
1.885 +} {1 {cannot rollback transaction - SQL statements in progress}}
1.886 +do_test capi3-11.9.3 {
1.887 + sqlite3_get_autocommit $DB
1.888 +} 0
1.889 +do_test capi3-11.10 {
1.890 + sqlite3_step $STMT
1.891 +} {SQLITE_ROW}
1.892 +do_test capi3-11.11 {
1.893 + sqlite3_step $STMT
1.894 +} {SQLITE_ROW}
1.895 +do_test capi3-11.12 {
1.896 + sqlite3_step $STMT
1.897 +} {SQLITE_DONE}
1.898 +do_test capi3-11.13 {
1.899 + sqlite3_finalize $STMT
1.900 +} {SQLITE_OK}
1.901 +do_test capi3-11.14 {
1.902 + execsql {
1.903 + SELECT a FROM t2;
1.904 + }
1.905 +} {1 2 3}
1.906 +do_test capi3-11.14.1 {
1.907 + sqlite3_get_autocommit $DB
1.908 +} 0
1.909 +do_test capi3-11.15 {
1.910 + catchsql {
1.911 + ROLLBACK;
1.912 + }
1.913 +} {0 {}}
1.914 +do_test capi3-11.15.1 {
1.915 + sqlite3_get_autocommit $DB
1.916 +} 1
1.917 +do_test capi3-11.16 {
1.918 + execsql {
1.919 + SELECT a FROM t2;
1.920 + }
1.921 +} {1 2}
1.922 +
1.923 +# Sanity check on the definition of 'outstanding VM'. This means any VM
1.924 +# that has had sqlite3_step() called more recently than sqlite3_finalize() or
1.925 +# sqlite3_reset(). So a VM that has just been prepared or reset does not
1.926 +# count as an active VM.
1.927 +do_test capi3-11.17 {
1.928 + execsql {
1.929 + BEGIN;
1.930 + }
1.931 +} {}
1.932 +do_test capi3-11.18 {
1.933 + set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
1.934 + catchsql {
1.935 + COMMIT;
1.936 + }
1.937 +} {0 {}}
1.938 +do_test capi3-11.19 {
1.939 + sqlite3_step $STMT
1.940 +} {SQLITE_ROW}
1.941 +do_test capi3-11.20 {
1.942 + catchsql {
1.943 + BEGIN;
1.944 + COMMIT;
1.945 + }
1.946 +} {1 {cannot commit transaction - SQL statements in progress}}
1.947 +do_test capi3-11.20 {
1.948 + sqlite3_reset $STMT
1.949 + catchsql {
1.950 + COMMIT;
1.951 + }
1.952 +} {0 {}}
1.953 +do_test capi3-11.21 {
1.954 + sqlite3_finalize $STMT
1.955 +} {SQLITE_OK}
1.956 +
1.957 +# The following tests - capi3-12.* - check that its Ok to start a
1.958 +# transaction while other VMs are active, and that its Ok to execute
1.959 +# atomic updates in the same situation
1.960 +#
1.961 +do_test capi3-12.1 {
1.962 + set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
1.963 + sqlite3_step $STMT
1.964 +} {SQLITE_ROW}
1.965 +do_test capi3-12.2 {
1.966 + catchsql {
1.967 + INSERT INTO t1 VALUES(3, NULL);
1.968 + }
1.969 +} {0 {}}
1.970 +do_test capi3-12.3 {
1.971 + catchsql {
1.972 + INSERT INTO t2 VALUES(4);
1.973 + }
1.974 +} {0 {}}
1.975 +do_test capi3-12.4 {
1.976 + catchsql {
1.977 + BEGIN;
1.978 + INSERT INTO t1 VALUES(4, NULL);
1.979 + }
1.980 +} {0 {}}
1.981 +do_test capi3-12.5 {
1.982 + sqlite3_step $STMT
1.983 +} {SQLITE_ROW}
1.984 +do_test capi3-12.5.1 {
1.985 + sqlite3_step $STMT
1.986 +} {SQLITE_ROW}
1.987 +do_test capi3-12.6 {
1.988 + sqlite3_step $STMT
1.989 +} {SQLITE_DONE}
1.990 +do_test capi3-12.7 {
1.991 + sqlite3_finalize $STMT
1.992 +} {SQLITE_OK}
1.993 +do_test capi3-12.8 {
1.994 + execsql {
1.995 + COMMIT;
1.996 + SELECT a FROM t1;
1.997 + }
1.998 +} {1 2 3 4}
1.999 +
1.1000 +# Test cases capi3-13.* test the sqlite3_clear_bindings() and
1.1001 +# sqlite3_sleep APIs.
1.1002 +#
1.1003 +if {[llength [info commands sqlite3_clear_bindings]]>0} {
1.1004 + do_test capi3-13.1 {
1.1005 + execsql {
1.1006 + DELETE FROM t1;
1.1007 + }
1.1008 + set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
1.1009 + sqlite3_step $STMT
1.1010 + } {SQLITE_DONE}
1.1011 + do_test capi3-13.2 {
1.1012 + sqlite3_reset $STMT
1.1013 + sqlite3_bind_text $STMT 1 hello 5
1.1014 + sqlite3_bind_text $STMT 2 world 5
1.1015 + sqlite3_step $STMT
1.1016 + } {SQLITE_DONE}
1.1017 + do_test capi3-13.3 {
1.1018 + sqlite3_reset $STMT
1.1019 + sqlite3_clear_bindings $STMT
1.1020 + sqlite3_step $STMT
1.1021 + } {SQLITE_DONE}
1.1022 + do_test capi3-13-4 {
1.1023 + sqlite3_finalize $STMT
1.1024 + execsql {
1.1025 + SELECT * FROM t1;
1.1026 + }
1.1027 + } {{} {} hello world {} {}}
1.1028 +}
1.1029 +if {[llength [info commands sqlite3_sleep]]>0} {
1.1030 + do_test capi3-13-5 {
1.1031 + set ms [sqlite3_sleep 80]
1.1032 + expr {$ms==80 || $ms==1000}
1.1033 + } {1}
1.1034 +}
1.1035 +
1.1036 +# Ticket #1219: Make sure binding APIs can handle a NULL pointer.
1.1037 +#
1.1038 +do_test capi3-14.1-misuse {
1.1039 + set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
1.1040 + lappend rc $msg
1.1041 +} {1 SQLITE_MISUSE}
1.1042 +
1.1043 +# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare.
1.1044 +#
1.1045 +do_test capi3-15.1 {
1.1046 + set sql {SELECT * FROM t2}
1.1047 + set nbytes [string length $sql]
1.1048 + append sql { WHERE a==1}
1.1049 + set STMT [sqlite3_prepare $DB $sql $nbytes TAIL]
1.1050 + sqlite3_step $STMT
1.1051 + sqlite3_column_int $STMT 0
1.1052 +} {1}
1.1053 +do_test capi3-15.2 {
1.1054 + sqlite3_step $STMT
1.1055 + sqlite3_column_int $STMT 0
1.1056 +} {2}
1.1057 +do_test capi3-15.3 {
1.1058 + sqlite3_finalize $STMT
1.1059 +} {SQLITE_OK}
1.1060 +do_test capi3-15.4 {
1.1061 + # 123456789 1234567
1.1062 + set sql {SELECT 1234567890}
1.1063 + set STMT [sqlite3_prepare $DB $sql 8 TAIL]
1.1064 + sqlite3_step $STMT
1.1065 + set v1 [sqlite3_column_int $STMT 0]
1.1066 + sqlite3_finalize $STMT
1.1067 + set v1
1.1068 +} {1}
1.1069 +do_test capi3-15.5 {
1.1070 + # 123456789 1234567
1.1071 + set sql {SELECT 1234567890}
1.1072 + set STMT [sqlite3_prepare $DB $sql 9 TAIL]
1.1073 + sqlite3_step $STMT
1.1074 + set v1 [sqlite3_column_int $STMT 0]
1.1075 + sqlite3_finalize $STMT
1.1076 + set v1
1.1077 +} {12}
1.1078 +do_test capi3-15.6 {
1.1079 + # 123456789 1234567
1.1080 + set sql {SELECT 1234567890}
1.1081 + set STMT [sqlite3_prepare $DB $sql 12 TAIL]
1.1082 + sqlite3_step $STMT
1.1083 + set v1 [sqlite3_column_int $STMT 0]
1.1084 + sqlite3_finalize $STMT
1.1085 + set v1
1.1086 +} {12345}
1.1087 +do_test capi3-15.7 {
1.1088 + # 123456789 1234567
1.1089 + set sql {SELECT 12.34567890}
1.1090 + set STMT [sqlite3_prepare $DB $sql 12 TAIL]
1.1091 + sqlite3_step $STMT
1.1092 + set v1 [sqlite3_column_double $STMT 0]
1.1093 + sqlite3_finalize $STMT
1.1094 + set v1
1.1095 +} {12.34}
1.1096 +do_test capi3-15.8 {
1.1097 + # 123456789 1234567
1.1098 + set sql {SELECT 12.34567890}
1.1099 + set STMT [sqlite3_prepare $DB $sql 14 TAIL]
1.1100 + sqlite3_step $STMT
1.1101 + set v1 [sqlite3_column_double $STMT 0]
1.1102 + sqlite3_finalize $STMT
1.1103 + set v1
1.1104 +} {12.3456}
1.1105 +
1.1106 +# Make sure code is always generated even if an IF EXISTS or
1.1107 +# IF NOT EXISTS clause is present that the table does not or
1.1108 +# does exists. That way we will always have a prepared statement
1.1109 +# to expire when the schema changes.
1.1110 +#
1.1111 +do_test capi3-16.1 {
1.1112 + set sql {DROP TABLE IF EXISTS t3}
1.1113 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.1114 + sqlite3_finalize $STMT
1.1115 + expr {$STMT!=""}
1.1116 +} {1}
1.1117 +do_test capi3-16.2 {
1.1118 + set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
1.1119 + set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1.1120 + sqlite3_finalize $STMT
1.1121 + expr {$STMT!=""}
1.1122 +} {1}
1.1123 +
1.1124 +# But still we do not generate code if there is no SQL
1.1125 +#
1.1126 +do_test capi3-16.3 {
1.1127 + set STMT [sqlite3_prepare $DB {} -1 TAIL]
1.1128 + sqlite3_finalize $STMT
1.1129 + expr {$STMT==""}
1.1130 +} {1}
1.1131 +do_test capi3-16.4 {
1.1132 + set STMT [sqlite3_prepare $DB {;} -1 TAIL]
1.1133 + sqlite3_finalize $STMT
1.1134 + expr {$STMT==""}
1.1135 +} {1}
1.1136 +
1.1137 +# Ticket #2426: Misuse of sqlite3_column_* by calling it after
1.1138 +# a sqlite3_reset should be harmless.
1.1139 +#
1.1140 +do_test capi3-17.1 {
1.1141 + set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
1.1142 + sqlite3_step $STMT
1.1143 + sqlite3_column_int $STMT 0
1.1144 +} {1}
1.1145 +do_test capi3-17.2 {
1.1146 + sqlite3_reset $STMT
1.1147 + sqlite3_column_int $STMT 0
1.1148 +} {0}
1.1149 +do_test capi3-17.3 {
1.1150 + sqlite3_finalize $STMT
1.1151 +} {SQLITE_OK}
1.1152 +
1.1153 +# Verify that sqlite3_step() fails with an SQLITE_SCHEMA error
1.1154 +# when the statement is prepared with sqlite3_prepare() (not
1.1155 +# sqlite3_prepare_v2()) and the schema has changed.
1.1156 +#
1.1157 +do_test capi3-18.1 {
1.1158 + set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL]
1.1159 + sqlite3 db2 test.db
1.1160 + db2 eval {CREATE TABLE t3(x)}
1.1161 + db2 close
1.1162 + sqlite3_step $STMT
1.1163 +} {SQLITE_ERROR}
1.1164 +do_test capi3-18.2 {
1.1165 + sqlite3_reset $STMT
1.1166 + sqlite3_errcode db
1.1167 +} {SQLITE_SCHEMA}
1.1168 +do_test capi3-18.3 {
1.1169 + sqlite3_errmsg db
1.1170 +} {database schema has changed}
1.1171 +# The error persist on retry when sqlite3_prepare() has been used.
1.1172 +do_test capi3-18.4 {
1.1173 + sqlite3_step $STMT
1.1174 +} {SQLITE_ERROR}
1.1175 +do_test capi3-18.5 {
1.1176 + sqlite3_reset $STMT
1.1177 + sqlite3_errcode db
1.1178 +} {SQLITE_SCHEMA}
1.1179 +do_test capi3-18.6 {
1.1180 + sqlite3_errmsg db
1.1181 +} {database schema has changed}
1.1182 +sqlite3_finalize $STMT
1.1183 +
1.1184 +# Ticket #3134. Prepare a statement with an nBytes parameter of 0.
1.1185 +# Make sure this works correctly and does not reference memory out of
1.1186 +# range.
1.1187 +#
1.1188 +do_test capi3-19.1 {
1.1189 + sqlite3_prepare_tkt3134 db
1.1190 +} {}
1.1191 +
1.1192 +# Tests of the interface when no VFS is registered.
1.1193 +#
1.1194 +if {![info exists tester_do_binarylog]} {
1.1195 + db close
1.1196 + vfs_unregister_all
1.1197 + do_test capi3-20.1 {
1.1198 + sqlite3_sleep 100
1.1199 + } {0}
1.1200 + vfs_reregister_all
1.1201 +}
1.1202 +
1.1203 +finish_test