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