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

1.1       misho       1: # 2003 January 29
                      2: #
                      3: # The author disclaims copyright to this source code.  In place of
                      4: # a legal notice, here is a blessing:
                      5: #
                      6: #    May you do good and not evil.
                      7: #    May you find forgiveness for yourself and forgive others.
                      8: #    May you share freely, never taking more than you give.
                      9: #
                     10: #***********************************************************************
                     11: # This file implements regression tests for SQLite library.  The
                     12: # focus of this script testing the callback-free C/C++ API.
                     13: #
                     14: # $Id: 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>