]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The FOR EACH STATEMENT clause in a trigger is now a syntax error. It used
authordrh <drh@noemail.net>
Fri, 6 Apr 2007 11:26:00 +0000 (11:26 +0000)
committerdrh <drh@noemail.net>
Fri, 6 Apr 2007 11:26:00 +0000 (11:26 +0000)
to be silently ignored.  STATEMENT is no longer a keyword. (CVS 3821)

FossilOrigin-Name: 8e2559b4da6329d7c21925d0850f7f91a3731975

manifest
manifest.uuid
src/parse.y
src/sqliteInt.h
src/trigger.c
test/fkey1.test
test/trigger1.test
tool/mkkeywordhash.c
www/lang.tcl

index fcc44a6328b756b9b6a8baa3f5d9461de039f987..af5499c984e0d0d6980cf3d2be2626d5de4ed19b 100644 (file)
--- 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
index c4f58a468439472752872adee20aa206f3d88bf3..c9f03c8fa9a8d5d3ba1ee39b139ad0fa970594a8 100644 (file)
@@ -1 +1 @@
-a776d93ccae3bfa6e992cdd1387571dd21561f98
\ No newline at end of file
+8e2559b4da6329d7c21925d0850f7f91a3731975
\ No newline at end of file
index 6fe05de7614b8d9d179edb05d1af3fb85df4638e..372224ae15d1013c97903715e2e27e69921292f1 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.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($$);}
index 6374a97a74d6e6a4937bcde62f9f2141ca9d406e..6c976deae3e353ca14b030b458baeb3272b9e81d 100644 (file)
@@ -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 <column-list> trigger,
                              the <column-list> 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*);
index f8c2bcd8c9fca46ea7ed559f3e504a33f5d6fe64..4a929adde0cab8a6f73614d543fbc782fae24749 100644 (file)
@@ -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;
index 8a06b05968f336b522c13a8b308f378c42317e5b..52b52d3fe360f84d206bc89dae4ad5155b83c518 100644 (file)
@@ -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)
     );
index ca23335822c420a2e8ad2968760bf879c0e7d03d..c1cb75582120bb019b22d00b7e2d51f7ed55f3c7 100644 (file)
@@ -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);
index 3282f0da87c79bbe163b8d87442aa9cf6ff2586f..8e8cb96329e765f0733c044aa20b51e6a4c8be9f 100644 (file)
@@ -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                 },
index 2ea5f94da2be9786c1bc001453bec122670219d6..7560a0dedb3aac3b0ce7fc58bde2641b88c22043 100644 (file)
@@ -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 <column-list>
 }
 
 Syntax {trigger-action} {
-[ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN <expression> ] 
+[ FOR EACH ROW ] [ WHEN <expression> ] 
 BEGIN 
   <trigger-step> ; [ <trigger-step> ; ]*
 END
@@ -2008,7 +2008,6 @@ set keyword_list [lsort {
    ROW*
    SELECT
    SET
-   STATEMENT*
    TABLE
    TEMP*
    TEMPORARY*