Annotation of embedaddon/sqlite3/test/capi3.test, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>