Annotation of embedaddon/sqlite3/test/capi3.test, revision 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>