]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The parser now permits very large triggers - triggers with 10000 or more
authordrh <drh@noemail.net>
Mon, 27 Feb 2006 22:22:27 +0000 (22:22 +0000)
committerdrh <drh@noemail.net>
Mon, 27 Feb 2006 22:22:27 +0000 (22:22 +0000)
statements. (CVS 3113)

FossilOrigin-Name: b4fa96d0e92182cd8792e88b4540b95912bb9f95

manifest
manifest.uuid
src/parse.y
src/sqliteInt.h
test/trigger8.test [new file with mode: 0644]

index af95d761d21f7b1b38dc1026ee2ef855c2b877be..4031a9576ce2fb3301fda6cb97047ddce1e71f4c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Detect\sstack\soverflow\sin\sthe\sparser\sand\sreport\san\serror.\s(CVS\s3112)
-D 2006-02-27T21:58:08
+C The\sparser\snow\spermits\svery\slarge\striggers\s-\striggers\swith\s10000\sor\smore\nstatements.\s(CVS\s3113)
+D 2006-02-27T22:22:28
 F Makefile.in 5d8dff443383918b700e495de42ec65bc1c8865b
 F Makefile.linux-gcc 74ba0eadf88748a9ce3fd03d2a3ede2e6715baec
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -61,7 +61,7 @@ F src/os_win.c c67a2c46d929cf54c8f80ec5e6079cf684a141a9
 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
 F src/pager.c f65d0b05182ff6059e9566b2eed1ec5f0cddc2f6
 F src/pager.h 425a9e52d5404158de016799715cbc2c3d685178
-F src/parse.y 969fa5ddf747ba1034c9960cce49610c4b3fa617
+F src/parse.y c2daaa24fa2c8e256af740f29d3d61ac552fbd49
 F src/pragma.c 607b0f3b1916aa01918acd08499bd6ef21065c23
 F src/prepare.c cf0fc8ebaf94409955ecb09ffeb0099c9ef44693
 F src/printf.c cda33918f602ff20bfba3ceae642ac1ed8f476d6
@@ -70,7 +70,7 @@ F src/select.c 46e1d5bf796696a10587e981407fd75632fc9ba3
 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
 F src/shell.c 738f55ed75fb36731e764bfdb40756ac43b90b08
 F src/sqlite.h.in 0bf6f03f9a14dde5f3a4f87471840803acaa4497
-F src/sqliteInt.h d99092c3bb510712b26461cf07cff8eca686b83d
+F src/sqliteInt.h ccc6c2351fb454aec927b5da8d83561c7d4b48cd
 F src/table.c f64ec4fbfe333f8df925bc6ba494f55e05b0e75e
 F src/tclsqlite.c d9c26374b52cd47233ae0620d0a858a59b601f89
 F src/test1.c 9d299609a0ce35157fe15cdf8b4c663db5d40386
@@ -268,6 +268,7 @@ F test/trigger4.test 4bed3705c9df4aaf7a7b164a2d573410d05ca025
 F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83
 F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9
 F test/trigger7.test 0afa870be2ce1b132cdb85b17a4a4ef45aa8cece
+F test/trigger8.test 3a09275aa2214fdff56f731b1e775d8dfee4408a
 F test/types.test a74083427a73ff8af2723bae209d09cce5722c3a
 F test/types2.test 81dd1897be8ef4b5b73d0006e6076abe40610de3
 F test/types3.test ea0ddf793ad5cd17c3b029dd8f48473059f873b6
@@ -354,7 +355,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P a359b1817e85a9c5f31085817ae70e3e0b8ac7a7
-R 9e1f3653271b124969ed2916a0c66ae2
+P bd2c38f4670d1243284f2431b5e0712a6d1de1d7
+R 24d0b5ace2fb2a16cf769d74dd5e70e5
 U drh
-Z b0010c3c2b756095a18a8f4b4a40541b
+Z 6578b75ec2a8a5a9e423f996f316552a
index 84a6e606cc2cc97de665a567f6ddad52550b9b08..2c17c74ffefdbd28c10c8a8a88fce318ee308fec 100644 (file)
@@ -1 +1 @@
-bd2c38f4670d1243284f2431b5e0712a6d1de1d7
\ No newline at end of file
+b4fa96d0e92182cd8792e88b4540b95912bb9f95
\ No newline at end of file
index 0c176b1f11538c93cbcc60a6018351dece4150b1..c2c08e9bf625e952888377f4f99d016f29c7193e 100644 (file)
@@ -14,7 +14,7 @@
 ** the parser.  Lemon will also generate a header file containing
 ** numeric codes for all of the tokens.
 **
-** @(#) $Id: parse.y,v 1.197 2006/02/27 21:58:08 drh Exp $
+** @(#) $Id: parse.y,v 1.198 2006/02/27 22:22:28 drh Exp $
 */
 
 // All token codes are small integers with #defines that begin with "TK_"
@@ -950,9 +950,14 @@ when_clause(A) ::= WHEN expr(X). { A = X; }
 
 %type trigger_cmd_list {TriggerStep*}
 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
-trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
-  X->pNext = Y;
-  A = X;
+trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
+  if( Y ){
+    Y->pLast->pNext = X;
+  }else{
+    Y = X;
+  }
+  Y->pLast = X;
+  A = Y;
 }
 trigger_cmd_list(A) ::= . { A = 0; }
 
index a88dec778bb74526618af4d8a466d92a000f31f4..517ee4f8d3c9702ab879832279510b3dd8b7cc2c 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.487 2006/02/24 02:53:50 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.488 2006/02/27 22:22:29 drh Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -1383,8 +1383,8 @@ struct TriggerStep {
   ExprList *pExprList; /* Valid for UPDATE statements and sometimes 
                           INSERT steps (when pSelect == 0)         */
   IdList *pIdList;     /* Valid for INSERT statements only */
-
-  TriggerStep * pNext; /* Next in the link-list */
+  TriggerStep *pNext;  /* Next in the link-list */
+  TriggerStep *pLast;  /* Last element in link-list. Valid for 1st elem only */
 };
 
 /*
diff --git a/test/trigger8.test b/test/trigger8.test
new file mode 100644 (file)
index 0000000..b4215fb
--- /dev/null
@@ -0,0 +1,42 @@
+# 2006 February 27
+#
+# 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 to make sure abusively large triggers
+# (triggers with 100s or 1000s of statements) work.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+ifcapable {!trigger} {
+  finish_test
+  return
+}
+
+
+do_test trigger8-1.1 {
+  execsql {
+    CREATE TABLE t1(x);
+    CREATE TABLE t2(y);
+  }
+  set sql "CREATE TRIGGER r10000 AFTER INSERT ON t1 BEGIN\n"
+  for {set i 0} {$i<10000} {incr i} {
+    append sql "  INSERT INTO t2 VALUES($i);\n"
+  }
+  append sql "END;"
+  execsql $sql
+  execsql {
+    INSERT INTO t1 VALUES(5);
+    SELECT count(*) FROM t2;
+  }
+} {10000}
+
+finish_test