| # 2017-03-24 |
| # |
| # 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. |
| # |
| #*********************************************************************** |
| # |
| |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| set testprefix triggerG |
| ifcapable {!trigger} { |
| finish_test |
| return |
| } |
| |
| # Test cases for ticket |
| # https://www.sqlite.org/src/tktview/06796225f59c057cd120f |
| # |
| # The OP_Once opcode was not working correctly for recursive triggers. |
| # |
| do_execsql_test 100 { |
| PRAGMA recursive_triggers = 1; |
| |
| CREATE TABLE t1(a); |
| CREATE INDEX i1 ON t1(a); |
| INSERT INTO t1(a) VALUES(0),(2),(3),(8),(9); |
| CREATE TABLE t2(b); |
| CREATE TABLE t3(c); |
| |
| CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN |
| INSERT INTO t3 SELECT new.c+1 WHERE new.c<5; |
| INSERT INTO t2 SELECT new.c*100+a FROM t1 WHERE a IN (1, 2, 3, 4); |
| END; |
| |
| INSERT INTO t3 VALUES(2); |
| SELECT c FROM t3 ORDER BY c;; |
| } {2 3 4 5} |
| do_execsql_test 110 { |
| SELECT b FROM t2 ORDER BY b; |
| } {202 203 302 303 402 403 502 503} |
| |
| do_execsql_test 200 { |
| DELETE FROM t1; |
| INSERT INTO t1(a) VALUES(0),(2),(3),(8),(9); |
| DELETE FROM t2; |
| DELETE FROM t3; |
| DROP TRIGGER tr; |
| CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN |
| INSERT INTO t3 SELECT new.c+1 WHERE new.c<5; |
| INSERT INTO t2 SELECT new.c*10000+xx.a*100+yy.a |
| FROM t1 AS xx, t1 AS yy |
| WHERE xx.a IN (1,2,3,4) |
| AND yy.a IN (2,3,4,5); |
| END; |
| |
| INSERT INTO t3 VALUES(2); |
| SELECT b FROM t2 ORDER BY b; |
| } {20202 20203 20302 20303 30202 30203 30302 30303 40202 40203 40302 40303 50202 50203 50302 50303} |
| |
| # At one point the following was causing an assert() to fail. |
| # |
| do_execsql_test 300 { |
| CREATE TABLE t4(x); |
| CREATE TRIGGER tr4 AFTER INSERT ON t4 BEGIN |
| SELECT 0x2147483648e0e0099 AS y WHERE y; |
| END; |
| } |
| |
| do_catchsql_test 310 { |
| INSERT INTO t4 VALUES(1); |
| } {1 {hex literal too big: 0x2147483648e0e0099}} |
| |
| finish_test |