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