| 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 | 
|  |