1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

The parser now permits very large triggers - triggers with 10000 or more

statements. (CVS 3113)

FossilOrigin-Name: b4fa96d0e92182cd8792e88b4540b95912bb9f95
This commit is contained in:
drh
2006-02-27 22:22:27 +00:00
parent 8fc3345f29
commit 187e4c6ac9
5 changed files with 63 additions and 15 deletions

View File

@ -1,5 +1,5 @@
C Detect\sstack\soverflow\sin\sthe\sparser\sand\sreport\san\serror.\s(CVS\s3112) C The\sparser\snow\spermits\svery\slarge\striggers\s-\striggers\swith\s10000\sor\smore\nstatements.\s(CVS\s3113)
D 2006-02-27T21:58:08 D 2006-02-27T22:22:28
F Makefile.in 5d8dff443383918b700e495de42ec65bc1c8865b F Makefile.in 5d8dff443383918b700e495de42ec65bc1c8865b
F Makefile.linux-gcc 74ba0eadf88748a9ce3fd03d2a3ede2e6715baec F Makefile.linux-gcc 74ba0eadf88748a9ce3fd03d2a3ede2e6715baec
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@ -61,7 +61,7 @@ F src/os_win.c c67a2c46d929cf54c8f80ec5e6079cf684a141a9
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
F src/pager.c f65d0b05182ff6059e9566b2eed1ec5f0cddc2f6 F src/pager.c f65d0b05182ff6059e9566b2eed1ec5f0cddc2f6
F src/pager.h 425a9e52d5404158de016799715cbc2c3d685178 F src/pager.h 425a9e52d5404158de016799715cbc2c3d685178
F src/parse.y 969fa5ddf747ba1034c9960cce49610c4b3fa617 F src/parse.y c2daaa24fa2c8e256af740f29d3d61ac552fbd49
F src/pragma.c 607b0f3b1916aa01918acd08499bd6ef21065c23 F src/pragma.c 607b0f3b1916aa01918acd08499bd6ef21065c23
F src/prepare.c cf0fc8ebaf94409955ecb09ffeb0099c9ef44693 F src/prepare.c cf0fc8ebaf94409955ecb09ffeb0099c9ef44693
F src/printf.c cda33918f602ff20bfba3ceae642ac1ed8f476d6 F src/printf.c cda33918f602ff20bfba3ceae642ac1ed8f476d6
@ -70,7 +70,7 @@ F src/select.c 46e1d5bf796696a10587e981407fd75632fc9ba3
F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
F src/shell.c 738f55ed75fb36731e764bfdb40756ac43b90b08 F src/shell.c 738f55ed75fb36731e764bfdb40756ac43b90b08
F src/sqlite.h.in 0bf6f03f9a14dde5f3a4f87471840803acaa4497 F src/sqlite.h.in 0bf6f03f9a14dde5f3a4f87471840803acaa4497
F src/sqliteInt.h d99092c3bb510712b26461cf07cff8eca686b83d F src/sqliteInt.h ccc6c2351fb454aec927b5da8d83561c7d4b48cd
F src/table.c f64ec4fbfe333f8df925bc6ba494f55e05b0e75e F src/table.c f64ec4fbfe333f8df925bc6ba494f55e05b0e75e
F src/tclsqlite.c d9c26374b52cd47233ae0620d0a858a59b601f89 F src/tclsqlite.c d9c26374b52cd47233ae0620d0a858a59b601f89
F src/test1.c 9d299609a0ce35157fe15cdf8b4c663db5d40386 F src/test1.c 9d299609a0ce35157fe15cdf8b4c663db5d40386
@ -268,6 +268,7 @@ F test/trigger4.test 4bed3705c9df4aaf7a7b164a2d573410d05ca025
F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83
F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9
F test/trigger7.test 0afa870be2ce1b132cdb85b17a4a4ef45aa8cece F test/trigger7.test 0afa870be2ce1b132cdb85b17a4a4ef45aa8cece
F test/trigger8.test 3a09275aa2214fdff56f731b1e775d8dfee4408a
F test/types.test a74083427a73ff8af2723bae209d09cce5722c3a F test/types.test a74083427a73ff8af2723bae209d09cce5722c3a
F test/types2.test 81dd1897be8ef4b5b73d0006e6076abe40610de3 F test/types2.test 81dd1897be8ef4b5b73d0006e6076abe40610de3
F test/types3.test ea0ddf793ad5cd17c3b029dd8f48473059f873b6 F test/types3.test ea0ddf793ad5cd17c3b029dd8f48473059f873b6
@ -354,7 +355,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
P a359b1817e85a9c5f31085817ae70e3e0b8ac7a7 P bd2c38f4670d1243284f2431b5e0712a6d1de1d7
R 9e1f3653271b124969ed2916a0c66ae2 R 24d0b5ace2fb2a16cf769d74dd5e70e5
U drh U drh
Z b0010c3c2b756095a18a8f4b4a40541b Z 6578b75ec2a8a5a9e423f996f316552a

View File

@ -1 +1 @@
bd2c38f4670d1243284f2431b5e0712a6d1de1d7 b4fa96d0e92182cd8792e88b4540b95912bb9f95

View File

@ -14,7 +14,7 @@
** the parser. Lemon will also generate a header file containing ** the parser. Lemon will also generate a header file containing
** numeric codes for all of the tokens. ** 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_" // 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*} %type trigger_cmd_list {TriggerStep*}
%destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
X->pNext = Y; if( Y ){
A = X; Y->pLast->pNext = X;
}else{
Y = X;
}
Y->pLast = X;
A = Y;
} }
trigger_cmd_list(A) ::= . { A = 0; } trigger_cmd_list(A) ::= . { A = 0; }

View File

@ -11,7 +11,7 @@
************************************************************************* *************************************************************************
** Internal interface definitions for SQLite. ** 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_ #ifndef _SQLITEINT_H_
#define _SQLITEINT_H_ #define _SQLITEINT_H_
@ -1383,8 +1383,8 @@ struct TriggerStep {
ExprList *pExprList; /* Valid for UPDATE statements and sometimes ExprList *pExprList; /* Valid for UPDATE statements and sometimes
INSERT steps (when pSelect == 0) */ INSERT steps (when pSelect == 0) */
IdList *pIdList; /* Valid for INSERT statements only */ 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 */
}; };
/* /*

42
test/trigger8.test Normal file
View File

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