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