mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Add the ability to enable and disable foreign key constraints and triggers
using calls to sqlite3_db_config(). FossilOrigin-Name: 09e167f9c14625924b17bbb1f292f89ac9ddc93a
This commit is contained in:
0
install-sh
Executable file → Normal file
0
install-sh
Executable file → Normal file
30
manifest
30
manifest
@@ -1,8 +1,8 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
Hash: SHA1
|
Hash: SHA1
|
||||||
|
|
||||||
C Add\sa\stest\scase\sto\sverify\sthat\sticket\s[f7b4edece25c994857]\sis\sfixed.
|
C Add\sthe\sability\sto\senable\sand\sdisable\sforeign\skey\sconstraints\sand\striggers\nusing\scalls\sto\ssqlite3_db_config().
|
||||||
D 2011-03-19T02:04:02.294
|
D 2011-03-21T17:15:58.841
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -102,7 +102,7 @@ F ext/rtree/rtree_util.tcl 06aab2ed5b826545bf215fff90ecb9255a8647ea
|
|||||||
F ext/rtree/sqlite3rtree.h 1af0899c63a688e272d69d8e746f24e76f10a3f0
|
F ext/rtree/sqlite3rtree.h 1af0899c63a688e272d69d8e746f24e76f10a3f0
|
||||||
F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
|
F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
|
||||||
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
|
F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
|
||||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
|
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
|
||||||
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
|
||||||
F main.mk 54190fab7cdba523e311c274c95ea480f32abfb5
|
F main.mk 54190fab7cdba523e311c274c95ea480f32abfb5
|
||||||
F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
|
F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
|
||||||
@@ -146,7 +146,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e
|
|||||||
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
|
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
|
||||||
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
|
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
|
||||||
F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e
|
F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e
|
||||||
F src/main.c b43dc11c8335ceb759d48358ddafe09f02b18a1d
|
F src/main.c 6d10370bfc2235b7d6cf78510b20c94c00123357
|
||||||
F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1
|
F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1
|
||||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||||
F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206
|
F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206
|
||||||
@@ -181,9 +181,9 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
|
|||||||
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
||||||
F src/select.c d24406c45dd2442eb2eeaac413439066b149c944
|
F src/select.c d24406c45dd2442eb2eeaac413439066b149c944
|
||||||
F src/shell.c 4a5e0ad845475c84881f0b25b1abba2ddaab0a72
|
F src/shell.c 4a5e0ad845475c84881f0b25b1abba2ddaab0a72
|
||||||
F src/sqlite.h.in 369c767e6b9f101d63d8e4c5e40279f975ccec08
|
F src/sqlite.h.in 9d85096265a53db6c9d452eb478d5ced15308275
|
||||||
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
|
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
|
||||||
F src/sqliteInt.h 223159f987959f7ed55ebe5b5d175842ebb7647f
|
F src/sqliteInt.h 1de0edab31cc9e5c2f3540e08e8b97926f84bfeb
|
||||||
F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44
|
F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44
|
||||||
F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc
|
F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc
|
||||||
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
|
||||||
@@ -229,7 +229,7 @@ F src/test_vfs.c 2ed8853c1e51ac6f9ea091f7ce4e0d618bba8b86
|
|||||||
F src/test_vfstrace.c f5c3b3b893d81a580d0f577e6d9bcfc1fd496136
|
F src/test_vfstrace.c f5c3b3b893d81a580d0f577e6d9bcfc1fd496136
|
||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080
|
F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080
|
||||||
F src/trigger.c 95d2ff4b2996fabe886c9764b5978980e29f4afa
|
F src/trigger.c ec4813709e990a169b6923293e839fa5dfd64282
|
||||||
F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9
|
F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9
|
||||||
F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
|
F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
|
||||||
F src/util.c cd997077bad039efc0597eb027c929658f93c018
|
F src/util.c cd997077bad039efc0597eb027c929658f93c018
|
||||||
@@ -605,7 +605,7 @@ F test/permutations.test 5b2a4cb756ffb2407cb4743163668d1d769febb6
|
|||||||
F test/pragma.test fdfc09067ea104a0c247a1a79d8093b56656f850
|
F test/pragma.test fdfc09067ea104a0c247a1a79d8093b56656f850
|
||||||
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
|
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
|
||||||
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
|
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
|
||||||
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
|
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 x
|
||||||
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
|
||||||
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
|
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
|
||||||
F test/quota.test ddafe133653093eb9a99ccd6264884ae43f9c9b8
|
F test/quota.test ddafe133653093eb9a99ccd6264884ae43f9c9b8
|
||||||
@@ -893,7 +893,7 @@ F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
|
|||||||
F tool/lemon.c dfd81a51b6e27e469ba21d01a75ddf092d429027
|
F tool/lemon.c dfd81a51b6e27e469ba21d01a75ddf092d429027
|
||||||
F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
|
F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
|
||||||
F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309
|
F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309
|
||||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
|
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
|
||||||
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
|
||||||
F tool/mksqlite3c.tcl cf44512a48112b1ba09590548660a5a6877afdb3
|
F tool/mksqlite3c.tcl cf44512a48112b1ba09590548660a5a6877afdb3
|
||||||
F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff
|
F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff
|
||||||
@@ -918,14 +918,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 36c04dd1695f0899b53ce58738181b146fc005ed
|
P eedbcf0a0ba91bb8b9cd3d115081ba297e9959fe
|
||||||
R 1ce5c0e249ae858a147a69727867b631
|
R 280ad38169dd48b2d9e175160372c567
|
||||||
U drh
|
U drh
|
||||||
Z 179ccdf4b38b983395c742d9461b85ad
|
Z e8e199200b835ba249870038ad2cd6dc
|
||||||
-----BEGIN PGP SIGNATURE-----
|
-----BEGIN PGP SIGNATURE-----
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||||
|
|
||||||
iD8DBQFNhA8WoxKgR168RlERApdUAJ0ZcnA8de9+BAKkGU67ZwJ/tScyAACcDr2W
|
iD8DBQFNh4fToxKgR168RlERAhHRAJ4u99dZIoFOU0P2cr07ePpksHkgggCfST1g
|
||||||
TL3YrSbPYZGi8T9lSJDGJ70=
|
F/4WAG+YZz9MPVjqi2BaEUo=
|
||||||
=7h3j
|
=dT9z
|
||||||
-----END PGP SIGNATURE-----
|
-----END PGP SIGNATURE-----
|
||||||
|
@@ -1 +1 @@
|
|||||||
eedbcf0a0ba91bb8b9cd3d115081ba297e9959fe
|
09e167f9c14625924b17bbb1f292f89ac9ddc93a
|
30
src/main.c
30
src/main.c
@@ -522,7 +522,35 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
static const struct {
|
||||||
|
int op; /* The opcode */
|
||||||
|
u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */
|
||||||
|
} aFlagOp[] = {
|
||||||
|
{ SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys },
|
||||||
|
{ SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger },
|
||||||
|
};
|
||||||
|
int i;
|
||||||
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
|
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
|
||||||
|
for(i=0; i<ArraySize(aFlagOp); i++){
|
||||||
|
if( aFlagOp[i].op==op ){
|
||||||
|
int onoff = va_arg(ap, int);
|
||||||
|
int *pRes = va_arg(ap, int*);
|
||||||
|
u32 oldFlags = db->flags;
|
||||||
|
if( onoff>0 ){
|
||||||
|
db->flags |= aFlagOp[i].mask;
|
||||||
|
}else if( onoff==0 ){
|
||||||
|
db->flags &= ~aFlagOp[i].mask;
|
||||||
|
}
|
||||||
|
if( oldFlags!=db->flags ){
|
||||||
|
sqlite3ExpirePreparedStatements(db);
|
||||||
|
}
|
||||||
|
if( pRes ){
|
||||||
|
*pRes = (db->flags & aFlagOp[i].mask)!=0;
|
||||||
|
}
|
||||||
|
rc = SQLITE_OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1855,7 +1883,7 @@ static int openDatabase(
|
|||||||
db->autoCommit = 1;
|
db->autoCommit = 1;
|
||||||
db->nextAutovac = -1;
|
db->nextAutovac = -1;
|
||||||
db->nextPagesize = 0;
|
db->nextPagesize = 0;
|
||||||
db->flags |= SQLITE_ShortColNames | SQLITE_AutoIndex
|
db->flags |= SQLITE_ShortColNames | SQLITE_AutoIndex | SQLITE_EnableTrigger
|
||||||
#if SQLITE_DEFAULT_FILE_FORMAT<4
|
#if SQLITE_DEFAULT_FILE_FORMAT<4
|
||||||
| SQLITE_LegacyFileFmt
|
| SQLITE_LegacyFileFmt
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1125,17 +1125,12 @@ int sqlite3_config(int, ...);
|
|||||||
** The sqlite3_db_config() interface is used to make configuration
|
** The sqlite3_db_config() interface is used to make configuration
|
||||||
** changes to a [database connection]. The interface is similar to
|
** changes to a [database connection]. The interface is similar to
|
||||||
** [sqlite3_config()] except that the changes apply to a single
|
** [sqlite3_config()] except that the changes apply to a single
|
||||||
** [database connection] (specified in the first argument). The
|
** [database connection] (specified in the first argument).
|
||||||
** sqlite3_db_config() interface should only be used immediately after
|
|
||||||
** the database connection is created using [sqlite3_open()],
|
|
||||||
** [sqlite3_open16()], or [sqlite3_open_v2()].
|
|
||||||
**
|
**
|
||||||
** The second argument to sqlite3_db_config(D,V,...) is the
|
** The second argument to sqlite3_db_config(D,V,...) is the
|
||||||
** configuration verb - an integer code that indicates what
|
** [SQLITE_DBCONIG_LOOKASIDE | configuration verb] - an integer code
|
||||||
** aspect of the [database connection] is being configured.
|
** that indicates what aspect of the [database connection] is being configured.
|
||||||
** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE].
|
** Subsequent arguments vary depending on the configuration verb.
|
||||||
** New verbs are likely to be added in future releases of SQLite.
|
|
||||||
** Additional arguments depend on the verb.
|
|
||||||
**
|
**
|
||||||
** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if
|
** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if
|
||||||
** the call is considered successful.
|
** the call is considered successful.
|
||||||
@@ -1483,9 +1478,31 @@ struct sqlite3_mem_methods {
|
|||||||
** memory is in use leaves the configuration unchanged and returns
|
** memory is in use leaves the configuration unchanged and returns
|
||||||
** [SQLITE_BUSY].)^</dd>
|
** [SQLITE_BUSY].)^</dd>
|
||||||
**
|
**
|
||||||
|
** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt>
|
||||||
|
** <dd> ^This option is used to enable or disable the enforcement of
|
||||||
|
** [foreign key constraints]. There should be two additional arguments.
|
||||||
|
** The first argument is an integer which is 0 to disable FK enforcement,
|
||||||
|
** positive to enable FK enforcement or negative to leave FK enforcement
|
||||||
|
** unchanged. The second parameter is a pointer to an integer into which
|
||||||
|
** is written 0 or 1 to indicate whether FK enforcement is off or on
|
||||||
|
** following this call. The second parameter may be a NULL pointer, in
|
||||||
|
** which case the FK enforcement setting is not reported back. </dd>
|
||||||
|
**
|
||||||
|
** <dt>SQLITE_DBCONFIG_ENABLE_TRIGGER</dt>
|
||||||
|
** <dd> ^This option is used to enable or disable [CREATE TRIGGER | triggers].
|
||||||
|
** There should be two additional arguments.
|
||||||
|
** The first argument is an integer which is 0 to disable triggers,
|
||||||
|
** positive to enable trigers or negative to leave the setting unchanged.
|
||||||
|
** The second parameter is a pointer to an integer into which
|
||||||
|
** is written 0 or 1 to indicate whether triggers are disabled or enabled
|
||||||
|
** following this call. The second parameter may be a NULL pointer, in
|
||||||
|
** which case the trigger setting is not reported back. </dd>
|
||||||
|
**
|
||||||
** </dl>
|
** </dl>
|
||||||
*/
|
*/
|
||||||
#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */
|
#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */
|
||||||
|
#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */
|
||||||
|
#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -925,6 +925,7 @@ struct sqlite3 {
|
|||||||
#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */
|
#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */
|
||||||
#define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */
|
#define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */
|
||||||
#define SQLITE_LoadExtension 0x20000000 /* Enable load_extension */
|
#define SQLITE_LoadExtension 0x20000000 /* Enable load_extension */
|
||||||
|
#define SQLITE_EnableTrigger 0x40000000 /* True to enable triggers */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Bits of the sqlite3.flags field that are used by the
|
** Bits of the sqlite3.flags field that are used by the
|
||||||
|
@@ -623,8 +623,12 @@ Trigger *sqlite3TriggersExist(
|
|||||||
int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
|
int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
|
||||||
){
|
){
|
||||||
int mask = 0;
|
int mask = 0;
|
||||||
Trigger *pList = sqlite3TriggerList(pParse, pTab);
|
Trigger *pList = 0;
|
||||||
Trigger *p;
|
Trigger *p;
|
||||||
|
|
||||||
|
if( (pParse->db->flags & SQLITE_EnableTrigger)!=0 ){
|
||||||
|
pList = sqlite3TriggerList(pParse, pTab);
|
||||||
|
}
|
||||||
assert( pList==0 || IsVirtual(pTab)==0 );
|
assert( pList==0 || IsVirtual(pTab)==0 );
|
||||||
for(p=pList; p; p=p->pNext){
|
for(p=pList; p; p=p->pNext){
|
||||||
if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
|
if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
|
||||||
|
0
test/progress.test
Normal file → Executable file
0
test/progress.test
Normal file → Executable file
0
tool/mkopts.tcl
Normal file → Executable file
0
tool/mkopts.tcl
Normal file → Executable file
Reference in New Issue
Block a user