1326dce74Sdrh# 2003 January 29 2326dce74Sdrh# 3326dce74Sdrh# The author disclaims copyright to this source code. In place of 4326dce74Sdrh# a legal notice, here is a blessing: 5326dce74Sdrh# 6326dce74Sdrh# May you do good and not evil. 7326dce74Sdrh# May you find forgiveness for yourself and forgive others. 8326dce74Sdrh# May you share freely, never taking more than you give. 9326dce74Sdrh# 10326dce74Sdrh#*********************************************************************** 11326dce74Sdrh# This file implements regression tests for SQLite library. The 12326dce74Sdrh# focus of this script testing the callback-free C/C++ API. 13326dce74Sdrh# 1404bbcd5cSdrh# $Id: capi2.test,v 1.37 2008/12/30 17:55:00 drh Exp $ 15326dce74Sdrh# 16326dce74Sdrh 17326dce74Sdrhset testdir [file dirname $argv0] 18326dce74Sdrhsource $testdir/tester.tcl 19326dce74Sdrh 20fbcd585fSdanielk1977# Return the text values from the current row pointed at by STMT as a list. 21fbcd585fSdanielk1977proc get_row_values {STMT} { 22fbcd585fSdanielk1977 set VALUES [list] 23fbcd585fSdanielk1977 for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} { 24fbcd585fSdanielk1977 lappend VALUES [sqlite3_column_text $STMT $i] 25fbcd585fSdanielk1977 } 26fbcd585fSdanielk1977 return $VALUES 27fbcd585fSdanielk1977} 28fbcd585fSdanielk1977 29fbcd585fSdanielk1977# Return the column names followed by declaration types for the result set 30fbcd585fSdanielk1977# of the SQL statement STMT. 31fbcd585fSdanielk1977# 32fbcd585fSdanielk1977# i.e. for: 33fbcd585fSdanielk1977# CREATE TABLE abc(a text, b integer); 34fbcd585fSdanielk1977# SELECT * FROM abc; 35fbcd585fSdanielk1977# 36fbcd585fSdanielk1977# The result is {a b text integer} 37fbcd585fSdanielk1977proc get_column_names {STMT} { 38fbcd585fSdanielk1977 set VALUES [list] 39fbcd585fSdanielk1977 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 40fbcd585fSdanielk1977 lappend VALUES [sqlite3_column_name $STMT $i] 41fbcd585fSdanielk1977 } 42fbcd585fSdanielk1977 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 43fbcd585fSdanielk1977 lappend VALUES [sqlite3_column_decltype $STMT $i] 44fbcd585fSdanielk1977 } 45fbcd585fSdanielk1977 return $VALUES 46fbcd585fSdanielk1977} 47fbcd585fSdanielk1977 48326dce74Sdrh# Check basic functionality 49326dce74Sdrh# 50326dce74Sdrhdo_test capi2-1.1 { 51dddca286Sdrh set DB [sqlite3_connection_pointer db] 52326dce74Sdrh execsql {CREATE TABLE t1(a,b,c)} 534ad1713cSdanielk1977 set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL] 54483750baSdrh set TAIL 55326dce74Sdrh} {} 56326dce74Sdrhdo_test capi2-1.2 { 57fbcd585fSdanielk1977 sqlite3_step $VM 58326dce74Sdrh} {SQLITE_ROW} 59326dce74Sdrhdo_test capi2-1.3 { 60fbcd585fSdanielk1977 sqlite3_data_count $VM 61326dce74Sdrh} {2} 62326dce74Sdrhdo_test capi2-1.4 { 63fbcd585fSdanielk1977 get_row_values $VM 64326dce74Sdrh} {t1 1} 65326dce74Sdrhdo_test capi2-1.5 { 66fbcd585fSdanielk1977 get_column_names $VM 67*c2df4d6aSdrh} {name rowid TEXT INTEGER} 68326dce74Sdrhdo_test capi2-1.6 { 69fbcd585fSdanielk1977 sqlite3_step $VM 70326dce74Sdrh} {SQLITE_DONE} 71326dce74Sdrhdo_test capi2-1.7 { 72fbcd585fSdanielk1977 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 73*c2df4d6aSdrh} {2 {} {name rowid TEXT INTEGER}} 743674bfd1Sdrh 753674bfd1Sdrh# This used to be SQLITE_MISUSE. But now we automatically reset prepared 763674bfd1Sdrh# statements. 77602acb48Sdrhifcapable autoreset { 783674bfd1Sdrh do_test capi2-1.8 { 79fbcd585fSdanielk1977 sqlite3_step $VM 803674bfd1Sdrh } {SQLITE_ROW} 81602acb48Sdrh} else { 82602acb48Sdrh do_test capi2-1.8 { 83602acb48Sdrh sqlite3_step $VM 84602acb48Sdrh } {SQLITE_MISUSE} 85602acb48Sdrh} 86fbcd585fSdanielk1977 87fbcd585fSdanielk1977# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot 88fbcd585fSdanielk1977# be interrogated for more information. However in v3, since the column 89fbcd585fSdanielk1977# count, names and types are determined at compile time, these are still 90fbcd585fSdanielk1977# accessible after an SQLITE_MISUSE error. 91326dce74Sdrhdo_test capi2-1.9 { 923674bfd1Sdrh sqlite3_reset $VM 93fbcd585fSdanielk1977 list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] 94*c2df4d6aSdrh} {2 {} {name rowid TEXT INTEGER}} 95326dce74Sdrhdo_test capi2-1.10 { 96fbcd585fSdanielk1977 sqlite3_data_count $VM 97fbcd585fSdanielk1977} {0} 98fbcd585fSdanielk1977 99fbcd585fSdanielk1977do_test capi2-1.11 { 100106bb236Sdanielk1977 sqlite3_finalize $VM 101fbcd585fSdanielk1977} {SQLITE_OK} 102326dce74Sdrh 103326dce74Sdrh# Check to make sure that the "tail" of a multi-statement SQL script 1044ad1713cSdanielk1977# is returned by sqlite3_prepare. 105326dce74Sdrh# 106326dce74Sdrhdo_test capi2-2.1 { 107483750baSdrh set SQL { 108326dce74Sdrh SELECT name, rowid FROM sqlite_master; 10953c0f748Sdanielk1977 SELECT name, rowid FROM sqlite_master WHERE 0; 110326dce74Sdrh -- A comment at the end 111326dce74Sdrh } 1124ad1713cSdanielk1977 set VM [sqlite3_prepare $DB $SQL -1 SQL] 113483750baSdrh set SQL 114326dce74Sdrh} { 11553c0f748Sdanielk1977 SELECT name, rowid FROM sqlite_master WHERE 0; 116326dce74Sdrh -- A comment at the end 117326dce74Sdrh } 118326dce74Sdrhdo_test capi2-2.2 { 119fbcd585fSdanielk1977 set r [sqlite3_step $VM] 120fbcd585fSdanielk1977 lappend r [sqlite3_column_count $VM] \ 121fbcd585fSdanielk1977 [get_row_values $VM] \ 122fbcd585fSdanielk1977 [get_column_names $VM] 123*c2df4d6aSdrh} {SQLITE_ROW 2 {t1 1} {name rowid TEXT INTEGER}} 124326dce74Sdrhdo_test capi2-2.3 { 125fbcd585fSdanielk1977 set r [sqlite3_step $VM] 126fbcd585fSdanielk1977 lappend r [sqlite3_column_count $VM] \ 127fbcd585fSdanielk1977 [get_row_values $VM] \ 128fbcd585fSdanielk1977 [get_column_names $VM] 129*c2df4d6aSdrh} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}} 130326dce74Sdrhdo_test capi2-2.4 { 131106bb236Sdanielk1977 sqlite3_finalize $VM 132fbcd585fSdanielk1977} {SQLITE_OK} 133326dce74Sdrhdo_test capi2-2.5 { 1344ad1713cSdanielk1977 set VM [sqlite3_prepare $DB $SQL -1 SQL] 135483750baSdrh set SQL 136326dce74Sdrh} { 137326dce74Sdrh -- A comment at the end 138326dce74Sdrh } 139326dce74Sdrhdo_test capi2-2.6 { 140fbcd585fSdanielk1977 set r [sqlite3_step $VM] 141fbcd585fSdanielk1977 lappend r [sqlite3_column_count $VM] \ 142fbcd585fSdanielk1977 [get_row_values $VM] \ 143fbcd585fSdanielk1977 [get_column_names $VM] 144*c2df4d6aSdrh} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}} 145326dce74Sdrhdo_test capi2-2.7 { 146106bb236Sdanielk1977 sqlite3_finalize $VM 147fbcd585fSdanielk1977} {SQLITE_OK} 148326dce74Sdrhdo_test capi2-2.8 { 1494ad1713cSdanielk1977 set VM [sqlite3_prepare $DB $SQL -1 SQL] 150483750baSdrh list $SQL $VM 151326dce74Sdrh} {{} {}} 152326dce74Sdrh 153483750baSdrh# Check the error handling. 154483750baSdrh# 155483750baSdrhdo_test capi2-3.1 { 156483750baSdrh set rc [catch { 1574ad1713cSdanielk1977 sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL 158483750baSdrh } msg] 159483750baSdrh lappend rc $msg $TAIL 160483750baSdrh} {1 {(1) no such column: bogus} {}} 161483750baSdrhdo_test capi2-3.2 { 162483750baSdrh set rc [catch { 1634ad1713cSdanielk1977 sqlite3_prepare $DB {select bogus from } -1 TAIL 164483750baSdrh } msg] 165483750baSdrh lappend rc $msg $TAIL 1666116ee4eSdrh} {1 {(1) incomplete input} {}} 167483750baSdrhdo_test capi2-3.3 { 168483750baSdrh set rc [catch { 1694ad1713cSdanielk1977 sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL 170483750baSdrh } msg] 171483750baSdrh lappend rc $msg $TAIL 172483750baSdrh} {1 {(1) no such column: bogus} {}} 173483750baSdrhdo_test capi2-3.4 { 174483750baSdrh set rc [catch { 1754ad1713cSdanielk1977 sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL 176483750baSdrh } msg] 177483750baSdrh lappend rc $msg $TAIL 178483750baSdrh} {1 {(1) no such column: bogus} {x;}} 179483750baSdrhdo_test capi2-3.5 { 180483750baSdrh set rc [catch { 1814ad1713cSdanielk1977 sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL 182483750baSdrh } msg] 183483750baSdrh lappend rc $msg $TAIL 184483750baSdrh} {1 {(1) no such column: bogus} {;;x;}} 185483750baSdrhdo_test capi2-3.6 { 186483750baSdrh set rc [catch { 1879b2e0435Sdrh sqlite3_prepare $DB {select 5/0;} -1 TAIL 188483750baSdrh } VM] 189483750baSdrh lappend rc $TAIL 190483750baSdrh} {0 {}} 191483750baSdrhdo_test capi2-3.7 { 192fbcd585fSdanielk1977 list [sqlite3_step $VM] \ 193fbcd585fSdanielk1977 [sqlite3_column_count $VM] \ 194fbcd585fSdanielk1977 [get_row_values $VM] \ 195fbcd585fSdanielk1977 [get_column_names $VM] 19600e279d9Sdanielk1977} {SQLITE_ROW 1 {{}} {5/0 {}}} 197483750baSdrhdo_test capi2-3.8 { 198106bb236Sdanielk1977 sqlite3_finalize $VM 199fbcd585fSdanielk1977} {SQLITE_OK} 200483750baSdrhdo_test capi2-3.9 { 201483750baSdrh execsql {CREATE UNIQUE INDEX i1 ON t1(a)} 2024ad1713cSdanielk1977 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL] 203483750baSdrh set TAIL 204483750baSdrh} {} 2052299706cSdrhdo_test capi2-3.9b {db changes} {0} 206483750baSdrhdo_test capi2-3.10 { 207fbcd585fSdanielk1977 list [sqlite3_step $VM] \ 208fbcd585fSdanielk1977 [sqlite3_column_count $VM] \ 209fbcd585fSdanielk1977 [get_row_values $VM] \ 210fbcd585fSdanielk1977 [get_column_names $VM] 211483750baSdrh} {SQLITE_DONE 0 {} {}} 212fbcd585fSdanielk1977 213fbcd585fSdanielk1977# Update for v3 - the change has not actually happened until the query is 214fbcd585fSdanielk1977# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe? 21592f02c31Sdrh# (Later:) The change now happens just before SQLITE_DONE is returned. 21692f02c31Sdrhdo_test capi2-3.10b {db changes} {1} 217483750baSdrhdo_test capi2-3.11 { 218106bb236Sdanielk1977 sqlite3_finalize $VM 219fbcd585fSdanielk1977} {SQLITE_OK} 220b28af71aSdanielk1977do_test capi2-3.11b {db changes} {1} 22186f8c197Sdrh#do_test capi2-3.12-misuse { 22286f8c197Sdrh# sqlite3_finalize $VM 22386f8c197Sdrh#} {SQLITE_MISUSE} 224483750baSdrhdo_test capi2-3.13 { 2254ad1713cSdanielk1977 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL] 226fbcd585fSdanielk1977 list [sqlite3_step $VM] \ 227fbcd585fSdanielk1977 [sqlite3_column_count $VM] \ 228fbcd585fSdanielk1977 [get_row_values $VM] \ 229fbcd585fSdanielk1977 [get_column_names $VM] 230483750baSdrh} {SQLITE_ERROR 0 {} {}} 231b28af71aSdanielk1977 232b28af71aSdanielk1977# Update for v3: Preparing a statement does not affect the change counter. 23392f02c31Sdrh# (Test result changes from 0 to 1). (Later:) change counter updates occur 23492f02c31Sdrh# when sqlite3_step returns, not at finalize time. 23592f02c31Sdrhdo_test capi2-3.13b {db changes} {0} 236b28af71aSdanielk1977 237483750baSdrhdo_test capi2-3.14 { 238433dccfbSdrh list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] \ 239433dccfbSdrh [sqlite3_extended_errcode $DB] 240f9c8ce3cSdrh} {SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.a} SQLITE_CONSTRAINT_UNIQUE} 2413a84069dSdrhdo_test capi2-3.15 { 2424ad1713cSdanielk1977 set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL] 2433a84069dSdrh set TAIL 2443a84069dSdrh} {} 2453a84069dSdrhdo_test capi2-3.16 { 246fbcd585fSdanielk1977 list [sqlite3_step $VM] \ 247fbcd585fSdanielk1977 [sqlite3_column_count $VM] \ 248fbcd585fSdanielk1977 [get_row_values $VM] \ 249fbcd585fSdanielk1977 [get_column_names $VM] 2503a84069dSdrh} {SQLITE_DONE 0 {} {}} 2513a84069dSdrhdo_test capi2-3.17 { 252fbcd585fSdanielk1977 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] 253fbcd585fSdanielk1977} {SQLITE_OK {not an error}} 2543a84069dSdrhdo_test capi2-3.18 { 2554ad1713cSdanielk1977 set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL] 256fbcd585fSdanielk1977 list [sqlite3_step $VM] \ 257fbcd585fSdanielk1977 [sqlite3_column_count $VM] \ 258fbcd585fSdanielk1977 [get_row_values $VM] \ 259fbcd585fSdanielk1977 [get_column_names $VM] 2603a84069dSdrh} {SQLITE_ERROR 0 {} {}} 2613a84069dSdrhdo_test capi2-3.19 { 262433dccfbSdrh list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] \ 263433dccfbSdrh [sqlite3_extended_errcode $DB] 264f9c8ce3cSdrh} {SQLITE_CONSTRAINT {NOT NULL constraint failed: t2.a} SQLITE_CONSTRAINT_NOTNULL} 265483750baSdrh 2666a67fe8eSdanielk1977do_test capi2-3.20 { 2676a67fe8eSdanielk1977 execsql { 2686a67fe8eSdanielk1977 CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) ); 2696a67fe8eSdanielk1977 INSERT INTO a1 VALUES(1, 1); 2706a67fe8eSdanielk1977 } 2716a67fe8eSdanielk1977} {} 2726a67fe8eSdanielk1977do_test capi2-3.21 { 2736a67fe8eSdanielk1977 set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL] 2746a67fe8eSdanielk1977 sqlite3_step $VM 2756a67fe8eSdanielk1977} {SQLITE_ERROR} 2766a67fe8eSdanielk1977do_test capi2-3.22 { 2776a67fe8eSdanielk1977 sqlite3_errcode $DB 2786a67fe8eSdanielk1977} {SQLITE_ERROR} 2796a67fe8eSdanielk1977do_test capi2-3.23 { 2806a67fe8eSdanielk1977 sqlite3_finalize $VM 2816a67fe8eSdanielk1977} {SQLITE_CONSTRAINT} 2826a67fe8eSdanielk1977do_test capi2-3.24 { 283433dccfbSdrh list [sqlite3_errcode $DB] [sqlite3_extended_errcode $DB] 284433dccfbSdrh} {SQLITE_CONSTRAINT SQLITE_CONSTRAINT_UNIQUE} 2856a67fe8eSdanielk1977 2863a84069dSdrh# Two or more virtual machines exists at the same time. 2873a84069dSdrh# 2883a84069dSdrhdo_test capi2-4.1 { 2894ad1713cSdanielk1977 set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL] 2903a84069dSdrh set TAIL 2913a84069dSdrh} {} 2923a84069dSdrhdo_test capi2-4.2 { 2934ad1713cSdanielk1977 set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] 2943a84069dSdrh set TAIL 2953a84069dSdrh} {} 2963a84069dSdrhdo_test capi2-4.3 { 2974ad1713cSdanielk1977 set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL] 2983a84069dSdrh set TAIL 2993a84069dSdrh} {} 3003a84069dSdrhdo_test capi2-4.4 { 301fbcd585fSdanielk1977 list [sqlite3_step $VM2] \ 302fbcd585fSdanielk1977 [sqlite3_column_count $VM2] \ 303fbcd585fSdanielk1977 [get_row_values $VM2] \ 304fbcd585fSdanielk1977 [get_column_names $VM2] 3053a84069dSdrh} {SQLITE_DONE 0 {} {}} 3063a84069dSdrhdo_test capi2-4.5 { 3073a84069dSdrh execsql {SELECT * FROM t2 ORDER BY a} 3083a84069dSdrh} {2 3} 3093a84069dSdrhdo_test capi2-4.6 { 310fbcd585fSdanielk1977 sqlite3_finalize $VM2 311fbcd585fSdanielk1977} {SQLITE_OK} 3123a84069dSdrhdo_test capi2-4.7 { 313fbcd585fSdanielk1977 list [sqlite3_step $VM3] \ 314fbcd585fSdanielk1977 [sqlite3_column_count $VM3] \ 315fbcd585fSdanielk1977 [get_row_values $VM3] \ 316fbcd585fSdanielk1977 [get_column_names $VM3] 3173a84069dSdrh} {SQLITE_DONE 0 {} {}} 3183a84069dSdrhdo_test capi2-4.8 { 3193a84069dSdrh execsql {SELECT * FROM t2 ORDER BY a} 3203a84069dSdrh} {2 3 3 4} 3213a84069dSdrhdo_test capi2-4.9 { 322fbcd585fSdanielk1977 sqlite3_finalize $VM3 323fbcd585fSdanielk1977} {SQLITE_OK} 3243a84069dSdrhdo_test capi2-4.10 { 325fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 326fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 327fbcd585fSdanielk1977 [get_row_values $VM1] \ 328fbcd585fSdanielk1977 [get_column_names $VM1] 3293a84069dSdrh} {SQLITE_DONE 0 {} {}} 3303a84069dSdrhdo_test capi2-4.11 { 3313a84069dSdrh execsql {SELECT * FROM t2 ORDER BY a} 3323a84069dSdrh} {1 2 2 3 3 4} 3333a84069dSdrhdo_test capi2-4.12 { 334fbcd585fSdanielk1977 sqlite3_finalize $VM1 335fbcd585fSdanielk1977} {SQLITE_OK} 3363a84069dSdrh 3373a84069dSdrh# Interleaved SELECTs 3383a84069dSdrh# 3393a84069dSdrhdo_test capi2-5.1 { 3404ad1713cSdanielk1977 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 3414ad1713cSdanielk1977 set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 3424ad1713cSdanielk1977 set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 343fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 344fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 345fbcd585fSdanielk1977 [get_row_values $VM1] \ 346fbcd585fSdanielk1977 [get_column_names $VM1] 3473a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}} 3483a84069dSdrhdo_test capi2-5.2 { 349fbcd585fSdanielk1977 list [sqlite3_step $VM2] \ 350fbcd585fSdanielk1977 [sqlite3_column_count $VM2] \ 351fbcd585fSdanielk1977 [get_row_values $VM2] \ 352fbcd585fSdanielk1977 [get_column_names $VM2] 3533a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}} 3543a84069dSdrhdo_test capi2-5.3 { 355fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 356fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 357fbcd585fSdanielk1977 [get_row_values $VM1] \ 358fbcd585fSdanielk1977 [get_column_names $VM1] 3593a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}} 3603a84069dSdrhdo_test capi2-5.4 { 361fbcd585fSdanielk1977 list [sqlite3_step $VM3] \ 362fbcd585fSdanielk1977 [sqlite3_column_count $VM3] \ 363fbcd585fSdanielk1977 [get_row_values $VM3] \ 364fbcd585fSdanielk1977 [get_column_names $VM3] 3653a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}} 3663a84069dSdrhdo_test capi2-5.5 { 367fbcd585fSdanielk1977 list [sqlite3_step $VM3] \ 368fbcd585fSdanielk1977 [sqlite3_column_count $VM3] \ 369fbcd585fSdanielk1977 [get_row_values $VM3] \ 370fbcd585fSdanielk1977 [get_column_names $VM3] 3713a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}} 3723a84069dSdrhdo_test capi2-5.6 { 373fbcd585fSdanielk1977 list [sqlite3_step $VM3] \ 374fbcd585fSdanielk1977 [sqlite3_column_count $VM3] \ 375fbcd585fSdanielk1977 [get_row_values $VM3] \ 376fbcd585fSdanielk1977 [get_column_names $VM3] 3773a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}} 3783a84069dSdrhdo_test capi2-5.7 { 379fbcd585fSdanielk1977 list [sqlite3_step $VM3] \ 380fbcd585fSdanielk1977 [sqlite3_column_count $VM3] \ 381fbcd585fSdanielk1977 [get_row_values $VM3] \ 382fbcd585fSdanielk1977 [get_column_names $VM3] 3833a84069dSdrh} {SQLITE_DONE 2 {} {a b {} {}}} 3843a84069dSdrhdo_test capi2-5.8 { 385fbcd585fSdanielk1977 sqlite3_finalize $VM3 386fbcd585fSdanielk1977} {SQLITE_OK} 3873a84069dSdrhdo_test capi2-5.9 { 388fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 389fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 390fbcd585fSdanielk1977 [get_row_values $VM1] \ 391fbcd585fSdanielk1977 [get_column_names $VM1] 3923a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}} 3933a84069dSdrhdo_test capi2-5.10 { 394fbcd585fSdanielk1977 sqlite3_finalize $VM1 395fbcd585fSdanielk1977} {SQLITE_OK} 3963a84069dSdrhdo_test capi2-5.11 { 397fbcd585fSdanielk1977 list [sqlite3_step $VM2] \ 398fbcd585fSdanielk1977 [sqlite3_column_count $VM2] \ 399fbcd585fSdanielk1977 [get_row_values $VM2] \ 400fbcd585fSdanielk1977 [get_column_names $VM2] 4013a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}} 4023a84069dSdrhdo_test capi2-5.12 { 403fbcd585fSdanielk1977 list [sqlite3_step $VM2] \ 404fbcd585fSdanielk1977 [sqlite3_column_count $VM2] \ 405fbcd585fSdanielk1977 [get_row_values $VM2] \ 406fbcd585fSdanielk1977 [get_column_names $VM2] 4073a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}} 4083a84069dSdrhdo_test capi2-5.11 { 409fbcd585fSdanielk1977 sqlite3_finalize $VM2 410fbcd585fSdanielk1977} {SQLITE_OK} 4113a84069dSdrh 4123a84069dSdrh# Check for proper SQLITE_BUSY returns. 4133a84069dSdrh# 4143a84069dSdrhdo_test capi2-6.1 { 4153a84069dSdrh execsql { 4163a84069dSdrh BEGIN; 4173a84069dSdrh CREATE TABLE t3(x counter); 4183a84069dSdrh INSERT INTO t3 VALUES(1); 4193a84069dSdrh INSERT INTO t3 VALUES(2); 4203a84069dSdrh INSERT INTO t3 SELECT x+2 FROM t3; 4213a84069dSdrh INSERT INTO t3 SELECT x+4 FROM t3; 4223a84069dSdrh INSERT INTO t3 SELECT x+8 FROM t3; 4233a84069dSdrh COMMIT; 4243a84069dSdrh } 4254ad1713cSdanielk1977 set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 426ef4ac8f9Sdrh sqlite3 db2 test.db 4273a84069dSdrh execsql {BEGIN} db2 4283a84069dSdrh} {} 429fbcd585fSdanielk1977# Update for v3: BEGIN doesn't write-lock the database. It is quite 430fbcd585fSdanielk1977# difficult to get v3 to write-lock the database, which causes a few 431fbcd585fSdanielk1977# problems for test scripts. 432fbcd585fSdanielk1977# 433fbcd585fSdanielk1977# do_test capi2-6.2 { 434fbcd585fSdanielk1977# list [sqlite3_step $VM1] \ 435fbcd585fSdanielk1977# [sqlite3_column_count $VM1] \ 436fbcd585fSdanielk1977# [get_row_values $VM1] \ 437fbcd585fSdanielk1977# [get_column_names $VM1] 438fbcd585fSdanielk1977# } {SQLITE_BUSY 0 {} {}} 4393a84069dSdrhdo_test capi2-6.3 { 4403a84069dSdrh execsql {COMMIT} db2 4413a84069dSdrh} {} 4423a84069dSdrhdo_test capi2-6.4 { 443fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 444fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 445fbcd585fSdanielk1977 [get_row_values $VM1] \ 446fbcd585fSdanielk1977 [get_column_names $VM1] 4473a84069dSdrh} {SQLITE_ROW 1 1 {x counter}} 4483a84069dSdrhdo_test capi2-6.5 { 449fbcd585fSdanielk1977 catchsql {INSERT INTO t3 VALUES(10);} db2 4503a84069dSdrh} {1 {database is locked}} 4513a84069dSdrhdo_test capi2-6.6 { 452fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 453fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 454fbcd585fSdanielk1977 [get_row_values $VM1] \ 455fbcd585fSdanielk1977 [get_column_names $VM1] 4563a84069dSdrh} {SQLITE_ROW 1 2 {x counter}} 4573a84069dSdrhdo_test capi2-6.7 { 4583a84069dSdrh execsql {SELECT * FROM t2} db2 4593a84069dSdrh} {2 3 3 4 1 2} 4603a84069dSdrhdo_test capi2-6.8 { 461fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 462fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 463fbcd585fSdanielk1977 [get_row_values $VM1] \ 464fbcd585fSdanielk1977 [get_column_names $VM1] 4653a84069dSdrh} {SQLITE_ROW 1 3 {x counter}} 4663a84069dSdrhdo_test capi2-6.9 { 4673a84069dSdrh execsql {SELECT * FROM t2} 4683a84069dSdrh} {2 3 3 4 1 2} 4693a84069dSdrhdo_test capi2-6.10 { 470fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 471fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 472fbcd585fSdanielk1977 [get_row_values $VM1] \ 473fbcd585fSdanielk1977 [get_column_names $VM1] 4743a84069dSdrh} {SQLITE_ROW 1 4 {x counter}} 4753a84069dSdrhdo_test capi2-6.11 { 4763a84069dSdrh execsql {BEGIN} 4773a84069dSdrh} {} 4783a84069dSdrhdo_test capi2-6.12 { 479fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 480fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 481fbcd585fSdanielk1977 [get_row_values $VM1] \ 482fbcd585fSdanielk1977 [get_column_names $VM1] 4833a84069dSdrh} {SQLITE_ROW 1 5 {x counter}} 484ed326d70Sdanielk1977 485980b1a74Sdrh# A read no longer blocks a write in the same connection. 486980b1a74Sdrh#do_test capi2-6.13 { 487980b1a74Sdrh# catchsql {UPDATE t3 SET x=x+1} 488980b1a74Sdrh#} {1 {database table is locked}} 489980b1a74Sdrh 4903a84069dSdrhdo_test capi2-6.14 { 491fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 492fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 493fbcd585fSdanielk1977 [get_row_values $VM1] \ 494fbcd585fSdanielk1977 [get_column_names $VM1] 49512b13002Sdanielk1977} {SQLITE_ROW 1 6 {x counter}} 4963a84069dSdrhdo_test capi2-6.15 { 4973a84069dSdrh execsql {SELECT * FROM t1} 4983a84069dSdrh} {1 2 3} 4993a84069dSdrhdo_test capi2-6.16 { 500fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 501fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 502fbcd585fSdanielk1977 [get_row_values $VM1] \ 503fbcd585fSdanielk1977 [get_column_names $VM1] 50412b13002Sdanielk1977} {SQLITE_ROW 1 7 {x counter}} 5053a84069dSdrhdo_test capi2-6.17 { 5063a84069dSdrh catchsql {UPDATE t1 SET b=b+1} 5073a84069dSdrh} {0 {}} 5083a84069dSdrhdo_test capi2-6.18 { 509fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 510fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 511fbcd585fSdanielk1977 [get_row_values $VM1] \ 512fbcd585fSdanielk1977 [get_column_names $VM1] 51312b13002Sdanielk1977} {SQLITE_ROW 1 8 {x counter}} 5143a84069dSdrhdo_test capi2-6.19 { 5153a84069dSdrh execsql {SELECT * FROM t1} 5163a84069dSdrh} {1 3 3} 5173a84069dSdrhdo_test capi2-6.20 { 518fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 519fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 520fbcd585fSdanielk1977 [get_row_values $VM1] \ 521fbcd585fSdanielk1977 [get_column_names $VM1] 52212b13002Sdanielk1977} {SQLITE_ROW 1 9 {x counter}} 52346c43eddSdanielk1977#do_test capi2-6.21 { 52446c43eddSdanielk1977# execsql {ROLLBACK; SELECT * FROM t1} 52546c43eddSdanielk1977#} {1 2 3} 5263a84069dSdrhdo_test capi2-6.22 { 527fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 528fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 529fbcd585fSdanielk1977 [get_row_values $VM1] \ 530fbcd585fSdanielk1977 [get_column_names $VM1] 53112b13002Sdanielk1977} {SQLITE_ROW 1 10 {x counter}} 53246c43eddSdanielk1977#do_test capi2-6.23 { 53346c43eddSdanielk1977# execsql {BEGIN TRANSACTION;} 53446c43eddSdanielk1977#} {} 5353a84069dSdrhdo_test capi2-6.24 { 536fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 537fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 538fbcd585fSdanielk1977 [get_row_values $VM1] \ 539fbcd585fSdanielk1977 [get_column_names $VM1] 54012b13002Sdanielk1977} {SQLITE_ROW 1 11 {x counter}} 5413a84069dSdrhdo_test capi2-6.25 { 5423a84069dSdrh execsql { 5433a84069dSdrh INSERT INTO t1 VALUES(2,3,4); 5443a84069dSdrh SELECT * FROM t1; 5453a84069dSdrh } 54646c43eddSdanielk1977} {1 3 3 2 3 4} 5473a84069dSdrhdo_test capi2-6.26 { 548fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 549fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 550fbcd585fSdanielk1977 [get_row_values $VM1] \ 551fbcd585fSdanielk1977 [get_column_names $VM1] 55212b13002Sdanielk1977} {SQLITE_ROW 1 12 {x counter}} 5533a84069dSdrhdo_test capi2-6.27 { 5543a84069dSdrh catchsql { 5553a84069dSdrh INSERT INTO t1 VALUES(2,4,5); 5563a84069dSdrh SELECT * FROM t1; 5573a84069dSdrh } 558f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t1.a}} 5593a84069dSdrhdo_test capi2-6.28 { 560fbcd585fSdanielk1977 list [sqlite3_step $VM1] \ 561fbcd585fSdanielk1977 [sqlite3_column_count $VM1] \ 562fbcd585fSdanielk1977 [get_row_values $VM1] \ 563fbcd585fSdanielk1977 [get_column_names $VM1] 56412b13002Sdanielk1977} {SQLITE_ROW 1 13 {x counter}} 5653a84069dSdrhdo_test capi2-6.99 { 566fbcd585fSdanielk1977 sqlite3_finalize $VM1 567fbcd585fSdanielk1977} {SQLITE_OK} 568a996e477Sdrhcatchsql {ROLLBACK} 569dde85d9eSdrh 570dde85d9eSdrhdo_test capi2-7.1 { 571dde85d9eSdrh stepsql $DB { 572dde85d9eSdrh SELECT * FROM t1 573dde85d9eSdrh } 574dde85d9eSdrh} {0 1 2 3} 575dde85d9eSdrhdo_test capi2-7.2 { 576dde85d9eSdrh stepsql $DB { 577dde85d9eSdrh PRAGMA count_changes=on 578dde85d9eSdrh } 579dde85d9eSdrh} {0} 580dde85d9eSdrhdo_test capi2-7.3 { 581dde85d9eSdrh stepsql $DB { 582dde85d9eSdrh UPDATE t1 SET a=a+10; 583dde85d9eSdrh } 584dde85d9eSdrh} {0 1} 585dde85d9eSdrhdo_test capi2-7.4 { 586dde85d9eSdrh stepsql $DB { 587dde85d9eSdrh INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1; 588dde85d9eSdrh } 589dde85d9eSdrh} {0 1} 590fbcd585fSdanielk1977do_test capi2-7.4b {sqlite3_changes $DB} {1} 591dde85d9eSdrhdo_test capi2-7.5 { 592dde85d9eSdrh stepsql $DB { 593dde85d9eSdrh UPDATE t1 SET a=a+10; 594dde85d9eSdrh } 595dde85d9eSdrh} {0 2} 596fbcd585fSdanielk1977do_test capi2-7.5b {sqlite3_changes $DB} {2} 597dde85d9eSdrhdo_test capi2-7.6 { 598dde85d9eSdrh stepsql $DB { 599dde85d9eSdrh SELECT * FROM t1; 600dde85d9eSdrh } 601dde85d9eSdrh} {0 21 2 3 22 3 4} 602dde85d9eSdrhdo_test capi2-7.7 { 603dde85d9eSdrh stepsql $DB { 604dde85d9eSdrh INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1; 605dde85d9eSdrh } 606dde85d9eSdrh} {0 2} 607dde85d9eSdrhdo_test capi2-7.8 { 608fbcd585fSdanielk1977 sqlite3_changes $DB 6092299706cSdrh} {2} 6102299706cSdrhdo_test capi2-7.9 { 611dde85d9eSdrh stepsql $DB { 612dde85d9eSdrh SELECT * FROM t1; 613dde85d9eSdrh } 614dde85d9eSdrh} {0 21 2 3 22 3 4 23 4 5 24 5 6} 6152299706cSdrhdo_test capi2-7.10 { 616dde85d9eSdrh stepsql $DB { 617dde85d9eSdrh UPDATE t1 SET a=a-20; 618dde85d9eSdrh SELECT * FROM t1; 619dde85d9eSdrh } 620dde85d9eSdrh} {0 4 1 2 3 2 3 4 3 4 5 4 5 6} 621b28af71aSdanielk1977 622b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change 623b28af71aSdanielk1977# counter (Test result changes from 0 to 4). 6242299706cSdrhdo_test capi2-7.11 { 625fbcd585fSdanielk1977 sqlite3_changes $DB 626b28af71aSdanielk1977} {4} 627b28af71aSdanielk1977do_test capi2-7.11a { 628b28af71aSdanielk1977 execsql {SELECT count(*) FROM t1} 629b28af71aSdanielk1977} {4} 630b28af71aSdanielk1977 6316bf89570Sdrhifcapable {explain} { 6322299706cSdrh do_test capi2-7.12 { 633dde85d9eSdrh set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] 634dde85d9eSdrh lindex $x 0 635dde85d9eSdrh } {0} 6366bf89570Sdrh} 637dde85d9eSdrh 638937dd84dSdrh# Ticket #261 - make sure we can finalize before the end of a query. 639937dd84dSdrh# 640937dd84dSdrhdo_test capi2-8.1 { 6414ad1713cSdanielk1977 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] 642106bb236Sdanielk1977 sqlite3_finalize $VM1 643fbcd585fSdanielk1977} {SQLITE_OK} 644dde85d9eSdrh 6454ad1713cSdanielk1977# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare 646073e5a77Sdrh# and all of the return pointers in sqlite_step can be null. 647073e5a77Sdrh# 648073e5a77Sdrhdo_test capi2-9.1 { 6494ad1713cSdanielk1977 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY] 650fbcd585fSdanielk1977 sqlite3_step $VM1 651106bb236Sdanielk1977 sqlite3_finalize $VM1 652fbcd585fSdanielk1977} {SQLITE_OK} 653326dce74Sdrh 654955de52cSdanielk1977# Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset 655955de52cSdanielk1977# does not cause an error. 6564397de57Sdanielk1977do_test capi2-10.1 { 6574397de57Sdanielk1977 sqlite3_finalize 0 6584397de57Sdanielk1977} {SQLITE_OK} 6594397de57Sdanielk1977do_test capi2-10.2 { 6604397de57Sdanielk1977 sqlite3_reset 0 6614397de57Sdanielk1977} {SQLITE_OK} 6624397de57Sdanielk1977 663955de52cSdanielk1977#--------------------------------------------------------------------------- 664955de52cSdanielk1977# The following tests - capi2-11.* - test the "column origin" APIs. 665955de52cSdanielk1977# 666955de52cSdanielk1977# sqlite3_column_origin_name() 667955de52cSdanielk1977# sqlite3_column_database_name() 668955de52cSdanielk1977# sqlite3_column_table_name() 669955de52cSdanielk1977# 670955de52cSdanielk1977 6714b1ae99dSdanielk1977ifcapable columnmetadata { 6724b1ae99dSdanielk1977 673955de52cSdanielk1977# This proc uses the database handle $::DB to compile the SQL statement passed 674955de52cSdanielk1977# as a parameter. The return value of this procedure is a list with one 675955de52cSdanielk1977# element for each column returned by the compiled statement. Each element of 676955de52cSdanielk1977# this list is itself a list of length three, consisting of the origin 677955de52cSdanielk1977# database, table and column for the corresponding returned column. 678955de52cSdanielk1977proc check_origins {sql} { 679955de52cSdanielk1977 set ret [list] 680955de52cSdanielk1977 set ::STMT [sqlite3_prepare $::DB $sql -1 dummy] 681955de52cSdanielk1977 for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} { 682955de52cSdanielk1977 lappend ret [list \ 683955de52cSdanielk1977 [sqlite3_column_database_name $::STMT $i] \ 684955de52cSdanielk1977 [sqlite3_column_table_name $::STMT $i] \ 685955de52cSdanielk1977 [sqlite3_column_origin_name $::STMT $i] \ 686955de52cSdanielk1977 ] 687955de52cSdanielk1977 } 688955de52cSdanielk1977 sqlite3_finalize $::STMT 689955de52cSdanielk1977 return $ret 690955de52cSdanielk1977} 691955de52cSdanielk1977do_test capi2-11.1 { 692955de52cSdanielk1977 execsql { 693955de52cSdanielk1977 CREATE TABLE tab1(col1, col2); 694955de52cSdanielk1977 } 695955de52cSdanielk1977} {} 696955de52cSdanielk1977do_test capi2-11.2 { 697955de52cSdanielk1977 check_origins {SELECT col2, col1 FROM tab1} 698955de52cSdanielk1977} [list {main tab1 col2} {main tab1 col1}] 699955de52cSdanielk1977do_test capi2-11.3 { 700955de52cSdanielk1977 check_origins {SELECT col2 AS hello, col1 AS world FROM tab1} 701955de52cSdanielk1977} [list {main tab1 col2} {main tab1 col1}] 70212f5e201Sdanielk1977 70312f5e201Sdanielk1977ifcapable subquery { 704955de52cSdanielk1977 do_test capi2-11.4 { 705955de52cSdanielk1977 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM tab1)} 706955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 707955de52cSdanielk1977 do_test capi2-11.5 { 708955de52cSdanielk1977 check_origins {SELECT (SELECT col2 FROM tab1), (SELECT col1 FROM tab1)} 709955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 710955de52cSdanielk1977 do_test capi2-11.6 { 711955de52cSdanielk1977 check_origins {SELECT (SELECT col2), (SELECT col1) FROM tab1} 712955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 713955de52cSdanielk1977 do_test capi2-11.7 { 714955de52cSdanielk1977 check_origins {SELECT * FROM tab1} 715955de52cSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 716955de52cSdanielk1977 do_test capi2-11.8 { 717955de52cSdanielk1977 check_origins {SELECT * FROM (SELECT * FROM tab1)} 718955de52cSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 71912f5e201Sdanielk1977} 720955de52cSdanielk1977 72112f5e201Sdanielk1977ifcapable view&&subquery { 722955de52cSdanielk1977 do_test capi2-12.1 { 723955de52cSdanielk1977 execsql { 724955de52cSdanielk1977 CREATE VIEW view1 AS SELECT * FROM tab1; 725955de52cSdanielk1977 } 726955de52cSdanielk1977 } {} 727955de52cSdanielk1977 do_test capi2-12.2 { 728955de52cSdanielk1977 check_origins {SELECT col2, col1 FROM view1} 729955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 730955de52cSdanielk1977 do_test capi2-12.3 { 731955de52cSdanielk1977 check_origins {SELECT col2 AS hello, col1 AS world FROM view1} 732955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 733955de52cSdanielk1977 do_test capi2-12.4 { 734955de52cSdanielk1977 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view1)} 735955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 736955de52cSdanielk1977 do_test capi2-12.5 { 737955de52cSdanielk1977 check_origins {SELECT (SELECT col2 FROM view1), (SELECT col1 FROM view1)} 738955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 739955de52cSdanielk1977 do_test capi2-12.6 { 740955de52cSdanielk1977 check_origins {SELECT (SELECT col2), (SELECT col1) FROM view1} 741955de52cSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7421787ccabSdanielk1977 do_test capi2-12.7 { 7431787ccabSdanielk1977 check_origins {SELECT * FROM view1} 7441787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7451787ccabSdanielk1977 do_test capi2-12.8 { 7461787ccabSdanielk1977 check_origins {select * from (select * from view1)} 7471787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7481787ccabSdanielk1977 do_test capi2-12.9 { 7491787ccabSdanielk1977 check_origins {select * from (select * from (select * from view1))} 7501787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7511787ccabSdanielk1977 do_test capi2-12.10 { 7521787ccabSdanielk1977 db close 7531787ccabSdanielk1977 sqlite3 db test.db 7541787ccabSdanielk1977 set ::DB [sqlite3_connection_pointer db] 7551787ccabSdanielk1977 check_origins {select * from (select * from (select * from view1))} 7561787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7571787ccabSdanielk1977 7581787ccabSdanielk1977 # This view will thwart the flattening optimization. 7591787ccabSdanielk1977 do_test capi2-13.1 { 7601787ccabSdanielk1977 execsql { 7611787ccabSdanielk1977 CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10; 7621787ccabSdanielk1977 } 7631787ccabSdanielk1977 } {} 7641787ccabSdanielk1977 do_test capi2-13.2 { 7651787ccabSdanielk1977 check_origins {SELECT col2, col1 FROM view2} 7661787ccabSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7671787ccabSdanielk1977 do_test capi2-13.3 { 7681787ccabSdanielk1977 check_origins {SELECT col2 AS hello, col1 AS world FROM view2} 7691787ccabSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7701787ccabSdanielk1977 do_test capi2-13.4 { 7711787ccabSdanielk1977 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view2)} 7721787ccabSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7731787ccabSdanielk1977 do_test capi2-13.5 { 7741787ccabSdanielk1977 check_origins {SELECT (SELECT col2 FROM view2), (SELECT col1 FROM view2)} 7751787ccabSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7761787ccabSdanielk1977 do_test capi2-13.6 { 7771787ccabSdanielk1977 check_origins {SELECT (SELECT col2), (SELECT col1) FROM view2} 7781787ccabSdanielk1977 } [list {main tab1 col2} {main tab1 col1}] 7791787ccabSdanielk1977 do_test capi2-13.7 { 7801787ccabSdanielk1977 check_origins {SELECT * FROM view2} 7811787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7821787ccabSdanielk1977 do_test capi2-13.8 { 7831787ccabSdanielk1977 check_origins {select * from (select * from view2)} 7841787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7851787ccabSdanielk1977 do_test capi2-13.9 { 7861787ccabSdanielk1977 check_origins {select * from (select * from (select * from view2))} 7871787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7881787ccabSdanielk1977 do_test capi2-13.10 { 7891787ccabSdanielk1977 db close 7901787ccabSdanielk1977 sqlite3 db test.db 7911787ccabSdanielk1977 set ::DB [sqlite3_connection_pointer db] 7921787ccabSdanielk1977 check_origins {select * from (select * from (select * from view2))} 7931787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 7941787ccabSdanielk1977 do_test capi2-13.11 { 7951787ccabSdanielk1977 check_origins {select * from (select * from tab1 limit 10 offset 10)} 7961787ccabSdanielk1977 } [list {main tab1 col1} {main tab1 col2}] 79712f5e201Sdanielk1977} 7981787ccabSdanielk1977 79994e92032Sdrh 8004b1ae99dSdanielk1977} ;# ifcapable columnmetadata 8014b1ae99dSdanielk1977 8021787ccabSdanielk1977db2 close 803326dce74Sdrhfinish_test 804