diff options
author | dan <dan@noemail.net> | 2020-07-15 15:32:59 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2020-07-15 15:32:59 +0000 |
commit | 243210b79b1467a727a75c175f0cb6673c28d3f8 (patch) | |
tree | be6e1a5219613ddec624bb0ca72291e0f63076f4 /src | |
parent | 42d7a77b613eb303950fbb013224281ca5633044 (diff) | |
download | sqlite-243210b79b1467a727a75c175f0cb6673c28d3f8.tar.gz sqlite-243210b79b1467a727a75c175f0cb6673c28d3f8.zip |
Fix a problem in SQLITE_ENABLE_HIDDEN_COLUMN builds occuring when an UPDATE...FROM fired an INSTEAD OF trigger.
FossilOrigin-Name: 5176cb7a6a4e8cfa1973aaae46fcd7d39baedb70ae20bfacc82d62ca39fb0aa3
Diffstat (limited to 'src')
-rw-r--r-- | src/sqliteInt.h | 8 | ||||
-rw-r--r-- | src/update.c | 21 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 024029429..da1a3386c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3190,6 +3190,14 @@ struct Select { ** SRT_DistQueue Store results in priority queue pDest->iSDParm only if ** the same record has never been stored before. The ** index at pDest->iSDParm+1 hold all prior stores. +** +** SRT_Upfrom Store results in the temporary table already opened by +** pDest->iSDParm. If (pDest->iSDParm<0), then the temp +** table is an intkey table - in this case the first +** column returned by the SELECT is used as the integer +** key. If (pDest->iSDParm>0), then the table is an index +** table. (pDest->iSDParm) is the number of key columns in +** each index record in this case. */ #define SRT_Union 1 /* Store result as keys in an index */ #define SRT_Except 2 /* Remove result from a UNION index */ diff --git a/src/update.c b/src/update.c index 799caf6ab..c321edce8 100644 --- a/src/update.c +++ b/src/update.c @@ -237,8 +237,8 @@ static void updatePopulateEphTable( ); } } - pSelect = sqlite3SelectNew( - pParse, pList, pSrc, pWhere2, pGroupBy, 0, pOrderBy2, 0, pLimit2 + pSelect = sqlite3SelectNew(pParse, pList, + pSrc, pWhere2, pGroupBy, 0, pOrderBy2, SF_IncludeHidden, pLimit2 ); sqlite3SelectDestInit(&dest, eDest, iEph); dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); @@ -249,9 +249,11 @@ static void updatePopulateEphTable( /* ** Process an UPDATE statement. ** -** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL; -** \_______/ \________/ \______/ \________________/ -* onError pTabList pChanges pWhere +** UPDATE OR IGNORE tbl SET a=b, c=d FROM tbl2... WHERE e<5 AND f NOT NULL; +** \_______/ \_/ \______/ \_____/ \________________/ +** onError | pChanges | pWhere +** \_______________________/ +** pTabList */ void sqlite3Update( Parse *pParse, /* The parser context */ @@ -285,7 +287,7 @@ void sqlite3Update( u8 chngRowid; /* Rowid changed in a normal table */ u8 chngKey; /* Either chngPk or chngRowid */ Expr *pRowidExpr = 0; /* Expression defining the new record number */ - int iRowidExpr = -1; + int iRowidExpr = -1; /* Index of "rowid=" (or IPK) assignment in pChanges */ AuthContext sContext; /* The authorization context */ NameContext sNC; /* The name-context to resolve expressions in */ int iDb; /* Database containing the table being updated */ @@ -309,7 +311,7 @@ void sqlite3Update( i16 nPk = 0; /* Number of components of the PRIMARY KEY */ int bReplace = 0; /* True if REPLACE conflict resolution might happen */ int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ - int nChangeFrom = 0; + int nChangeFrom = 0; /* If there is a FROM, pChanges->nExpr, else 0 */ /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ @@ -348,6 +350,11 @@ void sqlite3Update( # undef isView # define isView 0 #endif + + /* If there was a FROM clause, set nChangeFrom to the number of expressions + ** in the change-list. Otherwise, set it to 0. There cannot be a FROM + ** clause if this function is being called to generate code for part of + ** an UPSERT statement. */ nChangeFrom = (pTabList->nSrc>1) ? pChanges->nExpr : 0; assert( nChangeFrom==0 || pUpsert==0 ); |