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