xref: /sqlite-3.40.0/test/misc1.test (revision 7d44b22d)
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