1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

For upsert, the constraint check code generator uses a copy of the index list

for the target table, which can potentially be reordered.

FossilOrigin-Name: 3194c00c2c6a32bdfd5acc9fda5b38ae131d20cd3b7aea8512a41b2e76808f6a
This commit is contained in:
drh
2020-12-09 20:30:47 +00:00
parent 5602777e8f
commit e84ad92f17
5 changed files with 59 additions and 26 deletions

View File

@@ -25,6 +25,7 @@ static void SQLITE_NOINLINE upsertDelete(sqlite3 *db, Upsert *p){
sqlite3ExprDelete(db, p->pUpsertTargetWhere);
sqlite3ExprListDelete(db, p->pUpsertSet);
sqlite3ExprDelete(db, p->pUpsertWhere);
sqlite3DbFree(db, p->pIdxList);
sqlite3DbFree(db, p);
p = pNext;
}while( p );
@@ -60,7 +61,7 @@ Upsert *sqlite3UpsertNew(
Upsert *pNext /* Next ON CONFLICT clause in the list */
){
Upsert *pNew;
pNew = sqlite3DbMallocRaw(db, sizeof(Upsert));
pNew = sqlite3DbMallocZero(db, sizeof(Upsert));
if( pNew==0 ){
sqlite3ExprListDelete(db, pTarget);
sqlite3ExprDelete(db, pTargetWhere);
@@ -73,7 +74,6 @@ Upsert *sqlite3UpsertNew(
pNew->pUpsertTargetWhere = pTargetWhere;
pNew->pUpsertSet = pSet;
pNew->pUpsertWhere = pWhere;
pNew->pUpsertIdx = 0;
pNew->pNextUpsert = pNext;
}
return pNew;