diff options
author | dan <Dan Kennedy> | 2023-10-20 17:06:39 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2023-10-20 17:06:39 +0000 |
commit | 17c3408e0eb1fd8cac354af525a24edda47ffe2c (patch) | |
tree | aedfd4bdce93d47acb8113d5117db18ab1d69527 /src | |
parent | 90e4a3b7fcdf63035d6f35eb44d11ff58ff4b068 (diff) | |
download | sqlite-17c3408e0eb1fd8cac354af525a24edda47ffe2c.tar.gz sqlite-17c3408e0eb1fd8cac354af525a24edda47ffe2c.zip |
Add the SQLITE_CHANGESETAPPLY_FKNOACTION flag to sqlite3session.h, for passing to sqlite3changeset_apply_v2() to cause all foreign key constraints to behave as if they were declared NO ACTION.
FossilOrigin-Name: fc9f82ea084159eaf3dd1757b96d17d1201b00c4e06455a7dcd8067172b25f28
Diffstat (limited to 'src')
-rw-r--r-- | src/fkey.c | 11 | ||||
-rw-r--r-- | src/sqliteInt.h | 1 |
2 files changed, 10 insertions, 2 deletions
diff --git a/src/fkey.c b/src/fkey.c index 3142e0ca6..6b1d747c8 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -853,7 +853,7 @@ static int fkParentIsModified( */ static int isSetNullAction(Parse *pParse, FKey *pFKey){ Parse *pTop = sqlite3ParseToplevel(pParse); - if( pTop->pTriggerPrg ){ + if( pTop->pTriggerPrg && 0==(pTop->db->flags & SQLITE_FkNoAction) ){ Trigger *p = pTop->pTriggerPrg->pTrigger; if( (p==pFKey->apTrigger[0] && pFKey->aAction[0]==OE_SetNull) || (p==pFKey->apTrigger[1] && pFKey->aAction[1]==OE_SetNull) @@ -1052,6 +1052,8 @@ void sqlite3FkCheck( } if( regOld!=0 ){ int eAction = pFKey->aAction[aChange!=0]; + if( (db->flags & SQLITE_FkNoAction) ) eAction = OE_None; + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1); /* If this is a deferred FK constraint, or a CASCADE or SET NULL ** action applies, then any foreign key violations caused by @@ -1167,7 +1169,11 @@ int sqlite3FkRequired( /* Check if any parent key columns are being modified. */ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ if( fkParentIsModified(pTab, p, aChange, chngRowid) ){ - if( p->aAction[1]!=OE_None ) return 2; + if( (pParse->db->flags & SQLITE_FkNoAction)==0 + && p->aAction[1]!=OE_None + ){ + return 2; + } bHaveFK = 1; } } @@ -1217,6 +1223,7 @@ static Trigger *fkActionTrigger( int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ action = pFKey->aAction[iAction]; + if( (db->flags & SQLITE_FkNoAction) ) action = OE_None; if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ return 0; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 85492fbec..b6cc81fba 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1845,6 +1845,7 @@ struct sqlite3 { /* the count using a callback. */ #define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */ #define SQLITE_ReadUncommit HI(0x00004) /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_FkNoAction HI(0x00008) /* Treat all FK as NO ACTION */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG |