From: drh Date: Fri, 6 Apr 2007 11:26:00 +0000 (+0000) Subject: The FOR EACH STATEMENT clause in a trigger is now a syntax error. It used X-Git-Tag: version-3.6.10~2349 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60218d2a0e73f4e0c23d42e565e8157605836ae8;p=thirdparty%2Fsqlite.git The FOR EACH STATEMENT clause in a trigger is now a syntax error. It used to be silently ignored. STATEMENT is no longer a keyword. (CVS 3821) FossilOrigin-Name: 8e2559b4da6329d7c21925d0850f7f91a3731975 --- diff --git a/manifest b/manifest index fcc44a6328..af5499c984 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scoverage\simprovements.\s\sOver\s90%\sof\sbranches\sare\snow\sexecuted\sin\nboth\sdirections.\s(CVS\s3820) -D 2007-04-06T02:32:34 +C The\sFOR\sEACH\sSTATEMENT\sclause\sin\sa\strigger\sis\snow\sa\ssyntax\serror.\s\sIt\sused\nto\sbe\ssilently\signored.\s\sSTATEMENT\sis\sno\slonger\sa\skeyword.\s(CVS\s3821) +D 2007-04-06T11:26:00 F Makefile.in a9bd493360a2b17e5214b69d8c32dd6cdaceaf55 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -88,7 +88,7 @@ F src/os_win.c c9a99524d6b2bdec636264cad1b67553925e3309 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b F src/pager.c 642f804b20a71933fb83b13a1ce93cb4dd1390f7 F src/pager.h e79a24cf200b8771366217f5bca414f5b7823f42 -F src/parse.y 207ab04273ae13aa4a729b96008d294d5f334ab3 +F src/parse.y 6112045e2d3b8be20049645ab494b607d271d129 F src/pragma.c 3b992b5b2640d6ae25cef05aa6a42cd1d6c43234 F src/prepare.c 37207b2b2ccb41d379b01dd62231686bcc48ef1f F src/printf.c 0c6f40648770831341ac45ab32423a80b4c87f05 @@ -98,7 +98,7 @@ F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96 F src/shell.c 3ae4654560e91220a95738a73d135d91d937cda1 F src/sqlite.h.in e429f66f9245c7f8675db24b230c950b8672ad1c F src/sqlite3ext.h 7d0d363ea7327e817ef0dfe1b7eee1f171b72890 -F src/sqliteInt.h f09f449f266f71b236844e540bfce10e455ba6ab +F src/sqliteInt.h 347160d30eb61210417f1086aeb57d7d3e2a8191 F src/table.c 6d0da66dde26ee75614ed8f584a1996467088d06 F src/tclsqlite.c 58fd67ba2c5a6ca816ad110029b6cb2a44a3c707 F src/test1.c 6021cbcede9bfab986ade678efa7226180f3edff @@ -118,7 +118,7 @@ F src/test_schema.c ced72140a3a25c148975428e170ec1850d3c3a7d F src/test_server.c a6460daed0b92ecbc2531b6dc73717470e7a648c F src/test_tclvar.c 315e77c17f128ff8c06b38c08617fd07c825a95b F src/tokenize.c bb1732ef2b6fc2143f93ff28a45d3dcb04c1d396 -F src/trigger.c b3c22b727049fceb96efa5f9f7d325fd853acc22 +F src/trigger.c 420192efe3e6f03addf7897c60c3c8bf913d3493 F src/update.c 3359041db390a8f856d67272f299600e2104f350 F src/utf.c e64a48bc21aa973eb622dd47da87d56a4cdcf528 F src/util.c b6344325378e75b9e18175d8b6aed1723d73dad9 @@ -205,7 +205,7 @@ F test/exclusive.test 6748eb0539c4652d596971584c50200729e57dbe F test/exclusive2.test 8d580e5bb8d49fde59fe1142543b7da081f28d06 F test/exclusive3.test 0e49c35b7e7cb8e7280b4ce3f0359d30b207d2ff F test/expr.test ab21e2fc3613595131efd7d8bbca4b95ed5cc608 -F test/fkey1.test 153004438d51e6769fb1ce165f6313972d6263ce +F test/fkey1.test dcb4f28eb22d5141f15161d6bdca9a4f58c95729 F test/format4.test bf3bed3b13c63abfb3cfec232597a319a31d0bcc F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 @@ -343,7 +343,7 @@ F test/tkt2251.test 3f0549213386ed911715665a908ff2bb7a871002 F test/tkt2285.test c618085f0c13ec3347e607f83c34ada0721b4bfa F test/trace.test 75ffc1b992c780d054748a656e3e7fd674f18567 F test/trans.test 3fe1b9e03b523482eee2b869858c5c1eca7b218b -F test/trigger1.test 2c79e2bf76350811e362814e98779c120b6a9421 +F test/trigger1.test b361161cf20614024cc1e52ea0bdec250776b2ae F test/trigger2.test 33bf8ae9b788013be194efe5f66c04a202facbb4 F test/trigger3.test 9102fd3933db294dc654b5aee9edfe9e94f2b9e2 F test/trigger4.test 8e90ee98cba940cd5f96493f82e55083806ab8a0 @@ -383,7 +383,7 @@ F tool/lempar.c 20851553530657c766dfb1358b0d443ed2d9c26f F tool/memleak.awk 4e7690a51bf3ed757e611273d43fe3f65b510133 F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8 F tool/memleak3.tcl 7707006ee908cffff210c98158788d85bb3fcdbf -F tool/mkkeywordhash.c 520d0016eaac0d783ea8ffb7f91d150d0bf06e81 +F tool/mkkeywordhash.c c6f797bfc698803d2afbcbfb6b42f2239b074e29 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x F tool/mksqlite3c.tcl 2d204fc271b2e2a2139e360527dd845385c4dffa F tool/mksqlite3internalh.tcl a85bb0c812db1a060e6e6dfab4e4c817f53d194b @@ -429,7 +429,7 @@ F www/fullscanb.gif f7c94cb227f060511f8909e10f570157263e9a25 F www/index-ex1-x-b.gif f9b1d85c3fa2435cf38b15970c7e3aa1edae23a3 F www/index.tcl ac28cf2f1130bedf970f990546d0ec79d2e9fbfc F www/indirect1b1.gif adfca361d2df59e34f9c5cac52a670c2bfc303a1 -F www/lang.tcl dc4dedf00d2d6c46a17a962f850fc82086accb5c +F www/lang.tcl 26a38c36ec6686aee0e46eeac90acb3aae373537 F www/lockingv3.tcl e52345bd20323bef6146bfce18ae0829b2b7c87d F www/mingw.tcl d96b451568c5d28545fefe0c80bee3431c73f69c F www/nulls.tcl ec35193f92485b87b90a994a01d0171b58823fcf @@ -451,7 +451,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P fd4da6b13499af2397d52cb0f25f8ff6f2192431 -R 5a55920740a7f85f192df0463d983c9f +P a776d93ccae3bfa6e992cdd1387571dd21561f98 +R fa0c92e65fb1c611f3e19261755e89a8 U drh -Z 452d3f0ac4ca6ed1e1c77157a1d42b7d +Z db8a808c353b3a8ae294eee8fe0830c1 diff --git a/manifest.uuid b/manifest.uuid index c4f58a4684..c9f03c8fa9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a776d93ccae3bfa6e992cdd1387571dd21561f98 \ No newline at end of file +8e2559b4da6329d7c21925d0850f7f91a3731975 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 6fe05de761..372224ae15 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.216 2007/03/27 14:44:51 drh Exp $ +** @(#) $Id: parse.y,v 1.217 2007/04/06 11:26:00 drh Exp $ */ // All token codes are small integers with #defines that begin with "TK_" @@ -175,7 +175,7 @@ id(A) ::= ID(X). {A = X;} ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN CASCADE CAST CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN QUERY KEY - OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT + OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW TEMP TRIGGER VACUUM VIEW VIRTUAL %ifdef SQLITE_OMIT_COMPOUND_SELECT EXCEPT INTERSECT UNION @@ -239,9 +239,8 @@ typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { %type typename {Token} typename(A) ::= ids(X). {A = X;} typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} -%type signed {int} -signed(A) ::= plus_num(X). { A = atoi((char*)X.z); } -signed(A) ::= minus_num(X). { A = -atoi((char*)X.z); } +signed ::= plus_num. +signed ::= minus_num. // "carglist" is a list of additional constraints that come after the // column name and column type in a CREATE TABLE statement. @@ -928,8 +927,8 @@ cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) trigger_time(C) trigger_event(D) - ON fullname(E) foreach_clause(F) when_clause(G). { - sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T, NOERR); + ON fullname(E) foreach_clause when_clause(G). { + sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); A = (Z.n==0?B:Z); } @@ -945,10 +944,8 @@ trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} -%type foreach_clause {int} -foreach_clause(A) ::= . { A = TK_ROW; } -foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } -foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } +foreach_clause ::= . +foreach_clause ::= FOR EACH ROW. %type when_clause {Expr*} %destructor when_clause {sqlite3ExprDelete($$);} diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6374a97a74..6c976deae3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.549 2007/04/05 11:25:59 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.550 2007/04/06 11:26:00 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -1407,7 +1407,6 @@ struct Trigger { Expr *pWhen; /* The WHEN clause of the expresion (may be NULL) */ IdList *pColumns; /* If this is an UPDATE OF trigger, the is stored here */ - int foreach; /* One of TK_ROW or TK_STATEMENT */ Token nameToken; /* Token containing zName. Use during parsing only */ Schema *pSchema; /* Schema containing the trigger */ Schema *pTabSchema; /* Schema containing the table */ @@ -1717,7 +1716,7 @@ void sqlite3ChangeCookie(sqlite3*, Vdbe*, int); #ifndef SQLITE_OMIT_TRIGGER void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*, - int,Expr*,int, int); + Expr*,int, int); void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*); void sqlite3DropTrigger(Parse*, SrcList*, int); void sqlite3DropTriggerPtr(Parse*, Trigger*); diff --git a/src/trigger.c b/src/trigger.c index f8c2bcd8c9..4a929adde0 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -47,7 +47,6 @@ void sqlite3BeginTrigger( int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */ IdList *pColumns, /* column list if this is an UPDATE OF trigger */ SrcList *pTableName,/* The name of the table/view the trigger applies to */ - int foreach, /* One of TK_ROW or TK_STATEMENT */ Expr *pWhen, /* WHEN clause */ int isTemp, /* True if the TEMPORARY keyword is present */ int noErr /* Suppress errors if the trigger already exists */ @@ -180,7 +179,6 @@ void sqlite3BeginTrigger( pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER; pTrigger->pWhen = sqlite3ExprDup(pWhen); pTrigger->pColumns = sqlite3IdListDup(pColumns); - pTrigger->foreach = foreach; sqlite3TokenCopy(&pTrigger->nameToken,pName); assert( pParse->pNewTrigger==0 ); pParse->pNewTrigger = pTrigger; diff --git a/test/fkey1.test b/test/fkey1.test index 8a06b05968..52b52d3fe3 100644 --- a/test/fkey1.test +++ b/test/fkey1.test @@ -46,7 +46,7 @@ do_test fkey1-1.1 { do_test fkey1-1.2 { execsql { CREATE TABLE t3( - a INTEGER REFERENCES t2, + a INTEGER REFERENCES t2 ON INSERT RESTRICT, b INTEGER REFERENCES t1, FOREIGN KEY (a,b) REFERENCES t2(x,y) ); diff --git a/test/trigger1.test b/test/trigger1.test index ca23335822..c1cb755821 100644 --- a/test/trigger1.test +++ b/test/trigger1.test @@ -55,6 +55,13 @@ ifcapable tempdb { execsql { CREATE TABLE t1(a); } +do_test trigger1-1.1.3 { + catchsql { + CREATE TRIGGER trig UPDATE ON t1 FOR EACH STATEMENT BEGIN + SELECT * FROM sqlite_master; + END; + } +} {1 {near "STATEMENT": syntax error}} execsql { CREATE TRIGGER tr1 INSERT ON t1 BEGIN INSERT INTO t1 values(1); diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 3282f0da87..8e8cb96329 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -15,7 +15,7 @@ static const char zHdr[] = "**\n" "** The code in this file has been automatically generated by\n" "**\n" - "** $Header: /home/drh/sqlite/trans/cvs/sqlite/sqlite/tool/mkkeywordhash.c,v 1.26 2007/03/27 14:44:52 drh Exp $\n" + "** $Header: /home/drh/sqlite/trans/cvs/sqlite/sqlite/tool/mkkeywordhash.c,v 1.27 2007/04/06 11:26:00 drh Exp $\n" "**\n" "** The code in this file implements a function that determines whether\n" "** or not a given identifier is really an SQL keyword. The same thing\n" @@ -233,7 +233,6 @@ static Keyword aKeywordTable[] = { { "ROW", "TK_ROW", TRIGGER }, { "SELECT", "TK_SELECT", ALWAYS }, { "SET", "TK_SET", ALWAYS }, - { "STATEMENT", "TK_STATEMENT", TRIGGER }, { "TABLE", "TK_TABLE", ALWAYS }, { "TEMP", "TK_TEMP", ALWAYS }, { "TEMPORARY", "TK_TEMP", ALWAYS }, diff --git a/www/lang.tcl b/www/lang.tcl index 2ea5f94da2..7560a0dedb 100644 --- a/www/lang.tcl +++ b/www/lang.tcl @@ -1,7 +1,7 @@ # # Run this Tcl script to generate the lang-*.html files. # -set rcsid {$Id: lang.tcl,v 1.127 2007/03/27 15:00:31 drh Exp $} +set rcsid {$Id: lang.tcl,v 1.128 2007/04/06 11:26:00 drh Exp $} source common.tcl if {[llength $argv]>0} { @@ -658,7 +658,7 @@ UPDATE OF } Syntax {trigger-action} { -[ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN ] +[ FOR EACH ROW ] [ WHEN ] BEGIN ; [ ; ]* END @@ -2008,7 +2008,6 @@ set keyword_list [lsort { ROW* SELECT SET - STATEMENT* TABLE TEMP* TEMPORARY*