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