os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/capi3c.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/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