| Index: third_party/sqlite/src/test/triggerC.test
|
| diff --git a/third_party/sqlite/src/test/triggerC.test b/third_party/sqlite/src/test/triggerC.test
|
| index 694d069d71181c721b846a4b690d412eeefdaa9f..14cc0f01dd7e61f81163e2ff4accf7190bb053d0 100644
|
| --- a/third_party/sqlite/src/test/triggerC.test
|
| +++ b/third_party/sqlite/src/test/triggerC.test
|
| @@ -157,7 +157,7 @@ do_test triggerC-1.14 {
|
| } {}
|
| do_test triggerC-1.15 {
|
| catchsql { UPDATE OR ROLLBACK t1 SET a=100 }
|
| -} {1 {PRIMARY KEY must be unique}}
|
| +} {1 {UNIQUE constraint failed: t1.a}}
|
|
|
|
|
| #-------------------------------------------------------------------------
|
| @@ -222,31 +222,31 @@ foreach {n tdefn rc} {
|
| execsql $tdefn
|
| catchsql {
|
| INSERT INTO t2 VALUES(10);
|
| - SELECT * FROM t2;
|
| + SELECT * FROM t2 ORDER BY rowid;
|
| }
|
| } $rc
|
| }
|
|
|
| do_test triggerC-2.2 {
|
| - execsql {
|
| + execsql "
|
| CREATE TABLE t22(x);
|
|
|
| CREATE TRIGGER t22a AFTER INSERT ON t22 BEGIN
|
| INSERT INTO t22 SELECT x + (SELECT max(x) FROM t22) FROM t22;
|
| END;
|
| CREATE TRIGGER t22b BEFORE INSERT ON t22 BEGIN
|
| - SELECT CASE WHEN (SELECT count(*) FROM t22) >= 100
|
| + SELECT CASE WHEN (SELECT count(*) FROM t22) >= [expr $SQLITE_MAX_TRIGGER_DEPTH / 2]
|
| THEN RAISE(IGNORE)
|
| ELSE NULL END;
|
| END;
|
|
|
| INSERT INTO t22 VALUES(1);
|
| SELECT count(*) FROM t22;
|
| - }
|
| -} {100}
|
| + "
|
| +} [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 2]]
|
|
|
| do_test triggerC-2.3 {
|
| - execsql {
|
| + execsql "
|
| CREATE TABLE t23(x PRIMARY KEY);
|
|
|
| CREATE TRIGGER t23a AFTER INSERT ON t23 BEGIN
|
| @@ -254,15 +254,15 @@ do_test triggerC-2.3 {
|
| END;
|
|
|
| CREATE TRIGGER t23b BEFORE INSERT ON t23 BEGIN
|
| - SELECT CASE WHEN new.x>500
|
| + SELECT CASE WHEN new.x>[expr $SQLITE_MAX_TRIGGER_DEPTH / 2]
|
| THEN RAISE(IGNORE)
|
| ELSE NULL END;
|
| END;
|
|
|
| INSERT INTO t23 VALUES(1);
|
| SELECT count(*) FROM t23;
|
| - }
|
| -} {500}
|
| + "
|
| +} [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 2]]
|
|
|
|
|
| #-----------------------------------------------------------------------
|
| @@ -288,12 +288,12 @@ do_test triggerC-3.1.3 {
|
| } {}
|
|
|
| do_test triggerC-3.2.1 {
|
| - execsql {
|
| + execsql "
|
| CREATE TABLE t3b(x);
|
| - CREATE TRIGGER t3bi AFTER INSERT ON t3b WHEN new.x<2000 BEGIN
|
| + CREATE TRIGGER t3bi AFTER INSERT ON t3b WHEN new.x<[expr $SQLITE_MAX_TRIGGER_DEPTH * 2] BEGIN
|
| INSERT INTO t3b VALUES(new.x+1);
|
| END;
|
| - }
|
| + "
|
| catchsql {
|
| INSERT INTO t3b VALUES(1);
|
| }
|
| @@ -303,39 +303,39 @@ do_test triggerC-3.2.2 {
|
| } {}
|
|
|
| do_test triggerC-3.3.1 {
|
| - catchsql {
|
| - INSERT INTO t3b VALUES(1001);
|
| - }
|
| + catchsql "
|
| + INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH + 1]);
|
| + "
|
| } {0 {}}
|
| do_test triggerC-3.3.2 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| -} {1000 2000 1001}
|
| +} [list $SQLITE_MAX_TRIGGER_DEPTH [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr $SQLITE_MAX_TRIGGER_DEPTH + 1]]
|
|
|
| do_test triggerC-3.4.1 {
|
| - catchsql {
|
| + catchsql "
|
| DELETE FROM t3b;
|
| - INSERT INTO t3b VALUES(999);
|
| - }
|
| + INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH - 1]);
|
| + "
|
| } {1 {too many levels of trigger recursion}}
|
| do_test triggerC-3.4.2 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| } {0 {} {}}
|
|
|
| do_test triggerC-3.5.1 {
|
| - sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 100
|
| - catchsql {
|
| - INSERT INTO t3b VALUES(1901);
|
| - }
|
| + sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH [expr $SQLITE_MAX_TRIGGER_DEPTH / 10]
|
| + catchsql "
|
| + INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_TRIGGER_DEPTH / 10) + 1]);
|
| + "
|
| } {0 {}}
|
| do_test triggerC-3.5.2 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| -} {100 2000 1901}
|
| +} [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 10] [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_TRIGGER_DEPTH / 10) + 1]]
|
|
|
| do_test triggerC-3.5.3 {
|
| - catchsql {
|
| + catchsql "
|
| DELETE FROM t3b;
|
| - INSERT INTO t3b VALUES(1900);
|
| - }
|
| + INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_TRIGGER_DEPTH / 10)]);
|
| + "
|
| } {1 {too many levels of trigger recursion}}
|
| do_test triggerC-3.5.4 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| @@ -343,25 +343,25 @@ do_test triggerC-3.5.4 {
|
|
|
| do_test triggerC-3.6.1 {
|
| sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1
|
| - catchsql {
|
| - INSERT INTO t3b VALUES(2000);
|
| - }
|
| + catchsql "
|
| + INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH * 2]);
|
| + "
|
| } {0 {}}
|
| do_test triggerC-3.6.2 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| -} {1 2000 2000}
|
| +} [list 1 [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr $SQLITE_MAX_TRIGGER_DEPTH * 2]]
|
|
|
| do_test triggerC-3.6.3 {
|
| - catchsql {
|
| + catchsql "
|
| DELETE FROM t3b;
|
| - INSERT INTO t3b VALUES(1999);
|
| - }
|
| + INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - 1]);
|
| + "
|
| } {1 {too many levels of trigger recursion}}
|
| do_test triggerC-3.6.4 {
|
| db eval {SELECT count(*), max(x), min(x) FROM t3b}
|
| } {0 {} {}}
|
| -sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000
|
| -
|
| +sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH $SQLITE_MAX_TRIGGER_DEPTH
|
| +
|
|
|
| #-----------------------------------------------------------------------
|
| # This next block of tests, triggerC-4.*, checks that affinity
|
| @@ -547,7 +547,7 @@ foreach {n insert log} {
|
| eval concat [execsql "
|
| DELETE FROM log;
|
| $insert ;
|
| - SELECT * FROM log;
|
| + SELECT * FROM log ORDER BY rowid;
|
| "]
|
| } [join $log " "]
|
| }
|
| @@ -584,8 +584,8 @@ foreach {n dml t5g t5} {
|
| execsql "
|
| BEGIN;
|
| $dml ;
|
| - SELECT * FROM t5g;
|
| - SELECT * FROM t5;
|
| + SELECT * FROM t5g ORDER BY rowid;
|
| + SELECT * FROM t5 ORDER BY rowid;
|
| ROLLBACK;
|
| "
|
| } [concat $t5g $t5]
|
| @@ -611,8 +611,8 @@ foreach {n dml t5g t5} {
|
| execsql "
|
| BEGIN;
|
| $dml ;
|
| - SELECT * FROM t5g;
|
| - SELECT * FROM t5;
|
| + SELECT * FROM t5g ORDER BY rowid;
|
| + SELECT * FROM t5 ORDER BY rowid;
|
| ROLLBACK;
|
| "
|
| } [concat $t5g $t5]
|
| @@ -633,8 +633,8 @@ foreach {n dml t5g t5} {
|
| execsql "
|
| BEGIN;
|
| $dml ;
|
| - SELECT * FROM t5g;
|
| - SELECT * FROM t5;
|
| + SELECT * FROM t5g ORDER BY rowid;
|
| + SELECT * FROM t5 ORDER BY rowid;
|
| ROLLBACK;
|
| "
|
| } [concat $t5g $t5]
|
| @@ -918,7 +918,7 @@ do_test triggerC-11.4 {
|
|
|
| do_test triggerC-12.1 {
|
| db close
|
| - file delete -force test.db
|
| + forcedelete test.db
|
| sqlite3 db test.db
|
|
|
| execsql {
|
| @@ -949,6 +949,48 @@ do_catchsql_test triggerC-13.2 {
|
| UPDATE t12 SET a=a+1, b=b+1;
|
| } {1 {too many levels of trigger recursion}}
|
|
|
| +#-------------------------------------------------------------------------
|
| +# The following tests seek to verify that constant values (i.e. literals)
|
| +# are not factored out of loops within trigger programs. SQLite does
|
| +# not factor constants out of loops within trigger programs as it may only
|
| +# do so in code generated before the first table or index is opened. And
|
| +# by the time a trigger program is coded, at least one table or index has
|
| +# always been opened.
|
| +#
|
| +# At one point, due to a bug allowing constant factoring within triggers,
|
| +# the following SQL would produce the wrong result.
|
| +#
|
| +set SQL {
|
| + CREATE TABLE t1(a, b, c);
|
| + CREATE INDEX i1 ON t1(a, c);
|
| + CREATE INDEX i2 ON t1(b, c);
|
| + INSERT INTO t1 VALUES(1, 2, 3);
|
| +
|
| + CREATE TABLE t2(e, f);
|
| + CREATE INDEX i3 ON t2(e);
|
| + INSERT INTO t2 VALUES(1234567, 3);
|
| +
|
| + CREATE TABLE empty(x);
|
| + CREATE TABLE not_empty(x);
|
| + INSERT INTO not_empty VALUES(2);
|
| +
|
| + CREATE TABLE t4(x);
|
| + CREATE TABLE t5(g, h, i);
|
| +
|
| + CREATE TRIGGER trig BEFORE INSERT ON t4 BEGIN
|
| + INSERT INTO t5 SELECT * FROM t1 WHERE
|
| + (a IN (SELECT x FROM empty) OR b IN (SELECT x FROM not_empty))
|
| + AND c IN (SELECT f FROM t2 WHERE e=1234567);
|
| + END;
|
| +
|
| + INSERT INTO t4 VALUES(0);
|
| + SELECT * FROM t5;
|
| +}
|
|
|
| +reset_db
|
| +do_execsql_test triggerC-14.1 $SQL {1 2 3}
|
| +reset_db
|
| +optimization_control db factor-constants 0
|
| +do_execsql_test triggerC-14.2 $SQL {1 2 3}
|
|
|
| finish_test
|
|
|