xref: /sqlite-3.40.0/test/capi3.test (revision 4dcbdbff)
1# 2003 January 29
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this script testing the callback-free C/C++ API.
13#
14# $Id: capi3.test,v 1.33 2005/06/06 17:54:56 drh Exp $
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20# Return the UTF-16 representation of the supplied UTF-8 string $str.
21# If $nt is true, append two 0x00 bytes as a nul terminator.
22proc utf16 {str {nt 1}} {
23  set r [encoding convertto unicode $str]
24  if {$nt} {
25    append r "\x00\x00"
26  }
27  return $r
28}
29
30# Return the UTF-8 representation of the supplied UTF-16 string $str.
31proc utf8 {str} {
32  # If $str ends in two 0x00 0x00 bytes, knock these off before
33  # converting to UTF-8 using TCL.
34  binary scan $str \c* vals
35  if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
36    set str [binary format \c* [lrange $vals 0 end-2]]
37  }
38
39  set r [encoding convertfrom unicode $str]
40  return $r
41}
42
43# These tests complement those in capi2.test. They are organized
44# as follows:
45#
46# capi3-1.*: Test sqlite3_prepare
47# capi3-2.*: Test sqlite3_prepare16
48# capi3-3.*: Test sqlite3_open
49# capi3-4.*: Test sqlite3_open16
50# capi3-5.*: Test the various sqlite3_result_* APIs
51# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
52#
53
54db close
55set DB [sqlite3 db test.db]
56
57do_test capi3-1.0 {
58  sqlite3_get_autocommit $DB
59} 1
60do_test capi3-1.1 {
61  set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
62  sqlite3_finalize $STMT
63  set TAIL
64} {}
65do_test capi3-1.2 {
66  sqlite3_errcode $DB
67} {SQLITE_OK}
68do_test capi3-1.3 {
69  sqlite3_errmsg $DB
70} {not an error}
71do_test capi3-1.4 {
72  set sql {SELECT name FROM sqlite_master;SELECT 10}
73  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
74  sqlite3_finalize $STMT
75  set TAIL
76} {SELECT 10}
77do_test capi3-1.5 {
78  set sql {SELECT namex FROM sqlite_master}
79  catch {
80    set STMT [sqlite3_prepare $DB $sql -1 TAIL]
81  }
82} {1}
83do_test capi3-1.6 {
84  sqlite3_errcode $DB
85} {SQLITE_ERROR}
86do_test capi3-1.7 {
87  sqlite3_errmsg $DB
88} {no such column: namex}
89
90ifcapable {utf16} {
91do_test capi3-2.1 {
92  set sql16 [utf16 {SELECT name FROM sqlite_master}]
93  set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
94  sqlite3_finalize $STMT
95  utf8 $::TAIL
96} {}
97do_test capi3-2.2 {
98  set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
99  set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
100  sqlite3_finalize $STMT
101  utf8 $TAIL
102} {SELECT 10}
103do_test capi3-2.3 {
104  set sql [utf16 {SELECT namex FROM sqlite_master}]
105  catch {
106    set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
107  }
108} {1}
109do_test capi3-2.4 {
110  sqlite3_errcode $DB
111} {SQLITE_ERROR}
112do_test capi3-2.5 {
113  sqlite3_errmsg $DB
114} {no such column: namex}
115} ;# endif utf16
116
117# rename sqlite3_open sqlite3_open_old
118# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
119
120do_test capi3-3.1 {
121  set db2 [sqlite3_open test.db {}]
122  sqlite3_errcode $db2
123} {SQLITE_OK}
124# FIX ME: Should test the db handle works.
125do_test capi3-3.2 {
126  sqlite3_close $db2
127} {SQLITE_OK}
128do_test capi3-3.3 {
129  catch {
130    set db2 [sqlite3_open /bogus/path/test.db {}]
131  }
132  sqlite3_errcode $db2
133} {SQLITE_CANTOPEN}
134do_test capi3-3.4 {
135  sqlite3_errmsg $db2
136} {unable to open database file}
137do_test capi3-3.5 {
138  sqlite3_close $db2
139} {SQLITE_OK}
140do_test capi3-3.6.1 {
141  sqlite3_close $db2
142} {SQLITE_MISUSE}
143do_test capi3-3.6.2 {
144  sqlite3_errmsg $db2
145} {library routine called out of sequence}
146ifcapable {utf16} {
147  do_test capi3-3.6.3 {
148    utf8 [sqlite3_errmsg16 $db2]
149  } {library routine called out of sequence}
150}
151
152# rename sqlite3_open ""
153# rename sqlite3_open_old sqlite3_open
154
155ifcapable {utf16} {
156do_test capi3-4.1 {
157  set db2 [sqlite3_open16 [utf16 test.db] {}]
158  sqlite3_errcode $db2
159} {SQLITE_OK}
160# FIX ME: Should test the db handle works.
161do_test capi3-4.2 {
162  sqlite3_close $db2
163} {SQLITE_OK}
164do_test capi3-4.3 {
165  catch {
166    set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
167  }
168  sqlite3_errcode $db2
169} {SQLITE_CANTOPEN}
170do_test capi3-4.4 {
171  utf8 [sqlite3_errmsg16 $db2]
172} {unable to open database file}
173do_test capi3-4.5 {
174  sqlite3_close $db2
175} {SQLITE_OK}
176} ;# utf16
177
178# This proc is used to test the following API calls:
179#
180# sqlite3_column_count
181# sqlite3_column_name
182# sqlite3_column_name16
183# sqlite3_column_decltype
184# sqlite3_column_decltype16
185#
186# $STMT is a compiled SQL statement. $test is a prefix
187# to use for test names within this proc. $names is a list
188# of the column names that should be returned by $STMT.
189# $decltypes is a list of column declaration types for $STMT.
190#
191# Example:
192#
193# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
194# check_header test1.1 {1 2 3} {"" "" ""}
195#
196proc check_header {STMT test names decltypes} {
197
198  # Use the return value of sqlite3_column_count() to build
199  # a list of column indexes. i.e. If sqlite3_column_count
200  # is 3, build the list {0 1 2}.
201  set ::idxlist [list]
202  set ::numcols [sqlite3_column_count $STMT]
203  for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
204
205  # Column names in UTF-8
206  do_test $test.1 {
207    set cnamelist [list]
208    foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
209    set cnamelist
210  } $names
211
212  # Column names in UTF-16
213  ifcapable {utf16} {
214    do_test $test.2 {
215      set cnamelist [list]
216      foreach i $idxlist {
217        lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
218      }
219      set cnamelist
220    } $names
221  }
222
223  # Column names in UTF-8
224  do_test $test.3 {
225    set cnamelist [list]
226    foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
227    set cnamelist
228  } $names
229
230  # Column names in UTF-16
231  ifcapable {utf16} {
232    do_test $test.4 {
233      set cnamelist [list]
234      foreach i $idxlist {
235        lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
236      }
237      set cnamelist
238    } $names
239  }
240
241  # Column names in UTF-8
242  do_test $test.5 {
243    set cnamelist [list]
244    foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]}
245    set cnamelist
246  } $decltypes
247
248  # Column declaration types in UTF-16
249  ifcapable {utf16} {
250    do_test $test.6 {
251      set cnamelist [list]
252      foreach i $idxlist {
253        lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
254      }
255      set cnamelist
256    } $decltypes
257  }
258
259
260  # Test some out of range conditions:
261  ifcapable {utf16} {
262    do_test $test.7 {
263      list \
264        [sqlite3_column_name $STMT -1] \
265        [sqlite3_column_name16 $STMT -1] \
266        [sqlite3_column_decltype $STMT -1] \
267        [sqlite3_column_decltype16 $STMT -1] \
268        [sqlite3_column_name $STMT $numcols] \
269        [sqlite3_column_name16 $STMT $numcols] \
270        [sqlite3_column_decltype $STMT $numcols] \
271        [sqlite3_column_decltype16 $STMT $numcols]
272    } {{} {} {} {} {} {} {} {}}
273  }
274
275}
276
277# This proc is used to test the following APIs:
278#
279# sqlite3_data_count
280# sqlite3_column_type
281# sqlite3_column_int
282# sqlite3_column_text
283# sqlite3_column_text16
284# sqlite3_column_double
285#
286# $STMT is a compiled SQL statement for which the previous call
287# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use
288# for test names within this proc. $types is a list of the
289# manifest types for the current row. $ints, $doubles and $strings
290# are lists of the integer, real and string representations of
291# the values in the current row.
292#
293# Example:
294#
295# set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
296# sqlite3_step $STMT
297# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
298#
299proc check_data {STMT test types ints doubles strings} {
300
301  # Use the return value of sqlite3_column_count() to build
302  # a list of column indexes. i.e. If sqlite3_column_count
303  # is 3, build the list {0 1 2}.
304  set ::idxlist [list]
305  set numcols [sqlite3_data_count $STMT]
306  for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
307
308# types
309do_test $test.1 {
310  set types [list]
311  foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
312  set types
313} $types
314
315# Integers
316do_test $test.2 {
317  set ints [list]
318  foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
319  set ints
320} $ints
321
322# bytes
323set lens [list]
324foreach i $::idxlist {
325  lappend lens [string length [lindex $strings $i]]
326}
327do_test $test.3 {
328  set bytes [list]
329  set lens [list]
330  foreach i $idxlist {
331    lappend bytes [sqlite3_column_bytes $STMT $i]
332  }
333  set bytes
334} $lens
335
336# bytes16
337ifcapable {utf16} {
338  set lens [list]
339  foreach i $::idxlist {
340    lappend lens [expr 2 * [string length [lindex $strings $i]]]
341  }
342  do_test $test.4 {
343    set bytes [list]
344    set lens [list]
345    foreach i $idxlist {
346      lappend bytes [sqlite3_column_bytes16 $STMT $i]
347    }
348    set bytes
349  } $lens
350}
351
352# Blob
353do_test $test.5 {
354  set utf8 [list]
355  foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
356  set utf8
357} $strings
358
359# UTF-8
360do_test $test.6 {
361  set utf8 [list]
362  foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
363  set utf8
364} $strings
365
366# Floats
367do_test $test.7 {
368  set utf8 [list]
369  foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
370  set utf8
371} $doubles
372
373# UTF-16
374ifcapable {utf16} {
375  do_test $test.8 {
376    set utf8 [list]
377    foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
378    set utf8
379  } $strings
380}
381
382# Integers
383do_test $test.9 {
384  set ints [list]
385  foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
386  set ints
387} $ints
388
389# Floats
390do_test $test.10 {
391  set utf8 [list]
392  foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
393  set utf8
394} $doubles
395
396# UTF-8
397do_test $test.11 {
398  set utf8 [list]
399  foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
400  set utf8
401} $strings
402
403# Types
404do_test $test.12 {
405  set types [list]
406  foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
407  set types
408} $types
409
410# Test that an out of range request returns the equivalent of NULL
411do_test $test.13 {
412  sqlite3_column_int $STMT -1
413} {0}
414do_test $test.13 {
415  sqlite3_column_text $STMT -1
416} {}
417
418}
419
420do_test capi3-5.0 {
421  execsql {
422    CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
423    INSERT INTO t1 VALUES(1, 2, 3);
424    INSERT INTO t1 VALUES('one', 'two', NULL);
425    INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
426  }
427  set sql "SELECT * FROM t1"
428  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
429  sqlite3_column_count $STMT
430} 3
431
432check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
433do_test capi3-5.2 {
434  sqlite3_step $STMT
435} SQLITE_ROW
436
437check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
438check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
439
440do_test capi3-5.5 {
441  sqlite3_step $STMT
442} SQLITE_ROW
443
444check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
445check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
446
447do_test capi3-5.8 {
448  sqlite3_step $STMT
449} SQLITE_ROW
450
451check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
452check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
453
454do_test capi3-5.11 {
455  sqlite3_step $STMT
456} SQLITE_DONE
457
458do_test capi3-5.12 {
459  sqlite3_finalize $STMT
460} SQLITE_OK
461
462set ::ENC [execsql {pragma encoding}]
463db close
464
465do_test capi3-6.0 {
466  set DB [sqlite3_open test.db]
467  sqlite3_key $DB xyzzy
468  set sql {SELECT a FROM t1 order by rowid}
469  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
470  expr 0
471} {0}
472do_test capi3-6.1 {
473  sqlite3_close $DB
474} {SQLITE_BUSY}
475do_test capi3-6.2 {
476  sqlite3_step $STMT
477} {SQLITE_ROW}
478check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
479do_test capi3-6.3 {
480  sqlite3_finalize $STMT
481} {SQLITE_OK}
482do_test capi3-6.4 {
483  sqlite3_close $DB
484} {SQLITE_OK}
485
486if {![sqlite3 -has-codec]} {
487  # Test what happens when the library encounters a newer file format.
488  # Do this by updating the file format via the btree layer.
489  do_test capi3-7.1 {
490    set ::bt [btree_open test.db 10 0]
491    btree_begin_transaction $::bt
492    set meta [btree_get_meta $::bt]
493    lset meta 2 4
494    eval [concat btree_update_meta $::bt [lrange $meta 0 end]]
495    btree_commit $::bt
496    btree_close $::bt
497  } {}
498  do_test capi3-7.2 {
499    sqlite3 db test.db
500    catchsql {
501      SELECT * FROM sqlite_master;
502    }
503  } {1 {unsupported file format}}
504  db close
505}
506
507if {![sqlite3 -has-codec]} {
508  # Now test that the library correctly handles bogus entries in the
509  # sqlite_master table (schema corruption).
510  do_test capi3-8.1 {
511    file delete -force test.db
512    file delete -force test.db-journal
513    sqlite3 db test.db
514    execsql {
515      CREATE TABLE t1(a);
516    }
517    db close
518  } {}
519  do_test capi3-8.2 {
520    set ::bt [btree_open test.db 10 0]
521    btree_begin_transaction $::bt
522    set ::bc [btree_cursor $::bt 1 1]
523
524    # Build a 5-field row record consisting of 5 null records. This is
525    # officially black magic.
526    catch {unset data}
527    set data [binary format c6 {6 0 0 0 0 0}]
528    btree_insert $::bc 5 $data
529
530    btree_close_cursor $::bc
531    btree_commit $::bt
532    btree_close $::bt
533  } {}
534  do_test capi3-8.3 {
535    sqlite3 db test.db
536    catchsql {
537      SELECT * FROM sqlite_master;
538    }
539  } {1 {malformed database schema}}
540  do_test capi3-8.4 {
541    set ::bt [btree_open test.db 10 0]
542    btree_begin_transaction $::bt
543    set ::bc [btree_cursor $::bt 1 1]
544
545    # Build a 5-field row record. The first field is a string 'table', and
546    # subsequent fields are all NULL. Replace the other broken record with
547    # this one and try to read the schema again. The broken record uses
548    # either UTF-8 or native UTF-16 (if this file is being run by
549    # utf16.test).
550    if { [string match UTF-16* $::ENC] } {
551      set data [binary format c6a10 {6 33 0 0 0 0} [utf16 table]]
552    } else {
553      set data [binary format c6a5 {6 23 0 0 0 0} table]
554    }
555    btree_insert $::bc 5 $data
556
557    btree_close_cursor $::bc
558    btree_commit $::bt
559    btree_close $::bt
560  } {};
561  do_test capi3-8.5 {
562    db close
563    sqlite3 db test.db
564    catchsql {
565      SELECT * FROM sqlite_master;
566    }
567  } {1 {malformed database schema}}
568  db close
569}
570file delete -force test.db
571file delete -force test.db-journal
572
573
574# Test the english language string equivalents for sqlite error codes
575set code2english [list \
576SQLITE_OK         {not an error} \
577SQLITE_ERROR      {SQL logic error or missing database} \
578SQLITE_INTERNAL   {internal SQLite implementation flaw} \
579SQLITE_PERM       {access permission denied} \
580SQLITE_ABORT      {callback requested query abort} \
581SQLITE_BUSY       {database is locked} \
582SQLITE_LOCKED     {database table is locked} \
583SQLITE_NOMEM      {out of memory} \
584SQLITE_READONLY   {attempt to write a readonly database} \
585SQLITE_INTERRUPT  {interrupted} \
586SQLITE_IOERR      {disk I/O error} \
587SQLITE_CORRUPT    {database disk image is malformed} \
588SQLITE_NOTFOUND   {table or record not found} \
589SQLITE_FULL       {database is full} \
590SQLITE_CANTOPEN   {unable to open database file} \
591SQLITE_PROTOCOL   {database locking protocol failure} \
592SQLITE_EMPTY      {table contains no data} \
593SQLITE_SCHEMA     {database schema has changed} \
594SQLITE_TOOBIG     {too much data for one table row} \
595SQLITE_CONSTRAINT {constraint failed} \
596SQLITE_MISMATCH   {datatype mismatch} \
597SQLITE_MISUSE     {library routine called out of sequence} \
598SQLITE_NOLFS      {kernel lacks large file support} \
599SQLITE_AUTH       {authorization denied} \
600SQLITE_FORMAT     {auxiliary database format error} \
601SQLITE_RANGE      {bind or column index out of range} \
602SQLITE_NOTADB     {file is encrypted or is not a database} \
603unknownerror      {unknown error} \
604]
605
606set test_number 1
607foreach {code english} $code2english {
608  do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
609  incr test_number
610}
611
612# Test the error message when a "real" out of memory occurs.
613if {[info command sqlite_malloc_stat]!=""} {
614set sqlite_malloc_fail 1
615do_test capi3-10-1 {
616  set ::DB [sqlite3 db test.db]
617  sqlite_malloc_fail 1
618  catchsql {
619    select * from sqlite_master;
620  }
621} {1 {out of memory}}
622do_test capi3-10-2 {
623  sqlite3_errmsg $::DB
624} {out of memory}
625ifcapable {utf16} {
626  do_test capi3-10-3 {
627    utf8 [sqlite3_errmsg16 $::DB]
628  } {out of memory}
629}
630db close
631sqlite_malloc_fail 0
632}
633
634# The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
635# statement issued while there are still outstanding VMs that are part of
636# the transaction fails.
637set DB [sqlite3 db test.db]
638sqlite_register_test_function $DB func
639do_test capi3-11.1 {
640  execsql {
641    BEGIN;
642    CREATE TABLE t1(a, b);
643    INSERT INTO t1 VALUES(1, 'int');
644    INSERT INTO t1 VALUES(2, 'notatype');
645  }
646} {}
647do_test capi3-11.1.1 {
648  sqlite3_get_autocommit $DB
649} 0
650do_test capi3-11.2 {
651  set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
652  sqlite3_step $STMT
653} {SQLITE_ROW}
654do_test capi3-11.3 {
655  catchsql {
656    COMMIT;
657  }
658} {1 {cannot commit transaction - SQL statements in progress}}
659do_test capi3-11.3.1 {
660  sqlite3_get_autocommit $DB
661} 0
662do_test capi3-11.4 {
663  sqlite3_step $STMT
664} {SQLITE_ERROR}
665do_test capi3-11.5 {
666  sqlite3_finalize $STMT
667} {SQLITE_ERROR}
668do_test capi3-11.6 {
669  catchsql {
670    SELECT * FROM t1;
671  }
672} {0 {1 int 2 notatype}}
673do_test capi3-11.6.1 {
674  sqlite3_get_autocommit $DB
675} 0
676do_test capi3-11.7 {
677  catchsql {
678    COMMIT;
679  }
680} {0 {}}
681do_test capi3-11.7.1 {
682  sqlite3_get_autocommit $DB
683} 1
684do_test capi3-11.8 {
685  execsql {
686    CREATE TABLE t2(a);
687    INSERT INTO t2 VALUES(1);
688    INSERT INTO t2 VALUES(2);
689    BEGIN;
690    INSERT INTO t2 VALUES(3);
691  }
692} {}
693do_test capi3-11.8.1 {
694  sqlite3_get_autocommit $DB
695} 0
696do_test capi3-11.9 {
697  set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
698  sqlite3_step $STMT
699} {SQLITE_ROW}
700do_test capi3-11.9.1 {
701  sqlite3_get_autocommit $DB
702} 0
703do_test capi3-11.9.2 {
704  catchsql {
705    ROLLBACK;
706  }
707} {1 {cannot rollback transaction - SQL statements in progress}}
708do_test capi3-11.9.3 {
709  sqlite3_get_autocommit $DB
710} 0
711do_test capi3-11.10 {
712  sqlite3_step $STMT
713} {SQLITE_ROW}
714do_test capi3-11.11 {
715  sqlite3_step $STMT
716} {SQLITE_ROW}
717do_test capi3-11.12 {
718  sqlite3_step $STMT
719} {SQLITE_DONE}
720do_test capi3-11.13 {
721  sqlite3_finalize $STMT
722} {SQLITE_OK}
723do_test capi3-11.14 {
724  execsql {
725    SELECT a FROM t2;
726  }
727} {1 2 3}
728do_test capi3-11.14.1 {
729  sqlite3_get_autocommit $DB
730} 0
731do_test capi3-11.15 {
732  catchsql {
733    ROLLBACK;
734  }
735} {0 {}}
736do_test capi3-11.15.1 {
737  sqlite3_get_autocommit $DB
738} 1
739do_test capi3-11.16 {
740  execsql {
741    SELECT a FROM t2;
742  }
743} {1 2}
744
745# Sanity check on the definition of 'outstanding VM'. This means any VM
746# that has had sqlite3_step() called more recently than sqlite3_finalize() or
747# sqlite3_reset(). So a VM that has just been prepared or reset does not
748# count as an active VM.
749do_test capi3-11.17 {
750  execsql {
751    BEGIN;
752  }
753} {}
754do_test capi3-11.18 {
755  set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
756  catchsql {
757    COMMIT;
758  }
759} {0 {}}
760do_test capi3-11.19 {
761  sqlite3_step $STMT
762} {SQLITE_ROW}
763do_test capi3-11.20 {
764  catchsql {
765    BEGIN;
766    COMMIT;
767  }
768} {1 {cannot commit transaction - SQL statements in progress}}
769do_test capi3-11.20 {
770  sqlite3_reset $STMT
771  catchsql {
772    COMMIT;
773  }
774} {0 {}}
775do_test capi3-11.21 {
776  sqlite3_finalize $STMT
777} {SQLITE_OK}
778
779# The following tests - capi3-12.* - check that it's Ok to start a
780# transaction while other VMs are active, and that it's Ok to execute
781# atomic updates in the same situation (so long as they are on a different
782# table).
783do_test capi3-12.1 {
784  set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
785  sqlite3_step $STMT
786} {SQLITE_ROW}
787do_test capi3-12.2 {
788  catchsql {
789    INSERT INTO t1 VALUES(3, NULL);
790  }
791} {0 {}}
792
793do_test capi3-12.3 {
794  catchsql {
795    INSERT INTO t2 VALUES(4);
796  }
797} {1 {database table is locked}}
798do_test capi3-12.4 {
799  catchsql {
800    BEGIN;
801    INSERT INTO t1 VALUES(4, NULL);
802  }
803} {0 {}}
804do_test capi3-12.5 {
805  sqlite3_step $STMT
806} {SQLITE_ROW}
807do_test capi3-12.6 {
808  sqlite3_step $STMT
809} {SQLITE_DONE}
810do_test capi3-12.7 {
811  sqlite3_finalize $STMT
812} {SQLITE_OK}
813do_test capi3-12.8 {
814  execsql {
815    COMMIT;
816    SELECT a FROM t1;
817  }
818} {1 2 3 4}
819
820# Test cases capi3-13.* test the sqlite3_clear_bindings() and
821# sqlite3_sleep APIs.
822#
823if {[llength [info commands sqlite3_clear_bindings]]>0} {
824  do_test capi3-13.1 {
825    execsql {
826      DELETE FROM t1;
827    }
828    set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
829    sqlite3_step $STMT
830  } {SQLITE_DONE}
831  do_test capi3-13.2 {
832    sqlite3_reset $STMT
833    sqlite3_bind_text $STMT 1 hello 5
834    sqlite3_bind_text $STMT 2 world 5
835    sqlite3_step $STMT
836  } {SQLITE_DONE}
837  do_test capi3-13.3 {
838    sqlite3_reset $STMT
839    sqlite3_clear_bindings $STMT
840    sqlite3_step $STMT
841  } {SQLITE_DONE}
842  do_test capi3-13-4 {
843    sqlite3_finalize $STMT
844    execsql {
845      SELECT * FROM t1;
846    }
847  } {{} {} hello world {} {}}
848}
849if {[llength [info commands sqlite3_sleep]]>0} {
850  do_test capi3-13-5 {
851    set ms [sqlite3_sleep 80]
852    expr {$ms==80 || $ms==1000}
853  } {1}
854}
855
856# Ticket #1219:  Make sure binding APIs can handle a NULL pointer.
857#
858do_test capi3-14.1 {
859  set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
860  lappend rc $msg
861} {1 SQLITE_MISUSE}
862
863
864finish_test
865