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