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