modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/update.c (about)

     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_master 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 parameter iReg is not negative, code an OP_RealAffinity instruction
    57  ** on register iReg. This is used when an equivalent integer value is 
    58  ** stored in place of an 8-byte floating point value in order to save 
    59  ** space.
    60  */
    61  void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
    62    assert( pTab!=0 );
    63    if( !pTab->pSelect ){
    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->zName));
    68      assert( i<pTab->nCol );
    69      sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, 
    70                           pCol->affinity, &pValue);
    71      if( pValue ){
    72        sqlite3VdbeAppendP4(v, pValue, P4_MEM);
    73      }
    74    }
    75  #ifndef SQLITE_OMIT_FLOATING_POINT
    76    if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
    77      sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
    78    }
    79  #endif
    80  }
    81  
    82  /*
    83  ** Process an UPDATE statement.
    84  **
    85  **   UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;
    86  **          \_______/ \________/     \______/       \________________/
    87  *            onError   pTabList      pChanges             pWhere
    88  */
    89  void sqlite3Update(
    90    Parse *pParse,         /* The parser context */
    91    SrcList *pTabList,     /* The table in which we should change things */
    92    ExprList *pChanges,    /* Things to be changed */
    93    Expr *pWhere,          /* The WHERE clause.  May be null */
    94    int onError            /* How to handle constraint errors */
    95  ){
    96    int i, j;              /* Loop counters */
    97    Table *pTab;           /* The table to be updated */
    98    int addrTop = 0;       /* VDBE instruction address of the start of the loop */
    99    WhereInfo *pWInfo;     /* Information about the WHERE clause */
   100    Vdbe *v;               /* The virtual database engine */
   101    Index *pIdx;           /* For looping over indices */
   102    Index *pPk;            /* The PRIMARY KEY index for WITHOUT ROWID tables */
   103    int nIdx;              /* Number of indices that need updating */
   104    int iBaseCur;          /* Base cursor number */
   105    int iDataCur;          /* Cursor for the canonical data btree */
   106    int iIdxCur;           /* Cursor for the first index */
   107    sqlite3 *db;           /* The database structure */
   108    int *aRegIdx = 0;      /* First register in array assigned to each index */
   109    int *aXRef = 0;        /* aXRef[i] is the index in pChanges->a[] of the
   110                           ** an expression for the i-th column of the table.
   111                           ** aXRef[i]==-1 if the i-th column is not changed. */
   112    u8 *aToOpen;           /* 1 for tables and indices to be opened */
   113    u8 chngPk;             /* PRIMARY KEY changed in a WITHOUT ROWID table */
   114    u8 chngRowid;          /* Rowid changed in a normal table */
   115    u8 chngKey;            /* Either chngPk or chngRowid */
   116    Expr *pRowidExpr = 0;  /* Expression defining the new record number */
   117    AuthContext sContext;  /* The authorization context */
   118    NameContext sNC;       /* The name-context to resolve expressions in */
   119    int iDb;               /* Database containing the table being updated */
   120    int eOnePass;          /* ONEPASS_XXX value from where.c */
   121    int hasFK;             /* True if foreign key processing is required */
   122    int labelBreak;        /* Jump here to break out of UPDATE loop */
   123    int labelContinue;     /* Jump here to continue next step of UPDATE loop */
   124    int flags;             /* Flags for sqlite3WhereBegin() */
   125  
   126  #ifndef SQLITE_OMIT_TRIGGER
   127    int isView;            /* True when updating a view (INSTEAD OF trigger) */
   128    Trigger *pTrigger;     /* List of triggers on pTab, if required */
   129    int tmask;             /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
   130  #endif
   131    int newmask;           /* Mask of NEW.* columns accessed by BEFORE triggers */
   132    int iEph = 0;          /* Ephemeral table holding all primary key values */
   133    int nKey = 0;          /* Number of elements in regKey for WITHOUT ROWID */
   134    int aiCurOnePass[2];   /* The write cursors opened by WHERE_ONEPASS */
   135    int addrOpen = 0;      /* Address of OP_OpenEphemeral */
   136    int iPk = 0;           /* First of nPk cells holding PRIMARY KEY value */
   137    i16 nPk = 0;           /* Number of components of the PRIMARY KEY */
   138    int bReplace = 0;      /* True if REPLACE conflict resolution might happen */
   139  
   140    /* Register Allocations */
   141    int regRowCount = 0;   /* A count of rows changed */
   142    int regOldRowid = 0;   /* The old rowid */
   143    int regNewRowid = 0;   /* The new rowid */
   144    int regNew = 0;        /* Content of the NEW.* table in triggers */
   145    int regOld = 0;        /* Content of OLD.* table in triggers */
   146    int regRowSet = 0;     /* Rowset of rows to be updated */
   147    int regKey = 0;        /* composite PRIMARY KEY value */
   148  
   149    memset(&sContext, 0, sizeof(sContext));
   150    db = pParse->db;
   151    if( pParse->nErr || db->mallocFailed ){
   152      goto update_cleanup;
   153    }
   154    assert( pTabList->nSrc==1 );
   155  
   156    /* Locate the table which we want to update. 
   157    */
   158    pTab = sqlite3SrcListLookup(pParse, pTabList);
   159    if( pTab==0 ) goto update_cleanup;
   160    iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
   161  
   162    /* Figure out if we have any triggers and if the table being
   163    ** updated is a view.
   164    */
   165  #ifndef SQLITE_OMIT_TRIGGER
   166    pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask);
   167    isView = pTab->pSelect!=0;
   168    assert( pTrigger || tmask==0 );
   169  #else
   170  # define pTrigger 0
   171  # define isView 0
   172  # define tmask 0
   173  #endif
   174  #ifdef SQLITE_OMIT_VIEW
   175  # undef isView
   176  # define isView 0
   177  #endif
   178  
   179    if( sqlite3ViewGetColumnNames(pParse, pTab) ){
   180      goto update_cleanup;
   181    }
   182    if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
   183      goto update_cleanup;
   184    }
   185  
   186    /* Allocate a cursors for the main database table and for all indices.
   187    ** The index cursors might not be used, but if they are used they
   188    ** need to occur right after the database cursor.  So go ahead and
   189    ** allocate enough space, just in case.
   190    */
   191    pTabList->a[0].iCursor = iBaseCur = iDataCur = pParse->nTab++;
   192    iIdxCur = iDataCur+1;
   193    pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
   194    for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){
   195      if( IsPrimaryKeyIndex(pIdx) && pPk!=0 ){
   196        iDataCur = pParse->nTab;
   197        pTabList->a[0].iCursor = iDataCur;
   198      }
   199      pParse->nTab++;
   200    }
   201  
   202    /* Allocate space for aXRef[], aRegIdx[], and aToOpen[].  
   203    ** Initialize aXRef[] and aToOpen[] to their default values.
   204    */
   205    aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx) + nIdx+2 );
   206    if( aXRef==0 ) goto update_cleanup;
   207    aRegIdx = aXRef+pTab->nCol;
   208    aToOpen = (u8*)(aRegIdx+nIdx);
   209    memset(aToOpen, 1, nIdx+1);
   210    aToOpen[nIdx+1] = 0;
   211    for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
   212  
   213    /* Initialize the name-context */
   214    memset(&sNC, 0, sizeof(sNC));
   215    sNC.pParse = pParse;
   216    sNC.pSrcList = pTabList;
   217  
   218    /* Resolve the column names in all the expressions of the
   219    ** of the UPDATE statement.  Also find the column index
   220    ** for each column to be updated in the pChanges array.  For each
   221    ** column to be updated, make sure we have authorization to change
   222    ** that column.
   223    */
   224    chngRowid = chngPk = 0;
   225    for(i=0; i<pChanges->nExpr; i++){
   226      if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
   227        goto update_cleanup;
   228      }
   229      for(j=0; j<pTab->nCol; j++){
   230        if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){
   231          if( j==pTab->iPKey ){
   232            chngRowid = 1;
   233            pRowidExpr = pChanges->a[i].pExpr;
   234          }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){
   235            chngPk = 1;
   236          }
   237          aXRef[j] = i;
   238          break;
   239        }
   240      }
   241      if( j>=pTab->nCol ){
   242        if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zName) ){
   243          j = -1;
   244          chngRowid = 1;
   245          pRowidExpr = pChanges->a[i].pExpr;
   246        }else{
   247          sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName);
   248          pParse->checkSchema = 1;
   249          goto update_cleanup;
   250        }
   251      }
   252  #ifndef SQLITE_OMIT_AUTHORIZATION
   253      {
   254        int rc;
   255        rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
   256                              j<0 ? "ROWID" : pTab->aCol[j].zName,
   257                              db->aDb[iDb].zDbSName);
   258        if( rc==SQLITE_DENY ){
   259          goto update_cleanup;
   260        }else if( rc==SQLITE_IGNORE ){
   261          aXRef[j] = -1;
   262        }
   263      }
   264  #endif
   265    }
   266    assert( (chngRowid & chngPk)==0 );
   267    assert( chngRowid==0 || chngRowid==1 );
   268    assert( chngPk==0 || chngPk==1 );
   269    chngKey = chngRowid + chngPk;
   270  
   271    /* The SET expressions are not actually used inside the WHERE loop.  
   272    ** So reset the colUsed mask. Unless this is a virtual table. In that
   273    ** case, set all bits of the colUsed mask (to ensure that the virtual
   274    ** table implementation makes all columns available).
   275    */
   276    pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0;
   277  
   278    hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey);
   279  
   280    /* There is one entry in the aRegIdx[] array for each index on the table
   281    ** being updated.  Fill in aRegIdx[] with a register number that will hold
   282    ** the key for accessing each index.
   283    **
   284    ** FIXME:  Be smarter about omitting indexes that use expressions.
   285    */
   286    for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
   287      int reg;
   288      if( chngKey || hasFK>1 || pIdx->pPartIdxWhere || pIdx==pPk ){
   289        reg = ++pParse->nMem;
   290        pParse->nMem += pIdx->nColumn;
   291      }else{
   292        reg = 0;
   293        for(i=0; i<pIdx->nKeyCol; i++){
   294          i16 iIdxCol = pIdx->aiColumn[i];
   295          if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){
   296            reg = ++pParse->nMem;
   297            pParse->nMem += pIdx->nColumn;
   298            if( (onError==OE_Replace)
   299             || (onError==OE_Default && pIdx->onError==OE_Replace) 
   300            ){
   301              bReplace = 1;
   302            }
   303            break;
   304          }
   305        }
   306      }
   307      if( reg==0 ) aToOpen[j+1] = 0;
   308      aRegIdx[j] = reg;
   309    }
   310    if( bReplace ){
   311      /* If REPLACE conflict resolution might be invoked, open cursors on all 
   312      ** indexes in case they are needed to delete records.  */
   313      memset(aToOpen, 1, nIdx+1);
   314    }
   315  
   316    /* Begin generating code. */
   317    v = sqlite3GetVdbe(pParse);
   318    if( v==0 ) goto update_cleanup;
   319    if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
   320    sqlite3BeginWriteOperation(pParse, 1, iDb);
   321  
   322    /* Allocate required registers. */
   323    if( !IsVirtual(pTab) ){
   324      regRowSet = ++pParse->nMem;
   325      regOldRowid = regNewRowid = ++pParse->nMem;
   326      if( chngPk || pTrigger || hasFK ){
   327        regOld = pParse->nMem + 1;
   328        pParse->nMem += pTab->nCol;
   329      }
   330      if( chngKey || pTrigger || hasFK ){
   331        regNewRowid = ++pParse->nMem;
   332      }
   333      regNew = pParse->nMem + 1;
   334      pParse->nMem += pTab->nCol;
   335    }
   336  
   337    /* Start the view context. */
   338    if( isView ){
   339      sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
   340    }
   341  
   342    /* If we are trying to update a view, realize that view into
   343    ** an ephemeral table.
   344    */
   345  #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
   346    if( isView ){
   347      sqlite3MaterializeView(pParse, pTab, pWhere, iDataCur);
   348    }
   349  #endif
   350  
   351    /* Resolve the column names in all the expressions in the
   352    ** WHERE clause.
   353    */
   354    if( sqlite3ResolveExprNames(&sNC, pWhere) ){
   355      goto update_cleanup;
   356    }
   357  
   358  #ifndef SQLITE_OMIT_VIRTUALTABLE
   359    /* Virtual tables must be handled separately */
   360    if( IsVirtual(pTab) ){
   361      updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef,
   362                         pWhere, onError);
   363      goto update_cleanup;
   364    }
   365  #endif
   366  
   367    /* Initialize the count of updated rows */
   368    if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
   369      regRowCount = ++pParse->nMem;
   370      sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
   371    }
   372  
   373    if( HasRowid(pTab) ){
   374      sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid);
   375    }else{
   376      assert( pPk!=0 );
   377      nPk = pPk->nKeyCol;
   378      iPk = pParse->nMem+1;
   379      pParse->nMem += nPk;
   380      regKey = ++pParse->nMem;
   381      iEph = pParse->nTab++;
   382  
   383      sqlite3VdbeAddOp2(v, OP_Null, 0, iPk);
   384      addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
   385      sqlite3VdbeSetP4KeyInfo(pParse, pPk);
   386    }
   387  
   388    /* Begin the database scan. 
   389    **
   390    ** Do not consider a single-pass strategy for a multi-row update if
   391    ** there are any triggers or foreign keys to process, or rows may
   392    ** be deleted as a result of REPLACE conflict handling. Any of these
   393    ** things might disturb a cursor being used to scan through the table
   394    ** or index, causing a single-pass approach to malfunction.  */
   395    flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE;
   396    if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){
   397      flags |= WHERE_ONEPASS_MULTIROW;
   398    }
   399    pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur);
   400    if( pWInfo==0 ) goto update_cleanup;
   401  
   402    /* A one-pass strategy that might update more than one row may not
   403    ** be used if any column of the index used for the scan is being
   404    ** updated. Otherwise, if there is an index on "b", statements like
   405    ** the following could create an infinite loop:
   406    **
   407    **   UPDATE t1 SET b=b+1 WHERE b>?
   408    **
   409    ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI
   410    ** strategy that uses an index for which one or more columns are being
   411    ** updated.  */
   412    eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
   413    if( eOnePass==ONEPASS_MULTI ){
   414      int iCur = aiCurOnePass[1];
   415      if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
   416        eOnePass = ONEPASS_OFF;
   417      }
   418      assert( iCur!=iDataCur || !HasRowid(pTab) );
   419    }
   420    
   421    if( HasRowid(pTab) ){
   422      /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF
   423      ** mode, write the rowid into the FIFO. In either of the one-pass modes,
   424      ** leave it in register regOldRowid.  */
   425      sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid);
   426      if( eOnePass==ONEPASS_OFF ){
   427        sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid);
   428      }
   429    }else{
   430      /* Read the PK of the current row into an array of registers. In
   431      ** ONEPASS_OFF mode, serialize the array into a record and store it in
   432      ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change
   433      ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table 
   434      ** is not required) and leave the PK fields in the array of registers.  */
   435      for(i=0; i<nPk; i++){
   436        assert( pPk->aiColumn[i]>=0 );
   437        sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i);
   438      }
   439      if( eOnePass ){
   440        sqlite3VdbeChangeToNoop(v, addrOpen);
   441        nKey = nPk;
   442        regKey = iPk;
   443      }else{
   444        sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey,
   445                          sqlite3IndexAffinityStr(db, pPk), nPk);
   446        sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk);
   447      }
   448    }
   449  
   450    if( eOnePass!=ONEPASS_MULTI ){
   451      sqlite3WhereEnd(pWInfo);
   452    }
   453  
   454    labelBreak = sqlite3VdbeMakeLabel(v);
   455    if( !isView ){
   456      int addrOnce = 0;
   457  
   458      /* Open every index that needs updating. */
   459      if( eOnePass!=ONEPASS_OFF ){
   460        if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0;
   461        if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0;
   462      }
   463  
   464      if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){
   465        addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
   466      }
   467      sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, aToOpen,
   468                                 0, 0);
   469      if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
   470    }
   471  
   472    /* Top of the update loop */
   473    if( eOnePass!=ONEPASS_OFF ){
   474      if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){
   475        assert( pPk );
   476        sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey);
   477        VdbeCoverageNeverTaken(v);
   478      }
   479      if( eOnePass==ONEPASS_SINGLE ){
   480        labelContinue = labelBreak;
   481      }else{
   482        labelContinue = sqlite3VdbeMakeLabel(v);
   483      }
   484      sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak);
   485      VdbeCoverageIf(v, pPk==0);
   486      VdbeCoverageIf(v, pPk!=0);
   487    }else if( pPk ){
   488      labelContinue = sqlite3VdbeMakeLabel(v);
   489      sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v);
   490      addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey);
   491      sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0);
   492      VdbeCoverage(v);
   493    }else{
   494      labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak,
   495                               regOldRowid);
   496      VdbeCoverage(v);
   497      sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
   498      VdbeCoverage(v);
   499    }
   500  
   501    /* If the record number will change, set register regNewRowid to
   502    ** contain the new value. If the record number is not being modified,
   503    ** then regNewRowid is the same register as regOldRowid, which is
   504    ** already populated.  */
   505    assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid );
   506    if( chngRowid ){
   507      sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
   508      sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v);
   509    }
   510  
   511    /* Compute the old pre-UPDATE content of the row being changed, if that
   512    ** information is needed */
   513    if( chngPk || hasFK || pTrigger ){
   514      u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0);
   515      oldmask |= sqlite3TriggerColmask(pParse, 
   516          pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError
   517      );
   518      for(i=0; i<pTab->nCol; i++){
   519        if( oldmask==0xffffffff
   520         || (i<32 && (oldmask & MASKBIT32(i))!=0)
   521         || (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0
   522        ){
   523          testcase(  oldmask!=0xffffffff && i==31 );
   524          sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regOld+i);
   525        }else{
   526          sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i);
   527        }
   528      }
   529      if( chngRowid==0 && pPk==0 ){
   530        sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid);
   531      }
   532    }
   533  
   534    /* Populate the array of registers beginning at regNew with the new
   535    ** row data. This array is used to check constants, create the new
   536    ** table and index records, and as the values for any new.* references
   537    ** made by triggers.
   538    **
   539    ** If there are one or more BEFORE triggers, then do not populate the
   540    ** registers associated with columns that are (a) not modified by
   541    ** this UPDATE statement and (b) not accessed by new.* references. The
   542    ** values for registers not modified by the UPDATE must be reloaded from 
   543    ** the database after the BEFORE triggers are fired anyway (as the trigger 
   544    ** may have modified them). So not loading those that are not going to
   545    ** be used eliminates some redundant opcodes.
   546    */
   547    newmask = sqlite3TriggerColmask(
   548        pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError
   549    );
   550    for(i=0; i<pTab->nCol; i++){
   551      if( i==pTab->iPKey ){
   552        sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
   553      }else{
   554        j = aXRef[i];
   555        if( j>=0 ){
   556          sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i);
   557        }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){
   558          /* This branch loads the value of a column that will not be changed 
   559          ** into a register. This is done if there are no BEFORE triggers, or
   560          ** if there are one or more BEFORE triggers that use this value via
   561          ** a new.* reference in a trigger program.
   562          */
   563          testcase( i==31 );
   564          testcase( i==32 );
   565          sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i);
   566        }else{
   567          sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
   568        }
   569      }
   570    }
   571  
   572    /* Fire any BEFORE UPDATE triggers. This happens before constraints are
   573    ** verified. One could argue that this is wrong.
   574    */
   575    if( tmask&TRIGGER_BEFORE ){
   576      sqlite3TableAffinity(v, pTab, regNew);
   577      sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, 
   578          TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue);
   579  
   580      /* The row-trigger may have deleted the row being updated. In this
   581      ** case, jump to the next row. No updates or AFTER triggers are 
   582      ** required. This behavior - what happens when the row being updated
   583      ** is deleted or renamed by a BEFORE trigger - is left undefined in the
   584      ** documentation.
   585      */
   586      if( pPk ){
   587        sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue,regKey,nKey);
   588        VdbeCoverage(v);
   589      }else{
   590        sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid);
   591        VdbeCoverage(v);
   592      }
   593  
   594      /* If it did not delete it, the row-trigger may still have modified 
   595      ** some of the columns of the row being updated. Load the values for 
   596      ** all columns not modified by the update statement into their 
   597      ** registers in case this has happened.
   598      */
   599      for(i=0; i<pTab->nCol; i++){
   600        if( aXRef[i]<0 && i!=pTab->iPKey ){
   601          sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i);
   602        }
   603      }
   604    }
   605  
   606    if( !isView ){
   607      int addr1 = 0;        /* Address of jump instruction */
   608  
   609      /* Do constraint checks. */
   610      assert( regOldRowid>0 );
   611      sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur,
   612          regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace,
   613          aXRef);
   614  
   615      /* Do FK constraint checks. */
   616      if( hasFK ){
   617        sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey);
   618      }
   619  
   620      /* Delete the index entries associated with the current record.  */
   621      if( bReplace || chngKey ){
   622        if( pPk ){
   623          addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey);
   624        }else{
   625          addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid);
   626        }
   627        VdbeCoverageNeverTaken(v);
   628      }
   629      sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1);
   630  
   631      /* If changing the rowid value, or if there are foreign key constraints
   632      ** to process, delete the old record. Otherwise, add a noop OP_Delete
   633      ** to invoke the pre-update hook.
   634      **
   635      ** That (regNew==regnewRowid+1) is true is also important for the 
   636      ** pre-update hook. If the caller invokes preupdate_new(), the returned
   637      ** value is copied from memory cell (regNewRowid+1+iCol), where iCol
   638      ** is the column index supplied by the user.
   639      */
   640      assert( regNew==regNewRowid+1 );
   641  #ifdef SQLITE_ENABLE_PREUPDATE_HOOK
   642      sqlite3VdbeAddOp3(v, OP_Delete, iDataCur,
   643          OPFLAG_ISUPDATE | ((hasFK>1 || chngKey) ? 0 : OPFLAG_ISNOOP),
   644          regNewRowid
   645      );
   646      if( eOnePass==ONEPASS_MULTI ){
   647        assert( hasFK==0 && chngKey==0 );
   648        sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION);
   649      }
   650      if( !pParse->nested ){
   651        sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
   652      }
   653  #else
   654      if( hasFK>1 || chngKey ){
   655        sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0);
   656      }
   657  #endif
   658      if( bReplace || chngKey ){
   659        sqlite3VdbeJumpHere(v, addr1);
   660      }
   661  
   662      if( hasFK ){
   663        sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey);
   664      }
   665    
   666      /* Insert the new index entries and the new record. */
   667      sqlite3CompleteInsertion(
   668          pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, 
   669          OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), 
   670          0, 0
   671      );
   672  
   673      /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
   674      ** handle rows (possibly in other tables) that refer via a foreign key
   675      ** to the row just updated. */ 
   676      if( hasFK ){
   677        sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey);
   678      }
   679    }
   680  
   681    /* Increment the row counter 
   682    */
   683    if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
   684      sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
   685    }
   686  
   687    sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, 
   688        TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue);
   689  
   690    /* Repeat the above with the next record to be updated, until
   691    ** all record selected by the WHERE clause have been updated.
   692    */
   693    if( eOnePass==ONEPASS_SINGLE ){
   694      /* Nothing to do at end-of-loop for a single-pass */
   695    }else if( eOnePass==ONEPASS_MULTI ){
   696      sqlite3VdbeResolveLabel(v, labelContinue);
   697      sqlite3WhereEnd(pWInfo);
   698    }else if( pPk ){
   699      sqlite3VdbeResolveLabel(v, labelContinue);
   700      sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v);
   701    }else{
   702      sqlite3VdbeGoto(v, labelContinue);
   703    }
   704    sqlite3VdbeResolveLabel(v, labelBreak);
   705  
   706    /* Update the sqlite_sequence table by storing the content of the
   707    ** maximum rowid counter values recorded while inserting into
   708    ** autoincrement tables.
   709    */
   710    if( pParse->nested==0 && pParse->pTriggerTab==0 ){
   711      sqlite3AutoincrementEnd(pParse);
   712    }
   713  
   714    /*
   715    ** Return the number of rows that were changed. If this routine is 
   716    ** generating code because of a call to sqlite3NestedParse(), do not
   717    ** invoke the callback function.
   718    */
   719    if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
   720      sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
   721      sqlite3VdbeSetNumCols(v, 1);
   722      sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
   723    }
   724  
   725  update_cleanup:
   726    sqlite3AuthContextPop(&sContext);
   727    sqlite3DbFree(db, aXRef); /* Also frees aRegIdx[] and aToOpen[] */
   728    sqlite3SrcListDelete(db, pTabList);
   729    sqlite3ExprListDelete(db, pChanges);
   730    sqlite3ExprDelete(db, pWhere);
   731    return;
   732  }
   733  /* Make sure "isView" and other macros defined above are undefined. Otherwise
   734  ** they may interfere with compilation of other functions in this file
   735  ** (or in another file, if this file becomes part of the amalgamation).  */
   736  #ifdef isView
   737   #undef isView
   738  #endif
   739  #ifdef pTrigger
   740   #undef pTrigger
   741  #endif
   742  
   743  #ifndef SQLITE_OMIT_VIRTUALTABLE
   744  /*
   745  ** Generate code for an UPDATE of a virtual table.
   746  **
   747  ** There are two possible strategies - the default and the special 
   748  ** "onepass" strategy. Onepass is only used if the virtual table 
   749  ** implementation indicates that pWhere may match at most one row.
   750  **
   751  ** The default strategy is to create an ephemeral table that contains
   752  ** for each row to be changed:
   753  **
   754  **   (A)  The original rowid of that row.
   755  **   (B)  The revised rowid for the row.
   756  **   (C)  The content of every column in the row.
   757  **
   758  ** Then loop through the contents of this ephemeral table executing a
   759  ** VUpdate for each row. When finished, drop the ephemeral table.
   760  **
   761  ** The "onepass" strategy does not use an ephemeral table. Instead, it
   762  ** stores the same values (A, B and C above) in a register array and
   763  ** makes a single invocation of VUpdate.
   764  */
   765  static void updateVirtualTable(
   766    Parse *pParse,       /* The parsing context */
   767    SrcList *pSrc,       /* The virtual table to be modified */
   768    Table *pTab,         /* The virtual table */
   769    ExprList *pChanges,  /* The columns to change in the UPDATE statement */
   770    Expr *pRowid,        /* Expression used to recompute the rowid */
   771    int *aXRef,          /* Mapping from columns of pTab to entries in pChanges */
   772    Expr *pWhere,        /* WHERE clause of the UPDATE statement */
   773    int onError          /* ON CONFLICT strategy */
   774  ){
   775    Vdbe *v = pParse->pVdbe;  /* Virtual machine under construction */
   776    int ephemTab;             /* Table holding the result of the SELECT */
   777    int i;                    /* Loop counter */
   778    sqlite3 *db = pParse->db; /* Database connection */
   779    const char *pVTab = (const char*)sqlite3GetVTable(db, pTab);
   780    WhereInfo *pWInfo;
   781    int nArg = 2 + pTab->nCol;      /* Number of arguments to VUpdate */
   782    int regArg;                     /* First register in VUpdate arg array */
   783    int regRec;                     /* Register in which to assemble record */
   784    int regRowid;                   /* Register for ephem table rowid */
   785    int iCsr = pSrc->a[0].iCursor;  /* Cursor used for virtual table scan */
   786    int aDummy[2];                  /* Unused arg for sqlite3WhereOkOnePass() */
   787    int bOnePass;                   /* True to use onepass strategy */
   788    int addr;                       /* Address of OP_OpenEphemeral */
   789  
   790    /* Allocate nArg registers to martial the arguments to VUpdate. Then
   791    ** create and open the ephemeral table in which the records created from
   792    ** these arguments will be temporarily stored. */
   793    assert( v );
   794    ephemTab = pParse->nTab++;
   795    addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg);
   796    regArg = pParse->nMem + 1;
   797    pParse->nMem += nArg;
   798    regRec = ++pParse->nMem;
   799    regRowid = ++pParse->nMem;
   800  
   801    /* Start scanning the virtual table */
   802    pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0);
   803    if( pWInfo==0 ) return;
   804  
   805    /* Populate the argument registers. */
   806    for(i=0; i<pTab->nCol; i++){
   807      if( aXRef[i]>=0 ){
   808        sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i);
   809      }else{
   810        sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i);
   811      }
   812    }
   813    if( HasRowid(pTab) ){
   814      sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg);
   815      if( pRowid ){
   816        sqlite3ExprCode(pParse, pRowid, regArg+1);
   817      }else{
   818        sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1);
   819      }
   820    }else{
   821      Index *pPk;   /* PRIMARY KEY index */
   822      i16 iPk;      /* PRIMARY KEY column */
   823      pPk = sqlite3PrimaryKeyIndex(pTab);
   824      assert( pPk!=0 );
   825      assert( pPk->nKeyCol==1 );
   826      iPk = pPk->aiColumn[0];
   827      sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg);
   828      sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1);
   829    }
   830  
   831    bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy);
   832  
   833    if( bOnePass ){
   834      /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded
   835      ** above. Also, if this is a top-level parse (not a trigger), clear the
   836      ** multi-write flag so that the VM does not open a statement journal */
   837      sqlite3VdbeChangeToNoop(v, addr);
   838      if( sqlite3IsToplevel(pParse) ){
   839        pParse->isMultiWrite = 0;
   840      }
   841    }else{
   842      /* Create a record from the argument register contents and insert it into
   843      ** the ephemeral table. */
   844      sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec);
   845      sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid);
   846      sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid);
   847    }
   848  
   849  
   850    if( bOnePass==0 ){
   851      /* End the virtual table scan */
   852      sqlite3WhereEnd(pWInfo);
   853  
   854      /* Begin scannning through the ephemeral table. */
   855      addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v);
   856  
   857      /* Extract arguments from the current row of the ephemeral table and 
   858      ** invoke the VUpdate method.  */
   859      for(i=0; i<nArg; i++){
   860        sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i, regArg+i);
   861      }
   862    }
   863    sqlite3VtabMakeWritable(pParse, pTab);
   864    sqlite3VdbeAddOp4(v, OP_VUpdate, 0, nArg, regArg, pVTab, P4_VTAB);
   865    sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError);
   866    sqlite3MayAbort(pParse);
   867  
   868    /* End of the ephemeral table scan. Or, if using the onepass strategy,
   869    ** jump to here if the scan visited zero rows. */
   870    if( bOnePass==0 ){
   871      sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v);
   872      sqlite3VdbeJumpHere(v, addr);
   873      sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
   874    }else{
   875      sqlite3WhereEnd(pWInfo);
   876    }
   877  }
   878  #endif /* SQLITE_OMIT_VIRTUALTABLE */