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