10202b29eSdanielk1977# 2001 September 15. 2db5ed6d5Sdrh# 3db5ed6d5Sdrh# The author disclaims copyright to this source code. In place of 4db5ed6d5Sdrh# a legal notice, here is a blessing: 5db5ed6d5Sdrh# 6db5ed6d5Sdrh# May you do good and not evil. 7db5ed6d5Sdrh# May you find forgiveness for yourself and forgive others. 8db5ed6d5Sdrh# May you share freely, never taking more than you give. 9db5ed6d5Sdrh# 10db5ed6d5Sdrh#*********************************************************************** 11db5ed6d5Sdrh# This file implements regression tests for SQLite library. 12db5ed6d5Sdrh# 13db5ed6d5Sdrh# This file implements tests for miscellanous features that were 14db5ed6d5Sdrh# left out of other test files. 15db5ed6d5Sdrh# 16db5ed6d5Sdrh 17db5ed6d5Sdrhset testdir [file dirname $argv0] 18db5ed6d5Sdrhsource $testdir/tester.tcl 19db5ed6d5Sdrh 200202b29eSdanielk1977# Mimic the SQLite 2 collation type NUMERIC. 210202b29eSdanielk1977db collate numeric numeric_collate 220202b29eSdanielk1977proc numeric_collate {lhs rhs} { 230202b29eSdanielk1977 if {$lhs == $rhs} {return 0} 240202b29eSdanielk1977 return [expr ($lhs>$rhs)?1:-1] 250202b29eSdanielk1977} 260202b29eSdanielk1977 270202b29eSdanielk1977# Mimic the SQLite 2 collation type TEXT. 280202b29eSdanielk1977db collate text text_collate 290202b29eSdanielk1977proc numeric_collate {lhs rhs} { 300202b29eSdanielk1977 return [string compare $lhs $rhs] 310202b29eSdanielk1977} 320202b29eSdanielk1977 33db5ed6d5Sdrh# Test the creation and use of tables that have a large number 34db5ed6d5Sdrh# of columns. 35db5ed6d5Sdrh# 36db5ed6d5Sdrhdo_test misc1-1.1 { 37db5ed6d5Sdrh set cmd "CREATE TABLE manycol(x0 text" 38db5ed6d5Sdrh for {set i 1} {$i<=99} {incr i} { 39db5ed6d5Sdrh append cmd ",x$i text" 40db5ed6d5Sdrh } 41db5ed6d5Sdrh append cmd ")"; 42db5ed6d5Sdrh execsql $cmd 43db5ed6d5Sdrh set cmd "INSERT INTO manycol VALUES(0" 44db5ed6d5Sdrh for {set i 1} {$i<=99} {incr i} { 45db5ed6d5Sdrh append cmd ",$i" 46db5ed6d5Sdrh } 47db5ed6d5Sdrh append cmd ")"; 48db5ed6d5Sdrh execsql $cmd 49db5ed6d5Sdrh execsql "SELECT x99 FROM manycol" 50db5ed6d5Sdrh} 99 51db5ed6d5Sdrhdo_test misc1-1.2 { 52db5ed6d5Sdrh execsql {SELECT x0, x10, x25, x50, x75 FROM manycol} 53db5ed6d5Sdrh} {0 10 25 50 75} 54a9e99aeeSdrhdo_test misc1-1.3.1 { 55db5ed6d5Sdrh for {set j 100} {$j<=1000} {incr j 100} { 56db5ed6d5Sdrh set cmd "INSERT INTO manycol VALUES($j" 57db5ed6d5Sdrh for {set i 1} {$i<=99} {incr i} { 58db5ed6d5Sdrh append cmd ",[expr {$i+$j}]" 59db5ed6d5Sdrh } 60db5ed6d5Sdrh append cmd ")" 61db5ed6d5Sdrh execsql $cmd 62db5ed6d5Sdrh } 63a9e99aeeSdrh execsql {SELECT x50 FROM manycol ORDER BY x80+0} 64db5ed6d5Sdrh} {50 150 250 350 450 550 650 750 850 950 1050} 65a9e99aeeSdrhdo_test misc1-1.3.2 { 66a9e99aeeSdrh execsql {SELECT x50 FROM manycol ORDER BY x80} 67a9e99aeeSdrh} {1050 150 250 350 450 550 650 750 50 850 950} 68db5ed6d5Sdrhdo_test misc1-1.4 { 69db5ed6d5Sdrh execsql {SELECT x75 FROM manycol WHERE x50=350} 70db5ed6d5Sdrh} 375 71db5ed6d5Sdrhdo_test misc1-1.5 { 72db5ed6d5Sdrh execsql {SELECT x50 FROM manycol WHERE x99=599} 73db5ed6d5Sdrh} 550 74db5ed6d5Sdrhdo_test misc1-1.6 { 75db5ed6d5Sdrh execsql {CREATE INDEX manycol_idx1 ON manycol(x99)} 76db5ed6d5Sdrh execsql {SELECT x50 FROM manycol WHERE x99=899} 77db5ed6d5Sdrh} 850 78db5ed6d5Sdrhdo_test misc1-1.7 { 79db5ed6d5Sdrh execsql {SELECT count(*) FROM manycol} 80db5ed6d5Sdrh} 11 81db5ed6d5Sdrhdo_test misc1-1.8 { 82db5ed6d5Sdrh execsql {DELETE FROM manycol WHERE x98=1234} 83db5ed6d5Sdrh execsql {SELECT count(*) FROM manycol} 84db5ed6d5Sdrh} 11 85db5ed6d5Sdrhdo_test misc1-1.9 { 86db5ed6d5Sdrh execsql {DELETE FROM manycol WHERE x98=998} 87db5ed6d5Sdrh execsql {SELECT count(*) FROM manycol} 88db5ed6d5Sdrh} 10 89db5ed6d5Sdrhdo_test misc1-1.10 { 90db5ed6d5Sdrh execsql {DELETE FROM manycol WHERE x99=500} 91db5ed6d5Sdrh execsql {SELECT count(*) FROM manycol} 92db5ed6d5Sdrh} 10 93db5ed6d5Sdrhdo_test misc1-1.11 { 94db5ed6d5Sdrh execsql {DELETE FROM manycol WHERE x99=599} 95db5ed6d5Sdrh execsql {SELECT count(*) FROM manycol} 96db5ed6d5Sdrh} 9 97db5ed6d5Sdrh 98db5ed6d5Sdrh# Check GROUP BY expressions that name two or more columns. 99db5ed6d5Sdrh# 100db5ed6d5Sdrhdo_test misc1-2.1 { 101db5ed6d5Sdrh execsql { 102db5ed6d5Sdrh BEGIN TRANSACTION; 103db5ed6d5Sdrh CREATE TABLE agger(one text, two text, three text, four text); 104db5ed6d5Sdrh INSERT INTO agger VALUES(1, 'one', 'hello', 'yes'); 105db5ed6d5Sdrh INSERT INTO agger VALUES(2, 'two', 'howdy', 'no'); 106db5ed6d5Sdrh INSERT INTO agger VALUES(3, 'thr', 'howareya', 'yes'); 107db5ed6d5Sdrh INSERT INTO agger VALUES(4, 'two', 'lothere', 'yes'); 108db5ed6d5Sdrh INSERT INTO agger VALUES(5, 'one', 'atcha', 'yes'); 109db5ed6d5Sdrh INSERT INTO agger VALUES(6, 'two', 'hello', 'no'); 110db5ed6d5Sdrh COMMIT 111db5ed6d5Sdrh } 112db5ed6d5Sdrh execsql {SELECT count(*) FROM agger} 113db5ed6d5Sdrh} 6 114db5ed6d5Sdrhdo_test misc1-2.2 { 115db5ed6d5Sdrh execsql {SELECT sum(one), two, four FROM agger 116db5ed6d5Sdrh GROUP BY two, four ORDER BY sum(one) desc} 1173d1d95e6Sdrh} {8 two no 6 one yes 4 two yes 3 thr yes} 1186977fea8Sdrhdo_test misc1-2.3 { 1196977fea8Sdrh execsql {SELECT sum((one)), (two), (four) FROM agger 1206977fea8Sdrh GROUP BY (two), (four) ORDER BY sum(one) desc} 1213d1d95e6Sdrh} {8 two no 6 one yes 4 two yes 3 thr yes} 122db5ed6d5Sdrh 12397665873Sdrh# Here's a test for a bug found by Joel Lucsy. The code below 12497665873Sdrh# was causing an assertion failure. 12597665873Sdrh# 12697665873Sdrhdo_test misc1-3.1 { 12797665873Sdrh set r [execsql { 12897665873Sdrh CREATE TABLE t1(a); 12997665873Sdrh INSERT INTO t1 VALUES('hi'); 13097665873Sdrh PRAGMA full_column_names=on; 13197665873Sdrh SELECT rowid, * FROM t1; 13297665873Sdrh }] 13397665873Sdrh lindex $r 1 13497665873Sdrh} {hi} 13597665873Sdrh 1361e336b42Sdrh# Here's a test for yet another bug found by Joel Lucsy. The code 1371e336b42Sdrh# below was causing an assertion failure. 1381e336b42Sdrh# 1391e336b42Sdrhdo_test misc1-4.1 { 1401e336b42Sdrh execsql { 1411e336b42Sdrh BEGIN; 1421e336b42Sdrh CREATE TABLE t2(a); 1431e336b42Sdrh INSERT INTO t2 VALUES('This is a long string to use up a lot of disk -'); 1441e336b42Sdrh UPDATE t2 SET a=a||a||a||a; 1451e336b42Sdrh INSERT INTO t2 SELECT '1 - ' || a FROM t2; 1461e336b42Sdrh INSERT INTO t2 SELECT '2 - ' || a FROM t2; 1471e336b42Sdrh INSERT INTO t2 SELECT '3 - ' || a FROM t2; 1481e336b42Sdrh INSERT INTO t2 SELECT '4 - ' || a FROM t2; 1491e336b42Sdrh INSERT INTO t2 SELECT '5 - ' || a FROM t2; 1501e336b42Sdrh INSERT INTO t2 SELECT '6 - ' || a FROM t2; 1511e336b42Sdrh COMMIT; 1521e336b42Sdrh SELECT count(*) FROM t2; 1531e336b42Sdrh } 1541e336b42Sdrh} {64} 1551e336b42Sdrh 156094b2bbfSdrh# Make sure we actually see a semicolon or end-of-file in the SQL input 157094b2bbfSdrh# before executing a command. Thus if "WHERE" is misspelled on an UPDATE, 158094b2bbfSdrh# the user won't accidently update every record. 159094b2bbfSdrh# 160094b2bbfSdrhdo_test misc1-5.1 { 161094b2bbfSdrh catchsql { 162094b2bbfSdrh CREATE TABLE t3(a,b); 163094b2bbfSdrh INSERT INTO t3 VALUES(1,2); 164094b2bbfSdrh INSERT INTO t3 VALUES(3,4); 165094b2bbfSdrh UPDATE t3 SET a=0 WHEREwww b=2; 166094b2bbfSdrh } 167094b2bbfSdrh} {1 {near "WHEREwww": syntax error}} 168094b2bbfSdrhdo_test misc1-5.2 { 169094b2bbfSdrh execsql { 170094b2bbfSdrh SELECT * FROM t3 ORDER BY a; 171094b2bbfSdrh } 172094b2bbfSdrh} {1 2 3 4} 173094b2bbfSdrh 174f18543caSdrh# Certain keywords (especially non-standard keywords like "REPLACE") can 175f18543caSdrh# also be used as identifiers. The way this works in the parser is that 176f18543caSdrh# the parser first detects a syntax error, the error handling routine 177f18543caSdrh# sees that the special keyword caused the error, then replaces the keyword 178f18543caSdrh# with "ID" and tries again. 179f18543caSdrh# 180f18543caSdrh# Check the operation of this logic. 181f18543caSdrh# 182f18543caSdrhdo_test misc1-6.1 { 183f18543caSdrh catchsql { 184f18543caSdrh CREATE TABLE t4( 185f18543caSdrh abort, asc, begin, cluster, conflict, copy, delimiters, desc, end, 186f18543caSdrh explain, fail, ignore, key, offset, pragma, replace, temp, 187f18543caSdrh vacuum, view 188f18543caSdrh ); 189f18543caSdrh } 190f18543caSdrh} {0 {}} 191f18543caSdrhdo_test misc1-6.2 { 192f18543caSdrh catchsql { 193f18543caSdrh INSERT INTO t4 194f18543caSdrh VALUES(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19); 195f18543caSdrh } 196f18543caSdrh} {0 {}} 197f18543caSdrhdo_test misc1-6.3 { 198f18543caSdrh execsql { 199f18543caSdrh SELECT * FROM t4 200f18543caSdrh } 201f18543caSdrh} {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19} 202f18543caSdrhdo_test misc1-6.4 { 203f18543caSdrh execsql { 204f18543caSdrh SELECT abort+asc,max(key,pragma,temp) FROM t4 205f18543caSdrh } 206f18543caSdrh} {3 17} 207f18543caSdrh 2082e392e2cSdrh# Test for multi-column primary keys, and for multiple primary keys. 2092e392e2cSdrh# 2102e392e2cSdrhdo_test misc1-7.1 { 2112e392e2cSdrh catchsql { 2122e392e2cSdrh CREATE TABLE error1( 2132e392e2cSdrh a TYPE PRIMARY KEY, 2142e392e2cSdrh b TYPE PRIMARY KEY 2152e392e2cSdrh ); 2162e392e2cSdrh } 2172e392e2cSdrh} {1 {table "error1" has more than one primary key}} 2182e392e2cSdrhdo_test misc1-7.2 { 2192e392e2cSdrh catchsql { 2202e392e2cSdrh CREATE TABLE error1( 2212e392e2cSdrh a INTEGER PRIMARY KEY, 2222e392e2cSdrh b TYPE PRIMARY KEY 2232e392e2cSdrh ); 2242e392e2cSdrh } 2252e392e2cSdrh} {1 {table "error1" has more than one primary key}} 2262e392e2cSdrhdo_test misc1-7.3 { 2272e392e2cSdrh execsql { 2282e392e2cSdrh CREATE TABLE t5(a,b,c,PRIMARY KEY(a,b)); 2292e392e2cSdrh INSERT INTO t5 VALUES(1,2,3); 2302e392e2cSdrh SELECT * FROM t5 ORDER BY a; 2312e392e2cSdrh } 2322e392e2cSdrh} {1 2 3} 2332e392e2cSdrhdo_test misc1-7.4 { 2342e392e2cSdrh catchsql { 2352e392e2cSdrh INSERT INTO t5 VALUES(1,2,4); 2362e392e2cSdrh } 237f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5.a, t5.b}} 2382e392e2cSdrhdo_test misc1-7.5 { 2392e392e2cSdrh catchsql { 2402e392e2cSdrh INSERT INTO t5 VALUES(0,2,4); 2412e392e2cSdrh } 2422e392e2cSdrh} {0 {}} 2432e392e2cSdrhdo_test misc1-7.6 { 2442e392e2cSdrh execsql { 2452e392e2cSdrh SELECT * FROM t5 ORDER BY a; 2462e392e2cSdrh } 2472e392e2cSdrh} {0 2 4 1 2 3} 2482e392e2cSdrh 249f5db2d3eSdrhdo_test misc1-8.1 { 250f5db2d3eSdrh catchsql { 251f5db2d3eSdrh SELECT *; 252f5db2d3eSdrh } 253f5db2d3eSdrh} {1 {no tables specified}} 254f5db2d3eSdrhdo_test misc1-8.2 { 255f5db2d3eSdrh catchsql { 256f5db2d3eSdrh SELECT t1.*; 257f5db2d3eSdrh } 258f5db2d3eSdrh} {1 {no such table: t1}} 259f5db2d3eSdrh 260d9e30930Sdrhexecsql { 261d9e30930Sdrh DROP TABLE t1; 262d9e30930Sdrh DROP TABLE t2; 263d9e30930Sdrh DROP TABLE t3; 264d9e30930Sdrh DROP TABLE t4; 265d9e30930Sdrh} 266d9e30930Sdrh 267fec19aadSdrh# 64-bit integers are represented exactly. 268d9e30930Sdrh# 269d9e30930Sdrhdo_test misc1-9.1 { 270d9e30930Sdrh catchsql { 271d9e30930Sdrh CREATE TABLE t1(a unique not null, b unique not null); 272fec19aadSdrh INSERT INTO t1 VALUES('a',1234567890123456789); 273fec19aadSdrh INSERT INTO t1 VALUES('b',1234567891123456789); 274fec19aadSdrh INSERT INTO t1 VALUES('c',1234567892123456789); 275d9e30930Sdrh SELECT * FROM t1; 276d9e30930Sdrh } 277fec19aadSdrh} {0 {a 1234567890123456789 b 1234567891123456789 c 1234567892123456789}} 278d9e30930Sdrh 27983dcb1adSdrh# A WHERE clause is not allowed to contain more than 99 terms. Check to 28083dcb1adSdrh# make sure this limit is enforced. 28183dcb1adSdrh# 2820aa74eddSdrh# 2005-07-16: There is no longer a limit on the number of terms in a 2830aa74eddSdrh# WHERE clause. But keep these tests just so that we have some tests 2840aa74eddSdrh# that use a large number of terms in the WHERE clause. 2850aa74eddSdrh# 28683dcb1adSdrhdo_test misc1-10.0 { 28783dcb1adSdrh execsql {SELECT count(*) FROM manycol} 28883dcb1adSdrh} {9} 28983dcb1adSdrhdo_test misc1-10.1 { 29083dcb1adSdrh set ::where {WHERE x0>=0} 29183dcb1adSdrh for {set i 1} {$i<=99} {incr i} { 29283dcb1adSdrh append ::where " AND x$i<>0" 29383dcb1adSdrh } 29483dcb1adSdrh catchsql "SELECT count(*) FROM manycol $::where" 29583dcb1adSdrh} {0 9} 29683dcb1adSdrhdo_test misc1-10.2 { 29783dcb1adSdrh catchsql "SELECT count(*) FROM manycol $::where AND rowid>0" 2980aa74eddSdrh} {0 9} 29983dcb1adSdrhdo_test misc1-10.3 { 30083dcb1adSdrh regsub "x0>=0" $::where "x0=0" ::where 30183dcb1adSdrh catchsql "DELETE FROM manycol $::where" 30283dcb1adSdrh} {0 {}} 30383dcb1adSdrhdo_test misc1-10.4 { 30483dcb1adSdrh execsql {SELECT count(*) FROM manycol} 30583dcb1adSdrh} {8} 30683dcb1adSdrhdo_test misc1-10.5 { 30783dcb1adSdrh catchsql "DELETE FROM manycol $::where AND rowid>0" 3080aa74eddSdrh} {0 {}} 30983dcb1adSdrhdo_test misc1-10.6 { 31083dcb1adSdrh execsql {SELECT x1 FROM manycol WHERE x0=100} 31183dcb1adSdrh} {101} 31283dcb1adSdrhdo_test misc1-10.7 { 31383dcb1adSdrh regsub "x0=0" $::where "x0=100" ::where 31483dcb1adSdrh catchsql "UPDATE manycol SET x1=x1+1 $::where" 31583dcb1adSdrh} {0 {}} 31683dcb1adSdrhdo_test misc1-10.8 { 31783dcb1adSdrh execsql {SELECT x1 FROM manycol WHERE x0=100} 3188df447f0Sdrh} {102} 31983dcb1adSdrhdo_test misc1-10.9 { 32083dcb1adSdrh catchsql "UPDATE manycol SET x1=x1+1 $::where AND rowid>0" 3210aa74eddSdrh} {0 {}} 32283dcb1adSdrhdo_test misc1-10.10 { 32383dcb1adSdrh execsql {SELECT x1 FROM manycol WHERE x0=100} 3248df447f0Sdrh} {103} 32583dcb1adSdrh 32692ed08a9Sdrh# Make sure the initialization works even if a database is opened while 32792ed08a9Sdrh# another process has the database locked. 32892ed08a9Sdrh# 3290de0bb33Sdanielk1977# Update for v3: The BEGIN doesn't lock the database so the schema is read 3300de0bb33Sdanielk1977# and the SELECT returns successfully. 33192ed08a9Sdrhdo_test misc1-11.1 { 33292ed08a9Sdrh execsql {BEGIN} 3331d850a72Sdanielk1977 execsql {UPDATE t1 SET a=0 WHERE 0} 334ef4ac8f9Sdrh sqlite3 db2 test.db 33592ed08a9Sdrh set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg] 33692ed08a9Sdrh lappend rc $msg 3370de0bb33Sdanielk1977# v2 result: {1 {database is locked}} 3380de0bb33Sdanielk1977} {0 3} 33992ed08a9Sdrhdo_test misc1-11.2 { 34092ed08a9Sdrh execsql {COMMIT} 34192ed08a9Sdrh set rc [catch {db2 eval {SELECT count(*) FROM t1}} msg] 34292ed08a9Sdrh db2 close 34392ed08a9Sdrh lappend rc $msg 34492ed08a9Sdrh} {0 3} 34592ed08a9Sdrh 346310ae7beSdrh# Make sure string comparisons really do compare strings in format4+. 347310ae7beSdrh# Similar tests in the format3.test file show that for format3 and earlier 348310ae7beSdrh# all comparisions where numeric if either operand looked like a number. 349310ae7beSdrh# 350310ae7beSdrhdo_test misc1-12.1 { 351310ae7beSdrh execsql {SELECT '0'=='0.0'} 3525f6a87b3Sdrh} {0} 353310ae7beSdrhdo_test misc1-12.2 { 354310ae7beSdrh execsql {SELECT '0'==0.0} 3555f6a87b3Sdrh} {0} 356310ae7beSdrhdo_test misc1-12.3 { 357310ae7beSdrh execsql {SELECT '12345678901234567890'=='12345678901234567891'} 358310ae7beSdrh} {0} 359310ae7beSdrhdo_test misc1-12.4 { 360310ae7beSdrh execsql { 361310ae7beSdrh CREATE TABLE t6(a INT UNIQUE, b TEXT UNIQUE); 362310ae7beSdrh INSERT INTO t6 VALUES('0','0.0'); 363310ae7beSdrh SELECT * FROM t6; 364310ae7beSdrh } 365310ae7beSdrh} {0 0.0} 3663bdca9c9Sdanielk1977ifcapable conflict { 367310ae7beSdrh do_test misc1-12.5 { 368310ae7beSdrh execsql { 369310ae7beSdrh INSERT OR IGNORE INTO t6 VALUES(0.0,'x'); 370310ae7beSdrh SELECT * FROM t6; 371310ae7beSdrh } 372310ae7beSdrh } {0 0.0} 373310ae7beSdrh do_test misc1-12.6 { 374310ae7beSdrh execsql { 375310ae7beSdrh INSERT OR IGNORE INTO t6 VALUES('y',0); 376310ae7beSdrh SELECT * FROM t6; 377310ae7beSdrh } 378310ae7beSdrh } {0 0.0 y 0} 3793bdca9c9Sdanielk1977} 380310ae7beSdrhdo_test misc1-12.7 { 381310ae7beSdrh execsql { 382310ae7beSdrh CREATE TABLE t7(x INTEGER, y TEXT, z); 383310ae7beSdrh INSERT INTO t7 VALUES(0,0,1); 384310ae7beSdrh INSERT INTO t7 VALUES(0.0,0,2); 385310ae7beSdrh INSERT INTO t7 VALUES(0,0.0,3); 386310ae7beSdrh INSERT INTO t7 VALUES(0.0,0.0,4); 387310ae7beSdrh SELECT DISTINCT x, y FROM t7 ORDER BY z; 388310ae7beSdrh } 389310ae7beSdrh} {0 0 0 0.0} 390f04d5081Sdrhdo_test misc1-12.8 { 391f04d5081Sdrh execsql { 392f04d5081Sdrh SELECT min(z), max(z), count(z) FROM t7 GROUP BY x ORDER BY 1; 393f04d5081Sdrh } 394f04d5081Sdrh} {1 4 4} 395f04d5081Sdrhdo_test misc1-12.9 { 396f04d5081Sdrh execsql { 397f04d5081Sdrh SELECT min(z), max(z), count(z) FROM t7 GROUP BY y ORDER BY 1; 398f04d5081Sdrh } 399f04d5081Sdrh} {1 2 2 3 4 2} 400fcb78a49Sdrh 401fcb78a49Sdrh# This used to be an error. But we changed the code so that arbitrary 402fcb78a49Sdrh# identifiers can be used as a collating sequence. Collation is by text 403fcb78a49Sdrh# if the identifier contains "text", "blob", or "clob" and is numeric 404fcb78a49Sdrh# otherwise. 4050202b29eSdanielk1977# 4060202b29eSdanielk1977# Update: In v3, it is an error again. 4070202b29eSdanielk1977# 4080202b29eSdanielk1977#do_test misc1-12.10 { 4090202b29eSdanielk1977# catchsql { 4100202b29eSdanielk1977# SELECT * FROM t6 ORDER BY a COLLATE unknown; 4110202b29eSdanielk1977# } 4128df447f0Sdrh#} {0 {0 0 y 0}} 413f04d5081Sdrhdo_test misc1-12.11 { 414f04d5081Sdrh execsql { 415f04d5081Sdrh CREATE TABLE t8(x TEXT COLLATE numeric, y INTEGER COLLATE text, z); 416f04d5081Sdrh INSERT INTO t8 VALUES(0,0,1); 417f04d5081Sdrh INSERT INTO t8 VALUES(0.0,0,2); 418f04d5081Sdrh INSERT INTO t8 VALUES(0,0.0,3); 419f04d5081Sdrh INSERT INTO t8 VALUES(0.0,0.0,4); 420f04d5081Sdrh SELECT DISTINCT x, y FROM t8 ORDER BY z; 421f04d5081Sdrh } 422fec19aadSdrh} {0 0 0.0 0} 423f04d5081Sdrhdo_test misc1-12.12 { 424f04d5081Sdrh execsql { 425f04d5081Sdrh SELECT min(z), max(z), count(z) FROM t8 GROUP BY x ORDER BY 1; 426f04d5081Sdrh } 427fec19aadSdrh} {1 3 2 2 4 2} 428f04d5081Sdrhdo_test misc1-12.13 { 429f04d5081Sdrh execsql { 430f04d5081Sdrh SELECT min(z), max(z), count(z) FROM t8 GROUP BY y ORDER BY 1; 431f04d5081Sdrh } 432fec19aadSdrh} {1 4 4} 433f04d5081Sdrh 4343e56c04cSdrh# There was a problem with realloc() in the OP_MemStore operation of 4353e56c04cSdrh# the VDBE. A buffer was being reallocated but some pointers into 4363e56c04cSdrh# the old copy of the buffer were not being moved over to the new copy. 4373e56c04cSdrh# The following code tests for the problem. 4383e56c04cSdrh# 4393e8c37e7Sdanielk1977ifcapable subquery { 4403e56c04cSdrh do_test misc1-13.1 { 4413e56c04cSdrh execsql { 4423e56c04cSdrh CREATE TABLE t9(x,y); 4433e56c04cSdrh INSERT INTO t9 VALUES('one',1); 4443e56c04cSdrh INSERT INTO t9 VALUES('two',2); 4453e56c04cSdrh INSERT INTO t9 VALUES('three',3); 4463e56c04cSdrh INSERT INTO t9 VALUES('four',4); 4473e56c04cSdrh INSERT INTO t9 VALUES('five',5); 4483e56c04cSdrh INSERT INTO t9 VALUES('six',6); 4493e56c04cSdrh INSERT INTO t9 VALUES('seven',7); 4503e56c04cSdrh INSERT INTO t9 VALUES('eight',8); 4513e56c04cSdrh INSERT INTO t9 VALUES('nine',9); 4523e56c04cSdrh INSERT INTO t9 VALUES('ten',10); 4533e56c04cSdrh INSERT INTO t9 VALUES('eleven',11); 4543e56c04cSdrh SELECT y FROM t9 4553e56c04cSdrh WHERE x=(SELECT x FROM t9 WHERE y=1) 4563e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=2) 4573e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=3) 4583e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=4) 4593e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=5) 4603e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=6) 4613e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=7) 4623e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=8) 4633e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=9) 4643e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=10) 4653e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=11) 4663e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=12) 4673e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=13) 4683e56c04cSdrh OR x=(SELECT x FROM t9 WHERE y=14) 4693e56c04cSdrh ; 4703e56c04cSdrh } 4713e56c04cSdrh } {1 2 3 4 5 6 7 8 9 10 11} 4723e8c37e7Sdanielk1977} 473310ae7beSdrh 474c5484654Smistachkin# 475c5484654Smistachkin# The following tests can only work if the current SQLite VFS has the concept 476c5484654Smistachkin# of a current directory. 477c5484654Smistachkin# 478c5484654Smistachkinifcapable curdir { 4793e7a6096Sdrh# Make sure a database connection still works after changing the 4803e7a6096Sdrh# working directory. 4813e7a6096Sdrh# 4824da30f88Sdanif {[atomic_batch_write test.db]==0} { 4833e7a6096Sdrh do_test misc1-14.1 { 4843e7a6096Sdrh file mkdir tempdir 4853e7a6096Sdrh cd tempdir 4863e7a6096Sdrh execsql {BEGIN} 4873e7a6096Sdrh file exists ./test.db-journal 4883e7a6096Sdrh } {0} 489ba726f49Sdrh do_test misc1-14.2a { 490ba726f49Sdrh execsql {UPDATE t1 SET a=a||'x' WHERE 0} 491ba726f49Sdrh file exists ../test.db-journal 492ba726f49Sdrh } {0} 493ba726f49Sdrh do_test misc1-14.2b { 494ba726f49Sdrh execsql {UPDATE t1 SET a=a||'y' WHERE 1} 4953e7a6096Sdrh file exists ../test.db-journal 4963e7a6096Sdrh } {1} 4973e7a6096Sdrh do_test misc1-14.3 { 4983e7a6096Sdrh cd .. 499fda06befSmistachkin forcedelete tempdir 5003e7a6096Sdrh execsql {COMMIT} 5013e7a6096Sdrh file exists ./test.db-journal 5023e7a6096Sdrh } {0} 503c5484654Smistachkin} 5044da30f88Sdan} 5053e7a6096Sdrh 50617e9e29dSdrh# A failed create table should not leave the table in the internal 50717e9e29dSdrh# data structures. Ticket #238. 50817e9e29dSdrh# 509f14fd038Sdrhdo_test misc1-15.1.1 { 51017e9e29dSdrh catchsql { 51117e9e29dSdrh CREATE TABLE t10 AS SELECT c1; 51217e9e29dSdrh } 51317e9e29dSdrh} {1 {no such column: c1}} 514f14fd038Sdrhdo_test misc1-15.1.2 { 515f14fd038Sdrh catchsql { 516f14fd038Sdrh CREATE TABLE t10 AS SELECT t9.c1; 517f14fd038Sdrh } 518f14fd038Sdrh} {1 {no such column: t9.c1}} 519f14fd038Sdrhdo_test misc1-15.1.3 { 520f14fd038Sdrh catchsql { 521f14fd038Sdrh CREATE TABLE t10 AS SELECT main.t9.c1; 522f14fd038Sdrh } 523f14fd038Sdrh} {1 {no such column: main.t9.c1}} 52417e9e29dSdrhdo_test misc1-15.2 { 52517e9e29dSdrh catchsql { 52617e9e29dSdrh CREATE TABLE t10 AS SELECT 1; 52717e9e29dSdrh } 52817e9e29dSdrh # The bug in ticket #238 causes the statement above to fail with 52917e9e29dSdrh # the error "table t10 alread exists" 53017e9e29dSdrh} {0 {}} 5313e7a6096Sdrh 532e0194f2bSdrh# Test for memory leaks when a CREATE TABLE containing a primary key 533e0194f2bSdrh# fails. Ticket #249. 534e0194f2bSdrh# 535e0194f2bSdrhdo_test misc1-16.1 { 536e0194f2bSdrh catchsql {SELECT name FROM sqlite_master LIMIT 1} 537e0194f2bSdrh catchsql { 538e0194f2bSdrh CREATE TABLE test(a integer, primary key(a)); 539e0194f2bSdrh } 540e0194f2bSdrh} {0 {}} 541e0194f2bSdrhdo_test misc1-16.2 { 542e0194f2bSdrh catchsql { 543e0194f2bSdrh CREATE TABLE test(a integer, primary key(a)); 544e0194f2bSdrh } 545e0194f2bSdrh} {1 {table test already exists}} 546e0194f2bSdrhdo_test misc1-16.3 { 547e0194f2bSdrh catchsql { 548e0194f2bSdrh CREATE TABLE test2(a text primary key, b text, primary key(a,b)); 549e0194f2bSdrh } 550e0194f2bSdrh} {1 {table "test2" has more than one primary key}} 551e0194f2bSdrhdo_test misc1-16.4 { 552e0194f2bSdrh execsql { 553e0194f2bSdrh INSERT INTO test VALUES(1); 554e0194f2bSdrh SELECT rowid, a FROM test; 555e0194f2bSdrh } 556e0194f2bSdrh} {1 1} 557e0194f2bSdrhdo_test misc1-16.5 { 558e0194f2bSdrh execsql { 559e0194f2bSdrh INSERT INTO test VALUES(5); 560e0194f2bSdrh SELECT rowid, a FROM test; 561e0194f2bSdrh } 562e0194f2bSdrh} {1 1 5 5} 563e0194f2bSdrhdo_test misc1-16.6 { 564e0194f2bSdrh execsql { 565e0194f2bSdrh INSERT INTO test VALUES(NULL); 566e0194f2bSdrh SELECT rowid, a FROM test; 567e0194f2bSdrh } 568e0194f2bSdrh} {1 1 5 5 6 6} 569e0194f2bSdrh 57053c0f748Sdanielk1977ifcapable trigger&&tempdb { 5714312db55Sdrh# Ticket #333: Temp triggers that modify persistent tables. 5724312db55Sdrh# 5734312db55Sdrhdo_test misc1-17.1 { 5744312db55Sdrh execsql { 5754312db55Sdrh BEGIN; 5764312db55Sdrh CREATE TABLE RealTable(TestID INTEGER PRIMARY KEY, TestString TEXT); 5774312db55Sdrh CREATE TEMP TABLE TempTable(TestID INTEGER PRIMARY KEY, TestString TEXT); 5784312db55Sdrh CREATE TEMP TRIGGER trigTest_1 AFTER UPDATE ON TempTable BEGIN 5794312db55Sdrh INSERT INTO RealTable(TestString) 5804312db55Sdrh SELECT new.TestString FROM TempTable LIMIT 1; 5814312db55Sdrh END; 5824312db55Sdrh INSERT INTO TempTable(TestString) VALUES ('1'); 5834312db55Sdrh INSERT INTO TempTable(TestString) VALUES ('2'); 584e61b9f4fSdanielk1977 UPDATE TempTable SET TestString = TestString + 1 WHERE TestID=1 OR TestId=2; 5854312db55Sdrh COMMIT; 5864312db55Sdrh SELECT TestString FROM RealTable ORDER BY 1; 5874312db55Sdrh } 5888df447f0Sdrh} {2 3} 589798da52cSdrh} 590e0194f2bSdrh 591f9cb7f58Sdrhdo_test misc1-18.1 { 592f9cb7f58Sdrh set n [sqlite3_sleep 100] 593f9cb7f58Sdrh expr {$n>=100} 594f9cb7f58Sdrh} {1} 595f9cb7f58Sdrh 596c7407524Sdrh# 2014-01-10: In a CREATE TABLE AS, if one or more of the column names 597c7407524Sdrh# are an empty string, that is still OK. 598c7407524Sdrh# 599c7407524Sdrhdo_execsql_test misc1-19.1 { 600c7407524Sdrh CREATE TABLE t19 AS SELECT 1, 2 AS '', 3; 601c7407524Sdrh SELECT * FROM t19; 602c7407524Sdrh} {1 2 3} 603c7407524Sdrhdo_execsql_test misc1-19.2 { 604c7407524Sdrh CREATE TABLE t19b AS SELECT 4 AS '', 5 AS '', 6 AS ''; 605c7407524Sdrh SELECT * FROM t19b; 606c7407524Sdrh} {4 5 6} 607c7407524Sdrh 608f058b9c4Sdrh# 2015-05-20: CREATE TABLE AS should not store INT value is a TEXT 609f058b9c4Sdrh# column. 610f058b9c4Sdrh# 611f058b9c4Sdrhdo_execsql_test misc1-19.3 { 612f058b9c4Sdrh CREATE TABLE t19c(x TEXT); 613f058b9c4Sdrh CREATE TABLE t19d AS SELECT * FROM t19c UNION ALL SELECT 1234; 614f058b9c4Sdrh SELECT x, typeof(x) FROM t19d; 615f058b9c4Sdrh} {1234 text} 616f058b9c4Sdrh 617c007f61bSdrh# 2014-05-16: Tests for the SQLITE_TESTCTRL_FAULT_INSTALL feature. 618c007f61bSdrh# 619c007f61bSdrhunset -nocomplain fault_callbacks 620c007f61bSdrhset fault_callbacks {} 621c007f61bSdrhproc fault_callback {n} { 622c007f61bSdrh lappend ::fault_callbacks $n 623c007f61bSdrh return 0 624c007f61bSdrh} 625c007f61bSdrhdo_test misc1-19.1 { 626c007f61bSdrh sqlite3_test_control_fault_install fault_callback 627c007f61bSdrh set fault_callbacks 628c007f61bSdrh} {0} 629c007f61bSdrhdo_test misc1-19.2 { 630c007f61bSdrh sqlite3_test_control_fault_install 631c007f61bSdrh set fault_callbacks 632c007f61bSdrh} {0} 633c7407524Sdrh 634a58d4a96Sdrh# 2015-01-26: Valgrind-detected over-read. 635a58d4a96Sdrh# Reported on [email protected] by Michal Zalewski. Found by afl-fuzz 636a58d4a96Sdrh# presumably. 637a58d4a96Sdrh# 638a58d4a96Sdrhdo_execsql_test misc1-20.1 { 639a58d4a96Sdrh CREATE TABLE t0(x INTEGER DEFAULT(0==0) NOT NULL); 640a58d4a96Sdrh REPLACE INTO t0(x) VALUES(''); 641a58d4a96Sdrh SELECT rowid, quote(x) FROM t0; 642a58d4a96Sdrh} {1 ''} 643a58d4a96Sdrh 64474893a4cSdrh# 2015-03-22: NULL pointer dereference after a syntax error 64574893a4cSdrh# 64674893a4cSdrhdo_catchsql_test misc1-21.1 { 64774893a4cSdrh select''like''like''like#0; 64874893a4cSdrh} {1 {near "#0": syntax error}} 64974893a4cSdrhdo_catchsql_test misc1-21.2 { 65074893a4cSdrh VALUES(0,0x0MATCH#0; 65174893a4cSdrh} {1 {near ";": syntax error}} 65274893a4cSdrh 6530ec68f84Sdrh# 2015-04-15 6540ec68f84Sdrhdo_execsql_test misc1-22.1 { 655*7d44b22dSdrh SELECT ''+3 FROM (SELECT ''+5); 6560ec68f84Sdrh} {3} 6570ec68f84Sdrh 658d0c73053Sdrh# 2015-04-19: NULL pointer dereference on a corrupt schema 659d0c73053Sdrh# 66033c59ecaSdrhdb close 66133c59ecaSdrhsqlite3 db :memory: 6626ab91a7aSdrhsqlite3_db_config db DEFENSIVE 0 663d0c73053Sdrhdo_execsql_test misc1-23.1 { 664d0c73053Sdrh CREATE TABLE t1(x); 665d0c73053Sdrh PRAGMA writable_schema=ON; 666d0c73053Sdrh UPDATE sqlite_master SET sql='CREATE table t(d CHECK(T(#0)'; 667d0c73053Sdrh BEGIN; 668d0c73053Sdrh CREATE TABLE t2(y); 669d0c73053Sdrh ROLLBACK; 670d0c73053Sdrh DROP TABLE IF EXISTS t3; 671d0c73053Sdrh} {} 672d0c73053Sdrh 67333c59ecaSdrh# 2015-04-19: Faulty assert() statement 67433c59ecaSdrh# 67533c59ecaSdrhdb close 67633c59ecaSdrhdatabase_may_be_corrupt 67733c59ecaSdrhsqlite3 db :memory: 6786ab91a7aSdrhsqlite3_db_config db DEFENSIVE 0 67933c59ecaSdrhdo_catchsql_test misc1-23.2 { 68033c59ecaSdrh CREATE TABLE t1(x UNIQUE); 68133c59ecaSdrh PRAGMA writable_schema=ON; 68233c59ecaSdrh UPDATE sqlite_master SET sql='CREATE TABLE IF not EXISTS t(c)'; 68333c59ecaSdrh BEGIN; 68433c59ecaSdrh CREATE TABLE t2(x); 68533c59ecaSdrh ROLLBACK; 68633c59ecaSdrh DROP TABLE F; 68733c59ecaSdrh} {1 {no such table: F}} 6885f1d2fa4Sdrhdb close 6895f1d2fa4Sdrhsqlite3 db :memory: 6906ab91a7aSdrhsqlite3_db_config db DEFENSIVE 0 6915f1d2fa4Sdrhdo_catchsql_test misc1-23.3 { 6925f1d2fa4Sdrh CREATE TABLE t1(x UNIQUE); 6935f1d2fa4Sdrh PRAGMA writable_schema=ON; 6945f1d2fa4Sdrh UPDATE sqlite_master SET sql='CREATE table y(a TEXT, a TEXT)'; 6955f1d2fa4Sdrh BEGIN; 6965f1d2fa4Sdrh CREATE TABLE t2(y); 6975f1d2fa4Sdrh ROLLBACK; 6985f1d2fa4Sdrh DROP TABLE IF EXISTS t; 6995f1d2fa4Sdrh} {0 {}} 70033c59ecaSdrh 701584390e8Sdan 702584390e8Sdan# At one point, running this would read one byte passed the end of a 703584390e8Sdan# buffer, upsetting valgrind. 704584390e8Sdan# 705584390e8Sdando_test misc1-24.0 { 706584390e8Sdan list [catch { sqlite3_prepare_v2 db ! -1 dummy } msg] $msg 707b2bddbbcSdrh} {1 {(1) unrecognized token: "!"}} 708584390e8Sdan 70996ceaf86Sdrh# The following query (provided by Kostya Serebryany) used to take 25 71096ceaf86Sdrh# minutes to prepare. This has been speeded up to about 250 milliseconds. 71196ceaf86Sdrh# 71296ceaf86Sdrhdo_catchsql_test misc1-25.0 { 71396ceaf86SdrhSELECT-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 71496ceaf86Sdrh$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); 71520292310Sdrh} {1 {'k' is not a function}} 71696ceaf86Sdrh 71797258194Sdrh# 2017-09-17 71897258194Sdrh# 71997258194Sdrh# Sometimes sqlite3ExprListAppend() can be invoked on an ExprList that 72097258194Sdrh# was obtained from sqlite3ExprListDup(). 72197258194Sdrh# 72297258194Sdrhdo_execsql_test misc1-26.0 { 72397258194Sdrh DROP TABLE IF EXISTS abc; 72497258194Sdrh CREATE TABLE abc(a, b, c); 72597258194Sdrh 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; 72697258194Sdrh} {} 72796ceaf86Sdrh 728ee052a1cSdrh# 2017-12-29 729ee052a1cSdrh# 730ee052a1cSdrh# The following behaviors (duplicate column names on an INSERT or UPDATE) 731105c4b5cSdrh# are undocumented. <<--- Not so. There is a long-standing requirement 732105c4b5cSdrh# in lang_update.in to say that when the columns to be updated appear more 733105c4b5cSdrh# than once in an UPDATE statement that only the rightmost expression is used. 734105c4b5cSdrh# See e_update-1.6.* for the tests. This is unfortunate, since omitting 735105c4b5cSdrh# that requirement would greatly simplify the fix to the problem identified 736105c4b5cSdrh# by forum post https://sqlite.org/forum/info/16ca0e9f32c38567 737105c4b5cSdrh# 738105c4b5cSdrh# These tests are added to ensure that historical behavior 739ee052a1cSdrh# does not change accidentally. 740ee052a1cSdrh# 741ee052a1cSdrh# For duplication columns on an INSERT, the first value is used. 742ee052a1cSdrh# For duplication columns on an UPDATE, the last value is used. 743ee052a1cSdrh# 744ee052a1cSdrhdo_execsql_test misc1-27.0 { 745ee052a1cSdrh CREATE TABLE dup1(a,b,c); 746ee052a1cSdrh INSERT INTO dup1(a,b,c,a,b,c) VALUES(1,2,3,4,5,6); 747ee052a1cSdrh SELECT a,b,c FROM dup1; 748ee052a1cSdrh} {1 2 3} 749ee052a1cSdrhdo_execsql_test misc1-27.1 { 750ee052a1cSdrh UPDATE dup1 SET a=7, b=8, c=9, a=10, b=11, c=12; 751ee052a1cSdrh SELECT a,b,c FROM dup1; 752ee052a1cSdrh} {10 11 12} 753ee052a1cSdrh 75494f4f873Sdrh# 2018-12-20 75594f4f873Sdrh# 75694f4f873Sdrh# The Cursor.seekOp debugging value set incorrectly 75794f4f873Sdrh# in OP_NotExists. 75894f4f873Sdrh# 75994f4f873Sdrhsqlite3 db :memory: 76094f4f873Sdrhdo_execsql_test misc1-28.0 { 76194f4f873Sdrh CREATE TABLE t1(x); 76294f4f873Sdrh CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1; 76394f4f873Sdrh INSERT OR ABORT INTO t1 DEFAULT VALUES; 76494f4f873Sdrh UPDATE OR REPLACE t1 SET x = 1; 76594f4f873Sdrh PRAGMA integrity_check; 76694f4f873Sdrh SELECT * FROM t1; 76794f4f873Sdrh} {ok 1} 768ee052a1cSdrh 769db5ed6d5Sdrhfinish_test 770