AryaWu/sqlite
0
1# 2001 September 15.2#3# The author disclaims copyright to this source code. In place of4# 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 were14# left out of other test files.15#16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 20# Mimic the SQLite 2 collation type NUMERIC.21db collate numeric numeric_collate22proc 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.28db collate text text_collate29proc numeric_collate {lhs rhs} {30 return [string compare $lhs $rhs]31}32 33# Test the creation and use of tables that have a large number34# of columns.35#36do_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 $cmd43 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 $cmd49 execsql "SELECT x99 FROM manycol"50} 9951do_test misc1-1.2 {52 execsql {SELECT x0, x10, x25, x50, x75 FROM manycol}53} {0 10 25 50 75}54do_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 $cmd62 }63 execsql {SELECT x50 FROM manycol ORDER BY x80+0}64} {50 150 250 350 450 550 650 750 850 950 1050}65do_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}68do_test misc1-1.4 {69 execsql {SELECT x75 FROM manycol WHERE x50=350}70} 37571do_test misc1-1.5 {72 execsql {SELECT x50 FROM manycol WHERE x99=599}73} 55074do_test misc1-1.6 {75 execsql {CREATE INDEX manycol_idx1 ON manycol(x99)}76 execsql {SELECT x50 FROM manycol WHERE x99=899}77} 85078do_test misc1-1.7 {79 execsql {SELECT count(*) FROM manycol}80} 1181do_test misc1-1.8 {82 execsql {DELETE FROM manycol WHERE x98=1234}83 execsql {SELECT count(*) FROM manycol}84} 1185do_test misc1-1.9 {86 execsql {DELETE FROM manycol WHERE x98=998}87 execsql {SELECT count(*) FROM manycol}88} 1089do_test misc1-1.10 {90 execsql {DELETE FROM manycol WHERE x99=500}91 execsql {SELECT count(*) FROM manycol}92} 1093do_test misc1-1.11 {94 execsql {DELETE FROM manycol WHERE x99=599}95 execsql {SELECT count(*) FROM manycol}96} 997 98# Check GROUP BY expressions that name two or more columns.99#100do_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 COMMIT111 }112 execsql {SELECT count(*) FROM agger}113} 6114do_test misc1-2.2 {115 execsql {SELECT sum(one), two, four FROM agger116 GROUP BY two, four ORDER BY sum(one) desc}117} {8 two no 6 one yes 4 two yes 3 thr yes}118do_test misc1-2.3 {119 execsql {SELECT sum((one)), (two), (four) FROM agger120 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 below124# was causing an assertion failure.125#126do_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 1134} {hi}135 136# Here's a test for yet another bug found by Joel Lucsy. The code137# below was causing an assertion failure.138#139do_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 input157# before executing a command. Thus if "WHERE" is misspelled on an UPDATE,158# the user won't accidently update every record.159#160do_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}}168do_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") can175# also be used as identifiers. The way this works in the parser is that176# the parser first detects a syntax error, the error handling routine177# sees that the special keyword caused the error, then replaces the keyword178# with "ID" and tries again.179#180# Check the operation of this logic.181#182do_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, view188 );189 }190} {0 {}}191do_test misc1-6.2 {192 catchsql {193 INSERT INTO t4194 VALUES(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);195 }196} {0 {}}197do_test misc1-6.3 {198 execsql {199 SELECT * FROM t4200 }201} {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19}202do_test misc1-6.4 {203 execsql {204 SELECT abort+asc,max(key,pragma,temp) FROM t4205 }206} {3 17}207 208# Test for multi-column primary keys, and for multiple primary keys.209#210do_test misc1-7.1 {211 catchsql {212 CREATE TABLE error1(213 a TYPE PRIMARY KEY,214 b TYPE PRIMARY KEY215 );216 }217} {1 {table "error1" has more than one primary key}}218do_test misc1-7.2 {219 catchsql {220 CREATE TABLE error1(221 a INTEGER PRIMARY KEY,222 b TYPE PRIMARY KEY223 );224 }225} {1 {table "error1" has more than one primary key}}226do_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}233do_test misc1-7.4 {234 catchsql {235 INSERT INTO t5 VALUES(1,2,4);236 }237} {1 {UNIQUE constraint failed: t5.a, t5.b}}238do_test misc1-7.5 {239 catchsql {240 INSERT INTO t5 VALUES(0,2,4);241 }242} {0 {}}243do_test misc1-7.6 {244 execsql {245 SELECT * FROM t5 ORDER BY a;246 }247} {0 2 4 1 2 3}248 249do_test misc1-8.1 {250 catchsql {251 SELECT *;252 }253} {1 {no tables specified}}254do_test misc1-8.2 {255 catchsql {256 SELECT t1.*;257 }258} {1 {no such table: t1}}259 260execsql {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#269do_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 to280# make sure this limit is enforced.281#282# 2005-07-16: There is no longer a limit on the number of terms in a283# WHERE clause. But keep these tests just so that we have some tests284# that use a large number of terms in the WHERE clause.285#286do_test misc1-10.0 {287 execsql {SELECT count(*) FROM manycol}288} {9}289do_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}296do_test misc1-10.2 {297 catchsql "SELECT count(*) FROM manycol $::where AND rowid>0"298} {0 9}299do_test misc1-10.3 {300 regsub "x0>=0" $::where "x0=0" ::where301 catchsql "DELETE FROM manycol $::where"302} {0 {}}303do_test misc1-10.4 {304 execsql {SELECT count(*) FROM manycol}305} {8}306do_test misc1-10.5 {307 catchsql "DELETE FROM manycol $::where AND rowid>0"308} {0 {}}309do_test misc1-10.6 {310 execsql {SELECT x1 FROM manycol WHERE x0=100}311} {101}312do_test misc1-10.7 {313 regsub "x0=0" $::where "x0=100" ::where314 catchsql "UPDATE manycol SET x1=x1+1 $::where"315} {0 {}}316do_test misc1-10.8 {317 execsql {SELECT x1 FROM manycol WHERE x0=100}318} {102}319do_test misc1-10.9 {320 catchsql "UPDATE manycol SET x1=x1+1 $::where AND rowid>0"321} {0 {}}322do_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 while327# another process has the database locked.328#329# Update for v3: The BEGIN doesn't lock the database so the schema is read330# and the SELECT returns successfully.331do_test misc1-11.1 {332 execsql {BEGIN}333 execsql {UPDATE t1 SET a=0 WHERE 0}334 sqlite3 db2 test.db335 set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg]336 lappend rc $msg337# v2 result: {1 {database is locked}}338} {0 3}339do_test misc1-11.2 {340 execsql {COMMIT}341 set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg]342 db2 close343 lappend rc $msg344} {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 earlier348# all comparisions where numeric if either operand looked like a number.349#350do_test misc1-12.1 {351 execsql {SELECT '0'=='0.0'}352} {0}353do_test misc1-12.2 {354 execsql {SELECT '0'==0.0}355} {0}356do_test misc1-12.3 {357 execsql {SELECT '12345678901234567890'=='12345678901234567891'}358} {0}359do_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}366ifcapable 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}380do_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}390do_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}395do_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 arbitrary402# identifiers can be used as a collating sequence. Collation is by text403# if the identifier contains "text", "blob", or "clob" and is numeric404# 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}}413do_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}423do_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}428do_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 of435# 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#439ifcapable 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 t9455 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 concept476# of a current directory.477#478ifcapable curdir {479# Make sure a database connection still works after changing the480# working directory.481#482if {[atomic_batch_write test.db]==0} {483 do_test misc1-14.1 {484 file mkdir tempdir485 cd tempdir486 execsql {BEGIN}487 file exists ./test.db-journal488 } {0}489 do_test misc1-14.2a {490 execsql {UPDATE t1 SET a=a||'x' WHERE 0}491 file exists ../test.db-journal492 } {0}493 do_test misc1-14.2b {494 execsql {UPDATE t1 SET a=a||'y' WHERE 1}495 file exists ../test.db-journal496 } {1}497 do_test misc1-14.3 {498 cd ..499 forcedelete tempdir500 execsql {COMMIT}501 file exists ./test.db-journal502 } {0}503}504}505 506# A failed create table should not leave the table in the internal507# data structures. Ticket #238.508#509do_test misc1-15.1.1 {510 catchsql {511 CREATE TABLE t10 AS SELECT c1;512 }513} {1 {no such column: c1}}514do_test misc1-15.1.2 {515 catchsql {516 CREATE TABLE t10 AS SELECT t9.c1;517 }518} {1 {no such column: t9.c1}}519do_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}}524do_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 with529 # the error "table t10 alread exists"530} {0 {}}531 532# Test for memory leaks when a CREATE TABLE containing a primary key533# fails. Ticket #249.534#535do_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 {}}541do_test misc1-16.2 {542 catchsql {543 CREATE TABLE test(a integer, primary key(a));544 }545} {1 {table test already exists}}546do_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}}551do_test misc1-16.4 {552 execsql {553 INSERT INTO test VALUES(1);554 SELECT rowid, a FROM test;555 }556} {1 1}557do_test misc1-16.5 {558 execsql {559 INSERT INTO test VALUES(5);560 SELECT rowid, a FROM test;561 }562} {1 1 5 5}563do_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 570ifcapable trigger&&tempdb {571# Ticket #333: Temp triggers that modify persistent tables.572#573do_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 BEGIN579 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 591do_test misc1-18.1 {592 set n [sqlite3_sleep 100]593 expr {$n>=100}594} {1}595do_test misc1-18.2 {596 sqlite3_sleep -100597} {0}598 599# 2014-01-10: In a CREATE TABLE AS, if one or more of the column names600# are an empty string, that is still OK.601#602do_execsql_test misc1-19.1 {603 CREATE TABLE t19 AS SELECT 1, 2 AS '', 3;604 SELECT * FROM t19;605} {1 2 3}606do_execsql_test misc1-19.2 {607 CREATE TABLE t19b AS SELECT 4 AS '', 5 AS '', 6 AS '';608 SELECT * FROM t19b;609} {4 5 6}610 611# 2015-05-20: CREATE TABLE AS should not store INT value in a TEXT612# column.613#614# 2022-12-14: Change: The column is not TEXT if the AS SELECT is615# a compound with different types on each arm.616#617do_execsql_test misc1-19.3 {618 CREATE TABLE t19c(x TEXT);619 CREATE TABLE t19d AS SELECT * FROM t19c UNION ALL SELECT 1234;620 SELECT x, typeof(x) FROM t19d;621} {1234 integer}622 623# 2014-05-16: Tests for the SQLITE_TESTCTRL_FAULT_INSTALL feature.624#625unset -nocomplain fault_callbacks626set fault_callbacks {}627proc fault_callback {n} {628 lappend ::fault_callbacks $n629 return 0630}631do_test misc1-19.11 {632 sqlite3_test_control_fault_install fault_callback633 set fault_callbacks634} {0}635do_test misc1-19.12 {636 sqlite3_test_control_fault_install637 set fault_callbacks638} {0}639 640# 2015-01-26: Valgrind-detected over-read.641# Reported on sqlite-users@sqlite.org by Michal Zalewski. Found by afl-fuzz642# presumably.643#644do_execsql_test misc1-20.1 {645 CREATE TABLE t0(x INTEGER DEFAULT(0==0) NOT NULL);646 REPLACE INTO t0(x) VALUES('');647 SELECT rowid, quote(x) FROM t0;648} {1 ''}649 650# 2015-03-22: NULL pointer dereference after a syntax error651#652do_catchsql_test misc1-21.1 {653 select''like''like''like#0;654} {1 {near "#0": syntax error}}655do_catchsql_test misc1-21.2 {656 VALUES(0,0x0MATCH#0;657} {1 {unrecognized token: "0x0MATCH"}}658 659# 2015-04-15660do_execsql_test misc1-22.1 {661 SELECT ''+3 FROM (SELECT ''+5);662} {3}663 664# 2015-04-19: NULL pointer dereference on a corrupt schema665#666db close667sqlite3 db :memory:668sqlite3_db_config db DEFENSIVE 0669do_execsql_test misc1-23.1 {670 CREATE TABLE t1(x);671 PRAGMA writable_schema=ON;672 UPDATE sqlite_master SET sql='CREATE table t(d CHECK(T(#0)';673 BEGIN;674 CREATE TABLE t2(y);675 ROLLBACK;676 DROP TABLE IF EXISTS t3;677} {}678 679# 2015-04-19: Faulty assert() statement680#681db close682database_may_be_corrupt683sqlite3 db :memory:684sqlite3_db_config db DEFENSIVE 0685do_catchsql_test misc1-23.2 {686 CREATE TABLE t1(x UNIQUE);687 PRAGMA writable_schema=ON;688 UPDATE sqlite_master SET sql='CREATE TABLE IF not EXISTS t(c)';689 BEGIN;690 CREATE TABLE t2(x);691 ROLLBACK;692 DROP TABLE F;693} {1 {no such table: F}}694db close695sqlite3 db :memory:696sqlite3_db_config db DEFENSIVE 0697do_catchsql_test misc1-23.3 {698 CREATE TABLE t1(x UNIQUE);699 PRAGMA writable_schema=ON;700 UPDATE sqlite_master SET sql='CREATE table y(a TEXT, a TEXT)';701 BEGIN;702 CREATE TABLE t2(y);703 ROLLBACK;704 DROP TABLE IF EXISTS t;705} {0 {}}706 707 708# At one point, running this would read one byte passed the end of a 709# buffer, upsetting valgrind.710#711do_test misc1-24.0 {712 list [catch { sqlite3_prepare_v2 db ! -1 dummy } msg] $msg713} {1 {(1) unrecognized token: "!"}}714 715# The following query (provided by Kostya Serebryany) used to take 25716# minutes to prepare. This has been speeded up to about 250 milliseconds.717#718do_catchsql_test misc1-25.0 {719SELECT-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(( SELECT720$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);721} {1 {'k' is not a function}}722 723# 2017-09-17724#725# Sometimes sqlite3ExprListAppend() can be invoked on an ExprList that726# was obtained from sqlite3ExprListDup().727#728do_execsql_test misc1-26.0 {729 DROP TABLE IF EXISTS abc;730 CREATE TABLE abc(a, b, c);731 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;732} {}733 734# 2017-12-29735#736# The following behaviors (duplicate column names on an INSERT or UPDATE)737# are undocumented. <<--- Not so. There is a long-standing requirement738# in lang_update.in to say that when the columns to be updated appear more739# than once in an UPDATE statement that only the rightmost expression is used.740# See e_update-1.6.* for the tests. This is unfortunate, since omitting741# that requirement would greatly simplify the fix to the problem identified742# by forum post https://sqlite.org/forum/info/16ca0e9f32c38567743#744# These tests are added to ensure that historical behavior745# does not change accidentally.746#747# For duplication columns on an INSERT, the first value is used.748# For duplication columns on an UPDATE, the last value is used.749#750do_execsql_test misc1-27.0 {751 CREATE TABLE dup1(a,b,c);752 INSERT INTO dup1(a,b,c,a,b,c) VALUES(1,2,3,4,5,6);753 SELECT a,b,c FROM dup1;754} {1 2 3}755do_execsql_test misc1-27.1 {756 UPDATE dup1 SET a=7, b=8, c=9, a=10, b=11, c=12;757 SELECT a,b,c FROM dup1;758} {10 11 12}759 760# 2018-12-20761#762# The Cursor.seekOp debugging value set incorrectly763# in OP_NotExists.764#765sqlite3 db :memory:766do_execsql_test misc1-28.0 {767 CREATE TABLE t1(x);768 CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1;769 INSERT OR ABORT INTO t1 DEFAULT VALUES;770 UPDATE OR REPLACE t1 SET x = 1;771 PRAGMA integrity_check;772 SELECT * FROM t1;773} {ok 1}774 775finish_test776 