aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/sqlite/unix/sqlite-3.5.1/test/capi3c.test
diff options
context:
space:
mode:
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.test1245
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
19set testdir [file dirname $argv0]
20source $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.
24proc 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.
33proc 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
56set DB [sqlite3_connection_pointer db]
57
58do_test capi3c-1.0 {
59 sqlite3_get_autocommit $DB
60} 1
61do_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} {}
66do_test capi3c-1.2 {
67 sqlite3_errcode $DB
68} {SQLITE_OK}
69do_test capi3c-1.3 {
70 sqlite3_errmsg $DB
71} {not an error}
72do_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}
78do_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}
84do_test capi3c-1.6 {
85 sqlite3_errcode $DB
86} {SQLITE_ERROR}
87do_test capi3c-1.7 {
88 sqlite3_errmsg $DB
89} {no such column: namex}
90
91ifcapable {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
137do_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.
142do_test capi3c-3.2 {
143 sqlite3_close $db2
144} {SQLITE_OK}
145do_test capi3c-3.3 {
146 catch {
147 set db2 [sqlite3_open /bogus/path/test.db {}]
148 }
149 sqlite3_errcode $db2
150} {SQLITE_CANTOPEN}
151do_test capi3c-3.4 {
152 sqlite3_errmsg $db2
153} {unable to open database file}
154do_test capi3c-3.5 {
155 sqlite3_close $db2
156} {SQLITE_OK}
157do_test capi3c-3.6.1-misuse {
158 sqlite3_close $db2
159} {SQLITE_MISUSE}
160do_test capi3c-3.6.2-misuse {
161 sqlite3_errmsg $db2
162} {library routine called out of sequence}
163ifcapable {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
172ifcapable {utf16} {
173do_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.
178do_test capi3c-4.2 {
179 sqlite3_close $db2
180} {SQLITE_OK}
181do_test capi3c-4.3 {
182 catch {
183 set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
184 }
185 sqlite3_errcode $db2
186} {SQLITE_CANTOPEN}
187do_test capi3c-4.4 {
188 utf8 [sqlite3_errmsg16 $db2]
189} {unable to open database file}
190do_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#
213proc 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#
312proc 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.
315ifcapable 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#
408proc 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
418do_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
425do_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
432set lens [list]
433foreach i $::idxlist {
434 lappend lens [string length [lindex $strings $i]]
435}
436do_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
446ifcapable {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
462do_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
469do_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
476do_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
483ifcapable {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
492do_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
499do_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
506do_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
513do_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
520do_test $test.13 {
521 sqlite3_column_int $STMT -1
522} {0}
523do_test $test.13 {
524 sqlite3_column_text $STMT -1
525} {}
526
527}
528
529ifcapable !floatingpoint {
530 finish_test
531 return
532}
533
534do_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
546check_header $STMT capi3c-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
547check_origin_header $STMT capi3c-5.1 {main main main} {t1 t1 t1} {a b c}
548do_test capi3c-5.2 {
549 sqlite3_step $STMT
550} SQLITE_ROW
551
552check_header $STMT capi3c-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
553check_origin_header $STMT capi3c-5.3 {main main main} {t1 t1 t1} {a b c}
554check_data $STMT capi3c-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
555
556do_test capi3c-5.5 {
557 sqlite3_step $STMT
558} SQLITE_ROW
559
560check_header $STMT capi3c-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
561check_origin_header $STMT capi3c-5.6 {main main main} {t1 t1 t1} {a b c}
562check_data $STMT capi3c-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
563
564do_test capi3c-5.8 {
565 sqlite3_step $STMT
566} SQLITE_ROW
567
568check_header $STMT capi3c-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
569check_origin_header $STMT capi3c-5.9 {main main main} {t1 t1 t1} {a b c}
570check_data $STMT capi3c-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
571
572do_test capi3c-5.11 {
573 sqlite3_step $STMT
574} SQLITE_DONE
575
576do_test capi3c-5.12 {
577 sqlite3_finalize $STMT
578} SQLITE_OK
579
580do_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
586check_header $STMT capi3c-5.21 {a sum(b) max(c)} {VARINT {} {}}
587check_origin_header $STMT capi3c-5.22 {main {} {}} {t1 {} {}} {a {} {}}
588do_test capi3c-5.23 {
589 sqlite3_finalize $STMT
590} SQLITE_OK
591
592
593set ::ENC [execsql {pragma encoding}]
594db close
595
596do_test capi3c-6.0 {
597btree_breakpoint
598 sqlite3 db test.db
599 set DB [sqlite3_connection_pointer db]
600btree_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}
606do_test capi3c-6.1 {
607 db cache flush
608 sqlite3_close $DB
609} {SQLITE_BUSY}
610do_test capi3c-6.2 {
611 sqlite3_step $STMT
612} {SQLITE_ROW}
613check_data $STMT capi3c-6.3 {INTEGER} {1} {1.0} {1}
614do_test capi3c-6.3 {
615 sqlite3_finalize $STMT
616} {SQLITE_OK}
617do_test capi3c-6.4 {
618 db cache flush
619 sqlite3_close $DB
620} {SQLITE_OK}
621do_test capi3c-6.99-misuse {
622 db close
623} {}
624
625if {![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
646if {![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}
709file delete -force test.db
710file delete -force test.db-journal
711
712
713# Test the english language string equivalents for sqlite error codes
714set code2english [list \
715SQLITE_OK {not an error} \
716SQLITE_ERROR {SQL logic error or missing database} \
717SQLITE_PERM {access permission denied} \
718SQLITE_ABORT {callback requested query abort} \
719SQLITE_BUSY {database is locked} \
720SQLITE_LOCKED {database table is locked} \
721SQLITE_NOMEM {out of memory} \
722SQLITE_READONLY {attempt to write a readonly database} \
723SQLITE_INTERRUPT {interrupted} \
724SQLITE_IOERR {disk I/O error} \
725SQLITE_CORRUPT {database disk image is malformed} \
726SQLITE_FULL {database or disk is full} \
727SQLITE_CANTOPEN {unable to open database file} \
728SQLITE_EMPTY {table contains no data} \
729SQLITE_SCHEMA {database schema has changed} \
730SQLITE_CONSTRAINT {constraint failed} \
731SQLITE_MISMATCH {datatype mismatch} \
732SQLITE_MISUSE {library routine called out of sequence} \
733SQLITE_NOLFS {kernel lacks large file support} \
734SQLITE_AUTH {authorization denied} \
735SQLITE_FORMAT {auxiliary database format error} \
736SQLITE_RANGE {bind or column index out of range} \
737SQLITE_NOTADB {file is encrypted or is not a database} \
738unknownerror {unknown error} \
739]
740
741set test_number 1
742foreach {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.
748ifcapable 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.
772sqlite3 db test.db
773set DB [sqlite3_connection_pointer db]
774sqlite_register_test_function $DB func
775do_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} {}
783do_test capi3c-11.1.1 {
784 sqlite3_get_autocommit $DB
785} 0
786do_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}
790do_test capi3c-11.3 {
791 catchsql {
792 COMMIT;
793 }
794} {1 {cannot commit transaction - SQL statements in progress}}
795do_test capi3c-11.3.1 {
796 sqlite3_get_autocommit $DB
797} 0
798do_test capi3c-11.4 {
799 sqlite3_step $STMT
800} {SQLITE_ERROR}
801do_test capi3c-11.5 {
802 sqlite3_finalize $STMT
803} {SQLITE_ERROR}
804do_test capi3c-11.6 {
805 catchsql {
806 SELECT * FROM t1;
807 }
808} {0 {1 int 2 notatype}}
809do_test capi3c-11.6.1 {
810 sqlite3_get_autocommit $DB
811} 0
812do_test capi3c-11.7 {
813 catchsql {
814 COMMIT;
815 }
816} {0 {}}
817do_test capi3c-11.7.1 {
818 sqlite3_get_autocommit $DB
819} 1
820do_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} {}
829do_test capi3c-11.8.1 {
830 sqlite3_get_autocommit $DB
831} 0
832do_test capi3c-11.9 {
833 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
834 sqlite3_step $STMT
835} {SQLITE_ROW}
836do_test capi3c-11.9.1 {
837 sqlite3_get_autocommit $DB
838} 0
839do_test capi3c-11.9.2 {
840 catchsql {
841 ROLLBACK;
842 }
843} {1 {cannot rollback transaction - SQL statements in progress}}
844do_test capi3c-11.9.3 {
845 sqlite3_get_autocommit $DB
846} 0
847do_test capi3c-11.10 {
848 sqlite3_step $STMT
849} {SQLITE_ROW}
850do_test capi3c-11.11 {
851 sqlite3_step $STMT
852} {SQLITE_ROW}
853do_test capi3c-11.12 {
854 sqlite3_step $STMT
855} {SQLITE_DONE}
856do_test capi3c-11.13 {
857 sqlite3_finalize $STMT
858} {SQLITE_OK}
859do_test capi3c-11.14 {
860 execsql {
861 SELECT a FROM t2;
862 }
863} {1 2 3}
864do_test capi3c-11.14.1 {
865 sqlite3_get_autocommit $DB
866} 0
867do_test capi3c-11.15 {
868 catchsql {
869 ROLLBACK;
870 }
871} {0 {}}
872do_test capi3c-11.15.1 {
873 sqlite3_get_autocommit $DB
874} 1
875do_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.
885do_test capi3c-11.17 {
886 execsql {
887 BEGIN;
888 }
889} {}
890do_test capi3c-11.18 {
891 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL]
892 catchsql {
893 COMMIT;
894 }
895} {0 {}}
896do_test capi3c-11.19 {
897 sqlite3_step $STMT
898} {SQLITE_ROW}
899do_test capi3c-11.20 {
900 catchsql {
901 BEGIN;
902 COMMIT;
903 }
904} {1 {cannot commit transaction - SQL statements in progress}}
905do_test capi3c-11.20 {
906 sqlite3_reset $STMT
907 catchsql {
908 COMMIT;
909 }
910} {0 {}}
911do_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#
919do_test capi3c-12.1 {
920 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
921 sqlite3_step $STMT
922} {SQLITE_ROW}
923do_test capi3c-12.2 {
924 catchsql {
925 INSERT INTO t1 VALUES(3, NULL);
926 }
927} {0 {}}
928do_test capi3c-12.3 {
929 catchsql {
930 INSERT INTO t2 VALUES(4);
931 }
932} {0 {}}
933do_test capi3c-12.4 {
934 catchsql {
935 BEGIN;
936 INSERT INTO t1 VALUES(4, NULL);
937 }
938} {0 {}}
939do_test capi3c-12.5 {
940 sqlite3_step $STMT
941} {SQLITE_ROW}
942do_test capi3c-12.5.1 {
943 sqlite3_step $STMT
944} {SQLITE_ROW}
945do_test capi3c-12.6 {
946 sqlite3_step $STMT
947} {SQLITE_DONE}
948do_test capi3c-12.7 {
949 sqlite3_finalize $STMT
950} {SQLITE_OK}
951do_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#
961if {[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}
987if {[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#
996do_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#
1003do_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}
1011do_test capi3c-15.2 {
1012 sqlite3_step $STMT
1013 sqlite3_column_int $STMT 0
1014} {2}
1015do_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#
1024do_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}
1030do_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#
1039do_test capi3c-16.3 {
1040 set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL]
1041 sqlite3_finalize $STMT
1042 expr {$STMT==""}
1043} {1}
1044do_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#
1052do_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
1056do_test capi3c-17.2 {
1057 sqlite3_column_int $STMT 0
1058} 4
1059do_test capi3c-17.3 {
1060 sqlite3_step $STMT
1061} SQLITE_DONE
1062do_test capi3c-17.4 {
1063 sqlite3_reset $STMT
1064 db eval {CREATE INDEX i2 ON t2(a)}
1065 sqlite3_step $STMT
1066} SQLITE_ROW
1067do_test capi3c-17.5 {
1068 sqlite3_column_int $STMT 0
1069} 4
1070do_test capi3c-17.6 {
1071 sqlite3_step $STMT
1072} SQLITE_DONE
1073do_test capi3c-17.7 {
1074 sqlite3_reset $STMT
1075 db eval {DROP INDEX i2}
1076 sqlite3_step $STMT
1077} SQLITE_ROW
1078do_test capi3c-17.8 {
1079 sqlite3_column_int $STMT 0
1080} 4
1081do_test capi3c-17.9 {
1082 sqlite3_step $STMT
1083} SQLITE_DONE
1084do_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
1097do_test capi3c-17.11 {
1098 sqlite3_column_text $STMT 0
1099} two
1100do_test capi3c-17.12 {
1101 sqlite3_step $STMT
1102} SQLITE_DONE
1103do_test capi3c-17.13 {
1104 sqlite3_reset $STMT
1105 db eval {CREATE INDEX i1 ON t1(a)}
1106 sqlite3_step $STMT
1107} SQLITE_ROW
1108do_test capi3c-17.14 {
1109 sqlite3_column_text $STMT 0
1110} two
1111do_test capi3c-17.15 {
1112 sqlite3_step $STMT
1113} SQLITE_DONE
1114do_test capi3c-17.16 {
1115 sqlite3_reset $STMT
1116 db eval {DROP INDEX i1}
1117 sqlite3_step $STMT
1118} SQLITE_ROW
1119do_test capi3c-17.17 {
1120 sqlite3_column_text $STMT 0
1121} two
1122do_test capi3c-17.18 {
1123 sqlite3_step $STMT
1124} SQLITE_DONE
1125do_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#
1132do_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
1137do_test capi3c-18.2 {
1138 sqlite3_column_int $STMT 0
1139} 4
1140do_test capi3c-18.3 {
1141 sqlite3_reset $STMT
1142 db2 eval {BEGIN EXCLUSIVE}
1143 sqlite3_step $STMT
1144} SQLITE_BUSY
1145do_test capi3c-18.4 {
1146 sqlite3_finalize $STMT
1147} SQLITE_BUSY
1148do_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#
1157do_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
1165do_test capi3c-19.2 {
1166 sqlite3_column_int $STMT 0
1167} 1
1168do_test capi3c-19.3 {
1169 sqlite3_step $STMT
1170} SQLITE_DONE
1171do_test capi3c-19.4 {
1172 sqlite3_reset $STMT
1173 db eval {DROP TABLE t3}
1174 sqlite3_step $STMT
1175} SQLITE_SCHEMA
1176do_test capi3c-19.4.2 {
1177 sqlite3_errmsg $DB
1178} {no such table: t3}
1179do_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
1187do_test capi3c-19.6 {
1188 sqlite3_column_int $STMT 1
1189} 2
1190do_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#
1197do_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
1203do_test capi3c-20.2 {
1204 sqlite3_column_int $STMT 1
1205} 2
1206do_test capi3c-20.3 {
1207 sqlite3_step $STMT
1208} SQLITE_DONE
1209do_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#
1217ifcapable 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
1245finish_test