OLD | NEW |
| (Empty) |
1 # 2006 November 08 | |
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. | |
12 # | |
13 # This is a copy of the capi3.test file that has been adapted to | |
14 # test the new sqlite3_prepare_v2 interface. | |
15 # | |
16 # $Id: capi3c.test,v 1.23 2009/07/22 07:27:57 danielk1977 Exp $ | |
17 # | |
18 | |
19 set testdir [file dirname $argv0] | |
20 source $testdir/tester.tcl | |
21 set testprefix capi3c | |
22 | |
23 # Do not use a codec for tests in this file, as the database file is | |
24 # manipulated directly using tcl scripts (using the [hexio_write] command). | |
25 # | |
26 do_not_use_codec | |
27 | |
28 # Return the UTF-16 representation of the supplied UTF-8 string $str. | |
29 # If $nt is true, append two 0x00 bytes as a nul terminator. | |
30 proc utf16 {str {nt 1}} { | |
31 set r [encoding convertto unicode $str] | |
32 if {$nt} { | |
33 append r "\x00\x00" | |
34 } | |
35 return $r | |
36 } | |
37 | |
38 # Return the UTF-8 representation of the supplied UTF-16 string $str. | |
39 proc utf8 {str} { | |
40 # If $str ends in two 0x00 0x00 bytes, knock these off before | |
41 # converting to UTF-8 using TCL. | |
42 binary scan $str \c* vals | |
43 if {[lindex $vals end]==0 && [lindex $vals end-1]==0} { | |
44 set str [binary format \c* [lrange $vals 0 end-2]] | |
45 } | |
46 | |
47 set r [encoding convertfrom unicode $str] | |
48 return $r | |
49 } | |
50 | |
51 # These tests complement those in capi2.test. They are organized | |
52 # as follows: | |
53 # | |
54 # capi3c-1.*: Test sqlite3_prepare_v2 | |
55 # capi3c-2.*: Test sqlite3_prepare16_v2 | |
56 # capi3c-3.*: Test sqlite3_open | |
57 # capi3c-4.*: Test sqlite3_open16 | |
58 # capi3c-5.*: Test the various sqlite3_result_* APIs | |
59 # capi3c-6.*: Test that sqlite3_close fails if there are outstanding VMs. | |
60 # | |
61 | |
62 set DB [sqlite3_connection_pointer db] | |
63 | |
64 do_test capi3c-1.0 { | |
65 sqlite3_get_autocommit $DB | |
66 } 1 | |
67 do_test capi3c-1.1 { | |
68 set STMT [sqlite3_prepare_v2 $DB {SELECT name FROM sqlite_master} -1 TAIL] | |
69 sqlite3_finalize $STMT | |
70 set TAIL | |
71 } {} | |
72 do_test capi3c-1.2.1 { | |
73 sqlite3_errcode $DB | |
74 } {SQLITE_OK} | |
75 do_test capi3c-1.2.2 { | |
76 sqlite3_extended_errcode $DB | |
77 } {SQLITE_OK} | |
78 do_test capi3c-1.3 { | |
79 sqlite3_errmsg $DB | |
80 } {not an error} | |
81 do_test capi3c-1.4 { | |
82 set sql {SELECT name FROM sqlite_master;SELECT 10} | |
83 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
84 sqlite3_finalize $STMT | |
85 set TAIL | |
86 } {SELECT 10} | |
87 do_test capi3c-1.5 { | |
88 set sql {SELECT namex FROM sqlite_master} | |
89 catch { | |
90 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
91 } | |
92 } {1} | |
93 do_test capi3c-1.6.1 { | |
94 sqlite3_errcode $DB | |
95 } {SQLITE_ERROR} | |
96 do_test capi3c-1.6.2 { | |
97 sqlite3_extended_errcode $DB | |
98 } {SQLITE_ERROR} | |
99 do_test capi3c-1.7 { | |
100 sqlite3_errmsg $DB | |
101 } {no such column: namex} | |
102 | |
103 | |
104 ifcapable {utf16} { | |
105 do_test capi3c-2.1 { | |
106 set sql16 [utf16 {SELECT name FROM sqlite_master}] | |
107 set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 ::TAIL] | |
108 sqlite3_finalize $STMT | |
109 utf8 $::TAIL | |
110 } {} | |
111 do_test capi3c-2.2 { | |
112 set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}] | |
113 set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] | |
114 sqlite3_finalize $STMT | |
115 utf8 $TAIL | |
116 } {SELECT 10} | |
117 do_test capi3c-2.3 { | |
118 set sql [utf16 {SELECT namex FROM sqlite_master}] | |
119 catch { | |
120 set STMT [sqlite3_prepare16_v2 $DB $sql -1 TAIL] | |
121 } | |
122 } {1} | |
123 do_test capi3c-2.4.1 { | |
124 sqlite3_errcode $DB | |
125 } {SQLITE_ERROR} | |
126 do_test capi3c-2.4.2 { | |
127 sqlite3_extended_errcode $DB | |
128 } {SQLITE_ERROR} | |
129 do_test capi3c-2.5 { | |
130 sqlite3_errmsg $DB | |
131 } {no such column: namex} | |
132 | |
133 ifcapable schema_pragmas { | |
134 do_test capi3c-2.6 { | |
135 execsql {CREATE TABLE tablename(x)} | |
136 set sql16 [utf16 {PRAGMA table_info("TableName")}] | |
137 set STMT [sqlite3_prepare16_v2 $DB $sql16 -1 TAIL] | |
138 sqlite3_step $STMT | |
139 } SQLITE_ROW | |
140 do_test capi3c-2.7 { | |
141 sqlite3_step $STMT | |
142 } SQLITE_DONE | |
143 do_test capi3c-2.8 { | |
144 sqlite3_finalize $STMT | |
145 } SQLITE_OK | |
146 } | |
147 | |
148 } ;# endif utf16 | |
149 | |
150 # rename sqlite3_open sqlite3_open_old | |
151 # proc sqlite3_open {fname options} {sqlite3_open_new $fname $options} | |
152 | |
153 do_test capi3c-3.1 { | |
154 set db2 [sqlite3_open test.db {}] | |
155 sqlite3_errcode $db2 | |
156 } {SQLITE_OK} | |
157 # FIX ME: Should test the db handle works. | |
158 do_test capi3c-3.2 { | |
159 sqlite3_close $db2 | |
160 } {SQLITE_OK} | |
161 do_test capi3c-3.3 { | |
162 catch { | |
163 set db2 [sqlite3_open /bogus/path/test.db {}] | |
164 } | |
165 sqlite3_errcode $db2 | |
166 } {SQLITE_CANTOPEN} | |
167 do_test capi3c-3.4 { | |
168 sqlite3_errmsg $db2 | |
169 } {unable to open database file} | |
170 do_test capi3c-3.5 { | |
171 sqlite3_close $db2 | |
172 } {SQLITE_OK} | |
173 if {[clang_sanitize_address]==0} { | |
174 do_test capi3c-3.6.1-misuse { | |
175 sqlite3_close $db2 | |
176 } {SQLITE_MISUSE} | |
177 do_test capi3c-3.6.2-misuse { | |
178 sqlite3_errmsg $db2 | |
179 } {library routine called out of sequence} | |
180 ifcapable {utf16} { | |
181 do_test capi3c-3.6.3-misuse { | |
182 utf8 [sqlite3_errmsg16 $db2] | |
183 } {library routine called out of sequence} | |
184 } | |
185 } | |
186 | |
187 # rename sqlite3_open "" | |
188 # rename sqlite3_open_old sqlite3_open | |
189 | |
190 ifcapable {utf16} { | |
191 do_test capi3c-4.1 { | |
192 set db2 [sqlite3_open16 [utf16 test.db] {}] | |
193 sqlite3_errcode $db2 | |
194 } {SQLITE_OK} | |
195 # FIX ME: Should test the db handle works. | |
196 do_test capi3c-4.2 { | |
197 sqlite3_close $db2 | |
198 } {SQLITE_OK} | |
199 do_test capi3c-4.3 { | |
200 catch { | |
201 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}] | |
202 } | |
203 sqlite3_errcode $db2 | |
204 } {SQLITE_CANTOPEN} | |
205 do_test capi3c-4.4 { | |
206 utf8 [sqlite3_errmsg16 $db2] | |
207 } {unable to open database file} | |
208 do_test capi3c-4.5 { | |
209 sqlite3_close $db2 | |
210 } {SQLITE_OK} | |
211 } ;# utf16 | |
212 | |
213 # This proc is used to test the following API calls: | |
214 # | |
215 # sqlite3_column_count | |
216 # sqlite3_column_name | |
217 # sqlite3_column_name16 | |
218 # sqlite3_column_decltype | |
219 # sqlite3_column_decltype16 | |
220 # | |
221 # $STMT is a compiled SQL statement. $test is a prefix | |
222 # to use for test names within this proc. $names is a list | |
223 # of the column names that should be returned by $STMT. | |
224 # $decltypes is a list of column declaration types for $STMT. | |
225 # | |
226 # Example: | |
227 # | |
228 # set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] | |
229 # check_header test1.1 {1 2 3} {"" "" ""} | |
230 # | |
231 proc check_header {STMT test names decltypes} { | |
232 | |
233 # Use the return value of sqlite3_column_count() to build | |
234 # a list of column indexes. i.e. If sqlite3_column_count | |
235 # is 3, build the list {0 1 2}. | |
236 set ::idxlist [list] | |
237 set ::numcols [sqlite3_column_count $STMT] | |
238 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} | |
239 | |
240 # Column names in UTF-8 | |
241 do_test $test.1 { | |
242 set cnamelist [list] | |
243 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} | |
244 set cnamelist | |
245 } $names | |
246 | |
247 # Column names in UTF-16 | |
248 ifcapable {utf16} { | |
249 do_test $test.2 { | |
250 set cnamelist [list] | |
251 foreach i $idxlist { | |
252 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] | |
253 } | |
254 set cnamelist | |
255 } $names | |
256 } | |
257 | |
258 # Column names in UTF-8 | |
259 do_test $test.3 { | |
260 set cnamelist [list] | |
261 foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]} | |
262 set cnamelist | |
263 } $names | |
264 | |
265 # Column names in UTF-16 | |
266 ifcapable {utf16} { | |
267 do_test $test.4 { | |
268 set cnamelist [list] | |
269 foreach i $idxlist { | |
270 lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]] | |
271 } | |
272 set cnamelist | |
273 } $names | |
274 } | |
275 | |
276 # Column names in UTF-8 | |
277 do_test $test.5 { | |
278 set cnamelist [list] | |
279 foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]} | |
280 set cnamelist | |
281 } $decltypes | |
282 | |
283 # Column declaration types in UTF-16 | |
284 ifcapable {utf16} { | |
285 do_test $test.6 { | |
286 set cnamelist [list] | |
287 foreach i $idxlist { | |
288 lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]] | |
289 } | |
290 set cnamelist | |
291 } $decltypes | |
292 } | |
293 | |
294 | |
295 # Test some out of range conditions: | |
296 ifcapable {utf16} { | |
297 do_test $test.7 { | |
298 list \ | |
299 [sqlite3_column_name $STMT -1] \ | |
300 [sqlite3_column_name16 $STMT -1] \ | |
301 [sqlite3_column_decltype $STMT -1] \ | |
302 [sqlite3_column_decltype16 $STMT -1] \ | |
303 [sqlite3_column_name $STMT $numcols] \ | |
304 [sqlite3_column_name16 $STMT $numcols] \ | |
305 [sqlite3_column_decltype $STMT $numcols] \ | |
306 [sqlite3_column_decltype16 $STMT $numcols] | |
307 } {{} {} {} {} {} {} {} {}} | |
308 } | |
309 } | |
310 | |
311 # This proc is used to test the following API calls: | |
312 # | |
313 # sqlite3_column_origin_name | |
314 # sqlite3_column_origin_name16 | |
315 # sqlite3_column_table_name | |
316 # sqlite3_column_table_name16 | |
317 # sqlite3_column_database_name | |
318 # sqlite3_column_database_name16 | |
319 # | |
320 # $STMT is a compiled SQL statement. $test is a prefix | |
321 # to use for test names within this proc. $names is a list | |
322 # of the column names that should be returned by $STMT. | |
323 # $decltypes is a list of column declaration types for $STMT. | |
324 # | |
325 # Example: | |
326 # | |
327 # set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY] | |
328 # check_header test1.1 {1 2 3} {"" "" ""} | |
329 # | |
330 proc check_origin_header {STMT test dbs tables cols} { | |
331 # If sqlite3_column_origin_name() and friends are not compiled into | |
332 # this build, this proc is a no-op. | |
333 ifcapable columnmetadata { | |
334 | |
335 # Use the return value of sqlite3_column_count() to build | |
336 # a list of column indexes. i.e. If sqlite3_column_count | |
337 # is 3, build the list {0 1 2}. | |
338 set ::idxlist [list] | |
339 set ::numcols [sqlite3_column_count $STMT] | |
340 for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i} | |
341 | |
342 # Database names in UTF-8 | |
343 do_test $test.8 { | |
344 set cnamelist [list] | |
345 foreach i $idxlist { | |
346 lappend cnamelist [sqlite3_column_database_name $STMT $i] | |
347 } | |
348 set cnamelist | |
349 } $dbs | |
350 | |
351 # Database names in UTF-16 | |
352 ifcapable {utf16} { | |
353 do_test $test.9 { | |
354 set cnamelist [list] | |
355 foreach i $idxlist { | |
356 lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]] | |
357 } | |
358 set cnamelist | |
359 } $dbs | |
360 } | |
361 | |
362 # Table names in UTF-8 | |
363 do_test $test.10 { | |
364 set cnamelist [list] | |
365 foreach i $idxlist { | |
366 lappend cnamelist [sqlite3_column_table_name $STMT $i] | |
367 } | |
368 set cnamelist | |
369 } $tables | |
370 | |
371 # Table names in UTF-16 | |
372 ifcapable {utf16} { | |
373 do_test $test.11 { | |
374 set cnamelist [list] | |
375 foreach i $idxlist { | |
376 lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]] | |
377 } | |
378 set cnamelist | |
379 } $tables | |
380 } | |
381 | |
382 # Origin names in UTF-8 | |
383 do_test $test.12 { | |
384 set cnamelist [list] | |
385 foreach i $idxlist { | |
386 lappend cnamelist [sqlite3_column_origin_name $STMT $i] | |
387 } | |
388 set cnamelist | |
389 } $cols | |
390 | |
391 # Origin declaration types in UTF-16 | |
392 ifcapable {utf16} { | |
393 do_test $test.13 { | |
394 set cnamelist [list] | |
395 foreach i $idxlist { | |
396 lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]] | |
397 } | |
398 set cnamelist | |
399 } $cols | |
400 } | |
401 } | |
402 } | |
403 | |
404 # This proc is used to test the following APIs: | |
405 # | |
406 # sqlite3_data_count | |
407 # sqlite3_column_type | |
408 # sqlite3_column_int | |
409 # sqlite3_column_text | |
410 # sqlite3_column_text16 | |
411 # sqlite3_column_double | |
412 # | |
413 # $STMT is a compiled SQL statement for which the previous call | |
414 # to sqlite3_step returned SQLITE_ROW. $test is a prefix to use | |
415 # for test names within this proc. $types is a list of the | |
416 # manifest types for the current row. $ints, $doubles and $strings | |
417 # are lists of the integer, real and string representations of | |
418 # the values in the current row. | |
419 # | |
420 # Example: | |
421 # | |
422 # set STMT [sqlite3_prepare_v2 "SELECT 'hello', 1.1, NULL" -1 DUMMY] | |
423 # sqlite3_step $STMT | |
424 # check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}} | |
425 # | |
426 proc check_data {STMT test types ints doubles strings} { | |
427 | |
428 # Use the return value of sqlite3_column_count() to build | |
429 # a list of column indexes. i.e. If sqlite3_column_count | |
430 # is 3, build the list {0 1 2}. | |
431 set ::idxlist [list] | |
432 set numcols [sqlite3_data_count $STMT] | |
433 for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i} | |
434 | |
435 # types | |
436 do_test $test.1 { | |
437 set types [list] | |
438 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} | |
439 set types | |
440 } $types | |
441 | |
442 # Integers | |
443 do_test $test.2 { | |
444 set ints [list] | |
445 foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]} | |
446 set ints | |
447 } $ints | |
448 | |
449 # bytes | |
450 set lens [list] | |
451 foreach i $::idxlist { | |
452 lappend lens [string length [lindex $strings $i]] | |
453 } | |
454 do_test $test.3 { | |
455 set bytes [list] | |
456 set lens [list] | |
457 foreach i $idxlist { | |
458 lappend bytes [sqlite3_column_bytes $STMT $i] | |
459 } | |
460 set bytes | |
461 } $lens | |
462 | |
463 # bytes16 | |
464 ifcapable {utf16} { | |
465 set lens [list] | |
466 foreach i $::idxlist { | |
467 lappend lens [expr 2 * [string length [lindex $strings $i]]] | |
468 } | |
469 do_test $test.4 { | |
470 set bytes [list] | |
471 set lens [list] | |
472 foreach i $idxlist { | |
473 lappend bytes [sqlite3_column_bytes16 $STMT $i] | |
474 } | |
475 set bytes | |
476 } $lens | |
477 } | |
478 | |
479 # Blob | |
480 do_test $test.5 { | |
481 set utf8 [list] | |
482 foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]} | |
483 set utf8 | |
484 } $strings | |
485 | |
486 # UTF-8 | |
487 do_test $test.6 { | |
488 set utf8 [list] | |
489 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} | |
490 set utf8 | |
491 } $strings | |
492 | |
493 # Floats | |
494 do_test $test.7 { | |
495 set utf8 [list] | |
496 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} | |
497 set utf8 | |
498 } $doubles | |
499 | |
500 # UTF-16 | |
501 ifcapable {utf16} { | |
502 do_test $test.8 { | |
503 set utf8 [list] | |
504 foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]} | |
505 set utf8 | |
506 } $strings | |
507 } | |
508 | |
509 # Integers | |
510 do_test $test.9 { | |
511 set ints [list] | |
512 foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]} | |
513 set ints | |
514 } $ints | |
515 | |
516 # Floats | |
517 do_test $test.10 { | |
518 set utf8 [list] | |
519 foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]} | |
520 set utf8 | |
521 } $doubles | |
522 | |
523 # UTF-8 | |
524 do_test $test.11 { | |
525 set utf8 [list] | |
526 foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]} | |
527 set utf8 | |
528 } $strings | |
529 | |
530 # Types | |
531 do_test $test.12 { | |
532 set types [list] | |
533 foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} | |
534 set types | |
535 } $types | |
536 | |
537 # Test that an out of range request returns the equivalent of NULL | |
538 do_test $test.13 { | |
539 sqlite3_column_int $STMT -1 | |
540 } {0} | |
541 do_test $test.13 { | |
542 sqlite3_column_text $STMT -1 | |
543 } {} | |
544 | |
545 } | |
546 | |
547 ifcapable !floatingpoint { | |
548 finish_test | |
549 return | |
550 } | |
551 | |
552 do_test capi3c-5.0 { | |
553 execsql { | |
554 CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16)); | |
555 INSERT INTO t1 VALUES(1, 2, 3); | |
556 INSERT INTO t1 VALUES('one', 'two', NULL); | |
557 INSERT INTO t1 VALUES(1.2, 1.3, 1.4); | |
558 } | |
559 set sql "SELECT * FROM t1" | |
560 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
561 sqlite3_column_count $STMT | |
562 } 3 | |
563 | |
564 check_header $STMT capi3c-5.1 {a b c} {VARINT BLOB VARCHAR(16)} | |
565 check_origin_header $STMT capi3c-5.1 {main main main} {t1 t1 t1} {a b c} | |
566 do_test capi3c-5.2 { | |
567 sqlite3_step $STMT | |
568 } SQLITE_ROW | |
569 | |
570 check_header $STMT capi3c-5.3 {a b c} {VARINT BLOB VARCHAR(16)} | |
571 check_origin_header $STMT capi3c-5.3 {main main main} {t1 t1 t1} {a b c} | |
572 check_data $STMT capi3c-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3} | |
573 | |
574 do_test capi3c-5.5 { | |
575 sqlite3_step $STMT | |
576 } SQLITE_ROW | |
577 | |
578 check_header $STMT capi3c-5.6 {a b c} {VARINT BLOB VARCHAR(16)} | |
579 check_origin_header $STMT capi3c-5.6 {main main main} {t1 t1 t1} {a b c} | |
580 check_data $STMT capi3c-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}} | |
581 | |
582 do_test capi3c-5.8 { | |
583 sqlite3_step $STMT | |
584 } SQLITE_ROW | |
585 | |
586 check_header $STMT capi3c-5.9 {a b c} {VARINT BLOB VARCHAR(16)} | |
587 check_origin_header $STMT capi3c-5.9 {main main main} {t1 t1 t1} {a b c} | |
588 check_data $STMT capi3c-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1
.4} | |
589 | |
590 do_test capi3c-5.11 { | |
591 sqlite3_step $STMT | |
592 } SQLITE_DONE | |
593 | |
594 do_test capi3c-5.12 { | |
595 sqlite3_finalize $STMT | |
596 } SQLITE_OK | |
597 | |
598 do_test capi3c-5.20 { | |
599 set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a" | |
600 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
601 sqlite3_column_count $STMT | |
602 } 3 | |
603 | |
604 check_header $STMT capi3c-5.21 {a sum(b) max(c)} {VARINT {} {}} | |
605 check_origin_header $STMT capi3c-5.22 {main {} {}} {t1 {} {}} {a {} {}} | |
606 do_test capi3c-5.23 { | |
607 sqlite3_finalize $STMT | |
608 } SQLITE_OK | |
609 | |
610 | |
611 set ::ENC [execsql {pragma encoding}] | |
612 db close | |
613 | |
614 do_test capi3c-6.0 { | |
615 sqlite3 db test.db | |
616 set DB [sqlite3_connection_pointer db] | |
617 if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy } | |
618 set sql {SELECT a FROM t1 order by rowid} | |
619 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
620 expr 0 | |
621 } {0} | |
622 do_test capi3c-6.1 { | |
623 db cache flush | |
624 sqlite3_close $DB | |
625 } {SQLITE_BUSY} | |
626 do_test capi3c-6.2 { | |
627 sqlite3_step $STMT | |
628 } {SQLITE_ROW} | |
629 check_data $STMT capi3c-6.3 {INTEGER} {1} {1.0} {1} | |
630 do_test capi3c-6.3 { | |
631 sqlite3_finalize $STMT | |
632 } {SQLITE_OK} | |
633 if {[clang_sanitize_address]==0} { | |
634 do_test capi3c-6.4 { | |
635 db cache flush | |
636 sqlite3_close $DB | |
637 } {SQLITE_OK} | |
638 do_test capi3c-6.99-misuse { | |
639 db close | |
640 } {} | |
641 } else { | |
642 db close | |
643 } | |
644 | |
645 # This procedure sets the value of the file-format in file 'test.db' | |
646 # to $newval. Also, the schema cookie is incremented. | |
647 # | |
648 proc set_file_format {newval} { | |
649 hexio_write test.db 44 [hexio_render_int32 $newval] | |
650 set schemacookie [hexio_get_int [hexio_read test.db 40 4]] | |
651 incr schemacookie | |
652 hexio_write test.db 40 [hexio_render_int32 $schemacookie] | |
653 return {} | |
654 } | |
655 | |
656 # This procedure returns the value of the file-format in file 'test.db'. | |
657 # | |
658 proc get_file_format {{fname test.db}} { | |
659 return [hexio_get_int [hexio_read $fname 44 4]] | |
660 } | |
661 | |
662 if {![sqlite3 -has-codec]} { | |
663 # Test what happens when the library encounters a newer file format. | |
664 do_test capi3c-7.1 { | |
665 set_file_format 5 | |
666 } {} | |
667 do_test capi3c-7.2 { | |
668 catch { sqlite3 db test.db } | |
669 catchsql { | |
670 SELECT * FROM sqlite_master; | |
671 } | |
672 } {1 {unsupported file format}} | |
673 db close | |
674 } | |
675 | |
676 if {![sqlite3 -has-codec]} { | |
677 # Now test that the library correctly handles bogus entries in the | |
678 # sqlite_master table (schema corruption). | |
679 do_test capi3c-8.1 { | |
680 forcedelete test.db test.db-journal | |
681 sqlite3 db test.db | |
682 execsql { | |
683 CREATE TABLE t1(a); | |
684 } | |
685 db close | |
686 } {} | |
687 do_test capi3c-8.2 { | |
688 sqlite3 db test.db | |
689 execsql { | |
690 PRAGMA writable_schema=ON; | |
691 INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL); | |
692 } | |
693 db close | |
694 } {} | |
695 do_test capi3c-8.3 { | |
696 catch { sqlite3 db test.db } | |
697 catchsql { | |
698 SELECT * FROM sqlite_master; | |
699 } | |
700 } {1 {malformed database schema (?)}} | |
701 do_test capi3c-8.4 { | |
702 # Build a 5-field row record. The first field is a string 'table', and | |
703 # subsequent fields are all NULL. | |
704 db close | |
705 forcedelete test.db test.db-journal | |
706 sqlite3 db test.db | |
707 execsql { | |
708 CREATE TABLE t1(a); | |
709 PRAGMA writable_schema=ON; | |
710 INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL); | |
711 } | |
712 db close | |
713 } {}; | |
714 do_test capi3c-8.5 { | |
715 catch { sqlite3 db test.db } | |
716 catchsql { | |
717 SELECT * FROM sqlite_master; | |
718 } | |
719 } {1 {malformed database schema (?)}} | |
720 db close | |
721 } | |
722 forcedelete test.db | |
723 forcedelete test.db-journal | |
724 | |
725 | |
726 # Test the english language string equivalents for sqlite error codes | |
727 set code2english [list \ | |
728 SQLITE_OK {not an error} \ | |
729 SQLITE_ERROR {SQL logic error or missing database} \ | |
730 SQLITE_PERM {access permission denied} \ | |
731 SQLITE_ABORT {callback requested query abort} \ | |
732 SQLITE_BUSY {database is locked} \ | |
733 SQLITE_LOCKED {database table is locked} \ | |
734 SQLITE_NOMEM {out of memory} \ | |
735 SQLITE_READONLY {attempt to write a readonly database} \ | |
736 SQLITE_INTERRUPT {interrupted} \ | |
737 SQLITE_IOERR {disk I/O error} \ | |
738 SQLITE_CORRUPT {database disk image is malformed} \ | |
739 SQLITE_FULL {database or disk is full} \ | |
740 SQLITE_CANTOPEN {unable to open database file} \ | |
741 SQLITE_EMPTY {table contains no data} \ | |
742 SQLITE_SCHEMA {database schema has changed} \ | |
743 SQLITE_CONSTRAINT {constraint failed} \ | |
744 SQLITE_MISMATCH {datatype mismatch} \ | |
745 SQLITE_MISUSE {library routine called out of sequence} \ | |
746 SQLITE_NOLFS {large file support is disabled} \ | |
747 SQLITE_AUTH {authorization denied} \ | |
748 SQLITE_FORMAT {auxiliary database format error} \ | |
749 SQLITE_RANGE {bind or column index out of range} \ | |
750 SQLITE_NOTADB {file is encrypted or is not a database} \ | |
751 unknownerror {unknown error} \ | |
752 ] | |
753 | |
754 set test_number 1 | |
755 foreach {code english} $code2english { | |
756 do_test capi3c-9.$test_number "sqlite3_test_errstr $code" $english | |
757 incr test_number | |
758 } | |
759 | |
760 # Test the error message when a "real" out of memory occurs. | |
761 if { [permutation] != "nofaultsim" } { | |
762 ifcapable memdebug { | |
763 do_test capi3c-10-1 { | |
764 sqlite3 db test.db | |
765 set DB [sqlite3_connection_pointer db] | |
766 sqlite3_memdebug_fail 0 | |
767 catchsql { | |
768 select * from sqlite_master; | |
769 } | |
770 } {1 {out of memory}} | |
771 do_test capi3c-10-2 { | |
772 sqlite3_errmsg $::DB | |
773 } {out of memory} | |
774 ifcapable {utf16} { | |
775 do_test capi3c-10-3 { | |
776 utf8 [sqlite3_errmsg16 $::DB] | |
777 } {out of memory} | |
778 } | |
779 db close | |
780 sqlite3_memdebug_fail -1 | |
781 } | |
782 } | |
783 | |
784 # The following tests - capi3c-11.* - test that a COMMIT or ROLLBACK | |
785 # statement issued while there are still outstanding VMs that are part of | |
786 # the transaction fails. | |
787 sqlite3 db test.db | |
788 set DB [sqlite3_connection_pointer db] | |
789 sqlite_register_test_function $DB func | |
790 do_test capi3c-11.1 { | |
791 execsql { | |
792 BEGIN; | |
793 CREATE TABLE t1(a, b); | |
794 INSERT INTO t1 VALUES(1, 'int'); | |
795 INSERT INTO t1 VALUES(2, 'notatype'); | |
796 } | |
797 } {} | |
798 do_test capi3c-11.1.1 { | |
799 sqlite3_get_autocommit $DB | |
800 } 0 | |
801 do_test capi3c-11.2 { | |
802 set STMT [sqlite3_prepare_v2 $DB "SELECT func(b, a) FROM t1" -1 TAIL] | |
803 sqlite3_step $STMT | |
804 } {SQLITE_ROW} | |
805 | |
806 # As of 3.6.5 a COMMIT is OK during while a query is still running - | |
807 # as long as it is a read-only query and not an incremental BLOB write. | |
808 # | |
809 do_test capi3-11.3.1 { | |
810 catchsql { | |
811 COMMIT; | |
812 } | |
813 } {0 {}} | |
814 do_test capi3-11.3.2 { | |
815 sqlite3_extended_errcode $DB | |
816 } {SQLITE_OK} | |
817 do_test capi3-11.3.3 { | |
818 sqlite3_get_autocommit $DB | |
819 } 1 | |
820 do_test capi3-11.3.4 { | |
821 db eval {PRAGMA lock_status} | |
822 } {main shared temp closed} | |
823 | |
824 do_test capi3c-11.4 { | |
825 sqlite3_step $STMT | |
826 } {SQLITE_ERROR} | |
827 do_test capi3c-11.5 { | |
828 sqlite3_finalize $STMT | |
829 } {SQLITE_ERROR} | |
830 do_test capi3c-11.6 { | |
831 catchsql { | |
832 SELECT * FROM t1; | |
833 } | |
834 } {0 {1 int 2 notatype}} | |
835 do_test capi3c-11.7 { | |
836 sqlite3_get_autocommit $DB | |
837 } 1 | |
838 do_test capi3c-11.8 { | |
839 execsql { | |
840 CREATE TABLE t2(a); | |
841 INSERT INTO t2 VALUES(1); | |
842 INSERT INTO t2 VALUES(2); | |
843 BEGIN; | |
844 INSERT INTO t2 VALUES(3); | |
845 } | |
846 } {} | |
847 do_test capi3c-11.8.1 { | |
848 sqlite3_get_autocommit $DB | |
849 } 0 | |
850 do_test capi3c-11.9 { | |
851 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] | |
852 sqlite3_step $STMT | |
853 } {SQLITE_ROW} | |
854 do_test capi3c-11.9.1 { | |
855 sqlite3_get_autocommit $DB | |
856 } 0 | |
857 do_test capi3c-11.9.2 { | |
858 catchsql { | |
859 ROLLBACK; | |
860 } | |
861 } {0 {}} | |
862 do_test capi3c-11.9.3 { | |
863 sqlite3_get_autocommit $DB | |
864 } 1 | |
865 do_test capi3c-11.10 { | |
866 sqlite3_step $STMT | |
867 } {SQLITE_ROW} | |
868 ifcapable !autoreset { | |
869 # If SQLITE_OMIT_AUTORESET is defined, then the statement must be | |
870 # reset() before it can be passed to step() again. | |
871 do_test capi3-11.11a { sqlite3_step $STMT } {SQLITE_MISUSE} | |
872 do_test capi3-11.11b { sqlite3_reset $STMT } {SQLITE_ABORT} | |
873 } | |
874 do_test capi3c-11.11 { | |
875 sqlite3_step $STMT | |
876 } {SQLITE_DONE} | |
877 do_test capi3c-11.12 { | |
878 sqlite3_step $STMT | |
879 sqlite3_step $STMT | |
880 } {SQLITE_ROW} | |
881 do_test capi3c-11.13 { | |
882 sqlite3_finalize $STMT | |
883 } {SQLITE_OK} | |
884 do_test capi3c-11.14 { | |
885 execsql { | |
886 SELECT a FROM t2; | |
887 } | |
888 } {1 2} | |
889 do_test capi3c-11.14.1 { | |
890 sqlite3_get_autocommit $DB | |
891 } 1 | |
892 do_test capi3c-11.15 { | |
893 catchsql { | |
894 ROLLBACK; | |
895 } | |
896 } {1 {cannot rollback - no transaction is active}} | |
897 do_test capi3c-11.15.1 { | |
898 sqlite3_get_autocommit $DB | |
899 } 1 | |
900 do_test capi3c-11.16 { | |
901 execsql { | |
902 SELECT a FROM t2; | |
903 } | |
904 } {1 2} | |
905 | |
906 # Sanity check on the definition of 'outstanding VM'. This means any VM | |
907 # that has had sqlite3_step() called more recently than sqlite3_finalize() or | |
908 # sqlite3_reset(). So a VM that has just been prepared or reset does not | |
909 # count as an active VM. | |
910 do_test capi3c-11.17 { | |
911 execsql { | |
912 BEGIN; | |
913 } | |
914 } {} | |
915 do_test capi3c-11.18 { | |
916 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL] | |
917 catchsql { | |
918 COMMIT; | |
919 } | |
920 } {0 {}} | |
921 do_test capi3c-11.19 { | |
922 sqlite3_step $STMT | |
923 } {SQLITE_ROW} | |
924 do_test capi3c-11.20 { | |
925 catchsql { | |
926 BEGIN; | |
927 COMMIT; | |
928 } | |
929 } {0 {}} | |
930 do_test capi3c-11.20 { | |
931 sqlite3_reset $STMT | |
932 catchsql { | |
933 COMMIT; | |
934 } | |
935 } {1 {cannot commit - no transaction is active}} | |
936 do_test capi3c-11.21 { | |
937 sqlite3_finalize $STMT | |
938 } {SQLITE_OK} | |
939 | |
940 # The following tests - capi3c-12.* - check that its Ok to start a | |
941 # transaction while other VMs are active, and that its Ok to execute | |
942 # atomic updates in the same situation | |
943 # | |
944 do_test capi3c-12.1 { | |
945 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] | |
946 sqlite3_step $STMT | |
947 } {SQLITE_ROW} | |
948 do_test capi3c-12.2 { | |
949 catchsql { | |
950 INSERT INTO t1 VALUES(3, NULL); | |
951 } | |
952 } {0 {}} | |
953 do_test capi3c-12.3 { | |
954 catchsql { | |
955 INSERT INTO t2 VALUES(4); | |
956 } | |
957 } {0 {}} | |
958 do_test capi3c-12.4 { | |
959 catchsql { | |
960 BEGIN; | |
961 INSERT INTO t1 VALUES(4, NULL); | |
962 } | |
963 } {0 {}} | |
964 do_test capi3c-12.5 { | |
965 sqlite3_step $STMT | |
966 } {SQLITE_ROW} | |
967 do_test capi3c-12.5.1 { | |
968 sqlite3_step $STMT | |
969 } {SQLITE_ROW} | |
970 do_test capi3c-12.6 { | |
971 sqlite3_step $STMT | |
972 } {SQLITE_DONE} | |
973 do_test capi3c-12.7 { | |
974 sqlite3_finalize $STMT | |
975 } {SQLITE_OK} | |
976 do_test capi3c-12.8 { | |
977 execsql { | |
978 COMMIT; | |
979 SELECT a FROM t1; | |
980 } | |
981 } {1 2 3 4} | |
982 | |
983 # Test cases capi3c-13.* test the sqlite3_clear_bindings() and | |
984 # sqlite3_sleep APIs. | |
985 # | |
986 if {[llength [info commands sqlite3_clear_bindings]]>0} { | |
987 do_test capi3c-13.1 { | |
988 execsql { | |
989 DELETE FROM t1; | |
990 } | |
991 set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] | |
992 sqlite3_step $STMT | |
993 } {SQLITE_DONE} | |
994 do_test capi3c-13.2 { | |
995 sqlite3_reset $STMT | |
996 sqlite3_bind_text $STMT 1 hello 5 | |
997 sqlite3_bind_text $STMT 2 world 5 | |
998 sqlite3_step $STMT | |
999 } {SQLITE_DONE} | |
1000 do_test capi3c-13.3 { | |
1001 sqlite3_reset $STMT | |
1002 sqlite3_clear_bindings $STMT | |
1003 sqlite3_step $STMT | |
1004 } {SQLITE_DONE} | |
1005 do_test capi3c-13-4 { | |
1006 sqlite3_finalize $STMT | |
1007 execsql { | |
1008 SELECT * FROM t1; | |
1009 } | |
1010 } {{} {} hello world {} {}} | |
1011 } | |
1012 if {[llength [info commands sqlite3_sleep]]>0} { | |
1013 do_test capi3c-13-5 { | |
1014 set ms [sqlite3_sleep 80] | |
1015 expr {$ms==80 || $ms==1000} | |
1016 } {1} | |
1017 } | |
1018 | |
1019 # Ticket #1219: Make sure binding APIs can handle a NULL pointer. | |
1020 # | |
1021 do_test capi3c-14.1 { | |
1022 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] | |
1023 lappend rc $msg | |
1024 } {1 SQLITE_MISUSE} | |
1025 | |
1026 # Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. | |
1027 # | |
1028 do_test capi3c-15.1 { | |
1029 set sql {SELECT * FROM t2} | |
1030 set nbytes [string length $sql] | |
1031 append sql { WHERE a==1} | |
1032 set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL] | |
1033 sqlite3_step $STMT | |
1034 sqlite3_column_int $STMT 0 | |
1035 } {1} | |
1036 do_test capi3c-15.2 { | |
1037 sqlite3_step $STMT | |
1038 sqlite3_column_int $STMT 0 | |
1039 } {2} | |
1040 do_test capi3c-15.3 { | |
1041 sqlite3_finalize $STMT | |
1042 } {SQLITE_OK} | |
1043 | |
1044 # Make sure code is always generated even if an IF EXISTS or | |
1045 # IF NOT EXISTS clause is present that the table does not or | |
1046 # does exists. That way we will always have a prepared statement | |
1047 # to expire when the schema changes. | |
1048 # | |
1049 do_test capi3c-16.1 { | |
1050 set sql {DROP TABLE IF EXISTS t3} | |
1051 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
1052 sqlite3_finalize $STMT | |
1053 expr {$STMT!=""} | |
1054 } {1} | |
1055 do_test capi3c-16.2 { | |
1056 set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} | |
1057 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] | |
1058 sqlite3_finalize $STMT | |
1059 expr {$STMT!=""} | |
1060 } {1} | |
1061 | |
1062 # But still we do not generate code if there is no SQL | |
1063 # | |
1064 do_test capi3c-16.3 { | |
1065 set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL] | |
1066 sqlite3_finalize $STMT | |
1067 expr {$STMT==""} | |
1068 } {1} | |
1069 do_test capi3c-16.4 { | |
1070 set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL] | |
1071 sqlite3_finalize $STMT | |
1072 expr {$STMT==""} | |
1073 } {1} | |
1074 | |
1075 # Ticket #2154. | |
1076 # | |
1077 do_test capi3c-17.1 { | |
1078 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL] | |
1079 sqlite3_step $STMT | |
1080 } SQLITE_ROW | |
1081 do_test capi3c-17.2 { | |
1082 sqlite3_column_int $STMT 0 | |
1083 } 4 | |
1084 do_test capi3c-17.3 { | |
1085 sqlite3_step $STMT | |
1086 } SQLITE_DONE | |
1087 do_test capi3c-17.4 { | |
1088 sqlite3_reset $STMT | |
1089 db eval {CREATE INDEX i2 ON t2(a)} | |
1090 sqlite3_step $STMT | |
1091 } SQLITE_ROW | |
1092 do_test capi3c-17.5 { | |
1093 sqlite3_column_int $STMT 0 | |
1094 } 4 | |
1095 do_test capi3c-17.6 { | |
1096 sqlite3_step $STMT | |
1097 } SQLITE_DONE | |
1098 do_test capi3c-17.7 { | |
1099 sqlite3_reset $STMT | |
1100 db eval {DROP INDEX i2} | |
1101 sqlite3_step $STMT | |
1102 } SQLITE_ROW | |
1103 do_test capi3c-17.8 { | |
1104 sqlite3_column_int $STMT 0 | |
1105 } 4 | |
1106 do_test capi3c-17.9 { | |
1107 sqlite3_step $STMT | |
1108 } SQLITE_DONE | |
1109 do_test capi3c-17.10 { | |
1110 sqlite3_finalize $STMT | |
1111 set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL] | |
1112 sqlite3_bind_int $STMT 1 2 | |
1113 db eval { | |
1114 DELETE FROM t1; | |
1115 INSERT INTO t1 VALUES(1,'one'); | |
1116 INSERT INTO t1 VALUES(2,'two'); | |
1117 INSERT INTO t1 VALUES(3,'three'); | |
1118 INSERT INTO t1 VALUES(4,'four'); | |
1119 } | |
1120 sqlite3_step $STMT | |
1121 } SQLITE_ROW | |
1122 do_test capi3c-17.11 { | |
1123 sqlite3_column_text $STMT 0 | |
1124 } two | |
1125 do_test capi3c-17.12 { | |
1126 sqlite3_step $STMT | |
1127 } SQLITE_DONE | |
1128 do_test capi3c-17.13 { | |
1129 sqlite3_reset $STMT | |
1130 db eval {CREATE INDEX i1 ON t1(a)} | |
1131 sqlite3_step $STMT | |
1132 } SQLITE_ROW | |
1133 do_test capi3c-17.14 { | |
1134 sqlite3_column_text $STMT 0 | |
1135 } two | |
1136 do_test capi3c-17.15 { | |
1137 sqlite3_step $STMT | |
1138 } SQLITE_DONE | |
1139 do_test capi3c-17.16 { | |
1140 sqlite3_reset $STMT | |
1141 db eval {DROP INDEX i1} | |
1142 sqlite3_step $STMT | |
1143 } SQLITE_ROW | |
1144 do_test capi3c-17.17 { | |
1145 sqlite3_column_text $STMT 0 | |
1146 } two | |
1147 do_test capi3c-17.18 { | |
1148 sqlite3_step $STMT | |
1149 } SQLITE_DONE | |
1150 do_test capi3c-17.99 { | |
1151 sqlite3_finalize $STMT | |
1152 } SQLITE_OK | |
1153 | |
1154 # On the mailing list it has been reported that finalizing after | |
1155 # an SQLITE_BUSY return leads to a segfault. Here we test that case. | |
1156 # | |
1157 do_test capi3c-18.1 { | |
1158 sqlite3 db2 test.db | |
1159 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL] | |
1160 sqlite3_step $STMT | |
1161 } SQLITE_ROW | |
1162 do_test capi3c-18.2 { | |
1163 sqlite3_column_int $STMT 0 | |
1164 } 4 | |
1165 do_test capi3c-18.3 { | |
1166 sqlite3_reset $STMT | |
1167 db2 eval {BEGIN EXCLUSIVE} | |
1168 sqlite3_step $STMT | |
1169 } SQLITE_BUSY | |
1170 do_test capi3c-18.4 { | |
1171 sqlite3_finalize $STMT | |
1172 } SQLITE_BUSY | |
1173 do_test capi3c-18.5 { | |
1174 db2 eval {COMMIT} | |
1175 db2 close | |
1176 } {} | |
1177 | |
1178 # Ticket #2158. The sqlite3_step() will still return SQLITE_SCHEMA | |
1179 # if the database schema changes in a way that makes the statement | |
1180 # no longer valid. | |
1181 # | |
1182 do_test capi3c-19.1 { | |
1183 db eval { | |
1184 CREATE TABLE t3(x,y); | |
1185 INSERT INTO t3 VALUES(1,2); | |
1186 } | |
1187 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] | |
1188 sqlite3_step $STMT | |
1189 } SQLITE_ROW | |
1190 do_test capi3c-19.2 { | |
1191 sqlite3_column_int $STMT 0 | |
1192 } 1 | |
1193 do_test capi3c-19.3 { | |
1194 sqlite3_step $STMT | |
1195 } SQLITE_DONE | |
1196 do_test capi3c-19.4 { | |
1197 sqlite3_reset $STMT | |
1198 db eval {DROP TABLE t3} | |
1199 sqlite3_step $STMT | |
1200 } SQLITE_ERROR | |
1201 do_test capi3c-19.4.1 { | |
1202 sqlite3_errmsg $DB | |
1203 } {no such table: t3} | |
1204 ifcapable deprecated { | |
1205 do_test capi3c-19.4.2 { | |
1206 sqlite3_expired $STMT | |
1207 } 1 | |
1208 } | |
1209 do_test capi3c-19.4.3 { | |
1210 sqlite3_errmsg $DB | |
1211 } {no such table: t3} | |
1212 ifcapable deprecated { | |
1213 do_test capi3c-19.4.4 { | |
1214 sqlite3_expired 0 | |
1215 } 1 | |
1216 } | |
1217 do_test capi3c-19.5 { | |
1218 sqlite3_reset $STMT | |
1219 db eval { | |
1220 CREATE TABLE t3(x,y); | |
1221 INSERT INTO t3 VALUES(1,2); | |
1222 } | |
1223 sqlite3_step $STMT | |
1224 } SQLITE_ROW | |
1225 ifcapable deprecated { | |
1226 do_test capi3c-19.5.2 { | |
1227 sqlite3_expired $STMT | |
1228 } 0 | |
1229 } | |
1230 do_test capi3c-19.6 { | |
1231 sqlite3_column_int $STMT 1 | |
1232 } 2 | |
1233 do_test capi3c-19.99 { | |
1234 sqlite3_finalize $STMT | |
1235 } SQLITE_OK | |
1236 | |
1237 # Make sure a change in a separate database connection does not | |
1238 # cause an SQLITE_SCHEMA return. | |
1239 # | |
1240 do_test capi3c-20.1 { | |
1241 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] | |
1242 sqlite3 db2 test.db | |
1243 db2 eval {CREATE TABLE t4(x)} | |
1244 sqlite3_step $STMT | |
1245 } SQLITE_ROW | |
1246 do_test capi3c-20.2 { | |
1247 sqlite3_column_int $STMT 1 | |
1248 } 2 | |
1249 do_test capi3c-20.3 { | |
1250 sqlite3_step $STMT | |
1251 } SQLITE_DONE | |
1252 do_test capi3c-20.4 { | |
1253 db2 close | |
1254 sqlite3_finalize $STMT | |
1255 } SQLITE_OK | |
1256 | |
1257 # Test that sqlite3_step() sets the database error code correctly. | |
1258 # See ticket #2497. | |
1259 # | |
1260 ifcapable progress { | |
1261 do_test capi3c-21.1 { | |
1262 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] | |
1263 db progress 5 "expr 1" | |
1264 sqlite3_step $STMT | |
1265 } {SQLITE_INTERRUPT} | |
1266 do_test capi3c-21.2 { | |
1267 sqlite3_extended_errcode $DB | |
1268 } {SQLITE_INTERRUPT} | |
1269 do_test capi3c-21.3 { | |
1270 sqlite3_finalize $STMT | |
1271 } {SQLITE_INTERRUPT} | |
1272 do_test capi3c-21.4 { | |
1273 set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] | |
1274 db progress 5 "expr 1" | |
1275 sqlite3_step $STMT | |
1276 } {SQLITE_ERROR} | |
1277 do_test capi3c-21.5 { | |
1278 sqlite3_errcode $DB | |
1279 } {SQLITE_ERROR} | |
1280 do_test capi3c-21.6 { | |
1281 sqlite3_finalize $STMT | |
1282 } {SQLITE_INTERRUPT} | |
1283 do_test capi3c-21.7 { | |
1284 sqlite3_errcode $DB | |
1285 } {SQLITE_INTERRUPT} | |
1286 do_test capi3c-21.8 { | |
1287 sqlite3_extended_errcode $DB | |
1288 } {SQLITE_INTERRUPT} | |
1289 } | |
1290 | |
1291 # Make sure sqlite3_result_error_code() returns the correct error code. | |
1292 # See ticket #2940 | |
1293 # | |
1294 do_test capi3c-22.1 { | |
1295 db progress 0 {} | |
1296 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL] | |
1297 sqlite3_step $STMT | |
1298 } {SQLITE_PERM} | |
1299 sqlite3_finalize $STMT | |
1300 do_test capi3c-22.2 { | |
1301 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL] | |
1302 sqlite3_step $STMT | |
1303 } {SQLITE_ABORT} | |
1304 sqlite3_finalize $STMT | |
1305 do_test capi3c-22.3 { | |
1306 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL] | |
1307 sqlite3_step $STMT | |
1308 } {SQLITE_EMPTY} | |
1309 sqlite3_finalize $STMT | |
1310 | |
1311 # For a multi-column result set where the same table column is repeated | |
1312 # in multiple columns of the output, verify that doing a UTF-8 to UTF-16 | |
1313 # conversion (or vice versa) on one column does not change the value of | |
1314 # the second. | |
1315 # | |
1316 ifcapable utf16 { | |
1317 do_test capi3c-23.1 { | |
1318 set STMT [sqlite3_prepare_v2 db {SELECT b,b,b,b FROM t1} -1 TAIL] | |
1319 sqlite3_step $STMT | |
1320 } {SQLITE_ROW} | |
1321 do_test capi3c-23.2 { | |
1322 sqlite3_column_text16 $STMT 0 | |
1323 sqlite3_column_text $STMT 1 | |
1324 } {one} | |
1325 do_test capi3c-23.3 { | |
1326 sqlite3_column_text16 $STMT 2 | |
1327 sqlite3_column_text $STMT 3 | |
1328 } {one} | |
1329 sqlite3_finalize $STMT | |
1330 do_test capi3c-23.4 { | |
1331 set STMT [sqlite3_prepare_v2 db {SELECT b||'x',b,b,b FROM t1} -1 TAIL] | |
1332 sqlite3_step $STMT | |
1333 } {SQLITE_ROW} | |
1334 do_test capi3c-23.5 { | |
1335 sqlite3_column_text16 $STMT 0 | |
1336 sqlite3_column_text $STMT 1 | |
1337 } {one} | |
1338 do_test capi3c-23.6 { | |
1339 sqlite3_column_text16 $STMT 2 | |
1340 sqlite3_column_text $STMT 3 | |
1341 } {one} | |
1342 sqlite3_finalize $STMT | |
1343 } | |
1344 | |
1345 # Test decltype on some SELECT statements that contain sub-selects. | |
1346 # | |
1347 proc decltype {zSql} { | |
1348 set ret [list] | |
1349 set STMT [sqlite3_prepare_v2 db $zSql -1 TAIL] | |
1350 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { | |
1351 lappend ret [sqlite3_column_decltype $STMT $i] | |
1352 } | |
1353 sqlite3_finalize $STMT | |
1354 return $ret | |
1355 } | |
1356 do_test capi3c-24.1 { | |
1357 execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) } | |
1358 decltype {SELECT * FROM t5} | |
1359 } {INTEGER STRING DATETIME} | |
1360 do_test capi3c-24.2 { | |
1361 decltype {SELECT (SELECT c) FROM t5} | |
1362 } {DATETIME} | |
1363 do_test capi3c-24.3 { | |
1364 decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5} | |
1365 } {DATETIME} | |
1366 do_test capi3c-24.4 { | |
1367 decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b} | |
1368 } {INTEGER STRING DATETIME} | |
1369 do_test capi3c-24.5 { | |
1370 decltype { | |
1371 SELECT (SELECT x FROM (SELECT c AS x)) | |
1372 FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b | |
1373 } | |
1374 } {DATETIME} | |
1375 do_test capi3c-24.3 { | |
1376 decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5} | |
1377 } {INTEGER} | |
1378 | |
1379 | |
1380 # Further tests of sqlite3_column_decltype(): | |
1381 # | |
1382 do_execsql_test 25.0 { | |
1383 CREATE TABLE t11(a VARCHAR(10), b INTEGER); | |
1384 CREATE TABLE t12(a VARCHAR(15), b FLOAT); | |
1385 } | |
1386 | |
1387 foreach {tn sql} { | |
1388 1 "SELECT * FROM t11 UNION ALL SELECT * FROM t12" | |
1389 2 "SELECT * FROM t11 UNION SELECT * FROM t12" | |
1390 3 "SELECT * FROM t11 EXCEPT SELECT * FROM t12" | |
1391 4 "SELECT * FROM t11 INTERSECT SELECT * FROM t12" | |
1392 | |
1393 5 "SELECT * FROM t11 UNION ALL SELECT * FROM t12 ORDER BY 1" | |
1394 6 "SELECT * FROM t11 UNION SELECT * FROM t12 ORDER BY 1" | |
1395 7 "SELECT * FROM t11 EXCEPT SELECT * FROM t12 ORDER BY 1" | |
1396 8 "SELECT * FROM t11 INTERSECT SELECT * FROM t12 ORDER BY 1" | |
1397 } { | |
1398 do_test 25.$tn { decltype $sql } {VARCHAR(10) INTEGER} | |
1399 } | |
1400 | |
1401 finish_test | |
OLD | NEW |