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