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