Home | History | Annotate | Download | only in src
      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 );
     28 #endif /* SQLITE_OMIT_VIRTUALTABLE */
     29 
     30 /*
     31 ** The most recently coded instruction was an OP_Column to retrieve the
     32 ** i-th column of table pTab. This routine sets the P4 parameter of the
     33 ** OP_Column to the default value, if any.
     34 **
     35 ** The default value of a column is specified by a DEFAULT clause in the
     36 ** column definition. This was either supplied by the user when the table
     37 ** was created, or added later to the table definition by an ALTER TABLE
     38 ** command. If the latter, then the row-records in the table btree on disk
     39 ** may not contain a value for the column and the default value, taken
     40 ** from the P4 parameter of the OP_Column instruction, is returned instead.
     41 ** If the former, then all row-records are guaranteed to include a value
     42 ** for the column and the P4 value is not required.
     43 **
     44 ** Column definitions created by an ALTER TABLE command may only have
     45 ** literal default values specified: a number, null or a string. (If a more
     46 ** complicated default expression value was provided, it is evaluated
     47 ** when the ALTER TABLE is executed and one of the literal values written
     48 ** into the sqlite_master table.)
     49 **
     50 ** Therefore, the P4 parameter is only required if the default value for
     51 ** the column is a literal number, string or null. The sqlite3ValueFromExpr()
     52 ** function is capable of transforming these types of expressions into
     53 ** sqlite3_value objects.
     54 **
     55 ** If parameter iReg is not negative, code an OP_RealAffinity instruction
     56 ** on register iReg. This is used when an equivalent integer value is
     57 ** stored in place of an 8-byte floating point value in order to save
     58 ** space.
     59 */
     60 void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
     61   assert( pTab!=0 );
     62   if( !pTab->pSelect ){
     63     sqlite3_value *pValue;
     64     u8 enc = ENC(sqlite3VdbeDb(v));
     65     Column *pCol = &pTab->aCol[i];
     66     VdbeComment((v, "%s.%s", pTab->zName, pCol->zName));
     67     assert( i<pTab->nCol );
     68     sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc,
     69                          pCol->affinity, &pValue);
     70     if( pValue ){
     71       sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM);
     72     }
     73 #ifndef SQLITE_OMIT_FLOATING_POINT
     74     if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
     75       sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
     76     }
     77 #endif
     78   }
     79 }
     80 
     81 /*
     82 ** Process an UPDATE statement.
     83 **
     84 **   UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;
     85 **          \_______/ \________/     \______/       \________________/
     86 *            onError   pTabList      pChanges             pWhere
     87 */
     88 void sqlite3Update(
     89   Parse *pParse,         /* The parser context */
     90   SrcList *pTabList,     /* The table in which we should change things */
     91   ExprList *pChanges,    /* Things to be changed */
     92   Expr *pWhere,          /* The WHERE clause.  May be null */
     93   int onError            /* How to handle constraint errors */
     94 ){
     95   int i, j;              /* Loop counters */
     96   Table *pTab;           /* The table to be updated */
     97   int addr = 0;          /* VDBE instruction address of the start of the loop */
     98   WhereInfo *pWInfo;     /* Information about the WHERE clause */
     99   Vdbe *v;               /* The virtual database engine */
    100   Index *pIdx;           /* For looping over indices */
    101   int nIdx;              /* Number of indices that need updating */
    102   int iCur;              /* VDBE Cursor number of pTab */
    103   sqlite3 *db;           /* The database structure */
    104   int *aRegIdx = 0;      /* One register assigned to each index to be updated */
    105   int *aXRef = 0;        /* aXRef[i] is the index in pChanges->a[] of the
    106                          ** an expression for the i-th column of the table.
    107                          ** aXRef[i]==-1 if the i-th column is not changed. */
    108   int chngRowid;         /* True if the record number is being changed */
    109   Expr *pRowidExpr = 0;  /* Expression defining the new record number */
    110   int openAll = 0;       /* True if all indices need to be opened */
    111   AuthContext sContext;  /* The authorization context */
    112   NameContext sNC;       /* The name-context to resolve expressions in */
    113   int iDb;               /* Database containing the table being updated */
    114   int okOnePass;         /* True for one-pass algorithm without the FIFO */
    115   int hasFK;             /* True if foreign key processing is required */
    116 
    117 #ifndef SQLITE_OMIT_TRIGGER
    118   int isView;            /* True when updating a view (INSTEAD OF trigger) */
    119   Trigger *pTrigger;     /* List of triggers on pTab, if required */
    120   int tmask;             /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
    121 #endif
    122   int newmask;           /* Mask of NEW.* columns accessed by BEFORE triggers */
    123 
    124   /* Register Allocations */
    125   int regRowCount = 0;   /* A count of rows changed */
    126   int regOldRowid;       /* The old rowid */
    127   int regNewRowid;       /* The new rowid */
    128   int regNew;
    129   int regOld = 0;
    130   int regRowSet = 0;     /* Rowset of rows to be updated */
    131 
    132   memset(&sContext, 0, sizeof(sContext));
    133   db = pParse->db;
    134   if( pParse->nErr || db->mallocFailed ){
    135     goto update_cleanup;
    136   }
    137   assert( pTabList->nSrc==1 );
    138 
    139   /* Locate the table which we want to update.
    140   */
    141   pTab = sqlite3SrcListLookup(pParse, pTabList);
    142   if( pTab==0 ) goto update_cleanup;
    143   iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
    144 
    145   /* Figure out if we have any triggers and if the table being
    146   ** updated is a view.
    147   */
    148 #ifndef SQLITE_OMIT_TRIGGER
    149   pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask);
    150   isView = pTab->pSelect!=0;
    151   assert( pTrigger || tmask==0 );
    152 #else
    153 # define pTrigger 0
    154 # define isView 0
    155 # define tmask 0
    156 #endif
    157 #ifdef SQLITE_OMIT_VIEW
    158 # undef isView
    159 # define isView 0
    160 #endif
    161 
    162   if( sqlite3ViewGetColumnNames(pParse, pTab) ){
    163     goto update_cleanup;
    164   }
    165   if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
    166     goto update_cleanup;
    167   }
    168   aXRef = sqlite3DbMallocRaw(db, sizeof(int) * pTab->nCol );
    169   if( aXRef==0 ) goto update_cleanup;
    170   for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
    171 
    172   /* Allocate a cursors for the main database table and for all indices.
    173   ** The index cursors might not be used, but if they are used they
    174   ** need to occur right after the database cursor.  So go ahead and
    175   ** allocate enough space, just in case.
    176   */
    177   pTabList->a[0].iCursor = iCur = pParse->nTab++;
    178   for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
    179     pParse->nTab++;
    180   }
    181 
    182   /* Initialize the name-context */
    183   memset(&sNC, 0, sizeof(sNC));
    184   sNC.pParse = pParse;
    185   sNC.pSrcList = pTabList;
    186 
    187   /* Resolve the column names in all the expressions of the
    188   ** of the UPDATE statement.  Also find the column index
    189   ** for each column to be updated in the pChanges array.  For each
    190   ** column to be updated, make sure we have authorization to change
    191   ** that column.
    192   */
    193   chngRowid = 0;
    194   for(i=0; i<pChanges->nExpr; i++){
    195     if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
    196       goto update_cleanup;
    197     }
    198     for(j=0; j<pTab->nCol; j++){
    199       if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){
    200         if( j==pTab->iPKey ){
    201           chngRowid = 1;
    202           pRowidExpr = pChanges->a[i].pExpr;
    203         }
    204         aXRef[j] = i;
    205         break;
    206       }
    207     }
    208     if( j>=pTab->nCol ){
    209       if( sqlite3IsRowid(pChanges->a[i].zName) ){
    210         chngRowid = 1;
    211         pRowidExpr = pChanges->a[i].pExpr;
    212       }else{
    213         sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName);
    214         pParse->checkSchema = 1;
    215         goto update_cleanup;
    216       }
    217     }
    218 #ifndef SQLITE_OMIT_AUTHORIZATION
    219     {
    220       int rc;
    221       rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
    222                            pTab->aCol[j].zName, db->aDb[iDb].zName);
    223       if( rc==SQLITE_DENY ){
    224         goto update_cleanup;
    225       }else if( rc==SQLITE_IGNORE ){
    226         aXRef[j] = -1;
    227       }
    228     }
    229 #endif
    230   }
    231 
    232   hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngRowid);
    233 
    234   /* Allocate memory for the array aRegIdx[].  There is one entry in the
    235   ** array for each index associated with table being updated.  Fill in
    236   ** the value with a register number for indices that are to be used
    237   ** and with zero for unused indices.
    238   */
    239   for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){}
    240   if( nIdx>0 ){
    241     aRegIdx = sqlite3DbMallocRaw(db, sizeof(Index*) * nIdx );
    242     if( aRegIdx==0 ) goto update_cleanup;
    243   }
    244   for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
    245     int reg;
    246     if( chngRowid ){
    247       reg = ++pParse->nMem;
    248     }else{
    249       reg = 0;
    250       for(i=0; i<pIdx->nColumn; i++){
    251         if( aXRef[pIdx->aiColumn[i]]>=0 ){
    252           reg = ++pParse->nMem;
    253           break;
    254         }
    255       }
    256     }
    257     aRegIdx[j] = reg;
    258   }
    259 
    260   /* Begin generating code. */
    261   v = sqlite3GetVdbe(pParse);
    262   if( v==0 ) goto update_cleanup;
    263   if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
    264   sqlite3BeginWriteOperation(pParse, 1, iDb);
    265 
    266 #ifndef SQLITE_OMIT_VIRTUALTABLE
    267   /* Virtual tables must be handled separately */
    268   if( IsVirtual(pTab) ){
    269     updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef,
    270                        pWhere);
    271     pWhere = 0;
    272     pTabList = 0;
    273     goto update_cleanup;
    274   }
    275 #endif
    276 
    277   /* Allocate required registers. */
    278   regOldRowid = regNewRowid = ++pParse->nMem;
    279   if( pTrigger || hasFK ){
    280     regOld = pParse->nMem + 1;
    281     pParse->nMem += pTab->nCol;
    282   }
    283   if( chngRowid || pTrigger || hasFK ){
    284     regNewRowid = ++pParse->nMem;
    285   }
    286   regNew = pParse->nMem + 1;
    287   pParse->nMem += pTab->nCol;
    288 
    289   /* Start the view context. */
    290   if( isView ){
    291     sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
    292   }
    293 
    294   /* If we are trying to update a view, realize that view into
    295   ** a ephemeral table.
    296   */
    297 #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
    298   if( isView ){
    299     sqlite3MaterializeView(pParse, pTab, pWhere, iCur);
    300   }
    301 #endif
    302 
    303   /* Resolve the column names in all the expressions in the
    304   ** WHERE clause.
    305   */
    306   if( sqlite3ResolveExprNames(&sNC, pWhere) ){
    307     goto update_cleanup;
    308   }
    309 
    310   /* Begin the database scan
    311   */
    312   sqlite3VdbeAddOp2(v, OP_Null, 0, regOldRowid);
    313   pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0, WHERE_ONEPASS_DESIRED);
    314   if( pWInfo==0 ) goto update_cleanup;
    315   okOnePass = pWInfo->okOnePass;
    316 
    317   /* Remember the rowid of every item to be updated.
    318   */
    319   sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regOldRowid);
    320   if( !okOnePass ){
    321     regRowSet = ++pParse->nMem;
    322     sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid);
    323   }
    324 
    325   /* End the database scan loop.
    326   */
    327   sqlite3WhereEnd(pWInfo);
    328 
    329   /* Initialize the count of updated rows
    330   */
    331   if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
    332     regRowCount = ++pParse->nMem;
    333     sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
    334   }
    335 
    336   if( !isView ){
    337     /*
    338     ** Open every index that needs updating.  Note that if any
    339     ** index could potentially invoke a REPLACE conflict resolution
    340     ** action, then we need to open all indices because we might need
    341     ** to be deleting some records.
    342     */
    343     if( !okOnePass ) sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenWrite);
    344     if( onError==OE_Replace ){
    345       openAll = 1;
    346     }else{
    347       openAll = 0;
    348       for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
    349         if( pIdx->onError==OE_Replace ){
    350           openAll = 1;
    351           break;
    352         }
    353       }
    354     }
    355     for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
    356       if( openAll || aRegIdx[i]>0 ){
    357         KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
    358         sqlite3VdbeAddOp4(v, OP_OpenWrite, iCur+i+1, pIdx->tnum, iDb,
    359                        (char*)pKey, P4_KEYINFO_HANDOFF);
    360         assert( pParse->nTab>iCur+i+1 );
    361       }
    362     }
    363   }
    364 
    365   /* Top of the update loop */
    366   if( okOnePass ){
    367     int a1 = sqlite3VdbeAddOp1(v, OP_NotNull, regOldRowid);
    368     addr = sqlite3VdbeAddOp0(v, OP_Goto);
    369     sqlite3VdbeJumpHere(v, a1);
    370   }else{
    371     addr = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, 0, regOldRowid);
    372   }
    373 
    374   /* Make cursor iCur point to the record that is being updated. If
    375   ** this record does not exist for some reason (deleted by a trigger,
    376   ** for example, then jump to the next iteration of the RowSet loop.  */
    377   sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
    378 
    379   /* If the record number will change, set register regNewRowid to
    380   ** contain the new value. If the record number is not being modified,
    381   ** then regNewRowid is the same register as regOldRowid, which is
    382   ** already populated.  */
    383   assert( chngRowid || pTrigger || hasFK || regOldRowid==regNewRowid );
    384   if( chngRowid ){
    385     sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
    386     sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid);
    387   }
    388 
    389   /* If there are triggers on this table, populate an array of registers
    390   ** with the required old.* column data.  */
    391   if( hasFK || pTrigger ){
    392     u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0);
    393     oldmask |= sqlite3TriggerColmask(pParse,
    394         pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError
    395     );
    396     for(i=0; i<pTab->nCol; i++){
    397       if( aXRef[i]<0 || oldmask==0xffffffff || (i<32 && (oldmask & (1<<i))) ){
    398         sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOld+i);
    399       }else{
    400         sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i);
    401       }
    402     }
    403     if( chngRowid==0 ){
    404       sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid);
    405     }
    406   }
    407 
    408   /* Populate the array of registers beginning at regNew with the new
    409   ** row data. This array is used to check constaints, create the new
    410   ** table and index records, and as the values for any new.* references
    411   ** made by triggers.
    412   **
    413   ** If there are one or more BEFORE triggers, then do not populate the
    414   ** registers associated with columns that are (a) not modified by
    415   ** this UPDATE statement and (b) not accessed by new.* references. The
    416   ** values for registers not modified by the UPDATE must be reloaded from
    417   ** the database after the BEFORE triggers are fired anyway (as the trigger
    418   ** may have modified them). So not loading those that are not going to
    419   ** be used eliminates some redundant opcodes.
    420   */
    421   newmask = sqlite3TriggerColmask(
    422       pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError
    423   );
    424   for(i=0; i<pTab->nCol; i++){
    425     if( i==pTab->iPKey ){
    426       sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
    427     }else{
    428       j = aXRef[i];
    429       if( j>=0 ){
    430         sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i);
    431       }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask&(1<<i)) ){
    432         /* This branch loads the value of a column that will not be changed
    433         ** into a register. This is done if there are no BEFORE triggers, or
    434         ** if there are one or more BEFORE triggers that use this value via
    435         ** a new.* reference in a trigger program.
    436         */
    437         testcase( i==31 );
    438         testcase( i==32 );
    439         sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i);
    440         sqlite3ColumnDefault(v, pTab, i, regNew+i);
    441       }
    442     }
    443   }
    444 
    445   /* Fire any BEFORE UPDATE triggers. This happens before constraints are
    446   ** verified. One could argue that this is wrong.
    447   */
    448   if( tmask&TRIGGER_BEFORE ){
    449     sqlite3VdbeAddOp2(v, OP_Affinity, regNew, pTab->nCol);
    450     sqlite3TableAffinityStr(v, pTab);
    451     sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
    452         TRIGGER_BEFORE, pTab, regOldRowid, onError, addr);
    453 
    454     /* The row-trigger may have deleted the row being updated. In this
    455     ** case, jump to the next row. No updates or AFTER triggers are
    456     ** required. This behaviour - what happens when the row being updated
    457     ** is deleted or renamed by a BEFORE trigger - is left undefined in the
    458     ** documentation.
    459     */
    460     sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
    461 
    462     /* If it did not delete it, the row-trigger may still have modified
    463     ** some of the columns of the row being updated. Load the values for
    464     ** all columns not modified by the update statement into their
    465     ** registers in case this has happened.
    466     */
    467     for(i=0; i<pTab->nCol; i++){
    468       if( aXRef[i]<0 && i!=pTab->iPKey ){
    469         sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i);
    470         sqlite3ColumnDefault(v, pTab, i, regNew+i);
    471       }
    472     }
    473   }
    474 
    475   if( !isView ){
    476     int j1;                       /* Address of jump instruction */
    477 
    478     /* Do constraint checks. */
    479     sqlite3GenerateConstraintChecks(pParse, pTab, iCur, regNewRowid,
    480         aRegIdx, (chngRowid?regOldRowid:0), 1, onError, addr, 0);
    481 
    482     /* Do FK constraint checks. */
    483     if( hasFK ){
    484       sqlite3FkCheck(pParse, pTab, regOldRowid, 0);
    485     }
    486 
    487     /* Delete the index entries associated with the current record.  */
    488     j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regOldRowid);
    489     sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, aRegIdx);
    490 
    491     /* If changing the record number, delete the old record.  */
    492     if( hasFK || chngRowid ){
    493       sqlite3VdbeAddOp2(v, OP_Delete, iCur, 0);
    494     }
    495     sqlite3VdbeJumpHere(v, j1);
    496 
    497     if( hasFK ){
    498       sqlite3FkCheck(pParse, pTab, 0, regNewRowid);
    499     }
    500 
    501     /* Insert the new index entries and the new record. */
    502     sqlite3CompleteInsertion(pParse, pTab, iCur, regNewRowid, aRegIdx, 1, 0, 0);
    503 
    504     /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
    505     ** handle rows (possibly in other tables) that refer via a foreign key
    506     ** to the row just updated. */
    507     if( hasFK ){
    508       sqlite3FkActions(pParse, pTab, pChanges, regOldRowid);
    509     }
    510   }
    511 
    512   /* Increment the row counter
    513   */
    514   if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
    515     sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
    516   }
    517 
    518   sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
    519       TRIGGER_AFTER, pTab, regOldRowid, onError, addr);
    520 
    521   /* Repeat the above with the next record to be updated, until
    522   ** all record selected by the WHERE clause have been updated.
    523   */
    524   sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
    525   sqlite3VdbeJumpHere(v, addr);
    526 
    527   /* Close all tables */
    528   for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
    529     if( openAll || aRegIdx[i]>0 ){
    530       sqlite3VdbeAddOp2(v, OP_Close, iCur+i+1, 0);
    531     }
    532   }
    533   sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
    534 
    535   /* Update the sqlite_sequence table by storing the content of the
    536   ** maximum rowid counter values recorded while inserting into
    537   ** autoincrement tables.
    538   */
    539   if( pParse->nested==0 && pParse->pTriggerTab==0 ){
    540     sqlite3AutoincrementEnd(pParse);
    541   }
    542 
    543   /*
    544   ** Return the number of rows that were changed. If this routine is
    545   ** generating code because of a call to sqlite3NestedParse(), do not
    546   ** invoke the callback function.
    547   */
    548   if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
    549     sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
    550     sqlite3VdbeSetNumCols(v, 1);
    551     sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
    552   }
    553 
    554 update_cleanup:
    555   sqlite3AuthContextPop(&sContext);
    556   sqlite3DbFree(db, aRegIdx);
    557   sqlite3DbFree(db, aXRef);
    558   sqlite3SrcListDelete(db, pTabList);
    559   sqlite3ExprListDelete(db, pChanges);
    560   sqlite3ExprDelete(db, pWhere);
    561   return;
    562 }
    563 /* Make sure "isView" and other macros defined above are undefined. Otherwise
    564 ** thely may interfere with compilation of other functions in this file
    565 ** (or in another file, if this file becomes part of the amalgamation).  */
    566 #ifdef isView
    567  #undef isView
    568 #endif
    569 #ifdef pTrigger
    570  #undef pTrigger
    571 #endif
    572 
    573 #ifndef SQLITE_OMIT_VIRTUALTABLE
    574 /*
    575 ** Generate code for an UPDATE of a virtual table.
    576 **
    577 ** The strategy is that we create an ephemerial table that contains
    578 ** for each row to be changed:
    579 **
    580 **   (A)  The original rowid of that row.
    581 **   (B)  The revised rowid for the row. (note1)
    582 **   (C)  The content of every column in the row.
    583 **
    584 ** Then we loop over this ephemeral table and for each row in
    585 ** the ephermeral table call VUpdate.
    586 **
    587 ** When finished, drop the ephemeral table.
    588 **
    589 ** (note1) Actually, if we know in advance that (A) is always the same
    590 ** as (B) we only store (A), then duplicate (A) when pulling
    591 ** it out of the ephemeral table before calling VUpdate.
    592 */
    593 static void updateVirtualTable(
    594   Parse *pParse,       /* The parsing context */
    595   SrcList *pSrc,       /* The virtual table to be modified */
    596   Table *pTab,         /* The virtual table */
    597   ExprList *pChanges,  /* The columns to change in the UPDATE statement */
    598   Expr *pRowid,        /* Expression used to recompute the rowid */
    599   int *aXRef,          /* Mapping from columns of pTab to entries in pChanges */
    600   Expr *pWhere         /* WHERE clause of the UPDATE statement */
    601 ){
    602   Vdbe *v = pParse->pVdbe;  /* Virtual machine under construction */
    603   ExprList *pEList = 0;     /* The result set of the SELECT statement */
    604   Select *pSelect = 0;      /* The SELECT statement */
    605   Expr *pExpr;              /* Temporary expression */
    606   int ephemTab;             /* Table holding the result of the SELECT */
    607   int i;                    /* Loop counter */
    608   int addr;                 /* Address of top of loop */
    609   int iReg;                 /* First register in set passed to OP_VUpdate */
    610   sqlite3 *db = pParse->db; /* Database connection */
    611   const char *pVTab = (const char*)sqlite3GetVTable(db, pTab);
    612   SelectDest dest;
    613 
    614   /* Construct the SELECT statement that will find the new values for
    615   ** all updated rows.
    616   */
    617   pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, "_rowid_"));
    618   if( pRowid ){
    619     pEList = sqlite3ExprListAppend(pParse, pEList,
    620                                    sqlite3ExprDup(db, pRowid, 0));
    621   }
    622   assert( pTab->iPKey<0 );
    623   for(i=0; i<pTab->nCol; i++){
    624     if( aXRef[i]>=0 ){
    625       pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0);
    626     }else{
    627       pExpr = sqlite3Expr(db, TK_ID, pTab->aCol[i].zName);
    628     }
    629     pEList = sqlite3ExprListAppend(pParse, pEList, pExpr);
    630   }
    631   pSelect = sqlite3SelectNew(pParse, pEList, pSrc, pWhere, 0, 0, 0, 0, 0, 0);
    632 
    633   /* Create the ephemeral table into which the update results will
    634   ** be stored.
    635   */
    636   assert( v );
    637   ephemTab = pParse->nTab++;
    638   sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, pTab->nCol+1+(pRowid!=0));
    639   sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
    640 
    641   /* fill the ephemeral table
    642   */
    643   sqlite3SelectDestInit(&dest, SRT_Table, ephemTab);
    644   sqlite3Select(pParse, pSelect, &dest);
    645 
    646   /* Generate code to scan the ephemeral table and call VUpdate. */
    647   iReg = ++pParse->nMem;
    648   pParse->nMem += pTab->nCol+1;
    649   addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0);
    650   sqlite3VdbeAddOp3(v, OP_Column,  ephemTab, 0, iReg);
    651   sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1);
    652   for(i=0; i<pTab->nCol; i++){
    653     sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i+1+(pRowid!=0), iReg+2+i);
    654   }
    655   sqlite3VtabMakeWritable(pParse, pTab);
    656   sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVTab, P4_VTAB);
    657   sqlite3MayAbort(pParse);
    658   sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1);
    659   sqlite3VdbeJumpHere(v, addr);
    660   sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
    661 
    662   /* Cleanup */
    663   sqlite3SelectDelete(db, pSelect);
    664 }
    665 #endif /* SQLITE_OMIT_VIRTUALTABLE */
    666