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