github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/misc1.test (about) 1 # 2001 September 15. 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 file implements tests for miscellanous features that were 14 # left out of other test files. 15 # 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 20 # Mimic the SQLite 2 collation type NUMERIC. 21 db collate numeric numeric_collate 22 proc numeric_collate {lhs rhs} { 23 if {$lhs == $rhs} {return 0} 24 return [expr ($lhs>$rhs)?1:-1] 25 } 26 27 # Mimic the SQLite 2 collation type TEXT. 28 db collate text text_collate 29 proc numeric_collate {lhs rhs} { 30 return [string compare $lhs $rhs] 31 } 32 33 # Test the creation and use of tables that have a large number 34 # of columns. 35 # 36 do_test misc1-1.1 { 37 set cmd "CREATE TABLE manycol(x0 text" 38 for {set i 1} {$i<=99} {incr i} { 39 append cmd ",x$i text" 40 } 41 append cmd ")"; 42 execsql $cmd 43 set cmd "INSERT INTO manycol VALUES(0" 44 for {set i 1} {$i<=99} {incr i} { 45 append cmd ",$i" 46 } 47 append cmd ")"; 48 execsql $cmd 49 execsql "SELECT x99 FROM manycol" 50 } 99 51 do_test misc1-1.2 { 52 execsql {SELECT x0, x10, x25, x50, x75 FROM manycol} 53 } {0 10 25 50 75} 54 do_test misc1-1.3.1 { 55 for {set j 100} {$j<=1000} {incr j 100} { 56 set cmd "INSERT INTO manycol VALUES($j" 57 for {set i 1} {$i<=99} {incr i} { 58 append cmd ",[expr {$i+$j}]" 59 } 60 append cmd ")" 61 execsql $cmd 62 } 63 execsql {SELECT x50 FROM manycol ORDER BY x80+0} 64 } {50 150 250 350 450 550 650 750 850 950 1050} 65 do_test misc1-1.3.2 { 66 execsql {SELECT x50 FROM manycol ORDER BY x80} 67 } {1050 150 250 350 450 550 650 750 50 850 950} 68 do_test misc1-1.4 { 69 execsql {SELECT x75 FROM manycol WHERE x50=350} 70 } 375 71 do_test misc1-1.5 { 72 execsql {SELECT x50 FROM manycol WHERE x99=599} 73 } 550 74 do_test misc1-1.6 { 75 execsql {CREATE INDEX manycol_idx1 ON manycol(x99)} 76 execsql {SELECT x50 FROM manycol WHERE x99=899} 77 } 850 78 do_test misc1-1.7 { 79 execsql {SELECT count(*) FROM manycol} 80 } 11 81 do_test misc1-1.8 { 82 execsql {DELETE FROM manycol WHERE x98=1234} 83 execsql {SELECT count(*) FROM manycol} 84 } 11 85 do_test misc1-1.9 { 86 execsql {DELETE FROM manycol WHERE x98=998} 87 execsql {SELECT count(*) FROM manycol} 88 } 10 89 do_test misc1-1.10 { 90 execsql {DELETE FROM manycol WHERE x99=500} 91 execsql {SELECT count(*) FROM manycol} 92 } 10 93 do_test misc1-1.11 { 94 execsql {DELETE FROM manycol WHERE x99=599} 95 execsql {SELECT count(*) FROM manycol} 96 } 9 97 98 # Check GROUP BY expressions that name two or more columns. 99 # 100 do_test misc1-2.1 { 101 execsql { 102 BEGIN TRANSACTION; 103 CREATE TABLE agger(one text, two text, three text, four text); 104 INSERT INTO agger VALUES(1, 'one', 'hello', 'yes'); 105 INSERT INTO agger VALUES(2, 'two', 'howdy', 'no'); 106 INSERT INTO agger VALUES(3, 'thr', 'howareya', 'yes'); 107 INSERT INTO agger VALUES(4, 'two', 'lothere', 'yes'); 108 INSERT INTO agger VALUES(5, 'one', 'atcha', 'yes'); 109 INSERT INTO agger VALUES(6, 'two', 'hello', 'no'); 110 COMMIT 111 } 112 execsql {SELECT count(*) FROM agger} 113 } 6 114 do_test misc1-2.2 { 115 execsql {SELECT sum(one), two, four FROM agger 116 GROUP BY two, four ORDER BY sum(one) desc} 117 } {8 two no 6 one yes 4 two yes 3 thr yes} 118 do_test misc1-2.3 { 119 execsql {SELECT sum((one)), (two), (four) FROM agger 120 GROUP BY (two), (four) ORDER BY sum(one) desc} 121 } {8 two no 6 one yes 4 two yes 3 thr yes} 122 123 # Here's a test for a bug found by Joel Lucsy. The code below 124 # was causing an assertion failure. 125 # 126 do_test misc1-3.1 { 127 set r [execsql { 128 CREATE TABLE t1(a); 129 INSERT INTO t1 VALUES('hi'); 130 PRAGMA full_column_names=on; 131 SELECT rowid, * FROM t1; 132 }] 133 lindex $r 1 134 } {hi} 135 136 # Here's a test for yet another bug found by Joel Lucsy. The code 137 # below was causing an assertion failure. 138 # 139 do_test misc1-4.1 { 140 execsql { 141 BEGIN; 142 CREATE TABLE t2(a); 143 INSERT INTO t2 VALUES('This is a long string to use up a lot of disk -'); 144 UPDATE t2 SET a=a||a||a||a; 145 INSERT INTO t2 SELECT '1 - ' || a FROM t2; 146 INSERT INTO t2 SELECT '2 - ' || a FROM t2; 147 INSERT INTO t2 SELECT '3 - ' || a FROM t2; 148 INSERT INTO t2 SELECT '4 - ' || a FROM t2; 149 INSERT INTO t2 SELECT '5 - ' || a FROM t2; 150 INSERT INTO t2 SELECT '6 - ' || a FROM t2; 151 COMMIT; 152 SELECT count(*) FROM t2; 153 } 154 } {64} 155 156 # Make sure we actually see a semicolon or end-of-file in the SQL input 157 # before executing a command. Thus if "WHERE" is misspelled on an UPDATE, 158 # the user won't accidently update every record. 159 # 160 do_test misc1-5.1 { 161 catchsql { 162 CREATE TABLE t3(a,b); 163 INSERT INTO t3 VALUES(1,2); 164 INSERT INTO t3 VALUES(3,4); 165 UPDATE t3 SET a=0 WHEREwww b=2; 166 } 167 } {1 {near "WHEREwww": syntax error}} 168 do_test misc1-5.2 { 169 execsql { 170 SELECT * FROM t3 ORDER BY a; 171 } 172 } {1 2 3 4} 173 174 # Certain keywords (especially non-standard keywords like "REPLACE") can 175 # also be used as identifiers. The way this works in the parser is that 176 # the parser first detects a syntax error, the error handling routine 177 # sees that the special keyword caused the error, then replaces the keyword 178 # with "ID" and tries again. 179 # 180 # Check the operation of this logic. 181 # 182 do_test misc1-6.1 { 183 catchsql { 184 CREATE TABLE t4( 185 abort, asc, begin, cluster, conflict, copy, delimiters, desc, end, 186 explain, fail, ignore, key, offset, pragma, replace, temp, 187 vacuum, view 188 ); 189 } 190 } {0 {}} 191 do_test misc1-6.2 { 192 catchsql { 193 INSERT INTO t4 194 VALUES(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19); 195 } 196 } {0 {}} 197 do_test misc1-6.3 { 198 execsql { 199 SELECT * FROM t4 200 } 201 } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19} 202 do_test misc1-6.4 { 203 execsql { 204 SELECT abort+asc,max(key,pragma,temp) FROM t4 205 } 206 } {3 17} 207 208 # Test for multi-column primary keys, and for multiple primary keys. 209 # 210 do_test misc1-7.1 { 211 catchsql { 212 CREATE TABLE error1( 213 a TYPE PRIMARY KEY, 214 b TYPE PRIMARY KEY 215 ); 216 } 217 } {1 {table "error1" has more than one primary key}} 218 do_test misc1-7.2 { 219 catchsql { 220 CREATE TABLE error1( 221 a INTEGER PRIMARY KEY, 222 b TYPE PRIMARY KEY 223 ); 224 } 225 } {1 {table "error1" has more than one primary key}} 226 do_test misc1-7.3 { 227 execsql { 228 CREATE TABLE t5(a,b,c,PRIMARY KEY(a,b)); 229 INSERT INTO t5 VALUES(1,2,3); 230 SELECT * FROM t5 ORDER BY a; 231 } 232 } {1 2 3} 233 do_test misc1-7.4 { 234 catchsql { 235 INSERT INTO t5 VALUES(1,2,4); 236 } 237 } {1 {UNIQUE constraint failed: t5.a, t5.b}} 238 do_test misc1-7.5 { 239 catchsql { 240 INSERT INTO t5 VALUES(0,2,4); 241 } 242 } {0 {}} 243 do_test misc1-7.6 { 244 execsql { 245 SELECT * FROM t5 ORDER BY a; 246 } 247 } {0 2 4 1 2 3} 248 249 do_test misc1-8.1 { 250 catchsql { 251 SELECT *; 252 } 253 } {1 {no tables specified}} 254 do_test misc1-8.2 { 255 catchsql { 256 SELECT t1.*; 257 } 258 } {1 {no such table: t1}} 259 260 execsql { 261 DROP TABLE t1; 262 DROP TABLE t2; 263 DROP TABLE t3; 264 DROP TABLE t4; 265 } 266 267 # 64-bit integers are represented exactly. 268 # 269 do_test misc1-9.1 { 270 catchsql { 271 CREATE TABLE t1(a unique not null, b unique not null); 272 INSERT INTO t1 VALUES('a',1234567890123456789); 273 INSERT INTO t1 VALUES('b',1234567891123456789); 274 INSERT INTO t1 VALUES('c',1234567892123456789); 275 SELECT * FROM t1; 276 } 277 } {0 {a 1234567890123456789 b 1234567891123456789 c 1234567892123456789}} 278 279 # A WHERE clause is not allowed to contain more than 99 terms. Check to 280 # make sure this limit is enforced. 281 # 282 # 2005-07-16: There is no longer a limit on the number of terms in a 283 # WHERE clause. But keep these tests just so that we have some tests 284 # that use a large number of terms in the WHERE clause. 285 # 286 do_test misc1-10.0 { 287 execsql {SELECT count(*) FROM manycol} 288 } {9} 289 do_test misc1-10.1 { 290 set ::where {WHERE x0>=0} 291 for {set i 1} {$i<=99} {incr i} { 292 append ::where " AND x$i<>0" 293 } 294 catchsql "SELECT count(*) FROM manycol $::where" 295 } {0 9} 296 do_test misc1-10.2 { 297 catchsql "SELECT count(*) FROM manycol $::where AND rowid>0" 298 } {0 9} 299 do_test misc1-10.3 { 300 regsub "x0>=0" $::where "x0=0" ::where 301 catchsql "DELETE FROM manycol $::where" 302 } {0 {}} 303 do_test misc1-10.4 { 304 execsql {SELECT count(*) FROM manycol} 305 } {8} 306 do_test misc1-10.5 { 307 catchsql "DELETE FROM manycol $::where AND rowid>0" 308 } {0 {}} 309 do_test misc1-10.6 { 310 execsql {SELECT x1 FROM manycol WHERE x0=100} 311 } {101} 312 do_test misc1-10.7 { 313 regsub "x0=0" $::where "x0=100" ::where 314 catchsql "UPDATE manycol SET x1=x1+1 $::where" 315 } {0 {}} 316 do_test misc1-10.8 { 317 execsql {SELECT x1 FROM manycol WHERE x0=100} 318 } {102} 319 do_test misc1-10.9 { 320 catchsql "UPDATE manycol SET x1=x1+1 $::where AND rowid>0" 321 } {0 {}} 322 do_test misc1-10.10 { 323 execsql {SELECT x1 FROM manycol WHERE x0=100} 324 } {103} 325 326 # Make sure the initialization works even if a database is opened while 327 # another process has the database locked. 328 # 329 # Update for v3: The BEGIN doesn't lock the database so the schema is read 330 # and the SELECT returns successfully. 331 do_test misc1-11.1 { 332 execsql {BEGIN} 333 execsql {UPDATE t1 SET a=0 WHERE 0} 334 sqlite3 db2 test.db 335 set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg] 336 lappend rc $msg 337 # v2 result: {1 {database is locked}} 338 } {0 3} 339 do_test misc1-11.2 { 340 execsql {COMMIT} 341 set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg] 342 db2 close 343 lappend rc $msg 344 } {0 3} 345 346 # Make sure string comparisons really do compare strings in format4+. 347 # Similar tests in the format3.test file show that for format3 and earlier 348 # all comparisions where numeric if either operand looked like a number. 349 # 350 do_test misc1-12.1 { 351 execsql {SELECT '0'=='0.0'} 352 } {0} 353 do_test misc1-12.2 { 354 execsql {SELECT '0'==0.0} 355 } {0} 356 do_test misc1-12.3 { 357 execsql {SELECT '12345678901234567890'=='12345678901234567891'} 358 } {0} 359 do_test misc1-12.4 { 360 execsql { 361 CREATE TABLE t6(a INT UNIQUE, b TEXT UNIQUE); 362 INSERT INTO t6 VALUES('0','0.0'); 363 SELECT * FROM t6; 364 } 365 } {0 0.0} 366 ifcapable conflict { 367 do_test misc1-12.5 { 368 execsql { 369 INSERT OR IGNORE INTO t6 VALUES(0.0,'x'); 370 SELECT * FROM t6; 371 } 372 } {0 0.0} 373 do_test misc1-12.6 { 374 execsql { 375 INSERT OR IGNORE INTO t6 VALUES('y',0); 376 SELECT * FROM t6; 377 } 378 } {0 0.0 y 0} 379 } 380 do_test misc1-12.7 { 381 execsql { 382 CREATE TABLE t7(x INTEGER, y TEXT, z); 383 INSERT INTO t7 VALUES(0,0,1); 384 INSERT INTO t7 VALUES(0.0,0,2); 385 INSERT INTO t7 VALUES(0,0.0,3); 386 INSERT INTO t7 VALUES(0.0,0.0,4); 387 SELECT DISTINCT x, y FROM t7 ORDER BY z; 388 } 389 } {0 0 0 0.0} 390 do_test misc1-12.8 { 391 execsql { 392 SELECT min(z), max(z), count(z) FROM t7 GROUP BY x ORDER BY 1; 393 } 394 } {1 4 4} 395 do_test misc1-12.9 { 396 execsql { 397 SELECT min(z), max(z), count(z) FROM t7 GROUP BY y ORDER BY 1; 398 } 399 } {1 2 2 3 4 2} 400 401 # This used to be an error. But we changed the code so that arbitrary 402 # identifiers can be used as a collating sequence. Collation is by text 403 # if the identifier contains "text", "blob", or "clob" and is numeric 404 # otherwise. 405 # 406 # Update: In v3, it is an error again. 407 # 408 #do_test misc1-12.10 { 409 # catchsql { 410 # SELECT * FROM t6 ORDER BY a COLLATE unknown; 411 # } 412 #} {0 {0 0 y 0}} 413 do_test misc1-12.11 { 414 execsql { 415 CREATE TABLE t8(x TEXT COLLATE numeric, y INTEGER COLLATE text, z); 416 INSERT INTO t8 VALUES(0,0,1); 417 INSERT INTO t8 VALUES(0.0,0,2); 418 INSERT INTO t8 VALUES(0,0.0,3); 419 INSERT INTO t8 VALUES(0.0,0.0,4); 420 SELECT DISTINCT x, y FROM t8 ORDER BY z; 421 } 422 } {0 0 0.0 0} 423 do_test misc1-12.12 { 424 execsql { 425 SELECT min(z), max(z), count(z) FROM t8 GROUP BY x ORDER BY 1; 426 } 427 } {1 3 2 2 4 2} 428 do_test misc1-12.13 { 429 execsql { 430 SELECT min(z), max(z), count(z) FROM t8 GROUP BY y ORDER BY 1; 431 } 432 } {1 4 4} 433 434 # There was a problem with realloc() in the OP_MemStore operation of 435 # the VDBE. A buffer was being reallocated but some pointers into 436 # the old copy of the buffer were not being moved over to the new copy. 437 # The following code tests for the problem. 438 # 439 ifcapable subquery { 440 do_test misc1-13.1 { 441 execsql { 442 CREATE TABLE t9(x,y); 443 INSERT INTO t9 VALUES('one',1); 444 INSERT INTO t9 VALUES('two',2); 445 INSERT INTO t9 VALUES('three',3); 446 INSERT INTO t9 VALUES('four',4); 447 INSERT INTO t9 VALUES('five',5); 448 INSERT INTO t9 VALUES('six',6); 449 INSERT INTO t9 VALUES('seven',7); 450 INSERT INTO t9 VALUES('eight',8); 451 INSERT INTO t9 VALUES('nine',9); 452 INSERT INTO t9 VALUES('ten',10); 453 INSERT INTO t9 VALUES('eleven',11); 454 SELECT y FROM t9 455 WHERE x=(SELECT x FROM t9 WHERE y=1) 456 OR x=(SELECT x FROM t9 WHERE y=2) 457 OR x=(SELECT x FROM t9 WHERE y=3) 458 OR x=(SELECT x FROM t9 WHERE y=4) 459 OR x=(SELECT x FROM t9 WHERE y=5) 460 OR x=(SELECT x FROM t9 WHERE y=6) 461 OR x=(SELECT x FROM t9 WHERE y=7) 462 OR x=(SELECT x FROM t9 WHERE y=8) 463 OR x=(SELECT x FROM t9 WHERE y=9) 464 OR x=(SELECT x FROM t9 WHERE y=10) 465 OR x=(SELECT x FROM t9 WHERE y=11) 466 OR x=(SELECT x FROM t9 WHERE y=12) 467 OR x=(SELECT x FROM t9 WHERE y=13) 468 OR x=(SELECT x FROM t9 WHERE y=14) 469 ; 470 } 471 } {1 2 3 4 5 6 7 8 9 10 11} 472 } 473 474 # 475 # The following tests can only work if the current SQLite VFS has the concept 476 # of a current directory. 477 # 478 ifcapable curdir { 479 # Make sure a database connection still works after changing the 480 # working directory. 481 # 482 if {[atomic_batch_write test.db]==0} { 483 do_test misc1-14.1 { 484 file mkdir tempdir 485 cd tempdir 486 execsql {BEGIN} 487 file exists ./test.db-journal 488 } {0} 489 do_test misc1-14.2a { 490 execsql {UPDATE t1 SET a=a||'x' WHERE 0} 491 file exists ../test.db-journal 492 } {0} 493 do_test misc1-14.2b { 494 execsql {UPDATE t1 SET a=a||'y' WHERE 1} 495 file exists ../test.db-journal 496 } {1} 497 do_test misc1-14.3 { 498 cd .. 499 forcedelete tempdir 500 execsql {COMMIT} 501 file exists ./test.db-journal 502 } {0} 503 } 504 } 505 506 # A failed create table should not leave the table in the internal 507 # data structures. Ticket #238. 508 # 509 do_test misc1-15.1.1 { 510 catchsql { 511 CREATE TABLE t10 AS SELECT c1; 512 } 513 } {1 {no such column: c1}} 514 do_test misc1-15.1.2 { 515 catchsql { 516 CREATE TABLE t10 AS SELECT t9.c1; 517 } 518 } {1 {no such column: t9.c1}} 519 do_test misc1-15.1.3 { 520 catchsql { 521 CREATE TABLE t10 AS SELECT main.t9.c1; 522 } 523 } {1 {no such column: main.t9.c1}} 524 do_test misc1-15.2 { 525 catchsql { 526 CREATE TABLE t10 AS SELECT 1; 527 } 528 # The bug in ticket #238 causes the statement above to fail with 529 # the error "table t10 alread exists" 530 } {0 {}} 531 532 # Test for memory leaks when a CREATE TABLE containing a primary key 533 # fails. Ticket #249. 534 # 535 do_test misc1-16.1 { 536 catchsql {SELECT name FROM sqlite_master LIMIT 1} 537 catchsql { 538 CREATE TABLE test(a integer, primary key(a)); 539 } 540 } {0 {}} 541 do_test misc1-16.2 { 542 catchsql { 543 CREATE TABLE test(a integer, primary key(a)); 544 } 545 } {1 {table test already exists}} 546 do_test misc1-16.3 { 547 catchsql { 548 CREATE TABLE test2(a text primary key, b text, primary key(a,b)); 549 } 550 } {1 {table "test2" has more than one primary key}} 551 do_test misc1-16.4 { 552 execsql { 553 INSERT INTO test VALUES(1); 554 SELECT rowid, a FROM test; 555 } 556 } {1 1} 557 do_test misc1-16.5 { 558 execsql { 559 INSERT INTO test VALUES(5); 560 SELECT rowid, a FROM test; 561 } 562 } {1 1 5 5} 563 do_test misc1-16.6 { 564 execsql { 565 INSERT INTO test VALUES(NULL); 566 SELECT rowid, a FROM test; 567 } 568 } {1 1 5 5 6 6} 569 570 ifcapable trigger&&tempdb { 571 # Ticket #333: Temp triggers that modify persistent tables. 572 # 573 do_test misc1-17.1 { 574 execsql { 575 BEGIN; 576 CREATE TABLE RealTable(TestID INTEGER PRIMARY KEY, TestString TEXT); 577 CREATE TEMP TABLE TempTable(TestID INTEGER PRIMARY KEY, TestString TEXT); 578 CREATE TEMP TRIGGER trigTest_1 AFTER UPDATE ON TempTable BEGIN 579 INSERT INTO RealTable(TestString) 580 SELECT new.TestString FROM TempTable LIMIT 1; 581 END; 582 INSERT INTO TempTable(TestString) VALUES ('1'); 583 INSERT INTO TempTable(TestString) VALUES ('2'); 584 UPDATE TempTable SET TestString = TestString + 1 WHERE TestID=1 OR TestId=2; 585 COMMIT; 586 SELECT TestString FROM RealTable ORDER BY 1; 587 } 588 } {2 3} 589 } 590 591 do_test misc1-18.1 { 592 set n [sqlite3_sleep 100] 593 expr {$n>=100} 594 } {1} 595 596 # 2014-01-10: In a CREATE TABLE AS, if one or more of the column names 597 # are an empty string, that is still OK. 598 # 599 do_execsql_test misc1-19.1 { 600 CREATE TABLE t19 AS SELECT 1, 2 AS '', 3; 601 SELECT * FROM t19; 602 } {1 2 3} 603 do_execsql_test misc1-19.2 { 604 CREATE TABLE t19b AS SELECT 4 AS '', 5 AS '', 6 AS ''; 605 SELECT * FROM t19b; 606 } {4 5 6} 607 608 # 2015-05-20: CREATE TABLE AS should not store INT value is a TEXT 609 # column. 610 # 611 do_execsql_test misc1-19.3 { 612 CREATE TABLE t19c(x TEXT); 613 CREATE TABLE t19d AS SELECT * FROM t19c UNION ALL SELECT 1234; 614 SELECT x, typeof(x) FROM t19d; 615 } {1234 text} 616 617 # 2014-05-16: Tests for the SQLITE_TESTCTRL_FAULT_INSTALL feature. 618 # 619 unset -nocomplain fault_callbacks 620 set fault_callbacks {} 621 proc fault_callback {n} { 622 lappend ::fault_callbacks $n 623 return 0 624 } 625 do_test misc1-19.1 { 626 sqlite3_test_control_fault_install fault_callback 627 set fault_callbacks 628 } {0} 629 do_test misc1-19.2 { 630 sqlite3_test_control_fault_install 631 set fault_callbacks 632 } {0} 633 634 # 2015-01-26: Valgrind-detected over-read. 635 # Reported on sqlite-users@sqlite.org by Michal Zalewski. Found by afl-fuzz 636 # presumably. 637 # 638 do_execsql_test misc1-20.1 { 639 CREATE TABLE t0(x INTEGER DEFAULT(0==0) NOT NULL); 640 REPLACE INTO t0(x) VALUES(''); 641 SELECT rowid, quote(x) FROM t0; 642 } {1 ''} 643 644 # 2015-03-22: NULL pointer dereference after a syntax error 645 # 646 do_catchsql_test misc1-21.1 { 647 select''like''like''like#0; 648 } {1 {near "#0": syntax error}} 649 do_catchsql_test misc1-21.2 { 650 VALUES(0,0x0MATCH#0; 651 } {1 {near ";": syntax error}} 652 653 # 2015-04-15 654 do_execsql_test misc1-22.1 { 655 SELECT ""+3 FROM (SELECT ""+5); 656 } {3} 657 658 # 2015-04-19: NULL pointer dereference on a corrupt schema 659 # 660 db close 661 sqlite3 db :memory: 662 sqlite3_db_config db DEFENSIVE 0 663 do_execsql_test misc1-23.1 { 664 CREATE TABLE t1(x); 665 PRAGMA writable_schema=ON; 666 UPDATE sqlite_master SET sql='CREATE table t(d CHECK(T(#0)'; 667 BEGIN; 668 CREATE TABLE t2(y); 669 ROLLBACK; 670 DROP TABLE IF EXISTS t3; 671 } {} 672 673 # 2015-04-19: Faulty assert() statement 674 # 675 db close 676 database_may_be_corrupt 677 sqlite3 db :memory: 678 sqlite3_db_config db DEFENSIVE 0 679 do_catchsql_test misc1-23.2 { 680 CREATE TABLE t1(x UNIQUE); 681 PRAGMA writable_schema=ON; 682 UPDATE sqlite_master SET sql='CREATE TABLE IF not EXISTS t(c)'; 683 BEGIN; 684 CREATE TABLE t2(x); 685 ROLLBACK; 686 DROP TABLE F; 687 } {1 {no such table: F}} 688 db close 689 sqlite3 db :memory: 690 sqlite3_db_config db DEFENSIVE 0 691 do_catchsql_test misc1-23.3 { 692 CREATE TABLE t1(x UNIQUE); 693 PRAGMA writable_schema=ON; 694 UPDATE sqlite_master SET sql='CREATE table y(a TEXT, a TEXT)'; 695 BEGIN; 696 CREATE TABLE t2(y); 697 ROLLBACK; 698 DROP TABLE IF EXISTS t; 699 } {0 {}} 700 701 702 # At one point, running this would read one byte passed the end of a 703 # buffer, upsetting valgrind. 704 # 705 do_test misc1-24.0 { 706 list [catch { sqlite3_prepare_v2 db ! -1 dummy } msg] $msg 707 } {1 {(1) unrecognized token: "!"}} 708 709 # The following query (provided by Kostya Serebryany) used to take 25 710 # minutes to prepare. This has been speeded up to about 250 milliseconds. 711 # 712 do_catchsql_test misc1-25.0 { 713 SELECT-1 UNION SELECT 5 UNION SELECT 0 UNION SElECT*from(SELECT-5) UNION SELECT*from(SELECT-0) UNION SELECT:SELECT-0 UNION SELECT-1 UNION SELECT 1 UNION SELECT 1 ORDER BY S in(WITH K AS(WITH K AS(select'CREINDERcharREADEVIRTUL5TABLECONFLICT !1 USIN'' MFtOR(b38q,eWITH K AS(selectCREATe TABLE t0(a,b,c,d,e, PRIMARY KEY(a,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,b,c,d,c,a,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d'CEIl,k'',ab, g, a,b,o11b, i'nEX/charREDE IVT LR!VABLt5SG',N ,N in rement,l_vacuum,M&U,'te3(''5l' a,bB,b,l*e)SELECT:SELECT, *,*,*from(( SELECT 714 $group,:conc ap0,1)fro,(select"",:PBAG,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,c,d,c,c,a,a,b,d,d,c,a,b,b,c,d,c,a,b,e,e,d,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d, foreign_keysc,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,a,b,d,d,c,a,b,b,c,d,c,a,b,e,e,d,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,c,d,c,a,b,d,d,c,a,a,b,d,d,c,a,b,b,c,d,c,a,b,e,e,d,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,a,b,d,d,c,a,b,b,c,d,c,a,b,e,e,d,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,c,a,b,b,c,d,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,d,c,e,d,d,c,a,b,b,c,c,a,b,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,bb,b,E,d,c,d,c,b,c,d,c,d,c,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,a,b,c,e,d,d,c,a,b,b,c,d,d,c,a,b,c,e,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,c,d,c,a,b,d,d,c,a,a,b,d,d,c,a,b,b,c,d,c,a,b,e,e,d,b,c,d,c,a,b,b,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,c,a,b,c,e,d,d,c,a,b,b,c,d,c,d,c,a,b,c,e,c,d,c,a,b,b,c,d,MAato_aecSELEC,+?b," "O,"i","a",""b ,5 ))KEY)SELECT*FROM((k()reaC,k,K) eA,k '' )t ,K M); 715 } {1 {'k' is not a function}} 716 717 # 2017-09-17 718 # 719 # Sometimes sqlite3ExprListAppend() can be invoked on an ExprList that 720 # was obtained from sqlite3ExprListDup(). 721 # 722 do_execsql_test misc1-26.0 { 723 DROP TABLE IF EXISTS abc; 724 CREATE TABLE abc(a, b, c); 725 SELECT randomblob(min(max(coalesce(EXISTS (SELECT 1 FROM ( SELECT (SELECT 2147483647) NOT IN (SELECT 2147483649 UNION ALL SELECT DISTINCT -1) IN (SELECT 2147483649), 'fault', (SELECT ALL -1 INTERSECT SELECT 'experiments') IN (SELECT ALL 56.1 ORDER BY 'experiments' DESC) FROM (SELECT DISTINCT 2147483648, 'hardware' UNION ALL SELECT -2147483648, 'experiments' ORDER BY 2147483648 LIMIT 1 OFFSET 123456789.1234567899) GROUP BY (SELECT ALL 0 INTERSECT SELECT 'in') IN (SELECT DISTINCT 'experiments' ORDER BY zeroblob(1000) LIMIT 56.1 OFFSET -456) HAVING EXISTS (SELECT 'fault' EXCEPT SELECT DISTINCT 56.1) UNION SELECT 'The', 'The', 2147483649 UNION ALL SELECT DISTINCT 'hardware', 'first', 'experiments' ORDER BY 'hardware' LIMIT 123456789.1234567899 OFFSET -2147483647)) NOT IN (SELECT (SELECT DISTINCT (SELECT 'The') FROM abc ORDER BY EXISTS (SELECT -1 INTERSECT SELECT ALL NULL) ASC) IN (SELECT DISTINCT EXISTS (SELECT ALL 123456789.1234567899 ORDER BY 1 ASC, NULL DESC) FROM sqlite_master INTERSECT SELECT 456)), (SELECT ALL 'injection' UNION ALL SELECT ALL (SELECT DISTINCT 'first' UNION SELECT DISTINCT 'The') FROM (SELECT 456, 'in', 2147483649))),1), 500)), 'first', EXISTS (SELECT DISTINCT 456 FROM abc ORDER BY 'experiments' DESC) FROM abc; 726 } {} 727 728 # 2017-12-29 729 # 730 # The following behaviors (duplicate column names on an INSERT or UPDATE) 731 # are undocumented. These tests are added to ensure that historical behavior 732 # does not change accidentally. 733 # 734 # For duplication columns on an INSERT, the first value is used. 735 # For duplication columns on an UPDATE, the last value is used. 736 # 737 do_execsql_test misc1-27.0 { 738 CREATE TABLE dup1(a,b,c); 739 INSERT INTO dup1(a,b,c,a,b,c) VALUES(1,2,3,4,5,6); 740 SELECT a,b,c FROM dup1; 741 } {1 2 3} 742 do_execsql_test misc1-27.1 { 743 UPDATE dup1 SET a=7, b=8, c=9, a=10, b=11, c=12; 744 SELECT a,b,c FROM dup1; 745 } {10 11 12} 746 747 # 2018-12-20 748 # 749 # The Cursor.seekOp debugging value set incorrectly 750 # in OP_NotExists. 751 # 752 sqlite3 db :memory: 753 do_execsql_test misc1-28.0 { 754 CREATE TABLE t1(x); 755 CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1; 756 INSERT OR ABORT INTO t1 DEFAULT VALUES; 757 UPDATE OR REPLACE t1 SET x = 1; 758 PRAGMA integrity_check; 759 SELECT * FROM t1; 760 } {ok 1} 761 762 finish_test