]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix compilation with OMIT_TRIGGER defined. Ticket [1ff6d29030e9757d052af0f394e56bea96...
authordan <dan@noemail.net>
Mon, 21 Sep 2009 16:06:03 +0000 (16:06 +0000)
committerdan <dan@noemail.net>
Mon, 21 Sep 2009 16:06:03 +0000 (16:06 +0000)
FossilOrigin-Name: fb6ceed388f6d75bdc2ac2f43e5c98da74e2a448

19 files changed:
manifest
manifest.uuid
src/delete.c
src/fkey.c
src/insert.c
src/parse.y
src/pragma.c
src/sqliteInt.h
src/update.c
src/vacuum.c
test/autoinc.test
test/fkey2.test
test/selectC.test
test/tkt3201.test
test/tkt3810.test
test/tkt3832.test
test/tkt3929.test
test/tkt3992.test
tool/mkkeywordhash.c

index 704230f97dccd295ae09a977765fb5fb301ceb1b..44c01c515eb7f87cd826dc833df1fcc07bf23a61 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sfkey.c\sto\sthe\sautoconf\sand\samalgamation\sbuild\ssystems.
-D 2009-09-19T17:59:59
+C Fix\scompilation\swith\sOMIT_TRIGGER\sdefined.\sTicket\s[1ff6d29030e9757d052af0f394e56bea96b8b59b|1ff6d29030].
+D 2009-09-21T16:06:04
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -113,16 +113,16 @@ F src/build.c 6520093d962891dae01eea545836860fd72f8915
 F src/callback.c 10d237171472865f58fb07d515737238c9e06688
 F src/complete.c 5ad5c6cd4548211867c204c41a126d73a9fbcea0
 F src/date.c 6d936393716d21e6dc0d4222b3443137a60ebe93
-F src/delete.c b7cfab0f55c4c61cc7741fb31504a269eff2e756
+F src/delete.c 15499f5d10047d38e68ce991b3f88cbddb6e0931
 F src/expr.c 638b599adad562d41c3bf90f542f9419664aa7b8
 F src/fault.c dc88c821842157460750d2d61a8a8b4197d047ff
-F src/fkey.c 77a358c5054726e071dd5064990cea7b47fb790e
+F src/fkey.c 0f06ecda52a75a1624e01b7f861a235d97544b98
 F src/func.c e536218d193b8d326aab91120bc4c6f28aa2b606
 F src/global.c 271952d199a8cc59d4ce840b3bbbfd2f30c8ba32
 F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
 F src/hash.h 35b216c13343d0b4f87d9f21969ac55ad72174e1
 F src/hwtime.h 4a1d45f4cae1f402ea19686acf24acf4f0cb53cb
-F src/insert.c f20335f7b8a92d0169ac27987c1b330580516139
+F src/insert.c e4ca9ed8db8ae84b9c020a3d548fb8d6a355e625
 F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
 F src/legacy.c 303b4ffcf1ae652fcf5ef635846c563c254564f6
 F src/lempar.c 0c4d1ab0a5ef2b0381eb81a732c54f68f27a574d
@@ -150,11 +150,11 @@ F src/os_unix.c 5369272992c14dd198c02ddfc2fd7a1516906c40
 F src/os_win.c 49a360be4f42d5a63d00be9aa44449ed4d6717e0
 F src/pager.c ebd0a8f2421e8f0ad5b78201440004bf3e1c96d8
 F src/pager.h 11852d044c86cf5a9d6e34171fb0c4fcf1f6265f
-F src/parse.y e2a89b59361dc8d67628a2f4a7325f3085a0bd0f
+F src/parse.y 030c85b2c5376951f81db48b9154c6938e22b5b5
 F src/pcache.c c92ffd4f3e1279b3766854c6d18b5bf4aac0d1fa
 F src/pcache.h 435ef324197f79391f9c92b71d7f92b548ad7a36
 F src/pcache1.c 211295a9ff6a5b30f1ca50516731a5cf3e9bf82c
-F src/pragma.c 254c21536e493cfd9ddd70cb796c5203a5f0a369
+F src/pragma.c c75db247922d241d7fd9046d73b5c7161d079500
 F src/prepare.c 9803fc01f0db29ac4a17fa662902af285f37c06b
 F src/printf.c 508a1c59433353552b6553cba175eaa7331f8fc1
 F src/random.c 676b9d7ac820fe81e6fb2394ac8c10cff7f38628
@@ -164,7 +164,7 @@ F src/select.c 1d0a13137532321b4364f964e46f057d271691e3
 F src/shell.c d0171721c7402b368e257ddfc09ed54d0c74070c
 F src/sqlite.h.in 5af8181f815831a8672c3834c60e6b4418448bcc
 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
-F src/sqliteInt.h 24000f9bd8631ff11c7bf56785743bb9fd4605dd
+F src/sqliteInt.h 1412bcdc13a5f13fafb9042ddc38388ba1f3953f
 F src/sqliteLimit.h 504a3161886d2938cbd163054ad620b8356df758
 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
 F src/table.c cc86ad3d6ad54df7c63a3e807b5783c90411a08d
@@ -202,10 +202,10 @@ F src/test_thread.c b8a1ab7ca1a632f18e8a361880d5d65eeea08eac
 F src/test_wsd.c 3ae5101de6cbfda2720152ab659ea84079719241
 F src/tokenize.c af8a56e6a50c5042fc305bfa796275e9bf26ff2b
 F src/trigger.c c0d99c2529ab88535fc2856e7729cd05180b9636
-F src/update.c f720f463b1cfb877aedcb5d54df4c29cf7b3d234
+F src/update.c 4fac66ecaea13c9c13e7d3de8da66aae3cce90e2
 F src/utf.c 99cf927eabb104621ba889ac0dd075fc1657ad30
 F src/util.c 59d4e9456bf1fe581f415a783fa0cee6115c8f35
-F src/vacuum.c 3fe0eebea6d2311c1c2ab2962887d11f7a4dcfb0
+F src/vacuum.c 869d08eaab64e2a4eaf4ef9ea34b851892b65a75
 F src/vdbe.c 93040bd3b366b0f9c4f47aa8011f456d1f0c08a9
 F src/vdbe.h 7d5075e3fa4e5587a9be8d5e503857c825490cef
 F src/vdbeInt.h 546ed25cad488c053819e19d09751d71d3ce3601
@@ -238,7 +238,7 @@ F test/attachmalloc.test cf8cf17d183de357b1147a9baacbdfc85b940b61
 F test/auth.test 8f21c160a4562f54f27618e85bac869efcecbcaf
 F test/auth2.test ee3ba272e2b975e913afc9b041ee75706e190005
 F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5
-F test/autoinc.test 381bba4bd610747564743f15a706a4b373c29817
+F test/autoinc.test 85ef3180a737e6580086a018c09c6f1a52759b46
 F test/autovacuum.test 25f891bc343a8bf5d9229e2e9ddab9f31a9ab5ec
 F test/autovacuum_ioerr2.test 598b0663074d3673a9c1bc9a16e80971313bafe6
 F test/avtrans.test 1e901d8102706b63534dbd2bdd4d8f16c4082650
@@ -330,7 +330,7 @@ F test/expr.test 80f3cf99f786ffbac19d2b0083673e7fc797030f
 F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
 F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
 F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
-F test/fkey2.test 207e2cc4bcd758ec1901b3e2daa1e4c101e92ce3
+F test/fkey2.test 62d02fb2c0d115715e990691961a7b679c902204
 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
 F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7
 F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5
@@ -538,7 +538,7 @@ F test/select8.test 391de11bdd52339c30580dabbbbe97e3e9a3c79d
 F test/select9.test b4007b15396cb7ba2615cab31e1973b572e43210
 F test/selectA.test 06d1032fa9009314c95394f2ca2e60d9f7ae8532
 F test/selectB.test f305cc6660804cb239aab4e2f26b0e288b59958b
-F test/selectC.test 035597b7a58917dbf63eed7c393cfe6ce729d7bf
+F test/selectC.test 07a45610c8b3bd878943004fd23f4cc0682bd4c0
 F test/server1.test f5b790d4c0498179151ca8a7715a65a7802c859c
 F test/shared.test 3b448dc0f7a9356e641894ed81c27599f39d809d
 F test/shared2.test d6ba4ca1827ea36a1ac23a99e3c36eeac9165450
@@ -624,7 +624,7 @@ F test/tkt2942.test c5c87d179799ca6d1fbe83c815510b87cd5ec7ce
 F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804
 F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f
 F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b
-F test/tkt3201.test 7aac9921c187de4baad138060802a96956c7fe5d
+F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3
 F test/tkt3292.test 962465a0984a3b8c757efe59c2c59144871ee1dd
 F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c
 F test/tkt3334.test ea13a53cb176e90571a76c86605b14a09efe366d
@@ -653,9 +653,9 @@ F test/tkt3762.test 2a9f3b03df44ec49ec0cfa8d5da6574c2a7853df
 F test/tkt3773.test 430b06567ce40285dfd2c4834a2a61816403efeb
 F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267
 F test/tkt3793.test 754b73f0e6a9349c70dc57e522cf3247272ecd5d
-F test/tkt3810.test 616cfde9c93397dcb6aea079f6e00b4b35e5022c
+F test/tkt3810.test 90fa0635dfa7da9680c8cd3513350a49b3a8ae12
 F test/tkt3824.test 3da2f5c81b057e3ff355f5dfc9aa0cf0a92e0206
-F test/tkt3832.test 7ebd5ac82d1e430accd5eec9768044133a94c2aa
+F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d
 F test/tkt3838.test 2a1525946bc9d3751e1d49ce95f3a2472f2b7408
 F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f
 F test/tkt3871.test 43ecbc8d90dc83908e2a454aef345acc9d160c6f
@@ -663,9 +663,9 @@ F test/tkt3879.test 2ad5bef2c87e9991ce941e054c31abe26ef7fb90
 F test/tkt3911.test 74cd324f3ba653040cc6d94cc4857b290d12d633
 F test/tkt3918.test e6cdf6bfcfe9ba939d86a4238a9dc55d6eec5d42
 F test/tkt3922.test 022ace32c049e3964f68492c12eb803e8e4856d8
-F test/tkt3929.test 6a4c3baefb4e75127356b7d675b5df42c35c00d1
+F test/tkt3929.test 75a862e45bcb39e9a7944c89b92afa531304afca
 F test/tkt3935.test e15261fedb9e30a4305a311da614a5d8e693c767
-F test/tkt3992.test 88bd3d596b4b5ce4cbdf5b2f564d1321276ee097
+F test/tkt3992.test 12e5f884524379ec05b0649eda8f2dc9c15f5395
 F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd
 F test/tkt4018.test 7c2c9ba4df489c676a0a7a0e809a1fb9b2185bd1
 F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7
@@ -733,7 +733,7 @@ F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4
 F tool/genfkey.test 405a43d54f1646bfaa7a84b03bb959aef62a3a49
 F tool/lemon.c 0eb9829c494dfcea449de36ad677efe7f0742801
 F tool/lempar.c 2ed70b3fc896a47e07fedfe543324f008f53d223
-F tool/mkkeywordhash.c 511a848b2ac7a3d93f36adc1e1086b4c5741224b
+F tool/mkkeywordhash.c 8c9f8e3253555101aaa4bf7a0459cbfc8ddc41cc
 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
 F tool/mksqlite3c.tcl 69dc8842a88d1f84c141e1a0bd2e42d8e859397f
@@ -752,7 +752,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P d5d399811876391642937edeb9e8434dd9e356f5
-R 06230fdac92bbf27c51a291b3b61438e
+P aab7a4b3c91e0a149f6499660892d09c17b010e3
+R eef3003df0ef45e48c1734d43e99f3d8
 U dan
-Z 90f71207ff8cd352e341c74b45626fdd
+Z b8e6deab4beb9073bd74dfe36506533c
index 7dd72e3e531c055034302278bd8d1591f5273a49..8ccad2fd9fbbfc45990a68d984edd23e6e3ac37d 100644 (file)
@@ -1 +1 @@
-aab7a4b3c91e0a149f6499660892d09c17b010e3
\ No newline at end of file
+fb6ceed388f6d75bdc2ac2f43e5c98da74e2a448
\ No newline at end of file
index a384ade7369497e28237076f529938d35d13fd77..fe015488209df449fee96ecb129c64b99a15dfe8 100644 (file)
@@ -439,6 +439,15 @@ delete_from_cleanup:
   sqlite3ExprDelete(db, pWhere);
   return;
 }
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation).  */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
 
 /*
 ** This routine generates VDBE code that causes a single row of a
@@ -626,7 +635,3 @@ int sqlite3GenerateIndexKey(
   return regBase;
 }
 
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
index 1d9895aff05af52bca9c0751a19d825072b485a4..8e5a6a96fe0739d56dcd7c0d76f93f41501c54b7 100644 (file)
@@ -14,6 +14,7 @@
 #include "sqliteInt.h"
 
 #ifndef SQLITE_OMIT_FOREIGN_KEY
+#ifndef SQLITE_OMIT_TRIGGER
 
 /*
 ** Deferred and Immediate FKs
@@ -387,6 +388,15 @@ static FKey *fkRefering(Table *pTab){
   return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName, nName);
 }
 
+static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
+  if( p ){
+    TriggerStep *pStep = p->step_list;
+    sqlite3ExprDelete(dbMem, pStep->pWhere);
+    sqlite3ExprListDelete(dbMem, pStep->pExprList);
+    sqlite3DbFree(dbMem, p);
+  }
+}
+
 void sqlite3FkCheck(
   Parse *pParse,                  /* Parse context */
   Table *pTab,                    /* Row is being deleted from this table */ 
@@ -714,15 +724,6 @@ static Trigger *fkActionTrigger(
   return pTrigger;
 }
 
-static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
-  if( p ){
-    TriggerStep *pStep = p->step_list;
-    sqlite3ExprDelete(dbMem, pStep->pWhere);
-    sqlite3ExprListDelete(dbMem, pStep->pExprList);
-    sqlite3DbFree(dbMem, p);
-  }
-}
-
 /*
 ** This function is called when deleting or updating a row to implement
 ** any required CASCADE, SET NULL or SET DEFAULT actions.
@@ -748,6 +749,8 @@ void sqlite3FkActions(
   }
 }
 
+#endif /* ifndef SQLITE_OMIT_TRIGGER */
+
 /*
 ** Free all memory associated with foreign key definitions attached to
 ** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash
@@ -772,13 +775,14 @@ void sqlite3FkDelete(Table *pTab){
     }
 
     /* Delete any triggers created to implement actions for this FK. */
+#ifndef SQLITE_OMIT_TRIGGER
     fkTriggerDelete(pTab->dbMem, pFKey->pOnDelete);
     fkTriggerDelete(pTab->dbMem, pFKey->pOnUpdate);
+#endif
 
     /* Delete the memory allocated for the FK structure. */
     pNext = pFKey->pNextFrom;
     sqlite3DbFree(pTab->dbMem, pFKey);
   }
 }
-
-#endif
+#endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */
index 071f65d56b14e08e187cf259a12b63d20623facb..07fd386c2ecd92b0c12891ab368289cabcd1b11c 100644 (file)
@@ -1047,6 +1047,20 @@ insert_cleanup:
   sqlite3DbFree(db, aRegIdx);
 }
 
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation).  */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
+#ifdef tmask
+ #undef tmask
+#endif
+
+
 /*
 ** Generate code to do constraint checks prior to an INSERT or an UPDATE.
 **
@@ -1801,8 +1815,3 @@ static int xferOptimization(
   }
 }
 #endif /* SQLITE_OMIT_XFER_OPT */
-
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
index f3ea25e08771994f6d16cae4ed2082134cbf8311..ab7422644b03a1688230c7239b11b648bfc14927 100644 (file)
@@ -325,7 +325,7 @@ refact(A) ::= SET NULL.              { A = OE_SetNull; }
 refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
 refact(A) ::= CASCADE.               { A = OE_Cascade; }
 refact(A) ::= RESTRICT.              { A = OE_Restrict; }
-refact(A) ::= NO ACTION.             { A = OE_None; }
+refact(A) ::= NO ACTION.             { A = OE_Restrict; }
 %type defer_subclause {int}
 defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
 defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
index e2ad17d76f1bd93fd53be036eba392397e18265f..1582b27bcd52070a074f3030490fd47c3ab677f9 100644 (file)
@@ -192,8 +192,11 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
     { "read_uncommitted",         SQLITE_ReadUncommitted },
     { "recursive_triggers",       SQLITE_RecTriggers },
 
-    /* TODO: Prevent this flag from being set if not in auto-commit mode? */
+    /* This flag may only be set if both foreign-key and trigger support
+    ** are present in the build.  */
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
     { "foreign_keys",             SQLITE_ForeignKeys },
+#endif
   };
   int i;
   const struct sPragmaType *p;
@@ -207,10 +210,17 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
         if( zRight==0 ){
           returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 );
         }else{
+          int mask = p->mask;          /* Mask of bits to set or clear. */
+          if( db->autoCommit==0 ){
+            /* Foreign key support may not be enabled or disabled while not
+            ** in auto-commit mode.  */
+            mask &= ~(SQLITE_ForeignKeys);
+          }
+
           if( getBoolean(zRight) ){
-            db->flags |= p->mask;
+            db->flags |= mask;
           }else{
-            db->flags &= ~p->mask;
+            db->flags &= ~mask;
           }
 
           /* Many of the flag-pragmas modify the code generated by the SQL 
index b59e2bf5ba8d21d16e243236393e892da3cb5a3d..0b3ee635171b2e0b0e35b9f6c51e08cac94dfe86 100644 (file)
@@ -2722,6 +2722,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
 # define sqlite3DropTriggerPtr(A,B)
 # define sqlite3UnlinkAndDeleteTrigger(A,B,C)
 # define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I,J)
+# define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F)
 # define sqlite3TriggerList(X, Y) 0
 # define sqlite3ParseToplevel(p) p
 # define sqlite3TriggerOldmask(A,B,C,D,E) 0
@@ -2942,19 +2943,30 @@ CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
 int sqlite3TempInMemory(const sqlite3*);
 VTable *sqlite3GetVTable(sqlite3*, Table*);
 
-#ifndef SQLITE_OMIT_FOREIGN_KEY
+/* Declarations for functions in fkey.c. All of these are replaced by
+** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
+** key functionality is available. If OMIT_TRIGGER is defined but
+** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In
+** this case foreign keys are parsed, but no other functionality is 
+** provided (enforcement of FK constraints requires the triggers sub-system).
+*/
+#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
   void sqlite3FkCheck(Parse*, Table*, ExprList*, int, int);
   void sqlite3FkActions(Parse*, Table*, ExprList*, int);
-  void sqlite3FkDelete(Table*);
   int sqlite3FkRequired(Parse*, Table*, ExprList*);
   u32 sqlite3FkOldmask(Parse*, Table*, ExprList*);
 #else
   #define sqlite3FkCheck(a,b,c,d,e)
   #define sqlite3FkActions(a,b,c,d)
-  #define sqlite3FkDelete(a)
   #define sqlite3FkRequired(a,b,c) 0
   #define sqlite3FkOldmask(a,b,c)  0
 #endif
+#ifndef SQLITE_OMIT_FOREIGN_KEY
+  void sqlite3FkDelete(Table*);
+#else
+  #define sqlite3FkDelete(a)
+#endif
+
 
 /*
 ** Available fault injectors.  Should be numbered beginning with 0.
index c5463bc733a392c42044680672af9b5bc35cf4d4..0d86ebf7e6548c83eea311251bc76d5a33626965 100644 (file)
@@ -517,6 +517,15 @@ update_cleanup:
   sqlite3ExprDelete(db, pWhere);
   return;
 }
+/* Make sure "isView" and other macros defined above are undefined. Otherwise
+** thely may interfere with compilation of other functions in this file
+** (or in another file, if this file becomes part of the amalgamation).  */
+#ifdef isView
+ #undef isView
+#endif
+#ifdef pTrigger
+ #undef pTrigger
+#endif
 
 #ifndef SQLITE_OMIT_VIRTUALTABLE
 /*
@@ -611,8 +620,3 @@ static void updateVirtualTable(
   sqlite3SelectDelete(db, pSelect);  
 }
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
-
-/* Make sure "isView" gets undefined in case this file becomes part of
-** the amalgamation - so that subsequent files do not see isView as a
-** macro. */
-#undef isView
index 96bcaca6d71adaa0d01d6253b265a2606fda035c..00f3511d8871106eb71530795ec88a1fdd63c1c7 100644 (file)
@@ -97,11 +97,14 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
     return SQLITE_ERROR;
   }
 
-  /* Save the current value of the write-schema flag before setting it. */
+  /* Save the current value of the database flags so that it can be 
+  ** restored before returning. Then set the writable-schema flag, and
+  ** disable CHECK and foreign key constraints.  */
   saved_flags = db->flags;
   saved_nChange = db->nChange;
   saved_nTotalChange = db->nTotalChange;
   db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks;
+  db->flags &= ~SQLITE_ForeignKeys;
 
   pMain = db->aDb[0].pBt;
   isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain));
index 0207179b1a15df42eb755ce495f92265ec8d4a0b..983b9b8321c75d18864fbfb924bbadafe43b8df9 100644 (file)
@@ -558,108 +558,110 @@ do_test autoinc-9.1 {
   }
 } {t3 0}
 
-catchsql { pragma recursive_triggers = off } 
-
-# Ticket #3928.  Make sure that triggers to not make extra slots in
-# the SQLITE_SEQUENCE table.
-#
-do_test autoinc-3928.1 {
-  db eval {
-    CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
-    CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN
-      INSERT INTO t3928(b) VALUES('before1');
-      INSERT INTO t3928(b) VALUES('before2');
-    END;
-    CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN
-      INSERT INTO t3928(b) VALUES('after1');
-      INSERT INTO t3928(b) VALUES('after2');
-    END;
-    INSERT INTO t3928(b) VALUES('test');
-    SELECT * FROM t3928 ORDER BY a;
-  }
-} {1 before1 2 after1 3 after2 4 before2 5 after1 6 after2 7 test 8 before1 9 before2 10 after1 11 before1 12 before2 13 after2}
-do_test autoinc-3928.2 {
-  db eval {
-    SELECT * FROM sqlite_sequence WHERE name='t3928'
-  }
-} {t3928 13}
-
-do_test autoinc-3928.3 {
-  db eval {
-    DROP TRIGGER t3928r1;
-    DROP TRIGGER t3928r2;
-    CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928 
-      WHEN typeof(new.b)=='integer' BEGIN
-         INSERT INTO t3928(b) VALUES('before-int-' || new.b);
-    END;
-    CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928 
-      WHEN typeof(new.b)=='integer' BEGIN
-         INSERT INTO t3928(b) VALUES('after-int-' || new.b);
-    END;
-    DELETE FROM t3928 WHERE a!=1;
-    UPDATE t3928 SET b=456 WHERE a=1;
-    SELECT * FROM t3928 ORDER BY a;
-  }
-} {1 456 14 before-int-456 15 after-int-456}
-do_test autoinc-3928.4 {
-  db eval {
-    SELECT * FROM sqlite_sequence WHERE name='t3928'
-  }
-} {t3928 15}
-
-do_test autoinc-3928.5 {
-  db eval {
-    CREATE TABLE t3928b(x);
-    INSERT INTO t3928b VALUES(100);
-    INSERT INTO t3928b VALUES(200);
-    INSERT INTO t3928b VALUES(300);
-    DELETE FROM t3928;
-    CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z);
-    CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN
-      INSERT INTO t3928(b) VALUES('before-del-'||old.x);
-      INSERT INTO t3928c(z) VALUES('before-del-'||old.x);
-    END;
-    CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN
-      INSERT INTO t3928(b) VALUES('after-del-'||old.x);
-      INSERT INTO t3928c(z) VALUES('after-del-'||old.x);
-    END;
-    DELETE FROM t3928b;
-    SELECT * FROM t3928 ORDER BY a;
-  }
-} {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300}
-do_test autoinc-3928.6 {
-  db eval {
-    SELECT * FROM t3928c ORDER BY y;
-  }
-} {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300}
-do_test autoinc-3928.7 {
-  db eval {
-    SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name;
-  }
-} {t3928 21 t3928c 6}
-
-# Ticket [a696379c1f0886615541a48b35bd8181a80e88f8]
-do_test autoinc-a69637.1 {
-  db eval {
-    CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
-    CREATE TABLE ta69637_2(z);
-    CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN
-      INSERT INTO ta69637_1(y) VALUES(new.z+1);
-    END;
-    INSERT INTO ta69637_2 VALUES(123);
-    SELECT * FROM ta69637_1;
-  }
-} {1 124}
-do_test autoinc-a69637.2 {
-  db eval {
-    CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2;
-    CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN
-      INSERT INTO ta69637_1(y) VALUES(new.z+10000);
-    END;
-    INSERT INTO va69637_2 VALUES(123);
-    SELECT * FROM ta69637_1;
-  }
-} {1 124 2 10123}
+ifcapable trigger {
+  catchsql { pragma recursive_triggers = off } 
+  
+  # Ticket #3928.  Make sure that triggers to not make extra slots in
+  # the SQLITE_SEQUENCE table.
+  #
+  do_test autoinc-3928.1 {
+    db eval {
+      CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
+      CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN
+        INSERT INTO t3928(b) VALUES('before1');
+        INSERT INTO t3928(b) VALUES('before2');
+      END;
+      CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN
+        INSERT INTO t3928(b) VALUES('after1');
+        INSERT INTO t3928(b) VALUES('after2');
+      END;
+      INSERT INTO t3928(b) VALUES('test');
+      SELECT * FROM t3928 ORDER BY a;
+    }
+  } {1 before1 2 after1 3 after2 4 before2 5 after1 6 after2 7 test 8 before1 9 before2 10 after1 11 before1 12 before2 13 after2}
+  do_test autoinc-3928.2 {
+    db eval {
+      SELECT * FROM sqlite_sequence WHERE name='t3928'
+    }
+  } {t3928 13}
+
+  do_test autoinc-3928.3 {
+    db eval {
+      DROP TRIGGER t3928r1;
+      DROP TRIGGER t3928r2;
+      CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928 
+        WHEN typeof(new.b)=='integer' BEGIN
+           INSERT INTO t3928(b) VALUES('before-int-' || new.b);
+      END;
+      CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928 
+        WHEN typeof(new.b)=='integer' BEGIN
+           INSERT INTO t3928(b) VALUES('after-int-' || new.b);
+      END;
+      DELETE FROM t3928 WHERE a!=1;
+      UPDATE t3928 SET b=456 WHERE a=1;
+      SELECT * FROM t3928 ORDER BY a;
+    }
+  } {1 456 14 before-int-456 15 after-int-456}
+  do_test autoinc-3928.4 {
+    db eval {
+      SELECT * FROM sqlite_sequence WHERE name='t3928'
+    }
+  } {t3928 15}
+  
+  do_test autoinc-3928.5 {
+    db eval {
+      CREATE TABLE t3928b(x);
+      INSERT INTO t3928b VALUES(100);
+      INSERT INTO t3928b VALUES(200);
+      INSERT INTO t3928b VALUES(300);
+      DELETE FROM t3928;
+      CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z);
+      CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN
+        INSERT INTO t3928(b) VALUES('before-del-'||old.x);
+        INSERT INTO t3928c(z) VALUES('before-del-'||old.x);
+      END;
+      CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN
+        INSERT INTO t3928(b) VALUES('after-del-'||old.x);
+        INSERT INTO t3928c(z) VALUES('after-del-'||old.x);
+      END;
+      DELETE FROM t3928b;
+      SELECT * FROM t3928 ORDER BY a;
+    }
+  } {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300}
+  do_test autoinc-3928.6 {
+    db eval {
+      SELECT * FROM t3928c ORDER BY y;
+    }
+  } {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300}
+  do_test autoinc-3928.7 {
+    db eval {
+      SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name;
+    }
+  } {t3928 21 t3928c 6}
+  
+  # Ticket [a696379c1f0886615541a48b35bd8181a80e88f8]
+  do_test autoinc-a69637.1 {
+    db eval {
+      CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
+      CREATE TABLE ta69637_2(z);
+      CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN
+        INSERT INTO ta69637_1(y) VALUES(new.z+1);
+      END;
+      INSERT INTO ta69637_2 VALUES(123);
+      SELECT * FROM ta69637_1;
+    }
+  } {1 124}
+  do_test autoinc-a69637.2 {
+    db eval {
+      CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2;
+      CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN
+        INSERT INTO ta69637_1(y) VALUES(new.z+10000);
+      END;
+      INSERT INTO va69637_2 VALUES(123);
+      SELECT * FROM ta69637_1;
+    }
+  } {1 124 2 10123}
+}
 
 
 
index c2d9a14039d596da1ea9267809962cfcd090919b..80f7470a3b643b9d35bf8acabe561754cd513635 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
+ifcapable {!foreignkey||!trigger} {
+  finish_test
+  return
+}
+
 #-------------------------------------------------------------------------
 # Test structure:
 #
@@ -34,6 +39,9 @@ source $testdir/tester.tcl
 # fkey2-5.*: Check that if foreign-keys are enabled, it is not possible
 #            to write to an FK column using the incremental blob API.
 #
+# fkey2-6.*: Test that FK processing is automatically disabled when 
+#            running VACUUM.
+#
 # fkey2-genfkey.*: Tests that were used with the shell tool .genfkey
 #            command. Recycled to test the built-in implementation.
 #
@@ -359,32 +367,47 @@ do_test fkey2-4.3 {
 # write to a foreign key column while foreign-keys are enabled.
 #
 drop_all_tables
-do_test fkey2-5.1 {
-  execsql {
-    CREATE TABLE t1(a PRIMARY KEY, b);
-    CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1(a));
-    INSERT INTO t1 VALUES('hello', 'world');
-    INSERT INTO t2 VALUES('key', 'hello');
-  }
-} {}
-do_test fkey2-5.2 {
-  set rc [catch { set fd [db incrblob t2 b 1] } msg]
-  list $rc $msg
-} {1 {cannot open foreign key column for writing}}
-do_test fkey2-5.3 {
-  set rc [catch { set fd [db incrblob -readonly t2 b 1] } msg]
-  close $fd
-  set rc
-} {0}
-do_test fkey2-5.4 {
-  execsql { PRAGMA foreign_keys = off }
-  set rc [catch { set fd [db incrblob t2 b 1] } msg]
-  close $fd
-  set rc
-} {0}
-do_test fkey2-5.5 {
-  execsql { PRAGMA foreign_keys = on }
-} {}
+ifcapable incrblob {
+  do_test fkey2-5.1 {
+    execsql {
+      CREATE TABLE t1(a PRIMARY KEY, b);
+      CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1(a));
+      INSERT INTO t1 VALUES('hello', 'world');
+      INSERT INTO t2 VALUES('key', 'hello');
+    }
+  } {}
+  do_test fkey2-5.2 {
+    set rc [catch { set fd [db incrblob t2 b 1] } msg]
+    list $rc $msg
+  } {1 {cannot open foreign key column for writing}}
+  do_test fkey2-5.3 {
+    set rc [catch { set fd [db incrblob -readonly t2 b 1] } msg]
+    close $fd
+    set rc
+  } {0}
+  do_test fkey2-5.4 {
+    execsql { PRAGMA foreign_keys = off }
+    set rc [catch { set fd [db incrblob t2 b 1] } msg]
+    close $fd
+    set rc
+  } {0}
+  do_test fkey2-5.5 {
+    execsql { PRAGMA foreign_keys = on }
+  } {}
+}
+
+drop_all_tables
+ifcapable vacuum {
+  do_test fkey2-6.1 {
+    execsql {
+      CREATE TABLE t1(a REFERENCES t2(c), b);
+      CREATE TABLE t2(c UNIQUE, b);
+      INSERT INTO t2 VALUES(1, 2);
+      INSERT INTO t1 VALUES(1, 2);
+      VACUUM;
+    }
+  } {}
+}
 
 #-------------------------------------------------------------------------
 # The following block of tests, those prefixed with "fkey2-genfkey.", are 
index 10804a9b920e1fbe269aaf8a2ba43681c35f2098..7ae26900571c567344737becbb0bb71f1cd14d8b 100644 (file)
@@ -151,17 +151,19 @@ do_test selectC-1.14.2 {
 
 # The following query used to leak memory.  Verify that has been fixed.
 #
-do_test selectC-2.1 {
-  catchsql {
-    CREATE TABLE t21a(a,b);
-    INSERT INTO t21a VALUES(1,2);
-    CREATE TABLE t21b(n);
-    CREATE TRIGGER r21 AFTER INSERT ON t21b BEGIN
-      SELECT a FROM t21a WHERE a>new.x UNION ALL
-      SELECT b FROM t21a WHERE b>new.x ORDER BY 1 LIMIT 2;
-    END;
-    INSERT INTO t21b VALUES(6);
-  }
-} {1 {no such column: new.x}}
+ifcapable trigger {
+  do_test selectC-2.1 {
+    catchsql {
+      CREATE TABLE t21a(a,b);
+      INSERT INTO t21a VALUES(1,2);
+      CREATE TABLE t21b(n);
+      CREATE TRIGGER r21 AFTER INSERT ON t21b BEGIN
+        SELECT a FROM t21a WHERE a>new.x UNION ALL
+        SELECT b FROM t21a WHERE b>new.x ORDER BY 1 LIMIT 2;
+      END;
+      INSERT INTO t21b VALUES(6);
+    }
+  } {1 {no such column: new.x}}
+}
 
 finish_test
index 9bdda1af28b0998b49f9e2dc9fed67c53f607b7a..47c5ebb5fd6fb46ff76bf41b6c6e8a4f1260afed 100644 (file)
@@ -72,29 +72,31 @@ do_test tkt3201-7 {
 
 # Ticket [efc02f977919]
 #
-do_test tkt3201-4.0 {
-  db eval {
-   CREATE TABLE t4(x);
-   CREATE TABLE t4_log(x);
-   CREATE TRIGGER r4_1 AFTER INSERT ON t4 WHEN new.x=1 BEGIN
-     INSERT INTO t4_log(x) VALUES(new.x);
-   END;
-   CREATE TRIGGER r4_2 AFTER INSERT ON t4 WHEN new.x=2 BEGIN
-     INSERT INTO t4_log(x) VALUES(new.x);
-   END;
-   CREATE TRIGGER r4_3 AFTER INSERT ON t4 WHEN new.x=3 BEGIN
-     INSERT INTO t4_log(x) VALUES(new.x);
-   END;
-   CREATE TRIGGER r4_4 AFTER INSERT ON t4 WHEN new.x=4 BEGIN
-     INSERT INTO t4_log(x) VALUES(new.x);
-   END;
-   INSERT INTO t4 VALUES(1);
-   INSERT INTO t4 VALUES(2);
-   INSERT INTO t4 VALUES(3);
-   INSERT INTO t4 VALUES(4);
-   SELECT * FROM t4_log;
-  }
-} {1 2 3 4}
+ifcapable trigger {
+  do_test tkt3201-4.0 {
+    db eval {
+     CREATE TABLE t4(x);
+     CREATE TABLE t4_log(x);
+     CREATE TRIGGER r4_1 AFTER INSERT ON t4 WHEN new.x=1 BEGIN
+       INSERT INTO t4_log(x) VALUES(new.x);
+     END;
+     CREATE TRIGGER r4_2 AFTER INSERT ON t4 WHEN new.x=2 BEGIN
+       INSERT INTO t4_log(x) VALUES(new.x);
+     END;
+     CREATE TRIGGER r4_3 AFTER INSERT ON t4 WHEN new.x=3 BEGIN
+       INSERT INTO t4_log(x) VALUES(new.x);
+     END;
+     CREATE TRIGGER r4_4 AFTER INSERT ON t4 WHEN new.x=4 BEGIN
+       INSERT INTO t4_log(x) VALUES(new.x);
+     END;
+     INSERT INTO t4 VALUES(1);
+     INSERT INTO t4 VALUES(2);
+     INSERT INTO t4 VALUES(3);
+     INSERT INTO t4 VALUES(4);
+     SELECT * FROM t4_log;
+    }
+  } {1 2 3 4}
+}
 
 
 
index 27b40a9310d35dc8582af042a623519776ad49be..7e1b2ec5c9cddc3deabbcddc1c5964c51ccceeaa 100644 (file)
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+ifcapable {!trigger} {
+  finish_test
+  return
+}
 
 # Create a table using the first database connection.
 #
index 9c733071a90722c47a6aa8ed9f9d8c9bda8f800e..bb73c8c7d061a035cce8482c89abbbb6cf3ddc21 100644 (file)
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+ifcapable {!trigger} {
+  finish_test
+  return
+}
 
 
 do_test tkt3832-1.1 {
index 47e13bfd52048d9de7d211b07dcabfdbc75feee7..3ed4d288c4ca53e31e4b2c2a308539d3c38dcd0e 100644 (file)
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+ifcapable {!trigger} {
+  finish_test
+  return
+}
 
 do_test tkt3929-1.0 {
   execsql {
index a3fac63ddc0e7da79d144f2f6c2f824ca6f5ff7b..be7e50d709798350622c0f9514ed2dde4e2f0575 100644 (file)
@@ -59,19 +59,21 @@ do_test tkt3992-2.2 {
   }
 } {one 2 3}
 
-db function tcl eval
-do_test tkt3992-2.3 {
-  execsql {
-    CREATE TABLE t2(a REAL, b REAL, c REAL);
-    INSERT INTO t2 VALUES(1, 2, 3);
-    CREATE TRIGGER tr2 BEFORE UPDATE ON t2 BEGIN
-      SELECT tcl('set res', typeof(new.c));
-    END;
-
-    UPDATE t2 SET a = 'I';
-  }
-  set res
-} {real}
+ifcapable trigger {
+  db function tcl eval
+  do_test tkt3992-2.3 {
+    execsql {
+      CREATE TABLE t2(a REAL, b REAL, c REAL);
+      INSERT INTO t2 VALUES(1, 2, 3);
+      CREATE TRIGGER tr2 BEFORE UPDATE ON t2 BEGIN
+        SELECT tcl('set res', typeof(new.c));
+      END;
+  
+      UPDATE t2 SET a = 'I';
+    }
+    set res
+  } {real}
+}
 
 
 finish_test
index 58e10c8246756b4a67ef9a1754d4a52a5036ea0c..a6b4a58ac38650134a39675baa48df16eb867d2b 100644 (file)
@@ -144,6 +144,7 @@ struct Keyword {
 */
 static Keyword aKeywordTable[] = {
   { "ABORT",            "TK_ABORT",        CONFLICT|TRIGGER       },
+  { "ACTION",           "TK_ACTION",       FKEY                   },
   { "ADD",              "TK_ADD",          ALTER                  },
   { "AFTER",            "TK_AFTER",        TRIGGER                },
   { "ALL",              "TK_ALL",          ALWAYS                 },
@@ -218,6 +219,7 @@ static Keyword aKeywordTable[] = {
   { "LIMIT",            "TK_LIMIT",        ALWAYS                 },
   { "MATCH",            "TK_MATCH",        ALWAYS                 },
   { "NATURAL",          "TK_JOIN_KW",      ALWAYS                 },
+  { "NO",               "TK_NO",           FKEY                   },
   { "NOT",              "TK_NOT",          ALWAYS                 },
   { "NOTNULL",          "TK_NOTNULL",      ALWAYS                 },
   { "NULL",             "TK_NULL",         ALWAYS                 },