From: drh Date: Mon, 27 Feb 2006 22:22:27 +0000 (+0000) Subject: The parser now permits very large triggers - triggers with 10000 or more X-Git-Tag: version-3.6.10~3054 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=187e4c6ac9970a895156e5a14ac256d2478abdf5;p=thirdparty%2Fsqlite.git The parser now permits very large triggers - triggers with 10000 or more statements. (CVS 3113) FossilOrigin-Name: b4fa96d0e92182cd8792e88b4540b95912bb9f95 --- diff --git a/manifest b/manifest index af95d761d2..4031a9576c 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 84a6e606cc..2c17c74ffe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd2c38f4670d1243284f2431b5e0712a6d1de1d7 \ No newline at end of file +b4fa96d0e92182cd8792e88b4540b95912bb9f95 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 0c176b1f11..c2c08e9bf6 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a88dec778b..517ee4f8d3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 index 0000000000..b4215fba47 --- /dev/null +++ b/test/trigger8.test @@ -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