From: dan Date: Mon, 21 Sep 2009 16:06:03 +0000 (+0000) Subject: Fix compilation with OMIT_TRIGGER defined. Ticket [1ff6d29030e9757d052af0f394e56bea96... X-Git-Tag: fts3-refactor~178 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=75cbd984f7d01dd6e6f34f0b0cc8f5caf1d575fb;p=thirdparty%2Fsqlite.git Fix compilation with OMIT_TRIGGER defined. Ticket [1ff6d29030e9757d052af0f394e56bea96b8b59b|1ff6d29030]. FossilOrigin-Name: fb6ceed388f6d75bdc2ac2f43e5c98da74e2a448 --- diff --git a/manifest b/manifest index 704230f97d..44c01c515e 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 7dd72e3e53..8ccad2fd9f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aab7a4b3c91e0a149f6499660892d09c17b010e3 \ No newline at end of file +fb6ceed388f6d75bdc2ac2f43e5c98da74e2a448 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index a384ade736..fe01548820 100644 --- a/src/delete.c +++ b/src/delete.c @@ -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 diff --git a/src/fkey.c b/src/fkey.c index 1d9895aff0..8e5a6a96fe 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -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 */ diff --git a/src/insert.c b/src/insert.c index 071f65d56b..07fd386c2e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -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 diff --git a/src/parse.y b/src/parse.y index f3ea25e087..ab7422644b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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;} diff --git a/src/pragma.c b/src/pragma.c index e2ad17d76f..1582b27bcd 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -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 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b59e2bf5ba..0b3ee63517 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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. diff --git a/src/update.c b/src/update.c index c5463bc733..0d86ebf7e6 100644 --- a/src/update.c +++ b/src/update.c @@ -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 diff --git a/src/vacuum.c b/src/vacuum.c index 96bcaca6d7..00f3511d88 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -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)); diff --git a/test/autoinc.test b/test/autoinc.test index 0207179b1a..983b9b8321 100644 --- a/test/autoinc.test +++ b/test/autoinc.test @@ -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} +} diff --git a/test/fkey2.test b/test/fkey2.test index c2d9a14039..80f7470a3b 100644 --- a/test/fkey2.test +++ b/test/fkey2.test @@ -16,6 +16,11 @@ 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 diff --git a/test/selectC.test b/test/selectC.test index 10804a9b92..7ae2690057 100644 --- a/test/selectC.test +++ b/test/selectC.test @@ -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 diff --git a/test/tkt3201.test b/test/tkt3201.test index 9bdda1af28..47c5ebb5fd 100644 --- a/test/tkt3201.test +++ b/test/tkt3201.test @@ -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} +} diff --git a/test/tkt3810.test b/test/tkt3810.test index 27b40a9310..7e1b2ec5c9 100644 --- a/test/tkt3810.test +++ b/test/tkt3810.test @@ -15,6 +15,10 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +ifcapable {!trigger} { + finish_test + return +} # Create a table using the first database connection. # diff --git a/test/tkt3832.test b/test/tkt3832.test index 9c733071a9..bb73c8c7d0 100644 --- a/test/tkt3832.test +++ b/test/tkt3832.test @@ -18,6 +18,10 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +ifcapable {!trigger} { + finish_test + return +} do_test tkt3832-1.1 { diff --git a/test/tkt3929.test b/test/tkt3929.test index 47e13bfd52..3ed4d288c4 100644 --- a/test/tkt3929.test +++ b/test/tkt3929.test @@ -15,6 +15,10 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +ifcapable {!trigger} { + finish_test + return +} do_test tkt3929-1.0 { execsql { diff --git a/test/tkt3992.test b/test/tkt3992.test index a3fac63ddc..be7e50d709 100644 --- a/test/tkt3992.test +++ b/test/tkt3992.test @@ -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 diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 58e10c8246..a6b4a58ac3 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -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 },