xref: /sqlite-3.40.0/src/update.c (revision c9ef12f6)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** This file contains C code routines that are called by the parser
13 ** to handle UPDATE statements.
14 */
15 #include "sqliteInt.h"
16 
17 #ifndef SQLITE_OMIT_VIRTUALTABLE
18 /* Forward declaration */
19 static void updateVirtualTable(
20   Parse *pParse,       /* The parsing context */
21   SrcList *pSrc,       /* The virtual table to be modified */
22   Table *pTab,         /* The virtual table */
23   ExprList *pChanges,  /* The columns to change in the UPDATE statement */
24   Expr *pRowidExpr,    /* Expression used to recompute the rowid */
25   int *aXRef,          /* Mapping from columns of pTab to entries in pChanges */
26   Expr *pWhere,        /* WHERE clause of the UPDATE statement */
27   int onError          /* ON CONFLICT strategy */
28 );
29 #endif /* SQLITE_OMIT_VIRTUALTABLE */
30 
31 /*
32 ** The most recently coded instruction was an OP_Column to retrieve the
33 ** i-th column of table pTab. This routine sets the P4 parameter of the
34 ** OP_Column to the default value, if any.
35 **
36 ** The default value of a column is specified by a DEFAULT clause in the
37 ** column definition. This was either supplied by the user when the table
38 ** was created, or added later to the table definition by an ALTER TABLE
39 ** command. If the latter, then the row-records in the table btree on disk
40 ** may not contain a value for the column and the default value, taken
41 ** from the P4 parameter of the OP_Column instruction, is returned instead.
42 ** If the former, then all row-records are guaranteed to include a value
43 ** for the column and the P4 value is not required.
44 **
45 ** Column definitions created by an ALTER TABLE command may only have
46 ** literal default values specified: a number, null or a string. (If a more
47 ** complicated default expression value was provided, it is evaluated
48 ** when the ALTER TABLE is executed and one of the literal values written
49 ** into the sqlite_schema table.)
50 **
51 ** Therefore, the P4 parameter is only required if the default value for
52 ** the column is a literal number, string or null. The sqlite3ValueFromExpr()
53 ** function is capable of transforming these types of expressions into
54 ** sqlite3_value objects.
55 **
56 ** If column as REAL affinity and the table is an ordinary b-tree table
57 ** (not a virtual table) then the value might have been stored as an
58 ** integer.  In that case, add an OP_RealAffinity opcode to make sure
59 ** it has been converted into REAL.
60 */
sqlite3ColumnDefault(Vdbe * v,Table * pTab,int i,int iReg)61 void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
62   Column *pCol;
63   assert( pTab!=0 );
64   assert( pTab->nCol>i );
65   pCol = &pTab->aCol[i];
66   if( pCol->iDflt ){
67     sqlite3_value *pValue = 0;
68     u8 enc = ENC(sqlite3VdbeDb(v));
69     assert( !IsView(pTab) );
70     VdbeComment((v, "%s.%s", pTab->zName, pCol->zCnName));
71     assert( i<pTab->nCol );
72     sqlite3ValueFromExpr(sqlite3VdbeDb(v),
73                          sqlite3ColumnExpr(pTab,pCol), enc,
74                          pCol->affinity, &pValue);
75     if( pValue ){
76       sqlite3VdbeAppendP4(v, pValue, P4_MEM);
77     }
78   }
79 #ifndef SQLITE_OMIT_FLOATING_POINT
80   if( pCol->affinity==SQLITE_AFF_REAL && !IsVirtual(pTab) ){
81     sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
82   }
83 #endif
84 }
85 
86 /*
87 ** Check to see if column iCol of index pIdx references any of the
88 ** columns defined by aXRef and chngRowid.  Return true if it does
89 ** and false if not.  This is an optimization.  False-positives are a
90 ** performance degradation, but false-negatives can result in a corrupt
91 ** index and incorrect answers.
92 **
93 ** aXRef[j] will be non-negative if column j of the original table is
94 ** being updated.  chngRowid will be true if the rowid of the table is
95 ** being updated.
96 */
indexColumnIsBeingUpdated(Index * pIdx,int iCol,int * aXRef,int chngRowid)97 static int indexColumnIsBeingUpdated(
98   Index *pIdx,      /* The index to check */
99   int iCol,         /* Which column of the index to check */
100   int *aXRef,       /* aXRef[j]>=0 if column j is being updated */
101   int chngRowid     /* true if the rowid is being updated */
102 ){
103   i16 iIdxCol = pIdx->aiColumn[iCol];
104   assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */
105   if( iIdxCol>=0 ){
106     return aXRef[iIdxCol]>=0;
107   }
108   assert( iIdxCol==XN_EXPR );
109   assert( pIdx->aColExpr!=0 );
110   assert( pIdx->aColExpr->a[iCol].pExpr!=0 );
111   return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr,
112                                             aXRef,chngRowid);
113 }
114 
115 /*
116 ** Check to see if index pIdx is a partial index whose conditional
117 ** expression might change values due to an UPDATE.  Return true if
118 ** the index is subject to change and false if the index is guaranteed
119 ** to be unchanged.  This is an optimization.  False-positives are a
120 ** performance degradation, but false-negatives can result in a corrupt
121 ** index and incorrect answers.
122 **
123 ** aXRef[j] will be non-negative if column j of the original table is
124 ** being updated.  chngRowid will be true if the rowid of the table is
125 ** being updated.
126 */
indexWhereClauseMightChange(Index * pIdx,int * aXRef,int chngRowid)127 static int indexWhereClauseMightChange(
128   Index *pIdx,      /* The index to check */
129   int *aXRef,       /* aXRef[j]>=0 if column j is being updated */
130   int chngRowid     /* true if the rowid is being updated */
131 ){
132   if( pIdx->pPartIdxWhere==0 ) return 0;
133   return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere,
134                                             aXRef, chngRowid);
135 }
136 
137 /*
138 ** Allocate and return a pointer to an expression of type TK_ROW with
139 ** Expr.iColumn set to value (iCol+1). The resolver will modify the
140 ** expression to be a TK_COLUMN reading column iCol of the first
141 ** table in the source-list (pSrc->a[0]).
142 */
exprRowColumn(Parse * pParse,int iCol)143 static Expr *exprRowColumn(Parse *pParse, int iCol){
144   Expr *pRet = sqlite3PExpr(pParse, TK_ROW, 0, 0);
145   if( pRet ) pRet->iColumn = iCol+1;
146   return pRet;
147 }
148 
149 /*
150 ** Assuming both the pLimit and pOrderBy parameters are NULL, this function
151 ** generates VM code to run the query:
152 **
153 **   SELECT <other-columns>, pChanges FROM pTabList WHERE pWhere
154 **
155 ** and write the results to the ephemeral table already opened as cursor
156 ** iEph. None of pChanges, pTabList or pWhere are modified or consumed by
157 ** this function, they must be deleted by the caller.
158 **
159 ** Or, if pLimit and pOrderBy are not NULL, and pTab is not a view:
160 **
161 **   SELECT <other-columns>, pChanges FROM pTabList
162 **   WHERE pWhere
163 **   GROUP BY <other-columns>
164 **   ORDER BY pOrderBy LIMIT pLimit
165 **
166 ** If pTab is a view, the GROUP BY clause is omitted.
167 **
168 ** Exactly how results are written to table iEph, and exactly what
169 ** the <other-columns> in the query above are is determined by the type
170 ** of table pTabList->a[0].pTab.
171 **
172 ** If the table is a WITHOUT ROWID table, then argument pPk must be its
173 ** PRIMARY KEY. In this case <other-columns> are the primary key columns
174 ** of the table, in order. The results of the query are written to ephemeral
175 ** table iEph as index keys, using OP_IdxInsert.
176 **
177 ** If the table is actually a view, then <other-columns> are all columns of
178 ** the view. The results are written to the ephemeral table iEph as records
179 ** with automatically assigned integer keys.
180 **
181 ** If the table is a virtual or ordinary intkey table, then <other-columns>
182 ** is its rowid. For a virtual table, the results are written to iEph as
183 ** records with automatically assigned integer keys For intkey tables, the
184 ** rowid value in <other-columns> is used as the integer key, and the
185 ** remaining fields make up the table record.
186 */
updateFromSelect(Parse * pParse,int iEph,Index * pPk,ExprList * pChanges,SrcList * pTabList,Expr * pWhere,ExprList * pOrderBy,Expr * pLimit)187 static void updateFromSelect(
188   Parse *pParse,                  /* Parse context */
189   int iEph,                       /* Cursor for open eph. table */
190   Index *pPk,                     /* PK if table 0 is WITHOUT ROWID */
191   ExprList *pChanges,             /* List of expressions to return */
192   SrcList *pTabList,              /* List of tables to select from */
193   Expr *pWhere,                   /* WHERE clause for query */
194   ExprList *pOrderBy,             /* ORDER BY clause */
195   Expr *pLimit                    /* LIMIT clause */
196 ){
197   int i;
198   SelectDest dest;
199   Select *pSelect = 0;
200   ExprList *pList = 0;
201   ExprList *pGrp = 0;
202   Expr *pLimit2 = 0;
203   ExprList *pOrderBy2 = 0;
204   sqlite3 *db = pParse->db;
205   Table *pTab = pTabList->a[0].pTab;
206   SrcList *pSrc;
207   Expr *pWhere2;
208   int eDest;
209 
210 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
211   if( pOrderBy && pLimit==0 ) {
212     sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on UPDATE");
213     return;
214   }
215   pOrderBy2 = sqlite3ExprListDup(db, pOrderBy, 0);
216   pLimit2 = sqlite3ExprDup(db, pLimit, 0);
217 #else
218   UNUSED_PARAMETER(pOrderBy);
219   UNUSED_PARAMETER(pLimit);
220 #endif
221 
222   pSrc = sqlite3SrcListDup(db, pTabList, 0);
223   pWhere2 = sqlite3ExprDup(db, pWhere, 0);
224 
225   assert( pTabList->nSrc>1 );
226   if( pSrc ){
227     pSrc->a[0].fg.notCte = 1;
228     pSrc->a[0].iCursor = -1;
229     pSrc->a[0].pTab->nTabRef--;
230     pSrc->a[0].pTab = 0;
231   }
232   if( pPk ){
233     for(i=0; i<pPk->nKeyCol; i++){
234       Expr *pNew = exprRowColumn(pParse, pPk->aiColumn[i]);
235 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
236       if( pLimit ){
237         pGrp = sqlite3ExprListAppend(pParse, pGrp, sqlite3ExprDup(db, pNew, 0));
238       }
239 #endif
240       pList = sqlite3ExprListAppend(pParse, pList, pNew);
241     }
242     eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom;
243   }else if( IsView(pTab) ){
244     for(i=0; i<pTab->nCol; i++){
245       pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i));
246     }
247     eDest = SRT_Table;
248   }else{
249     eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom;
250     pList = sqlite3ExprListAppend(pParse, 0, sqlite3PExpr(pParse,TK_ROW,0,0));
251 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
252     if( pLimit ){
253       pGrp = sqlite3ExprListAppend(pParse, 0, sqlite3PExpr(pParse,TK_ROW,0,0));
254     }
255 #endif
256   }
257   assert( pChanges!=0 || pParse->db->mallocFailed );
258   if( pChanges ){
259     for(i=0; i<pChanges->nExpr; i++){
260       pList = sqlite3ExprListAppend(pParse, pList,
261           sqlite3ExprDup(db, pChanges->a[i].pExpr, 0)
262       );
263     }
264   }
265   pSelect = sqlite3SelectNew(pParse, pList,
266       pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UFSrcCheck|SF_IncludeHidden, pLimit2
267   );
268   if( pSelect ) pSelect->selFlags |= SF_OrderByReqd;
269   sqlite3SelectDestInit(&dest, eDest, iEph);
270   dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1);
271   sqlite3Select(pParse, pSelect, &dest);
272   sqlite3SelectDelete(db, pSelect);
273 }
274 
275 /*
276 ** Process an UPDATE statement.
277 **
278 **   UPDATE OR IGNORE tbl SET a=b, c=d FROM tbl2... WHERE e<5 AND f NOT NULL;
279 **          \_______/ \_/     \______/      \_____/       \________________/
280 **           onError   |      pChanges         |                pWhere
281 **                     \_______________________/
282 **                               pTabList
283 */
sqlite3Update(Parse * pParse,SrcList * pTabList,ExprList * pChanges,Expr * pWhere,int onError,ExprList * pOrderBy,Expr * pLimit,Upsert * pUpsert)284 void sqlite3Update(
285   Parse *pParse,         /* The parser context */
286   SrcList *pTabList,     /* The table in which we should change things */
287   ExprList *pChanges,    /* Things to be changed */
288   Expr *pWhere,          /* The WHERE clause.  May be null */
289   int onError,           /* How to handle constraint errors */
290   ExprList *pOrderBy,    /* ORDER BY clause. May be null */
291   Expr *pLimit,          /* LIMIT clause. May be null */
292   Upsert *pUpsert        /* ON CONFLICT clause, or null */
293 ){
294   int i, j, k;           /* Loop counters */
295   Table *pTab;           /* The table to be updated */
296   int addrTop = 0;       /* VDBE instruction address of the start of the loop */
297   WhereInfo *pWInfo = 0; /* Information about the WHERE clause */
298   Vdbe *v;               /* The virtual database engine */
299   Index *pIdx;           /* For looping over indices */
300   Index *pPk;            /* The PRIMARY KEY index for WITHOUT ROWID tables */
301   int nIdx;              /* Number of indices that need updating */
302   int nAllIdx;           /* Total number of indexes */
303   int iBaseCur;          /* Base cursor number */
304   int iDataCur;          /* Cursor for the canonical data btree */
305   int iIdxCur;           /* Cursor for the first index */
306   sqlite3 *db;           /* The database structure */
307   int *aRegIdx = 0;      /* Registers for to each index and the main table */
308   int *aXRef = 0;        /* aXRef[i] is the index in pChanges->a[] of the
309                          ** an expression for the i-th column of the table.
310                          ** aXRef[i]==-1 if the i-th column is not changed. */
311   u8 *aToOpen;           /* 1 for tables and indices to be opened */
312   u8 chngPk;             /* PRIMARY KEY changed in a WITHOUT ROWID table */
313   u8 chngRowid;          /* Rowid changed in a normal table */
314   u8 chngKey;            /* Either chngPk or chngRowid */
315   Expr *pRowidExpr = 0;  /* Expression defining the new record number */
316   int iRowidExpr = -1;   /* Index of "rowid=" (or IPK) assignment in pChanges */
317   AuthContext sContext;  /* The authorization context */
318   NameContext sNC;       /* The name-context to resolve expressions in */
319   int iDb;               /* Database containing the table being updated */
320   int eOnePass;          /* ONEPASS_XXX value from where.c */
321   int hasFK;             /* True if foreign key processing is required */
322   int labelBreak;        /* Jump here to break out of UPDATE loop */
323   int labelContinue;     /* Jump here to continue next step of UPDATE loop */
324   int flags;             /* Flags for sqlite3WhereBegin() */
325 
326 #ifndef SQLITE_OMIT_TRIGGER
327   int isView;            /* True when updating a view (INSTEAD OF trigger) */
328   Trigger *pTrigger;     /* List of triggers on pTab, if required */
329   int tmask;             /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
330 #endif
331   int newmask;           /* Mask of NEW.* columns accessed by BEFORE triggers */
332   int iEph = 0;          /* Ephemeral table holding all primary key values */
333   int nKey = 0;          /* Number of elements in regKey for WITHOUT ROWID */
334   int aiCurOnePass[2];   /* The write cursors opened by WHERE_ONEPASS */
335   int addrOpen = 0;      /* Address of OP_OpenEphemeral */
336   int iPk = 0;           /* First of nPk cells holding PRIMARY KEY value */
337   i16 nPk = 0;           /* Number of components of the PRIMARY KEY */
338   int bReplace = 0;      /* True if REPLACE conflict resolution might happen */
339   int bFinishSeek = 1;   /* The OP_FinishSeek opcode is needed */
340   int nChangeFrom = 0;   /* If there is a FROM, pChanges->nExpr, else 0 */
341 
342   /* Register Allocations */
343   int regRowCount = 0;   /* A count of rows changed */
344   int regOldRowid = 0;   /* The old rowid */
345   int regNewRowid = 0;   /* The new rowid */
346   int regNew = 0;        /* Content of the NEW.* table in triggers */
347   int regOld = 0;        /* Content of OLD.* table in triggers */
348   int regRowSet = 0;     /* Rowset of rows to be updated */
349   int regKey = 0;        /* composite PRIMARY KEY value */
350 
351   memset(&sContext, 0, sizeof(sContext));
352   db = pParse->db;
353   assert( db->pParse==pParse );
354   if( pParse->nErr ){
355     goto update_cleanup;
356   }
357   assert( db->mallocFailed==0 );
358 
359   /* Locate the table which we want to update.
360   */
361   pTab = sqlite3SrcListLookup(pParse, pTabList);
362   if( pTab==0 ) goto update_cleanup;
363   iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
364 
365   /* Figure out if we have any triggers and if the table being
366   ** updated is a view.
367   */
368 #ifndef SQLITE_OMIT_TRIGGER
369   pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask);
370   isView = IsView(pTab);
371   assert( pTrigger || tmask==0 );
372 #else
373 # define pTrigger 0
374 # define isView 0
375 # define tmask 0
376 #endif
377 #ifdef SQLITE_OMIT_VIEW
378 # undef isView
379 # define isView 0
380 #endif
381 
382 #if TREETRACE_ENABLED
383   if( sqlite3TreeTrace & 0x10000 ){
384     sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__);
385     sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere,
386                           onError, pOrderBy, pLimit, pUpsert, pTrigger);
387   }
388 #endif
389 
390   /* If there was a FROM clause, set nChangeFrom to the number of expressions
391   ** in the change-list. Otherwise, set it to 0. There cannot be a FROM
392   ** clause if this function is being called to generate code for part of
393   ** an UPSERT statement.  */
394   nChangeFrom = (pTabList->nSrc>1) ? pChanges->nExpr : 0;
395   assert( nChangeFrom==0 || pUpsert==0 );
396 
397 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
398   if( !isView && nChangeFrom==0 ){
399     pWhere = sqlite3LimitWhere(
400         pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE"
401     );
402     pOrderBy = 0;
403     pLimit = 0;
404   }
405 #endif
406 
407   if( sqlite3ViewGetColumnNames(pParse, pTab) ){
408     goto update_cleanup;
409   }
410   if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
411     goto update_cleanup;
412   }
413 
414   /* Allocate a cursors for the main database table and for all indices.
415   ** The index cursors might not be used, but if they are used they
416   ** need to occur right after the database cursor.  So go ahead and
417   ** allocate enough space, just in case.
418   */
419   iBaseCur = iDataCur = pParse->nTab++;
420   iIdxCur = iDataCur+1;
421   pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
422   testcase( pPk!=0 && pPk!=pTab->pIndex );
423   for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){
424     if( pPk==pIdx ){
425       iDataCur = pParse->nTab;
426     }
427     pParse->nTab++;
428   }
429   if( pUpsert ){
430     /* On an UPSERT, reuse the same cursors already opened by INSERT */
431     iDataCur = pUpsert->iDataCur;
432     iIdxCur = pUpsert->iIdxCur;
433     pParse->nTab = iBaseCur;
434   }
435   pTabList->a[0].iCursor = iDataCur;
436 
437   /* Allocate space for aXRef[], aRegIdx[], and aToOpen[].
438   ** Initialize aXRef[] and aToOpen[] to their default values.
439   */
440   aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx+1) + nIdx+2 );
441   if( aXRef==0 ) goto update_cleanup;
442   aRegIdx = aXRef+pTab->nCol;
443   aToOpen = (u8*)(aRegIdx+nIdx+1);
444   memset(aToOpen, 1, nIdx+1);
445   aToOpen[nIdx+1] = 0;
446   for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
447 
448   /* Initialize the name-context */
449   memset(&sNC, 0, sizeof(sNC));
450   sNC.pParse = pParse;
451   sNC.pSrcList = pTabList;
452   sNC.uNC.pUpsert = pUpsert;
453   sNC.ncFlags = NC_UUpsert;
454 
455   /* Begin generating code. */
456   v = sqlite3GetVdbe(pParse);
457   if( v==0 ) goto update_cleanup;
458 
459   /* Resolve the column names in all the expressions of the
460   ** of the UPDATE statement.  Also find the column index
461   ** for each column to be updated in the pChanges array.  For each
462   ** column to be updated, make sure we have authorization to change
463   ** that column.
464   */
465   chngRowid = chngPk = 0;
466   for(i=0; i<pChanges->nExpr; i++){
467     u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName);
468     /* If this is an UPDATE with a FROM clause, do not resolve expressions
469     ** here. The call to sqlite3Select() below will do that. */
470     if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
471       goto update_cleanup;
472     }
473     for(j=0; j<pTab->nCol; j++){
474       if( pTab->aCol[j].hName==hCol
475        && sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0
476       ){
477         if( j==pTab->iPKey ){
478           chngRowid = 1;
479           pRowidExpr = pChanges->a[i].pExpr;
480           iRowidExpr = i;
481         }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){
482           chngPk = 1;
483         }
484 #ifndef SQLITE_OMIT_GENERATED_COLUMNS
485         else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){
486           testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL );
487           testcase( pTab->aCol[j].colFlags & COLFLAG_STORED );
488           sqlite3ErrorMsg(pParse,
489              "cannot UPDATE generated column \"%s\"",
490              pTab->aCol[j].zCnName);
491           goto update_cleanup;
492         }
493 #endif
494         aXRef[j] = i;
495         break;
496       }
497     }
498     if( j>=pTab->nCol ){
499       if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){
500         j = -1;
501         chngRowid = 1;
502         pRowidExpr = pChanges->a[i].pExpr;
503         iRowidExpr = i;
504       }else{
505         sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName);
506         pParse->checkSchema = 1;
507         goto update_cleanup;
508       }
509     }
510 #ifndef SQLITE_OMIT_AUTHORIZATION
511     {
512       int rc;
513       rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
514                             j<0 ? "ROWID" : pTab->aCol[j].zCnName,
515                             db->aDb[iDb].zDbSName);
516       if( rc==SQLITE_DENY ){
517         goto update_cleanup;
518       }else if( rc==SQLITE_IGNORE ){
519         aXRef[j] = -1;
520       }
521     }
522 #endif
523   }
524   assert( (chngRowid & chngPk)==0 );
525   assert( chngRowid==0 || chngRowid==1 );
526   assert( chngPk==0 || chngPk==1 );
527   chngKey = chngRowid + chngPk;
528 
529 #ifndef SQLITE_OMIT_GENERATED_COLUMNS
530   /* Mark generated columns as changing if their generator expressions
531   ** reference any changing column.  The actual aXRef[] value for
532   ** generated expressions is not used, other than to check to see that it
533   ** is non-negative, so the value of aXRef[] for generated columns can be
534   ** set to any non-negative number.  We use 99999 so that the value is
535   ** obvious when looking at aXRef[] in a symbolic debugger.
536   */
537   if( pTab->tabFlags & TF_HasGenerated ){
538     int bProgress;
539     testcase( pTab->tabFlags & TF_HasVirtual );
540     testcase( pTab->tabFlags & TF_HasStored );
541     do{
542       bProgress = 0;
543       for(i=0; i<pTab->nCol; i++){
544         if( aXRef[i]>=0 ) continue;
545         if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue;
546         if( sqlite3ExprReferencesUpdatedColumn(
547                 sqlite3ColumnExpr(pTab, &pTab->aCol[i]),
548                  aXRef, chngRowid)
549         ){
550           aXRef[i] = 99999;
551           bProgress = 1;
552         }
553       }
554     }while( bProgress );
555   }
556 #endif
557 
558   /* The SET expressions are not actually used inside the WHERE loop.
559   ** So reset the colUsed mask. Unless this is a virtual table. In that
560   ** case, set all bits of the colUsed mask (to ensure that the virtual
561   ** table implementation makes all columns available).
562   */
563   pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0;
564 
565   hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey);
566 
567   /* There is one entry in the aRegIdx[] array for each index on the table
568   ** being updated.  Fill in aRegIdx[] with a register number that will hold
569   ** the key for accessing each index.
570   */
571   if( onError==OE_Replace ) bReplace = 1;
572   for(nAllIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nAllIdx++){
573     int reg;
574     if( chngKey || hasFK>1 || pIdx==pPk
575      || indexWhereClauseMightChange(pIdx,aXRef,chngRowid)
576     ){
577       reg = ++pParse->nMem;
578       pParse->nMem += pIdx->nColumn;
579     }else{
580       reg = 0;
581       for(i=0; i<pIdx->nKeyCol; i++){
582         if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){
583           reg = ++pParse->nMem;
584           pParse->nMem += pIdx->nColumn;
585           if( onError==OE_Default && pIdx->onError==OE_Replace ){
586             bReplace = 1;
587           }
588           break;
589         }
590       }
591     }
592     if( reg==0 ) aToOpen[nAllIdx+1] = 0;
593     aRegIdx[nAllIdx] = reg;
594   }
595   aRegIdx[nAllIdx] = ++pParse->nMem;  /* Register storing the table record */
596   if( bReplace ){
597     /* If REPLACE conflict resolution might be invoked, open cursors on all
598     ** indexes in case they are needed to delete records.  */
599     memset(aToOpen, 1, nIdx+1);
600   }
601 
602   if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
603   sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb);
604 
605   /* Allocate required registers. */
606   if( !IsVirtual(pTab) ){
607     /* For now, regRowSet and aRegIdx[nAllIdx] share the same register.
608     ** If regRowSet turns out to be needed, then aRegIdx[nAllIdx] will be
609     ** reallocated.  aRegIdx[nAllIdx] is the register in which the main
610     ** table record is written.  regRowSet holds the RowSet for the
611     ** two-pass update algorithm. */
612     assert( aRegIdx[nAllIdx]==pParse->nMem );
613     regRowSet = aRegIdx[nAllIdx];
614     regOldRowid = regNewRowid = ++pParse->nMem;
615     if( chngPk || pTrigger || hasFK ){
616       regOld = pParse->nMem + 1;
617       pParse->nMem += pTab->nCol;
618     }
619     if( chngKey || pTrigger || hasFK ){
620       regNewRowid = ++pParse->nMem;
621     }
622     regNew = pParse->nMem + 1;
623     pParse->nMem += pTab->nCol;
624   }
625 
626   /* Start the view context. */
627   if( isView ){
628     sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
629   }
630 
631   /* If we are trying to update a view, realize that view into
632   ** an ephemeral table.
633   */
634 #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
635   if( nChangeFrom==0 && isView ){
636     sqlite3MaterializeView(pParse, pTab,
637         pWhere, pOrderBy, pLimit, iDataCur
638     );
639     pOrderBy = 0;
640     pLimit = 0;
641   }
642 #endif
643 
644   /* Resolve the column names in all the expressions in the
645   ** WHERE clause.
646   */
647   if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pWhere) ){
648     goto update_cleanup;
649   }
650 
651 #ifndef SQLITE_OMIT_VIRTUALTABLE
652   /* Virtual tables must be handled separately */
653   if( IsVirtual(pTab) ){
654     updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef,
655                        pWhere, onError);
656     goto update_cleanup;
657   }
658 #endif
659 
660   /* Jump to labelBreak to abandon further processing of this UPDATE */
661   labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse);
662 
663   /* Not an UPSERT.  Normal processing.  Begin by
664   ** initialize the count of updated rows */
665   if( (db->flags&SQLITE_CountRows)!=0
666    && !pParse->pTriggerTab
667    && !pParse->nested
668    && !pParse->bReturning
669    && pUpsert==0
670   ){
671     regRowCount = ++pParse->nMem;
672     sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
673   }
674 
675   if( nChangeFrom==0 && HasRowid(pTab) ){
676     sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid);
677     iEph = pParse->nTab++;
678     addrOpen = sqlite3VdbeAddOp3(v, OP_OpenEphemeral, iEph, 0, regRowSet);
679   }else{
680     assert( pPk!=0 || HasRowid(pTab) );
681     nPk = pPk ? pPk->nKeyCol : 0;
682     iPk = pParse->nMem+1;
683     pParse->nMem += nPk;
684     pParse->nMem += nChangeFrom;
685     regKey = ++pParse->nMem;
686     if( pUpsert==0 ){
687       int nEphCol = nPk + nChangeFrom + (isView ? pTab->nCol : 0);
688       iEph = pParse->nTab++;
689       if( pPk ) sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1);
690       addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nEphCol);
691       if( pPk ){
692         KeyInfo *pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pPk);
693         if( pKeyInfo ){
694           pKeyInfo->nAllField = nEphCol;
695           sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO);
696         }
697       }
698       if( nChangeFrom ){
699         updateFromSelect(
700             pParse, iEph, pPk, pChanges, pTabList, pWhere, pOrderBy, pLimit
701         );
702 #ifndef SQLITE_OMIT_SUBQUERY
703         if( isView ) iDataCur = iEph;
704 #endif
705       }
706     }
707   }
708 
709   if( nChangeFrom ){
710     sqlite3MultiWrite(pParse);
711     eOnePass = ONEPASS_OFF;
712     nKey = nPk;
713     regKey = iPk;
714   }else{
715     if( pUpsert ){
716       /* If this is an UPSERT, then all cursors have already been opened by
717       ** the outer INSERT and the data cursor should be pointing at the row
718       ** that is to be updated.  So bypass the code that searches for the
719       ** row(s) to be updated.
720       */
721       pWInfo = 0;
722       eOnePass = ONEPASS_SINGLE;
723       sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL);
724       bFinishSeek = 0;
725     }else{
726       /* Begin the database scan.
727       **
728       ** Do not consider a single-pass strategy for a multi-row update if
729       ** there are any triggers or foreign keys to process, or rows may
730       ** be deleted as a result of REPLACE conflict handling. Any of these
731       ** things might disturb a cursor being used to scan through the table
732       ** or index, causing a single-pass approach to malfunction.  */
733       flags = WHERE_ONEPASS_DESIRED;
734       if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
735         flags |= WHERE_ONEPASS_MULTIROW;
736       }
737       pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,0,0,flags,iIdxCur);
738       if( pWInfo==0 ) goto update_cleanup;
739 
740       /* A one-pass strategy that might update more than one row may not
741       ** be used if any column of the index used for the scan is being
742       ** updated. Otherwise, if there is an index on "b", statements like
743       ** the following could create an infinite loop:
744       **
745       **   UPDATE t1 SET b=b+1 WHERE b>?
746       **
747       ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
748       ** strategy that uses an index for which one or more columns are being
749       ** updated.  */
750       eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
751       bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo);
752       if( eOnePass!=ONEPASS_SINGLE ){
753         sqlite3MultiWrite(pParse);
754         if( eOnePass==ONEPASS_MULTI ){
755           int iCur = aiCurOnePass[1];
756           if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
757             eOnePass = ONEPASS_OFF;
758           }
759           assert( iCur!=iDataCur || !HasRowid(pTab) );
760         }
761       }
762     }
763 
764     if( HasRowid(pTab) ){
765       /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF
766       ** mode, write the rowid into the FIFO. In either of the one-pass modes,
767       ** leave it in register regOldRowid.  */
768       sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid);
769       if( eOnePass==ONEPASS_OFF ){
770         aRegIdx[nAllIdx] = ++pParse->nMem;
771         sqlite3VdbeAddOp3(v, OP_Insert, iEph, regRowSet, regOldRowid);
772       }else{
773         if( ALWAYS(addrOpen) ) sqlite3VdbeChangeToNoop(v, addrOpen);
774       }
775     }else{
776       /* Read the PK of the current row into an array of registers. In
777       ** ONEPASS_OFF mode, serialize the array into a record and store it in
778       ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change
779       ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table
780       ** is not required) and leave the PK fields in the array of registers.  */
781       for(i=0; i<nPk; i++){
782         assert( pPk->aiColumn[i]>=0 );
783         sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,
784                                         pPk->aiColumn[i], iPk+i);
785       }
786       if( eOnePass ){
787         if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen);
788         nKey = nPk;
789         regKey = iPk;
790       }else{
791         sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey,
792                           sqlite3IndexAffinityStr(db, pPk), nPk);
793         sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk);
794       }
795     }
796   }
797 
798   if( pUpsert==0 ){
799     if( nChangeFrom==0 && eOnePass!=ONEPASS_MULTI ){
800       sqlite3WhereEnd(pWInfo);
801     }
802 
803     if( !isView ){
804       int addrOnce = 0;
805 
806       /* Open every index that needs updating. */
807       if( eOnePass!=ONEPASS_OFF ){
808         if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
809         if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
810       }
811 
812       if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
813         addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
814       }
815       sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur,
816                                  aToOpen, 0, 0);
817       if( addrOnce ){
818         sqlite3VdbeJumpHereOrPopInst(v, addrOnce);
819       }
820     }
821 
822     /* Top of the update loop */
823     if( eOnePass!=ONEPASS_OFF ){
824       if( aiCurOnePass[0]!=iDataCur
825        && aiCurOnePass[1]!=iDataCur
826 #ifdef SQLITE_ALLOW_ROWID_IN_VIEW
827        && !isView
828 #endif
829       ){
830         assert( pPk );
831         sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey);
832         VdbeCoverage(v);
833       }
834       if( eOnePass!=ONEPASS_SINGLE ){
835         labelContinue = sqlite3VdbeMakeLabel(pParse);
836       }
837       sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
838       VdbeCoverageIf(v, pPk==0);
839       VdbeCoverageIf(v, pPk!=0);
840     }else if( pPk || nChangeFrom ){
841       labelContinue = sqlite3VdbeMakeLabel(pParse);
842       sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
843       addrTop = sqlite3VdbeCurrentAddr(v);
844       if( nChangeFrom ){
845         if( !isView ){
846           if( pPk ){
847             for(i=0; i<nPk; i++){
848               sqlite3VdbeAddOp3(v, OP_Column, iEph, i, iPk+i);
849             }
850             sqlite3VdbeAddOp4Int(
851                 v, OP_NotFound, iDataCur, labelContinue, iPk, nPk
852             ); VdbeCoverage(v);
853           }else{
854             sqlite3VdbeAddOp2(v, OP_Rowid, iEph, regOldRowid);
855             sqlite3VdbeAddOp3(
856                 v, OP_NotExists, iDataCur, labelContinue, regOldRowid
857             ); VdbeCoverage(v);
858           }
859         }
860       }else{
861         sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
862         sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey,0);
863         VdbeCoverage(v);
864       }
865     }else{
866       sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
867       labelContinue = sqlite3VdbeMakeLabel(pParse);
868       addrTop = sqlite3VdbeAddOp2(v, OP_Rowid, iEph, regOldRowid);
869       VdbeCoverage(v);
870       sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
871       VdbeCoverage(v);
872     }
873   }
874 
875   /* If the rowid value will change, set register regNewRowid to
876   ** contain the new value. If the rowid is not being modified,
877   ** then regNewRowid is the same register as regOldRowid, which is
878   ** already populated.  */
879   assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid );
880   if( chngRowid ){
881     assert( iRowidExpr>=0 );
882     if( nChangeFrom==0 ){
883       sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
884     }else{
885       sqlite3VdbeAddOp3(v, OP_Column, iEph, iRowidExpr, regNewRowid);
886     }
887     sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v);
888   }
889 
890   /* Compute the old pre-UPDATE content of the row being changed, if that
891   ** information is needed */
892   if( chngPk || hasFK || pTrigger ){
893     u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0);
894     oldmask |= sqlite3TriggerColmask(pParse,
895         pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError
896     );
897     for(i=0; i<pTab->nCol; i++){
898       u32 colFlags = pTab->aCol[i].colFlags;
899       k = sqlite3TableColumnToStorage(pTab, i) + regOld;
900       if( oldmask==0xffffffff
901        || (i<32 && (oldmask & MASKBIT32(i))!=0)
902        || (colFlags & COLFLAG_PRIMKEY)!=0
903       ){
904         testcase(  oldmask!=0xffffffff && i==31 );
905         sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k);
906       }else{
907         sqlite3VdbeAddOp2(v, OP_Null, 0, k);
908       }
909     }
910     if( chngRowid==0 && pPk==0 ){
911       sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid);
912     }
913   }
914 
915   /* Populate the array of registers beginning at regNew with the new
916   ** row data. This array is used to check constants, create the new
917   ** table and index records, and as the values for any new.* references
918   ** made by triggers.
919   **
920   ** If there are one or more BEFORE triggers, then do not populate the
921   ** registers associated with columns that are (a) not modified by
922   ** this UPDATE statement and (b) not accessed by new.* references. The
923   ** values for registers not modified by the UPDATE must be reloaded from
924   ** the database after the BEFORE triggers are fired anyway (as the trigger
925   ** may have modified them). So not loading those that are not going to
926   ** be used eliminates some redundant opcodes.
927   */
928   newmask = sqlite3TriggerColmask(
929       pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError
930   );
931   for(i=0, k=regNew; i<pTab->nCol; i++, k++){
932     if( i==pTab->iPKey ){
933       sqlite3VdbeAddOp2(v, OP_Null, 0, k);
934     }else if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)!=0 ){
935       if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--;
936     }else{
937       j = aXRef[i];
938       if( j>=0 ){
939         if( nChangeFrom ){
940           int nOff = (isView ? pTab->nCol : nPk);
941           assert( eOnePass==ONEPASS_OFF );
942           sqlite3VdbeAddOp3(v, OP_Column, iEph, nOff+j, k);
943         }else{
944           sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k);
945         }
946       }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){
947         /* This branch loads the value of a column that will not be changed
948         ** into a register. This is done if there are no BEFORE triggers, or
949         ** if there are one or more BEFORE triggers that use this value via
950         ** a new.* reference in a trigger program.
951         */
952         testcase( i==31 );
953         testcase( i==32 );
954         sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k);
955         bFinishSeek = 0;
956       }else{
957         sqlite3VdbeAddOp2(v, OP_Null, 0, k);
958       }
959     }
960   }
961 #ifndef SQLITE_OMIT_GENERATED_COLUMNS
962   if( pTab->tabFlags & TF_HasGenerated ){
963     testcase( pTab->tabFlags & TF_HasVirtual );
964     testcase( pTab->tabFlags & TF_HasStored );
965     sqlite3ComputeGeneratedColumns(pParse, regNew, pTab);
966   }
967 #endif
968 
969   /* Fire any BEFORE UPDATE triggers. This happens before constraints are
970   ** verified. One could argue that this is wrong.
971   */
972   if( tmask&TRIGGER_BEFORE ){
973     sqlite3TableAffinity(v, pTab, regNew);
974     sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
975         TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue);
976 
977     if( !isView ){
978       /* The row-trigger may have deleted the row being updated. In this
979       ** case, jump to the next row. No updates or AFTER triggers are
980       ** required. This behavior - what happens when the row being updated
981       ** is deleted or renamed by a BEFORE trigger - is left undefined in the
982       ** documentation.
983       */
984       if( pPk ){
985         sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey);
986         VdbeCoverage(v);
987       }else{
988         sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid);
989         VdbeCoverage(v);
990       }
991 
992       /* After-BEFORE-trigger-reload-loop:
993       ** If it did not delete it, the BEFORE trigger may still have modified
994       ** some of the columns of the row being updated. Load the values for
995       ** all columns not modified by the update statement into their registers
996       ** in case this has happened. Only unmodified columns are reloaded.
997       ** The values computed for modified columns use the values before the
998       ** BEFORE trigger runs.  See test case trigger1-18.0 (added 2018-04-26)
999       ** for an example.
1000       */
1001       for(i=0, k=regNew; i<pTab->nCol; i++, k++){
1002         if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){
1003           if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--;
1004         }else if( aXRef[i]<0 && i!=pTab->iPKey ){
1005           sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k);
1006         }
1007       }
1008 #ifndef SQLITE_OMIT_GENERATED_COLUMNS
1009       if( pTab->tabFlags & TF_HasGenerated ){
1010         testcase( pTab->tabFlags & TF_HasVirtual );
1011         testcase( pTab->tabFlags & TF_HasStored );
1012         sqlite3ComputeGeneratedColumns(pParse, regNew, pTab);
1013       }
1014 #endif
1015     }
1016   }
1017 
1018   if( !isView ){
1019     /* Do constraint checks. */
1020     assert( regOldRowid>0 );
1021     sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
1022         regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace,
1023         aXRef, 0);
1024 
1025     /* If REPLACE conflict handling may have been used, or if the PK of the
1026     ** row is changing, then the GenerateConstraintChecks() above may have
1027     ** moved cursor iDataCur. Reseek it. */
1028     if( bReplace || chngKey ){
1029       if( pPk ){
1030         sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey);
1031       }else{
1032         sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid);
1033       }
1034       VdbeCoverage(v);
1035     }
1036 
1037     /* Do FK constraint checks. */
1038     if( hasFK ){
1039       sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey);
1040     }
1041 
1042     /* Delete the index entries associated with the current record.  */
1043     sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1);
1044 
1045     /* We must run the OP_FinishSeek opcode to resolve a prior
1046     ** OP_DeferredSeek if there is any possibility that there have been
1047     ** no OP_Column opcodes since the OP_DeferredSeek was issued.  But
1048     ** we want to avoid the OP_FinishSeek if possible, as running it
1049     ** costs CPU cycles. */
1050     if( bFinishSeek ){
1051       sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur);
1052     }
1053 
1054     /* If changing the rowid value, or if there are foreign key constraints
1055     ** to process, delete the old record. Otherwise, add a noop OP_Delete
1056     ** to invoke the pre-update hook.
1057     **
1058     ** That (regNew==regnewRowid+1) is true is also important for the
1059     ** pre-update hook. If the caller invokes preupdate_new(), the returned
1060     ** value is copied from memory cell (regNewRowid+1+iCol), where iCol
1061     ** is the column index supplied by the user.
1062     */
1063     assert( regNew==regNewRowid+1 );
1064 #ifdef SQLITE_ENABLE_PREUPDATE_HOOK
1065     sqlite3VdbeAddOp3(v, OP_Delete, iDataCur,
1066         OPFLAG_ISUPDATE | ((hasFK>1 || chngKey) ? 0 : OPFLAG_ISNOOP),
1067         regNewRowid
1068     );
1069     if( eOnePass==ONEPASS_MULTI ){
1070       assert( hasFK==0 && chngKey==0 );
1071       sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION);
1072     }
1073     if( !pParse->nested ){
1074       sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
1075     }
1076 #else
1077     if( hasFK>1 || chngKey ){
1078       sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0);
1079     }
1080 #endif
1081 
1082     if( hasFK ){
1083       sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey);
1084     }
1085 
1086     /* Insert the new index entries and the new record. */
1087     sqlite3CompleteInsertion(
1088         pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx,
1089         OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0),
1090         0, 0
1091     );
1092 
1093     /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
1094     ** handle rows (possibly in other tables) that refer via a foreign key
1095     ** to the row just updated. */
1096     if( hasFK ){
1097       sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey);
1098     }
1099   }
1100 
1101   /* Increment the row counter
1102   */
1103   if( regRowCount ){
1104     sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
1105   }
1106 
1107   sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
1108       TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue);
1109 
1110   /* Repeat the above with the next record to be updated, until
1111   ** all record selected by the WHERE clause have been updated.
1112   */
1113   if( eOnePass==ONEPASS_SINGLE ){
1114     /* Nothing to do at end-of-loop for a single-pass */
1115   }else if( eOnePass==ONEPASS_MULTI ){
1116     sqlite3VdbeResolveLabel(v, labelContinue);
1117     sqlite3WhereEnd(pWInfo);
1118   }else{
1119     sqlite3VdbeResolveLabel(v, labelContinue);
1120     sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v);
1121   }
1122   sqlite3VdbeResolveLabel(v, labelBreak);
1123 
1124   /* Update the sqlite_sequence table by storing the content of the
1125   ** maximum rowid counter values recorded while inserting into
1126   ** autoincrement tables.
1127   */
1128   if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){
1129     sqlite3AutoincrementEnd(pParse);
1130   }
1131 
1132   /*
1133   ** Return the number of rows that were changed, if we are tracking
1134   ** that information.
1135   */
1136   if( regRowCount ){
1137     sqlite3CodeChangeCount(v, regRowCount, "rows updated");
1138   }
1139 
1140 update_cleanup:
1141   sqlite3AuthContextPop(&sContext);
1142   sqlite3DbFree(db, aXRef); /* Also frees aRegIdx[] and aToOpen[] */
1143   sqlite3SrcListDelete(db, pTabList);
1144   sqlite3ExprListDelete(db, pChanges);
1145   sqlite3ExprDelete(db, pWhere);
1146 #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT)
1147   sqlite3ExprListDelete(db, pOrderBy);
1148   sqlite3ExprDelete(db, pLimit);
1149 #endif
1150   return;
1151 }
1152 /* Make sure "isView" and other macros defined above are undefined. Otherwise
1153 ** they may interfere with compilation of other functions in this file
1154 ** (or in another file, if this file becomes part of the amalgamation).  */
1155 #ifdef isView
1156  #undef isView
1157 #endif
1158 #ifdef pTrigger
1159  #undef pTrigger
1160 #endif
1161 
1162 #ifndef SQLITE_OMIT_VIRTUALTABLE
1163 /*
1164 ** Generate code for an UPDATE of a virtual table.
1165 **
1166 ** There are two possible strategies - the default and the special
1167 ** "onepass" strategy. Onepass is only used if the virtual table
1168 ** implementation indicates that pWhere may match at most one row.
1169 **
1170 ** The default strategy is to create an ephemeral table that contains
1171 ** for each row to be changed:
1172 **
1173 **   (A)  The original rowid of that row.
1174 **   (B)  The revised rowid for the row.
1175 **   (C)  The content of every column in the row.
1176 **
1177 ** Then loop through the contents of this ephemeral table executing a
1178 ** VUpdate for each row. When finished, drop the ephemeral table.
1179 **
1180 ** The "onepass" strategy does not use an ephemeral table. Instead, it
1181 ** stores the same values (A, B and C above) in a register array and
1182 ** makes a single invocation of VUpdate.
1183 */
updateVirtualTable(Parse * pParse,SrcList * pSrc,Table * pTab,ExprList * pChanges,Expr * pRowid,int * aXRef,Expr * pWhere,int onError)1184 static void updateVirtualTable(
1185   Parse *pParse,       /* The parsing context */
1186   SrcList *pSrc,       /* The virtual table to be modified */
1187   Table *pTab,         /* The virtual table */
1188   ExprList *pChanges,  /* The columns to change in the UPDATE statement */
1189   Expr *pRowid,        /* Expression used to recompute the rowid */
1190   int *aXRef,          /* Mapping from columns of pTab to entries in pChanges */
1191   Expr *pWhere,        /* WHERE clause of the UPDATE statement */
1192   int onError          /* ON CONFLICT strategy */
1193 ){
1194   Vdbe *v = pParse->pVdbe;  /* Virtual machine under construction */
1195   int ephemTab;             /* Table holding the result of the SELECT */
1196   int i;                    /* Loop counter */
1197   sqlite3 *db = pParse->db; /* Database connection */
1198   const char *pVTab = (const char*)sqlite3GetVTable(db, pTab);
1199   WhereInfo *pWInfo = 0;
1200   int nArg = 2 + pTab->nCol;      /* Number of arguments to VUpdate */
1201   int regArg;                     /* First register in VUpdate arg array */
1202   int regRec;                     /* Register in which to assemble record */
1203   int regRowid;                   /* Register for ephem table rowid */
1204   int iCsr = pSrc->a[0].iCursor;  /* Cursor used for virtual table scan */
1205   int aDummy[2];                  /* Unused arg for sqlite3WhereOkOnePass() */
1206   int eOnePass;                   /* True to use onepass strategy */
1207   int addr;                       /* Address of OP_OpenEphemeral */
1208 
1209   /* Allocate nArg registers in which to gather the arguments for VUpdate. Then
1210   ** create and open the ephemeral table in which the records created from
1211   ** these arguments will be temporarily stored. */
1212   assert( v );
1213   ephemTab = pParse->nTab++;
1214   addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg);
1215   regArg = pParse->nMem + 1;
1216   pParse->nMem += nArg;
1217   if( pSrc->nSrc>1 ){
1218     Index *pPk = 0;
1219     Expr *pRow;
1220     ExprList *pList;
1221     if( HasRowid(pTab) ){
1222       if( pRowid ){
1223         pRow = sqlite3ExprDup(db, pRowid, 0);
1224       }else{
1225         pRow = sqlite3PExpr(pParse, TK_ROW, 0, 0);
1226       }
1227     }else{
1228       i16 iPk;      /* PRIMARY KEY column */
1229       pPk = sqlite3PrimaryKeyIndex(pTab);
1230       assert( pPk!=0 );
1231       assert( pPk->nKeyCol==1 );
1232       iPk = pPk->aiColumn[0];
1233       if( aXRef[iPk]>=0 ){
1234         pRow = sqlite3ExprDup(db, pChanges->a[aXRef[iPk]].pExpr, 0);
1235       }else{
1236         pRow = exprRowColumn(pParse, iPk);
1237       }
1238     }
1239     pList = sqlite3ExprListAppend(pParse, 0, pRow);
1240 
1241     for(i=0; i<pTab->nCol; i++){
1242       if( aXRef[i]>=0 ){
1243         pList = sqlite3ExprListAppend(pParse, pList,
1244           sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0)
1245         );
1246       }else{
1247         pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i));
1248       }
1249     }
1250 
1251     updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0);
1252     sqlite3ExprListDelete(db, pList);
1253     eOnePass = ONEPASS_OFF;
1254   }else{
1255     regRec = ++pParse->nMem;
1256     regRowid = ++pParse->nMem;
1257 
1258     /* Start scanning the virtual table */
1259     pWInfo = sqlite3WhereBegin(
1260         pParse, pSrc, pWhere, 0, 0, 0, WHERE_ONEPASS_DESIRED, 0
1261     );
1262     if( pWInfo==0 ) return;
1263 
1264     /* Populate the argument registers. */
1265     for(i=0; i<pTab->nCol; i++){
1266       assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 );
1267       if( aXRef[i]>=0 ){
1268         sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i);
1269       }else{
1270         sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i);
1271         sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* For sqlite3_vtab_nochange() */
1272       }
1273     }
1274     if( HasRowid(pTab) ){
1275       sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg);
1276       if( pRowid ){
1277         sqlite3ExprCode(pParse, pRowid, regArg+1);
1278       }else{
1279         sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1);
1280       }
1281     }else{
1282       Index *pPk;   /* PRIMARY KEY index */
1283       i16 iPk;      /* PRIMARY KEY column */
1284       pPk = sqlite3PrimaryKeyIndex(pTab);
1285       assert( pPk!=0 );
1286       assert( pPk->nKeyCol==1 );
1287       iPk = pPk->aiColumn[0];
1288       sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg);
1289       sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1);
1290     }
1291 
1292     eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
1293 
1294     /* There is no ONEPASS_MULTI on virtual tables */
1295     assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE );
1296 
1297     if( eOnePass ){
1298       /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded
1299       ** above. */
1300       sqlite3VdbeChangeToNoop(v, addr);
1301       sqlite3VdbeAddOp1(v, OP_Close, iCsr);
1302     }else{
1303       /* Create a record from the argument register contents and insert it into
1304       ** the ephemeral table. */
1305       sqlite3MultiWrite(pParse);
1306       sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec);
1307 #if defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_NULL_TRIM)
1308       /* Signal an assert() within OP_MakeRecord that it is allowed to
1309       ** accept no-change records with serial_type 10 */
1310       sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC);
1311 #endif
1312       sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid);
1313       sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid);
1314     }
1315   }
1316 
1317 
1318   if( eOnePass==ONEPASS_OFF ){
1319     /* End the virtual table scan */
1320     if( pSrc->nSrc==1 ){
1321       sqlite3WhereEnd(pWInfo);
1322     }
1323 
1324     /* Begin scannning through the ephemeral table. */
1325     addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v);
1326 
1327     /* Extract arguments from the current row of the ephemeral table and
1328     ** invoke the VUpdate method.  */
1329     for(i=0; i<nArg; i++){
1330       sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i, regArg+i);
1331     }
1332   }
1333   sqlite3VtabMakeWritable(pParse, pTab);
1334   sqlite3VdbeAddOp4(v, OP_VUpdate, 0, nArg, regArg, pVTab, P4_VTAB);
1335   sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError);
1336   sqlite3MayAbort(pParse);
1337 
1338   /* End of the ephemeral table scan. Or, if using the onepass strategy,
1339   ** jump to here if the scan visited zero rows. */
1340   if( eOnePass==ONEPASS_OFF ){
1341     sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v);
1342     sqlite3VdbeJumpHere(v, addr);
1343     sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
1344   }else{
1345     sqlite3WhereEnd(pWInfo);
1346   }
1347 }
1348 #endif /* SQLITE_OMIT_VIRTUALTABLE */
1349