drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 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 | # |
drh | 04bbcd5 | 2008-12-30 17:55:00 +0000 | [diff] [blame] | 14 | # $Id: capi2.test,v 1.37 2008/12/30 17:55:00 drh Exp $ |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 15 | # |
| 16 | |
| 17 | set testdir [file dirname $argv0] |
| 18 | source $testdir/tester.tcl |
| 19 | |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 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 | |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 48 | # Check basic functionality |
| 49 | # |
| 50 | do_test capi2-1.1 { |
drh | dddca28 | 2006-01-03 00:33:50 +0000 | [diff] [blame] | 51 | set DB [sqlite3_connection_pointer db] |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 52 | execsql {CREATE TABLE t1(a,b,c)} |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 53 | set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 54 | set TAIL |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 55 | } {} |
| 56 | do_test capi2-1.2 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 57 | sqlite3_step $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 58 | } {SQLITE_ROW} |
| 59 | do_test capi2-1.3 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 60 | sqlite3_data_count $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 61 | } {2} |
| 62 | do_test capi2-1.4 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 63 | get_row_values $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 64 | } {t1 1} |
| 65 | do_test capi2-1.5 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 66 | get_column_names $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 67 | } {name rowid text INTEGER} |
| 68 | do_test capi2-1.6 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 69 | sqlite3_step $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 70 | } {SQLITE_DONE} |
| 71 | do_test capi2-1.7 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 72 | list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 73 | } {2 {} {name rowid text INTEGER}} |
drh | 3674bfd | 2010-04-17 12:53:19 +0000 | [diff] [blame] | 74 | |
| 75 | # This used to be SQLITE_MISUSE. But now we automatically reset prepared |
| 76 | # statements. |
drh | 602acb4 | 2011-01-17 17:42:37 +0000 | [diff] [blame] | 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 | } |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 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. |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 91 | do_test capi2-1.9 { |
drh | 3674bfd | 2010-04-17 12:53:19 +0000 | [diff] [blame] | 92 | sqlite3_reset $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 93 | list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] |
| 94 | } {2 {} {name rowid text INTEGER}} |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 95 | do_test capi2-1.10 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 96 | sqlite3_data_count $VM |
| 97 | } {0} |
| 98 | |
| 99 | do_test capi2-1.11 { |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 100 | sqlite3_finalize $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 101 | } {SQLITE_OK} |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 102 | |
| 103 | # Check to make sure that the "tail" of a multi-statement SQL script |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 104 | # is returned by sqlite3_prepare. |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 105 | # |
| 106 | do_test capi2-2.1 { |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 107 | set SQL { |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 108 | SELECT name, rowid FROM sqlite_master; |
danielk1977 | 53c0f74 | 2005-03-29 03:10:59 +0000 | [diff] [blame] | 109 | SELECT name, rowid FROM sqlite_master WHERE 0; |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 110 | -- A comment at the end |
| 111 | } |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 112 | set VM [sqlite3_prepare $DB $SQL -1 SQL] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 113 | set SQL |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 114 | } { |
danielk1977 | 53c0f74 | 2005-03-29 03:10:59 +0000 | [diff] [blame] | 115 | SELECT name, rowid FROM sqlite_master WHERE 0; |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 116 | -- A comment at the end |
| 117 | } |
| 118 | do_test capi2-2.2 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 119 | set r [sqlite3_step $VM] |
| 120 | lappend r [sqlite3_column_count $VM] \ |
| 121 | [get_row_values $VM] \ |
| 122 | [get_column_names $VM] |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 123 | } {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}} |
| 124 | do_test capi2-2.3 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 125 | set r [sqlite3_step $VM] |
| 126 | lappend r [sqlite3_column_count $VM] \ |
| 127 | [get_row_values $VM] \ |
| 128 | [get_column_names $VM] |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 129 | } {SQLITE_DONE 2 {} {name rowid text INTEGER}} |
| 130 | do_test capi2-2.4 { |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 131 | sqlite3_finalize $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 132 | } {SQLITE_OK} |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 133 | do_test capi2-2.5 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 134 | set VM [sqlite3_prepare $DB $SQL -1 SQL] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 135 | set SQL |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 136 | } { |
| 137 | -- A comment at the end |
| 138 | } |
| 139 | do_test capi2-2.6 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 140 | set r [sqlite3_step $VM] |
| 141 | lappend r [sqlite3_column_count $VM] \ |
| 142 | [get_row_values $VM] \ |
| 143 | [get_column_names $VM] |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 144 | } {SQLITE_DONE 2 {} {name rowid text INTEGER}} |
| 145 | do_test capi2-2.7 { |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 146 | sqlite3_finalize $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 147 | } {SQLITE_OK} |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 148 | do_test capi2-2.8 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 149 | set VM [sqlite3_prepare $DB $SQL -1 SQL] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 150 | list $SQL $VM |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 151 | } {{} {}} |
| 152 | |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 153 | # Check the error handling. |
| 154 | # |
| 155 | do_test capi2-3.1 { |
| 156 | set rc [catch { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 157 | sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 158 | } msg] |
| 159 | lappend rc $msg $TAIL |
| 160 | } {1 {(1) no such column: bogus} {}} |
| 161 | do_test capi2-3.2 { |
| 162 | set rc [catch { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 163 | sqlite3_prepare $DB {select bogus from } -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 164 | } msg] |
| 165 | lappend rc $msg $TAIL |
| 166 | } {1 {(1) near " ": syntax error} {}} |
| 167 | do_test capi2-3.3 { |
| 168 | set rc [catch { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 169 | sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 170 | } msg] |
| 171 | lappend rc $msg $TAIL |
| 172 | } {1 {(1) no such column: bogus} {}} |
| 173 | do_test capi2-3.4 { |
| 174 | set rc [catch { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 175 | sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 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 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 181 | sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 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 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 187 | sqlite3_prepare $DB {select 5/0} -1 TAIL |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 188 | } VM] |
| 189 | lappend rc $TAIL |
| 190 | } {0 {}} |
| 191 | do_test capi2-3.7 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 192 | list [sqlite3_step $VM] \ |
| 193 | [sqlite3_column_count $VM] \ |
| 194 | [get_row_values $VM] \ |
| 195 | [get_column_names $VM] |
danielk1977 | 00e279d | 2004-06-21 07:36:32 +0000 | [diff] [blame] | 196 | } {SQLITE_ROW 1 {{}} {5/0 {}}} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 197 | do_test capi2-3.8 { |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 198 | sqlite3_finalize $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 199 | } {SQLITE_OK} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 200 | do_test capi2-3.9 { |
| 201 | execsql {CREATE UNIQUE INDEX i1 ON t1(a)} |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 202 | set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 203 | set TAIL |
| 204 | } {} |
drh | 2299706 | 2003-03-01 19:53:15 +0000 | [diff] [blame] | 205 | do_test capi2-3.9b {db changes} {0} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 206 | do_test capi2-3.10 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 207 | list [sqlite3_step $VM] \ |
| 208 | [sqlite3_column_count $VM] \ |
| 209 | [get_row_values $VM] \ |
| 210 | [get_column_names $VM] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 211 | } {SQLITE_DONE 0 {} {}} |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 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? |
drh | 92f02c3 | 2004-09-02 14:57:08 +0000 | [diff] [blame] | 215 | # (Later:) The change now happens just before SQLITE_DONE is returned. |
| 216 | do_test capi2-3.10b {db changes} {1} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 217 | do_test capi2-3.11 { |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 218 | sqlite3_finalize $VM |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 219 | } {SQLITE_OK} |
danielk1977 | b28af71 | 2004-06-21 06:50:26 +0000 | [diff] [blame] | 220 | do_test capi2-3.11b {db changes} {1} |
drh | 86f8c19 | 2007-08-22 00:39:19 +0000 | [diff] [blame] | 221 | #do_test capi2-3.12-misuse { |
| 222 | # sqlite3_finalize $VM |
| 223 | #} {SQLITE_MISUSE} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 224 | do_test capi2-3.13 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 225 | set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL] |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 226 | list [sqlite3_step $VM] \ |
| 227 | [sqlite3_column_count $VM] \ |
| 228 | [get_row_values $VM] \ |
| 229 | [get_column_names $VM] |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 230 | } {SQLITE_ERROR 0 {} {}} |
danielk1977 | b28af71 | 2004-06-21 06:50:26 +0000 | [diff] [blame] | 231 | |
| 232 | # Update for v3: Preparing a statement does not affect the change counter. |
drh | 92f02c3 | 2004-09-02 14:57:08 +0000 | [diff] [blame] | 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} |
danielk1977 | b28af71 | 2004-06-21 06:50:26 +0000 | [diff] [blame] | 236 | |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 237 | do_test capi2-3.14 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 238 | list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] |
| 239 | } {SQLITE_CONSTRAINT {column a is not unique}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 240 | do_test capi2-3.15 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 241 | set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 242 | set TAIL |
| 243 | } {} |
| 244 | do_test capi2-3.16 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 245 | list [sqlite3_step $VM] \ |
| 246 | [sqlite3_column_count $VM] \ |
| 247 | [get_row_values $VM] \ |
| 248 | [get_column_names $VM] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 249 | } {SQLITE_DONE 0 {} {}} |
| 250 | do_test capi2-3.17 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 251 | list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] |
| 252 | } {SQLITE_OK {not an error}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 253 | do_test capi2-3.18 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 254 | set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL] |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 255 | list [sqlite3_step $VM] \ |
| 256 | [sqlite3_column_count $VM] \ |
| 257 | [get_row_values $VM] \ |
| 258 | [get_column_names $VM] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 259 | } {SQLITE_ERROR 0 {} {}} |
| 260 | do_test capi2-3.19 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 261 | list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] |
| 262 | } {SQLITE_CONSTRAINT {t2.a may not be NULL}} |
drh | 483750b | 2003-01-29 18:46:51 +0000 | [diff] [blame] | 263 | |
danielk1977 | 6a67fe8 | 2005-02-04 04:07:16 +0000 | [diff] [blame] | 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 | |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 284 | # Two or more virtual machines exists at the same time. |
| 285 | # |
| 286 | do_test capi2-4.1 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 287 | set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 288 | set TAIL |
| 289 | } {} |
| 290 | do_test capi2-4.2 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 291 | set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 292 | set TAIL |
| 293 | } {} |
| 294 | do_test capi2-4.3 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 295 | set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 296 | set TAIL |
| 297 | } {} |
| 298 | do_test capi2-4.4 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 299 | list [sqlite3_step $VM2] \ |
| 300 | [sqlite3_column_count $VM2] \ |
| 301 | [get_row_values $VM2] \ |
| 302 | [get_column_names $VM2] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 308 | sqlite3_finalize $VM2 |
| 309 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 310 | do_test capi2-4.7 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 311 | list [sqlite3_step $VM3] \ |
| 312 | [sqlite3_column_count $VM3] \ |
| 313 | [get_row_values $VM3] \ |
| 314 | [get_column_names $VM3] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 320 | sqlite3_finalize $VM3 |
| 321 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 322 | do_test capi2-4.10 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 323 | list [sqlite3_step $VM1] \ |
| 324 | [sqlite3_column_count $VM1] \ |
| 325 | [get_row_values $VM1] \ |
| 326 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 332 | sqlite3_finalize $VM1 |
| 333 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 334 | |
| 335 | # Interleaved SELECTs |
| 336 | # |
| 337 | do_test capi2-5.1 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 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] |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 341 | list [sqlite3_step $VM1] \ |
| 342 | [sqlite3_column_count $VM1] \ |
| 343 | [get_row_values $VM1] \ |
| 344 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 345 | } {SQLITE_ROW 2 {2 3} {a b {} {}}} |
| 346 | do_test capi2-5.2 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 347 | list [sqlite3_step $VM2] \ |
| 348 | [sqlite3_column_count $VM2] \ |
| 349 | [get_row_values $VM2] \ |
| 350 | [get_column_names $VM2] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 351 | } {SQLITE_ROW 2 {2 3} {a b {} {}}} |
| 352 | do_test capi2-5.3 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 353 | list [sqlite3_step $VM1] \ |
| 354 | [sqlite3_column_count $VM1] \ |
| 355 | [get_row_values $VM1] \ |
| 356 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 357 | } {SQLITE_ROW 2 {3 4} {a b {} {}}} |
| 358 | do_test capi2-5.4 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 359 | list [sqlite3_step $VM3] \ |
| 360 | [sqlite3_column_count $VM3] \ |
| 361 | [get_row_values $VM3] \ |
| 362 | [get_column_names $VM3] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 363 | } {SQLITE_ROW 2 {2 3} {a b {} {}}} |
| 364 | do_test capi2-5.5 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 365 | list [sqlite3_step $VM3] \ |
| 366 | [sqlite3_column_count $VM3] \ |
| 367 | [get_row_values $VM3] \ |
| 368 | [get_column_names $VM3] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 369 | } {SQLITE_ROW 2 {3 4} {a b {} {}}} |
| 370 | do_test capi2-5.6 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 371 | list [sqlite3_step $VM3] \ |
| 372 | [sqlite3_column_count $VM3] \ |
| 373 | [get_row_values $VM3] \ |
| 374 | [get_column_names $VM3] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 375 | } {SQLITE_ROW 2 {1 2} {a b {} {}}} |
| 376 | do_test capi2-5.7 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 377 | list [sqlite3_step $VM3] \ |
| 378 | [sqlite3_column_count $VM3] \ |
| 379 | [get_row_values $VM3] \ |
| 380 | [get_column_names $VM3] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 381 | } {SQLITE_DONE 2 {} {a b {} {}}} |
| 382 | do_test capi2-5.8 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 383 | sqlite3_finalize $VM3 |
| 384 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 385 | do_test capi2-5.9 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 386 | list [sqlite3_step $VM1] \ |
| 387 | [sqlite3_column_count $VM1] \ |
| 388 | [get_row_values $VM1] \ |
| 389 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 390 | } {SQLITE_ROW 2 {1 2} {a b {} {}}} |
| 391 | do_test capi2-5.10 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 392 | sqlite3_finalize $VM1 |
| 393 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 394 | do_test capi2-5.11 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 395 | list [sqlite3_step $VM2] \ |
| 396 | [sqlite3_column_count $VM2] \ |
| 397 | [get_row_values $VM2] \ |
| 398 | [get_column_names $VM2] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 399 | } {SQLITE_ROW 2 {3 4} {a b {} {}}} |
| 400 | do_test capi2-5.12 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 401 | list [sqlite3_step $VM2] \ |
| 402 | [sqlite3_column_count $VM2] \ |
| 403 | [get_row_values $VM2] \ |
| 404 | [get_column_names $VM2] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 405 | } {SQLITE_ROW 2 {1 2} {a b {} {}}} |
| 406 | do_test capi2-5.11 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 407 | sqlite3_finalize $VM2 |
| 408 | } {SQLITE_OK} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 | } |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 423 | set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] |
drh | ef4ac8f | 2004-06-19 00:16:31 +0000 | [diff] [blame] | 424 | sqlite3 db2 test.db |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 425 | execsql {BEGIN} db2 |
| 426 | } {} |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 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 {} {}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 437 | do_test capi2-6.3 { |
| 438 | execsql {COMMIT} db2 |
| 439 | } {} |
| 440 | do_test capi2-6.4 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 441 | list [sqlite3_step $VM1] \ |
| 442 | [sqlite3_column_count $VM1] \ |
| 443 | [get_row_values $VM1] \ |
| 444 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 445 | } {SQLITE_ROW 1 1 {x counter}} |
| 446 | do_test capi2-6.5 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 447 | catchsql {INSERT INTO t3 VALUES(10);} db2 |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 448 | } {1 {database is locked}} |
| 449 | do_test capi2-6.6 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 450 | list [sqlite3_step $VM1] \ |
| 451 | [sqlite3_column_count $VM1] \ |
| 452 | [get_row_values $VM1] \ |
| 453 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 459 | list [sqlite3_step $VM1] \ |
| 460 | [sqlite3_column_count $VM1] \ |
| 461 | [get_row_values $VM1] \ |
| 462 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 468 | list [sqlite3_step $VM1] \ |
| 469 | [sqlite3_column_count $VM1] \ |
| 470 | [get_row_values $VM1] \ |
| 471 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 472 | } {SQLITE_ROW 1 4 {x counter}} |
| 473 | do_test capi2-6.11 { |
| 474 | execsql {BEGIN} |
| 475 | } {} |
| 476 | do_test capi2-6.12 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 477 | list [sqlite3_step $VM1] \ |
| 478 | [sqlite3_column_count $VM1] \ |
| 479 | [get_row_values $VM1] \ |
| 480 | [get_column_names $VM1] |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 481 | } {SQLITE_ROW 1 5 {x counter}} |
danielk1977 | ed326d7 | 2004-11-16 15:50:19 +0000 | [diff] [blame] | 482 | |
drh | 980b1a7 | 2006-08-16 16:42:48 +0000 | [diff] [blame] | 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 | |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 488 | do_test capi2-6.14 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 489 | list [sqlite3_step $VM1] \ |
| 490 | [sqlite3_column_count $VM1] \ |
| 491 | [get_row_values $VM1] \ |
| 492 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 493 | } {SQLITE_ROW 1 6 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 494 | do_test capi2-6.15 { |
| 495 | execsql {SELECT * FROM t1} |
| 496 | } {1 2 3} |
| 497 | do_test capi2-6.16 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 498 | list [sqlite3_step $VM1] \ |
| 499 | [sqlite3_column_count $VM1] \ |
| 500 | [get_row_values $VM1] \ |
| 501 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 502 | } {SQLITE_ROW 1 7 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 503 | do_test capi2-6.17 { |
| 504 | catchsql {UPDATE t1 SET b=b+1} |
| 505 | } {0 {}} |
| 506 | do_test capi2-6.18 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 507 | list [sqlite3_step $VM1] \ |
| 508 | [sqlite3_column_count $VM1] \ |
| 509 | [get_row_values $VM1] \ |
| 510 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 511 | } {SQLITE_ROW 1 8 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 512 | do_test capi2-6.19 { |
| 513 | execsql {SELECT * FROM t1} |
| 514 | } {1 3 3} |
| 515 | do_test capi2-6.20 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 516 | list [sqlite3_step $VM1] \ |
| 517 | [sqlite3_column_count $VM1] \ |
| 518 | [get_row_values $VM1] \ |
| 519 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 520 | } {SQLITE_ROW 1 9 {x counter}} |
danielk1977 | 46c43ed | 2004-06-30 06:30:25 +0000 | [diff] [blame] | 521 | #do_test capi2-6.21 { |
| 522 | # execsql {ROLLBACK; SELECT * FROM t1} |
| 523 | #} {1 2 3} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 524 | do_test capi2-6.22 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 525 | list [sqlite3_step $VM1] \ |
| 526 | [sqlite3_column_count $VM1] \ |
| 527 | [get_row_values $VM1] \ |
| 528 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 529 | } {SQLITE_ROW 1 10 {x counter}} |
danielk1977 | 46c43ed | 2004-06-30 06:30:25 +0000 | [diff] [blame] | 530 | #do_test capi2-6.23 { |
| 531 | # execsql {BEGIN TRANSACTION;} |
| 532 | #} {} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 533 | do_test capi2-6.24 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 534 | list [sqlite3_step $VM1] \ |
| 535 | [sqlite3_column_count $VM1] \ |
| 536 | [get_row_values $VM1] \ |
| 537 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 538 | } {SQLITE_ROW 1 11 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 539 | do_test capi2-6.25 { |
| 540 | execsql { |
| 541 | INSERT INTO t1 VALUES(2,3,4); |
| 542 | SELECT * FROM t1; |
| 543 | } |
danielk1977 | 46c43ed | 2004-06-30 06:30:25 +0000 | [diff] [blame] | 544 | } {1 3 3 2 3 4} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 545 | do_test capi2-6.26 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 546 | list [sqlite3_step $VM1] \ |
| 547 | [sqlite3_column_count $VM1] \ |
| 548 | [get_row_values $VM1] \ |
| 549 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 550 | } {SQLITE_ROW 1 12 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 551 | do_test capi2-6.27 { |
| 552 | catchsql { |
| 553 | INSERT INTO t1 VALUES(2,4,5); |
| 554 | SELECT * FROM t1; |
| 555 | } |
drh | 37ed48e | 2003-08-05 13:13:38 +0000 | [diff] [blame] | 556 | } {1 {column a is not unique}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 557 | do_test capi2-6.28 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 558 | list [sqlite3_step $VM1] \ |
| 559 | [sqlite3_column_count $VM1] \ |
| 560 | [get_row_values $VM1] \ |
| 561 | [get_column_names $VM1] |
danielk1977 | 12b1300 | 2004-11-22 10:02:21 +0000 | [diff] [blame] | 562 | } {SQLITE_ROW 1 13 {x counter}} |
drh | 3a84069 | 2003-01-29 22:58:26 +0000 | [diff] [blame] | 563 | do_test capi2-6.99 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 564 | sqlite3_finalize $VM1 |
| 565 | } {SQLITE_OK} |
drh | a996e47 | 2003-05-16 02:30:27 +0000 | [diff] [blame] | 566 | catchsql {ROLLBACK} |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 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} |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 588 | do_test capi2-7.4b {sqlite3_changes $DB} {1} |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 589 | do_test capi2-7.5 { |
| 590 | stepsql $DB { |
| 591 | UPDATE t1 SET a=a+10; |
| 592 | } |
| 593 | } {0 2} |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 594 | do_test capi2-7.5b {sqlite3_changes $DB} {2} |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 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 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 606 | sqlite3_changes $DB |
drh | 2299706 | 2003-03-01 19:53:15 +0000 | [diff] [blame] | 607 | } {2} |
| 608 | do_test capi2-7.9 { |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 609 | stepsql $DB { |
| 610 | SELECT * FROM t1; |
| 611 | } |
| 612 | } {0 21 2 3 22 3 4 23 4 5 24 5 6} |
drh | 2299706 | 2003-03-01 19:53:15 +0000 | [diff] [blame] | 613 | do_test capi2-7.10 { |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 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} |
danielk1977 | b28af71 | 2004-06-21 06:50:26 +0000 | [diff] [blame] | 619 | |
| 620 | # Update for version 3: A SELECT statement no longer resets the change |
| 621 | # counter (Test result changes from 0 to 4). |
drh | 2299706 | 2003-03-01 19:53:15 +0000 | [diff] [blame] | 622 | do_test capi2-7.11 { |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 623 | sqlite3_changes $DB |
danielk1977 | b28af71 | 2004-06-21 06:50:26 +0000 | [diff] [blame] | 624 | } {4} |
| 625 | do_test capi2-7.11a { |
| 626 | execsql {SELECT count(*) FROM t1} |
| 627 | } {4} |
| 628 | |
drh | 6bf8957 | 2004-11-03 16:27:01 +0000 | [diff] [blame] | 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 | } |
drh | dde85d9 | 2003-03-01 19:45:34 +0000 | [diff] [blame] | 635 | |
drh | 937dd84 | 2003-06-28 16:20:22 +0000 | [diff] [blame] | 636 | # Ticket #261 - make sure we can finalize before the end of a query. |
| 637 | # |
| 638 | do_test capi2-8.1 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 639 | set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 640 | sqlite3_finalize $VM1 |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 641 | } {SQLITE_OK} |
drh | 937dd84 | 2003-06-28 16:20:22 +0000 | [diff] [blame] | 642 | |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 643 | # Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare |
drh | 073e5a7 | 2003-07-09 00:28:13 +0000 | [diff] [blame] | 644 | # and all of the return pointers in sqlite_step can be null. |
| 645 | # |
| 646 | do_test capi2-9.1 { |
danielk1977 | 4ad1713 | 2004-05-21 01:47:26 +0000 | [diff] [blame] | 647 | set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY] |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 648 | sqlite3_step $VM1 |
danielk1977 | 106bb23 | 2004-05-21 10:08:53 +0000 | [diff] [blame] | 649 | sqlite3_finalize $VM1 |
danielk1977 | fbcd585 | 2004-06-15 02:44:18 +0000 | [diff] [blame] | 650 | } {SQLITE_OK} |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 651 | |
danielk1977 | 955de52 | 2006-02-10 02:27:42 +0000 | [diff] [blame] | 652 | # Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset |
| 653 | # does not cause an error. |
danielk1977 | 4397de5 | 2005-01-12 12:44:03 +0000 | [diff] [blame] | 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 | |
danielk1977 | 955de52 | 2006-02-10 02:27:42 +0000 | [diff] [blame] | 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 | |
danielk1977 | 4b1ae99 | 2006-02-10 03:06:10 +0000 | [diff] [blame] | 669 | ifcapable columnmetadata { |
| 670 | |
danielk1977 | 955de52 | 2006-02-10 02:27:42 +0000 | [diff] [blame] | 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}] |
danielk1977 | 955de52 | 2006-02-10 02:27:42 +0000 | [diff] [blame] | 700 | |
danielk1977 | 12f5e20 | 2006-02-10 13:33:30 +0000 | [diff] [blame] | 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 | } |
danielk1977 | 1787cca | 2006-02-10 07:07:14 +0000 | [diff] [blame] | 718 | |
danielk1977 | 12f5e20 | 2006-02-10 13:33:30 +0000 | [diff] [blame] | 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 | } {} |
danielk1977 | 12f5e20 | 2006-02-10 13:33:30 +0000 | [diff] [blame] | 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 | } |
danielk1977 | 1787cca | 2006-02-10 07:07:14 +0000 | [diff] [blame] | 796 | |
drh | 94e9203 | 2003-02-16 22:21:32 +0000 | [diff] [blame] | 797 | |
danielk1977 | 4b1ae99 | 2006-02-10 03:06:10 +0000 | [diff] [blame] | 798 | } ;# ifcapable columnmetadata |
| 799 | |
danielk1977 | 1787cca | 2006-02-10 07:07:14 +0000 | [diff] [blame] | 800 | db2 close |
drh | 326dce7 | 2003-01-29 14:06:07 +0000 | [diff] [blame] | 801 | finish_test |