Annotation of embedaddon/sqlite3/test/capi2.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: capi2.test,v 1.37 2008/12/30 17:55:00 drh Exp $
! 15: #
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: # Return the text values from the current row pointed at by STMT as a list.
! 21: proc get_row_values {STMT} {
! 22: set VALUES [list]
! 23: for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} {
! 24: lappend VALUES [sqlite3_column_text $STMT $i]
! 25: }
! 26: return $VALUES
! 27: }
! 28:
! 29: # Return the column names followed by declaration types for the result set
! 30: # of the SQL statement STMT.
! 31: #
! 32: # i.e. for:
! 33: # CREATE TABLE abc(a text, b integer);
! 34: # SELECT * FROM abc;
! 35: #
! 36: # The result is {a b text integer}
! 37: proc get_column_names {STMT} {
! 38: set VALUES [list]
! 39: for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
! 40: lappend VALUES [sqlite3_column_name $STMT $i]
! 41: }
! 42: for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
! 43: lappend VALUES [sqlite3_column_decltype $STMT $i]
! 44: }
! 45: return $VALUES
! 46: }
! 47:
! 48: # Check basic functionality
! 49: #
! 50: do_test capi2-1.1 {
! 51: set DB [sqlite3_connection_pointer db]
! 52: execsql {CREATE TABLE t1(a,b,c)}
! 53: set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL]
! 54: set TAIL
! 55: } {}
! 56: do_test capi2-1.2 {
! 57: sqlite3_step $VM
! 58: } {SQLITE_ROW}
! 59: do_test capi2-1.3 {
! 60: sqlite3_data_count $VM
! 61: } {2}
! 62: do_test capi2-1.4 {
! 63: get_row_values $VM
! 64: } {t1 1}
! 65: do_test capi2-1.5 {
! 66: get_column_names $VM
! 67: } {name rowid text INTEGER}
! 68: do_test capi2-1.6 {
! 69: sqlite3_step $VM
! 70: } {SQLITE_DONE}
! 71: do_test capi2-1.7 {
! 72: list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
! 73: } {2 {} {name rowid text INTEGER}}
! 74:
! 75: # This used to be SQLITE_MISUSE. But now we automatically reset prepared
! 76: # statements.
! 77: ifcapable autoreset {
! 78: do_test capi2-1.8 {
! 79: sqlite3_step $VM
! 80: } {SQLITE_ROW}
! 81: } else {
! 82: do_test capi2-1.8 {
! 83: sqlite3_step $VM
! 84: } {SQLITE_MISUSE}
! 85: }
! 86:
! 87: # Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot
! 88: # be interrogated for more information. However in v3, since the column
! 89: # count, names and types are determined at compile time, these are still
! 90: # accessible after an SQLITE_MISUSE error.
! 91: do_test capi2-1.9 {
! 92: sqlite3_reset $VM
! 93: list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
! 94: } {2 {} {name rowid text INTEGER}}
! 95: do_test capi2-1.10 {
! 96: sqlite3_data_count $VM
! 97: } {0}
! 98:
! 99: do_test capi2-1.11 {
! 100: sqlite3_finalize $VM
! 101: } {SQLITE_OK}
! 102:
! 103: # Check to make sure that the "tail" of a multi-statement SQL script
! 104: # is returned by sqlite3_prepare.
! 105: #
! 106: do_test capi2-2.1 {
! 107: set SQL {
! 108: SELECT name, rowid FROM sqlite_master;
! 109: SELECT name, rowid FROM sqlite_master WHERE 0;
! 110: -- A comment at the end
! 111: }
! 112: set VM [sqlite3_prepare $DB $SQL -1 SQL]
! 113: set SQL
! 114: } {
! 115: SELECT name, rowid FROM sqlite_master WHERE 0;
! 116: -- A comment at the end
! 117: }
! 118: do_test capi2-2.2 {
! 119: set r [sqlite3_step $VM]
! 120: lappend r [sqlite3_column_count $VM] \
! 121: [get_row_values $VM] \
! 122: [get_column_names $VM]
! 123: } {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}}
! 124: do_test capi2-2.3 {
! 125: set r [sqlite3_step $VM]
! 126: lappend r [sqlite3_column_count $VM] \
! 127: [get_row_values $VM] \
! 128: [get_column_names $VM]
! 129: } {SQLITE_DONE 2 {} {name rowid text INTEGER}}
! 130: do_test capi2-2.4 {
! 131: sqlite3_finalize $VM
! 132: } {SQLITE_OK}
! 133: do_test capi2-2.5 {
! 134: set VM [sqlite3_prepare $DB $SQL -1 SQL]
! 135: set SQL
! 136: } {
! 137: -- A comment at the end
! 138: }
! 139: do_test capi2-2.6 {
! 140: set r [sqlite3_step $VM]
! 141: lappend r [sqlite3_column_count $VM] \
! 142: [get_row_values $VM] \
! 143: [get_column_names $VM]
! 144: } {SQLITE_DONE 2 {} {name rowid text INTEGER}}
! 145: do_test capi2-2.7 {
! 146: sqlite3_finalize $VM
! 147: } {SQLITE_OK}
! 148: do_test capi2-2.8 {
! 149: set VM [sqlite3_prepare $DB $SQL -1 SQL]
! 150: list $SQL $VM
! 151: } {{} {}}
! 152:
! 153: # Check the error handling.
! 154: #
! 155: do_test capi2-3.1 {
! 156: set rc [catch {
! 157: sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
! 158: } msg]
! 159: lappend rc $msg $TAIL
! 160: } {1 {(1) no such column: bogus} {}}
! 161: do_test capi2-3.2 {
! 162: set rc [catch {
! 163: sqlite3_prepare $DB {select bogus from } -1 TAIL
! 164: } msg]
! 165: lappend rc $msg $TAIL
! 166: } {1 {(1) near " ": syntax error} {}}
! 167: do_test capi2-3.3 {
! 168: set rc [catch {
! 169: sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
! 170: } msg]
! 171: lappend rc $msg $TAIL
! 172: } {1 {(1) no such column: bogus} {}}
! 173: do_test capi2-3.4 {
! 174: set rc [catch {
! 175: sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL
! 176: } msg]
! 177: lappend rc $msg $TAIL
! 178: } {1 {(1) no such column: bogus} {x;}}
! 179: do_test capi2-3.5 {
! 180: set rc [catch {
! 181: sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL
! 182: } msg]
! 183: lappend rc $msg $TAIL
! 184: } {1 {(1) no such column: bogus} {;;x;}}
! 185: do_test capi2-3.6 {
! 186: set rc [catch {
! 187: sqlite3_prepare $DB {select 5/0} -1 TAIL
! 188: } VM]
! 189: lappend rc $TAIL
! 190: } {0 {}}
! 191: do_test capi2-3.7 {
! 192: list [sqlite3_step $VM] \
! 193: [sqlite3_column_count $VM] \
! 194: [get_row_values $VM] \
! 195: [get_column_names $VM]
! 196: } {SQLITE_ROW 1 {{}} {5/0 {}}}
! 197: do_test capi2-3.8 {
! 198: sqlite3_finalize $VM
! 199: } {SQLITE_OK}
! 200: do_test capi2-3.9 {
! 201: execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
! 202: set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL]
! 203: set TAIL
! 204: } {}
! 205: do_test capi2-3.9b {db changes} {0}
! 206: do_test capi2-3.10 {
! 207: list [sqlite3_step $VM] \
! 208: [sqlite3_column_count $VM] \
! 209: [get_row_values $VM] \
! 210: [get_column_names $VM]
! 211: } {SQLITE_DONE 0 {} {}}
! 212:
! 213: # Update for v3 - the change has not actually happened until the query is
! 214: # finalized. Is this going to cause trouble for anyone? Lee Nelson maybe?
! 215: # (Later:) The change now happens just before SQLITE_DONE is returned.
! 216: do_test capi2-3.10b {db changes} {1}
! 217: do_test capi2-3.11 {
! 218: sqlite3_finalize $VM
! 219: } {SQLITE_OK}
! 220: do_test capi2-3.11b {db changes} {1}
! 221: #do_test capi2-3.12-misuse {
! 222: # sqlite3_finalize $VM
! 223: #} {SQLITE_MISUSE}
! 224: do_test capi2-3.13 {
! 225: set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL]
! 226: list [sqlite3_step $VM] \
! 227: [sqlite3_column_count $VM] \
! 228: [get_row_values $VM] \
! 229: [get_column_names $VM]
! 230: } {SQLITE_ERROR 0 {} {}}
! 231:
! 232: # Update for v3: Preparing a statement does not affect the change counter.
! 233: # (Test result changes from 0 to 1). (Later:) change counter updates occur
! 234: # when sqlite3_step returns, not at finalize time.
! 235: do_test capi2-3.13b {db changes} {0}
! 236:
! 237: do_test capi2-3.14 {
! 238: list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
! 239: } {SQLITE_CONSTRAINT {column a is not unique}}
! 240: do_test capi2-3.15 {
! 241: set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL]
! 242: set TAIL
! 243: } {}
! 244: do_test capi2-3.16 {
! 245: list [sqlite3_step $VM] \
! 246: [sqlite3_column_count $VM] \
! 247: [get_row_values $VM] \
! 248: [get_column_names $VM]
! 249: } {SQLITE_DONE 0 {} {}}
! 250: do_test capi2-3.17 {
! 251: list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
! 252: } {SQLITE_OK {not an error}}
! 253: do_test capi2-3.18 {
! 254: set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL]
! 255: list [sqlite3_step $VM] \
! 256: [sqlite3_column_count $VM] \
! 257: [get_row_values $VM] \
! 258: [get_column_names $VM]
! 259: } {SQLITE_ERROR 0 {} {}}
! 260: do_test capi2-3.19 {
! 261: list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
! 262: } {SQLITE_CONSTRAINT {t2.a may not be NULL}}
! 263:
! 264: do_test capi2-3.20 {
! 265: execsql {
! 266: CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) );
! 267: INSERT INTO a1 VALUES(1, 1);
! 268: }
! 269: } {}
! 270: do_test capi2-3.21 {
! 271: set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL]
! 272: sqlite3_step $VM
! 273: } {SQLITE_ERROR}
! 274: do_test capi2-3.22 {
! 275: sqlite3_errcode $DB
! 276: } {SQLITE_ERROR}
! 277: do_test capi2-3.23 {
! 278: sqlite3_finalize $VM
! 279: } {SQLITE_CONSTRAINT}
! 280: do_test capi2-3.24 {
! 281: sqlite3_errcode $DB
! 282: } {SQLITE_CONSTRAINT}
! 283:
! 284: # Two or more virtual machines exists at the same time.
! 285: #
! 286: do_test capi2-4.1 {
! 287: set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL]
! 288: set TAIL
! 289: } {}
! 290: do_test capi2-4.2 {
! 291: set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
! 292: set TAIL
! 293: } {}
! 294: do_test capi2-4.3 {
! 295: set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL]
! 296: set TAIL
! 297: } {}
! 298: do_test capi2-4.4 {
! 299: list [sqlite3_step $VM2] \
! 300: [sqlite3_column_count $VM2] \
! 301: [get_row_values $VM2] \
! 302: [get_column_names $VM2]
! 303: } {SQLITE_DONE 0 {} {}}
! 304: do_test capi2-4.5 {
! 305: execsql {SELECT * FROM t2 ORDER BY a}
! 306: } {2 3}
! 307: do_test capi2-4.6 {
! 308: sqlite3_finalize $VM2
! 309: } {SQLITE_OK}
! 310: do_test capi2-4.7 {
! 311: list [sqlite3_step $VM3] \
! 312: [sqlite3_column_count $VM3] \
! 313: [get_row_values $VM3] \
! 314: [get_column_names $VM3]
! 315: } {SQLITE_DONE 0 {} {}}
! 316: do_test capi2-4.8 {
! 317: execsql {SELECT * FROM t2 ORDER BY a}
! 318: } {2 3 3 4}
! 319: do_test capi2-4.9 {
! 320: sqlite3_finalize $VM3
! 321: } {SQLITE_OK}
! 322: do_test capi2-4.10 {
! 323: list [sqlite3_step $VM1] \
! 324: [sqlite3_column_count $VM1] \
! 325: [get_row_values $VM1] \
! 326: [get_column_names $VM1]
! 327: } {SQLITE_DONE 0 {} {}}
! 328: do_test capi2-4.11 {
! 329: execsql {SELECT * FROM t2 ORDER BY a}
! 330: } {1 2 2 3 3 4}
! 331: do_test capi2-4.12 {
! 332: sqlite3_finalize $VM1
! 333: } {SQLITE_OK}
! 334:
! 335: # Interleaved SELECTs
! 336: #
! 337: do_test capi2-5.1 {
! 338: set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
! 339: set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
! 340: set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
! 341: list [sqlite3_step $VM1] \
! 342: [sqlite3_column_count $VM1] \
! 343: [get_row_values $VM1] \
! 344: [get_column_names $VM1]
! 345: } {SQLITE_ROW 2 {2 3} {a b {} {}}}
! 346: do_test capi2-5.2 {
! 347: list [sqlite3_step $VM2] \
! 348: [sqlite3_column_count $VM2] \
! 349: [get_row_values $VM2] \
! 350: [get_column_names $VM2]
! 351: } {SQLITE_ROW 2 {2 3} {a b {} {}}}
! 352: do_test capi2-5.3 {
! 353: list [sqlite3_step $VM1] \
! 354: [sqlite3_column_count $VM1] \
! 355: [get_row_values $VM1] \
! 356: [get_column_names $VM1]
! 357: } {SQLITE_ROW 2 {3 4} {a b {} {}}}
! 358: do_test capi2-5.4 {
! 359: list [sqlite3_step $VM3] \
! 360: [sqlite3_column_count $VM3] \
! 361: [get_row_values $VM3] \
! 362: [get_column_names $VM3]
! 363: } {SQLITE_ROW 2 {2 3} {a b {} {}}}
! 364: do_test capi2-5.5 {
! 365: list [sqlite3_step $VM3] \
! 366: [sqlite3_column_count $VM3] \
! 367: [get_row_values $VM3] \
! 368: [get_column_names $VM3]
! 369: } {SQLITE_ROW 2 {3 4} {a b {} {}}}
! 370: do_test capi2-5.6 {
! 371: list [sqlite3_step $VM3] \
! 372: [sqlite3_column_count $VM3] \
! 373: [get_row_values $VM3] \
! 374: [get_column_names $VM3]
! 375: } {SQLITE_ROW 2 {1 2} {a b {} {}}}
! 376: do_test capi2-5.7 {
! 377: list [sqlite3_step $VM3] \
! 378: [sqlite3_column_count $VM3] \
! 379: [get_row_values $VM3] \
! 380: [get_column_names $VM3]
! 381: } {SQLITE_DONE 2 {} {a b {} {}}}
! 382: do_test capi2-5.8 {
! 383: sqlite3_finalize $VM3
! 384: } {SQLITE_OK}
! 385: do_test capi2-5.9 {
! 386: list [sqlite3_step $VM1] \
! 387: [sqlite3_column_count $VM1] \
! 388: [get_row_values $VM1] \
! 389: [get_column_names $VM1]
! 390: } {SQLITE_ROW 2 {1 2} {a b {} {}}}
! 391: do_test capi2-5.10 {
! 392: sqlite3_finalize $VM1
! 393: } {SQLITE_OK}
! 394: do_test capi2-5.11 {
! 395: list [sqlite3_step $VM2] \
! 396: [sqlite3_column_count $VM2] \
! 397: [get_row_values $VM2] \
! 398: [get_column_names $VM2]
! 399: } {SQLITE_ROW 2 {3 4} {a b {} {}}}
! 400: do_test capi2-5.12 {
! 401: list [sqlite3_step $VM2] \
! 402: [sqlite3_column_count $VM2] \
! 403: [get_row_values $VM2] \
! 404: [get_column_names $VM2]
! 405: } {SQLITE_ROW 2 {1 2} {a b {} {}}}
! 406: do_test capi2-5.11 {
! 407: sqlite3_finalize $VM2
! 408: } {SQLITE_OK}
! 409:
! 410: # Check for proper SQLITE_BUSY returns.
! 411: #
! 412: do_test capi2-6.1 {
! 413: execsql {
! 414: BEGIN;
! 415: CREATE TABLE t3(x counter);
! 416: INSERT INTO t3 VALUES(1);
! 417: INSERT INTO t3 VALUES(2);
! 418: INSERT INTO t3 SELECT x+2 FROM t3;
! 419: INSERT INTO t3 SELECT x+4 FROM t3;
! 420: INSERT INTO t3 SELECT x+8 FROM t3;
! 421: COMMIT;
! 422: }
! 423: set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
! 424: sqlite3 db2 test.db
! 425: execsql {BEGIN} db2
! 426: } {}
! 427: # Update for v3: BEGIN doesn't write-lock the database. It is quite
! 428: # difficult to get v3 to write-lock the database, which causes a few
! 429: # problems for test scripts.
! 430: #
! 431: # do_test capi2-6.2 {
! 432: # list [sqlite3_step $VM1] \
! 433: # [sqlite3_column_count $VM1] \
! 434: # [get_row_values $VM1] \
! 435: # [get_column_names $VM1]
! 436: # } {SQLITE_BUSY 0 {} {}}
! 437: do_test capi2-6.3 {
! 438: execsql {COMMIT} db2
! 439: } {}
! 440: do_test capi2-6.4 {
! 441: list [sqlite3_step $VM1] \
! 442: [sqlite3_column_count $VM1] \
! 443: [get_row_values $VM1] \
! 444: [get_column_names $VM1]
! 445: } {SQLITE_ROW 1 1 {x counter}}
! 446: do_test capi2-6.5 {
! 447: catchsql {INSERT INTO t3 VALUES(10);} db2
! 448: } {1 {database is locked}}
! 449: do_test capi2-6.6 {
! 450: list [sqlite3_step $VM1] \
! 451: [sqlite3_column_count $VM1] \
! 452: [get_row_values $VM1] \
! 453: [get_column_names $VM1]
! 454: } {SQLITE_ROW 1 2 {x counter}}
! 455: do_test capi2-6.7 {
! 456: execsql {SELECT * FROM t2} db2
! 457: } {2 3 3 4 1 2}
! 458: do_test capi2-6.8 {
! 459: list [sqlite3_step $VM1] \
! 460: [sqlite3_column_count $VM1] \
! 461: [get_row_values $VM1] \
! 462: [get_column_names $VM1]
! 463: } {SQLITE_ROW 1 3 {x counter}}
! 464: do_test capi2-6.9 {
! 465: execsql {SELECT * FROM t2}
! 466: } {2 3 3 4 1 2}
! 467: do_test capi2-6.10 {
! 468: list [sqlite3_step $VM1] \
! 469: [sqlite3_column_count $VM1] \
! 470: [get_row_values $VM1] \
! 471: [get_column_names $VM1]
! 472: } {SQLITE_ROW 1 4 {x counter}}
! 473: do_test capi2-6.11 {
! 474: execsql {BEGIN}
! 475: } {}
! 476: do_test capi2-6.12 {
! 477: list [sqlite3_step $VM1] \
! 478: [sqlite3_column_count $VM1] \
! 479: [get_row_values $VM1] \
! 480: [get_column_names $VM1]
! 481: } {SQLITE_ROW 1 5 {x counter}}
! 482:
! 483: # A read no longer blocks a write in the same connection.
! 484: #do_test capi2-6.13 {
! 485: # catchsql {UPDATE t3 SET x=x+1}
! 486: #} {1 {database table is locked}}
! 487:
! 488: do_test capi2-6.14 {
! 489: list [sqlite3_step $VM1] \
! 490: [sqlite3_column_count $VM1] \
! 491: [get_row_values $VM1] \
! 492: [get_column_names $VM1]
! 493: } {SQLITE_ROW 1 6 {x counter}}
! 494: do_test capi2-6.15 {
! 495: execsql {SELECT * FROM t1}
! 496: } {1 2 3}
! 497: do_test capi2-6.16 {
! 498: list [sqlite3_step $VM1] \
! 499: [sqlite3_column_count $VM1] \
! 500: [get_row_values $VM1] \
! 501: [get_column_names $VM1]
! 502: } {SQLITE_ROW 1 7 {x counter}}
! 503: do_test capi2-6.17 {
! 504: catchsql {UPDATE t1 SET b=b+1}
! 505: } {0 {}}
! 506: do_test capi2-6.18 {
! 507: list [sqlite3_step $VM1] \
! 508: [sqlite3_column_count $VM1] \
! 509: [get_row_values $VM1] \
! 510: [get_column_names $VM1]
! 511: } {SQLITE_ROW 1 8 {x counter}}
! 512: do_test capi2-6.19 {
! 513: execsql {SELECT * FROM t1}
! 514: } {1 3 3}
! 515: do_test capi2-6.20 {
! 516: list [sqlite3_step $VM1] \
! 517: [sqlite3_column_count $VM1] \
! 518: [get_row_values $VM1] \
! 519: [get_column_names $VM1]
! 520: } {SQLITE_ROW 1 9 {x counter}}
! 521: #do_test capi2-6.21 {
! 522: # execsql {ROLLBACK; SELECT * FROM t1}
! 523: #} {1 2 3}
! 524: do_test capi2-6.22 {
! 525: list [sqlite3_step $VM1] \
! 526: [sqlite3_column_count $VM1] \
! 527: [get_row_values $VM1] \
! 528: [get_column_names $VM1]
! 529: } {SQLITE_ROW 1 10 {x counter}}
! 530: #do_test capi2-6.23 {
! 531: # execsql {BEGIN TRANSACTION;}
! 532: #} {}
! 533: do_test capi2-6.24 {
! 534: list [sqlite3_step $VM1] \
! 535: [sqlite3_column_count $VM1] \
! 536: [get_row_values $VM1] \
! 537: [get_column_names $VM1]
! 538: } {SQLITE_ROW 1 11 {x counter}}
! 539: do_test capi2-6.25 {
! 540: execsql {
! 541: INSERT INTO t1 VALUES(2,3,4);
! 542: SELECT * FROM t1;
! 543: }
! 544: } {1 3 3 2 3 4}
! 545: do_test capi2-6.26 {
! 546: list [sqlite3_step $VM1] \
! 547: [sqlite3_column_count $VM1] \
! 548: [get_row_values $VM1] \
! 549: [get_column_names $VM1]
! 550: } {SQLITE_ROW 1 12 {x counter}}
! 551: do_test capi2-6.27 {
! 552: catchsql {
! 553: INSERT INTO t1 VALUES(2,4,5);
! 554: SELECT * FROM t1;
! 555: }
! 556: } {1 {column a is not unique}}
! 557: do_test capi2-6.28 {
! 558: list [sqlite3_step $VM1] \
! 559: [sqlite3_column_count $VM1] \
! 560: [get_row_values $VM1] \
! 561: [get_column_names $VM1]
! 562: } {SQLITE_ROW 1 13 {x counter}}
! 563: do_test capi2-6.99 {
! 564: sqlite3_finalize $VM1
! 565: } {SQLITE_OK}
! 566: catchsql {ROLLBACK}
! 567:
! 568: do_test capi2-7.1 {
! 569: stepsql $DB {
! 570: SELECT * FROM t1
! 571: }
! 572: } {0 1 2 3}
! 573: do_test capi2-7.2 {
! 574: stepsql $DB {
! 575: PRAGMA count_changes=on
! 576: }
! 577: } {0}
! 578: do_test capi2-7.3 {
! 579: stepsql $DB {
! 580: UPDATE t1 SET a=a+10;
! 581: }
! 582: } {0 1}
! 583: do_test capi2-7.4 {
! 584: stepsql $DB {
! 585: INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1;
! 586: }
! 587: } {0 1}
! 588: do_test capi2-7.4b {sqlite3_changes $DB} {1}
! 589: do_test capi2-7.5 {
! 590: stepsql $DB {
! 591: UPDATE t1 SET a=a+10;
! 592: }
! 593: } {0 2}
! 594: do_test capi2-7.5b {sqlite3_changes $DB} {2}
! 595: do_test capi2-7.6 {
! 596: stepsql $DB {
! 597: SELECT * FROM t1;
! 598: }
! 599: } {0 21 2 3 22 3 4}
! 600: do_test capi2-7.7 {
! 601: stepsql $DB {
! 602: INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1;
! 603: }
! 604: } {0 2}
! 605: do_test capi2-7.8 {
! 606: sqlite3_changes $DB
! 607: } {2}
! 608: do_test capi2-7.9 {
! 609: stepsql $DB {
! 610: SELECT * FROM t1;
! 611: }
! 612: } {0 21 2 3 22 3 4 23 4 5 24 5 6}
! 613: do_test capi2-7.10 {
! 614: stepsql $DB {
! 615: UPDATE t1 SET a=a-20;
! 616: SELECT * FROM t1;
! 617: }
! 618: } {0 4 1 2 3 2 3 4 3 4 5 4 5 6}
! 619:
! 620: # Update for version 3: A SELECT statement no longer resets the change
! 621: # counter (Test result changes from 0 to 4).
! 622: do_test capi2-7.11 {
! 623: sqlite3_changes $DB
! 624: } {4}
! 625: do_test capi2-7.11a {
! 626: execsql {SELECT count(*) FROM t1}
! 627: } {4}
! 628:
! 629: ifcapable {explain} {
! 630: do_test capi2-7.12 {
! 631: set x [stepsql $DB {EXPLAIN SELECT * FROM t1}]
! 632: lindex $x 0
! 633: } {0}
! 634: }
! 635:
! 636: # Ticket #261 - make sure we can finalize before the end of a query.
! 637: #
! 638: do_test capi2-8.1 {
! 639: set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
! 640: sqlite3_finalize $VM1
! 641: } {SQLITE_OK}
! 642:
! 643: # Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare
! 644: # and all of the return pointers in sqlite_step can be null.
! 645: #
! 646: do_test capi2-9.1 {
! 647: set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY]
! 648: sqlite3_step $VM1
! 649: sqlite3_finalize $VM1
! 650: } {SQLITE_OK}
! 651:
! 652: # Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset
! 653: # does not cause an error.
! 654: do_test capi2-10.1 {
! 655: sqlite3_finalize 0
! 656: } {SQLITE_OK}
! 657: do_test capi2-10.2 {
! 658: sqlite3_reset 0
! 659: } {SQLITE_OK}
! 660:
! 661: #---------------------------------------------------------------------------
! 662: # The following tests - capi2-11.* - test the "column origin" APIs.
! 663: #
! 664: # sqlite3_column_origin_name()
! 665: # sqlite3_column_database_name()
! 666: # sqlite3_column_table_name()
! 667: #
! 668:
! 669: ifcapable columnmetadata {
! 670:
! 671: # This proc uses the database handle $::DB to compile the SQL statement passed
! 672: # as a parameter. The return value of this procedure is a list with one
! 673: # element for each column returned by the compiled statement. Each element of
! 674: # this list is itself a list of length three, consisting of the origin
! 675: # database, table and column for the corresponding returned column.
! 676: proc check_origins {sql} {
! 677: set ret [list]
! 678: set ::STMT [sqlite3_prepare $::DB $sql -1 dummy]
! 679: for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} {
! 680: lappend ret [list \
! 681: [sqlite3_column_database_name $::STMT $i] \
! 682: [sqlite3_column_table_name $::STMT $i] \
! 683: [sqlite3_column_origin_name $::STMT $i] \
! 684: ]
! 685: }
! 686: sqlite3_finalize $::STMT
! 687: return $ret
! 688: }
! 689: do_test capi2-11.1 {
! 690: execsql {
! 691: CREATE TABLE tab1(col1, col2);
! 692: }
! 693: } {}
! 694: do_test capi2-11.2 {
! 695: check_origins {SELECT col2, col1 FROM tab1}
! 696: } [list {main tab1 col2} {main tab1 col1}]
! 697: do_test capi2-11.3 {
! 698: check_origins {SELECT col2 AS hello, col1 AS world FROM tab1}
! 699: } [list {main tab1 col2} {main tab1 col1}]
! 700:
! 701: ifcapable subquery {
! 702: do_test capi2-11.4 {
! 703: check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM tab1)}
! 704: } [list {main tab1 col2} {main tab1 col1}]
! 705: do_test capi2-11.5 {
! 706: check_origins {SELECT (SELECT col2 FROM tab1), (SELECT col1 FROM tab1)}
! 707: } [list {main tab1 col2} {main tab1 col1}]
! 708: do_test capi2-11.6 {
! 709: check_origins {SELECT (SELECT col2), (SELECT col1) FROM tab1}
! 710: } [list {main tab1 col2} {main tab1 col1}]
! 711: do_test capi2-11.7 {
! 712: check_origins {SELECT * FROM tab1}
! 713: } [list {main tab1 col1} {main tab1 col2}]
! 714: do_test capi2-11.8 {
! 715: check_origins {SELECT * FROM (SELECT * FROM tab1)}
! 716: } [list {main tab1 col1} {main tab1 col2}]
! 717: }
! 718:
! 719: ifcapable view&&subquery {
! 720: do_test capi2-12.1 {
! 721: execsql {
! 722: CREATE VIEW view1 AS SELECT * FROM tab1;
! 723: }
! 724: } {}
! 725: do_test capi2-12.2 {
! 726: check_origins {SELECT col2, col1 FROM view1}
! 727: } [list {main tab1 col2} {main tab1 col1}]
! 728: do_test capi2-12.3 {
! 729: check_origins {SELECT col2 AS hello, col1 AS world FROM view1}
! 730: } [list {main tab1 col2} {main tab1 col1}]
! 731: do_test capi2-12.4 {
! 732: check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view1)}
! 733: } [list {main tab1 col2} {main tab1 col1}]
! 734: do_test capi2-12.5 {
! 735: check_origins {SELECT (SELECT col2 FROM view1), (SELECT col1 FROM view1)}
! 736: } [list {main tab1 col2} {main tab1 col1}]
! 737: do_test capi2-12.6 {
! 738: check_origins {SELECT (SELECT col2), (SELECT col1) FROM view1}
! 739: } [list {main tab1 col2} {main tab1 col1}]
! 740: do_test capi2-12.7 {
! 741: check_origins {SELECT * FROM view1}
! 742: } [list {main tab1 col1} {main tab1 col2}]
! 743: do_test capi2-12.8 {
! 744: check_origins {select * from (select * from view1)}
! 745: } [list {main tab1 col1} {main tab1 col2}]
! 746: do_test capi2-12.9 {
! 747: check_origins {select * from (select * from (select * from view1))}
! 748: } [list {main tab1 col1} {main tab1 col2}]
! 749: do_test capi2-12.10 {
! 750: db close
! 751: sqlite3 db test.db
! 752: set ::DB [sqlite3_connection_pointer db]
! 753: check_origins {select * from (select * from (select * from view1))}
! 754: } [list {main tab1 col1} {main tab1 col2}]
! 755:
! 756: # This view will thwart the flattening optimization.
! 757: do_test capi2-13.1 {
! 758: execsql {
! 759: CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10;
! 760: }
! 761: } {}
! 762: do_test capi2-13.2 {
! 763: check_origins {SELECT col2, col1 FROM view2}
! 764: } [list {main tab1 col2} {main tab1 col1}]
! 765: do_test capi2-13.3 {
! 766: check_origins {SELECT col2 AS hello, col1 AS world FROM view2}
! 767: } [list {main tab1 col2} {main tab1 col1}]
! 768: do_test capi2-13.4 {
! 769: check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view2)}
! 770: } [list {main tab1 col2} {main tab1 col1}]
! 771: do_test capi2-13.5 {
! 772: check_origins {SELECT (SELECT col2 FROM view2), (SELECT col1 FROM view2)}
! 773: } [list {main tab1 col2} {main tab1 col1}]
! 774: do_test capi2-13.6 {
! 775: check_origins {SELECT (SELECT col2), (SELECT col1) FROM view2}
! 776: } [list {main tab1 col2} {main tab1 col1}]
! 777: do_test capi2-13.7 {
! 778: check_origins {SELECT * FROM view2}
! 779: } [list {main tab1 col1} {main tab1 col2}]
! 780: do_test capi2-13.8 {
! 781: check_origins {select * from (select * from view2)}
! 782: } [list {main tab1 col1} {main tab1 col2}]
! 783: do_test capi2-13.9 {
! 784: check_origins {select * from (select * from (select * from view2))}
! 785: } [list {main tab1 col1} {main tab1 col2}]
! 786: do_test capi2-13.10 {
! 787: db close
! 788: sqlite3 db test.db
! 789: set ::DB [sqlite3_connection_pointer db]
! 790: check_origins {select * from (select * from (select * from view2))}
! 791: } [list {main tab1 col1} {main tab1 col2}]
! 792: do_test capi2-13.11 {
! 793: check_origins {select * from (select * from tab1 limit 10 offset 10)}
! 794: } [list {main tab1 col1} {main tab1 col2}]
! 795: }
! 796:
! 797:
! 798: } ;# ifcapable columnmetadata
! 799:
! 800: db2 close
! 801: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>