OLD | NEW |
| (Empty) |
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 [sqlite3_extended_errcode $DB] | |
240 } {SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.a} SQLITE_CONSTRAINT_UNIQUE} | |
241 do_test capi2-3.15 { | |
242 set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL] | |
243 set TAIL | |
244 } {} | |
245 do_test capi2-3.16 { | |
246 list [sqlite3_step $VM] \ | |
247 [sqlite3_column_count $VM] \ | |
248 [get_row_values $VM] \ | |
249 [get_column_names $VM] | |
250 } {SQLITE_DONE 0 {} {}} | |
251 do_test capi2-3.17 { | |
252 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] | |
253 } {SQLITE_OK {not an error}} | |
254 do_test capi2-3.18 { | |
255 set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL] | |
256 list [sqlite3_step $VM] \ | |
257 [sqlite3_column_count $VM] \ | |
258 [get_row_values $VM] \ | |
259 [get_column_names $VM] | |
260 } {SQLITE_ERROR 0 {} {}} | |
261 do_test capi2-3.19 { | |
262 list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] \ | |
263 [sqlite3_extended_errcode $DB] | |
264 } {SQLITE_CONSTRAINT {NOT NULL constraint failed: t2.a} SQLITE_CONSTRAINT_NOTNUL
L} | |
265 | |
266 do_test capi2-3.20 { | |
267 execsql { | |
268 CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) ); | |
269 INSERT INTO a1 VALUES(1, 1); | |
270 } | |
271 } {} | |
272 do_test capi2-3.21 { | |
273 set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL] | |
274 sqlite3_step $VM | |
275 } {SQLITE_ERROR} | |
276 do_test capi2-3.22 { | |
277 sqlite3_errcode $DB | |
278 } {SQLITE_ERROR} | |
279 do_test capi2-3.23 { | |
280 sqlite3_finalize $VM | |
281 } {SQLITE_CONSTRAINT} | |
282 do_test capi2-3.24 { | |
283 list [sqlite3_errcode $DB] [sqlite3_extended_errcode $DB] | |
284 } {SQLITE_CONSTRAINT SQLITE_CONSTRAINT_UNIQUE} | |
285 | |
286 # Two or more virtual machines exists at the same time. | |
287 # | |
288 do_test capi2-4.1 { | |
289 set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL] | |
290 set TAIL | |
291 } {} | |
292 do_test capi2-4.2 { | |
293 set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] | |
294 set TAIL | |
295 } {} | |
296 do_test capi2-4.3 { | |
297 set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL] | |
298 set TAIL | |
299 } {} | |
300 do_test capi2-4.4 { | |
301 list [sqlite3_step $VM2] \ | |
302 [sqlite3_column_count $VM2] \ | |
303 [get_row_values $VM2] \ | |
304 [get_column_names $VM2] | |
305 } {SQLITE_DONE 0 {} {}} | |
306 do_test capi2-4.5 { | |
307 execsql {SELECT * FROM t2 ORDER BY a} | |
308 } {2 3} | |
309 do_test capi2-4.6 { | |
310 sqlite3_finalize $VM2 | |
311 } {SQLITE_OK} | |
312 do_test capi2-4.7 { | |
313 list [sqlite3_step $VM3] \ | |
314 [sqlite3_column_count $VM3] \ | |
315 [get_row_values $VM3] \ | |
316 [get_column_names $VM3] | |
317 } {SQLITE_DONE 0 {} {}} | |
318 do_test capi2-4.8 { | |
319 execsql {SELECT * FROM t2 ORDER BY a} | |
320 } {2 3 3 4} | |
321 do_test capi2-4.9 { | |
322 sqlite3_finalize $VM3 | |
323 } {SQLITE_OK} | |
324 do_test capi2-4.10 { | |
325 list [sqlite3_step $VM1] \ | |
326 [sqlite3_column_count $VM1] \ | |
327 [get_row_values $VM1] \ | |
328 [get_column_names $VM1] | |
329 } {SQLITE_DONE 0 {} {}} | |
330 do_test capi2-4.11 { | |
331 execsql {SELECT * FROM t2 ORDER BY a} | |
332 } {1 2 2 3 3 4} | |
333 do_test capi2-4.12 { | |
334 sqlite3_finalize $VM1 | |
335 } {SQLITE_OK} | |
336 | |
337 # Interleaved SELECTs | |
338 # | |
339 do_test capi2-5.1 { | |
340 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] | |
341 set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] | |
342 set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] | |
343 list [sqlite3_step $VM1] \ | |
344 [sqlite3_column_count $VM1] \ | |
345 [get_row_values $VM1] \ | |
346 [get_column_names $VM1] | |
347 } {SQLITE_ROW 2 {2 3} {a b {} {}}} | |
348 do_test capi2-5.2 { | |
349 list [sqlite3_step $VM2] \ | |
350 [sqlite3_column_count $VM2] \ | |
351 [get_row_values $VM2] \ | |
352 [get_column_names $VM2] | |
353 } {SQLITE_ROW 2 {2 3} {a b {} {}}} | |
354 do_test capi2-5.3 { | |
355 list [sqlite3_step $VM1] \ | |
356 [sqlite3_column_count $VM1] \ | |
357 [get_row_values $VM1] \ | |
358 [get_column_names $VM1] | |
359 } {SQLITE_ROW 2 {3 4} {a b {} {}}} | |
360 do_test capi2-5.4 { | |
361 list [sqlite3_step $VM3] \ | |
362 [sqlite3_column_count $VM3] \ | |
363 [get_row_values $VM3] \ | |
364 [get_column_names $VM3] | |
365 } {SQLITE_ROW 2 {2 3} {a b {} {}}} | |
366 do_test capi2-5.5 { | |
367 list [sqlite3_step $VM3] \ | |
368 [sqlite3_column_count $VM3] \ | |
369 [get_row_values $VM3] \ | |
370 [get_column_names $VM3] | |
371 } {SQLITE_ROW 2 {3 4} {a b {} {}}} | |
372 do_test capi2-5.6 { | |
373 list [sqlite3_step $VM3] \ | |
374 [sqlite3_column_count $VM3] \ | |
375 [get_row_values $VM3] \ | |
376 [get_column_names $VM3] | |
377 } {SQLITE_ROW 2 {1 2} {a b {} {}}} | |
378 do_test capi2-5.7 { | |
379 list [sqlite3_step $VM3] \ | |
380 [sqlite3_column_count $VM3] \ | |
381 [get_row_values $VM3] \ | |
382 [get_column_names $VM3] | |
383 } {SQLITE_DONE 2 {} {a b {} {}}} | |
384 do_test capi2-5.8 { | |
385 sqlite3_finalize $VM3 | |
386 } {SQLITE_OK} | |
387 do_test capi2-5.9 { | |
388 list [sqlite3_step $VM1] \ | |
389 [sqlite3_column_count $VM1] \ | |
390 [get_row_values $VM1] \ | |
391 [get_column_names $VM1] | |
392 } {SQLITE_ROW 2 {1 2} {a b {} {}}} | |
393 do_test capi2-5.10 { | |
394 sqlite3_finalize $VM1 | |
395 } {SQLITE_OK} | |
396 do_test capi2-5.11 { | |
397 list [sqlite3_step $VM2] \ | |
398 [sqlite3_column_count $VM2] \ | |
399 [get_row_values $VM2] \ | |
400 [get_column_names $VM2] | |
401 } {SQLITE_ROW 2 {3 4} {a b {} {}}} | |
402 do_test capi2-5.12 { | |
403 list [sqlite3_step $VM2] \ | |
404 [sqlite3_column_count $VM2] \ | |
405 [get_row_values $VM2] \ | |
406 [get_column_names $VM2] | |
407 } {SQLITE_ROW 2 {1 2} {a b {} {}}} | |
408 do_test capi2-5.11 { | |
409 sqlite3_finalize $VM2 | |
410 } {SQLITE_OK} | |
411 | |
412 # Check for proper SQLITE_BUSY returns. | |
413 # | |
414 do_test capi2-6.1 { | |
415 execsql { | |
416 BEGIN; | |
417 CREATE TABLE t3(x counter); | |
418 INSERT INTO t3 VALUES(1); | |
419 INSERT INTO t3 VALUES(2); | |
420 INSERT INTO t3 SELECT x+2 FROM t3; | |
421 INSERT INTO t3 SELECT x+4 FROM t3; | |
422 INSERT INTO t3 SELECT x+8 FROM t3; | |
423 COMMIT; | |
424 } | |
425 set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] | |
426 sqlite3 db2 test.db | |
427 execsql {BEGIN} db2 | |
428 } {} | |
429 # Update for v3: BEGIN doesn't write-lock the database. It is quite | |
430 # difficult to get v3 to write-lock the database, which causes a few | |
431 # problems for test scripts. | |
432 # | |
433 # do_test capi2-6.2 { | |
434 # list [sqlite3_step $VM1] \ | |
435 # [sqlite3_column_count $VM1] \ | |
436 # [get_row_values $VM1] \ | |
437 # [get_column_names $VM1] | |
438 # } {SQLITE_BUSY 0 {} {}} | |
439 do_test capi2-6.3 { | |
440 execsql {COMMIT} db2 | |
441 } {} | |
442 do_test capi2-6.4 { | |
443 list [sqlite3_step $VM1] \ | |
444 [sqlite3_column_count $VM1] \ | |
445 [get_row_values $VM1] \ | |
446 [get_column_names $VM1] | |
447 } {SQLITE_ROW 1 1 {x counter}} | |
448 do_test capi2-6.5 { | |
449 catchsql {INSERT INTO t3 VALUES(10);} db2 | |
450 } {1 {database is locked}} | |
451 do_test capi2-6.6 { | |
452 list [sqlite3_step $VM1] \ | |
453 [sqlite3_column_count $VM1] \ | |
454 [get_row_values $VM1] \ | |
455 [get_column_names $VM1] | |
456 } {SQLITE_ROW 1 2 {x counter}} | |
457 do_test capi2-6.7 { | |
458 execsql {SELECT * FROM t2} db2 | |
459 } {2 3 3 4 1 2} | |
460 do_test capi2-6.8 { | |
461 list [sqlite3_step $VM1] \ | |
462 [sqlite3_column_count $VM1] \ | |
463 [get_row_values $VM1] \ | |
464 [get_column_names $VM1] | |
465 } {SQLITE_ROW 1 3 {x counter}} | |
466 do_test capi2-6.9 { | |
467 execsql {SELECT * FROM t2} | |
468 } {2 3 3 4 1 2} | |
469 do_test capi2-6.10 { | |
470 list [sqlite3_step $VM1] \ | |
471 [sqlite3_column_count $VM1] \ | |
472 [get_row_values $VM1] \ | |
473 [get_column_names $VM1] | |
474 } {SQLITE_ROW 1 4 {x counter}} | |
475 do_test capi2-6.11 { | |
476 execsql {BEGIN} | |
477 } {} | |
478 do_test capi2-6.12 { | |
479 list [sqlite3_step $VM1] \ | |
480 [sqlite3_column_count $VM1] \ | |
481 [get_row_values $VM1] \ | |
482 [get_column_names $VM1] | |
483 } {SQLITE_ROW 1 5 {x counter}} | |
484 | |
485 # A read no longer blocks a write in the same connection. | |
486 #do_test capi2-6.13 { | |
487 # catchsql {UPDATE t3 SET x=x+1} | |
488 #} {1 {database table is locked}} | |
489 | |
490 do_test capi2-6.14 { | |
491 list [sqlite3_step $VM1] \ | |
492 [sqlite3_column_count $VM1] \ | |
493 [get_row_values $VM1] \ | |
494 [get_column_names $VM1] | |
495 } {SQLITE_ROW 1 6 {x counter}} | |
496 do_test capi2-6.15 { | |
497 execsql {SELECT * FROM t1} | |
498 } {1 2 3} | |
499 do_test capi2-6.16 { | |
500 list [sqlite3_step $VM1] \ | |
501 [sqlite3_column_count $VM1] \ | |
502 [get_row_values $VM1] \ | |
503 [get_column_names $VM1] | |
504 } {SQLITE_ROW 1 7 {x counter}} | |
505 do_test capi2-6.17 { | |
506 catchsql {UPDATE t1 SET b=b+1} | |
507 } {0 {}} | |
508 do_test capi2-6.18 { | |
509 list [sqlite3_step $VM1] \ | |
510 [sqlite3_column_count $VM1] \ | |
511 [get_row_values $VM1] \ | |
512 [get_column_names $VM1] | |
513 } {SQLITE_ROW 1 8 {x counter}} | |
514 do_test capi2-6.19 { | |
515 execsql {SELECT * FROM t1} | |
516 } {1 3 3} | |
517 do_test capi2-6.20 { | |
518 list [sqlite3_step $VM1] \ | |
519 [sqlite3_column_count $VM1] \ | |
520 [get_row_values $VM1] \ | |
521 [get_column_names $VM1] | |
522 } {SQLITE_ROW 1 9 {x counter}} | |
523 #do_test capi2-6.21 { | |
524 # execsql {ROLLBACK; SELECT * FROM t1} | |
525 #} {1 2 3} | |
526 do_test capi2-6.22 { | |
527 list [sqlite3_step $VM1] \ | |
528 [sqlite3_column_count $VM1] \ | |
529 [get_row_values $VM1] \ | |
530 [get_column_names $VM1] | |
531 } {SQLITE_ROW 1 10 {x counter}} | |
532 #do_test capi2-6.23 { | |
533 # execsql {BEGIN TRANSACTION;} | |
534 #} {} | |
535 do_test capi2-6.24 { | |
536 list [sqlite3_step $VM1] \ | |
537 [sqlite3_column_count $VM1] \ | |
538 [get_row_values $VM1] \ | |
539 [get_column_names $VM1] | |
540 } {SQLITE_ROW 1 11 {x counter}} | |
541 do_test capi2-6.25 { | |
542 execsql { | |
543 INSERT INTO t1 VALUES(2,3,4); | |
544 SELECT * FROM t1; | |
545 } | |
546 } {1 3 3 2 3 4} | |
547 do_test capi2-6.26 { | |
548 list [sqlite3_step $VM1] \ | |
549 [sqlite3_column_count $VM1] \ | |
550 [get_row_values $VM1] \ | |
551 [get_column_names $VM1] | |
552 } {SQLITE_ROW 1 12 {x counter}} | |
553 do_test capi2-6.27 { | |
554 catchsql { | |
555 INSERT INTO t1 VALUES(2,4,5); | |
556 SELECT * FROM t1; | |
557 } | |
558 } {1 {UNIQUE constraint failed: t1.a}} | |
559 do_test capi2-6.28 { | |
560 list [sqlite3_step $VM1] \ | |
561 [sqlite3_column_count $VM1] \ | |
562 [get_row_values $VM1] \ | |
563 [get_column_names $VM1] | |
564 } {SQLITE_ROW 1 13 {x counter}} | |
565 do_test capi2-6.99 { | |
566 sqlite3_finalize $VM1 | |
567 } {SQLITE_OK} | |
568 catchsql {ROLLBACK} | |
569 | |
570 do_test capi2-7.1 { | |
571 stepsql $DB { | |
572 SELECT * FROM t1 | |
573 } | |
574 } {0 1 2 3} | |
575 do_test capi2-7.2 { | |
576 stepsql $DB { | |
577 PRAGMA count_changes=on | |
578 } | |
579 } {0} | |
580 do_test capi2-7.3 { | |
581 stepsql $DB { | |
582 UPDATE t1 SET a=a+10; | |
583 } | |
584 } {0 1} | |
585 do_test capi2-7.4 { | |
586 stepsql $DB { | |
587 INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1; | |
588 } | |
589 } {0 1} | |
590 do_test capi2-7.4b {sqlite3_changes $DB} {1} | |
591 do_test capi2-7.5 { | |
592 stepsql $DB { | |
593 UPDATE t1 SET a=a+10; | |
594 } | |
595 } {0 2} | |
596 do_test capi2-7.5b {sqlite3_changes $DB} {2} | |
597 do_test capi2-7.6 { | |
598 stepsql $DB { | |
599 SELECT * FROM t1; | |
600 } | |
601 } {0 21 2 3 22 3 4} | |
602 do_test capi2-7.7 { | |
603 stepsql $DB { | |
604 INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1; | |
605 } | |
606 } {0 2} | |
607 do_test capi2-7.8 { | |
608 sqlite3_changes $DB | |
609 } {2} | |
610 do_test capi2-7.9 { | |
611 stepsql $DB { | |
612 SELECT * FROM t1; | |
613 } | |
614 } {0 21 2 3 22 3 4 23 4 5 24 5 6} | |
615 do_test capi2-7.10 { | |
616 stepsql $DB { | |
617 UPDATE t1 SET a=a-20; | |
618 SELECT * FROM t1; | |
619 } | |
620 } {0 4 1 2 3 2 3 4 3 4 5 4 5 6} | |
621 | |
622 # Update for version 3: A SELECT statement no longer resets the change | |
623 # counter (Test result changes from 0 to 4). | |
624 do_test capi2-7.11 { | |
625 sqlite3_changes $DB | |
626 } {4} | |
627 do_test capi2-7.11a { | |
628 execsql {SELECT count(*) FROM t1} | |
629 } {4} | |
630 | |
631 ifcapable {explain} { | |
632 do_test capi2-7.12 { | |
633 set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] | |
634 lindex $x 0 | |
635 } {0} | |
636 } | |
637 | |
638 # Ticket #261 - make sure we can finalize before the end of a query. | |
639 # | |
640 do_test capi2-8.1 { | |
641 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL] | |
642 sqlite3_finalize $VM1 | |
643 } {SQLITE_OK} | |
644 | |
645 # Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare | |
646 # and all of the return pointers in sqlite_step can be null. | |
647 # | |
648 do_test capi2-9.1 { | |
649 set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY] | |
650 sqlite3_step $VM1 | |
651 sqlite3_finalize $VM1 | |
652 } {SQLITE_OK} | |
653 | |
654 # Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset | |
655 # does not cause an error. | |
656 do_test capi2-10.1 { | |
657 sqlite3_finalize 0 | |
658 } {SQLITE_OK} | |
659 do_test capi2-10.2 { | |
660 sqlite3_reset 0 | |
661 } {SQLITE_OK} | |
662 | |
663 #--------------------------------------------------------------------------- | |
664 # The following tests - capi2-11.* - test the "column origin" APIs. | |
665 # | |
666 # sqlite3_column_origin_name() | |
667 # sqlite3_column_database_name() | |
668 # sqlite3_column_table_name() | |
669 # | |
670 | |
671 ifcapable columnmetadata { | |
672 | |
673 # This proc uses the database handle $::DB to compile the SQL statement passed | |
674 # as a parameter. The return value of this procedure is a list with one | |
675 # element for each column returned by the compiled statement. Each element of | |
676 # this list is itself a list of length three, consisting of the origin | |
677 # database, table and column for the corresponding returned column. | |
678 proc check_origins {sql} { | |
679 set ret [list] | |
680 set ::STMT [sqlite3_prepare $::DB $sql -1 dummy] | |
681 for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} { | |
682 lappend ret [list \ | |
683 [sqlite3_column_database_name $::STMT $i] \ | |
684 [sqlite3_column_table_name $::STMT $i] \ | |
685 [sqlite3_column_origin_name $::STMT $i] \ | |
686 ] | |
687 } | |
688 sqlite3_finalize $::STMT | |
689 return $ret | |
690 } | |
691 do_test capi2-11.1 { | |
692 execsql { | |
693 CREATE TABLE tab1(col1, col2); | |
694 } | |
695 } {} | |
696 do_test capi2-11.2 { | |
697 check_origins {SELECT col2, col1 FROM tab1} | |
698 } [list {main tab1 col2} {main tab1 col1}] | |
699 do_test capi2-11.3 { | |
700 check_origins {SELECT col2 AS hello, col1 AS world FROM tab1} | |
701 } [list {main tab1 col2} {main tab1 col1}] | |
702 | |
703 ifcapable subquery { | |
704 do_test capi2-11.4 { | |
705 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM tab1)} | |
706 } [list {main tab1 col2} {main tab1 col1}] | |
707 do_test capi2-11.5 { | |
708 check_origins {SELECT (SELECT col2 FROM tab1), (SELECT col1 FROM tab1)} | |
709 } [list {main tab1 col2} {main tab1 col1}] | |
710 do_test capi2-11.6 { | |
711 check_origins {SELECT (SELECT col2), (SELECT col1) FROM tab1} | |
712 } [list {main tab1 col2} {main tab1 col1}] | |
713 do_test capi2-11.7 { | |
714 check_origins {SELECT * FROM tab1} | |
715 } [list {main tab1 col1} {main tab1 col2}] | |
716 do_test capi2-11.8 { | |
717 check_origins {SELECT * FROM (SELECT * FROM tab1)} | |
718 } [list {main tab1 col1} {main tab1 col2}] | |
719 } | |
720 | |
721 ifcapable view&&subquery { | |
722 do_test capi2-12.1 { | |
723 execsql { | |
724 CREATE VIEW view1 AS SELECT * FROM tab1; | |
725 } | |
726 } {} | |
727 do_test capi2-12.2 { | |
728 check_origins {SELECT col2, col1 FROM view1} | |
729 } [list {main tab1 col2} {main tab1 col1}] | |
730 do_test capi2-12.3 { | |
731 check_origins {SELECT col2 AS hello, col1 AS world FROM view1} | |
732 } [list {main tab1 col2} {main tab1 col1}] | |
733 do_test capi2-12.4 { | |
734 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view1)} | |
735 } [list {main tab1 col2} {main tab1 col1}] | |
736 do_test capi2-12.5 { | |
737 check_origins {SELECT (SELECT col2 FROM view1), (SELECT col1 FROM view1)} | |
738 } [list {main tab1 col2} {main tab1 col1}] | |
739 do_test capi2-12.6 { | |
740 check_origins {SELECT (SELECT col2), (SELECT col1) FROM view1} | |
741 } [list {main tab1 col2} {main tab1 col1}] | |
742 do_test capi2-12.7 { | |
743 check_origins {SELECT * FROM view1} | |
744 } [list {main tab1 col1} {main tab1 col2}] | |
745 do_test capi2-12.8 { | |
746 check_origins {select * from (select * from view1)} | |
747 } [list {main tab1 col1} {main tab1 col2}] | |
748 do_test capi2-12.9 { | |
749 check_origins {select * from (select * from (select * from view1))} | |
750 } [list {main tab1 col1} {main tab1 col2}] | |
751 do_test capi2-12.10 { | |
752 db close | |
753 sqlite3 db test.db | |
754 set ::DB [sqlite3_connection_pointer db] | |
755 check_origins {select * from (select * from (select * from view1))} | |
756 } [list {main tab1 col1} {main tab1 col2}] | |
757 | |
758 # This view will thwart the flattening optimization. | |
759 do_test capi2-13.1 { | |
760 execsql { | |
761 CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10; | |
762 } | |
763 } {} | |
764 do_test capi2-13.2 { | |
765 check_origins {SELECT col2, col1 FROM view2} | |
766 } [list {main tab1 col2} {main tab1 col1}] | |
767 do_test capi2-13.3 { | |
768 check_origins {SELECT col2 AS hello, col1 AS world FROM view2} | |
769 } [list {main tab1 col2} {main tab1 col1}] | |
770 do_test capi2-13.4 { | |
771 check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view2)} | |
772 } [list {main tab1 col2} {main tab1 col1}] | |
773 do_test capi2-13.5 { | |
774 check_origins {SELECT (SELECT col2 FROM view2), (SELECT col1 FROM view2)} | |
775 } [list {main tab1 col2} {main tab1 col1}] | |
776 do_test capi2-13.6 { | |
777 check_origins {SELECT (SELECT col2), (SELECT col1) FROM view2} | |
778 } [list {main tab1 col2} {main tab1 col1}] | |
779 do_test capi2-13.7 { | |
780 check_origins {SELECT * FROM view2} | |
781 } [list {main tab1 col1} {main tab1 col2}] | |
782 do_test capi2-13.8 { | |
783 check_origins {select * from (select * from view2)} | |
784 } [list {main tab1 col1} {main tab1 col2}] | |
785 do_test capi2-13.9 { | |
786 check_origins {select * from (select * from (select * from view2))} | |
787 } [list {main tab1 col1} {main tab1 col2}] | |
788 do_test capi2-13.10 { | |
789 db close | |
790 sqlite3 db test.db | |
791 set ::DB [sqlite3_connection_pointer db] | |
792 check_origins {select * from (select * from (select * from view2))} | |
793 } [list {main tab1 col1} {main tab1 col2}] | |
794 do_test capi2-13.11 { | |
795 check_origins {select * from (select * from tab1 limit 10 offset 10)} | |
796 } [list {main tab1 col1} {main tab1 col2}] | |
797 } | |
798 | |
799 | |
800 } ;# ifcapable columnmetadata | |
801 | |
802 db2 close | |
803 finish_test | |
OLD | NEW |