xref: /sqlite-3.40.0/test/misc3.test (revision 5b843aa0)
1acf4ac96Sdrh# 2003 December 17
2acf4ac96Sdrh#
3acf4ac96Sdrh# The author disclaims copyright to this source code.  In place of
4acf4ac96Sdrh# a legal notice, here is a blessing:
5acf4ac96Sdrh#
6acf4ac96Sdrh#    May you do good and not evil.
7acf4ac96Sdrh#    May you find forgiveness for yourself and forgive others.
8acf4ac96Sdrh#    May you share freely, never taking more than you give.
9acf4ac96Sdrh#
10acf4ac96Sdrh#***********************************************************************
11acf4ac96Sdrh# This file implements regression tests for SQLite library.
12acf4ac96Sdrh#
13acf4ac96Sdrh# This file implements tests for miscellanous features that were
14acf4ac96Sdrh# left out of other test files.
15acf4ac96Sdrh#
16dc70e4c3Sdrh# $Id: misc3.test,v 1.20 2009/05/06 00:49:01 drh Exp $
17acf4ac96Sdrh
18acf4ac96Sdrhset testdir [file dirname $argv0]
19acf4ac96Sdrhsource $testdir/tester.tcl
20acf4ac96Sdrh
21798da52cSdrhifcapable {integrityck} {
22acf4ac96Sdrh  # Ticket #529.  Make sure an ABORT does not damage the in-memory cache
23acf4ac96Sdrh  # that will be used by subsequent statements in the same transaction.
24acf4ac96Sdrh  #
25acf4ac96Sdrh  do_test misc3-1.1 {
26acf4ac96Sdrh    execsql {
27acf4ac96Sdrh      CREATE TABLE t1(a UNIQUE,b);
28acf4ac96Sdrh      INSERT INTO t1
29acf4ac96Sdrh        VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
30acf4ac96Sdrh      UPDATE t1 SET b=b||b;
31acf4ac96Sdrh      UPDATE t1 SET b=b||b;
32acf4ac96Sdrh      UPDATE t1 SET b=b||b;
33acf4ac96Sdrh      UPDATE t1 SET b=b||b;
34acf4ac96Sdrh      UPDATE t1 SET b=b||b;
35acf4ac96Sdrh      INSERT INTO t1 VALUES(2,'x');
36acf4ac96Sdrh      UPDATE t1 SET b=substr(b,1,500);
37acf4ac96Sdrh      BEGIN;
38acf4ac96Sdrh    }
39acf4ac96Sdrh    catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';}
40acf4ac96Sdrh    execsql {
41acf4ac96Sdrh      CREATE TABLE t2(x,y);
42acf4ac96Sdrh      COMMIT;
43acf4ac96Sdrh      PRAGMA integrity_check;
44acf4ac96Sdrh    }
45acf4ac96Sdrh  } ok
46798da52cSdrh}
47798da52cSdrhifcapable {integrityck} {
48acf4ac96Sdrh  do_test misc3-1.2 {
49acf4ac96Sdrh    execsql {
50acf4ac96Sdrh      DROP TABLE t1;
51acf4ac96Sdrh      DROP TABLE t2;
52798da52cSdrh    }
53798da52cSdrh    ifcapable {vacuum} {execsql VACUUM}
54798da52cSdrh    execsql {
55acf4ac96Sdrh      CREATE TABLE t1(a UNIQUE,b);
56acf4ac96Sdrh      INSERT INTO t1
57acf4ac96Sdrh      VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
58acf4ac96Sdrh      INSERT INTO t1 SELECT a+1, b||b FROM t1;
59acf4ac96Sdrh      INSERT INTO t1 SELECT a+2, b||b FROM t1;
60acf4ac96Sdrh      INSERT INTO t1 SELECT a+4, b FROM t1;
61acf4ac96Sdrh      INSERT INTO t1 SELECT a+8, b FROM t1;
62acf4ac96Sdrh      INSERT INTO t1 SELECT a+16, b FROM t1;
63acf4ac96Sdrh      INSERT INTO t1 SELECT a+32, b FROM t1;
64acf4ac96Sdrh      INSERT INTO t1 SELECT a+64, b FROM t1;
65acf4ac96Sdrh      BEGIN;
66acf4ac96Sdrh    }
67acf4ac96Sdrh    catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';}
68acf4ac96Sdrh    execsql {
69acf4ac96Sdrh      INSERT INTO t1 VALUES(200,'hello out there');
70acf4ac96Sdrh      COMMIT;
71acf4ac96Sdrh      PRAGMA integrity_check;
72acf4ac96Sdrh    }
73acf4ac96Sdrh  } ok
74798da52cSdrh}
75acf4ac96Sdrh
7693a5c6bdSdrh# Tests of the sqliteAtoF() function in util.c
7793a5c6bdSdrh#
7893a5c6bdSdrhdo_test misc3-2.1 {
7993a5c6bdSdrh  execsql {SELECT 2e-25*0.5e25}
8092febd92Sdrh} 1.0
8193a5c6bdSdrhdo_test misc3-2.2 {
8293a5c6bdSdrh  execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025}
8392febd92Sdrh} 1.0
8493a5c6bdSdrhdo_test misc3-2.3 {
8593a5c6bdSdrh  execsql {SELECT 000000000002e-0000000025*0.5e25}
8692febd92Sdrh} 1.0
8793a5c6bdSdrhdo_test misc3-2.4 {
8893a5c6bdSdrh  execsql {SELECT 2e-25*0.5e250}
8993a5c6bdSdrh} 1e+225
9093a5c6bdSdrhdo_test misc3-2.5 {
9193a5c6bdSdrh  execsql {SELECT 2.0e-250*0.5e25}
9293a5c6bdSdrh} 1e-225
9393a5c6bdSdrhdo_test misc3-2.6 {
9493a5c6bdSdrh  execsql {SELECT '-2.0e-127' * '-0.5e27'}
9593a5c6bdSdrh} 1e-100
9693a5c6bdSdrhdo_test misc3-2.7 {
9793a5c6bdSdrh  execsql {SELECT '+2.0e-127' * '-0.5e27'}
9893a5c6bdSdrh} -1e-100
9993a5c6bdSdrhdo_test misc3-2.8 {
10093a5c6bdSdrh  execsql {SELECT 2.0e-27 * '+0.5e+127'}
10193a5c6bdSdrh} 1e+100
10293a5c6bdSdrhdo_test misc3-2.9 {
10393a5c6bdSdrh  execsql {SELECT 2.0e-27 * '+0.000005e+132'}
10493a5c6bdSdrh} 1e+100
10593a5c6bdSdrh
106202b2df7Sdrh# Ticket #522.  Make sure integer overflow is handled properly in
107202b2df7Sdrh# indices.
108202b2df7Sdrh#
10940e016e4Sdrhintegrity_check misc3-3.1
110202b2df7Sdrhdo_test misc3-3.2 {
111202b2df7Sdrh  execsql {
112202b2df7Sdrh    CREATE TABLE t2(a INT UNIQUE);
113202b2df7Sdrh  }
11440e016e4Sdrh} {}
11540e016e4Sdrhintegrity_check misc3-3.2.1
116202b2df7Sdrhdo_test misc3-3.3 {
117202b2df7Sdrh  execsql {
118202b2df7Sdrh    INSERT INTO t2 VALUES(2147483648);
119202b2df7Sdrh  }
12040e016e4Sdrh} {}
12140e016e4Sdrhintegrity_check misc3-3.3.1
122202b2df7Sdrhdo_test misc3-3.4 {
123202b2df7Sdrh  execsql {
124202b2df7Sdrh    INSERT INTO t2 VALUES(-2147483649);
125202b2df7Sdrh  }
12640e016e4Sdrh} {}
12740e016e4Sdrhintegrity_check misc3-3.4.1
1289d4280d5Sdrhdo_test misc3-3.5 {
1299d4280d5Sdrh  execsql {
1309d4280d5Sdrh    INSERT INTO t2 VALUES(+2147483649);
1319d4280d5Sdrh  }
13240e016e4Sdrh} {}
13340e016e4Sdrhintegrity_check misc3-3.5.1
1349d4280d5Sdrhdo_test misc3-3.6 {
1359d4280d5Sdrh  execsql {
1369d4280d5Sdrh    INSERT INTO t2 VALUES(+2147483647);
1379d4280d5Sdrh    INSERT INTO t2 VALUES(-2147483648);
1389d4280d5Sdrh    INSERT INTO t2 VALUES(-2147483647);
1399d4280d5Sdrh    INSERT INTO t2 VALUES(2147483646);
1409d4280d5Sdrh    SELECT * FROM t2 ORDER BY a;
1419d4280d5Sdrh  }
1429d4280d5Sdrh} {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
1439d4280d5Sdrhdo_test misc3-3.7 {
1449d4280d5Sdrh  execsql {
1459d4280d5Sdrh    SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a;
1469d4280d5Sdrh  }
1479d4280d5Sdrh} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
1489d4280d5Sdrhdo_test misc3-3.8 {
1499d4280d5Sdrh  execsql {
1509d4280d5Sdrh    SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a;
1519d4280d5Sdrh  }
1529d4280d5Sdrh} {-2147483647 2147483646 2147483647 2147483648 2147483649}
1539d4280d5Sdrhdo_test misc3-3.9 {
1549d4280d5Sdrh  execsql {
1559d4280d5Sdrh    SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a;
1569d4280d5Sdrh  }
1579d4280d5Sdrh} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
1589d4280d5Sdrhdo_test misc3-3.10 {
1599d4280d5Sdrh  execsql {
1609d4280d5Sdrh    SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC;
1619d4280d5Sdrh  }
1629d4280d5Sdrh} {2147483648 2147483647 2147483646}
1639d4280d5Sdrhdo_test misc3-3.11 {
1649d4280d5Sdrh  execsql {
1659d4280d5Sdrh    SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC;
1669d4280d5Sdrh  }
1679d4280d5Sdrh} {2147483648 2147483647 2147483646}
1689d4280d5Sdrhdo_test misc3-3.12 {
1699d4280d5Sdrh  execsql {
1709d4280d5Sdrh    SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC;
1719d4280d5Sdrh  }
1729d4280d5Sdrh} {2147483647 2147483646}
1739d4280d5Sdrhdo_test misc3-3.13 {
1749d4280d5Sdrh  execsql {
1759d4280d5Sdrh    SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC;
1769d4280d5Sdrh  }
1779d4280d5Sdrh} {2147483647 2147483646}
1789d4280d5Sdrhdo_test misc3-3.14 {
1799d4280d5Sdrh  execsql {
1809d4280d5Sdrh    SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC;
1819d4280d5Sdrh  }
1829d4280d5Sdrh} {2147483646}
1839d4280d5Sdrh
18452b36cabSdrh# Ticket #565.  A stack overflow is occurring when the subquery to the
18552b36cabSdrh# right of an IN operator contains many NULLs
18652b36cabSdrh#
18752b36cabSdrhdo_test misc3-4.1 {
18852b36cabSdrh  execsql {
18952b36cabSdrh    CREATE TABLE t3(a INTEGER PRIMARY KEY, b);
19052b36cabSdrh    INSERT INTO t3(b) VALUES('abc');
19152b36cabSdrh    INSERT INTO t3(b) VALUES('xyz');
19252b36cabSdrh    INSERT INTO t3(b) VALUES(NULL);
19352b36cabSdrh    INSERT INTO t3(b) VALUES(NULL);
19452b36cabSdrh    INSERT INTO t3(b) SELECT b||'d' FROM t3;
19552b36cabSdrh    INSERT INTO t3(b) SELECT b||'e' FROM t3;
19652b36cabSdrh    INSERT INTO t3(b) SELECT b||'f' FROM t3;
19752b36cabSdrh    INSERT INTO t3(b) SELECT b||'g' FROM t3;
19852b36cabSdrh    INSERT INTO t3(b) SELECT b||'h' FROM t3;
19952b36cabSdrh    SELECT count(a), count(b) FROM t3;
20052b36cabSdrh  }
20152b36cabSdrh} {128 64}
2023e8c37e7Sdanielk1977ifcapable subquery {
20352b36cabSdrhdo_test misc3-4.2 {
20452b36cabSdrh    execsql {
20552b36cabSdrh      SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3);
20652b36cabSdrh    }
20752b36cabSdrh  } {64}
20852b36cabSdrh  do_test misc3-4.3 {
20952b36cabSdrh    execsql {
21052b36cabSdrh      SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1);
21152b36cabSdrh    }
21252b36cabSdrh  } {64}
2133e8c37e7Sdanielk1977}
21493a5c6bdSdrh
215e2201971Sdrh# Ticket #601:  Putting a left join inside "SELECT * FROM (<join-here>)"
216e2201971Sdrh# gives different results that if the outer "SELECT * FROM ..." is omitted.
217e2201971Sdrh#
2183e8c37e7Sdanielk1977ifcapable subquery {
21902f75f19Sdrh  do_test misc3-5.1 {
220e2201971Sdrh    execsql {
221e2201971Sdrh      CREATE TABLE x1 (b, c);
222e2201971Sdrh      INSERT INTO x1 VALUES('dog',3);
223e2201971Sdrh      INSERT INTO x1 VALUES('cat',1);
224e2201971Sdrh      INSERT INTO x1 VALUES('dog',4);
225e2201971Sdrh      CREATE TABLE x2 (c, e);
226e2201971Sdrh      INSERT INTO x2 VALUES(1,'one');
227e2201971Sdrh      INSERT INTO x2 VALUES(2,'two');
228e2201971Sdrh      INSERT INTO x2 VALUES(3,'three');
229e2201971Sdrh      INSERT INTO x2 VALUES(4,'four');
230e2201971Sdrh      SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
231137b35e4Sdrh         (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
232e2201971Sdrh         USING(c);
233e2201971Sdrh    }
234e2201971Sdrh  } {1 one cat 2 two {} 3 three {} 4 four dog}
2353e8c37e7Sdanielk1977  do_test misc3-5.2 {
236e2201971Sdrh    execsql {
237e2201971Sdrh      SELECT * FROM (
238e2201971Sdrh        SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
239137b35e4Sdrh           (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
240e2201971Sdrh           USING(c)
241e2201971Sdrh      );
242e2201971Sdrh    }
243e2201971Sdrh  } {1 one cat 2 two {} 3 three {} 4 four dog}
2443e8c37e7Sdanielk1977}
245e2201971Sdrh
2466bf89570Sdrhifcapable {explain} {
24702f75f19Sdrh  # Ticket #626:  make sure EXPLAIN prevents BEGIN and COMMIT from working.
24802f75f19Sdrh  #
24902f75f19Sdrh  do_test misc3-6.1 {
25002f75f19Sdrh    execsql {EXPLAIN BEGIN}
25102f75f19Sdrh    catchsql {BEGIN}
25202f75f19Sdrh  } {0 {}}
25302f75f19Sdrh  do_test misc3-6.2 {
25402f75f19Sdrh    execsql {EXPLAIN COMMIT}
25502f75f19Sdrh    catchsql {COMMIT}
25602f75f19Sdrh  } {0 {}}
25702f75f19Sdrh  do_test misc3-6.3 {
25802f75f19Sdrh    execsql {BEGIN; EXPLAIN ROLLBACK}
25902f75f19Sdrh    catchsql {ROLLBACK}
26002f75f19Sdrh  } {0 {}}
26191fd4d46Sdrh
26291fd4d46Sdrh  # Do some additional EXPLAIN operations to exercise the displayP4 logic.
26391fd4d46Sdrh  do_test misc3-6.10 {
26491fd4d46Sdrh    set x [execsql {
265de4fcfddSdrh      CREATE TABLE ex1(
266de4fcfddSdrh        a INTEGER DEFAULT 54321,
267de4fcfddSdrh        b TEXT DEFAULT "hello",
268de4fcfddSdrh        c REAL DEFAULT 3.1415926
269de4fcfddSdrh      );
27091fd4d46Sdrh      CREATE UNIQUE INDEX ex1i1 ON ex1(a);
27191fd4d46Sdrh      EXPLAIN REINDEX;
27291fd4d46Sdrh    }]
273a682a6b5Sdan    ifcapable mergesort {
274d40807ddSdrh      regexp { SorterCompare \d+ \d+ \d+ } $x
275a682a6b5Sdan    } else {
276a682a6b5Sdan      regexp { IsUnique \d+ \d+ \d+ \d+ } $x
277a682a6b5Sdan    }
27891fd4d46Sdrh  } {1}
279dc70e4c3Sdrh  if {[regexp {16} [db one {PRAGMA encoding}]]} {
280dc70e4c3Sdrh    do_test misc3-6.11-utf16 {
281dc70e4c3Sdrh      set x [execsql {
282dc70e4c3Sdrh        EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
283dc70e4c3Sdrh      }]
284dc70e4c3Sdrh      set y [regexp { 123456789012 } $x]
285dc70e4c3Sdrh      lappend y [regexp { 4.5678 } $x]
286*5b843aa0Sdrh      lappend y [regexp {,-B} $x]
287dc70e4c3Sdrh    } {1 1 1}
288dc70e4c3Sdrh  } else {
289dc70e4c3Sdrh    do_test misc3-6.11-utf8 {
29091fd4d46Sdrh      set x [execsql {
291ff354e91Sdrh        EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
29291fd4d46Sdrh      }]
29391fd4d46Sdrh      set y [regexp { 123456789012 } $x]
29491fd4d46Sdrh      lappend y [regexp { 4.5678 } $x]
29591fd4d46Sdrh      lappend y [regexp { hello } $x]
296*5b843aa0Sdrh      lappend y [regexp {,-B} $x]
29791fd4d46Sdrh    } {1 1 1 1}
298dc70e4c3Sdrh  }
2996bf89570Sdrh}
300751f4121Sdrh
301798da52cSdrhifcapable {trigger} {
302b1aa04fcSdrh# Ticket #640:  vdbe stack overflow with a LIMIT clause on a SELECT inside
303b1aa04fcSdrh# of a trigger.
304b1aa04fcSdrh#
305b1aa04fcSdrhdo_test misc3-7.1 {
306b1aa04fcSdrh  execsql {
307b1aa04fcSdrh    BEGIN;
308b1aa04fcSdrh    CREATE TABLE y1(a);
309b1aa04fcSdrh    CREATE TABLE y2(b);
310b1aa04fcSdrh    CREATE TABLE y3(c);
311b1aa04fcSdrh    CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN
312b1aa04fcSdrh      INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;
313b1aa04fcSdrh    END;
314b1aa04fcSdrh    INSERT INTO y1 VALUES(1);
315b1aa04fcSdrh    INSERT INTO y1 VALUES(2);
316b1aa04fcSdrh    INSERT INTO y1 SELECT a+2 FROM y1;
317b1aa04fcSdrh    INSERT INTO y1 SELECT a+4 FROM y1;
318b1aa04fcSdrh    INSERT INTO y1 SELECT a+8 FROM y1;
319b1aa04fcSdrh    INSERT INTO y1 SELECT a+16 FROM y1;
320b1aa04fcSdrh    INSERT INTO y2 SELECT a FROM y1;
321b1aa04fcSdrh    COMMIT;
322b1aa04fcSdrh    SELECT count(*) FROM y1;
323b1aa04fcSdrh  }
324b1aa04fcSdrh} 32
325b1aa04fcSdrhdo_test misc3-7.2 {
326b1aa04fcSdrh  execsql {
327b1aa04fcSdrh    DELETE FROM y1;
328b1aa04fcSdrh    SELECT count(*) FROM y1;
329b1aa04fcSdrh  }
330b1aa04fcSdrh} 0
331b1aa04fcSdrhdo_test misc3-7.3 {
332b1aa04fcSdrh  execsql {
333b1aa04fcSdrh    SELECT count(*) FROM y3;
334b1aa04fcSdrh  }
335b1aa04fcSdrh} 32
336798da52cSdrh} ;# endif trigger
337b1aa04fcSdrh
3388b8891bfSdrh# Ticket #668:  VDBE stack overflow occurs when the left-hand side
3398b8891bfSdrh# of an IN expression is NULL and the result is used as an integer, not
3408b8891bfSdrh# as a jump.
3418b8891bfSdrh#
3423e8c37e7Sdanielk1977ifcapable subquery {
3438b8891bfSdrh  do_test misc-8.1 {
3448b8891bfSdrh    execsql {
3458b8891bfSdrh      SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3
3468b8891bfSdrh    }
3478b8891bfSdrh  } {2}
3488b8891bfSdrh  do_test misc-8.2 {
3498b8891bfSdrh    execsql {
3508b8891bfSdrh      SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2
3518b8891bfSdrh    }
3528b8891bfSdrh  } {2}
3533e8c37e7Sdanielk1977}
354b1aa04fcSdrh
355acf4ac96Sdrhfinish_test
356