xref: /sqlite-3.40.0/test/capi3c.test (revision 43bc88bb)
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.23 2009/07/22 07:27:57 danielk1977 Exp $
17#
18
19set testdir [file dirname $argv0]
20source $testdir/tester.tcl
21
22# Return the UTF-16 representation of the supplied UTF-8 string $str.
23# If $nt is true, append two 0x00 bytes as a nul terminator.
24proc utf16 {str {nt 1}} {
25  set r [encoding convertto unicode $str]
26  if {$nt} {
27    append r "\x00\x00"
28  }
29  return $r
30}
31
32# Return the UTF-8 representation of the supplied UTF-16 string $str.
33proc utf8 {str} {
34  # If $str ends in two 0x00 0x00 bytes, knock these off before
35  # converting to UTF-8 using TCL.
36  binary scan $str \c* vals
37  if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
38    set str [binary format \c* [lrange $vals 0 end-2]]
39  }
40
41  set r [encoding convertfrom unicode $str]
42  return $r
43}
44
45# These tests complement those in capi2.test. They are organized
46# as follows:
47#
48# capi3c-1.*: Test sqlite3_prepare_v2
49# capi3c-2.*: Test sqlite3_prepare16_v2
50# capi3c-3.*: Test sqlite3_open
51# capi3c-4.*: Test sqlite3_open16
52# capi3c-5.*: Test the various sqlite3_result_* APIs
53# capi3c-6.*: Test that sqlite3_close fails if there are outstanding VMs.
54#
55
56set DB [sqlite3_connection_pointer db]
57
58do_test capi3c-1.0 {
59  sqlite3_get_autocommit $DB
60} 1
61do_test capi3c-1.1 {
62  set STMT [sqlite3_prepare_v2 $DB {SELECT name FROM sqlite_master} -1 TAIL]
63  sqlite3_finalize $STMT
64  set TAIL
65} {}
66do_test capi3c-1.2.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}
791
792# As of 3.6.5 a COMMIT is OK during while a query is still running -
793# as long as it is a read-only query and not an incremental BLOB write.
794#
795do_test capi3-11.3.1 {
796  catchsql {
797    COMMIT;
798  }
799} {0 {}}
800do_test capi3-11.3.2 {
801  sqlite3_extended_errcode $DB
802} {SQLITE_OK}
803do_test capi3-11.3.3 {
804  sqlite3_get_autocommit $DB
805} 1
806do_test capi3-11.3.4 {
807  db eval {PRAGMA lock_status}
808} {main shared temp closed}
809
810do_test capi3c-11.4 {
811  sqlite3_step $STMT
812} {SQLITE_ERROR}
813do_test capi3c-11.5 {
814  sqlite3_finalize $STMT
815} {SQLITE_ERROR}
816do_test capi3c-11.6 {
817  catchsql {
818    SELECT * FROM t1;
819  }
820} {0 {1 int 2 notatype}}
821do_test capi3c-11.7 {
822  sqlite3_get_autocommit $DB
823} 1
824do_test capi3c-11.8 {
825  execsql {
826    CREATE TABLE t2(a);
827    INSERT INTO t2 VALUES(1);
828    INSERT INTO t2 VALUES(2);
829    BEGIN;
830    INSERT INTO t2 VALUES(3);
831  }
832} {}
833do_test capi3c-11.8.1 {
834  sqlite3_get_autocommit $DB
835} 0
836do_test capi3c-11.9 {
837  set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
838  sqlite3_step $STMT
839} {SQLITE_ROW}
840do_test capi3c-11.9.1 {
841  sqlite3_get_autocommit $DB
842} 0
843do_test capi3c-11.9.2 {
844  catchsql {
845    ROLLBACK;
846  }
847} {1 {cannot rollback transaction - SQL statements in progress}}
848do_test capi3c-11.9.3 {
849  sqlite3_get_autocommit $DB
850} 0
851do_test capi3c-11.10 {
852  sqlite3_step $STMT
853} {SQLITE_ROW}
854do_test capi3c-11.11 {
855  sqlite3_step $STMT
856} {SQLITE_ROW}
857do_test capi3c-11.12 {
858  sqlite3_step $STMT
859} {SQLITE_DONE}
860do_test capi3c-11.13 {
861  sqlite3_finalize $STMT
862} {SQLITE_OK}
863do_test capi3c-11.14 {
864  execsql {
865    SELECT a FROM t2;
866  }
867} {1 2 3}
868do_test capi3c-11.14.1 {
869  sqlite3_get_autocommit $DB
870} 0
871do_test capi3c-11.15 {
872  catchsql {
873    ROLLBACK;
874  }
875} {0 {}}
876do_test capi3c-11.15.1 {
877  sqlite3_get_autocommit $DB
878} 1
879do_test capi3c-11.16 {
880  execsql {
881    SELECT a FROM t2;
882  }
883} {1 2}
884
885# Sanity check on the definition of 'outstanding VM'. This means any VM
886# that has had sqlite3_step() called more recently than sqlite3_finalize() or
887# sqlite3_reset(). So a VM that has just been prepared or reset does not
888# count as an active VM.
889do_test capi3c-11.17 {
890  execsql {
891    BEGIN;
892  }
893} {}
894do_test capi3c-11.18 {
895  set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL]
896  catchsql {
897    COMMIT;
898  }
899} {0 {}}
900do_test capi3c-11.19 {
901  sqlite3_step $STMT
902} {SQLITE_ROW}
903do_test capi3c-11.20 {
904  catchsql {
905    BEGIN;
906    COMMIT;
907  }
908} {0 {}}
909do_test capi3c-11.20 {
910  sqlite3_reset $STMT
911  catchsql {
912    COMMIT;
913  }
914} {1 {cannot commit - no transaction is active}}
915do_test capi3c-11.21 {
916  sqlite3_finalize $STMT
917} {SQLITE_OK}
918
919# The following tests - capi3c-12.* - check that its Ok to start a
920# transaction while other VMs are active, and that its Ok to execute
921# atomic updates in the same situation
922#
923do_test capi3c-12.1 {
924  set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
925  sqlite3_step $STMT
926} {SQLITE_ROW}
927do_test capi3c-12.2 {
928  catchsql {
929    INSERT INTO t1 VALUES(3, NULL);
930  }
931} {0 {}}
932do_test capi3c-12.3 {
933  catchsql {
934    INSERT INTO t2 VALUES(4);
935  }
936} {0 {}}
937do_test capi3c-12.4 {
938  catchsql {
939    BEGIN;
940    INSERT INTO t1 VALUES(4, NULL);
941  }
942} {0 {}}
943do_test capi3c-12.5 {
944  sqlite3_step $STMT
945} {SQLITE_ROW}
946do_test capi3c-12.5.1 {
947  sqlite3_step $STMT
948} {SQLITE_ROW}
949do_test capi3c-12.6 {
950  sqlite3_step $STMT
951} {SQLITE_DONE}
952do_test capi3c-12.7 {
953  sqlite3_finalize $STMT
954} {SQLITE_OK}
955do_test capi3c-12.8 {
956  execsql {
957    COMMIT;
958    SELECT a FROM t1;
959  }
960} {1 2 3 4}
961
962# Test cases capi3c-13.* test the sqlite3_clear_bindings() and
963# sqlite3_sleep APIs.
964#
965if {[llength [info commands sqlite3_clear_bindings]]>0} {
966  do_test capi3c-13.1 {
967    execsql {
968      DELETE FROM t1;
969    }
970    set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
971    sqlite3_step $STMT
972  } {SQLITE_DONE}
973  do_test capi3c-13.2 {
974    sqlite3_reset $STMT
975    sqlite3_bind_text $STMT 1 hello 5
976    sqlite3_bind_text $STMT 2 world 5
977    sqlite3_step $STMT
978  } {SQLITE_DONE}
979  do_test capi3c-13.3 {
980    sqlite3_reset $STMT
981    sqlite3_clear_bindings $STMT
982    sqlite3_step $STMT
983  } {SQLITE_DONE}
984  do_test capi3c-13-4 {
985    sqlite3_finalize $STMT
986    execsql {
987      SELECT * FROM t1;
988    }
989  } {{} {} hello world {} {}}
990}
991if {[llength [info commands sqlite3_sleep]]>0} {
992  do_test capi3c-13-5 {
993    set ms [sqlite3_sleep 80]
994    expr {$ms==80 || $ms==1000}
995  } {1}
996}
997
998# Ticket #1219:  Make sure binding APIs can handle a NULL pointer.
999#
1000do_test capi3c-14.1 {
1001  set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
1002  lappend rc $msg
1003} {1 SQLITE_MISUSE}
1004
1005# Ticket #1650:  Honor the nBytes parameter to sqlite3_prepare.
1006#
1007do_test capi3c-15.1 {
1008  set sql {SELECT * FROM t2}
1009  set nbytes [string length $sql]
1010  append sql { WHERE a==1}
1011  set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL]
1012  sqlite3_step $STMT
1013  sqlite3_column_int $STMT 0
1014} {1}
1015do_test capi3c-15.2 {
1016  sqlite3_step $STMT
1017  sqlite3_column_int $STMT 0
1018} {2}
1019do_test capi3c-15.3 {
1020  sqlite3_finalize $STMT
1021} {SQLITE_OK}
1022
1023# Make sure code is always generated even if an IF EXISTS or
1024# IF NOT EXISTS clause is present that the table does not or
1025# does exists.  That way we will always have a prepared statement
1026# to expire when the schema changes.
1027#
1028do_test capi3c-16.1 {
1029  set sql {DROP TABLE IF EXISTS t3}
1030  set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL]
1031  sqlite3_finalize $STMT
1032  expr {$STMT!=""}
1033} {1}
1034do_test capi3c-16.2 {
1035  set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
1036  set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL]
1037  sqlite3_finalize $STMT
1038  expr {$STMT!=""}
1039} {1}
1040
1041# But still we do not generate code if there is no SQL
1042#
1043do_test capi3c-16.3 {
1044  set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL]
1045  sqlite3_finalize $STMT
1046  expr {$STMT==""}
1047} {1}
1048do_test capi3c-16.4 {
1049  set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL]
1050  sqlite3_finalize $STMT
1051  expr {$STMT==""}
1052} {1}
1053
1054# Ticket #2154.
1055#
1056do_test capi3c-17.1 {
1057  set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL]
1058  sqlite3_step $STMT
1059} SQLITE_ROW
1060do_test capi3c-17.2 {
1061  sqlite3_column_int $STMT 0
1062} 4
1063do_test capi3c-17.3 {
1064  sqlite3_step $STMT
1065} SQLITE_DONE
1066do_test capi3c-17.4 {
1067  sqlite3_reset $STMT
1068  db eval {CREATE INDEX i2 ON t2(a)}
1069  sqlite3_step $STMT
1070} SQLITE_ROW
1071do_test capi3c-17.5 {
1072  sqlite3_column_int $STMT 0
1073} 4
1074do_test capi3c-17.6 {
1075  sqlite3_step $STMT
1076} SQLITE_DONE
1077do_test capi3c-17.7 {
1078  sqlite3_reset $STMT
1079  db eval {DROP INDEX i2}
1080  sqlite3_step $STMT
1081} SQLITE_ROW
1082do_test capi3c-17.8 {
1083  sqlite3_column_int $STMT 0
1084} 4
1085do_test capi3c-17.9 {
1086  sqlite3_step $STMT
1087} SQLITE_DONE
1088do_test capi3c-17.10 {
1089  sqlite3_finalize $STMT
1090  set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL]
1091  sqlite3_bind_int $STMT 1 2
1092  db eval {
1093    DELETE FROM t1;
1094    INSERT INTO t1 VALUES(1,'one');
1095    INSERT INTO t1 VALUES(2,'two');
1096    INSERT INTO t1 VALUES(3,'three');
1097    INSERT INTO t1 VALUES(4,'four');
1098  }
1099  sqlite3_step $STMT
1100} SQLITE_ROW
1101do_test capi3c-17.11 {
1102  sqlite3_column_text $STMT 0
1103} two
1104do_test capi3c-17.12 {
1105  sqlite3_step $STMT
1106} SQLITE_DONE
1107do_test capi3c-17.13 {
1108  sqlite3_reset $STMT
1109  db eval {CREATE INDEX i1 ON t1(a)}
1110  sqlite3_step $STMT
1111} SQLITE_ROW
1112do_test capi3c-17.14 {
1113  sqlite3_column_text $STMT 0
1114} two
1115do_test capi3c-17.15 {
1116  sqlite3_step $STMT
1117} SQLITE_DONE
1118do_test capi3c-17.16 {
1119  sqlite3_reset $STMT
1120  db eval {DROP INDEX i1}
1121  sqlite3_step $STMT
1122} SQLITE_ROW
1123do_test capi3c-17.17 {
1124  sqlite3_column_text $STMT 0
1125} two
1126do_test capi3c-17.18 {
1127  sqlite3_step $STMT
1128} SQLITE_DONE
1129do_test capi3c-17.99 {
1130  sqlite3_finalize $STMT
1131} SQLITE_OK
1132
1133# On the mailing list it has been reported that finalizing after
1134# an SQLITE_BUSY return leads to a segfault.  Here we test that case.
1135#
1136do_test capi3c-18.1 {
1137  sqlite3 db2 test.db
1138  set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL]
1139  sqlite3_step $STMT
1140} SQLITE_ROW
1141do_test capi3c-18.2 {
1142  sqlite3_column_int $STMT 0
1143} 4
1144do_test capi3c-18.3 {
1145  sqlite3_reset $STMT
1146  db2 eval {BEGIN EXCLUSIVE}
1147  sqlite3_step $STMT
1148} SQLITE_BUSY
1149do_test capi3c-18.4 {
1150  sqlite3_finalize $STMT
1151} SQLITE_BUSY
1152do_test capi3c-18.5 {
1153  db2 eval {COMMIT}
1154  db2 close
1155} {}
1156
1157# Ticket #2158.  The sqlite3_step() will still return SQLITE_SCHEMA
1158# if the database schema changes in a way that makes the statement
1159# no longer valid.
1160#
1161do_test capi3c-19.1 {
1162  db eval {
1163     CREATE TABLE t3(x,y);
1164     INSERT INTO t3 VALUES(1,2);
1165  }
1166  set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL]
1167  sqlite3_step $STMT
1168} SQLITE_ROW
1169do_test capi3c-19.2 {
1170  sqlite3_column_int $STMT 0
1171} 1
1172do_test capi3c-19.3 {
1173  sqlite3_step $STMT
1174} SQLITE_DONE
1175do_test capi3c-19.4 {
1176  sqlite3_reset $STMT
1177  db eval {DROP TABLE t3}
1178  sqlite3_step $STMT
1179} SQLITE_SCHEMA
1180do_test capi3c-19.4.1 {
1181  sqlite3_errmsg $DB
1182} {no such table: t3}
1183ifcapable deprecated {
1184  do_test capi3c-19.4.2 {
1185    sqlite3_expired $STMT
1186  } 1
1187}
1188do_test capi3c-19.4.3 {
1189  sqlite3_errmsg $DB
1190} {no such table: t3}
1191ifcapable deprecated {
1192  do_test capi3c-19.4.4 {
1193    sqlite3_expired 0
1194  } 1
1195}
1196do_test capi3c-19.5 {
1197  sqlite3_reset $STMT
1198  db eval {
1199     CREATE TABLE t3(x,y);
1200     INSERT INTO t3 VALUES(1,2);
1201  }
1202  sqlite3_step $STMT
1203} SQLITE_ROW
1204ifcapable deprecated {
1205  do_test capi3c-19.5.2 {
1206    sqlite3_expired $STMT
1207  } 0
1208}
1209do_test capi3c-19.6 {
1210  sqlite3_column_int $STMT 1
1211} 2
1212do_test capi3c-19.99 {
1213  sqlite3_finalize $STMT
1214} SQLITE_OK
1215
1216# Make sure a change in a separate database connection does not
1217# cause an SQLITE_SCHEMA return.
1218#
1219do_test capi3c-20.1 {
1220  set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL]
1221  sqlite3 db2 test.db
1222  db2 eval {CREATE TABLE t4(x)}
1223  sqlite3_step $STMT
1224} SQLITE_ROW
1225do_test capi3c-20.2 {
1226  sqlite3_column_int $STMT 1
1227} 2
1228do_test capi3c-20.3 {
1229  sqlite3_step $STMT
1230} SQLITE_DONE
1231do_test capi3c-20.4 {
1232  db2 close
1233  sqlite3_finalize $STMT
1234} SQLITE_OK
1235
1236# Test that sqlite3_step() sets the database error code correctly.
1237# See ticket #2497.
1238#
1239ifcapable progress {
1240  do_test capi3c-21.1 {
1241    set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL]
1242    db progress 5 "expr 1"
1243    sqlite3_step $STMT
1244  } {SQLITE_INTERRUPT}
1245  do_test capi3c-21.2 {
1246    sqlite3_extended_errcode $DB
1247  } {SQLITE_INTERRUPT}
1248  do_test capi3c-21.3 {
1249    sqlite3_finalize $STMT
1250  } {SQLITE_INTERRUPT}
1251  do_test capi3c-21.4 {
1252    set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
1253    db progress 5 "expr 1"
1254    sqlite3_step $STMT
1255  } {SQLITE_ERROR}
1256  do_test capi3c-21.5 {
1257    sqlite3_errcode $DB
1258  } {SQLITE_ERROR}
1259  do_test capi3c-21.6 {
1260    sqlite3_finalize $STMT
1261  } {SQLITE_INTERRUPT}
1262  do_test capi3c-21.7 {
1263    sqlite3_errcode $DB
1264  } {SQLITE_INTERRUPT}
1265  do_test capi3c-21.8 {
1266    sqlite3_extended_errcode $DB
1267  } {SQLITE_INTERRUPT}
1268}
1269
1270# Make sure sqlite3_result_error_code() returns the correct error code.
1271# See ticket #2940
1272#
1273do_test capi3c-22.1 {
1274  db progress 0 {}
1275  set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL]
1276  sqlite3_step $STMT
1277} {SQLITE_PERM}
1278sqlite3_finalize $STMT
1279do_test capi3c-22.2 {
1280  set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL]
1281  sqlite3_step $STMT
1282} {SQLITE_ABORT}
1283sqlite3_finalize $STMT
1284do_test capi3c-22.3 {
1285  set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL]
1286  sqlite3_step $STMT
1287} {SQLITE_EMPTY}
1288sqlite3_finalize $STMT
1289
1290# For a multi-column result set where the same table column is repeated
1291# in multiple columns of the output, verify that doing a UTF-8 to UTF-16
1292# conversion (or vice versa) on one column does not change the value of
1293# the second.
1294#
1295ifcapable utf16 {
1296  do_test capi3c-23.1 {
1297    set STMT [sqlite3_prepare_v2 db {SELECT b,b,b,b FROM t1} -1 TAIL]
1298    sqlite3_step $STMT
1299  } {SQLITE_ROW}
1300  do_test capi3c-23.2 {
1301    sqlite3_column_text16 $STMT 0
1302    sqlite3_column_text $STMT 1
1303  } {one}
1304  do_test capi3c-23.3 {
1305    sqlite3_column_text16 $STMT 2
1306    sqlite3_column_text $STMT 3
1307  } {one}
1308  sqlite3_finalize $STMT
1309  do_test capi3c-23.4 {
1310    set STMT [sqlite3_prepare_v2 db {SELECT b||'x',b,b,b FROM t1} -1 TAIL]
1311    sqlite3_step $STMT
1312  } {SQLITE_ROW}
1313  do_test capi3c-23.5 {
1314    sqlite3_column_text16 $STMT 0
1315    sqlite3_column_text $STMT 1
1316  } {one}
1317  do_test capi3c-23.6 {
1318    sqlite3_column_text16 $STMT 2
1319    sqlite3_column_text $STMT 3
1320  } {one}
1321  sqlite3_finalize $STMT
1322}
1323
1324# Test decltype on some SELECT statements that contain sub-selects.
1325#
1326proc decltype {zSql} {
1327  set ret [list]
1328  set STMT [sqlite3_prepare_v2 db $zSql -1 TAIL]
1329  for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
1330    lappend ret [sqlite3_column_decltype $STMT $i]
1331  }
1332  sqlite3_finalize $STMT
1333  return $ret
1334}
1335do_test capi3c-24.1 {
1336  execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) }
1337  decltype {SELECT * FROM t5}
1338} {INTEGER STRING DATETIME}
1339do_test capi3c-24.2 {
1340  decltype {SELECT (SELECT c) FROM t5}
1341} {DATETIME}
1342do_test capi3c-24.3 {
1343  decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5}
1344} {DATETIME}
1345do_test capi3c-24.4 {
1346  decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b}
1347} {INTEGER STRING DATETIME}
1348do_test capi3c-24.5 {
1349  decltype {
1350    SELECT (SELECT x FROM (SELECT c AS x))
1351    FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b
1352  }
1353} {DATETIME}
1354do_test capi3c-24.3 {
1355  decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5}
1356} {INTEGER}
1357
1358finish_test
1359