-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
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
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
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
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
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
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
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
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
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
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
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
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
-aab7a4b3c91e0a149f6499660892d09c17b010e3
\ No newline at end of file
+fb6ceed388f6d75bdc2ac2f43e5c98da74e2a448
\ No newline at end of file
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
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
#include "sqliteInt.h"
#ifndef SQLITE_OMIT_FOREIGN_KEY
+#ifndef SQLITE_OMIT_TRIGGER
/*
** Deferred and Immediate FKs
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 */
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.
}
}
+#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
}
/* 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 */
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.
**
}
}
#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
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;}
{ "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;
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
# 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
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.
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
/*
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
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));
}
} {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}
+}
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+ifcapable {!foreignkey||!trigger} {
+ finish_test
+ return
+}
+
#-------------------------------------------------------------------------
# Test structure:
#
# 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.
#
# 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
# 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
# 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}
+}
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+ifcapable {!trigger} {
+ finish_test
+ return
+}
# Create a table using the first database connection.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+ifcapable {!trigger} {
+ finish_test
+ return
+}
do_test tkt3832-1.1 {
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+ifcapable {!trigger} {
+ finish_test
+ return
+}
do_test tkt3929-1.0 {
execsql {
}
} {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
*/
static Keyword aKeywordTable[] = {
{ "ABORT", "TK_ABORT", CONFLICT|TRIGGER },
+ { "ACTION", "TK_ACTION", FKEY },
{ "ADD", "TK_ADD", ALTER },
{ "AFTER", "TK_AFTER", TRIGGER },
{ "ALL", "TK_ALL", ALWAYS },
{ "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 },