os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/capi3.test
changeset 0 bde4ae8d615e
     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