xref: /sqlite-3.40.0/test/capi3.test (revision 6ab91a7a)
16622cce3Sdanielk1977# 2003 January 29
26622cce3Sdanielk1977#
36622cce3Sdanielk1977# The author disclaims copyright to this source code.  In place of
46622cce3Sdanielk1977# a legal notice, here is a blessing:
56622cce3Sdanielk1977#
66622cce3Sdanielk1977#    May you do good and not evil.
76622cce3Sdanielk1977#    May you find forgiveness for yourself and forgive others.
86622cce3Sdanielk1977#    May you share freely, never taking more than you give.
96622cce3Sdanielk1977#
106622cce3Sdanielk1977#***********************************************************************
116622cce3Sdanielk1977# This file implements regression tests for SQLite library.  The
126622cce3Sdanielk1977# focus of this script testing the callback-free C/C++ API.
136622cce3Sdanielk1977#
141c767f0dSdrh# $Id: capi3.test,v 1.70 2009/01/09 02:49:32 drh Exp $
156622cce3Sdanielk1977#
166622cce3Sdanielk1977
176622cce3Sdanielk1977set testdir [file dirname $argv0]
186622cce3Sdanielk1977source $testdir/tester.tcl
1914965665Sdanset ::testprefix capi3
206622cce3Sdanielk1977
2168928b6cSdan# Do not use a codec for tests in this file, as the database file is
2268928b6cSdan# manipulated directly using tcl scripts (using the [hexio_write] command).
2368928b6cSdan#
2468928b6cSdando_not_use_codec
2568928b6cSdan
266622cce3Sdanielk1977# Return the UTF-16 representation of the supplied UTF-8 string $str.
276622cce3Sdanielk1977# If $nt is true, append two 0x00 bytes as a nul terminator.
286622cce3Sdanielk1977proc utf16 {str {nt 1}} {
296622cce3Sdanielk1977  set r [encoding convertto unicode $str]
306622cce3Sdanielk1977  if {$nt} {
316622cce3Sdanielk1977    append r "\x00\x00"
326622cce3Sdanielk1977  }
336622cce3Sdanielk1977  return $r
346622cce3Sdanielk1977}
356622cce3Sdanielk1977
366622cce3Sdanielk1977# Return the UTF-8 representation of the supplied UTF-16 string $str.
376622cce3Sdanielk1977proc utf8 {str} {
386622cce3Sdanielk1977  # If $str ends in two 0x00 0x00 bytes, knock these off before
396622cce3Sdanielk1977  # converting to UTF-8 using TCL.
406622cce3Sdanielk1977  binary scan $str \c* vals
416622cce3Sdanielk1977  if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
426622cce3Sdanielk1977    set str [binary format \c* [lrange $vals 0 end-2]]
436622cce3Sdanielk1977  }
446622cce3Sdanielk1977
456622cce3Sdanielk1977  set r [encoding convertfrom unicode $str]
466622cce3Sdanielk1977  return $r
476622cce3Sdanielk1977}
486622cce3Sdanielk1977
496622cce3Sdanielk1977# These tests complement those in capi2.test. They are organized
506622cce3Sdanielk1977# as follows:
516622cce3Sdanielk1977#
526622cce3Sdanielk1977# capi3-1.*: Test sqlite3_prepare
536622cce3Sdanielk1977# capi3-2.*: Test sqlite3_prepare16
544ad1713cSdanielk1977# capi3-3.*: Test sqlite3_open
554ad1713cSdanielk1977# capi3-4.*: Test sqlite3_open16
563cf86063Sdanielk1977# capi3-5.*: Test the various sqlite3_result_* APIs
5796d81f99Sdanielk1977# capi3-6.*: Test that sqlite3_close fails if there are outstanding VMs.
586622cce3Sdanielk1977#
596622cce3Sdanielk1977
60dddca286Sdrhset DB [sqlite3_connection_pointer db]
616622cce3Sdanielk1977
623e1d8e63Sdrhdo_test capi3-1.0 {
633e1d8e63Sdrh  sqlite3_get_autocommit $DB
643e1d8e63Sdrh} 1
656622cce3Sdanielk1977do_test capi3-1.1 {
666622cce3Sdanielk1977  set STMT [sqlite3_prepare $DB {SELECT name FROM sqlite_master} -1 TAIL]
67106bb236Sdanielk1977  sqlite3_finalize $STMT
686622cce3Sdanielk1977  set TAIL
696622cce3Sdanielk1977} {}
7099dfe5ebSdrhdo_test capi3-1.2.1 {
716622cce3Sdanielk1977  sqlite3_errcode $DB
726622cce3Sdanielk1977} {SQLITE_OK}
7399dfe5ebSdrhdo_test capi3-1.2.2 {
7499dfe5ebSdrh  sqlite3_extended_errcode $DB
7599dfe5ebSdrh} {SQLITE_OK}
766622cce3Sdanielk1977do_test capi3-1.3 {
776622cce3Sdanielk1977  sqlite3_errmsg $DB
786622cce3Sdanielk1977} {not an error}
796622cce3Sdanielk1977do_test capi3-1.4 {
806622cce3Sdanielk1977  set sql {SELECT name FROM sqlite_master;SELECT 10}
816622cce3Sdanielk1977  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
82106bb236Sdanielk1977  sqlite3_finalize $STMT
836622cce3Sdanielk1977  set TAIL
846622cce3Sdanielk1977} {SELECT 10}
856622cce3Sdanielk1977do_test capi3-1.5 {
863a2c8c8bSdanielk1977  set sql {SELECT name FROM sqlite_master;SELECT 10}
873a2c8c8bSdanielk1977  set STMT [sqlite3_prepare $DB $sql [string length $sql] TAIL]
883a2c8c8bSdanielk1977  sqlite3_finalize $STMT
893a2c8c8bSdanielk1977  set TAIL
903a2c8c8bSdanielk1977} {SELECT 10}
913a2c8c8bSdanielk1977do_test capi3-1.6 {
923a2c8c8bSdanielk1977  set sql {SELECT name FROM sqlite_master;SELECT 10}
933a2c8c8bSdanielk1977  set STMT [sqlite3_prepare $DB $sql [expr [string length $sql]+1] TAIL]
943a2c8c8bSdanielk1977  sqlite3_finalize $STMT
953a2c8c8bSdanielk1977  set TAIL
963a2c8c8bSdanielk1977} {SELECT 10}
973a2c8c8bSdanielk1977
983a2c8c8bSdanielk1977do_test capi3-1.7 {
996622cce3Sdanielk1977  set sql {SELECT namex FROM sqlite_master}
1006622cce3Sdanielk1977  catch {
1016622cce3Sdanielk1977    set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1026622cce3Sdanielk1977  }
1036622cce3Sdanielk1977} {1}
10499dfe5ebSdrhdo_test capi3-1.8.1 {
1056622cce3Sdanielk1977  sqlite3_errcode $DB
1066622cce3Sdanielk1977} {SQLITE_ERROR}
10799dfe5ebSdrhdo_test capi3-1.8.2 {
10899dfe5ebSdrh  sqlite3_extended_errcode $DB
10999dfe5ebSdrh} {SQLITE_ERROR}
1103a2c8c8bSdanielk1977do_test capi3-1.9 {
1116622cce3Sdanielk1977  sqlite3_errmsg $DB
1126622cce3Sdanielk1977} {no such column: namex}
1136622cce3Sdanielk1977
1145436dc2dSdrhifcapable {utf16} {
1156622cce3Sdanielk1977  do_test capi3-2.1 {
1166622cce3Sdanielk1977    set sql16 [utf16 {SELECT name FROM sqlite_master}]
1176622cce3Sdanielk1977    set STMT [sqlite3_prepare16 $DB $sql16 -1 ::TAIL]
118106bb236Sdanielk1977    sqlite3_finalize $STMT
1196622cce3Sdanielk1977    utf8 $::TAIL
1206622cce3Sdanielk1977  } {}
1216622cce3Sdanielk1977  do_test capi3-2.2 {
1226622cce3Sdanielk1977    set sql [utf16 {SELECT name FROM sqlite_master;SELECT 10}]
1236622cce3Sdanielk1977    set STMT [sqlite3_prepare16 $DB $sql -1 TAIL]
124106bb236Sdanielk1977    sqlite3_finalize $STMT
1256622cce3Sdanielk1977    utf8 $TAIL
1266622cce3Sdanielk1977  } {SELECT 10}
1276622cce3Sdanielk1977  do_test capi3-2.3 {
1286622cce3Sdanielk1977    set sql [utf16 {SELECT namex FROM sqlite_master}]
1296622cce3Sdanielk1977    catch {
1301c767f0dSdrh      set STMT [sqlite3_prepare16 $DB $sql -1]
1316622cce3Sdanielk1977    }
1326622cce3Sdanielk1977  } {1}
13399dfe5ebSdrh  do_test capi3-2.4.1 {
1346622cce3Sdanielk1977    sqlite3_errcode $DB
1356622cce3Sdanielk1977  } {SQLITE_ERROR}
13699dfe5ebSdrh  do_test capi3-2.4.2 {
13799dfe5ebSdrh    sqlite3_extended_errcode $DB
13899dfe5ebSdrh  } {SQLITE_ERROR}
1396622cce3Sdanielk1977  do_test capi3-2.5 {
1406622cce3Sdanielk1977    sqlite3_errmsg $DB
1416622cce3Sdanielk1977  } {no such column: namex}
1423bdca9c9Sdanielk1977
1433bdca9c9Sdanielk1977  ifcapable schema_pragmas {
14483330ed8Sdrh    do_test capi3-2.6 {
14583330ed8Sdrh      execsql {CREATE TABLE tablename(x)}
1461c767f0dSdrh      set sql16 [utf16 {PRAGMA table_info("TableName"); --excess text}]
1471c767f0dSdrh      set STMT [sqlite3_prepare16 $DB $sql16 -1]
14883330ed8Sdrh      sqlite3_step $STMT
14983330ed8Sdrh    } SQLITE_ROW
15083330ed8Sdrh    do_test capi3-2.7 {
15183330ed8Sdrh      sqlite3_step $STMT
15283330ed8Sdrh    } SQLITE_DONE
15383330ed8Sdrh    do_test capi3-2.8 {
15483330ed8Sdrh      sqlite3_finalize $STMT
15583330ed8Sdrh    } SQLITE_OK
1563bdca9c9Sdanielk1977  }
1573bdca9c9Sdanielk1977
1585436dc2dSdrh} ;# endif utf16
1596622cce3Sdanielk1977
1604ad1713cSdanielk1977# rename sqlite3_open sqlite3_open_old
1614ad1713cSdanielk1977# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
1624ad1713cSdanielk1977
1634ad1713cSdanielk1977do_test capi3-3.1 {
1644ad1713cSdanielk1977  set db2 [sqlite3_open test.db {}]
1654ad1713cSdanielk1977  sqlite3_errcode $db2
1664ad1713cSdanielk1977} {SQLITE_OK}
1674ad1713cSdanielk1977# FIX ME: Should test the db handle works.
1684ad1713cSdanielk1977do_test capi3-3.2 {
1694ad1713cSdanielk1977  sqlite3_close $db2
17096d81f99Sdanielk1977} {SQLITE_OK}
1714ad1713cSdanielk1977do_test capi3-3.3 {
1724ad1713cSdanielk1977  catch {
1734ad1713cSdanielk1977    set db2 [sqlite3_open /bogus/path/test.db {}]
1744ad1713cSdanielk1977  }
1750e80e509Sdrh  set ::capi3_errno [sqlite3_system_errno $db2]
1760e80e509Sdrh  list [sqlite3_extended_errcode $db2] [expr {$::capi3_errno!=0}]
1770e80e509Sdrh} {SQLITE_CANTOPEN 1}
1784ad1713cSdanielk1977do_test capi3-3.4 {
1794ad1713cSdanielk1977  sqlite3_errmsg $db2
1804ad1713cSdanielk1977} {unable to open database file}
18196d81f99Sdanielk1977do_test capi3-3.5 {
1820e80e509Sdrh  list [sqlite3_system_errno $db2] [sqlite3_close $db2]
1830e80e509Sdrh} [list $::capi3_errno SQLITE_OK]
184afcf9bd8Sdanif {[clang_sanitize_address]==0} {
185dddb2f23Sdrh  do_test capi3-3.6.1-misuse {
1868a41449eSdanielk1977    sqlite3_close $db2
1878a41449eSdanielk1977  } {SQLITE_MISUSE}
188dddb2f23Sdrh  do_test capi3-3.6.2-misuse {
189312d6b36Sdanielk1977    sqlite3_errmsg $db2
190ff4fa772Sdrh  } {bad parameter or other API misuse}
1915436dc2dSdrh  ifcapable {utf16} {
192dddb2f23Sdrh    do_test capi3-3.6.3-misuse {
193312d6b36Sdanielk1977      utf8 [sqlite3_errmsg16 $db2]
194ff4fa772Sdrh    } {bad parameter or other API misuse}
1955436dc2dSdrh  }
196afcf9bd8Sdan}
1974ad1713cSdanielk1977
198e4d052a3Sdrhdo_test capi3-3.7 {
199e4d052a3Sdrh  set db2 [sqlite3_open]
200e4d052a3Sdrh  sqlite3_errcode $db2
201e4d052a3Sdrh} {SQLITE_OK}
202e4d052a3Sdrhdo_test capi3-3.8 {
203e4d052a3Sdrh  sqlite3_close $db2
204e4d052a3Sdrh} {SQLITE_OK}
205e4d052a3Sdrh
2064ad1713cSdanielk1977# rename sqlite3_open ""
2074ad1713cSdanielk1977# rename sqlite3_open_old sqlite3_open
2084ad1713cSdanielk1977
2095436dc2dSdrhifcapable {utf16} {
2104ad1713cSdanielk1977do_test capi3-4.1 {
2114ad1713cSdanielk1977  set db2 [sqlite3_open16 [utf16 test.db] {}]
2124ad1713cSdanielk1977  sqlite3_errcode $db2
2134ad1713cSdanielk1977} {SQLITE_OK}
2144ad1713cSdanielk1977# FIX ME: Should test the db handle works.
2154ad1713cSdanielk1977do_test capi3-4.2 {
2164ad1713cSdanielk1977  sqlite3_close $db2
21796d81f99Sdanielk1977} {SQLITE_OK}
2184ad1713cSdanielk1977do_test capi3-4.3 {
2194ad1713cSdanielk1977  catch {
2204ad1713cSdanielk1977    set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
2214ad1713cSdanielk1977  }
2224ad1713cSdanielk1977  sqlite3_errcode $db2
2234ad1713cSdanielk1977} {SQLITE_CANTOPEN}
2244ad1713cSdanielk1977do_test capi3-4.4 {
2254ad1713cSdanielk1977  utf8 [sqlite3_errmsg16 $db2]
2264ad1713cSdanielk1977} {unable to open database file}
227c572ef7fSdanielk1977do_test capi3-4.5 {
2284ad1713cSdanielk1977  sqlite3_close $db2
22996d81f99Sdanielk1977} {SQLITE_OK}
2305436dc2dSdrh} ;# utf16
2314ad1713cSdanielk1977
232ea61b2c4Sdanielk1977# This proc is used to test the following API calls:
2333cf86063Sdanielk1977#
234ea61b2c4Sdanielk1977# sqlite3_column_count
235ea61b2c4Sdanielk1977# sqlite3_column_name
236ea61b2c4Sdanielk1977# sqlite3_column_name16
237ea61b2c4Sdanielk1977# sqlite3_column_decltype
238ea61b2c4Sdanielk1977# sqlite3_column_decltype16
23904f2e68dSdanielk1977#
240ea61b2c4Sdanielk1977# $STMT is a compiled SQL statement. $test is a prefix
241ea61b2c4Sdanielk1977# to use for test names within this proc. $names is a list
242ea61b2c4Sdanielk1977# of the column names that should be returned by $STMT.
243ea61b2c4Sdanielk1977# $decltypes is a list of column declaration types for $STMT.
2443cf86063Sdanielk1977#
245ea61b2c4Sdanielk1977# Example:
2463cf86063Sdanielk1977#
247ea61b2c4Sdanielk1977# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
248ea61b2c4Sdanielk1977# check_header test1.1 {1 2 3} {"" "" ""}
249ea61b2c4Sdanielk1977#
250c572ef7fSdanielk1977proc check_header {STMT test names decltypes} {
251ea61b2c4Sdanielk1977
252ea61b2c4Sdanielk1977  # Use the return value of sqlite3_column_count() to build
253ea61b2c4Sdanielk1977  # a list of column indexes. i.e. If sqlite3_column_count
254ea61b2c4Sdanielk1977  # is 3, build the list {0 1 2}.
255c572ef7fSdanielk1977  set ::idxlist [list]
256f4618891Sdanielk1977  set ::numcols [sqlite3_column_count $STMT]
257f4618891Sdanielk1977  for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
258ea61b2c4Sdanielk1977
259ea61b2c4Sdanielk1977  # Column names in UTF-8
260ea61b2c4Sdanielk1977  do_test $test.1 {
261ea61b2c4Sdanielk1977    set cnamelist [list]
262ea61b2c4Sdanielk1977    foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
263ea61b2c4Sdanielk1977    set cnamelist
264ea61b2c4Sdanielk1977  } $names
265ea61b2c4Sdanielk1977
266ea61b2c4Sdanielk1977  # Column names in UTF-16
2675436dc2dSdrh  ifcapable {utf16} {
268ea61b2c4Sdanielk1977    do_test $test.2 {
269ea61b2c4Sdanielk1977      set cnamelist [list]
27076d505baSdanielk1977      foreach i $idxlist {
27176d505baSdanielk1977        lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
27276d505baSdanielk1977      }
273ea61b2c4Sdanielk1977      set cnamelist
274ea61b2c4Sdanielk1977    } $names
2755436dc2dSdrh  }
276ea61b2c4Sdanielk1977
277ea61b2c4Sdanielk1977  # Column names in UTF-8
278ea61b2c4Sdanielk1977  do_test $test.3 {
279ea61b2c4Sdanielk1977    set cnamelist [list]
280ea61b2c4Sdanielk1977    foreach i $idxlist {lappend cnamelist [sqlite3_column_name $STMT $i]}
281ea61b2c4Sdanielk1977    set cnamelist
282ea61b2c4Sdanielk1977  } $names
283ea61b2c4Sdanielk1977
284ea61b2c4Sdanielk1977  # Column names in UTF-16
2855436dc2dSdrh  ifcapable {utf16} {
286ea61b2c4Sdanielk1977    do_test $test.4 {
287ea61b2c4Sdanielk1977      set cnamelist [list]
28876d505baSdanielk1977      foreach i $idxlist {
28976d505baSdanielk1977        lappend cnamelist [utf8 [sqlite3_column_name16 $STMT $i]]
29076d505baSdanielk1977      }
291ea61b2c4Sdanielk1977      set cnamelist
292ea61b2c4Sdanielk1977    } $names
2935436dc2dSdrh  }
29476d505baSdanielk1977
29576d505baSdanielk1977  # Column names in UTF-8
29676d505baSdanielk1977  do_test $test.5 {
29776d505baSdanielk1977    set cnamelist [list]
29876d505baSdanielk1977    foreach i $idxlist {lappend cnamelist [sqlite3_column_decltype $STMT $i]}
29976d505baSdanielk1977    set cnamelist
30076d505baSdanielk1977  } $decltypes
30176d505baSdanielk1977
30276d505baSdanielk1977  # Column declaration types in UTF-16
3035436dc2dSdrh  ifcapable {utf16} {
30476d505baSdanielk1977    do_test $test.6 {
30576d505baSdanielk1977      set cnamelist [list]
30676d505baSdanielk1977      foreach i $idxlist {
30776d505baSdanielk1977        lappend cnamelist [utf8 [sqlite3_column_decltype16 $STMT $i]]
30876d505baSdanielk1977      }
30976d505baSdanielk1977      set cnamelist
31076d505baSdanielk1977    } $decltypes
3115436dc2dSdrh  }
31276d505baSdanielk1977
313f4618891Sdanielk1977
314f4618891Sdanielk1977  # Test some out of range conditions:
3155436dc2dSdrh  ifcapable {utf16} {
316f4618891Sdanielk1977    do_test $test.7 {
317f4618891Sdanielk1977      list \
318f4618891Sdanielk1977        [sqlite3_column_name $STMT -1] \
319f4618891Sdanielk1977        [sqlite3_column_name16 $STMT -1] \
320f4618891Sdanielk1977        [sqlite3_column_decltype $STMT -1] \
321f4618891Sdanielk1977        [sqlite3_column_decltype16 $STMT -1] \
322f4618891Sdanielk1977        [sqlite3_column_name $STMT $numcols] \
323f4618891Sdanielk1977        [sqlite3_column_name16 $STMT $numcols] \
324f4618891Sdanielk1977        [sqlite3_column_decltype $STMT $numcols] \
325f4618891Sdanielk1977        [sqlite3_column_decltype16 $STMT $numcols]
326f4618891Sdanielk1977    } {{} {} {} {} {} {} {} {}}
3275436dc2dSdrh  }
328955de52cSdanielk1977}
329f4618891Sdanielk1977
330955de52cSdanielk1977# This proc is used to test the following API calls:
331955de52cSdanielk1977#
332955de52cSdanielk1977# sqlite3_column_origin_name
333955de52cSdanielk1977# sqlite3_column_origin_name16
334955de52cSdanielk1977# sqlite3_column_table_name
335955de52cSdanielk1977# sqlite3_column_table_name16
336955de52cSdanielk1977# sqlite3_column_database_name
337955de52cSdanielk1977# sqlite3_column_database_name16
338955de52cSdanielk1977#
339955de52cSdanielk1977# $STMT is a compiled SQL statement. $test is a prefix
340955de52cSdanielk1977# to use for test names within this proc. $names is a list
341955de52cSdanielk1977# of the column names that should be returned by $STMT.
342955de52cSdanielk1977# $decltypes is a list of column declaration types for $STMT.
343955de52cSdanielk1977#
344955de52cSdanielk1977# Example:
345955de52cSdanielk1977#
346955de52cSdanielk1977# set STMT [sqlite3_prepare "SELECT 1, 2, 2;" -1 DUMMY]
347955de52cSdanielk1977# check_header test1.1 {1 2 3} {"" "" ""}
348955de52cSdanielk1977#
349955de52cSdanielk1977proc check_origin_header {STMT test dbs tables cols} {
3501787ccabSdanielk1977  # If sqlite3_column_origin_name() and friends are not compiled into
3511787ccabSdanielk1977  # this build, this proc is a no-op.
3521787ccabSdanielk1977  ifcapable columnmetadata {
353955de52cSdanielk1977    # Use the return value of sqlite3_column_count() to build
354955de52cSdanielk1977    # a list of column indexes. i.e. If sqlite3_column_count
355955de52cSdanielk1977    # is 3, build the list {0 1 2}.
356955de52cSdanielk1977    set ::idxlist [list]
357955de52cSdanielk1977    set ::numcols [sqlite3_column_count $STMT]
358955de52cSdanielk1977    for {set i 0} {$i < $::numcols} {incr i} {lappend ::idxlist $i}
359955de52cSdanielk1977
360955de52cSdanielk1977    # Database names in UTF-8
361955de52cSdanielk1977    do_test $test.8 {
362955de52cSdanielk1977      set cnamelist [list]
363955de52cSdanielk1977      foreach i $idxlist {
364955de52cSdanielk1977        lappend cnamelist [sqlite3_column_database_name $STMT $i]
365955de52cSdanielk1977      }
366955de52cSdanielk1977      set cnamelist
367955de52cSdanielk1977    } $dbs
368955de52cSdanielk1977
369955de52cSdanielk1977    # Database names in UTF-16
370955de52cSdanielk1977    ifcapable {utf16} {
371955de52cSdanielk1977      do_test $test.9 {
372955de52cSdanielk1977        set cnamelist [list]
373955de52cSdanielk1977        foreach i $idxlist {
374955de52cSdanielk1977          lappend cnamelist [utf8 [sqlite3_column_database_name16 $STMT $i]]
375955de52cSdanielk1977        }
376955de52cSdanielk1977        set cnamelist
377955de52cSdanielk1977      } $dbs
378955de52cSdanielk1977    }
379955de52cSdanielk1977
380955de52cSdanielk1977    # Table names in UTF-8
381955de52cSdanielk1977    do_test $test.10 {
382955de52cSdanielk1977      set cnamelist [list]
3831787ccabSdanielk1977      foreach i $idxlist {
3841787ccabSdanielk1977        lappend cnamelist [sqlite3_column_table_name $STMT $i]
3851787ccabSdanielk1977      }
386955de52cSdanielk1977      set cnamelist
387955de52cSdanielk1977    } $tables
388955de52cSdanielk1977
389955de52cSdanielk1977    # Table names in UTF-16
390955de52cSdanielk1977    ifcapable {utf16} {
391955de52cSdanielk1977      do_test $test.11 {
392955de52cSdanielk1977        set cnamelist [list]
393955de52cSdanielk1977        foreach i $idxlist {
394955de52cSdanielk1977          lappend cnamelist [utf8 [sqlite3_column_table_name16 $STMT $i]]
395955de52cSdanielk1977        }
396955de52cSdanielk1977        set cnamelist
397955de52cSdanielk1977      } $tables
398955de52cSdanielk1977    }
399955de52cSdanielk1977
400955de52cSdanielk1977    # Origin names in UTF-8
401955de52cSdanielk1977    do_test $test.12 {
402955de52cSdanielk1977      set cnamelist [list]
403955de52cSdanielk1977      foreach i $idxlist {
404955de52cSdanielk1977        lappend cnamelist [sqlite3_column_origin_name $STMT $i]
405955de52cSdanielk1977      }
406955de52cSdanielk1977      set cnamelist
407955de52cSdanielk1977    } $cols
408955de52cSdanielk1977
409955de52cSdanielk1977    # Origin declaration types in UTF-16
410955de52cSdanielk1977    ifcapable {utf16} {
411955de52cSdanielk1977      do_test $test.13 {
412955de52cSdanielk1977        set cnamelist [list]
413955de52cSdanielk1977        foreach i $idxlist {
414955de52cSdanielk1977          lappend cnamelist [utf8 [sqlite3_column_origin_name16 $STMT $i]]
415955de52cSdanielk1977        }
416955de52cSdanielk1977        set cnamelist
417955de52cSdanielk1977      } $cols
418955de52cSdanielk1977    }
419ea61b2c4Sdanielk1977  }
4201787ccabSdanielk1977}
421ea61b2c4Sdanielk1977
422ea61b2c4Sdanielk1977# This proc is used to test the following APIs:
423ea61b2c4Sdanielk1977#
424ea61b2c4Sdanielk1977# sqlite3_data_count
425ea61b2c4Sdanielk1977# sqlite3_column_type
426ea61b2c4Sdanielk1977# sqlite3_column_int
427ea61b2c4Sdanielk1977# sqlite3_column_text
428ea61b2c4Sdanielk1977# sqlite3_column_text16
429ea61b2c4Sdanielk1977# sqlite3_column_double
430ea61b2c4Sdanielk1977#
431ea61b2c4Sdanielk1977# $STMT is a compiled SQL statement for which the previous call
432ea61b2c4Sdanielk1977# to sqlite3_step returned SQLITE_ROW. $test is a prefix to use
433ea61b2c4Sdanielk1977# for test names within this proc. $types is a list of the
434ea61b2c4Sdanielk1977# manifest types for the current row. $ints, $doubles and $strings
435ea61b2c4Sdanielk1977# are lists of the integer, real and string representations of
436ea61b2c4Sdanielk1977# the values in the current row.
437ea61b2c4Sdanielk1977#
438ea61b2c4Sdanielk1977# Example:
439ea61b2c4Sdanielk1977#
440ea61b2c4Sdanielk1977# set STMT [sqlite3_prepare "SELECT 'hello', 1.1, NULL" -1 DUMMY]
441ea61b2c4Sdanielk1977# sqlite3_step $STMT
442ea61b2c4Sdanielk1977# check_data test1.2 {TEXT REAL NULL} {0 1 0} {0 1.1 0} {hello 1.1 {}}
443ea61b2c4Sdanielk1977#
444ea61b2c4Sdanielk1977proc check_data {STMT test types ints doubles strings} {
445ea61b2c4Sdanielk1977
446ea61b2c4Sdanielk1977  # Use the return value of sqlite3_column_count() to build
447ea61b2c4Sdanielk1977  # a list of column indexes. i.e. If sqlite3_column_count
448ea61b2c4Sdanielk1977  # is 3, build the list {0 1 2}.
449c572ef7fSdanielk1977  set ::idxlist [list]
450ea61b2c4Sdanielk1977  set numcols [sqlite3_data_count $STMT]
451c572ef7fSdanielk1977  for {set i 0} {$i < $numcols} {incr i} {lappend ::idxlist $i}
452ea61b2c4Sdanielk1977
453ea61b2c4Sdanielk1977# types
454ea61b2c4Sdanielk1977do_test $test.1 {
455ea61b2c4Sdanielk1977  set types [list]
45622ec1346Sdrh  foreach i $idxlist {
45722ec1346Sdrh    set x [sqlite3_column_type $STMT $i]
45822ec1346Sdrh    # EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five
45922ec1346Sdrh    # fundamental datatypes: 64-bit signed integer 64-bit IEEE floating
46022ec1346Sdrh    # point number string BLOB NULL
46122ec1346Sdrh    if {[lsearch {INTEGER FLOAT TEXT BLOB NULL} $x]<0} {
46222ec1346Sdrh      set types ERROR
46322ec1346Sdrh      break
46422ec1346Sdrh    } else {
46522ec1346Sdrh      lappend types $x
46622ec1346Sdrh    }
46722ec1346Sdrh  }
468ea61b2c4Sdanielk1977  set types
469ea61b2c4Sdanielk1977} $types
470ea61b2c4Sdanielk1977
47122ec1346Sdrh
472ea61b2c4Sdanielk1977# Integers
473ea61b2c4Sdanielk1977do_test $test.2 {
474ea61b2c4Sdanielk1977  set ints [list]
475f4618891Sdanielk1977  foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
476ea61b2c4Sdanielk1977  set ints
477ea61b2c4Sdanielk1977} $ints
478ea61b2c4Sdanielk1977
479f4618891Sdanielk1977# bytes
480f4618891Sdanielk1977set lens [list]
481f4618891Sdanielk1977foreach i $::idxlist {
482f4618891Sdanielk1977  lappend lens [string length [lindex $strings $i]]
483f4618891Sdanielk1977}
484ea61b2c4Sdanielk1977do_test $test.3 {
485f4618891Sdanielk1977  set bytes [list]
486f4618891Sdanielk1977  set lens [list]
487f4618891Sdanielk1977  foreach i $idxlist {
488f4618891Sdanielk1977    lappend bytes [sqlite3_column_bytes $STMT $i]
489f4618891Sdanielk1977  }
490f4618891Sdanielk1977  set bytes
491f4618891Sdanielk1977} $lens
492f4618891Sdanielk1977
493f4618891Sdanielk1977# bytes16
4946c62608fSdrhifcapable {utf16} {
495f4618891Sdanielk1977  set lens [list]
496f4618891Sdanielk1977  foreach i $::idxlist {
497f4618891Sdanielk1977    lappend lens [expr 2 * [string length [lindex $strings $i]]]
498f4618891Sdanielk1977  }
499f4618891Sdanielk1977  do_test $test.4 {
500f4618891Sdanielk1977    set bytes [list]
501f4618891Sdanielk1977    set lens [list]
502f4618891Sdanielk1977    foreach i $idxlist {
503f4618891Sdanielk1977      lappend bytes [sqlite3_column_bytes16 $STMT $i]
504f4618891Sdanielk1977    }
505f4618891Sdanielk1977    set bytes
506f4618891Sdanielk1977  } $lens
5076c62608fSdrh}
508f4618891Sdanielk1977
509f4618891Sdanielk1977# Blob
510f4618891Sdanielk1977do_test $test.5 {
511f4618891Sdanielk1977  set utf8 [list]
512f4618891Sdanielk1977  foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
513f4618891Sdanielk1977  set utf8
514f4618891Sdanielk1977} $strings
515f4618891Sdanielk1977
516f4618891Sdanielk1977# UTF-8
517f4618891Sdanielk1977do_test $test.6 {
518ea61b2c4Sdanielk1977  set utf8 [list]
519ea61b2c4Sdanielk1977  foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
520ea61b2c4Sdanielk1977  set utf8
521ea61b2c4Sdanielk1977} $strings
522ea61b2c4Sdanielk1977
523ea61b2c4Sdanielk1977# Floats
524ea61b2c4Sdanielk1977do_test $test.7 {
525ea61b2c4Sdanielk1977  set utf8 [list]
526ea61b2c4Sdanielk1977  foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
527ea61b2c4Sdanielk1977  set utf8
528ea61b2c4Sdanielk1977} $doubles
529ea61b2c4Sdanielk1977
530f4618891Sdanielk1977# UTF-16
5315436dc2dSdrhifcapable {utf16} {
532ea61b2c4Sdanielk1977  do_test $test.8 {
533ea61b2c4Sdanielk1977    set utf8 [list]
534f4618891Sdanielk1977    foreach i $idxlist {lappend utf8 [utf8 [sqlite3_column_text16 $STMT $i]]}
535f4618891Sdanielk1977    set utf8
536f4618891Sdanielk1977  } $strings
5375436dc2dSdrh}
538f4618891Sdanielk1977
539f4618891Sdanielk1977# Integers
540f4618891Sdanielk1977do_test $test.9 {
541f4618891Sdanielk1977  set ints [list]
542f4618891Sdanielk1977  foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
543f4618891Sdanielk1977  set ints
544f4618891Sdanielk1977} $ints
545f4618891Sdanielk1977
546f4618891Sdanielk1977# Floats
547f4618891Sdanielk1977do_test $test.10 {
548f4618891Sdanielk1977  set utf8 [list]
549f4618891Sdanielk1977  foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
550f4618891Sdanielk1977  set utf8
551f4618891Sdanielk1977} $doubles
552f4618891Sdanielk1977
553f4618891Sdanielk1977# UTF-8
554f4618891Sdanielk1977do_test $test.11 {
555f4618891Sdanielk1977  set utf8 [list]
556ea61b2c4Sdanielk1977  foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
557ea61b2c4Sdanielk1977  set utf8
558ea61b2c4Sdanielk1977} $strings
559ea61b2c4Sdanielk1977
560ea61b2c4Sdanielk1977# Types
561f4618891Sdanielk1977do_test $test.12 {
562ea61b2c4Sdanielk1977  set types [list]
563ea61b2c4Sdanielk1977  foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
564ea61b2c4Sdanielk1977  set types
565ea61b2c4Sdanielk1977} $types
566ea61b2c4Sdanielk1977
567f4618891Sdanielk1977# Test that an out of range request returns the equivalent of NULL
568f4618891Sdanielk1977do_test $test.13 {
569f4618891Sdanielk1977  sqlite3_column_int $STMT -1
570f4618891Sdanielk1977} {0}
571f4618891Sdanielk1977do_test $test.13 {
572f4618891Sdanielk1977  sqlite3_column_text $STMT -1
573f4618891Sdanielk1977} {}
574f4618891Sdanielk1977
575ea61b2c4Sdanielk1977}
5763cf86063Sdanielk1977
5771b91c729Sdrhifcapable !floatingpoint {
5781b91c729Sdrh  finish_test
5791b91c729Sdrh  return
5801b91c729Sdrh}
5811b91c729Sdrh
5823cf86063Sdanielk1977do_test capi3-5.0 {
5833cf86063Sdanielk1977  execsql {
5843cf86063Sdanielk1977    CREATE TABLE t1(a VARINT, b BLOB, c VARCHAR(16));
5853cf86063Sdanielk1977    INSERT INTO t1 VALUES(1, 2, 3);
586b77f5dadSdanielk1977    INSERT INTO t1 VALUES('one', 'two', NULL);
587c572ef7fSdanielk1977    INSERT INTO t1 VALUES(1.2, 1.3, 1.4);
5883cf86063Sdanielk1977  }
5893cf86063Sdanielk1977  set sql "SELECT * FROM t1"
5903cf86063Sdanielk1977  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
5913cf86063Sdanielk1977  sqlite3_column_count $STMT
5923cf86063Sdanielk1977} 3
5933cf86063Sdanielk1977
59476d505baSdanielk1977check_header $STMT capi3-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
595955de52cSdanielk1977check_origin_header $STMT capi3-5.1 {main main main} {t1 t1 t1} {a b c}
5963cf86063Sdanielk1977do_test capi3-5.2 {
5973cf86063Sdanielk1977  sqlite3_step $STMT
5983cf86063Sdanielk1977} SQLITE_ROW
5993cf86063Sdanielk1977
60076d505baSdanielk1977check_header $STMT capi3-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
601955de52cSdanielk1977check_origin_header $STMT capi3-5.3 {main main main} {t1 t1 t1} {a b c}
602f93bbbeaSdanielk1977check_data $STMT capi3-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
6033cf86063Sdanielk1977
604ea61b2c4Sdanielk1977do_test capi3-5.5 {
6053cf86063Sdanielk1977  sqlite3_step $STMT
6063cf86063Sdanielk1977} SQLITE_ROW
6073cf86063Sdanielk1977
60876d505baSdanielk1977check_header $STMT capi3-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
609955de52cSdanielk1977check_origin_header $STMT capi3-5.6 {main main main} {t1 t1 t1} {a b c}
610f93bbbeaSdanielk1977check_data $STMT capi3-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
6113cf86063Sdanielk1977
612ea61b2c4Sdanielk1977do_test capi3-5.8 {
6133cf86063Sdanielk1977  sqlite3_step $STMT
614c572ef7fSdanielk1977} SQLITE_ROW
615c572ef7fSdanielk1977
61676d505baSdanielk1977check_header $STMT capi3-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
617955de52cSdanielk1977check_origin_header $STMT capi3-5.9 {main main main} {t1 t1 t1} {a b c}
618f93bbbeaSdanielk1977check_data $STMT capi3-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
619c572ef7fSdanielk1977
620c572ef7fSdanielk1977do_test capi3-5.11 {
621c572ef7fSdanielk1977  sqlite3_step $STMT
6223cf86063Sdanielk1977} SQLITE_DONE
6233cf86063Sdanielk1977
624c572ef7fSdanielk1977do_test capi3-5.12 {
6253cf86063Sdanielk1977  sqlite3_finalize $STMT
626ea61b2c4Sdanielk1977} SQLITE_OK
6273cf86063Sdanielk1977
62830bcf5dbSdrhdo_test capi3-5.20 {
62930bcf5dbSdrh  set sql "SELECT a, sum(b), max(c) FROM t1 GROUP BY a"
63030bcf5dbSdrh  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
63130bcf5dbSdrh  sqlite3_column_count $STMT
63230bcf5dbSdrh} 3
63330bcf5dbSdrh
63430bcf5dbSdrhcheck_header $STMT capi3-5.21 {a sum(b) max(c)} {VARINT {} {}}
63530bcf5dbSdrhcheck_origin_header $STMT capi3-5.22 {main {} {}} {t1 {} {}} {a {} {}}
63630bcf5dbSdrhdo_test capi3-5.23 {
63730bcf5dbSdrh  sqlite3_finalize $STMT
63830bcf5dbSdrh} SQLITE_OK
63930bcf5dbSdrh
640bf2564f6Sdrhdo_test capi3-5.30 {
641bf2564f6Sdrh  set sql "SELECT a AS x, sum(b) AS y, max(c) AS z FROM t1 AS m GROUP BY x"
642bf2564f6Sdrh  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
643bf2564f6Sdrh  sqlite3_column_count $STMT
644bf2564f6Sdrh} 3
645bf2564f6Sdrh
646bf2564f6Sdrhcheck_header $STMT capi3-5.31 {x y z} {VARINT {} {}}
647bf2564f6Sdrhcheck_origin_header $STMT capi3-5.32 {main {} {}} {t1 {} {}} {a {} {}}
648bf2564f6Sdrhdo_test capi3-5.33 {
649bf2564f6Sdrh  sqlite3_finalize $STMT
650bf2564f6Sdrh} SQLITE_OK
651bf2564f6Sdrh
6526116ee4eSdrh# 2018-01-09:  If a column is the last token if a string, the column name
6536116ee4eSdrh# was not being set correctly, due to changes in check-in
6546116ee4eSdrh# https://sqlite.org/src/info/0fdf97efe5df7455
6556116ee4eSdrh#
6566116ee4eSdrh# This problem was detected by the community during beta-testing.
6576116ee4eSdrh#
6586116ee4eSdrhdo_test capi3-5.34 {
6596116ee4eSdrh  set STMT [sqlite3_prepare $DB {SELECT :a, :b} -1 TAIL]
6606116ee4eSdrh  sqlite3_column_count $STMT
6616116ee4eSdrh} 2
6626116ee4eSdrhcheck_header $STMT capi-5.35 {:a :b} {{} {}}
6636116ee4eSdrhsqlite3_finalize $STMT
66430bcf5dbSdrh
66593cd0395Sdanielk1977set ::ENC [execsql {pragma encoding}]
666106bb236Sdanielk1977db close
667106bb236Sdanielk1977
66896d81f99Sdanielk1977do_test capi3-6.0 {
669dddca286Sdrh  sqlite3 db test.db
670dddca286Sdrh  set DB [sqlite3_connection_pointer db]
67168928b6cSdan  if {[sqlite3 -has-codec]==0} { sqlite3_key $DB xyzzy }
67296d81f99Sdanielk1977  set sql {SELECT a FROM t1 order by rowid}
67396d81f99Sdanielk1977  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
67496d81f99Sdanielk1977  expr 0
67596d81f99Sdanielk1977} {0}
67696d81f99Sdanielk1977do_test capi3-6.1 {
67729c636bcSdrh  db cache flush
67896d81f99Sdanielk1977  sqlite3_close $DB
67996d81f99Sdanielk1977} {SQLITE_BUSY}
680bba02a95Sdan
681bba02a95Sdan# 6.2 and 6.3 used to return SQLITE_ERROR and SQLITE_SCHEMA, respectively.
682bba02a95Sdan# But since attempting to close a connection no longer resets the internal
683bba02a95Sdan# schema and expires all statements, this is no longer the case.
68496d81f99Sdanielk1977do_test capi3-6.2 {
68596d81f99Sdanielk1977  sqlite3_step $STMT
686bba02a95Sdan} {SQLITE_ROW}
687c2a75551Sdrh#check_data $STMT capi3-6.3 {INTEGER} {1} {1.0} {1}
68896d81f99Sdanielk1977do_test capi3-6.3 {
68996d81f99Sdanielk1977  sqlite3_finalize $STMT
690bba02a95Sdan} {SQLITE_OK}
691bba02a95Sdan
692afcf9bd8Sdanif {[clang_sanitize_address]==0} {
693dddb2f23Sdrh  do_test capi3-6.4-misuse {
69429c636bcSdrh    db cache flush
69596d81f99Sdanielk1977    sqlite3_close $DB
69696d81f99Sdanielk1977  } {SQLITE_OK}
697afcf9bd8Sdan}
698dddca286Sdrhdb close
69996d81f99Sdanielk1977
700bb8a279eSdrh# This procedure sets the value of the file-format in file 'test.db'
701bb8a279eSdrh# to $newval. Also, the schema cookie is incremented.
702bb8a279eSdrh#
703bb8a279eSdrhproc set_file_format {newval} {
704bb8a279eSdrh  hexio_write test.db 44 [hexio_render_int32 $newval]
705bb8a279eSdrh  set schemacookie [hexio_get_int [hexio_read test.db 40 4]]
706bb8a279eSdrh  incr schemacookie
707bb8a279eSdrh  hexio_write test.db 40 [hexio_render_int32 $schemacookie]
708bb8a279eSdrh  return {}
709bb8a279eSdrh}
710bb8a279eSdrh
711bb8a279eSdrh# This procedure returns the value of the file-format in file 'test.db'.
712bb8a279eSdrh#
713bb8a279eSdrhproc get_file_format {{fname test.db}} {
714bb8a279eSdrh  return [hexio_get_int [hexio_read $fname 44 4]]
715bb8a279eSdrh}
716bb8a279eSdrh
71725d6543dSdrhif {![sqlite3 -has-codec]} {
7188a41449eSdanielk1977  # Test what happens when the library encounters a newer file format.
7198a41449eSdanielk1977  do_test capi3-7.1 {
720bb8a279eSdrh    set_file_format 5
7218a41449eSdanielk1977  } {}
7228a41449eSdanielk1977  do_test capi3-7.2 {
723cb354603Sdan    catch { sqlite3 db test.db }
7248a41449eSdanielk1977    catchsql {
7258a41449eSdanielk1977      SELECT * FROM sqlite_master;
7268a41449eSdanielk1977    }
7278a41449eSdanielk1977  } {1 {unsupported file format}}
72825d6543dSdrh  db close
72925d6543dSdrh}
7308a41449eSdanielk1977
73125d6543dSdrhif {![sqlite3 -has-codec]} {
732312d6b36Sdanielk1977  # Now test that the library correctly handles bogus entries in the
733312d6b36Sdanielk1977  # sqlite_master table (schema corruption).
734312d6b36Sdanielk1977  do_test capi3-8.1 {
735fda06befSmistachkin    forcedelete test.db test.db-journal
736312d6b36Sdanielk1977    sqlite3 db test.db
737312d6b36Sdanielk1977    execsql {
738312d6b36Sdanielk1977      CREATE TABLE t1(a);
739312d6b36Sdanielk1977    }
740312d6b36Sdanielk1977    db close
741312d6b36Sdanielk1977  } {}
742312d6b36Sdanielk1977  do_test capi3-8.2 {
743bb8a279eSdrh    sqlite3 db test.db
744*6ab91a7aSdrh    sqlite3_db_config db DEFENSIVE 0
745bb8a279eSdrh    execsql {
746bb8a279eSdrh      PRAGMA writable_schema=ON;
747bb8a279eSdrh      INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
748bb8a279eSdrh    }
749bb8a279eSdrh    db close
750312d6b36Sdanielk1977  } {}
751312d6b36Sdanielk1977  do_test capi3-8.3 {
752cb354603Sdan    catch { sqlite3 db test.db }
753312d6b36Sdanielk1977    catchsql {
754312d6b36Sdanielk1977      SELECT * FROM sqlite_master;
755312d6b36Sdanielk1977    }
75634533150Sdrh  } {1 {malformed database schema (?)}}
757312d6b36Sdanielk1977  do_test capi3-8.4 {
758312d6b36Sdanielk1977    # Build a 5-field row record. The first field is a string 'table', and
759bb8a279eSdrh    # subsequent fields are all NULL.
760bb8a279eSdrh    db close
761fda06befSmistachkin    forcedelete test.db test.db-journal
762bb8a279eSdrh    sqlite3 db test.db
763*6ab91a7aSdrh    sqlite3_db_config db DEFENSIVE 0
764bb8a279eSdrh    execsql {
765bb8a279eSdrh      CREATE TABLE t1(a);
766bb8a279eSdrh      PRAGMA writable_schema=ON;
767bb8a279eSdrh      INSERT INTO sqlite_master VALUES('table',NULL,NULL,NULL,NULL);
76893cd0395Sdanielk1977    }
769bb8a279eSdrh    db close
77092f02c31Sdrh  } {};
771312d6b36Sdanielk1977  do_test capi3-8.5 {
772cb354603Sdan    catch { sqlite3 db test.db }
773312d6b36Sdanielk1977    catchsql {
774312d6b36Sdanielk1977      SELECT * FROM sqlite_master;
775312d6b36Sdanielk1977    }
77634533150Sdrh  } {1 {malformed database schema (?)}}
777312d6b36Sdanielk1977  db close
77825d6543dSdrh}
779fda06befSmistachkinforcedelete test.db
780fda06befSmistachkinforcedelete test.db-journal
78125d6543dSdrh
782312d6b36Sdanielk1977
783312d6b36Sdanielk1977# Test the english language string equivalents for sqlite error codes
784312d6b36Sdanielk1977set code2english [list \
785312d6b36Sdanielk1977SQLITE_OK         {not an error} \
786a690ff36SdrhSQLITE_ERROR      {SQL logic error} \
787312d6b36Sdanielk1977SQLITE_PERM       {access permission denied} \
788ff4fa772SdrhSQLITE_ABORT      {query aborted} \
789312d6b36Sdanielk1977SQLITE_BUSY       {database is locked} \
790312d6b36Sdanielk1977SQLITE_LOCKED     {database table is locked} \
791312d6b36Sdanielk1977SQLITE_NOMEM      {out of memory} \
792312d6b36Sdanielk1977SQLITE_READONLY   {attempt to write a readonly database} \
793312d6b36Sdanielk1977SQLITE_INTERRUPT  {interrupted} \
794312d6b36Sdanielk1977SQLITE_IOERR      {disk I/O error} \
795312d6b36Sdanielk1977SQLITE_CORRUPT    {database disk image is malformed} \
7962db0bbc2SdrhSQLITE_FULL       {database or disk is full} \
797312d6b36Sdanielk1977SQLITE_CANTOPEN   {unable to open database file} \
798312d6b36Sdanielk1977SQLITE_SCHEMA     {database schema has changed} \
799312d6b36Sdanielk1977SQLITE_CONSTRAINT {constraint failed} \
800312d6b36Sdanielk1977SQLITE_MISMATCH   {datatype mismatch} \
801ff4fa772SdrhSQLITE_MISUSE     {bad parameter or other API misuse} \
802312d6b36Sdanielk1977SQLITE_AUTH       {authorization denied} \
803ff4fa772SdrhSQLITE_RANGE      {column index out of range} \
804ff4fa772SdrhSQLITE_NOTADB     {file is not a database} \
805312d6b36Sdanielk1977unknownerror      {unknown error} \
806312d6b36Sdanielk1977]
807312d6b36Sdanielk1977
808312d6b36Sdanielk1977set test_number 1
809312d6b36Sdanielk1977foreach {code english} $code2english {
810312d6b36Sdanielk1977  do_test capi3-9.$test_number "sqlite3_test_errstr $code" $english
811312d6b36Sdanielk1977  incr test_number
812312d6b36Sdanielk1977}
813312d6b36Sdanielk1977
814312d6b36Sdanielk1977# Test the error message when a "real" out of memory occurs.
815a879342bSdanif { [permutation] != "nofaultsim" } {
816312d6b36Sdanielk1977  do_test capi3-10-1 {
817dddca286Sdrh    sqlite3 db test.db
818dddca286Sdrh    set DB [sqlite3_connection_pointer db]
819107b25f1Sdrh    sqlite3_memdebug_fail 1
820312d6b36Sdanielk1977    catchsql {
821312d6b36Sdanielk1977      select * from sqlite_master;
822312d6b36Sdanielk1977    }
823312d6b36Sdanielk1977  } {1 {out of memory}}
824312d6b36Sdanielk1977  do_test capi3-10-2 {
825312d6b36Sdanielk1977    sqlite3_errmsg $::DB
826312d6b36Sdanielk1977  } {out of memory}
8275436dc2dSdrh  ifcapable {utf16} {
828312d6b36Sdanielk1977    do_test capi3-10-3 {
829312d6b36Sdanielk1977      utf8 [sqlite3_errmsg16 $::DB]
830312d6b36Sdanielk1977    } {out of memory}
8315436dc2dSdrh  }
832312d6b36Sdanielk1977  db close
833a1644fd8Sdanielk1977  sqlite3_memdebug_fail -1
83452fd7beaSdrh  do_test capi3-10-4 {
83552fd7beaSdrh    sqlite3 db test.db
83652fd7beaSdrh    set DB [sqlite3_connection_pointer db]
83752fd7beaSdrh    sqlite3_memdebug_fail 1
83852fd7beaSdrh    catchsql {
83952fd7beaSdrh      select * from sqlite_master where rowid>5;
84052fd7beaSdrh    }
84152fd7beaSdrh  } {1 {out of memory}}
84252fd7beaSdrh  do_test capi3-10-5 {
84352fd7beaSdrh    sqlite3_errmsg $::DB
84452fd7beaSdrh  } {out of memory}
84552fd7beaSdrh  ifcapable {utf16} {
84652fd7beaSdrh    do_test capi3-10-6 {
84752fd7beaSdrh      utf8 [sqlite3_errmsg16 $::DB]
84852fd7beaSdrh    } {out of memory}
84952fd7beaSdrh  }
85052fd7beaSdrh  db close
85152fd7beaSdrh  sqlite3_memdebug_fail -1
8527939aa87Sdanielk1977}
853312d6b36Sdanielk1977
85446c43eddSdanielk1977# The following tests - capi3-11.* - test that a COMMIT or ROLLBACK
85546c43eddSdanielk1977# statement issued while there are still outstanding VMs that are part of
85646c43eddSdanielk1977# the transaction fails.
857dddca286Sdrhsqlite3 db test.db
858dddca286Sdrhset DB [sqlite3_connection_pointer db]
85946c43eddSdanielk1977sqlite_register_test_function $DB func
86046c43eddSdanielk1977do_test capi3-11.1 {
86146c43eddSdanielk1977  execsql {
86246c43eddSdanielk1977    BEGIN;
86346c43eddSdanielk1977    CREATE TABLE t1(a, b);
86446c43eddSdanielk1977    INSERT INTO t1 VALUES(1, 'int');
86546c43eddSdanielk1977    INSERT INTO t1 VALUES(2, 'notatype');
86646c43eddSdanielk1977  }
86746c43eddSdanielk1977} {}
8683e1d8e63Sdrhdo_test capi3-11.1.1 {
8693e1d8e63Sdrh  sqlite3_get_autocommit $DB
8703e1d8e63Sdrh} 0
87146c43eddSdanielk1977do_test capi3-11.2 {
87246c43eddSdanielk1977  set STMT [sqlite3_prepare $DB "SELECT func(b, a) FROM t1" -1 TAIL]
87346c43eddSdanielk1977  sqlite3_step $STMT
87446c43eddSdanielk1977} {SQLITE_ROW}
875ad4a4b80Sdrh
876ad4a4b80Sdrh# As of 3.6.5 a COMMIT is OK during while a query is still running -
877ad4a4b80Sdrh# as long as it is a read-only query and not an incremental BLOB write.
878ad4a4b80Sdrh#
87999dfe5ebSdrhdo_test capi3-11.3.1 {
88046c43eddSdanielk1977  catchsql {
88146c43eddSdanielk1977    COMMIT;
88246c43eddSdanielk1977  }
883ad4a4b80Sdrh} {0 {}}
88499dfe5ebSdrhdo_test capi3-11.3.2 {
88599dfe5ebSdrh  sqlite3_extended_errcode $DB
886ad4a4b80Sdrh} {SQLITE_OK}
88799dfe5ebSdrhdo_test capi3-11.3.3 {
8883e1d8e63Sdrh  sqlite3_get_autocommit $DB
889ad4a4b80Sdrh} 1
890ad4a4b80Sdrhdo_test capi3-11.3.4 {
891ad4a4b80Sdrh  db eval {PRAGMA lock_status}
892ad4a4b80Sdrh} {main shared temp closed}
893ad4a4b80Sdrh
89446c43eddSdanielk1977do_test capi3-11.4 {
89546c43eddSdanielk1977  sqlite3_step $STMT
89646c43eddSdanielk1977} {SQLITE_ERROR}
89746c43eddSdanielk1977do_test capi3-11.5 {
89846c43eddSdanielk1977  sqlite3_finalize $STMT
89946c43eddSdanielk1977} {SQLITE_ERROR}
90046c43eddSdanielk1977do_test capi3-11.6 {
90146c43eddSdanielk1977  catchsql {
90246c43eddSdanielk1977    SELECT * FROM t1;
90346c43eddSdanielk1977  }
90446c43eddSdanielk1977} {0 {1 int 2 notatype}}
90546c43eddSdanielk1977do_test capi3-11.7 {
9063e1d8e63Sdrh  sqlite3_get_autocommit $DB
9073e1d8e63Sdrh} 1
90846c43eddSdanielk1977do_test capi3-11.8 {
90946c43eddSdanielk1977  execsql {
91046c43eddSdanielk1977    CREATE TABLE t2(a);
91146c43eddSdanielk1977    INSERT INTO t2 VALUES(1);
91246c43eddSdanielk1977    INSERT INTO t2 VALUES(2);
91346c43eddSdanielk1977    BEGIN;
91446c43eddSdanielk1977    INSERT INTO t2 VALUES(3);
91546c43eddSdanielk1977  }
91646c43eddSdanielk1977} {}
9173e1d8e63Sdrhdo_test capi3-11.8.1 {
9183e1d8e63Sdrh  sqlite3_get_autocommit $DB
9193e1d8e63Sdrh} 0
92046c43eddSdanielk1977do_test capi3-11.9 {
92146c43eddSdanielk1977  set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
92246c43eddSdanielk1977  sqlite3_step $STMT
92346c43eddSdanielk1977} {SQLITE_ROW}
9243e1d8e63Sdrhdo_test capi3-11.9.1 {
9253e1d8e63Sdrh  sqlite3_get_autocommit $DB
9263e1d8e63Sdrh} 0
9273e1d8e63Sdrhdo_test capi3-11.9.2 {
92846c43eddSdanielk1977  catchsql {
92946c43eddSdanielk1977    ROLLBACK;
93046c43eddSdanielk1977  }
9310f198a74Sdrh} {0 {}}
9323e1d8e63Sdrhdo_test capi3-11.9.3 {
9333e1d8e63Sdrh  sqlite3_get_autocommit $DB
9340f198a74Sdrh} 1
93546c43eddSdanielk1977do_test capi3-11.10 {
93646c43eddSdanielk1977  sqlite3_step $STMT
93747b7fc78Sdrh} {SQLITE_ROW}
93846c43eddSdanielk1977do_test capi3-11.11 {
93946c43eddSdanielk1977  sqlite3_step $STMT
94047b7fc78Sdrh} {SQLITE_DONE}
941231ee688Sdanifcapable !autoreset {
942108e5a9aSdrh  do_test capi3-11.12armor {
943108e5a9aSdrh    sqlite3_step $STMT
944108e5a9aSdrh    sqlite3_step $STMT
945108e5a9aSdrh  } {SQLITE_MISUSE}
946108e5a9aSdrh} else {
94746c43eddSdanielk1977  do_test capi3-11.12 {
94846c43eddSdanielk1977    sqlite3_step $STMT
9490f198a74Sdrh    sqlite3_step $STMT
95047b7fc78Sdrh  } {SQLITE_ROW}
951108e5a9aSdrh}
95246c43eddSdanielk1977do_test capi3-11.13 {
95346c43eddSdanielk1977  sqlite3_finalize $STMT
95446c43eddSdanielk1977} {SQLITE_OK}
95546c43eddSdanielk1977do_test capi3-11.14 {
95646c43eddSdanielk1977  execsql {
95746c43eddSdanielk1977    SELECT a FROM t2;
95846c43eddSdanielk1977  }
9590f198a74Sdrh} {1 2}
9603e1d8e63Sdrhdo_test capi3-11.14.1 {
9613e1d8e63Sdrh  sqlite3_get_autocommit $DB
9620f198a74Sdrh} 1
96346c43eddSdanielk1977do_test capi3-11.15 {
96446c43eddSdanielk1977  catchsql {
96546c43eddSdanielk1977    ROLLBACK;
96646c43eddSdanielk1977  }
9670f198a74Sdrh} {1 {cannot rollback - no transaction is active}}
9683e1d8e63Sdrhdo_test capi3-11.15.1 {
9693e1d8e63Sdrh  sqlite3_get_autocommit $DB
9703e1d8e63Sdrh} 1
97146c43eddSdanielk1977do_test capi3-11.16 {
97246c43eddSdanielk1977  execsql {
97346c43eddSdanielk1977    SELECT a FROM t2;
97446c43eddSdanielk1977  }
97546c43eddSdanielk1977} {1 2}
97646c43eddSdanielk1977
97746c43eddSdanielk1977# Sanity check on the definition of 'outstanding VM'. This means any VM
97846c43eddSdanielk1977# that has had sqlite3_step() called more recently than sqlite3_finalize() or
97946c43eddSdanielk1977# sqlite3_reset(). So a VM that has just been prepared or reset does not
98046c43eddSdanielk1977# count as an active VM.
98146c43eddSdanielk1977do_test capi3-11.17 {
98246c43eddSdanielk1977  execsql {
98346c43eddSdanielk1977    BEGIN;
98446c43eddSdanielk1977  }
98546c43eddSdanielk1977} {}
98646c43eddSdanielk1977do_test capi3-11.18 {
98746c43eddSdanielk1977  set STMT [sqlite3_prepare $DB "SELECT a FROM t1" -1 TAIL]
98846c43eddSdanielk1977  catchsql {
98946c43eddSdanielk1977    COMMIT;
99046c43eddSdanielk1977  }
99146c43eddSdanielk1977} {0 {}}
99246c43eddSdanielk1977do_test capi3-11.19 {
99346c43eddSdanielk1977  sqlite3_step $STMT
99446c43eddSdanielk1977} {SQLITE_ROW}
99546c43eddSdanielk1977do_test capi3-11.20 {
99646c43eddSdanielk1977  catchsql {
99746c43eddSdanielk1977    BEGIN;
99846c43eddSdanielk1977    COMMIT;
99946c43eddSdanielk1977  }
1000ad4a4b80Sdrh} {0 {}}
100146c43eddSdanielk1977do_test capi3-11.20 {
100246c43eddSdanielk1977  sqlite3_reset $STMT
100346c43eddSdanielk1977  catchsql {
100446c43eddSdanielk1977    COMMIT;
100546c43eddSdanielk1977  }
1006ad4a4b80Sdrh} {1 {cannot commit - no transaction is active}}
100746c43eddSdanielk1977do_test capi3-11.21 {
100846c43eddSdanielk1977  sqlite3_finalize $STMT
100946c43eddSdanielk1977} {SQLITE_OK}
101046c43eddSdanielk1977
101185b623f2Sdrh# The following tests - capi3-12.* - check that its Ok to start a
101285b623f2Sdrh# transaction while other VMs are active, and that its Ok to execute
1013980b1a74Sdrh# atomic updates in the same situation
1014980b1a74Sdrh#
101546c43eddSdanielk1977do_test capi3-12.1 {
101646c43eddSdanielk1977  set STMT [sqlite3_prepare $DB "SELECT a FROM t2" -1 TAIL]
101746c43eddSdanielk1977  sqlite3_step $STMT
101846c43eddSdanielk1977} {SQLITE_ROW}
101946c43eddSdanielk1977do_test capi3-12.2 {
102046c43eddSdanielk1977  catchsql {
102146c43eddSdanielk1977    INSERT INTO t1 VALUES(3, NULL);
102246c43eddSdanielk1977  }
102346c43eddSdanielk1977} {0 {}}
102446c43eddSdanielk1977do_test capi3-12.3 {
102546c43eddSdanielk1977  catchsql {
102646c43eddSdanielk1977    INSERT INTO t2 VALUES(4);
102746c43eddSdanielk1977  }
1028980b1a74Sdrh} {0 {}}
102946c43eddSdanielk1977do_test capi3-12.4 {
103046c43eddSdanielk1977  catchsql {
103146c43eddSdanielk1977    BEGIN;
103246c43eddSdanielk1977    INSERT INTO t1 VALUES(4, NULL);
103346c43eddSdanielk1977  }
103446c43eddSdanielk1977} {0 {}}
103546c43eddSdanielk1977do_test capi3-12.5 {
103646c43eddSdanielk1977  sqlite3_step $STMT
103746c43eddSdanielk1977} {SQLITE_ROW}
1038980b1a74Sdrhdo_test capi3-12.5.1 {
1039980b1a74Sdrh  sqlite3_step $STMT
1040980b1a74Sdrh} {SQLITE_ROW}
104146c43eddSdanielk1977do_test capi3-12.6 {
104246c43eddSdanielk1977  sqlite3_step $STMT
1043ed326d70Sdanielk1977} {SQLITE_DONE}
104412b13002Sdanielk1977do_test capi3-12.7 {
104546c43eddSdanielk1977  sqlite3_finalize $STMT
104646c43eddSdanielk1977} {SQLITE_OK}
104712b13002Sdanielk1977do_test capi3-12.8 {
104846c43eddSdanielk1977  execsql {
104946c43eddSdanielk1977    COMMIT;
105046c43eddSdanielk1977    SELECT a FROM t1;
105146c43eddSdanielk1977  }
105246c43eddSdanielk1977} {1 2 3 4}
105346c43eddSdanielk1977
1054600dd0baSdanielk1977# Test cases capi3-13.* test the sqlite3_clear_bindings() and
1055600dd0baSdanielk1977# sqlite3_sleep APIs.
1056600dd0baSdanielk1977#
1057600dd0baSdanielk1977if {[llength [info commands sqlite3_clear_bindings]]>0} {
1058600dd0baSdanielk1977  do_test capi3-13.1 {
1059600dd0baSdanielk1977    execsql {
1060600dd0baSdanielk1977      DELETE FROM t1;
1061600dd0baSdanielk1977    }
1062600dd0baSdanielk1977    set STMT [sqlite3_prepare $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL]
1063600dd0baSdanielk1977    sqlite3_step $STMT
1064600dd0baSdanielk1977  } {SQLITE_DONE}
1065600dd0baSdanielk1977  do_test capi3-13.2 {
1066600dd0baSdanielk1977    sqlite3_reset $STMT
1067600dd0baSdanielk1977    sqlite3_bind_text $STMT 1 hello 5
1068600dd0baSdanielk1977    sqlite3_bind_text $STMT 2 world 5
1069600dd0baSdanielk1977    sqlite3_step $STMT
1070600dd0baSdanielk1977  } {SQLITE_DONE}
1071600dd0baSdanielk1977  do_test capi3-13.3 {
1072600dd0baSdanielk1977    sqlite3_reset $STMT
1073600dd0baSdanielk1977    sqlite3_clear_bindings $STMT
1074600dd0baSdanielk1977    sqlite3_step $STMT
1075600dd0baSdanielk1977  } {SQLITE_DONE}
1076600dd0baSdanielk1977  do_test capi3-13-4 {
1077600dd0baSdanielk1977    sqlite3_finalize $STMT
1078600dd0baSdanielk1977    execsql {
1079600dd0baSdanielk1977      SELECT * FROM t1;
1080600dd0baSdanielk1977    }
1081600dd0baSdanielk1977  } {{} {} hello world {} {}}
1082600dd0baSdanielk1977}
1083600dd0baSdanielk1977if {[llength [info commands sqlite3_sleep]]>0} {
1084600dd0baSdanielk1977  do_test capi3-13-5 {
1085600dd0baSdanielk1977    set ms [sqlite3_sleep 80]
1086600dd0baSdanielk1977    expr {$ms==80 || $ms==1000}
1087600dd0baSdanielk1977  } {1}
1088600dd0baSdanielk1977}
1089600dd0baSdanielk1977
1090473d179dSdrh# Ticket #1219:  Make sure binding APIs can handle a NULL pointer.
1091473d179dSdrh#
1092afcf9bd8Sdanif {[clang_sanitize_address]==0} {
1093dddb2f23Sdrh  do_test capi3-14.1-misuse {
1094473d179dSdrh    set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
1095473d179dSdrh      lappend rc $msg
1096473d179dSdrh  } {1 SQLITE_MISUSE}
1097afcf9bd8Sdan}
1098473d179dSdrh
10999051a420Sdrh# Ticket #1650:  Honor the nBytes parameter to sqlite3_prepare.
11009051a420Sdrh#
11019051a420Sdrhdo_test capi3-15.1 {
11029051a420Sdrh  set sql {SELECT * FROM t2}
11039051a420Sdrh  set nbytes [string length $sql]
11049051a420Sdrh  append sql { WHERE a==1}
11059051a420Sdrh  set STMT [sqlite3_prepare $DB $sql $nbytes TAIL]
11069051a420Sdrh  sqlite3_step $STMT
11079051a420Sdrh  sqlite3_column_int $STMT 0
11089051a420Sdrh} {1}
11099051a420Sdrhdo_test capi3-15.2 {
11109051a420Sdrh  sqlite3_step $STMT
11119051a420Sdrh  sqlite3_column_int $STMT 0
11129051a420Sdrh} {2}
11139051a420Sdrhdo_test capi3-15.3 {
11149051a420Sdrh  sqlite3_finalize $STMT
11159051a420Sdrh} {SQLITE_OK}
11160cf19ed8Sdrhdo_test capi3-15.4 {
11170cf19ed8Sdrh  #        123456789 1234567
11180cf19ed8Sdrh  set sql {SELECT 1234567890}
11190cf19ed8Sdrh  set STMT [sqlite3_prepare $DB $sql 8 TAIL]
11200cf19ed8Sdrh  sqlite3_step $STMT
11210cf19ed8Sdrh  set v1 [sqlite3_column_int $STMT 0]
11220cf19ed8Sdrh  sqlite3_finalize $STMT
11230cf19ed8Sdrh  set v1
11240cf19ed8Sdrh} {1}
11250cf19ed8Sdrhdo_test capi3-15.5 {
11260cf19ed8Sdrh  #        123456789 1234567
11270cf19ed8Sdrh  set sql {SELECT 1234567890}
11280cf19ed8Sdrh  set STMT [sqlite3_prepare $DB $sql 9 TAIL]
11290cf19ed8Sdrh  sqlite3_step $STMT
11300cf19ed8Sdrh  set v1 [sqlite3_column_int $STMT 0]
11310cf19ed8Sdrh  sqlite3_finalize $STMT
11320cf19ed8Sdrh  set v1
11330cf19ed8Sdrh} {12}
11340cf19ed8Sdrhdo_test capi3-15.6 {
11350cf19ed8Sdrh  #        123456789 1234567
11360cf19ed8Sdrh  set sql {SELECT 1234567890}
11370cf19ed8Sdrh  set STMT [sqlite3_prepare $DB $sql 12 TAIL]
11380cf19ed8Sdrh  sqlite3_step $STMT
11390cf19ed8Sdrh  set v1 [sqlite3_column_int $STMT 0]
11400cf19ed8Sdrh  sqlite3_finalize $STMT
11410cf19ed8Sdrh  set v1
11420cf19ed8Sdrh} {12345}
11430cf19ed8Sdrhdo_test capi3-15.7 {
11440cf19ed8Sdrh  #        123456789 1234567
11450cf19ed8Sdrh  set sql {SELECT 12.34567890}
11460cf19ed8Sdrh  set STMT [sqlite3_prepare $DB $sql 12 TAIL]
11470cf19ed8Sdrh  sqlite3_step $STMT
11480cf19ed8Sdrh  set v1 [sqlite3_column_double $STMT 0]
11490cf19ed8Sdrh  sqlite3_finalize $STMT
11500cf19ed8Sdrh  set v1
11510cf19ed8Sdrh} {12.34}
11520cf19ed8Sdrhdo_test capi3-15.8 {
11530cf19ed8Sdrh  #        123456789 1234567
11540cf19ed8Sdrh  set sql {SELECT 12.34567890}
11550cf19ed8Sdrh  set STMT [sqlite3_prepare $DB $sql 14 TAIL]
11560cf19ed8Sdrh  sqlite3_step $STMT
11570cf19ed8Sdrh  set v1 [sqlite3_column_double $STMT 0]
11580cf19ed8Sdrh  sqlite3_finalize $STMT
11590cf19ed8Sdrh  set v1
11600cf19ed8Sdrh} {12.3456}
1161473d179dSdrh
1162e134ff1eSdrh# Make sure code is always generated even if an IF EXISTS or
1163e134ff1eSdrh# IF NOT EXISTS clause is present that the table does not or
1164e134ff1eSdrh# does exists.  That way we will always have a prepared statement
1165e134ff1eSdrh# to expire when the schema changes.
1166e134ff1eSdrh#
1167e134ff1eSdrhdo_test capi3-16.1 {
1168e134ff1eSdrh  set sql {DROP TABLE IF EXISTS t3}
1169e134ff1eSdrh  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1170e134ff1eSdrh  sqlite3_finalize $STMT
1171e134ff1eSdrh  expr {$STMT!=""}
1172e134ff1eSdrh} {1}
1173e134ff1eSdrhdo_test capi3-16.2 {
1174e134ff1eSdrh  set sql {CREATE TABLE IF NOT EXISTS t1(x,y)}
1175e134ff1eSdrh  set STMT [sqlite3_prepare $DB $sql -1 TAIL]
1176e134ff1eSdrh  sqlite3_finalize $STMT
1177e134ff1eSdrh  expr {$STMT!=""}
1178e134ff1eSdrh} {1}
1179e134ff1eSdrh
1180e134ff1eSdrh# But still we do not generate code if there is no SQL
1181e134ff1eSdrh#
1182e134ff1eSdrhdo_test capi3-16.3 {
1183e134ff1eSdrh  set STMT [sqlite3_prepare $DB {} -1 TAIL]
1184e134ff1eSdrh  sqlite3_finalize $STMT
1185e134ff1eSdrh  expr {$STMT==""}
1186e134ff1eSdrh} {1}
1187e134ff1eSdrhdo_test capi3-16.4 {
1188e134ff1eSdrh  set STMT [sqlite3_prepare $DB {;} -1 TAIL]
1189e134ff1eSdrh  sqlite3_finalize $STMT
1190e134ff1eSdrh  expr {$STMT==""}
1191e134ff1eSdrh} {1}
1192e134ff1eSdrh
1193b21f87ddSdrh# Ticket #2426:  Misuse of sqlite3_column_* by calling it after
1194b21f87ddSdrh# a sqlite3_reset should be harmless.
1195b21f87ddSdrh#
1196b21f87ddSdrhdo_test capi3-17.1 {
1197b21f87ddSdrh  set STMT [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
1198b21f87ddSdrh  sqlite3_step $STMT
1199b21f87ddSdrh  sqlite3_column_int $STMT 0
1200b21f87ddSdrh} {1}
1201b21f87ddSdrhdo_test capi3-17.2 {
1202b21f87ddSdrh  sqlite3_reset $STMT
1203b21f87ddSdrh  sqlite3_column_int $STMT 0
1204b21f87ddSdrh} {0}
1205b21f87ddSdrhdo_test capi3-17.3 {
1206b21f87ddSdrh  sqlite3_finalize $STMT
1207b21f87ddSdrh} {SQLITE_OK}
1208e134ff1eSdrh
1209c4dd3fd2Sdrh# Verify that sqlite3_step() fails with an SQLITE_SCHEMA error
1210c4dd3fd2Sdrh# when the statement is prepared with sqlite3_prepare() (not
1211c4dd3fd2Sdrh# sqlite3_prepare_v2()) and the schema has changed.
1212c4dd3fd2Sdrh#
1213c4dd3fd2Sdrhdo_test capi3-18.1 {
1214c4dd3fd2Sdrh  set STMT [sqlite3_prepare db {SELECT * FROM t2} -1 TAIL]
1215c4dd3fd2Sdrh  sqlite3 db2 test.db
1216c4dd3fd2Sdrh  db2 eval {CREATE TABLE t3(x)}
1217c4dd3fd2Sdrh  db2 close
1218c4dd3fd2Sdrh  sqlite3_step $STMT
1219c4dd3fd2Sdrh} {SQLITE_ERROR}
1220c4dd3fd2Sdrhdo_test capi3-18.2 {
1221c4dd3fd2Sdrh  sqlite3_reset $STMT
1222c4dd3fd2Sdrh  sqlite3_errcode db
1223c4dd3fd2Sdrh} {SQLITE_SCHEMA}
1224c4dd3fd2Sdrhdo_test capi3-18.3 {
1225c4dd3fd2Sdrh  sqlite3_errmsg db
1226c4dd3fd2Sdrh} {database schema has changed}
1227c4dd3fd2Sdrh# The error persist on retry when sqlite3_prepare() has been used.
1228c4dd3fd2Sdrhdo_test capi3-18.4 {
1229c4dd3fd2Sdrh  sqlite3_step $STMT
1230c4dd3fd2Sdrh} {SQLITE_ERROR}
1231c4dd3fd2Sdrhdo_test capi3-18.5 {
1232c4dd3fd2Sdrh  sqlite3_reset $STMT
1233c4dd3fd2Sdrh  sqlite3_errcode db
1234c4dd3fd2Sdrh} {SQLITE_SCHEMA}
1235c4dd3fd2Sdrhdo_test capi3-18.6 {
1236c4dd3fd2Sdrh  sqlite3_errmsg db
1237c4dd3fd2Sdrh} {database schema has changed}
1238c4dd3fd2Sdrhsqlite3_finalize $STMT
1239c4dd3fd2Sdrh
12404837f531Sdrh# Ticket #3134.  Prepare a statement with an nBytes parameter of 0.
12414837f531Sdrh# Make sure this works correctly and does not reference memory out of
12424837f531Sdrh# range.
12434837f531Sdrh#
12444837f531Sdrhdo_test capi3-19.1 {
12454837f531Sdrh  sqlite3_prepare_tkt3134 db
12464837f531Sdrh} {}
1247c4dd3fd2Sdrh
124814965665Sdan# Test that calling sqlite3_column_blob() on a TEXT value does not change
124914965665Sdan# the return type of subsequent calls to sqlite3_column_type().
125014965665Sdan#
125114965665Sdando_execsql_test 20.1 {
125214965665Sdan  CREATE TABLE t4(x);
125314965665Sdan  INSERT INTO t4 VALUES('abcdefghij');
125414965665Sdan}
125514965665Sdando_test 20.2 {
125614965665Sdan  set stmt [sqlite3_prepare db "SELECT * FROM t4" -1 dummy]
125714965665Sdan  sqlite3_step $stmt
125814965665Sdan} {SQLITE_ROW}
125914965665Sdando_test 20.3 { sqlite3_column_type $stmt 0 } {TEXT}
126014965665Sdando_test 20.4 { sqlite3_column_blob $stmt 0 } {abcdefghij}
126114965665Sdando_test 20.5 { sqlite3_column_type $stmt 0 } {TEXT}
126214965665Sdando_test 20.6 { sqlite3_finalize $stmt } SQLITE_OK
126314965665Sdan
126414965665Sdan
1265a2820970Sdrh# Tests of the interface when no VFS is registered.
1266a2820970Sdrh#
1267185eac95Sdanielk1977if {![info exists tester_do_binarylog]} {
1268a2820970Sdrh  db close
1269a2820970Sdrh  vfs_unregister_all
1270a2820970Sdrh  do_test capi3-20.1 {
1271a2820970Sdrh    sqlite3_sleep 100
1272a2820970Sdrh  } {0}
1273a2820970Sdrh  vfs_reregister_all
1274185eac95Sdanielk1977}
1275a2820970Sdrh
12766622cce3Sdanielk1977finish_test
1277