persistentstorage/sqlite3api/TEST/TclScript/capi3.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2003 January 29
       
     2 #
       
     3 # The author disclaims copyright to this source code.  In place of
       
     4 # a legal notice, here is a blessing:
       
     5 #
       
     6 #    May you do good and not evil.
       
     7 #    May you find forgiveness for yourself and forgive others.
       
     8 #    May you share freely, never taking more than you give.
       
     9 #
       
    10 #***********************************************************************
       
    11 # This file implements regression tests for SQLite library.  The
       
    12 # focus of this script testing the callback-free C/C++ API.
       
    13 #
       
    14 # $Id: capi3.test,v 1.67 2008/07/12 15:55:55 danielk1977 Exp $
       
    15 #
       
    16 
       
    17 set testdir [file dirname $argv0]
       
    18 source $testdir/tester.tcl
       
    19 
       
    20 # Return the UTF-16 representation of the supplied UTF-8 string $str.
       
    21 # If $nt is true, append two 0x00 bytes as a nul terminator.
       
    22 proc utf16 {str {nt 1}} {
       
    23   set r [encoding convertto unicode $str]
       
    24   if {$nt} {
       
    25     append r "\x00\x00"
       
    26   }
       
    27   return $r
       
    28 }
       
    29 
       
    30 # Return the UTF-8 representation of the supplied UTF-16 string $str. 
       
    31 proc utf8 {str} {
       
    32   # If $str ends in two 0x00 0x00 bytes, knock these off before
       
    33   # converting to UTF-8 using TCL.
       
    34   binary scan $str \c* vals
       
    35   if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
       
    36     set str [binary format \c* [lrange $vals 0 end-2]]
       
    37   }
       
    38 
       
    39   set r [encoding convertfrom unicode $str]
       
    40   return $r
       
    41 }
       
    42 
       
    43 # These tests complement those in capi2.test. They are organized
       
    44 # as follows:
       
    45 #
       
    46 # capi3-1.*: Test sqlite3_prepare 
       
    47 # capi3-2.*: Test sqlite3_prepare16
       
    48 # capi3-3.*: Test sqlite3_open
       
    49 # capi3-4.*: Test sqlite3_open16
       
    50 # capi3-5.*: Test the various sqlite3_result_* APIs
       
    51 # capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
       
    52 #
       
    53 
       
    54 set DB [sqlite3_connection_pointer db]
       
    55 
       
    56 do_test capi3-1.0 {
       
    57   sqlite3_get_autocommit $DB
       
    58 } 1
       
    59 do_test capi3-1.1 {
       
    60   set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
       
    61   sqlite3_finalize $STMT
       
    62   set TAIL
       
    63 } {}
       
    64 do_test capi3-1.2 {
       
    65   sqlite3_errcode $DB
       
    66 } {SQLITE_OK}
       
    67 do_test capi3-1.3 {
       
    68   sqlite3_errmsg $DB
       
    69 } {not an error}
       
    70 do_test capi3-1.4 {
       
    71   set sql {SELECT name FROM sqlite_master;SELECT 10}
       
    72   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
    73   sqlite3_finalize $STMT
       
    74   set TAIL
       
    75 } {SELECT 10}
       
    76 do_test capi3-1.5 {
       
    77   set sql {SELECT name FROM sqlite_master;SELECT 10}
       
    78   set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL]
       
    79   sqlite3_finalize $STMT
       
    80   set TAIL
       
    81 } {SELECT 10}
       
    82 do_test capi3-1.6 {
       
    83   set sql {SELECT name FROM sqlite_master;SELECT 10}
       
    84   set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL]
       
    85   sqlite3_finalize $STMT
       
    86   set TAIL
       
    87 } {SELECT 10}
       
    88 
       
    89 do_test capi3-1.7 {
       
    90   set sql {SELECT namex FROM sqlite_master}
       
    91   catch {
       
    92     set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
    93   }
       
    94 } {1}
       
    95 do_test capi3-1.8 {
       
    96   sqlite3_errcode $DB
       
    97 } {SQLITE_ERROR}
       
    98 do_test capi3-1.9 {
       
    99   sqlite3_errmsg $DB
       
   100 } {no such column: namex}
       
   101 
       
   102 ifcapable {utf16} {
       
   103   do_test capi3-2.1 {
       
   104     set sql16 [utf16 {SELECT name FROM sqlite_master}]
       
   105     set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
       
   106     sqlite3_finalize $STMT
       
   107     utf8 $::TAIL
       
   108   } {}
       
   109   do_test capi3-2.2 {
       
   110     set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
       
   111     set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
       
   112     sqlite3_finalize $STMT
       
   113     utf8 $TAIL
       
   114   } {SELECT 10}
       
   115   do_test capi3-2.3 {
       
   116     set sql [utf16 {SELECT namex FROM sqlite_master}]
       
   117     catch {
       
   118       set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
       
   119     }
       
   120   } {1}
       
   121   do_test capi3-2.4 {
       
   122     sqlite3_errcode $DB
       
   123   } {SQLITE_ERROR}
       
   124   do_test capi3-2.5 {
       
   125     sqlite3_errmsg $DB
       
   126   } {no such column: namex}
       
   127 
       
   128   ifcapable schema_pragmas {
       
   129     do_test capi3-2.6 {
       
   130       execsql {CREATE TABLE tablename(x)}
       
   131       set sql16 [utf16 {PRAGMA table_info("TableName")}]
       
   132       set STMT [sqlite3_prepare16 $DB $sql16 -1 TAIL]
       
   133       sqlite3_step $STMT
       
   134     } SQLITE_ROW
       
   135     do_test capi3-2.7 {
       
   136       sqlite3_step $STMT
       
   137     } SQLITE_DONE
       
   138     do_test capi3-2.8 {
       
   139       sqlite3_finalize $STMT
       
   140     } SQLITE_OK
       
   141   }
       
   142 
       
   143 } ;# endif utf16
       
   144 
       
   145 # rename sqlite3_open sqlite3_open_old
       
   146 # proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
       
   147 
       
   148 do_test capi3-3.1 {
       
   149   set db2 [sqlite3_open test.db {}]
       
   150   sqlite3_errcode $db2
       
   151 } {SQLITE_OK}
       
   152 # FIX ME: Should test the db handle works.
       
   153 do_test capi3-3.2 {
       
   154   sqlite3_close $db2
       
   155 } {SQLITE_OK}
       
   156 # Symbian OS: '/' in the file name replaced with '\\'
       
   157 do_test capi3-3.3 {
       
   158   catch {
       
   159     set db2 [sqlite3_open \\bogus\\path\\test.db {}]
       
   160   }
       
   161   sqlite3_errcode $db2
       
   162 } {SQLITE_CANTOPEN}
       
   163 do_test capi3-3.4 {
       
   164   sqlite3_errmsg $db2
       
   165 } {unable to open database file}
       
   166 do_test capi3-3.5 {
       
   167   sqlite3_close $db2
       
   168 } {SQLITE_OK}
       
   169 do_test capi3-3.6.1-misuse {
       
   170   sqlite3_close $db2
       
   171 } {SQLITE_MISUSE}
       
   172 do_test capi3-3.6.2-misuse {
       
   173   sqlite3_errmsg $db2
       
   174 } {library routine called out of sequence}
       
   175 ifcapable {utf16} {
       
   176   do_test capi3-3.6.3-misuse {
       
   177     utf8 [sqlite3_errmsg16 $db2]
       
   178   } {library routine called out of sequence}
       
   179 }
       
   180 
       
   181 do_test capi3-3.7 {
       
   182   set db2 [sqlite3_open]
       
   183   sqlite3_errcode $db2
       
   184 } {SQLITE_OK}
       
   185 do_test capi3-3.8 {
       
   186   sqlite3_close $db2
       
   187 } {SQLITE_OK}
       
   188 
       
   189 # rename sqlite3_open ""
       
   190 # rename sqlite3_open_old sqlite3_open
       
   191 
       
   192 ifcapable {utf16} {
       
   193 do_test capi3-4.1 {
       
   194   set db2 [sqlite3_open16 [utf16 test.db] {}]
       
   195   sqlite3_errcode $db2
       
   196 } {SQLITE_OK}
       
   197 # FIX ME: Should test the db handle works.
       
   198 do_test capi3-4.2 {
       
   199   sqlite3_close $db2
       
   200 } {SQLITE_OK}
       
   201 # Symbian OS: '/' in the file name replaced with '\\'
       
   202 do_test capi3-4.3 {
       
   203   catch {
       
   204     set db2 [sqlite3_open16 [utf16 \\bogus\\path\\test.db] {}]
       
   205   }
       
   206   sqlite3_errcode $db2
       
   207 } {SQLITE_CANTOPEN}
       
   208 do_test capi3-4.4 {
       
   209   utf8 [sqlite3_errmsg16 $db2]
       
   210 } {unable to open database file}
       
   211 do_test capi3-4.5 {
       
   212   sqlite3_close $db2
       
   213 } {SQLITE_OK}
       
   214 } ;# utf16
       
   215 
       
   216 # This proc is used to test the following API calls:
       
   217 #
       
   218 # sqlite3_column_count
       
   219 # sqlite3_column_name
       
   220 # sqlite3_column_name16
       
   221 # sqlite3_column_decltype
       
   222 # sqlite3_column_decltype16
       
   223 #
       
   224 # $STMT is a compiled SQL statement. $test is a prefix
       
   225 # to use for test names within this proc. $names is a list
       
   226 # of the column names that should be returned by $STMT.
       
   227 # $decltypes is a list of column declaration types for $STMT.
       
   228 #
       
   229 # Example:
       
   230 #
       
   231 # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
       
   232 # check_header test1.1 {1 2 3} {"" "" ""}
       
   233 #
       
   234 proc check_header {STMT test names decltypes} {
       
   235 
       
   236   # Use the return value of sqlite3_column_count() to build
       
   237   # a list of column indexes. i.e. If sqlite3_column_count
       
   238   # is 3, build the list {0 1 2}.
       
   239   set ::idxlist [list]
       
   240   set ::numcols [sqlite3_column_count $STMT]
       
   241   for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
       
   242 
       
   243   # Column names in UTF-8
       
   244   do_test $test.1 {
       
   245     set cnamelist [list]
       
   246     foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 
       
   247     set cnamelist
       
   248   } $names
       
   249 
       
   250   # Column names in UTF-16
       
   251   ifcapable {utf16} {
       
   252     do_test $test.2 {
       
   253       set cnamelist [list]
       
   254       foreach i $idxlist {
       
   255         lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
       
   256       }
       
   257       set cnamelist
       
   258     } $names
       
   259   }
       
   260 
       
   261   # Column names in UTF-8
       
   262   do_test $test.3 {
       
   263     set cnamelist [list]
       
   264     foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} 
       
   265     set cnamelist
       
   266   } $names
       
   267 
       
   268   # Column names in UTF-16
       
   269   ifcapable {utf16} {
       
   270     do_test $test.4 {
       
   271       set cnamelist [list]
       
   272       foreach i $idxlist {
       
   273         lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
       
   274       }
       
   275       set cnamelist
       
   276     } $names
       
   277   }
       
   278 
       
   279   # Column names in UTF-8
       
   280   do_test $test.5 {
       
   281     set cnamelist [list]
       
   282     foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} 
       
   283     set cnamelist
       
   284   } $decltypes
       
   285 
       
   286   # Column declaration types in UTF-16
       
   287   ifcapable {utf16} {
       
   288     do_test $test.6 {
       
   289       set cnamelist [list]
       
   290       foreach i $idxlist {
       
   291         lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
       
   292       }
       
   293       set cnamelist
       
   294     } $decltypes
       
   295   }
       
   296 
       
   297 
       
   298   # Test some out of range conditions:
       
   299   ifcapable {utf16} {
       
   300     do_test $test.7 {
       
   301       list \
       
   302         [sqlite3_column_name $STMT -1] \
       
   303         [sqlite3_column_name16 $STMT -1] \
       
   304         [sqlite3_column_decltype $STMT -1] \
       
   305         [sqlite3_column_decltype16 $STMT -1] \
       
   306         [sqlite3_column_name $STMT $numcols] \
       
   307         [sqlite3_column_name16 $STMT $numcols] \
       
   308         [sqlite3_column_decltype $STMT $numcols] \
       
   309         [sqlite3_column_decltype16 $STMT $numcols]
       
   310     } {{} {} {} {} {} {} {} {}}
       
   311   }
       
   312 } 
       
   313 
       
   314 # This proc is used to test the following API calls:
       
   315 #
       
   316 # sqlite3_column_origin_name
       
   317 # sqlite3_column_origin_name16
       
   318 # sqlite3_column_table_name
       
   319 # sqlite3_column_table_name16
       
   320 # sqlite3_column_database_name
       
   321 # sqlite3_column_database_name16
       
   322 #
       
   323 # $STMT is a compiled SQL statement. $test is a prefix
       
   324 # to use for test names within this proc. $names is a list
       
   325 # of the column names that should be returned by $STMT.
       
   326 # $decltypes is a list of column declaration types for $STMT.
       
   327 #
       
   328 # Example:
       
   329 #
       
   330 # set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
       
   331 # check_header test1.1 {1 2 3} {"" "" ""}
       
   332 #
       
   333 proc check_origin_header {STMT test dbs tables cols} {
       
   334   # If sqlite3_column_origin_name() and friends are not compiled into
       
   335   # this build, this proc is a no-op.
       
   336   ifcapable columnmetadata {
       
   337     # Use the return value of sqlite3_column_count() to build
       
   338     # a list of column indexes. i.e. If sqlite3_column_count
       
   339     # is 3, build the list {0 1 2}.
       
   340     set ::idxlist [list]
       
   341     set ::numcols [sqlite3_column_count $STMT]
       
   342     for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
       
   343   
       
   344     # Database names in UTF-8
       
   345     do_test $test.8 {
       
   346       set cnamelist [list]
       
   347       foreach i $idxlist {
       
   348         lappend cnamelist [sqlite3_column_database_name $STMT $i]
       
   349       } 
       
   350       set cnamelist
       
   351     } $dbs
       
   352   
       
   353     # Database names in UTF-16
       
   354     ifcapable {utf16} {
       
   355       do_test $test.9 {
       
   356         set cnamelist [list]
       
   357         foreach i $idxlist {
       
   358           lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]]
       
   359         }
       
   360         set cnamelist
       
   361       } $dbs
       
   362     }
       
   363   
       
   364     # Table names in UTF-8
       
   365     do_test $test.10 {
       
   366       set cnamelist [list]
       
   367       foreach i $idxlist {
       
   368         lappend cnamelist [sqlite3_column_table_name $STMT $i]
       
   369       } 
       
   370       set cnamelist
       
   371     } $tables
       
   372   
       
   373     # Table names in UTF-16
       
   374     ifcapable {utf16} {
       
   375       do_test $test.11 {
       
   376         set cnamelist [list]
       
   377         foreach i $idxlist {
       
   378           lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]]
       
   379         }
       
   380         set cnamelist
       
   381       } $tables
       
   382     }
       
   383   
       
   384     # Origin names in UTF-8
       
   385     do_test $test.12 {
       
   386       set cnamelist [list]
       
   387       foreach i $idxlist {
       
   388         lappend cnamelist [sqlite3_column_origin_name $STMT $i]
       
   389       } 
       
   390       set cnamelist
       
   391     } $cols
       
   392   
       
   393     # Origin declaration types in UTF-16
       
   394     ifcapable {utf16} {
       
   395       do_test $test.13 {
       
   396         set cnamelist [list]
       
   397         foreach i $idxlist {
       
   398           lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]]
       
   399         }
       
   400         set cnamelist
       
   401       } $cols
       
   402     }
       
   403   }
       
   404 }
       
   405 
       
   406 # This proc is used to test the following APIs:
       
   407 #
       
   408 # sqlite3_data_count
       
   409 # sqlite3_column_type
       
   410 # sqlite3_column_int
       
   411 # sqlite3_column_text
       
   412 # sqlite3_column_text16
       
   413 # sqlite3_column_double
       
   414 #
       
   415 # $STMT is a compiled SQL statement for which the previous call 
       
   416 # to sqlite3_step returned SQLITE_ROW. $test is a prefix to use 
       
   417 # for test names within this proc. $types is a list of the 
       
   418 # manifest types for the current row. $ints, $doubles and $strings
       
   419 # are lists of the integer, real and string representations of
       
   420 # the values in the current row.
       
   421 #
       
   422 # Example:
       
   423 #
       
   424 # set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
       
   425 # sqlite3_step $STMT
       
   426 # check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
       
   427 #
       
   428 proc check_data {STMT test types ints doubles strings} {
       
   429 
       
   430   # Use the return value of sqlite3_column_count() to build
       
   431   # a list of column indexes. i.e. If sqlite3_column_count
       
   432   # is 3, build the list {0 1 2}.
       
   433   set ::idxlist [list]
       
   434   set numcols [sqlite3_data_count $STMT]
       
   435   for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
       
   436 
       
   437 # types
       
   438 do_test $test.1 {
       
   439   set types [list]
       
   440   foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
       
   441   set types
       
   442 } $types
       
   443 
       
   444 # Integers
       
   445 do_test $test.2 {
       
   446   set ints [list]
       
   447   foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
       
   448   set ints
       
   449 } $ints
       
   450 
       
   451 # bytes
       
   452 set lens [list]
       
   453 foreach i $::idxlist {
       
   454   lappend lens [string length [lindex $strings $i]]
       
   455 }
       
   456 do_test $test.3 {
       
   457   set bytes [list]
       
   458   set lens [list]
       
   459   foreach i $idxlist {
       
   460     lappend bytes [sqlite3_column_bytes $STMT $i]
       
   461   }
       
   462   set bytes
       
   463 } $lens
       
   464 
       
   465 # bytes16
       
   466 ifcapable {utf16} {
       
   467   set lens [list]
       
   468   foreach i $::idxlist {
       
   469     lappend lens [expr 2 * [string length [lindex $strings $i]]]
       
   470   }
       
   471   do_test $test.4 {
       
   472     set bytes [list]
       
   473     set lens [list]
       
   474     foreach i $idxlist {
       
   475       lappend bytes [sqlite3_column_bytes16 $STMT $i]
       
   476     }
       
   477     set bytes
       
   478   } $lens
       
   479 }
       
   480 
       
   481 # Blob
       
   482 do_test $test.5 {
       
   483   set utf8 [list]
       
   484   foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
       
   485   set utf8
       
   486 } $strings
       
   487 
       
   488 # UTF-8
       
   489 do_test $test.6 {
       
   490   set utf8 [list]
       
   491   foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
       
   492   set utf8
       
   493 } $strings
       
   494 
       
   495 # Floats
       
   496 do_test $test.7 {
       
   497   set utf8 [list]
       
   498   foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
       
   499   set utf8
       
   500 } $doubles
       
   501 
       
   502 # UTF-16
       
   503 ifcapable {utf16} {
       
   504   do_test $test.8 {
       
   505     set utf8 [list]
       
   506     foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
       
   507     set utf8
       
   508   } $strings
       
   509 }
       
   510 
       
   511 # Integers
       
   512 do_test $test.9 {
       
   513   set ints [list]
       
   514   foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
       
   515   set ints
       
   516 } $ints
       
   517 
       
   518 # Floats
       
   519 do_test $test.10 {
       
   520   set utf8 [list]
       
   521   foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
       
   522   set utf8
       
   523 } $doubles
       
   524 
       
   525 # UTF-8
       
   526 do_test $test.11 {
       
   527   set utf8 [list]
       
   528   foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
       
   529   set utf8
       
   530 } $strings
       
   531 
       
   532 # Types
       
   533 do_test $test.12 {
       
   534   set types [list]
       
   535   foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
       
   536   set types
       
   537 } $types
       
   538 
       
   539 # Test that an out of range request returns the equivalent of NULL
       
   540 do_test $test.13 {
       
   541   sqlite3_column_int $STMT -1
       
   542 } {0}
       
   543 do_test $test.13 {
       
   544   sqlite3_column_text $STMT -1
       
   545 } {}
       
   546 
       
   547 }
       
   548 
       
   549 ifcapable !floatingpoint {
       
   550   finish_test
       
   551   return
       
   552 }
       
   553 
       
   554 do_test capi3-5.0 {
       
   555   execsql {
       
   556     CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
       
   557     INSERT INTO t1 VALUES(1, 2, 3);
       
   558     INSERT INTO t1 VALUES('one', 'two', NULL);
       
   559     INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
       
   560   }
       
   561   set sql "SELECT * FROM t1"
       
   562   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
   563   sqlite3_column_count $STMT
       
   564 } 3
       
   565 
       
   566 check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
       
   567 check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c}
       
   568 do_test capi3-5.2 {
       
   569   sqlite3_step $STMT
       
   570 } SQLITE_ROW
       
   571 
       
   572 check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
       
   573 check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c}
       
   574 check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
       
   575 
       
   576 do_test capi3-5.5 {
       
   577   sqlite3_step $STMT
       
   578 } SQLITE_ROW
       
   579 
       
   580 check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
       
   581 check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c}
       
   582 check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
       
   583 
       
   584 do_test capi3-5.8 {
       
   585   sqlite3_step $STMT
       
   586 } SQLITE_ROW
       
   587 
       
   588 check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
       
   589 check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c}
       
   590 check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
       
   591 
       
   592 do_test capi3-5.11 {
       
   593   sqlite3_step $STMT
       
   594 } SQLITE_DONE
       
   595 
       
   596 do_test capi3-5.12 {
       
   597   sqlite3_finalize $STMT
       
   598 } SQLITE_OK
       
   599 
       
   600 do_test capi3-5.20 {
       
   601   set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a"
       
   602   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
   603   sqlite3_column_count $STMT
       
   604 } 3
       
   605 
       
   606 check_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}}
       
   607 check_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}}
       
   608 do_test capi3-5.23 {
       
   609   sqlite3_finalize $STMT
       
   610 } SQLITE_OK
       
   611 
       
   612 do_test capi3-5.30 {
       
   613   set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x"
       
   614   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
   615   sqlite3_column_count $STMT
       
   616 } 3
       
   617 
       
   618 check_header $STMT capi3-5.31 {x y z} {VARINT {} {}}
       
   619 check_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}}
       
   620 do_test capi3-5.33 {
       
   621   sqlite3_finalize $STMT
       
   622 } SQLITE_OK
       
   623 
       
   624 
       
   625 set ::ENC [execsql {pragma encoding}]
       
   626 db close
       
   627 
       
   628 do_test capi3-6.0 {
       
   629   sqlite3 db test.db
       
   630   set DB [sqlite3_connection_pointer db]
       
   631   sqlite3_key $DB xyzzy
       
   632   set sql {SELECT a FROM t1 order by rowid}
       
   633   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
   634   expr 0
       
   635 } {0}
       
   636 do_test capi3-6.1 {
       
   637   db cache flush
       
   638   sqlite3_close $DB
       
   639 } {SQLITE_BUSY}
       
   640 do_test capi3-6.2 {
       
   641   sqlite3_step $STMT
       
   642 } {SQLITE_ROW}
       
   643 check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
       
   644 do_test capi3-6.3 {
       
   645   sqlite3_finalize $STMT
       
   646 } {SQLITE_OK}
       
   647 do_test capi3-6.4-misuse {
       
   648   db cache flush
       
   649   sqlite3_close $DB
       
   650 } {SQLITE_OK}
       
   651 db close
       
   652 
       
   653 # This procedure sets the value of the file-format in file 'test.db'
       
   654 # to $newval. Also, the schema cookie is incremented.
       
   655 # 
       
   656 proc set_file_format {newval} {
       
   657   hexio_write test.db 44 [hexio_render_int32 $newval]
       
   658   set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
       
   659   incr schemacookie
       
   660   hexio_write test.db 40 [hexio_render_int32 $schemacookie]
       
   661   return {}
       
   662 }
       
   663 
       
   664 # This procedure returns the value of the file-format in file 'test.db'.
       
   665 # 
       
   666 proc get_file_format {{fname test.db}} {
       
   667   return [hexio_get_int [hexio_read $fname 44 4]]
       
   668 }
       
   669 
       
   670 if {![sqlite3 -has-codec]} {
       
   671   # Test what happens when the library encounters a newer file format.
       
   672   do_test capi3-7.1 {
       
   673     set_file_format 5
       
   674   } {}
       
   675   do_test capi3-7.2 {
       
   676     sqlite3 db test.db
       
   677     catchsql {
       
   678       SELECT * FROM sqlite_master;
       
   679     }
       
   680   } {1 {unsupported file format}}
       
   681   db close
       
   682 }
       
   683 
       
   684 if {![sqlite3 -has-codec]} {
       
   685   # Now test that the library correctly handles bogus entries in the
       
   686   # sqlite_master table (schema corruption).
       
   687   do_test capi3-8.1 {
       
   688     file delete -force test.db test.db-journal
       
   689     sqlite3 db test.db
       
   690     execsql {
       
   691       CREATE TABLE t1(a);
       
   692     }
       
   693     db close
       
   694   } {}
       
   695   do_test capi3-8.2 {
       
   696     sqlite3 db test.db
       
   697     execsql {
       
   698       PRAGMA writable_schema=ON;
       
   699       INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
       
   700     }
       
   701     db close
       
   702   } {}
       
   703   do_test capi3-8.3 {
       
   704     sqlite3 db test.db
       
   705     catchsql {
       
   706       SELECT * FROM sqlite_master;
       
   707     }
       
   708   } {1 {malformed database schema (?)}}
       
   709   do_test capi3-8.4 {
       
   710     # Build a 5-field row record. The first field is a string 'table', and
       
   711     # subsequent fields are all NULL.
       
   712     db close
       
   713     file delete -force test.db test.db-journal
       
   714     sqlite3 db test.db
       
   715     execsql {
       
   716       CREATE TABLE t1(a);
       
   717       PRAGMA writable_schema=ON;
       
   718       INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL);
       
   719     }
       
   720     db close
       
   721   } {};
       
   722   do_test capi3-8.5 {
       
   723     sqlite3 db test.db
       
   724     catchsql {
       
   725       SELECT * FROM sqlite_master;
       
   726     }
       
   727   } {1 {malformed database schema (?)}}
       
   728   db close
       
   729 }
       
   730 file delete -force test.db
       
   731 file delete -force test.db-journal
       
   732 
       
   733 
       
   734 # Test the english language string equivalents for sqlite error codes
       
   735 set code2english [list \
       
   736 SQLITE_OK         {not an error} \
       
   737 SQLITE_ERROR      {SQL logic error or missing database} \
       
   738 SQLITE_PERM       {access permission denied} \
       
   739 SQLITE_ABORT      {callback requested query abort} \
       
   740 SQLITE_BUSY       {database is locked} \
       
   741 SQLITE_LOCKED     {database table is locked} \
       
   742 SQLITE_NOMEM      {out of memory} \
       
   743 SQLITE_READONLY   {attempt to write a readonly database} \
       
   744 SQLITE_INTERRUPT  {interrupted} \
       
   745 SQLITE_IOERR      {disk I/O error} \
       
   746 SQLITE_CORRUPT    {database disk image is malformed} \
       
   747 SQLITE_FULL       {database or disk is full} \
       
   748 SQLITE_CANTOPEN   {unable to open database file} \
       
   749 SQLITE_EMPTY      {table contains no data} \
       
   750 SQLITE_SCHEMA     {database schema has changed} \
       
   751 SQLITE_CONSTRAINT {constraint failed} \
       
   752 SQLITE_MISMATCH   {datatype mismatch} \
       
   753 SQLITE_MISUSE     {library routine called out of sequence} \
       
   754 SQLITE_NOLFS      {large file support is disabled} \
       
   755 SQLITE_AUTH       {authorization denied} \
       
   756 SQLITE_FORMAT     {auxiliary database format error} \
       
   757 SQLITE_RANGE      {bind or column index out of range} \
       
   758 SQLITE_NOTADB     {file is encrypted or is not a database} \
       
   759 unknownerror      {unknown error} \
       
   760 ]
       
   761 
       
   762 set test_number 1
       
   763 foreach {code english} $code2english {
       
   764   do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
       
   765   incr test_number
       
   766 }
       
   767 
       
   768 # Test the error message when a "real" out of memory occurs.
       
   769 ifcapable memdebug {
       
   770   do_test capi3-10-1 {
       
   771     sqlite3 db test.db
       
   772     set DB [sqlite3_connection_pointer db]
       
   773     sqlite3_memdebug_fail 1
       
   774     catchsql {
       
   775       select * from sqlite_master;
       
   776     }
       
   777   } {1 {out of memory}}
       
   778   do_test capi3-10-2 {
       
   779     sqlite3_errmsg $::DB
       
   780   } {out of memory}
       
   781   ifcapable {utf16} {
       
   782     do_test capi3-10-3 {
       
   783       utf8 [sqlite3_errmsg16 $::DB]
       
   784     } {out of memory}
       
   785   }
       
   786   db close
       
   787   sqlite3_memdebug_fail -1
       
   788   do_test capi3-10-4 {
       
   789     sqlite3 db test.db
       
   790     set DB [sqlite3_connection_pointer db]
       
   791     sqlite3_memdebug_fail 1
       
   792     catchsql {
       
   793       select * from sqlite_master where rowid>5;
       
   794     }
       
   795   } {1 {out of memory}}
       
   796   do_test capi3-10-5 {
       
   797     sqlite3_errmsg $::DB
       
   798   } {out of memory}
       
   799   ifcapable {utf16} {
       
   800     do_test capi3-10-6 {
       
   801       utf8 [sqlite3_errmsg16 $::DB]
       
   802     } {out of memory}
       
   803   }
       
   804   db close
       
   805   sqlite3_memdebug_fail -1
       
   806 }
       
   807 
       
   808 # The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
       
   809 # statement issued while there are still outstanding VMs that are part of
       
   810 # the transaction fails.
       
   811 sqlite3 db test.db
       
   812 set DB [sqlite3_connection_pointer db]
       
   813 sqlite_register_test_function $DB func
       
   814 do_test capi3-11.1 {
       
   815   execsql {
       
   816     BEGIN;
       
   817     CREATE TABLE t1(a, b);
       
   818     INSERT INTO t1 VALUES(1, 'int');
       
   819     INSERT INTO t1 VALUES(2, 'notatype');
       
   820   }
       
   821 } {}
       
   822 do_test capi3-11.1.1 {
       
   823   sqlite3_get_autocommit $DB
       
   824 } 0
       
   825 do_test capi3-11.2 {
       
   826   set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
       
   827   sqlite3_step $STMT
       
   828 } {SQLITE_ROW}
       
   829 do_test capi3-11.3 {
       
   830   catchsql {
       
   831     COMMIT;
       
   832   }
       
   833 } {1 {cannot commit transaction - SQL statements in progress}}
       
   834 do_test capi3-11.3.1 {
       
   835   sqlite3_get_autocommit $DB
       
   836 } 0
       
   837 do_test capi3-11.4 {
       
   838   sqlite3_step $STMT
       
   839 } {SQLITE_ERROR}
       
   840 do_test capi3-11.5 {
       
   841   sqlite3_finalize $STMT
       
   842 } {SQLITE_ERROR}
       
   843 do_test capi3-11.6 {
       
   844   catchsql {
       
   845     SELECT * FROM t1;
       
   846   }
       
   847 } {0 {1 int 2 notatype}}
       
   848 do_test capi3-11.6.1 {
       
   849   sqlite3_get_autocommit $DB
       
   850 } 0
       
   851 do_test capi3-11.7 {
       
   852   catchsql {
       
   853     COMMIT;
       
   854   }
       
   855 } {0 {}}
       
   856 do_test capi3-11.7.1 {
       
   857   sqlite3_get_autocommit $DB
       
   858 } 1
       
   859 do_test capi3-11.8 {
       
   860   execsql {
       
   861     CREATE TABLE t2(a);
       
   862     INSERT INTO t2 VALUES(1);
       
   863     INSERT INTO t2 VALUES(2);
       
   864     BEGIN;
       
   865     INSERT INTO t2 VALUES(3);
       
   866   }
       
   867 } {}
       
   868 do_test capi3-11.8.1 {
       
   869   sqlite3_get_autocommit $DB
       
   870 } 0
       
   871 do_test capi3-11.9 {
       
   872   set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
       
   873   sqlite3_step $STMT
       
   874 } {SQLITE_ROW}
       
   875 do_test capi3-11.9.1 {
       
   876   sqlite3_get_autocommit $DB
       
   877 } 0
       
   878 do_test capi3-11.9.2 {
       
   879   catchsql {
       
   880     ROLLBACK;
       
   881   }
       
   882 } {1 {cannot rollback transaction - SQL statements in progress}}
       
   883 do_test capi3-11.9.3 {
       
   884   sqlite3_get_autocommit $DB
       
   885 } 0
       
   886 do_test capi3-11.10 {
       
   887   sqlite3_step $STMT
       
   888 } {SQLITE_ROW}
       
   889 do_test capi3-11.11 {
       
   890   sqlite3_step $STMT
       
   891 } {SQLITE_ROW}
       
   892 do_test capi3-11.12 {
       
   893   sqlite3_step $STMT
       
   894 } {SQLITE_DONE}
       
   895 do_test capi3-11.13 {
       
   896   sqlite3_finalize $STMT
       
   897 } {SQLITE_OK}
       
   898 do_test capi3-11.14 {
       
   899   execsql {
       
   900     SELECT a FROM t2;
       
   901   }
       
   902 } {1 2 3}
       
   903 do_test capi3-11.14.1 {
       
   904   sqlite3_get_autocommit $DB
       
   905 } 0
       
   906 do_test capi3-11.15 {
       
   907   catchsql {
       
   908     ROLLBACK;
       
   909   }
       
   910 } {0 {}}
       
   911 do_test capi3-11.15.1 {
       
   912   sqlite3_get_autocommit $DB
       
   913 } 1
       
   914 do_test capi3-11.16 {
       
   915   execsql {
       
   916     SELECT a FROM t2;
       
   917   }
       
   918 } {1 2}
       
   919 
       
   920 # Sanity check on the definition of 'outstanding VM'. This means any VM
       
   921 # that has had sqlite3_step() called more recently than sqlite3_finalize() or
       
   922 # sqlite3_reset(). So a VM that has just been prepared or reset does not
       
   923 # count as an active VM.
       
   924 do_test capi3-11.17 {
       
   925   execsql {
       
   926     BEGIN;
       
   927   }
       
   928 } {}
       
   929 do_test capi3-11.18 {
       
   930   set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
       
   931   catchsql {
       
   932     COMMIT;
       
   933   }
       
   934 } {0 {}}
       
   935 do_test capi3-11.19 {
       
   936   sqlite3_step $STMT
       
   937 } {SQLITE_ROW}
       
   938 do_test capi3-11.20 {
       
   939   catchsql {
       
   940     BEGIN;
       
   941     COMMIT;
       
   942   }
       
   943 } {1 {cannot commit transaction - SQL statements in progress}}
       
   944 do_test capi3-11.20 {
       
   945   sqlite3_reset $STMT
       
   946   catchsql {
       
   947     COMMIT;
       
   948   }
       
   949 } {0 {}}
       
   950 do_test capi3-11.21 {
       
   951   sqlite3_finalize $STMT
       
   952 } {SQLITE_OK}
       
   953 
       
   954 # The following tests - capi3-12.* - check that its Ok to start a
       
   955 # transaction while other VMs are active, and that its Ok to execute
       
   956 # atomic updates in the same situation 
       
   957 #
       
   958 do_test capi3-12.1 {
       
   959   set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
       
   960   sqlite3_step $STMT
       
   961 } {SQLITE_ROW}
       
   962 do_test capi3-12.2 {
       
   963   catchsql {
       
   964     INSERT INTO t1 VALUES(3, NULL);
       
   965   }
       
   966 } {0 {}}
       
   967 do_test capi3-12.3 {
       
   968   catchsql {
       
   969     INSERT INTO t2 VALUES(4);
       
   970   }
       
   971 } {0 {}}
       
   972 do_test capi3-12.4 {
       
   973   catchsql {
       
   974     BEGIN;
       
   975     INSERT INTO t1 VALUES(4, NULL);
       
   976   }
       
   977 } {0 {}}
       
   978 do_test capi3-12.5 {
       
   979   sqlite3_step $STMT
       
   980 } {SQLITE_ROW}
       
   981 do_test capi3-12.5.1 {
       
   982   sqlite3_step $STMT
       
   983 } {SQLITE_ROW}
       
   984 do_test capi3-12.6 {
       
   985   sqlite3_step $STMT
       
   986 } {SQLITE_DONE}
       
   987 do_test capi3-12.7 {
       
   988   sqlite3_finalize $STMT
       
   989 } {SQLITE_OK}
       
   990 do_test capi3-12.8 {
       
   991   execsql {
       
   992     COMMIT;
       
   993     SELECT a FROM t1;
       
   994   }
       
   995 } {1 2 3 4}
       
   996 
       
   997 # Test cases capi3-13.* test the sqlite3_clear_bindings() and 
       
   998 # sqlite3_sleep APIs.
       
   999 #
       
  1000 if {[llength [info commands sqlite3_clear_bindings]]>0} {
       
  1001   do_test capi3-13.1 {
       
  1002     execsql {
       
  1003       DELETE FROM t1;
       
  1004     }
       
  1005     set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
       
  1006     sqlite3_step $STMT
       
  1007   } {SQLITE_DONE}
       
  1008   do_test capi3-13.2 {
       
  1009     sqlite3_reset $STMT
       
  1010     sqlite3_bind_text $STMT 1 hello 5
       
  1011     sqlite3_bind_text $STMT 2 world 5
       
  1012     sqlite3_step $STMT
       
  1013   } {SQLITE_DONE}
       
  1014   do_test capi3-13.3 {
       
  1015     sqlite3_reset $STMT
       
  1016     sqlite3_clear_bindings $STMT
       
  1017     sqlite3_step $STMT
       
  1018   } {SQLITE_DONE}
       
  1019   do_test capi3-13-4 {
       
  1020     sqlite3_finalize $STMT
       
  1021     execsql {
       
  1022       SELECT * FROM t1;
       
  1023     }
       
  1024   } {{} {} hello world {} {}}
       
  1025 }
       
  1026 if {[llength [info commands sqlite3_sleep]]>0} {
       
  1027   do_test capi3-13-5 {
       
  1028     set ms [sqlite3_sleep 80]
       
  1029     expr {$ms==80 || $ms==1000}
       
  1030   } {1}
       
  1031 }
       
  1032 
       
  1033 # Ticket #1219:  Make sure binding APIs can handle a NULL pointer.
       
  1034 #
       
  1035 do_test capi3-14.1-misuse {
       
  1036   set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
       
  1037   lappend rc $msg
       
  1038 } {1 SQLITE_MISUSE}
       
  1039 
       
  1040 # Ticket #1650:  Honor the nBytes parameter to sqlite3_prepare.
       
  1041 #
       
  1042 do_test capi3-15.1 {
       
  1043   set sql {SELECT * FROM t2}
       
  1044   set nbytes [string length $sql]
       
  1045   append sql { WHERE a==1}
       
  1046   set STMT [sqlite3_prepare $DB $sql $nbytes TAIL]
       
  1047   sqlite3_step $STMT
       
  1048   sqlite3_column_int $STMT 0
       
  1049 } {1}
       
  1050 do_test capi3-15.2 {
       
  1051   sqlite3_step $STMT
       
  1052   sqlite3_column_int $STMT 0
       
  1053 } {2}
       
  1054 do_test capi3-15.3 {
       
  1055   sqlite3_finalize $STMT
       
  1056 } {SQLITE_OK}
       
  1057 do_test capi3-15.4 {
       
  1058   #        123456789 1234567
       
  1059   set sql {SELECT 1234567890}
       
  1060   set STMT [sqlite3_prepare $DB $sql 8 TAIL]
       
  1061   sqlite3_step $STMT
       
  1062   set v1 [sqlite3_column_int $STMT 0]
       
  1063   sqlite3_finalize $STMT
       
  1064   set v1
       
  1065 } {1}
       
  1066 do_test capi3-15.5 {
       
  1067   #        123456789 1234567
       
  1068   set sql {SELECT 1234567890}
       
  1069   set STMT [sqlite3_prepare $DB $sql 9 TAIL]
       
  1070   sqlite3_step $STMT
       
  1071   set v1 [sqlite3_column_int $STMT 0]
       
  1072   sqlite3_finalize $STMT
       
  1073   set v1
       
  1074 } {12}
       
  1075 do_test capi3-15.6 {
       
  1076   #        123456789 1234567
       
  1077   set sql {SELECT 1234567890}
       
  1078   set STMT [sqlite3_prepare $DB $sql 12 TAIL]
       
  1079   sqlite3_step $STMT
       
  1080   set v1 [sqlite3_column_int $STMT 0]
       
  1081   sqlite3_finalize $STMT
       
  1082   set v1
       
  1083 } {12345}
       
  1084 do_test capi3-15.7 {
       
  1085   #        123456789 1234567
       
  1086   set sql {SELECT 12.34567890}
       
  1087   set STMT [sqlite3_prepare $DB $sql 12 TAIL]
       
  1088   sqlite3_step $STMT
       
  1089   set v1 [sqlite3_column_double $STMT 0]
       
  1090   sqlite3_finalize $STMT
       
  1091   set v1
       
  1092 } {12.34}
       
  1093 do_test capi3-15.8 {
       
  1094   #        123456789 1234567
       
  1095   set sql {SELECT 12.34567890}
       
  1096   set STMT [sqlite3_prepare $DB $sql 14 TAIL]
       
  1097   sqlite3_step $STMT
       
  1098   set v1 [sqlite3_column_double $STMT 0]
       
  1099   sqlite3_finalize $STMT
       
  1100   set v1
       
  1101 } {12.3456}
       
  1102 
       
  1103 # Make sure code is always generated even if an IF EXISTS or 
       
  1104 # IF NOT EXISTS clause is present that the table does not or
       
  1105 # does exists.  That way we will always have a prepared statement
       
  1106 # to expire when the schema changes.
       
  1107 #
       
  1108 do_test capi3-16.1 {
       
  1109   set sql {DROP TABLE IF EXISTS t3}
       
  1110   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
  1111   sqlite3_finalize $STMT
       
  1112   expr {$STMT!=""}
       
  1113 } {1}
       
  1114 do_test capi3-16.2 {
       
  1115   set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
       
  1116   set STMT [sqlite3_prepare $DB $sql -1 TAIL]
       
  1117   sqlite3_finalize $STMT
       
  1118   expr {$STMT!=""}
       
  1119 } {1}
       
  1120 
       
  1121 # But still we do not generate code if there is no SQL
       
  1122 #
       
  1123 do_test capi3-16.3 {
       
  1124   set STMT [sqlite3_prepare $DB {} -1 TAIL]
       
  1125   sqlite3_finalize $STMT
       
  1126   expr {$STMT==""}
       
  1127 } {1}
       
  1128 do_test capi3-16.4 {
       
  1129   set STMT [sqlite3_prepare $DB {;} -1 TAIL]
       
  1130   sqlite3_finalize $STMT
       
  1131   expr {$STMT==""}
       
  1132 } {1}
       
  1133 
       
  1134 # Ticket #2426:  Misuse of sqlite3_column_* by calling it after
       
  1135 # a sqlite3_reset should be harmless.
       
  1136 #
       
  1137 do_test capi3-17.1 {
       
  1138   set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
       
  1139   sqlite3_step $STMT
       
  1140   sqlite3_column_int $STMT 0
       
  1141 } {1}
       
  1142 do_test capi3-17.2 {
       
  1143   sqlite3_reset $STMT
       
  1144   sqlite3_column_int $STMT 0
       
  1145 } {0}
       
  1146 do_test capi3-17.3 {
       
  1147   sqlite3_finalize $STMT
       
  1148 } {SQLITE_OK}
       
  1149 
       
  1150 # Verify that sqlite3_step() fails with an SQLITE_SCHEMA error
       
  1151 # when the statement is prepared with sqlite3_prepare() (not
       
  1152 # sqlite3_prepare_v2()) and the schema has changed.
       
  1153 #
       
  1154 do_test capi3-18.1 {
       
  1155   set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL]
       
  1156   sqlite3 db2 test.db
       
  1157   db2 eval {CREATE TABLE t3(x)}
       
  1158   db2 close
       
  1159   sqlite3_step $STMT
       
  1160 } {SQLITE_ERROR}
       
  1161 do_test capi3-18.2 {
       
  1162   sqlite3_reset $STMT
       
  1163   sqlite3_errcode db
       
  1164 } {SQLITE_SCHEMA}
       
  1165 do_test capi3-18.3 {
       
  1166   sqlite3_errmsg db
       
  1167 } {database schema has changed}
       
  1168 # The error persist on retry when sqlite3_prepare() has been used.
       
  1169 do_test capi3-18.4 {
       
  1170   sqlite3_step $STMT
       
  1171 } {SQLITE_ERROR}
       
  1172 do_test capi3-18.5 {
       
  1173   sqlite3_reset $STMT
       
  1174   sqlite3_errcode db
       
  1175 } {SQLITE_SCHEMA}
       
  1176 do_test capi3-18.6 {
       
  1177   sqlite3_errmsg db
       
  1178 } {database schema has changed}
       
  1179 sqlite3_finalize $STMT
       
  1180 
       
  1181 # Ticket #3134.  Prepare a statement with an nBytes parameter of 0.
       
  1182 # Make sure this works correctly and does not reference memory out of
       
  1183 # range.
       
  1184 #
       
  1185 do_test capi3-19.1 {
       
  1186   sqlite3_prepare_tkt3134 db
       
  1187 } {}
       
  1188 
       
  1189 # Tests of the interface when no VFS is registered.
       
  1190 #
       
  1191 if {![info exists tester_do_binarylog]} {
       
  1192   db close
       
  1193   vfs_unregister_all
       
  1194   do_test capi3-20.1 {
       
  1195     sqlite3_sleep 100
       
  1196   } {0}
       
  1197   vfs_reregister_all
       
  1198 }
       
  1199 
       
  1200 finish_test