Update mojo sdk to rev 1dc8a9a5db73d3718d99917fadf31f5fb2ebad4f
[chromium-blink-merge.git] / third_party / sqlite / src / test / capi3c.test
blob6ab3bc24f6bdc5476a71f0aa2d8493cd5898cc8d
1 # 2006 November 08
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  
13 # This is a copy of the capi3.test file that has been adapted to
14 # test the new sqlite3_prepare_v2 interface.
16 # $Id: capi3c.test,v 1.23 2009/07/22 07:27:57 danielk1977 Exp $
19 set testdir [file dirname $argv0]
20 source $testdir/tester.tcl
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).
25 do_not_use_codec
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.
29 proc utf16 {str {nt 1}} {
30   set r [encoding convertto unicode $str]
31   if {$nt} {
32     append r "\x00\x00"
33   }
34   return $r
37 # Return the UTF-8 representation of the supplied UTF-16 string $str. 
38 proc 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   }
46   set r [encoding convertfrom unicode $str]
47   return $r
50 # These tests complement those in capi2.test. They are organized
51 # as follows:
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.
61 set DB [sqlite3_connection_pointer db]
63 do_test capi3c-1.0 {
64   sqlite3_get_autocommit $DB
65 } 1
66 do_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 } {}
71 do_test capi3c-1.2.1 {
72   sqlite3_errcode $DB
73 } {SQLITE_OK}
74 do_test capi3c-1.2.2 {
75   sqlite3_extended_errcode $DB
76 } {SQLITE_OK}
77 do_test capi3c-1.3 {
78   sqlite3_errmsg $DB
79 } {not an error}
80 do_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}
86 do_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}
92 do_test capi3c-1.6.1 {
93   sqlite3_errcode $DB
94 } {SQLITE_ERROR}
95 do_test capi3c-1.6.2 {
96   sqlite3_extended_errcode $DB
97 } {SQLITE_ERROR}
98 do_test capi3c-1.7 {
99   sqlite3_errmsg $DB
100 } {no such column: namex}
103 ifcapable {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}
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   }
147 } ;# endif utf16
149 # rename sqlite3_open sqlite3_open_old
150 # proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
152 do_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.
157 do_test capi3c-3.2 {
158   sqlite3_close $db2
159 } {SQLITE_OK}
160 do_test capi3c-3.3 {
161   catch {
162     set db2 [sqlite3_open /bogus/path/test.db {}]
163   }
164   sqlite3_errcode $db2
165 } {SQLITE_CANTOPEN}
166 do_test capi3c-3.4 {
167   sqlite3_errmsg $db2
168 } {unable to open database file}
169 do_test capi3c-3.5 {
170   sqlite3_close $db2
171 } {SQLITE_OK}
172 if {[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   }
186 # rename sqlite3_open ""
187 # rename sqlite3_open_old sqlite3_open
189 ifcapable {utf16} {
190 do_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.
195 do_test capi3c-4.2 {
196   sqlite3_close $db2
197 } {SQLITE_OK}
198 do_test capi3c-4.3 {
199   catch {
200     set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
201   }
202   sqlite3_errcode $db2
203 } {SQLITE_CANTOPEN}
204 do_test capi3c-4.4 {
205   utf8 [sqlite3_errmsg16 $db2]
206 } {unable to open database file}
207 do_test capi3c-4.5 {
208   sqlite3_close $db2
209 } {SQLITE_OK}
210 } ;# utf16
212 # This proc is used to test the following API calls:
214 # sqlite3_column_count
215 # sqlite3_column_name
216 # sqlite3_column_name16
217 # sqlite3_column_decltype
218 # sqlite3_column_decltype16
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.
225 # Example:
227 # set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY]
228 # check_header test1.1 {1 2 3} {"" "" ""}
230 proc check_header {STMT test names decltypes} {
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}
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
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   }
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
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   }
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
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   }
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   }
310 # This proc is used to test the following API calls:
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
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.
324 # Example:
326 # set STMT [sqlite3_prepare_v2 "SELECT 1, 2, 2;" -1 DUMMY]
327 # check_header test1.1 {1 2 3} {"" "" ""}
329 proc 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.
332 ifcapable columnmetadata {
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   }
403 # This proc is used to test the following APIs:
405 # sqlite3_data_count
406 # sqlite3_column_type
407 # sqlite3_column_int
408 # sqlite3_column_text
409 # sqlite3_column_text16
410 # sqlite3_column_double
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.
419 # Example:
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 {}}
425 proc check_data {STMT test types ints doubles strings} {
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}
434 # types
435 do_test $test.1 {
436   set types [list]
437   foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
438   set types
439 } $types
441 # Integers
442 do_test $test.2 {
443   set ints [list]
444   foreach i $idxlist {lappend ints [sqlite3_column_int64 $STMT $i]}
445   set ints
446 } $ints
448 # bytes
449 set lens [list]
450 foreach i $::idxlist {
451   lappend lens [string length [lindex $strings $i]]
453 do_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
462 # bytes16
463 ifcapable {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
478 # Blob
479 do_test $test.5 {
480   set utf8 [list]
481   foreach i $idxlist {lappend utf8 [sqlite3_column_blob $STMT $i]}
482   set utf8
483 } $strings
485 # UTF-8
486 do_test $test.6 {
487   set utf8 [list]
488   foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
489   set utf8
490 } $strings
492 # Floats
493 do_test $test.7 {
494   set utf8 [list]
495   foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
496   set utf8
497 } $doubles
499 # UTF-16
500 ifcapable {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
508 # Integers
509 do_test $test.9 {
510   set ints [list]
511   foreach i $idxlist {lappend ints [sqlite3_column_int $STMT $i]}
512   set ints
513 } $ints
515 # Floats
516 do_test $test.10 {
517   set utf8 [list]
518   foreach i $idxlist {lappend utf8 [sqlite3_column_double $STMT $i]}
519   set utf8
520 } $doubles
522 # UTF-8
523 do_test $test.11 {
524   set utf8 [list]
525   foreach i $idxlist {lappend utf8 [sqlite3_column_text $STMT $i]}
526   set utf8
527 } $strings
529 # Types
530 do_test $test.12 {
531   set types [list]
532   foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]}
533   set types
534 } $types
536 # Test that an out of range request returns the equivalent of NULL
537 do_test $test.13 {
538   sqlite3_column_int $STMT -1
539 } {0}
540 do_test $test.13 {
541   sqlite3_column_text $STMT -1
542 } {}
546 ifcapable !floatingpoint {
547   finish_test
548   return
551 do_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
563 check_header $STMT capi3c-5.1 {a b c} {VARINT BLOB VARCHAR(16)}
564 check_origin_header $STMT capi3c-5.1 {main main main} {t1 t1 t1} {a b c}
565 do_test capi3c-5.2 {
566   sqlite3_step $STMT
567 } SQLITE_ROW
569 check_header $STMT capi3c-5.3 {a b c} {VARINT BLOB VARCHAR(16)}
570 check_origin_header $STMT capi3c-5.3 {main main main} {t1 t1 t1} {a b c}
571 check_data $STMT capi3c-5.4 {INTEGER INTEGER TEXT} {1 2 3} {1.0 2.0 3.0} {1 2 3}
573 do_test capi3c-5.5 {
574   sqlite3_step $STMT
575 } SQLITE_ROW
577 check_header $STMT capi3c-5.6 {a b c} {VARINT BLOB VARCHAR(16)}
578 check_origin_header $STMT capi3c-5.6 {main main main} {t1 t1 t1} {a b c}
579 check_data $STMT capi3c-5.7 {TEXT TEXT NULL} {0 0 0} {0.0 0.0 0.0} {one two {}}
581 do_test capi3c-5.8 {
582   sqlite3_step $STMT
583 } SQLITE_ROW
585 check_header $STMT capi3c-5.9 {a b c} {VARINT BLOB VARCHAR(16)}
586 check_origin_header $STMT capi3c-5.9 {main main main} {t1 t1 t1} {a b c}
587 check_data $STMT capi3c-5.10 {FLOAT FLOAT TEXT} {1 1 1} {1.2 1.3 1.4} {1.2 1.3 1.4}
589 do_test capi3c-5.11 {
590   sqlite3_step $STMT
591 } SQLITE_DONE
593 do_test capi3c-5.12 {
594   sqlite3_finalize $STMT
595 } SQLITE_OK
597 do_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
603 check_header $STMT capi3c-5.21 {a sum(b) max(c)} {VARINT {} {}}
604 check_origin_header $STMT capi3c-5.22 {main {} {}} {t1 {} {}} {a {} {}}
605 do_test capi3c-5.23 {
606   sqlite3_finalize $STMT
607 } SQLITE_OK
610 set ::ENC [execsql {pragma encoding}]
611 db close
613 do_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}
621 do_test capi3c-6.1 {
622   db cache flush
623   sqlite3_close $DB
624 } {SQLITE_BUSY}
625 do_test capi3c-6.2 {
626   sqlite3_step $STMT
627 } {SQLITE_ROW}
628 check_data $STMT capi3c-6.3 {INTEGER} {1} {1.0} {1}
629 do_test capi3c-6.3 {
630   sqlite3_finalize $STMT
631 } {SQLITE_OK}
632 if {[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
644 # This procedure sets the value of the file-format in file 'test.db'
645 # to $newval. Also, the schema cookie is incremented.
647 proc 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 {}
655 # This procedure returns the value of the file-format in file 'test.db'.
657 proc get_file_format {{fname test.db}} {
658   return [hexio_get_int [hexio_read $fname 44 4]]
661 if {![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
675 if {![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
721 forcedelete test.db
722 forcedelete test.db-journal
725 # Test the english language string equivalents for sqlite error codes
726 set code2english [list \
727 SQLITE_OK         {not an error} \
728 SQLITE_ERROR      {SQL logic error or missing database} \
729 SQLITE_PERM       {access permission denied} \
730 SQLITE_ABORT      {callback requested query abort} \
731 SQLITE_BUSY       {database is locked} \
732 SQLITE_LOCKED     {database table is locked} \
733 SQLITE_NOMEM      {out of memory} \
734 SQLITE_READONLY   {attempt to write a readonly database} \
735 SQLITE_INTERRUPT  {interrupted} \
736 SQLITE_IOERR      {disk I/O error} \
737 SQLITE_CORRUPT    {database disk image is malformed} \
738 SQLITE_FULL       {database or disk is full} \
739 SQLITE_CANTOPEN   {unable to open database file} \
740 SQLITE_EMPTY      {table contains no data} \
741 SQLITE_SCHEMA     {database schema has changed} \
742 SQLITE_CONSTRAINT {constraint failed} \
743 SQLITE_MISMATCH   {datatype mismatch} \
744 SQLITE_MISUSE     {library routine called out of sequence} \
745 SQLITE_NOLFS      {large file support is disabled} \
746 SQLITE_AUTH       {authorization denied} \
747 SQLITE_FORMAT     {auxiliary database format error} \
748 SQLITE_RANGE      {bind or column index out of range} \
749 SQLITE_NOTADB     {file is encrypted or is not a database} \
750 unknownerror      {unknown error} \
753 set test_number 1
754 foreach {code english} $code2english {
755   do_test capi3c-9.$test_number "sqlite3_test_errstr $code" $english
756   incr test_number
759 # Test the error message when a "real" out of memory occurs.
760 if { [permutation] != "nofaultsim" } {
761 ifcapable 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
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.
786 sqlite3 db test.db
787 set DB [sqlite3_connection_pointer db]
788 sqlite_register_test_function $DB func
789 do_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 } {}
797 do_test capi3c-11.1.1 {
798   sqlite3_get_autocommit $DB
799 } 0
800 do_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}
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.
808 do_test capi3-11.3.1 {
809   catchsql {
810     COMMIT;
811   }
812 } {0 {}}
813 do_test capi3-11.3.2 {
814   sqlite3_extended_errcode $DB
815 } {SQLITE_OK}
816 do_test capi3-11.3.3 {
817   sqlite3_get_autocommit $DB
818 } 1
819 do_test capi3-11.3.4 {
820   db eval {PRAGMA lock_status}
821 } {main shared temp closed}
823 do_test capi3c-11.4 {
824   sqlite3_step $STMT
825 } {SQLITE_ERROR}
826 do_test capi3c-11.5 {
827   sqlite3_finalize $STMT
828 } {SQLITE_ERROR}
829 do_test capi3c-11.6 {
830   catchsql {
831     SELECT * FROM t1;
832   }
833 } {0 {1 int 2 notatype}}
834 do_test capi3c-11.7 {
835   sqlite3_get_autocommit $DB
836 } 1
837 do_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 } {}
846 do_test capi3c-11.8.1 {
847   sqlite3_get_autocommit $DB
848 } 0
849 do_test capi3c-11.9 {
850   set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
851   sqlite3_step $STMT
852 } {SQLITE_ROW}
853 do_test capi3c-11.9.1 {
854   sqlite3_get_autocommit $DB
855 } 0
856 do_test capi3c-11.9.2 {
857   catchsql {
858     ROLLBACK;
859   }
860 } {0 {}}
861 do_test capi3c-11.9.3 {
862   sqlite3_get_autocommit $DB
863 } 1
864 do_test capi3c-11.10 {
865   sqlite3_step $STMT
866 } {SQLITE_ROW}
867 ifcapable !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}
873 do_test capi3c-11.11 {
874   sqlite3_step $STMT
875 } {SQLITE_DONE}
876 do_test capi3c-11.12 {
877   sqlite3_step $STMT
878   sqlite3_step $STMT
879 } {SQLITE_ROW}
880 do_test capi3c-11.13 {
881   sqlite3_finalize $STMT
882 } {SQLITE_OK}
883 do_test capi3c-11.14 {
884   execsql {
885     SELECT a FROM t2;
886   }
887 } {1 2}
888 do_test capi3c-11.14.1 {
889   sqlite3_get_autocommit $DB
890 } 1
891 do_test capi3c-11.15 {
892   catchsql {
893     ROLLBACK;
894   }
895 } {1 {cannot rollback - no transaction is active}}
896 do_test capi3c-11.15.1 {
897   sqlite3_get_autocommit $DB
898 } 1
899 do_test capi3c-11.16 {
900   execsql {
901     SELECT a FROM t2;
902   }
903 } {1 2}
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.
909 do_test capi3c-11.17 {
910   execsql {
911     BEGIN;
912   }
913 } {}
914 do_test capi3c-11.18 {
915   set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL]
916   catchsql {
917     COMMIT;
918   }
919 } {0 {}}
920 do_test capi3c-11.19 {
921   sqlite3_step $STMT
922 } {SQLITE_ROW}
923 do_test capi3c-11.20 {
924   catchsql {
925     BEGIN;
926     COMMIT;
927   }
928 } {0 {}}
929 do_test capi3c-11.20 {
930   sqlite3_reset $STMT
931   catchsql {
932     COMMIT;
933   }
934 } {1 {cannot commit - no transaction is active}}
935 do_test capi3c-11.21 {
936   sqlite3_finalize $STMT
937 } {SQLITE_OK}
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 
943 do_test capi3c-12.1 {
944   set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL]
945   sqlite3_step $STMT
946 } {SQLITE_ROW}
947 do_test capi3c-12.2 {
948   catchsql {
949     INSERT INTO t1 VALUES(3, NULL);
950   }
951 } {0 {}}
952 do_test capi3c-12.3 {
953   catchsql {
954     INSERT INTO t2 VALUES(4);
955   }
956 } {0 {}}
957 do_test capi3c-12.4 {
958   catchsql {
959     BEGIN;
960     INSERT INTO t1 VALUES(4, NULL);
961   }
962 } {0 {}}
963 do_test capi3c-12.5 {
964   sqlite3_step $STMT
965 } {SQLITE_ROW}
966 do_test capi3c-12.5.1 {
967   sqlite3_step $STMT
968 } {SQLITE_ROW}
969 do_test capi3c-12.6 {
970   sqlite3_step $STMT
971 } {SQLITE_DONE}
972 do_test capi3c-12.7 {
973   sqlite3_finalize $STMT
974 } {SQLITE_OK}
975 do_test capi3c-12.8 {
976   execsql {
977     COMMIT;
978     SELECT a FROM t1;
979   }
980 } {1 2 3 4}
982 # Test cases capi3c-13.* test the sqlite3_clear_bindings() and 
983 # sqlite3_sleep APIs.
985 if {[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 {} {}}
1011 if {[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}
1018 # Ticket #1219:  Make sure binding APIs can handle a NULL pointer.
1020 do_test capi3c-14.1 {
1021   set rc [catch {sqlite3_bind_text 0 1 hello 5} msg]
1022   lappend rc $msg
1023 } {1 SQLITE_MISUSE}
1025 # Ticket #1650:  Honor the nBytes parameter to sqlite3_prepare.
1027 do_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}
1035 do_test capi3c-15.2 {
1036   sqlite3_step $STMT
1037   sqlite3_column_int $STMT 0
1038 } {2}
1039 do_test capi3c-15.3 {
1040   sqlite3_finalize $STMT
1041 } {SQLITE_OK}
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.
1048 do_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}
1054 do_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}
1061 # But still we do not generate code if there is no SQL
1063 do_test capi3c-16.3 {
1064   set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL]
1065   sqlite3_finalize $STMT
1066   expr {$STMT==""}
1067 } {1}
1068 do_test capi3c-16.4 {
1069   set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL]
1070   sqlite3_finalize $STMT
1071   expr {$STMT==""}
1072 } {1}
1074 # Ticket #2154.
1076 do_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
1080 do_test capi3c-17.2 {
1081   sqlite3_column_int $STMT 0
1082 } 4
1083 do_test capi3c-17.3 {
1084   sqlite3_step $STMT
1085 } SQLITE_DONE
1086 do_test capi3c-17.4 {
1087   sqlite3_reset $STMT
1088   db eval {CREATE INDEX i2 ON t2(a)}
1089   sqlite3_step $STMT
1090 } SQLITE_ROW
1091 do_test capi3c-17.5 {
1092   sqlite3_column_int $STMT 0
1093 } 4
1094 do_test capi3c-17.6 {
1095   sqlite3_step $STMT
1096 } SQLITE_DONE
1097 do_test capi3c-17.7 {
1098   sqlite3_reset $STMT
1099   db eval {DROP INDEX i2}
1100   sqlite3_step $STMT
1101 } SQLITE_ROW
1102 do_test capi3c-17.8 {
1103   sqlite3_column_int $STMT 0
1104 } 4
1105 do_test capi3c-17.9 {
1106   sqlite3_step $STMT
1107 } SQLITE_DONE
1108 do_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
1121 do_test capi3c-17.11 {
1122   sqlite3_column_text $STMT 0
1123 } two
1124 do_test capi3c-17.12 {
1125   sqlite3_step $STMT
1126 } SQLITE_DONE
1127 do_test capi3c-17.13 {
1128   sqlite3_reset $STMT
1129   db eval {CREATE INDEX i1 ON t1(a)}
1130   sqlite3_step $STMT
1131 } SQLITE_ROW
1132 do_test capi3c-17.14 {
1133   sqlite3_column_text $STMT 0
1134 } two
1135 do_test capi3c-17.15 {
1136   sqlite3_step $STMT
1137 } SQLITE_DONE
1138 do_test capi3c-17.16 {
1139   sqlite3_reset $STMT
1140   db eval {DROP INDEX i1}
1141   sqlite3_step $STMT
1142 } SQLITE_ROW
1143 do_test capi3c-17.17 {
1144   sqlite3_column_text $STMT 0
1145 } two
1146 do_test capi3c-17.18 {
1147   sqlite3_step $STMT
1148 } SQLITE_DONE
1149 do_test capi3c-17.99 {
1150   sqlite3_finalize $STMT
1151 } SQLITE_OK
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.
1156 do_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
1161 do_test capi3c-18.2 {
1162   sqlite3_column_int $STMT 0
1163 } 4
1164 do_test capi3c-18.3 {
1165   sqlite3_reset $STMT
1166   db2 eval {BEGIN EXCLUSIVE}
1167   sqlite3_step $STMT
1168 } SQLITE_BUSY
1169 do_test capi3c-18.4 {
1170   sqlite3_finalize $STMT
1171 } SQLITE_BUSY
1172 do_test capi3c-18.5 {
1173   db2 eval {COMMIT}
1174   db2 close
1175 } {}
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.
1181 do_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
1189 do_test capi3c-19.2 {
1190   sqlite3_column_int $STMT 0
1191 } 1
1192 do_test capi3c-19.3 {
1193   sqlite3_step $STMT
1194 } SQLITE_DONE
1195 do_test capi3c-19.4 {
1196   sqlite3_reset $STMT
1197   db eval {DROP TABLE t3}
1198   sqlite3_step $STMT
1199 } SQLITE_ERROR
1200 do_test capi3c-19.4.1 {
1201   sqlite3_errmsg $DB
1202 } {no such table: t3}
1203 ifcapable deprecated {
1204   do_test capi3c-19.4.2 {
1205     sqlite3_expired $STMT
1206   } 1
1208 do_test capi3c-19.4.3 {
1209   sqlite3_errmsg $DB
1210 } {no such table: t3}
1211 ifcapable deprecated {
1212   do_test capi3c-19.4.4 {
1213     sqlite3_expired 0
1214   } 1
1216 do_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
1224 ifcapable deprecated {
1225   do_test capi3c-19.5.2 {
1226     sqlite3_expired $STMT
1227   } 0
1229 do_test capi3c-19.6 {
1230   sqlite3_column_int $STMT 1
1231 } 2
1232 do_test capi3c-19.99 {
1233   sqlite3_finalize $STMT
1234 } SQLITE_OK
1236 # Make sure a change in a separate database connection does not
1237 # cause an SQLITE_SCHEMA return.
1239 do_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
1245 do_test capi3c-20.2 {
1246   sqlite3_column_int $STMT 1
1247 } 2
1248 do_test capi3c-20.3 {
1249   sqlite3_step $STMT
1250 } SQLITE_DONE
1251 do_test capi3c-20.4 {
1252   db2 close
1253   sqlite3_finalize $STMT
1254 } SQLITE_OK
1256 # Test that sqlite3_step() sets the database error code correctly.
1257 # See ticket #2497.
1259 ifcapable 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}
1290 # Make sure sqlite3_result_error_code() returns the correct error code.
1291 # See ticket #2940
1293 do_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}
1298 sqlite3_finalize $STMT
1299 do_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}
1303 sqlite3_finalize $STMT
1304 do_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}
1308 sqlite3_finalize $STMT
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.
1315 ifcapable 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
1344 # Test decltype on some SELECT statements that contain sub-selects.
1346 proc 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
1355 do_test capi3c-24.1 {
1356   execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) }
1357   decltype {SELECT * FROM t5}
1358 } {INTEGER STRING DATETIME}
1359 do_test capi3c-24.2 {
1360   decltype {SELECT (SELECT c) FROM t5}
1361 } {DATETIME}
1362 do_test capi3c-24.3 {
1363   decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5}
1364 } {DATETIME}
1365 do_test capi3c-24.4 {
1366   decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b}
1367 } {INTEGER STRING DATETIME}
1368 do_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}
1374 do_test capi3c-24.3 {
1375   decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5}
1376 } {INTEGER}
1378 finish_test