123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- # 2003 June 21
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- # This file implements regression tests for SQLite library.
- #
- # This file implements tests for miscellanous features that were
- # left out of other test files.
- #
- # $Id: misc2.test,v 1.28 2007/09/12 17:01:45 danielk1977 Exp $
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- # The tests in this file were written before SQLite supported recursive
- # trigger invocation, and some tests depend on that to pass. So disable
- # recursive triggers for this file.
- catchsql { pragma recursive_triggers = off }
- ifcapable {trigger} {
- # Test for ticket #360
- #
- do_test misc2-1.1 {
- catchsql {
- CREATE TABLE FOO(bar integer);
- CREATE TRIGGER foo_insert BEFORE INSERT ON foo BEGIN
- SELECT CASE WHEN (NOT new.bar BETWEEN 0 AND 20)
- THEN raise(rollback, 'aiieee') END;
- END;
- INSERT INTO foo(bar) VALUES (1);
- }
- } {0 {}}
- do_test misc2-1.2 {
- catchsql {
- INSERT INTO foo(bar) VALUES (111);
- }
- } {1 aiieee}
- } ;# endif trigger
- # Make sure ROWID works on a view and a subquery. Ticket #364
- #
- do_test misc2-2.1 {
- execsql {
- CREATE TABLE t1(a,b,c);
- INSERT INTO t1 VALUES(1,2,3);
- CREATE TABLE t2(a,b,c);
- INSERT INTO t2 VALUES(7,8,9);
- }
- } {}
- ifcapable subquery {
- do_test misc2-2.2 {
- execsql {
- SELECT rowid, * FROM (SELECT * FROM t1, t2);
- }
- } {{} 1 2 3 7 8 9}
- }
- ifcapable view {
- do_test misc2-2.3 {
- execsql {
- CREATE VIEW v1 AS SELECT * FROM t1, t2;
- SELECT rowid, * FROM v1;
- }
- } {{} 1 2 3 7 8 9}
- } ;# ifcapable view
- # Ticket #2002 and #1952.
- ifcapable subquery {
- do_test misc2-2.4 {
- execsql2 {
- SELECT * FROM (SELECT a, b AS 'a', c AS 'a', 4 AS 'a' FROM t1)
- }
- } {a 1 a:1 2 a:2 3 a:3 4}
- }
- # Check name binding precedence. Ticket #387
- #
- do_test misc2-3.1 {
- catchsql {
- SELECT t1.b+t2.b AS a, t1.a, t2.a FROM t1, t2 WHERE a==10
- }
- } {1 {ambiguous column name: a}}
- # Make sure 32-bit integer overflow is handled properly in queries.
- # ticket #408
- #
- do_test misc2-4.1 {
- execsql {
- INSERT INTO t1 VALUES(4000000000,'a','b');
- SELECT a FROM t1 WHERE a>1;
- }
- } {4000000000}
- do_test misc2-4.2 {
- execsql {
- INSERT INTO t1 VALUES(2147483648,'b2','c2');
- INSERT INTO t1 VALUES(2147483647,'b3','c3');
- SELECT a FROM t1 WHERE a>2147483647;
- }
- } {4000000000 2147483648}
- do_test misc2-4.3 {
- execsql {
- SELECT a FROM t1 WHERE a<2147483648;
- }
- } {1 2147483647}
- do_test misc2-4.4 {
- execsql {
- SELECT a FROM t1 WHERE a<=2147483648;
- }
- } {1 2147483648 2147483647}
- do_test misc2-4.5 {
- execsql {
- SELECT a FROM t1 WHERE a<10000000000;
- }
- } {1 4000000000 2147483648 2147483647}
- do_test misc2-4.6 {
- execsql {
- SELECT a FROM t1 WHERE a<1000000000000 ORDER BY 1;
- }
- } {1 2147483647 2147483648 4000000000}
- # There were some issues with expanding a SrcList object using a call
- # to sqliteSrcListAppend() if the SrcList had previously been duplicated
- # using a call to sqliteSrcListDup(). Ticket #416. The following test
- # makes sure the problem has been fixed.
- #
- ifcapable view {
- do_test misc2-5.1 {
- execsql {
- CREATE TABLE x(a,b);
- CREATE VIEW y AS
- SELECT x1.b AS p, x2.b AS q FROM x AS x1, x AS x2 WHERE x1.a=x2.a;
- CREATE VIEW z AS
- SELECT y1.p, y2.p FROM y AS y1, y AS y2 WHERE y1.q=y2.q;
- SELECT * from z;
- }
- } {}
- }
- # Make sure we can open a database with an empty filename. What this
- # does is store the database in a temporary file that is deleted when
- # the database is closed. Ticket #432.
- #
- do_test misc2-6.1 {
- db close
- sqlite3 db {}
- execsql {
- CREATE TABLE t1(a,b);
- INSERT INTO t1 VALUES(1,2);
- SELECT * FROM t1;
- }
- } {1 2}
- # Make sure we get an error message (not a segfault) on an attempt to
- # update a table from within the callback of a select on that same
- # table.
- #
- # 2006-08-16: This has changed. It is now permitted to update
- # the table being SELECTed from within the callback of the query.
- #
- ifcapable tclvar {
- do_test misc2-7.1 {
- db close
- forcedelete test.db
- sqlite3 db test.db
- execsql {
- CREATE TABLE t1(x);
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- SELECT * FROM t1;
- }
- } {1 2 3}
- do_test misc2-7.2 {
- set rc [catch {
- db eval {SELECT rowid FROM t1} {} {
- db eval "DELETE FROM t1 WHERE rowid=$rowid"
- }
- } msg]
- lappend rc $msg
- } {0 {}}
- do_test misc2-7.3 {
- execsql {SELECT * FROM t1}
- } {}
- do_test misc2-7.4 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x & 1} {
- db eval {DELETE FROM t1 WHERE rowid=$rowid}
- }
- }
- execsql {SELECT * FROM t1}
- } {2 4}
- do_test misc2-7.5 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x & 1} {
- db eval {DELETE FROM t1 WHERE rowid=$rowid+1}
- }
- }
- execsql {SELECT * FROM t1}
- } {1 3}
- do_test misc2-7.6 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x & 1} {
- db eval {DELETE FROM t1}
- }
- }
- execsql {SELECT * FROM t1}
- } {}
- do_test misc2-7.7 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x & 1} {
- db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid}
- }
- }
- execsql {SELECT * FROM t1}
- } {101 2 103 4}
- do_test misc2-7.8 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x<10} {
- db eval {INSERT INTO t1 VALUES($x+1)}
- }
- }
- execsql {SELECT * FROM t1}
- } {1 2 3 4 5 6 7 8 9 10}
-
- # Repeat the tests 7.1 through 7.8 about but this time do the SELECTs
- # in reverse order so that we exercise the sqlite3BtreePrev() routine
- # instead of sqlite3BtreeNext()
- #
- do_test misc2-7.11 {
- db close
- forcedelete test.db
- sqlite3 db test.db
- execsql {
- CREATE TABLE t1(x);
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- SELECT * FROM t1;
- }
- } {1 2 3}
- do_test misc2-7.12 {
- set rc [catch {
- db eval {SELECT rowid FROM t1 ORDER BY rowid DESC} {} {
- db eval "DELETE FROM t1 WHERE rowid=$rowid"
- }
- } msg]
- lappend rc $msg
- } {0 {}}
- do_test misc2-7.13 {
- execsql {SELECT * FROM t1}
- } {}
- do_test misc2-7.14 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
- if {$x & 1} {
- db eval {DELETE FROM t1 WHERE rowid=$rowid}
- }
- }
- execsql {SELECT * FROM t1}
- } {2 4}
- do_test misc2-7.15 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1} {
- if {$x & 1} {
- db eval {DELETE FROM t1 WHERE rowid=$rowid+1}
- }
- }
- execsql {SELECT * FROM t1}
- } {1 3}
- do_test misc2-7.16 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
- if {$x & 1} {
- db eval {DELETE FROM t1}
- }
- }
- execsql {SELECT * FROM t1}
- } {}
- do_test misc2-7.17 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1 VALUES(1);
- INSERT INTO t1 VALUES(2);
- INSERT INTO t1 VALUES(3);
- INSERT INTO t1 VALUES(4);
- }
- db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
- if {$x & 1} {
- db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid}
- }
- }
- execsql {SELECT * FROM t1}
- } {101 2 103 4}
- do_test misc2-7.18 {
- execsql {
- DELETE FROM t1;
- INSERT INTO t1(rowid,x) VALUES(10,10);
- }
- db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
- if {$x>1} {
- db eval {INSERT INTO t1(rowid,x) VALUES($x-1,$x-1)}
- }
- }
- execsql {SELECT * FROM t1}
- } {1 2 3 4 5 6 7 8 9 10}
- }
- db close
- forcedelete test.db
- sqlite3 db test.db
- catchsql { pragma recursive_triggers = off }
- # Ticket #453. If the SQL ended with "-", the tokenizer was calling that
- # an incomplete token, which caused problem. The solution was to just call
- # it a minus sign.
- #
- do_test misc2-8.1 {
- catchsql {-}
- } {1 {near "-": syntax error}}
- # Ticket #513. Make sure the VDBE stack does not grow on a 3-way join.
- #
- ifcapable tempdb {
- do_test misc2-9.1 {
- execsql {
- BEGIN;
- CREATE TABLE counts(n INTEGER PRIMARY KEY);
- INSERT INTO counts VALUES(0);
- INSERT INTO counts VALUES(1);
- INSERT INTO counts SELECT n+2 FROM counts;
- INSERT INTO counts SELECT n+4 FROM counts;
- INSERT INTO counts SELECT n+8 FROM counts;
- COMMIT;
-
- CREATE TEMP TABLE x AS
- SELECT dim1.n, dim2.n, dim3.n
- FROM counts AS dim1, counts AS dim2, counts AS dim3
- WHERE dim1.n<10 AND dim2.n<10 AND dim3.n<10;
-
- SELECT count(*) FROM x;
- }
- } {1000}
- do_test misc2-9.2 {
- execsql {
- DROP TABLE x;
- CREATE TEMP TABLE x AS
- SELECT dim1.n, dim2.n, dim3.n
- FROM counts AS dim1, counts AS dim2, counts AS dim3
- WHERE dim1.n>=6 AND dim2.n>=6 AND dim3.n>=6;
-
- SELECT count(*) FROM x;
- }
- } {1000}
- do_test misc2-9.3 {
- execsql {
- DROP TABLE x;
- CREATE TEMP TABLE x AS
- SELECT dim1.n, dim2.n, dim3.n, dim4.n
- FROM counts AS dim1, counts AS dim2, counts AS dim3, counts AS dim4
- WHERE dim1.n<5 AND dim2.n<5 AND dim3.n<5 AND dim4.n<5;
-
- SELECT count(*) FROM x;
- }
- } [expr 5*5*5*5]
- }
- # Ticket #1229. Sometimes when a "NEW.X" appears in a SELECT without
- # a FROM clause deep within a trigger, the code generator is unable to
- # trace the NEW.X back to an original table and thus figure out its
- # declared datatype.
- #
- # The SQL code below was causing a segfault.
- #
- ifcapable subquery&&trigger {
- do_test misc2-10.1 {
- execsql {
- CREATE TABLE t1229(x);
- CREATE TRIGGER r1229 BEFORE INSERT ON t1229 BEGIN
- INSERT INTO t1229 SELECT y FROM (SELECT new.x y);
- END;
- INSERT INTO t1229 VALUES(1);
- }
- } {}
- }
- finish_test
|