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} 868do_test capi3c-11.11 { 869 sqlite3_step $STMT 870} {SQLITE_DONE} 871ifcapable !autoreset { 872 do_test capi3c-11.12armor { 873 sqlite3_step $STMT 874 sqlite3_step $STMT 875 } {SQLITE_MISUSE} 876} else { 877 do_test capi3c-11.12 { 878 sqlite3_step $STMT 879 sqlite3_step $STMT 880 } {SQLITE_ROW} 881} 882do_test capi3c-11.13 { 883 sqlite3_finalize $STMT 884} {SQLITE_OK} 885do_test capi3c-11.14 { 886 execsql { 887 SELECT a FROM t2; 888 } 889} {1 2} 890do_test capi3c-11.14.1 { 891 sqlite3_get_autocommit $DB 892} 1 893do_test capi3c-11.15 { 894 catchsql { 895 ROLLBACK; 896 } 897} {1 {cannot rollback - no transaction is active}} 898do_test capi3c-11.15.1 { 899 sqlite3_get_autocommit $DB 900} 1 901do_test capi3c-11.16 { 902 execsql { 903 SELECT a FROM t2; 904 } 905} {1 2} 906 907# Sanity check on the definition of 'outstanding VM'. This means any VM 908# that has had sqlite3_step() called more recently than sqlite3_finalize() or 909# sqlite3_reset(). So a VM that has just been prepared or reset does not 910# count as an active VM. 911do_test capi3c-11.17 { 912 execsql { 913 BEGIN; 914 } 915} {} 916do_test capi3c-11.18 { 917 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t1" -1 TAIL] 918 catchsql { 919 COMMIT; 920 } 921} {0 {}} 922do_test capi3c-11.19 { 923 sqlite3_step $STMT 924} {SQLITE_ROW} 925do_test capi3c-11.20 { 926 catchsql { 927 BEGIN; 928 COMMIT; 929 } 930} {0 {}} 931do_test capi3c-11.20 { 932 sqlite3_reset $STMT 933 catchsql { 934 COMMIT; 935 } 936} {1 {cannot commit - no transaction is active}} 937do_test capi3c-11.21 { 938 sqlite3_finalize $STMT 939} {SQLITE_OK} 940 941# The following tests - capi3c-12.* - check that its Ok to start a 942# transaction while other VMs are active, and that its Ok to execute 943# atomic updates in the same situation 944# 945do_test capi3c-12.1 { 946 set STMT [sqlite3_prepare_v2 $DB "SELECT a FROM t2" -1 TAIL] 947 sqlite3_step $STMT 948} {SQLITE_ROW} 949do_test capi3c-12.2 { 950 catchsql { 951 INSERT INTO t1 VALUES(3, NULL); 952 } 953} {0 {}} 954do_test capi3c-12.3 { 955 catchsql { 956 INSERT INTO t2 VALUES(4); 957 } 958} {0 {}} 959do_test capi3c-12.4 { 960 catchsql { 961 BEGIN; 962 INSERT INTO t1 VALUES(4, NULL); 963 } 964} {0 {}} 965do_test capi3c-12.5 { 966 sqlite3_step $STMT 967} {SQLITE_ROW} 968do_test capi3c-12.5.1 { 969 sqlite3_step $STMT 970} {SQLITE_ROW} 971do_test capi3c-12.6 { 972 sqlite3_step $STMT 973} {SQLITE_DONE} 974do_test capi3c-12.7 { 975 sqlite3_finalize $STMT 976} {SQLITE_OK} 977do_test capi3c-12.8 { 978 execsql { 979 COMMIT; 980 SELECT a FROM t1; 981 } 982} {1 2 3 4} 983 984# Test cases capi3c-13.* test the sqlite3_clear_bindings() and 985# sqlite3_sleep APIs. 986# 987if {[llength [info commands sqlite3_clear_bindings]]>0} { 988 do_test capi3c-13.1 { 989 execsql { 990 DELETE FROM t1; 991 } 992 set STMT [sqlite3_prepare_v2 $DB "INSERT INTO t1 VALUES(?, ?)" -1 TAIL] 993 sqlite3_step $STMT 994 } {SQLITE_DONE} 995 do_test capi3c-13.2 { 996 sqlite3_reset $STMT 997 sqlite3_bind_text $STMT 1 hello 5 998 sqlite3_bind_text $STMT 2 world 5 999 sqlite3_step $STMT 1000 } {SQLITE_DONE} 1001 do_test capi3c-13.3 { 1002 sqlite3_reset $STMT 1003 sqlite3_clear_bindings $STMT 1004 sqlite3_step $STMT 1005 } {SQLITE_DONE} 1006 do_test capi3c-13-4 { 1007 sqlite3_finalize $STMT 1008 execsql { 1009 SELECT * FROM t1; 1010 } 1011 } {{} {} hello world {} {}} 1012} 1013if {[llength [info commands sqlite3_sleep]]>0} { 1014 do_test capi3c-13-5 { 1015 set ms [sqlite3_sleep 80] 1016 expr {$ms==80 || $ms==1000} 1017 } {1} 1018} 1019 1020# Ticket #1219: Make sure binding APIs can handle a NULL pointer. 1021# 1022do_test capi3c-14.1 { 1023 set rc [catch {sqlite3_bind_text 0 1 hello 5} msg] 1024 lappend rc $msg 1025} {1 SQLITE_MISUSE} 1026 1027# Ticket #1650: Honor the nBytes parameter to sqlite3_prepare. 1028# 1029do_test capi3c-15.1 { 1030 set sql {SELECT * FROM t2} 1031 set nbytes [string length $sql] 1032 append sql { WHERE a==1} 1033 set STMT [sqlite3_prepare_v2 $DB $sql $nbytes TAIL] 1034 sqlite3_step $STMT 1035 sqlite3_column_int $STMT 0 1036} {1} 1037do_test capi3c-15.2 { 1038 sqlite3_step $STMT 1039 sqlite3_column_int $STMT 0 1040} {2} 1041do_test capi3c-15.3 { 1042 sqlite3_finalize $STMT 1043} {SQLITE_OK} 1044 1045# Make sure code is always generated even if an IF EXISTS or 1046# IF NOT EXISTS clause is present that the table does not or 1047# does exists. That way we will always have a prepared statement 1048# to expire when the schema changes. 1049# 1050do_test capi3c-16.1 { 1051 set sql {DROP TABLE IF EXISTS t3} 1052 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1053 sqlite3_finalize $STMT 1054 expr {$STMT!=""} 1055} {1} 1056do_test capi3c-16.2 { 1057 set sql {CREATE TABLE IF NOT EXISTS t1(x,y)} 1058 set STMT [sqlite3_prepare_v2 $DB $sql -1 TAIL] 1059 sqlite3_finalize $STMT 1060 expr {$STMT!=""} 1061} {1} 1062 1063# But still we do not generate code if there is no SQL 1064# 1065do_test capi3c-16.3 { 1066 set STMT [sqlite3_prepare_v2 $DB {} -1 TAIL] 1067 sqlite3_finalize $STMT 1068 expr {$STMT==""} 1069} {1} 1070do_test capi3c-16.4 { 1071 set STMT [sqlite3_prepare_v2 $DB {;} -1 TAIL] 1072 sqlite3_finalize $STMT 1073 expr {$STMT==""} 1074} {1} 1075 1076# Ticket #2154. 1077# 1078do_test capi3c-17.1 { 1079 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t2} -1 TAIL] 1080 sqlite3_step $STMT 1081} SQLITE_ROW 1082do_test capi3c-17.2 { 1083 sqlite3_column_int $STMT 0 1084} 4 1085do_test capi3c-17.3 { 1086 sqlite3_step $STMT 1087} SQLITE_DONE 1088do_test capi3c-17.4 { 1089 sqlite3_reset $STMT 1090 db eval {CREATE INDEX i2 ON t2(a)} 1091 sqlite3_step $STMT 1092} SQLITE_ROW 1093do_test capi3c-17.5 { 1094 sqlite3_column_int $STMT 0 1095} 4 1096do_test capi3c-17.6 { 1097 sqlite3_step $STMT 1098} SQLITE_DONE 1099do_test capi3c-17.7 { 1100 sqlite3_reset $STMT 1101 db eval {DROP INDEX i2} 1102 sqlite3_step $STMT 1103} SQLITE_ROW 1104do_test capi3c-17.8 { 1105 sqlite3_column_int $STMT 0 1106} 4 1107do_test capi3c-17.9 { 1108 sqlite3_step $STMT 1109} SQLITE_DONE 1110do_test capi3c-17.10 { 1111 sqlite3_finalize $STMT 1112 set STMT [sqlite3_prepare_v2 $DB {SELECT b FROM t1 WHERE a=?} -1 TAIL] 1113 sqlite3_bind_int $STMT 1 2 1114 db eval { 1115 DELETE FROM t1; 1116 INSERT INTO t1 VALUES(1,'one'); 1117 INSERT INTO t1 VALUES(2,'two'); 1118 INSERT INTO t1 VALUES(3,'three'); 1119 INSERT INTO t1 VALUES(4,'four'); 1120 } 1121 sqlite3_step $STMT 1122} SQLITE_ROW 1123do_test capi3c-17.11 { 1124 sqlite3_column_text $STMT 0 1125} two 1126do_test capi3c-17.12 { 1127 sqlite3_step $STMT 1128} SQLITE_DONE 1129do_test capi3c-17.13 { 1130 sqlite3_reset $STMT 1131 db eval {CREATE INDEX i1 ON t1(a)} 1132 sqlite3_step $STMT 1133} SQLITE_ROW 1134do_test capi3c-17.14 { 1135 sqlite3_column_text $STMT 0 1136} two 1137do_test capi3c-17.15 { 1138 sqlite3_step $STMT 1139} SQLITE_DONE 1140do_test capi3c-17.16 { 1141 sqlite3_reset $STMT 1142 db eval {DROP INDEX i1} 1143 sqlite3_step $STMT 1144} SQLITE_ROW 1145do_test capi3c-17.17 { 1146 sqlite3_column_text $STMT 0 1147} two 1148do_test capi3c-17.18 { 1149 sqlite3_step $STMT 1150} SQLITE_DONE 1151do_test capi3c-17.99 { 1152 sqlite3_finalize $STMT 1153} SQLITE_OK 1154 1155# On the mailing list it has been reported that finalizing after 1156# an SQLITE_BUSY return leads to a segfault. Here we test that case. 1157# 1158do_test capi3c-18.1 { 1159 sqlite3 db2 test.db 1160 set STMT [sqlite3_prepare_v2 $DB {SELECT max(a) FROM t1} -1 TAIL] 1161 sqlite3_step $STMT 1162} SQLITE_ROW 1163do_test capi3c-18.2 { 1164 sqlite3_column_int $STMT 0 1165} 4 1166do_test capi3c-18.3 { 1167 sqlite3_reset $STMT 1168 db2 eval {BEGIN EXCLUSIVE} 1169 sqlite3_step $STMT 1170} SQLITE_BUSY 1171do_test capi3c-18.4 { 1172 sqlite3_finalize $STMT 1173} SQLITE_BUSY 1174do_test capi3c-18.5 { 1175 db2 eval {COMMIT} 1176 db2 close 1177} {} 1178 1179# Ticket #2158. The sqlite3_step() will still return SQLITE_SCHEMA 1180# if the database schema changes in a way that makes the statement 1181# no longer valid. 1182# 1183do_test capi3c-19.1 { 1184 db eval { 1185 CREATE TABLE t3(x,y); 1186 INSERT INTO t3 VALUES(1,2); 1187 } 1188 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1189 sqlite3_step $STMT 1190} SQLITE_ROW 1191do_test capi3c-19.2 { 1192 sqlite3_column_int $STMT 0 1193} 1 1194do_test capi3c-19.3 { 1195 sqlite3_step $STMT 1196} SQLITE_DONE 1197do_test capi3c-19.4 { 1198 sqlite3_reset $STMT 1199 db eval {DROP TABLE t3} 1200 sqlite3_step $STMT 1201} SQLITE_ERROR 1202do_test capi3c-19.4.1 { 1203 sqlite3_errmsg $DB 1204} {no such table: t3} 1205ifcapable deprecated { 1206 do_test capi3c-19.4.2 { 1207 sqlite3_expired $STMT 1208 } 1 1209} 1210do_test capi3c-19.4.3 { 1211 sqlite3_errmsg $DB 1212} {no such table: t3} 1213ifcapable deprecated { 1214 do_test capi3c-19.4.4 { 1215 sqlite3_expired 0 1216 } 1 1217} 1218do_test capi3c-19.5 { 1219 sqlite3_reset $STMT 1220 db eval { 1221 CREATE TABLE t3(x,y); 1222 INSERT INTO t3 VALUES(1,2); 1223 } 1224 sqlite3_step $STMT 1225} SQLITE_ROW 1226ifcapable deprecated { 1227 do_test capi3c-19.5.2 { 1228 sqlite3_expired $STMT 1229 } 0 1230} 1231do_test capi3c-19.6 { 1232 sqlite3_column_int $STMT 1 1233} 2 1234do_test capi3c-19.99 { 1235 sqlite3_finalize $STMT 1236} SQLITE_OK 1237 1238# Make sure a change in a separate database connection does not 1239# cause an SQLITE_SCHEMA return. 1240# 1241do_test capi3c-20.1 { 1242 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1243 sqlite3 db2 test.db 1244 db2 eval {CREATE TABLE t4(x)} 1245 sqlite3_step $STMT 1246} SQLITE_ROW 1247do_test capi3c-20.2 { 1248 sqlite3_column_int $STMT 1 1249} 2 1250do_test capi3c-20.3 { 1251 sqlite3_step $STMT 1252} SQLITE_DONE 1253do_test capi3c-20.4 { 1254 db2 close 1255 sqlite3_finalize $STMT 1256} SQLITE_OK 1257 1258# Test that sqlite3_step() sets the database error code correctly. 1259# See ticket #2497. 1260# 1261ifcapable progress { 1262 do_test capi3c-21.1 { 1263 set STMT [sqlite3_prepare_v2 $DB {SELECT * FROM t3} -1 TAIL] 1264 db progress 5 "expr 1" 1265 sqlite3_step $STMT 1266 } {SQLITE_INTERRUPT} 1267 do_test capi3c-21.2 { 1268 sqlite3_extended_errcode $DB 1269 } {SQLITE_INTERRUPT} 1270 do_test capi3c-21.3 { 1271 sqlite3_finalize $STMT 1272 } {SQLITE_INTERRUPT} 1273 do_test capi3c-21.4 { 1274 set STMT [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL] 1275 db progress 5 "expr 1" 1276 sqlite3_step $STMT 1277 } {SQLITE_ERROR} 1278 do_test capi3c-21.5 { 1279 sqlite3_errcode $DB 1280 } {SQLITE_ERROR} 1281 do_test capi3c-21.6 { 1282 sqlite3_finalize $STMT 1283 } {SQLITE_INTERRUPT} 1284 do_test capi3c-21.7 { 1285 sqlite3_errcode $DB 1286 } {SQLITE_INTERRUPT} 1287 do_test capi3c-21.8 { 1288 sqlite3_extended_errcode $DB 1289 } {SQLITE_INTERRUPT} 1290} 1291 1292# Make sure sqlite3_result_error_code() returns the correct error code. 1293# See ticket #2940 1294# 1295do_test capi3c-22.1 { 1296 db progress 0 {} 1297 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',3)} -1 TAIL] 1298 sqlite3_step $STMT 1299} {SQLITE_PERM} 1300sqlite3_finalize $STMT 1301do_test capi3c-22.2 { 1302 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',4)} -1 TAIL] 1303 sqlite3_step $STMT 1304} {SQLITE_ABORT} 1305sqlite3_finalize $STMT 1306do_test capi3c-22.3 { 1307 set STMT [sqlite3_prepare_v2 db {SELECT test_error('the message',16)} -1 TAIL] 1308 sqlite3_step $STMT 1309} {SQLITE_EMPTY} 1310sqlite3_finalize $STMT 1311 1312# For a multi-column result set where the same table column is repeated 1313# in multiple columns of the output, verify that doing a UTF-8 to UTF-16 1314# conversion (or vice versa) on one column does not change the value of 1315# the second. 1316# 1317ifcapable utf16 { 1318 do_test capi3c-23.1 { 1319 set STMT [sqlite3_prepare_v2 db {SELECT b,b,b,b FROM t1} -1 TAIL] 1320 sqlite3_step $STMT 1321 } {SQLITE_ROW} 1322 do_test capi3c-23.2 { 1323 sqlite3_column_text16 $STMT 0 1324 sqlite3_column_text $STMT 1 1325 } {one} 1326 do_test capi3c-23.3 { 1327 sqlite3_column_text16 $STMT 2 1328 sqlite3_column_text $STMT 3 1329 } {one} 1330 sqlite3_finalize $STMT 1331 do_test capi3c-23.4 { 1332 set STMT [sqlite3_prepare_v2 db {SELECT b||'x',b,b,b FROM t1} -1 TAIL] 1333 sqlite3_step $STMT 1334 } {SQLITE_ROW} 1335 do_test capi3c-23.5 { 1336 sqlite3_column_text16 $STMT 0 1337 sqlite3_column_text $STMT 1 1338 } {one} 1339 do_test capi3c-23.6 { 1340 sqlite3_column_text16 $STMT 2 1341 sqlite3_column_text $STMT 3 1342 } {one} 1343 sqlite3_finalize $STMT 1344} 1345 1346# Test decltype on some SELECT statements that contain sub-selects. 1347# 1348proc decltype {zSql} { 1349 set ret [list] 1350 set STMT [sqlite3_prepare_v2 db $zSql -1 TAIL] 1351 for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} { 1352 lappend ret [sqlite3_column_decltype $STMT $i] 1353 } 1354 sqlite3_finalize $STMT 1355 return $ret 1356} 1357do_test capi3c-24.1 { 1358 execsql { CREATE TABLE t5(a INTEGER, b STRING, c DATETIME) } 1359 decltype {SELECT * FROM t5} 1360} {INTEGER STRING DATETIME} 1361do_test capi3c-24.2 { 1362 decltype {SELECT (SELECT c) FROM t5} 1363} {DATETIME} 1364do_test capi3c-24.3 { 1365 decltype {SELECT (SELECT * FROM (SELECT c)) FROM t5} 1366} {DATETIME} 1367do_test capi3c-24.4 { 1368 decltype {SELECT * FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b} 1369} {INTEGER STRING DATETIME} 1370do_test capi3c-24.5 { 1371 decltype { 1372 SELECT (SELECT x FROM (SELECT c AS x)) 1373 FROM (SELECT * FROM t5 ORDER BY c LIMIT 1) ORDER BY b 1374 } 1375} {DATETIME} 1376do_test capi3c-24.3 { 1377 decltype {SELECT (SELECT x FROM (SELECT t5.a AS x)) FROM t5} 1378} {INTEGER} 1379 1380 1381# Further tests of sqlite3_column_decltype(): 1382# 1383do_execsql_test 25.0 { 1384 CREATE TABLE t11(a VARCHAR(10), b INTEGER); 1385 CREATE TABLE t12(a VARCHAR(15), b FLOAT); 1386} 1387 1388foreach {tn sql} { 1389 1 "SELECT * FROM t11 UNION ALL SELECT * FROM t12" 1390 2 "SELECT * FROM t11 UNION SELECT * FROM t12" 1391 3 "SELECT * FROM t11 EXCEPT SELECT * FROM t12" 1392 4 "SELECT * FROM t11 INTERSECT SELECT * FROM t12" 1393 1394 5 "SELECT * FROM t11 UNION ALL SELECT * FROM t12 ORDER BY 1" 1395 6 "SELECT * FROM t11 UNION SELECT * FROM t12 ORDER BY 1" 1396 7 "SELECT * FROM t11 EXCEPT SELECT * FROM t12 ORDER BY 1" 1397 8 "SELECT * FROM t11 INTERSECT SELECT * FROM t12 ORDER BY 1" 1398} { 1399 do_test 25.$tn { decltype $sql } {VARCHAR(10) INTEGER} 1400} 1401 1402finish_test 1403