diff options
author | drh <> | 2023-03-28 11:18:04 +0000 |
---|---|---|
committer | drh <> | 2023-03-28 11:18:04 +0000 |
commit | 3cbf38c7832e234aab1848e32c104fe345e19e4f (patch) | |
tree | 6821e5e42b3e349d1c92cd308aed7df4a655cf32 /src/delete.c | |
parent | fc6c3936aac93d7c47c2780b0254422737a23090 (diff) | |
download | sqlite-3cbf38c7832e234aab1848e32c104fe345e19e4f.tar.gz sqlite-3cbf38c7832e234aab1848e32c104fe345e19e4f.zip |
Fix multiple problems with RETURNING on a DML statement against a view,
all inspired by [forum:/forumpost/dc3b92cfa0|forum post dc3b92cfa0].
(1) Do not allow a RETURNING clause to trick the code generator into thinking
that the view being updated has an INSTEAD OF trigger.
(2) Generate all result columns for a view in a DML statement.
(3) The automatic covering index for a view should cover all result columns
of the view.
FossilOrigin-Name: c8bedef0d61731c29ae34de1594222d15b578f9e2cddbbd5b74fb3059644fe0f
Diffstat (limited to 'src/delete.c')
-rw-r--r-- | src/delete.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/delete.c b/src/delete.c index 22ef7ab65..27a554916 100644 --- a/src/delete.c +++ b/src/delete.c @@ -114,13 +114,15 @@ static int tabIsReadOnly(Parse *pParse, Table *pTab){ ** If pTab is writable but other errors have occurred -> return 1. ** If pTab is writable and no prior errors -> return 0; */ -int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ +int sqlite3IsReadOnly(Parse *pParse, Table *pTab, Trigger *pTrigger){ if( tabIsReadOnly(pParse, pTab) ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; } #ifndef SQLITE_OMIT_VIEW - if( !viewOk && IsView(pTab) ){ + if( IsView(pTab) + && (pTrigger==0 || (pTrigger->bReturning && pTrigger->pNext==0)) + ){ sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); return 1; } @@ -374,7 +376,7 @@ void sqlite3DeleteFrom( goto delete_from_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){ goto delete_from_cleanup; } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |