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