AryaWu/sqlite
0
1# 2007 Oct 32#3# The author disclaims copyright to this source code. In place of4# a legal notice, here is a blessing:5#6# May you do good and not evil.7# May you find forgiveness for yourself and forgive others.8# May you share freely, never taking more than you give.9#10#***********************************************************************11#12# This file is to test that ticket #2767 has been fixed.13# Ticket #2767 is for a VDBE stack overflow on BEFORE14# triggers that run RAISE(IGNORE).15#16# $Id: tkt2767.test,v 1.3 2009/04/07 14:14:23 danielk1977 Exp $17#18 19set testdir [file dirname $argv0]20source $testdir/tester.tcl21 22ifcapable !trigger { finish_test ; return }23 24do_test tkt2767-1.1 {25 execsql {26 -- Construct a table with many rows of data27 CREATE TABLE t1(x);28 INSERT INTO t1 VALUES(1);29 INSERT INTO t1 VALUES(2);30 INSERT INTO t1 SELECT x+2 FROM t1;31 INSERT INTO t1 SELECT x+4 FROM t1;32 INSERT INTO t1 SELECT x+8 FROM t1;33 INSERT INTO t1 SELECT x+16 FROM t1;34 35 -- BEFORE triggers that invoke raise(ignore). The effect of36 -- these triggers should be to make INSERTs, UPDATEs, and DELETEs37 -- into no-ops.38 CREATE TRIGGER r1 BEFORE UPDATE ON t1 BEGIN39 SELECT raise(ignore);40 END;41 CREATE TRIGGER r2 BEFORE DELETE ON t1 BEGIN42 SELECT raise(ignore);43 END;44 CREATE TRIGGER r3 BEFORE INSERT ON t1 BEGIN45 SELECT raise(ignore);46 END;47 48 -- Verify the table content49 SELECT count(*), sum(x) FROM t1;50 }51} {32 528}52 53# Try to delete all elements of the table. This will invoke the54# DELETE trigger 32 times, which should overflow the VDBE stack if55# the problem of #2767 is not fixed. If the problem is fixed, all56# the deletes should be no-ops so the table should remain unchanged.57#58do_test tkt2767-1.2 {59 execsql {60 DELETE FROM t1 WHERE x>0;61 SELECT count(*), sum(x) FROM t1;62 }63} {32 528}64 65# Try to update all elements of the table. This will invoke the66# UPDATE trigger 32 times, which should overflow the VDBE stack if67# the problem of #2767 is not fixed. If the problem is fixed, all68# the updates should be no-ops so the table should remain unchanged.69#70do_test tkt2767-1.3 {71 execsql {72 UPDATE t1 SET x=x+1;73 SELECT count(*), sum(x) FROM t1;74 }75} {32 528}76 77# Invoke the insert trigger. The insert trigger was working78# even prior to the fix of #2767. But it seems good to go ahead79# and verify that it works.80#81do_test tkt2767-1.4 {82 execsql {83 INSERT INTO t1 SELECT x+32 FROM t1;84 SELECT count(*), sum(x) FROM t1;85 }86} {32 528}87 88 89 90finish_test91 