xref: /sqlite-3.40.0/src/delete.c (revision a3fdec71)
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 ** in order to generate code for DELETE FROM statements.
14 */
15 #include "sqliteInt.h"
16 
17 /*
18 ** While a SrcList can in general represent multiple tables and subqueries
19 ** (as in the FROM clause of a SELECT statement) in this case it contains
20 ** the name of a single table, as one might find in an INSERT, DELETE,
21 ** or UPDATE statement.  Look up that table in the symbol table and
22 ** return a pointer.  Set an error message and return NULL if the table
23 ** name is not found or if any other error occurs.
24 **
25 ** The following fields are initialized appropriate in pSrc:
26 **
27 **    pSrc->a[0].pTab       Pointer to the Table object
28 **    pSrc->a[0].pIndex     Pointer to the INDEXED BY index, if there is one
29 **
30 */
31 Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
32   struct SrcList_item *pItem = pSrc->a;
33   Table *pTab;
34   assert( pItem && pSrc->nSrc==1 );
35   pTab = sqlite3LocateTableItem(pParse, 0, pItem);
36   sqlite3DeleteTable(pParse->db, pItem->pTab);
37   pItem->pTab = pTab;
38   if( pTab ){
39     pTab->nRef++;
40   }
41   if( sqlite3IndexedByLookup(pParse, pItem) ){
42     pTab = 0;
43   }
44   return pTab;
45 }
46 
47 /*
48 ** Check to make sure the given table is writable.  If it is not
49 ** writable, generate an error message and return 1.  If it is
50 ** writable return 0;
51 */
52 int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
53   /* A table is not writable under the following circumstances:
54   **
55   **   1) It is a virtual table and no implementation of the xUpdate method
56   **      has been provided, or
57   **   2) It is a system table (i.e. sqlite_master), this call is not
58   **      part of a nested parse and writable_schema pragma has not
59   **      been specified.
60   **
61   ** In either case leave an error message in pParse and return non-zero.
62   */
63   if( ( IsVirtual(pTab)
64      && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 )
65    || ( (pTab->tabFlags & TF_Readonly)!=0
66      && (pParse->db->flags & SQLITE_WriteSchema)==0
67      && pParse->nested==0 )
68   ){
69     sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName);
70     return 1;
71   }
72 
73 #ifndef SQLITE_OMIT_VIEW
74   if( !viewOk && pTab->pSelect ){
75     sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName);
76     return 1;
77   }
78 #endif
79   return 0;
80 }
81 
82 
83 #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
84 /*
85 ** Evaluate a view and store its result in an ephemeral table.  The
86 ** pWhere argument is an optional WHERE clause that restricts the
87 ** set of rows in the view that are to be added to the ephemeral table.
88 */
89 void sqlite3MaterializeView(
90   Parse *pParse,       /* Parsing context */
91   Table *pView,        /* View definition */
92   Expr *pWhere,        /* Optional WHERE clause to be added */
93   int iCur             /* Cursor number for ephemerial table */
94 ){
95   SelectDest dest;
96   Select *pSel;
97   SrcList *pFrom;
98   sqlite3 *db = pParse->db;
99   int iDb = sqlite3SchemaToIndex(db, pView->pSchema);
100 
101   pWhere = sqlite3ExprDup(db, pWhere, 0);
102   pFrom = sqlite3SrcListAppend(db, 0, 0, 0);
103 
104   if( pFrom ){
105     assert( pFrom->nSrc==1 );
106     pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName);
107     pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName);
108     assert( pFrom->a[0].pOn==0 );
109     assert( pFrom->a[0].pUsing==0 );
110   }
111 
112   pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0);
113   if( pSel ) pSel->selFlags |= SF_Materialize;
114 
115   sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur);
116   sqlite3Select(pParse, pSel, &dest);
117   sqlite3SelectDelete(db, pSel);
118 }
119 #endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */
120 
121 #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
122 /*
123 ** Generate an expression tree to implement the WHERE, ORDER BY,
124 ** and LIMIT/OFFSET portion of DELETE and UPDATE statements.
125 **
126 **     DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1;
127 **                            \__________________________/
128 **                               pLimitWhere (pInClause)
129 */
130 Expr *sqlite3LimitWhere(
131   Parse *pParse,               /* The parser context */
132   SrcList *pSrc,               /* the FROM clause -- which tables to scan */
133   Expr *pWhere,                /* The WHERE clause.  May be null */
134   ExprList *pOrderBy,          /* The ORDER BY clause.  May be null */
135   Expr *pLimit,                /* The LIMIT clause.  May be null */
136   Expr *pOffset,               /* The OFFSET clause.  May be null */
137   char *zStmtType              /* Either DELETE or UPDATE.  For err msgs. */
138 ){
139   Expr *pWhereRowid = NULL;    /* WHERE rowid .. */
140   Expr *pInClause = NULL;      /* WHERE rowid IN ( select ) */
141   Expr *pSelectRowid = NULL;   /* SELECT rowid ... */
142   ExprList *pEList = NULL;     /* Expression list contaning only pSelectRowid */
143   SrcList *pSelectSrc = NULL;  /* SELECT rowid FROM x ... (dup of pSrc) */
144   Select *pSelect = NULL;      /* Complete SELECT tree */
145 
146   /* Check that there isn't an ORDER BY without a LIMIT clause.
147   */
148   if( pOrderBy && (pLimit == 0) ) {
149     sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType);
150     goto limit_where_cleanup_2;
151   }
152 
153   /* We only need to generate a select expression if there
154   ** is a limit/offset term to enforce.
155   */
156   if( pLimit == 0 ) {
157     /* if pLimit is null, pOffset will always be null as well. */
158     assert( pOffset == 0 );
159     return pWhere;
160   }
161 
162   /* Generate a select expression tree to enforce the limit/offset
163   ** term for the DELETE or UPDATE statement.  For example:
164   **   DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
165   ** becomes:
166   **   DELETE FROM table_a WHERE rowid IN (
167   **     SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
168   **   );
169   */
170 
171   pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
172   if( pSelectRowid == 0 ) goto limit_where_cleanup_2;
173   pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid);
174   if( pEList == 0 ) goto limit_where_cleanup_2;
175 
176   /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree
177   ** and the SELECT subtree. */
178   pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
179   if( pSelectSrc == 0 ) {
180     sqlite3ExprListDelete(pParse->db, pEList);
181     goto limit_where_cleanup_2;
182   }
183 
184   /* generate the SELECT expression tree. */
185   pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0,
186                              pOrderBy,0,pLimit,pOffset);
187   if( pSelect == 0 ) return 0;
188 
189   /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */
190   pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
191   if( pWhereRowid == 0 ) goto limit_where_cleanup_1;
192   pInClause = sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0);
193   if( pInClause == 0 ) goto limit_where_cleanup_1;
194 
195   pInClause->x.pSelect = pSelect;
196   pInClause->flags |= EP_xIsSelect;
197   sqlite3ExprSetHeight(pParse, pInClause);
198   return pInClause;
199 
200   /* something went wrong. clean up anything allocated. */
201 limit_where_cleanup_1:
202   sqlite3SelectDelete(pParse->db, pSelect);
203   return 0;
204 
205 limit_where_cleanup_2:
206   sqlite3ExprDelete(pParse->db, pWhere);
207   sqlite3ExprListDelete(pParse->db, pOrderBy);
208   sqlite3ExprDelete(pParse->db, pLimit);
209   sqlite3ExprDelete(pParse->db, pOffset);
210   return 0;
211 }
212 #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */
213        /*      && !defined(SQLITE_OMIT_SUBQUERY) */
214 
215 /*
216 ** Generate code for a DELETE FROM statement.
217 **
218 **     DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL;
219 **                 \________/       \________________/
220 **                  pTabList              pWhere
221 */
222 void sqlite3DeleteFrom(
223   Parse *pParse,         /* The parser context */
224   SrcList *pTabList,     /* The table from which we should delete things */
225   Expr *pWhere           /* The WHERE clause.  May be null */
226 ){
227   Vdbe *v;               /* The virtual database engine */
228   Table *pTab;           /* The table from which records will be deleted */
229   const char *zDb;       /* Name of database holding pTab */
230   int i;                 /* Loop counter */
231   WhereInfo *pWInfo;     /* Information about the WHERE clause */
232   Index *pIdx;           /* For looping over indices of the table */
233   int iTabCur;           /* Cursor number for the table */
234   int iDataCur;          /* VDBE cursor for the canonical data source */
235   int iIdxCur;           /* Cursor number of the first index */
236   int nIdx;              /* Number of indices */
237   sqlite3 *db;           /* Main database structure */
238   AuthContext sContext;  /* Authorization context */
239   NameContext sNC;       /* Name context to resolve expressions in */
240   int iDb;               /* Database number */
241   int memCnt = -1;       /* Memory cell used for change counting */
242   int rcauth;            /* Value returned by authorization callback */
243   int okOnePass;         /* True for one-pass algorithm without the FIFO */
244   int aiCurOnePass[2];   /* The write cursors opened by WHERE_ONEPASS */
245   u8 *aToOpen = 0;       /* Open cursor iTabCur+j if aToOpen[j] is true */
246   Index *pPk;            /* The PRIMARY KEY index on the table */
247   int iPk = 0;           /* First of nPk registers holding PRIMARY KEY value */
248   i16 nPk = 1;           /* Number of columns in the PRIMARY KEY */
249   int iKey;              /* Memory cell holding key of row to be deleted */
250   i16 nKey;              /* Number of memory cells in the row key */
251   int iEphCur = 0;       /* Ephemeral table holding all primary key values */
252   int iRowSet = 0;       /* Register for rowset of rows to delete */
253   int addrBypass = 0;    /* Address of jump over the delete logic */
254   int addrLoop = 0;      /* Top of the delete loop */
255   int addrDelete = 0;    /* Jump directly to the delete logic */
256   int addrEphOpen = 0;   /* Instruction to open the Ephermeral table */
257 
258 #ifndef SQLITE_OMIT_TRIGGER
259   int isView;                  /* True if attempting to delete from a view */
260   Trigger *pTrigger;           /* List of table triggers, if required */
261 #endif
262 
263   memset(&sContext, 0, sizeof(sContext));
264   db = pParse->db;
265   if( pParse->nErr || db->mallocFailed ){
266     goto delete_from_cleanup;
267   }
268   assert( pTabList->nSrc==1 );
269 
270   /* Locate the table which we want to delete.  This table has to be
271   ** put in an SrcList structure because some of the subroutines we
272   ** will be calling are designed to work with multiple tables and expect
273   ** an SrcList* parameter instead of just a Table* parameter.
274   */
275   pTab = sqlite3SrcListLookup(pParse, pTabList);
276   if( pTab==0 )  goto delete_from_cleanup;
277 
278   /* Figure out if we have any triggers and if the table being
279   ** deleted from is a view
280   */
281 #ifndef SQLITE_OMIT_TRIGGER
282   pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
283   isView = pTab->pSelect!=0;
284 #else
285 # define pTrigger 0
286 # define isView 0
287 #endif
288 #ifdef SQLITE_OMIT_VIEW
289 # undef isView
290 # define isView 0
291 #endif
292 
293   /* If pTab is really a view, make sure it has been initialized.
294   */
295   if( sqlite3ViewGetColumnNames(pParse, pTab) ){
296     goto delete_from_cleanup;
297   }
298 
299   if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){
300     goto delete_from_cleanup;
301   }
302   iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
303   assert( iDb<db->nDb );
304   zDb = db->aDb[iDb].zName;
305   rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb);
306   assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE );
307   if( rcauth==SQLITE_DENY ){
308     goto delete_from_cleanup;
309   }
310   assert(!isView || pTrigger);
311 
312   /* Assign cursor numbers to the table and all its indices.
313   */
314   assert( pTabList->nSrc==1 );
315   iTabCur = pTabList->a[0].iCursor = pParse->nTab++;
316   for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){
317     pParse->nTab++;
318   }
319 
320   /* Start the view context
321   */
322   if( isView ){
323     sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
324   }
325 
326   /* Begin generating code.
327   */
328   v = sqlite3GetVdbe(pParse);
329   if( v==0 ){
330     goto delete_from_cleanup;
331   }
332   if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
333   sqlite3BeginWriteOperation(pParse, 1, iDb);
334 
335   /* If we are trying to delete from a view, realize that view into
336   ** a ephemeral table.
337   */
338 #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
339   if( isView ){
340     sqlite3MaterializeView(pParse, pTab, pWhere, iTabCur);
341     iDataCur = iIdxCur = iTabCur;
342   }
343 #endif
344 
345   /* Resolve the column names in the WHERE clause.
346   */
347   memset(&sNC, 0, sizeof(sNC));
348   sNC.pParse = pParse;
349   sNC.pSrcList = pTabList;
350   if( sqlite3ResolveExprNames(&sNC, pWhere) ){
351     goto delete_from_cleanup;
352   }
353 
354   /* Initialize the counter of the number of rows deleted, if
355   ** we are counting rows.
356   */
357   if( db->flags & SQLITE_CountRows ){
358     memCnt = ++pParse->nMem;
359     sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt);
360   }
361 
362 #ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
363   /* Special case: A DELETE without a WHERE clause deletes everything.
364   ** It is easier just to erase the whole table. Prior to version 3.6.5,
365   ** this optimization caused the row change count (the value returned by
366   ** API function sqlite3_count_changes) to be set incorrectly.  */
367   if( rcauth==SQLITE_OK && pWhere==0 && !pTrigger && !IsVirtual(pTab)
368    && 0==sqlite3FkRequired(pParse, pTab, 0, 0)
369   ){
370     assert( !isView );
371     sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
372     if( HasRowid(pTab) ){
373       sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt,
374                         pTab->zName, P4_STATIC);
375     }
376     for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
377       assert( pIdx->pSchema==pTab->pSchema );
378       sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
379     }
380   }else
381 #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
382   {
383     if( HasRowid(pTab) ){
384       /* For a rowid table, initialize the RowSet to an empty set */
385       pPk = 0;
386       nPk = 1;
387       iRowSet = ++pParse->nMem;
388       sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet);
389     }else{
390       /* For a WITHOUT ROWID table, create an ephermeral table used to
391       ** hold all primary keys for rows to be deleted. */
392       pPk = sqlite3PrimaryKeyIndex(pTab);
393       assert( pPk!=0 );
394       nPk = pPk->nKeyCol;
395       iPk = pParse->nMem+1;
396       pParse->nMem += nPk;
397       iEphCur = pParse->nTab++;
398       addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk);
399       sqlite3VdbeSetP4KeyInfo(pParse, pPk);
400     }
401 
402     /* Construct a query to find the rowid or primary key for every row
403     ** to be deleted, based on the WHERE clause.
404     */
405     pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0,
406                                WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK,
407                                iTabCur+1);
408     if( pWInfo==0 ) goto delete_from_cleanup;
409     okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
410 
411     /* Keep track of the number of rows to be deleted */
412     if( db->flags & SQLITE_CountRows ){
413       sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
414     }
415 
416     /* Extract the rowid or primary key for the current row */
417     if( pPk ){
418       for(i=0; i<nPk; i++){
419         sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur,
420                                         pPk->aiColumn[i], iPk+i);
421       }
422       iKey = iPk;
423     }else{
424       iKey = pParse->nMem + 1;
425       iKey = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iTabCur, iKey, 0);
426       if( iKey>pParse->nMem ) pParse->nMem = iKey;
427     }
428 
429     if( okOnePass ){
430       /* For ONEPASS, no need to store the rowid/primary-key.  There is only
431       ** one, so just keep it in its register(s) and fall through to the
432       ** delete code.
433       */
434       nKey = nPk; /* OP_Found will use an unpacked key */
435       aToOpen = sqlite3DbMallocRaw(db, nIdx+2);
436       if( aToOpen==0 ){
437         sqlite3WhereEnd(pWInfo);
438         goto delete_from_cleanup;
439       }
440       memset(aToOpen, 1, nIdx+1);
441       aToOpen[nIdx+1] = 0;
442       if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0;
443       if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0;
444       if( addrEphOpen ) sqlite3VdbeChangeToNoop(v, addrEphOpen);
445       addrDelete = sqlite3VdbeAddOp0(v, OP_Goto); /* Jump to DELETE logic */
446     }else if( pPk ){
447       /* Construct a composite key for the row to be deleted and remember it */
448       iKey = ++pParse->nMem;
449       nKey = 0;   /* Zero tells OP_Found to use a composite key */
450       sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey,
451                         sqlite3IndexAffinityStr(v, pPk), P4_TRANSIENT);
452       sqlite3VdbeAddOp2(v, OP_IdxInsert, iEphCur, iKey);
453     }else{
454       /* Get the rowid of the row to be deleted and remember it in the RowSet */
455       nKey = 1;  /* OP_Seek always uses a single rowid */
456       sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey);
457     }
458 
459     /* End of the WHERE loop */
460     sqlite3WhereEnd(pWInfo);
461     if( okOnePass ){
462       /* Bypass the delete logic below if the WHERE loop found zero rows */
463       addrBypass = sqlite3VdbeMakeLabel(v);
464       sqlite3VdbeAddOp2(v, OP_Goto, 0, addrBypass);
465       sqlite3VdbeJumpHere(v, addrDelete);
466     }
467 
468     /* Unless this is a view, open cursors for the table we are
469     ** deleting from and all its indices. If this is a view, then the
470     ** only effect this statement has is to fire the INSTEAD OF
471     ** triggers.
472     */
473     if( !isView ){
474       sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iTabCur, aToOpen,
475                                  &iDataCur, &iIdxCur);
476       assert( pPk || iDataCur==iTabCur );
477       assert( pPk || iIdxCur==iDataCur+1 );
478     }
479 
480     /* Set up a loop over the rowids/primary-keys that were found in the
481     ** where-clause loop above.
482     */
483     if( okOnePass ){
484       /* Just one row.  Hence the top-of-loop is a no-op */
485       assert( nKey==nPk ); /* OP_Found will use an unpacked key */
486       if( aToOpen[iDataCur-iTabCur] ){
487         assert( pPk!=0 );
488         sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey);
489       }
490     }else if( pPk ){
491       addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur);
492       sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey);
493       assert( nKey==0 );  /* OP_Found will use a composite key */
494     }else{
495       addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey);
496       assert( nKey==1 );
497     }
498 
499     /* Delete the row */
500 #ifndef SQLITE_OMIT_VIRTUALTABLE
501     if( IsVirtual(pTab) ){
502       const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
503       sqlite3VtabMakeWritable(pParse, pTab);
504       sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB);
505       sqlite3VdbeChangeP5(v, OE_Abort);
506       sqlite3MayAbort(pParse);
507     }else
508 #endif
509     {
510       int count = (pParse->nested==0);    /* True to count changes */
511       sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
512                                iKey, nKey, count, OE_Default, okOnePass);
513     }
514 
515     /* End of the loop over all rowids/primary-keys. */
516     if( okOnePass ){
517       sqlite3VdbeResolveLabel(v, addrBypass);
518     }else if( pPk ){
519       sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1);
520       sqlite3VdbeJumpHere(v, addrLoop);
521     }else{
522       sqlite3VdbeAddOp2(v, OP_Goto, 0, addrLoop);
523       sqlite3VdbeJumpHere(v, addrLoop);
524     }
525 
526     /* Close the cursors open on the table and its indexes. */
527     if( !isView && !IsVirtual(pTab) ){
528       if( !pPk ) sqlite3VdbeAddOp1(v, OP_Close, iDataCur);
529       for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
530         sqlite3VdbeAddOp1(v, OP_Close, iIdxCur + i);
531       }
532     }
533   } /* End non-truncate path */
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   /* Return the number of rows that were deleted. If this routine is
544   ** generating code because of a call to sqlite3NestedParse(), do not
545   ** invoke the callback function.
546   */
547   if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
548     sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1);
549     sqlite3VdbeSetNumCols(v, 1);
550     sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
551   }
552 
553 delete_from_cleanup:
554   sqlite3AuthContextPop(&sContext);
555   sqlite3SrcListDelete(db, pTabList);
556   sqlite3ExprDelete(db, pWhere);
557   sqlite3DbFree(db, aToOpen);
558   return;
559 }
560 /* Make sure "isView" and other macros defined above are undefined. Otherwise
561 ** thely may interfere with compilation of other functions in this file
562 ** (or in another file, if this file becomes part of the amalgamation).  */
563 #ifdef isView
564  #undef isView
565 #endif
566 #ifdef pTrigger
567  #undef pTrigger
568 #endif
569 
570 /*
571 ** This routine generates VDBE code that causes a single row of a
572 ** single table to be deleted.  Both the original table entry and
573 ** all indices are removed.
574 **
575 ** Preconditions:
576 **
577 **   1.  iDataCur is an open cursor on the btree that is the canonical data
578 **       store for the table.  (This will be either the table itself,
579 **       in the case of a rowid table, or the PRIMARY KEY index in the case
580 **       of a WITHOUT ROWID table.)
581 **
582 **   2.  Read/write cursors for all indices of pTab must be open as
583 **       cursor number iIdxCur+i for the i-th index.
584 **
585 **   3.  The primary key for the row to be deleted must be stored in a
586 **       sequence of nPk memory cells starting at iPk.  If nPk==0 that means
587 **       that a search record formed from OP_MakeRecord is contained in the
588 **       single memory location iPk.
589 */
590 void sqlite3GenerateRowDelete(
591   Parse *pParse,     /* Parsing context */
592   Table *pTab,       /* Table containing the row to be deleted */
593   Trigger *pTrigger, /* List of triggers to (potentially) fire */
594   int iDataCur,      /* Cursor from which column data is extracted */
595   int iIdxCur,       /* First index cursor */
596   int iPk,           /* First memory cell containing the PRIMARY KEY */
597   i16 nPk,           /* Number of PRIMARY KEY memory cells */
598   u8 count,          /* If non-zero, increment the row change counter */
599   u8 onconf,         /* Default ON CONFLICT policy for triggers */
600   u8 bNoSeek         /* iDataCur is already pointing to the row to delete */
601 ){
602   Vdbe *v = pParse->pVdbe;        /* Vdbe */
603   int iOld = 0;                   /* First register in OLD.* array */
604   int iLabel;                     /* Label resolved to end of generated code */
605   u8 opSeek;                      /* Seek opcode */
606 
607   /* Vdbe is guaranteed to have been allocated by this stage. */
608   assert( v );
609   VdbeModuleComment((v, "BEGIN: GenRowDel(%d,%d,%d,%d)",
610                          iDataCur, iIdxCur, iPk, (int)nPk));
611 
612   /* Seek cursor iCur to the row to delete. If this row no longer exists
613   ** (this can happen if a trigger program has already deleted it), do
614   ** not attempt to delete it or fire any DELETE triggers.  */
615   iLabel = sqlite3VdbeMakeLabel(v);
616   opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound;
617   if( !bNoSeek ) sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk);
618 
619   /* If there are any triggers to fire, allocate a range of registers to
620   ** use for the old.* references in the triggers.  */
621   if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){
622     u32 mask;                     /* Mask of OLD.* columns in use */
623     int iCol;                     /* Iterator used while populating OLD.* */
624     int addrStart;                /* Start of BEFORE trigger programs */
625 
626     /* TODO: Could use temporary registers here. Also could attempt to
627     ** avoid copying the contents of the rowid register.  */
628     mask = sqlite3TriggerColmask(
629         pParse, pTrigger, 0, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onconf
630     );
631     mask |= sqlite3FkOldmask(pParse, pTab);
632     iOld = pParse->nMem+1;
633     pParse->nMem += (1 + pTab->nCol);
634 
635     /* Populate the OLD.* pseudo-table register array. These values will be
636     ** used by any BEFORE and AFTER triggers that exist.  */
637     sqlite3VdbeAddOp2(v, OP_Copy, iPk, iOld);
638     for(iCol=0; iCol<pTab->nCol; iCol++){
639       testcase( mask!=0xffffffff && iCol==31 );
640       testcase( mask!=0xffffffff && iCol==32 );
641       if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){
642         sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1);
643       }
644     }
645 
646     /* Invoke BEFORE DELETE trigger programs. */
647     addrStart = sqlite3VdbeCurrentAddr(v);
648     sqlite3CodeRowTrigger(pParse, pTrigger,
649         TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel
650     );
651 
652     /* If any BEFORE triggers were coded, then seek the cursor to the
653     ** row to be deleted again. It may be that the BEFORE triggers moved
654     ** the cursor or of already deleted the row that the cursor was
655     ** pointing to.
656     */
657     if( addrStart<sqlite3VdbeCurrentAddr(v) ){
658       sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk);
659     }
660 
661     /* Do FK processing. This call checks that any FK constraints that
662     ** refer to this table (i.e. constraints attached to other tables)
663     ** are not violated by deleting this row.  */
664     sqlite3FkCheck(pParse, pTab, iOld, 0, 0, 0);
665   }
666 
667   /* Delete the index and table entries. Skip this step if pTab is really
668   ** a view (in which case the only effect of the DELETE statement is to
669   ** fire the INSTEAD OF triggers).  */
670   if( pTab->pSelect==0 ){
671     sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0);
672     sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0));
673     if( count ){
674       sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT);
675     }
676   }
677 
678   /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
679   ** handle rows (possibly in other tables) that refer via a foreign key
680   ** to the row just deleted. */
681   sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0);
682 
683   /* Invoke AFTER DELETE trigger programs. */
684   sqlite3CodeRowTrigger(pParse, pTrigger,
685       TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel
686   );
687 
688   /* Jump here if the row had already been deleted before any BEFORE
689   ** trigger programs were invoked. Or if a trigger program throws a
690   ** RAISE(IGNORE) exception.  */
691   sqlite3VdbeResolveLabel(v, iLabel);
692   VdbeModuleComment((v, "END: GenRowDel()"));
693 }
694 
695 /*
696 ** This routine generates VDBE code that causes the deletion of all
697 ** index entries associated with a single row of a single table, pTab
698 **
699 ** Preconditions:
700 **
701 **   1.  A read/write cursor "iDataCur" must be open on the canonical storage
702 **       btree for the table pTab.  (This will be either the table itself
703 **       for rowid tables or to the primary key index for WITHOUT ROWID
704 **       tables.)
705 **
706 **   2.  Read/write cursors for all indices of pTab must be open as
707 **       cursor number iIdxCur+i for the i-th index.  (The pTab->pIndex
708 **       index is the 0-th index.)
709 **
710 **   3.  The "iDataCur" cursor must be already be positioned on the row
711 **       that is to be deleted.
712 */
713 void sqlite3GenerateRowIndexDelete(
714   Parse *pParse,     /* Parsing and code generating context */
715   Table *pTab,       /* Table containing the row to be deleted */
716   int iDataCur,      /* Cursor of table holding data. */
717   int iIdxCur,       /* First index cursor */
718   int *aRegIdx       /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */
719 ){
720   int i;             /* Index loop counter */
721   int r1 = -1;       /* Register holding an index key */
722   int iPartIdxLabel; /* Jump destination for skipping partial index entries */
723   Index *pIdx;       /* Current index */
724   Index *pPrior = 0; /* Prior index */
725   Vdbe *v;           /* The prepared statement under construction */
726   Index *pPk;        /* PRIMARY KEY index, or NULL for rowid tables */
727 
728   v = pParse->pVdbe;
729   pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
730   for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
731     assert( iIdxCur+i!=iDataCur || pPk==pIdx );
732     if( aRegIdx!=0 && aRegIdx[i]==0 ) continue;
733     if( pIdx==pPk ) continue;
734     VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName));
735     r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1,
736                                  &iPartIdxLabel, pPrior, r1);
737     sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1,
738                       pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn);
739     sqlite3VdbeResolveLabel(v, iPartIdxLabel);
740     pPrior = pIdx;
741   }
742 }
743 
744 /*
745 ** Generate code that will assemble an index key and stores it in register
746 ** regOut.  The key with be for index pIdx which is an index on pTab.
747 ** iCur is the index of a cursor open on the pTab table and pointing to
748 ** the entry that needs indexing.  If pTab is a WITHOUT ROWID table, then
749 ** iCur must be the cursor of the PRIMARY KEY index.
750 **
751 ** Return a register number which is the first in a block of
752 ** registers that holds the elements of the index key.  The
753 ** block of registers has already been deallocated by the time
754 ** this routine returns.
755 **
756 ** If *piPartIdxLabel is not NULL, fill it in with a label and jump
757 ** to that label if pIdx is a partial index that should be skipped.
758 ** A partial index should be skipped if its WHERE clause evaluates
759 ** to false or null.  If pIdx is not a partial index, *piPartIdxLabel
760 ** will be set to zero which is an empty label that is ignored by
761 ** sqlite3VdbeResolveLabel().
762 **
763 ** The pPrior and regPrior parameters are used to implement a cache to
764 ** avoid unnecessary register loads.  If pPrior is not NULL, then it is
765 ** a pointer to a different index for which an index key has just been
766 ** computed into register regPrior.  If the current pIdx index is generating
767 ** its key into the same sequence of registers and if pPrior and pIdx share
768 ** a column in common, then the register corresponding to that column already
769 ** holds the correct value and the loading of that register is skipped.
770 ** This optimization is helpful when doing a DELETE or an INTEGRITY_CHECK
771 ** on a table with multiple indices, and especially with the ROWID or
772 ** PRIMARY KEY columns of the index.
773 */
774 int sqlite3GenerateIndexKey(
775   Parse *pParse,       /* Parsing context */
776   Index *pIdx,         /* The index for which to generate a key */
777   int iDataCur,        /* Cursor number from which to take column data */
778   int regOut,          /* Put the new key into this register if not 0 */
779   int prefixOnly,      /* Compute only a unique prefix of the key */
780   int *piPartIdxLabel, /* OUT: Jump to this label to skip partial index */
781   Index *pPrior,       /* Previously generated index key */
782   int regPrior         /* Register holding previous generated key */
783 ){
784   Vdbe *v = pParse->pVdbe;
785   int j;
786   Table *pTab = pIdx->pTable;
787   int regBase;
788   int nCol;
789 
790   if( piPartIdxLabel ){
791     if( pIdx->pPartIdxWhere ){
792       *piPartIdxLabel = sqlite3VdbeMakeLabel(v);
793       pParse->iPartIdxTab = iDataCur;
794       sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel,
795                          SQLITE_JUMPIFNULL);
796     }else{
797       *piPartIdxLabel = 0;
798     }
799   }
800   nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn;
801   regBase = sqlite3GetTempRange(pParse, nCol);
802   if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0;
803   for(j=0; j<nCol; j++){
804     if( pPrior && pPrior->aiColumn[j]==pIdx->aiColumn[j] ) continue;
805     sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j],
806                                     regBase+j);
807     /* If the column affinity is REAL but the number is an integer, then it
808     ** might be stored in the table as an integer (using a compact
809     ** representation) then converted to REAL by an OP_RealAffinity opcode.
810     ** But we are getting ready to store this value back into an index, where
811     ** it should be converted by to INTEGER again.  So omit the OP_RealAffinity
812     ** opcode if it is present */
813     sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity);
814   }
815   if( regOut ){
816     sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut);
817   }
818   sqlite3ReleaseTempRange(pParse, regBase, nCol);
819   return regBase;
820 }
821