/ Hex Artifact Content
Login

Artifact e2392b6808496fc0a7f54662af3ba677a3e8e44a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 69 6e  the parser.** in
01c0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
01d0: 74 65 20 63 6f 64 65 20 66 6f 72 20 44 45 4c 45  te code for DELE
01e0: 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e  TE FROM statemen
01f0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64  ts..**.** $Id: d
0200: 65 6c 65 74 65 2e 63 2c 76 20 31 2e 31 39 30 20  elete.c,v 1.190 
0210: 32 30 30 38 2f 31 32 2f 31 30 20 32 31 3a 31 39  2008/12/10 21:19
0220: 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :57 drh Exp $.*/
0230: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0240: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4c  eInt.h"../*.** L
0250: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
0260: 6c 65 20 74 68 61 74 20 69 73 20 6e 61 6d 65 64  le that is named
0270: 20 69 6e 20 70 53 72 63 2e 20 20 49 66 20 61 6e   in pSrc.  If an
0280: 79 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 66  y table is not f
0290: 6f 75 6e 64 2c 0a 2a 2a 20 61 64 64 20 61 6e 20  ound,.** add an 
02a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
02b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
02c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
02d0: 2e 20 20 49 66 20 61 6c 6c 20 74 61 62 6c 65 73  .  If all tables
02e0: 0a 2a 2a 20 61 72 65 20 66 6f 75 6e 64 2c 20 72  .** are found, r
02f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0300: 74 6f 20 74 68 65 20 6c 61 73 74 20 74 61 62 6c  to the last tabl
0310: 65 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  e..*/.Table *sql
0320: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
0330: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
0340: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 29 7b   SrcList *pSrc){
0350: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
0360: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
0370: 70 53 72 63 2d 3e 61 3b 0a 20 20 54 61 62 6c 65  pSrc->a;.  Table
0380: 20 2a 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74   *pTab;.  assert
0390: 28 20 70 49 74 65 6d 20 26 26 20 70 53 72 63 2d  ( pItem && pSrc-
03a0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
03b0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
03c0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
03d0: 30 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  0, pItem->zName,
03e0: 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
03f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  e);.  sqlite3Del
0400: 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
0410: 70 54 61 62 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  pTab);.  pItem->
0420: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 69  pTab = pTab;.  i
0430: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 70  f( pTab ){.    p
0440: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  Tab->nRef++;.  }
0450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e  .  if( sqlite3In
0460: 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
0470: 61 72 73 65 2c 20 70 49 74 65 6d 29 20 29 7b 0a  arse, pItem) ){.
0480: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
0490: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
04b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
04c0: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 69 73 20   given table is 
04d0: 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 74  writable.  If it
04e0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61   is not.** writa
04f0: 62 6c 65 2c 20 67 65 6e 65 72 61 74 65 20 61 6e  ble, generate an
0500: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
0510: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
0520: 20 69 74 20 69 73 0a 2a 2a 20 77 72 69 74 61 62   it is.** writab
0530: 6c 65 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a  le return 0;.*/.
0540: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 65 61  int sqlite3IsRea
0550: 64 4f 6e 6c 79 28 50 61 72 73 65 20 2a 70 50 61  dOnly(Parse *pPa
0560: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
0570: 2c 20 69 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20  , int viewOk){. 
0580: 20 69 66 28 20 28 28 70 54 61 62 2d 3e 74 61 62   if( ((pTab->tab
0590: 46 6c 61 67 73 20 26 20 54 46 5f 52 65 61 64 6f  Flags & TF_Reado
05a0: 6e 6c 79 29 21 3d 30 0a 20 20 20 20 20 20 20 20  nly)!=0.        
05b0: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
05c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
05d0: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
05e0: 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65         && pParse
05f0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 29 20 0a 23 69  ->nested==0) .#i
0600: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0610: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
0620: 20 20 20 20 20 7c 7c 20 28 70 54 61 62 2d 3e 70       || (pTab->p
0630: 4d 6f 64 20 26 26 20 70 54 61 62 2d 3e 70 4d 6f  Mod && pTab->pMo
0640: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64  d->pModule->xUpd
0650: 61 74 65 3d 3d 30 29 0a 23 65 6e 64 69 66 0a 20  ate==0).#endif. 
0660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0670: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0680: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
0690: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20  t be modified", 
06a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
06b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
06c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
06d0: 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 21  MIT_VIEW.  if( !
06e0: 76 69 65 77 4f 6b 20 26 26 20 70 54 61 62 2d 3e  viewOk && pTab->
06f0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
0700: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
0710: 50 61 72 73 65 2c 22 63 61 6e 6e 6f 74 20 6d 6f  Parse,"cannot mo
0720: 64 69 66 79 20 25 73 20 62 65 63 61 75 73 65 20  dify %s because 
0730: 69 74 20 69 73 20 61 20 76 69 65 77 22 2c 70 54  it is a view",pT
0740: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
0750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
0760: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b  ndif.  return 0;
0770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
0780: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
0790: 6c 20 6f 70 65 6e 20 61 20 74 61 62 6c 65 20 66  l open a table f
07a0: 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2f 0a 76  or reading..*/.v
07b0: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  oid sqlite3OpenT
07c0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
07d0: 2c 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ,       /* Gener
07e0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
07f0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
0800: 20 69 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20   iCur,       /* 
0810: 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
0820: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
0830: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
0840: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
0850: 61 73 65 20 69 6e 64 65 78 20 69 6e 20 73 71 6c  ase index in sql
0860: 69 74 65 33 2e 61 44 62 5b 5d 20 2a 2f 0a 20 20  ite3.aDb[] */.  
0870: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
0880: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
0890: 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  be opened */.  i
08a0: 6e 74 20 6f 70 63 6f 64 65 20 20 20 20 20 20 2f  nt opcode      /
08b0: 2a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  * OP_OpenRead or
08c0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 2a 2f   OP_OpenWrite */
08d0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
08e0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
08f0: 54 61 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Tab) ) return;. 
0900: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
0910: 64 62 65 28 70 29 3b 0a 20 20 61 73 73 65 72 74  dbe(p);.  assert
0920: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65  ( opcode==OP_Ope
0930: 6e 57 72 69 74 65 20 7c 7c 20 6f 70 63 6f 64 65  nWrite || opcode
0940: 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 29 3b  ==OP_OpenRead );
0950: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
0960: 6f 63 6b 28 70 2c 20 69 44 62 2c 20 70 54 61 62  ock(p, iDb, pTab
0970: 2d 3e 74 6e 75 6d 2c 20 28 6f 70 63 6f 64 65 3d  ->tnum, (opcode=
0980: 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3f 31  =OP_OpenWrite)?1
0990: 3a 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  :0, pTab->zName)
09a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
09b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
09c0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 54  umColumns, 0, pT
09d0: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->nCol);.  sql
09e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
09f0: 2c 20 6f 70 63 6f 64 65 2c 20 69 43 75 72 2c 20  , opcode, iCur, 
0a00: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
0a10: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
0a20: 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e  (v, "%s", pTab->
0a30: 7a 4e 61 6d 65 29 29 3b 0a 7d 0a 0a 0a 23 69 66  zName));.}...#if
0a40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0a50: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20 21  _OMIT_VIEW) && !
0a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0a70: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 2f 2a 0a  MIT_TRIGGER)./*.
0a80: 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 20 76 69  ** Evaluate a vi
0a90: 65 77 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  ew and store its
0aa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 70   result in an ep
0ab0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
0ac0: 54 68 65 0a 2a 2a 20 70 57 68 65 72 65 20 61 72  The.** pWhere ar
0ad0: 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 6f 70 74  gument is an opt
0ae0: 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ional WHERE clau
0af0: 73 65 20 74 68 61 74 20 72 65 73 74 72 69 63 74  se that restrict
0b00: 73 20 74 68 65 0a 2a 2a 20 73 65 74 20 6f 66 20  s the.** set of 
0b10: 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69 65 77  rows in the view
0b20: 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65 20   that are to be 
0b30: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 70 68  added to the eph
0b40: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  emeral table..*/
0b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 74  .void sqlite3Mat
0b60: 65 72 69 61 6c 69 7a 65 56 69 65 77 28 0a 20 20  erializeView(.  
0b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0b80: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
0b90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
0ba0: 6c 65 20 2a 70 56 69 65 77 2c 20 20 20 20 20 20  le *pView,      
0bb0: 20 20 2f 2a 20 56 69 65 77 20 64 65 66 69 6e 69    /* View defini
0bc0: 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
0bd0: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f  pWhere,        /
0be0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 57 48 45 52 45  * Optional WHERE
0bf0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 64   clause to be ad
0c00: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ded */.  int iCu
0c10: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
0c20: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
0c30: 6f 72 20 65 70 68 65 6d 65 72 69 61 6c 20 74 61  or ephemerial ta
0c40: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ble */.){.  Sele
0c50: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 53  ctDest dest;.  S
0c60: 65 6c 65 63 74 20 2a 70 44 75 70 3b 0a 20 20 73  elect *pDup;.  s
0c70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0c80: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70 44 75 70  rse->db;..  pDup
0c90: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
0ca0: 44 75 70 28 64 62 2c 20 70 56 69 65 77 2d 3e 70  Dup(db, pView->p
0cb0: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70  Select);.  if( p
0cc0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 53 72 63  Where ){.    Src
0cd0: 4c 69 73 74 20 2a 70 46 72 6f 6d 3b 0a 20 20 20  List *pFrom;.   
0ce0: 20 54 6f 6b 65 6e 20 76 69 65 77 4e 61 6d 65 3b   Token viewName;
0cf0: 0a 20 20 20 20 0a 20 20 20 20 70 57 68 65 72 65  .    .    pWhere
0d00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
0d10: 70 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20  p(db, pWhere);. 
0d20: 20 20 20 76 69 65 77 4e 61 6d 65 2e 7a 20 3d 20     viewName.z = 
0d30: 28 75 38 2a 29 70 56 69 65 77 2d 3e 7a 4e 61 6d  (u8*)pView->zNam
0d40: 65 3b 0a 20 20 20 20 76 69 65 77 4e 61 6d 65 2e  e;.    viewName.
0d50: 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  n = (unsigned in
0d60: 74 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  t)sqlite3Strlen3
0d70: 30 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 76  0((const char*)v
0d80: 69 65 77 4e 61 6d 65 2e 7a 29 3b 0a 20 20 20 20  iewName.z);.    
0d90: 70 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53  pFrom = sqlite3S
0da0: 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
0db0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Term(pParse, 0, 
0dc0: 30 2c 20 30 2c 20 26 76 69 65 77 4e 61 6d 65 2c  0, 0, &viewName,
0dd0: 20 70 44 75 70 2c 20 30 2c 30 29 3b 0a 20 20 20   pDup, 0,0);.   
0de0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 53   pDup = sqlite3S
0df0: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
0e00: 20 30 2c 20 70 46 72 6f 6d 2c 20 70 57 68 65 72   0, pFrom, pWher
0e10: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 0, 0, 0, 0, 0
0e20: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
0e30: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
0e40: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
0e50: 65 6d 54 61 62 2c 20 69 43 75 72 29 3b 0a 20 20  emTab, iCur);.  
0e60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
0e70: 61 72 73 65 2c 20 70 44 75 70 2c 20 26 64 65 73  arse, pDup, &des
0e80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
0e90: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
0ea0: 75 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  up);.}.#endif /*
0eb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0ec0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20 21  _OMIT_VIEW) && !
0ed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0ee0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
0ef0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f00: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
0f10: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20  E_DELETE_LIMIT) 
0f20: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0f30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
0f40: 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
0f50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
0f60: 72 65 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ree to implement
0f70: 20 74 68 65 20 57 48 45 52 45 2c 20 4f 52 44 45   the WHERE, ORDE
0f80: 52 20 42 59 2c 0a 2a 2a 20 61 6e 64 20 4c 49 4d  R BY,.** and LIM
0f90: 49 54 2f 4f 46 46 53 45 54 20 70 6f 72 74 69 6f  IT/OFFSET portio
0fa0: 6e 20 6f 66 20 44 45 4c 45 54 45 20 61 6e 64 20  n of DELETE and 
0fb0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
0fc0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  s..**.**     DEL
0fd0: 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f 77  ETE FROM table_w
0fe0: 78 79 7a 20 57 48 45 52 45 20 61 3c 35 20 4f 52  xyz WHERE a<5 OR
0ff0: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
1000: 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ;.**            
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1030: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1060: 69 6d 69 74 57 68 65 72 65 20 28 70 49 6e 43 6c  imitWhere (pInCl
1070: 61 75 73 65 29 0a 2a 2f 0a 45 78 70 72 20 2a 73  ause).*/.Expr *s
1080: 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65  qlite3LimitWhere
1090: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10b0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
10c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
10d0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
10f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
1100: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
1110: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
1120: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20  Where,          
1130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1140: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
1150: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70  be null */.  Exp
1160: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1180: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1190: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
11a0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
11b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11c0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
11d0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75  ause.  May be nu
11e0: 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ll */.  Expr *pO
11f0: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
1200: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 46 46 53       /* The OFFS
1210: 45 54 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  ET clause.  May 
1220: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 63 68 61  be null */.  cha
1230: 72 20 2a 7a 53 74 6d 74 54 79 70 65 20 20 20 20  r *zStmtType    
1240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74            /* Eit
1250: 68 65 72 20 44 45 4c 45 54 45 20 6f 72 20 55 50  her DELETE or UP
1260: 44 41 54 45 2e 20 20 46 6f 72 20 65 72 72 6f 72  DATE.  For error
1270: 20 6d 65 73 73 61 67 65 73 2e 20 2a 2f 0a 29 7b   messages. */.){
1280: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 52  .  Expr *pWhereR
1290: 6f 77 69 64 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  owid = NULL;    
12a0: 2f 2a 20 57 48 45 52 45 20 72 6f 77 69 64 20 2e  /* WHERE rowid .
12b0: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 49 6e  . */.  Expr *pIn
12c0: 43 6c 61 75 73 65 20 3d 20 4e 55 4c 4c 3b 20 20  Clause = NULL;  
12d0: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 72 6f 77      /* WHERE row
12e0: 69 64 20 49 4e 20 28 20 73 65 6c 65 63 74 20 29  id IN ( select )
12f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 65 6c   */.  Expr *pSel
1300: 65 63 74 52 6f 77 69 64 20 3d 20 4e 55 4c 4c 3b  ectRowid = NULL;
1310: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77     /* SELECT row
1320: 69 64 20 2e 2e 2e 20 2a 2f 0a 20 20 45 78 70 72  id ... */.  Expr
1330: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 4e  List *pEList = N
1340: 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 45 78 70 72  ULL;     /* Expr
1350: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
1360: 61 6e 69 6e 67 20 6f 6e 6c 79 20 70 53 65 6c 65  aning only pSele
1370: 63 74 52 6f 77 69 64 20 2a 2f 0a 20 20 53 72 63  ctRowid */.  Src
1380: 4c 69 73 74 20 2a 70 53 65 6c 65 63 74 53 72 63  List *pSelectSrc
1390: 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 53 45 4c   = NULL;  /* SEL
13a0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78  ECT rowid FROM x
13b0: 20 2e 2e 2e 20 28 64 75 70 20 6f 66 20 70 53 72   ... (dup of pSr
13c0: 63 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  c) */.  Select *
13d0: 70 53 65 6c 65 63 74 20 3d 20 4e 55 4c 4c 3b 20  pSelect = NULL; 
13e0: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
13f0: 20 53 45 4c 45 43 54 20 74 72 65 65 20 2a 2f 0a   SELECT tree */.
1400: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1410: 20 74 68 65 72 65 20 69 73 6e 27 74 20 61 6e 20   there isn't an 
1420: 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f 75 74  ORDER BY without
1430: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1440: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1450: 65 72 42 79 20 26 26 20 28 70 4c 69 6d 69 74 20  erBy && (pLimit 
1460: 3d 3d 20 30 29 20 29 20 7b 0a 20 20 20 20 73 71  == 0) ) {.    sq
1470: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1480: 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59 20  arse, "ORDER BY 
1490: 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 20 6f 6e  without LIMIT on
14a0: 20 25 73 22 2c 20 7a 53 74 6d 74 54 79 70 65 29   %s", zStmtType)
14b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 61  ;.    pParse->pa
14c0: 72 73 65 45 72 72 6f 72 20 3d 20 31 3b 0a 20 20  rseError = 1;.  
14d0: 20 20 67 6f 74 6f 20 6c 69 6d 69 74 5f 77 68 65    goto limit_whe
14e0: 72 65 5f 63 6c 65 61 6e 75 70 5f 32 3b 0a 20 20  re_cleanup_2;.  
14f0: 7d 0a 0a 20 20 2f 2a 20 57 65 20 6f 6e 6c 79 20  }..  /* We only 
1500: 6e 65 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  need to generate
1510: 20 61 20 73 65 6c 65 63 74 20 65 78 70 72 65 73   a select expres
1520: 73 69 6f 6e 20 69 66 20 74 68 65 72 65 0a 20 20  sion if there.  
1530: 2a 2a 20 69 73 20 61 20 6c 69 6d 69 74 2f 6f 66  ** is a limit/of
1540: 66 73 65 74 20 74 65 72 6d 20 74 6f 20 65 6e 66  fset term to enf
1550: 6f 72 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  orce..  */.  if(
1560: 20 70 4c 69 6d 69 74 20 3d 3d 20 30 20 29 20 7b   pLimit == 0 ) {
1570: 0a 20 20 20 20 2f 2a 20 69 66 20 70 4c 69 6d 69  .    /* if pLimi
1580: 74 20 69 73 20 6e 75 6c 6c 2c 20 70 4f 66 66 73  t is null, pOffs
1590: 65 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  et will always b
15a0: 65 20 6e 75 6c 6c 20 61 73 20 77 65 6c 6c 2e 20  e null as well. 
15b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15c0: 4f 66 66 73 65 74 20 3d 3d 20 30 20 29 3b 0a 20  Offset == 0 );. 
15d0: 20 20 20 72 65 74 75 72 6e 20 70 57 68 65 72 65     return pWhere
15e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15f0: 72 61 74 65 20 61 20 73 65 6c 65 63 74 20 65 78  rate a select ex
1600: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 74 6f  pression tree to
1610: 20 65 6e 66 6f 72 63 65 20 74 68 65 20 6c 69 6d   enforce the lim
1620: 69 74 2f 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  it/offset .  ** 
1630: 74 65 72 6d 20 66 6f 72 20 74 68 65 20 44 45 4c  term for the DEL
1640: 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74  ETE or UPDATE st
1650: 61 74 65 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78  atement.  For ex
1660: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 20 20 20 44 45  ample:.  **   DE
1670: 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f  LETE FROM table_
1680: 61 20 57 48 45 52 45 20 63 6f 6c 31 3d 31 20 4f  a WHERE col1=1 O
1690: 52 44 45 52 20 42 59 20 63 6f 6c 32 20 4c 49 4d  RDER BY col2 LIM
16a0: 49 54 20 31 20 4f 46 46 53 45 54 20 31 0a 20 20  IT 1 OFFSET 1.  
16b0: 2a 2a 20 62 65 63 6f 6d 65 73 3a 0a 20 20 2a 2a  ** becomes:.  **
16c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
16d0: 61 62 6c 65 5f 61 20 57 48 45 52 45 20 72 6f 77  able_a WHERE row
16e0: 69 64 20 49 4e 20 28 20 0a 20 20 2a 2a 20 20 20  id IN ( .  **   
16f0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
1700: 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45 52  ROM table_a WHER
1710: 45 20 63 6f 6c 31 3d 31 20 4f 52 44 45 52 20 42  E col1=1 ORDER B
1720: 59 20 63 6f 6c 32 20 4c 49 4d 49 54 20 31 20 4f  Y col2 LIMIT 1 O
1730: 46 46 53 45 54 20 31 0a 20 20 2a 2a 20 20 20 29  FFSET 1.  **   )
1740: 3b 0a 20 20 2a 2f 0a 0a 20 20 70 53 65 6c 65 63  ;.  */..  pSelec
1750: 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  tRowid = sqlite3
1760: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
1770: 20 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 2c 20 30   TK_ROW, 0, 0, 0
1780: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
1790: 52 6f 77 69 64 20 3d 3d 20 30 20 29 20 67 6f 74  Rowid == 0 ) got
17a0: 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c  o limit_where_cl
17b0: 65 61 6e 75 70 5f 32 3b 0a 20 20 70 45 4c 69 73  eanup_2;.  pELis
17c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
17d0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
17e0: 2c 20 30 2c 20 70 53 65 6c 65 63 74 52 6f 77 69  , 0, pSelectRowi
17f0: 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 4c  d, 0);.  if( pEL
1800: 69 73 74 20 3d 3d 20 30 20 29 20 67 6f 74 6f 20  ist == 0 ) goto 
1810: 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65 61  limit_where_clea
1820: 6e 75 70 5f 32 3b 0a 0a 20 20 2f 2a 20 64 75 70  nup_2;..  /* dup
1830: 6c 69 63 61 74 65 20 74 68 65 20 46 52 4f 4d 20  licate the FROM 
1840: 63 6c 61 75 73 65 20 61 73 20 69 74 20 69 73 20  clause as it is 
1850: 6e 65 65 64 65 64 20 62 79 20 62 6f 74 68 20 74  needed by both t
1860: 68 65 20 44 45 4c 45 54 45 2f 55 50 44 41 54 45  he DELETE/UPDATE
1870: 20 74 72 65 65 0a 20 20 2a 2a 20 61 6e 64 20 74   tree.  ** and t
1880: 68 65 20 53 45 4c 45 43 54 20 73 75 62 74 72 65  he SELECT subtre
1890: 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65 63 74 53  e. */.  pSelectS
18a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
18b0: 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
18c0: 62 2c 20 70 53 72 63 29 3b 0a 20 20 69 66 28 20  b, pSrc);.  if( 
18d0: 70 53 65 6c 65 63 74 53 72 63 20 3d 3d 20 30 20  pSelectSrc == 0 
18e0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
18f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
1900: 61 72 73 65 2d 3e 64 62 2c 20 70 45 4c 69 73 74  arse->db, pEList
1910: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 69 6d 69  );.    goto limi
1920: 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e 75 70 5f  t_where_cleanup_
1930: 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 65 6e  2;.  }..  /* gen
1940: 65 72 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  erate the SELECT
1950: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1960: 2e 20 2a 2f 0a 20 20 70 53 65 6c 65 63 74 20 3d  . */.  pSelect =
1970: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
1980: 77 28 70 50 61 72 73 65 2c 70 45 4c 69 73 74 2c  w(pParse,pEList,
1990: 70 53 65 6c 65 63 74 53 72 63 2c 70 57 68 65 72  pSelectSrc,pWher
19a0: 65 2c 30 2c 30 2c 70 4f 72 64 65 72 42 79 2c 30  e,0,0,pOrderBy,0
19b0: 2c 70 4c 69 6d 69 74 2c 70 4f 66 66 73 65 74 29  ,pLimit,pOffset)
19c0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  ;.  if( pSelect 
19d0: 3d 3d 20 30 20 29 20 72 65 74 75 72 6e 20 30 3b  == 0 ) return 0;
19e0: 0a 0a 20 20 2f 2a 20 6e 6f 77 20 67 65 6e 65 72  ..  /* now gener
19f0: 61 74 65 20 74 68 65 20 6e 65 77 20 57 48 45 52  ate the new WHER
1a00: 45 20 72 6f 77 69 64 20 49 4e 20 63 6c 61 75 73  E rowid IN claus
1a10: 65 20 66 6f 72 20 74 68 65 20 44 45 4c 45 54 45  e for the DELETE
1a20: 2f 55 44 50 41 54 45 20 2a 2f 0a 20 20 70 57 68  /UDPATE */.  pWh
1a30: 65 72 65 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  ereRowid = sqlit
1a40: 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  e3Expr(pParse->d
1a50: 62 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 2c  b, TK_ROW, 0, 0,
1a60: 20 30 29 3b 0a 20 20 69 66 28 20 70 57 68 65 72   0);.  if( pWher
1a70: 65 52 6f 77 69 64 20 3d 3d 20 30 20 29 20 67 6f  eRowid == 0 ) go
1a80: 74 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63  to limit_where_c
1a90: 6c 65 61 6e 75 70 5f 31 3b 0a 20 20 70 49 6e 43  leanup_1;.  pInC
1aa0: 6c 61 75 73 65 20 3d 20 73 71 6c 69 74 65 33 50  lause = sqlite3P
1ab0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1ac0: 49 4e 2c 20 70 57 68 65 72 65 52 6f 77 69 64 2c  IN, pWhereRowid,
1ad0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49   0, 0);.  if( pI
1ae0: 6e 43 6c 61 75 73 65 20 3d 3d 20 30 20 29 20 67  nClause == 0 ) g
1af0: 6f 74 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f  oto limit_where_
1b00: 63 6c 65 61 6e 75 70 5f 31 3b 0a 0a 20 20 70 49  cleanup_1;..  pI
1b10: 6e 43 6c 61 75 73 65 2d 3e 70 53 65 6c 65 63 74  nClause->pSelect
1b20: 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 73 71   = pSelect;.  sq
1b30: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
1b40: 68 74 28 70 50 61 72 73 65 2c 20 70 49 6e 43 6c  ht(pParse, pInCl
1b50: 61 75 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ause);.  return 
1b60: 70 49 6e 43 6c 61 75 73 65 3b 0a 0a 20 20 2f 2a  pInClause;..  /*
1b70: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20   something went 
1b80: 77 72 6f 6e 67 2e 20 63 6c 65 61 6e 20 75 70 20  wrong. clean up 
1b90: 61 6e 79 74 68 69 6e 67 20 61 6c 6c 6f 63 61 74  anything allocat
1ba0: 65 64 2e 20 2a 2f 0a 6c 69 6d 69 74 5f 77 68 65  ed. */.limit_whe
1bb0: 72 65 5f 63 6c 65 61 6e 75 70 5f 31 3a 0a 20 20  re_cleanup_1:.  
1bc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1bd0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1be0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
1bf0: 72 6e 20 30 3b 0a 0a 6c 69 6d 69 74 5f 77 68 65  rn 0;..limit_whe
1c00: 72 65 5f 63 6c 65 61 6e 75 70 5f 32 3a 0a 20 20  re_cleanup_2:.  
1c10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  e(pParse->db, pW
1c30: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
1c40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
1c50: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
1c60: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rBy);.  sqlite3E
1c70: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
1c80: 2d 3e 64 62 2c 20 70 4c 69 6d 69 74 29 3b 0a 20  ->db, pLimit);. 
1c90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1ca0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1cb0: 4f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72  Offset);.  retur
1cc0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1cd0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ce0: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
1cf0: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21  LETE_LIMIT) && !
1d00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1d10: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f  MIT_SUBQUERY) */
1d20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d30: 20 63 6f 64 65 20 66 6f 72 20 61 20 44 45 4c 45   code for a DELE
1d40: 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e  TE FROM statemen
1d50: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  t..**.**     DEL
1d60: 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f 77  ETE FROM table_w
1d70: 78 79 7a 20 57 48 45 52 45 20 61 3c 35 20 41 4e  xyz WHERE a<5 AN
1d80: 44 20 62 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a  D b NOT NULL;.**
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1db0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1dc0: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
1dd0: 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
1de0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  t              p
1df0: 57 68 65 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  Where.*/.void sq
1e00: 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28  lite3DeleteFrom(
1e10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1e30: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1e40: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1e50: 61 62 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  abList,     /* T
1e60: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  he table from wh
1e70: 69 63 68 20 77 65 20 73 68 6f 75 6c 64 20 64 65  ich we should de
1e80: 6c 65 74 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20  lete things */. 
1e90: 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20 20   Expr *pWhere   
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1eb0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1ec0: 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a  y be null */.){.
1ed0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ef0: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1f00: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 54 61 62   engine */.  Tab
1f10: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1f20: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1f30: 20 66 72 6f 6d 20 77 68 69 63 68 20 72 65 63 6f   from which reco
1f40: 72 64 73 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  rds will be dele
1f50: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
1f60: 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
1f70: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
1f80: 61 73 65 20 68 6f 6c 64 69 6e 67 20 70 54 61 62  ase holding pTab
1f90: 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 2c 20 61   */.  int end, a
1fa0: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ddr = 0;     /* 
1fb0: 41 20 63 6f 75 70 6c 65 20 61 64 64 72 65 73 73  A couple address
1fc0: 65 73 20 6f 66 20 67 65 6e 65 72 61 74 65 64 20  es of generated 
1fd0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2000: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
2010: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
2020: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
2030: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2040: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
2050: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
2060: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2070: 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  er indices of th
2080: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
2090: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
20a0: 20 20 20 20 2f 2a 20 56 44 42 45 20 43 75 72 73      /* VDBE Curs
20b0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54  or number for pT
20c0: 61 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ab */.  sqlite3 
20d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
20e0: 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * Main database 
20f0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 41  structure */.  A
2100: 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74  uthContext sCont
2110: 65 78 74 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69  ext;  /* Authori
2120: 7a 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  zation context *
2130: 2f 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 20 3d  /.  int oldIdx =
2140: 20 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20 43 75   -1;       /* Cu
2150: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 4f 4c 44  rsor for the OLD
2160: 20 74 61 62 6c 65 20 6f 66 20 41 46 54 45 52 20   table of AFTER 
2170: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 4e 61  triggers */.  Na
2180: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2190: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
21a0: 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  text to resolve 
21b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a  expressions in *
21c0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
21d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
21e0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
21f0: 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74 20 3d 20  .  int memCnt = 
2200: 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  -1;       /* Mem
2210: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 66 6f  ory cell used fo
2220: 72 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 69 6e  r change countin
2230: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 61 75 74  g */.  int rcaut
2240: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h;            /*
2250: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
2260: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
2270: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 23 69   callback */..#i
2280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2290: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
22a0: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
22b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
22c0: 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74   if attempting t
22d0: 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 61 20  o delete from a 
22e0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 74 72  view */.  int tr
22f0: 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20 30  iggers_exist = 0
2300: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
2310: 66 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 65  f any triggers e
2320: 78 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  xist */.#endif. 
2330: 20 69 6e 74 20 69 42 65 67 69 6e 41 66 74 65 72   int iBeginAfter
2340: 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20 2f 2a  Trigger = 0;  /*
2350: 20 41 64 64 72 65 73 73 20 6f 66 20 61 66 74 65   Address of afte
2360: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2370: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 41  m */.  int iEndA
2380: 66 74 65 72 54 72 69 67 67 65 72 20 3d 20 30 3b  fterTrigger = 0;
2390: 20 20 20 20 2f 2a 20 45 78 69 74 20 6f 66 20 61      /* Exit of a
23a0: 66 74 65 72 20 74 72 69 67 67 65 72 20 70 72 6f  fter trigger pro
23b0: 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 42  gram */.  int iB
23c0: 65 67 69 6e 42 65 66 6f 72 65 54 72 69 67 67 65  eginBeforeTrigge
23d0: 72 20 3d 20 30 3b 20 2f 2a 20 41 64 64 72 65 73  r = 0; /* Addres
23e0: 73 20 6f 66 20 62 65 66 6f 72 65 20 74 72 69 67  s of before trig
23f0: 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  ger program */. 
2400: 20 69 6e 74 20 69 45 6e 64 42 65 66 6f 72 65 54   int iEndBeforeT
2410: 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 2f 2a  rigger = 0;   /*
2420: 20 45 78 69 74 20 6f 66 20 62 65 66 6f 72 65 20   Exit of before 
2430: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
2440: 2a 2f 0a 20 20 75 33 32 20 6f 6c 64 5f 63 6f 6c  */.  u32 old_col
2450: 5f 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20  _mask = 0;      
2460: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 4c 44    /* Mask of OLD
2470: 2e 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 75 73  .* columns in us
2480: 65 20 2a 2f 0a 0a 20 20 73 43 6f 6e 74 65 78 74  e */..  sContext
2490: 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 64  .pParse = 0;.  d
24a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
24c0: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
24d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
24e0: 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  to delete_from_c
24f0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73  leanup;.  }.  as
2500: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e  sert( pTabList->
2510: 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  nSrc==1 );..  /*
2520: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
2530: 65 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20  e which we want 
2540: 74 6f 20 64 65 6c 65 74 65 2e 20 20 54 68 69 73  to delete.  This
2550: 20 74 61 62 6c 65 20 68 61 73 20 74 6f 20 62 65   table has to be
2560: 0a 20 20 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20  .  ** put in an 
2570: 53 72 63 4c 69 73 74 20 73 74 72 75 63 74 75 72  SrcList structur
2580: 65 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f  e because some o
2590: 66 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  f the subroutine
25a0: 73 20 77 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  s we.  ** will b
25b0: 65 20 63 61 6c 6c 69 6e 67 20 61 72 65 20 64 65  e calling are de
25c0: 73 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77  signed to work w
25d0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 74 61 62  ith multiple tab
25e0: 6c 65 73 20 61 6e 64 20 65 78 70 65 63 74 0a 20  les and expect. 
25f0: 20 2a 2a 20 61 6e 20 53 72 63 4c 69 73 74 2a 20   ** an SrcList* 
2600: 70 61 72 61 6d 65 74 65 72 20 69 6e 73 74 65 61  parameter instea
2610: 64 20 6f 66 20 6a 75 73 74 20 61 20 54 61 62 6c  d of just a Tabl
2620: 65 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  e* parameter..  
2630: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
2640: 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
2650: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2660: 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  t);.  if( pTab==
2670: 30 20 29 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  0 )  goto delete
2680: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a  _from_cleanup;..
2690: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
26a0: 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 74  if we have any t
26b0: 72 69 67 67 65 72 73 20 61 6e 64 20 69 66 20 74  riggers and if t
26c0: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 0a 20  he table being. 
26d0: 20 2a 2a 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   ** deleted from
26e0: 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a   is a view.  */.
26f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2700: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 74 72  MIT_TRIGGER.  tr
2710: 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20 73  iggers_exist = s
2720: 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78  qlite3TriggersEx
2730: 69 73 74 28 70 54 61 62 2c 20 54 4b 5f 44 45 4c  ist(pTab, TK_DEL
2740: 45 54 45 2c 20 30 29 3b 0a 20 20 69 73 56 69 65  ETE, 0);.  isVie
2750: 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  w = pTab->pSelec
2760: 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65  t!=0;.#else.# de
2770: 66 69 6e 65 20 74 72 69 67 67 65 72 73 5f 65 78  fine triggers_ex
2780: 69 73 74 20 30 0a 23 20 64 65 66 69 6e 65 20 69  ist 0.# define i
2790: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 23  sView 0.#endif.#
27a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
27b0: 54 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69  T_VIEW.# undef i
27c0: 73 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69  sView.# define i
27d0: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a  sView 0.#endif..
27e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
27f0: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
2800: 70 54 61 62 2c 20 74 72 69 67 67 65 72 73 5f 65  pTab, triggers_e
2810: 78 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  xist) ){.    got
2820: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
2830: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62  eanup;.  }.  iDb
2840: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2850: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2860: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
2870: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
2880: 62 20 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  b );.  zDb = db-
2890: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
28a0: 0a 20 20 72 63 61 75 74 68 20 3d 20 73 71 6c 69  .  rcauth = sqli
28b0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
28c0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
28d0: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
28e0: 20 30 2c 20 7a 44 62 29 3b 0a 20 20 61 73 73 65   0, zDb);.  asse
28f0: 72 74 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49  rt( rcauth==SQLI
2900: 54 45 5f 4f 4b 20 7c 7c 20 72 63 61 75 74 68 3d  TE_OK || rcauth=
2910: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 7c 7c 20  =SQLITE_DENY || 
2920: 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 49  rcauth==SQLITE_I
2930: 47 4e 4f 52 45 20 29 3b 0a 20 20 69 66 28 20 72  GNORE );.  if( r
2940: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45  cauth==SQLITE_DE
2950: 4e 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  NY ){.    goto d
2960: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
2970: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
2980: 28 21 69 73 56 69 65 77 20 7c 7c 20 74 72 69 67  (!isView || trig
2990: 67 65 72 73 5f 65 78 69 73 74 29 3b 0a 0a 20 20  gers_exist);..  
29a0: 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 72 65  /* If pTab is re
29b0: 61 6c 6c 79 20 61 20 76 69 65 77 2c 20 6d 61 6b  ally a view, mak
29c0: 65 20 73 75 72 65 20 69 74 20 68 61 73 20 62 65  e sure it has be
29d0: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  en initialized..
29e0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
29f0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
2a00: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
2a10: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  b) ){.    goto d
2a20: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
2a30: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  up;.  }..  /* Al
2a40: 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 20  locate a cursor 
2a50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2a60: 65 20 6f 6c 64 2e 2a 20 64 61 74 61 20 66 6f 72  e old.* data for
2a70: 20 61 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f   a trigger..  */
2a80: 0a 20 20 69 66 28 20 74 72 69 67 67 65 72 73 5f  .  if( triggers_
2a90: 65 78 69 73 74 20 29 7b 20 0a 20 20 20 20 6f 6c  exist ){ .    ol
2aa0: 64 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  dIdx = pParse->n
2ab0: 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Tab++;.  }..  /*
2ac0: 20 41 73 73 69 67 6e 20 20 63 75 72 73 6f 72 20   Assign  cursor 
2ad0: 6e 75 6d 62 65 72 20 74 6f 20 74 68 65 20 74 61  number to the ta
2ae0: 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  ble and all its 
2af0: 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2f 0a 20 20  indices..  */.  
2b00: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
2b10: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
2b20: 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Cur = pTabList->
2b30: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70  a[0].iCursor = p
2b40: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2b50: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2b60: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2b70: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2b80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
2b90: 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  b++;.  }..  /* S
2ba0: 74 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f  tart the view co
2bb0: 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66 28  ntext.  */.  if(
2bc0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73   isView ){.    s
2bd0: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
2be0: 74 50 75 73 68 28 70 50 61 72 73 65 2c 20 26 73  tPush(pParse, &s
2bf0: 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a  Context, pTab->z
2c00: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Name);.  }..  /*
2c10: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
2c20: 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
2c30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2c40: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2c50: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   v==0 ){.    got
2c60: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
2c70: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
2c80: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
2c90: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
2ca0: 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76 29 3b  CountChanges(v);
2cb0: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
2cc0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
2cd0: 61 72 73 65 2c 20 74 72 69 67 67 65 72 73 5f 65  arse, triggers_e
2ce0: 78 69 73 74 2c 20 69 44 62 29 3b 0a 0a 20 20 69  xist, iDb);..  i
2cf0: 66 28 20 74 72 69 67 67 65 72 73 5f 65 78 69 73  f( triggers_exis
2d00: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 72 63  t ){.    int orc
2d10: 6f 6e 66 20 3d 20 28 28 70 50 61 72 73 65 2d 3e  onf = ((pParse->
2d20: 74 72 69 67 53 74 61 63 6b 29 3f 70 50 61 72 73  trigStack)?pPars
2d30: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72  e->trigStack->or
2d40: 63 6f 6e 66 3a 4f 45 5f 44 65 66 61 75 6c 74 29  conf:OE_Default)
2d50: 3b 0a 20 20 20 20 69 6e 74 20 69 47 6f 74 6f 20  ;.    int iGoto 
2d60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2d70: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
2d80: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
2d90: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2da0: 28 76 29 3b 0a 0a 20 20 20 20 69 42 65 67 69 6e  (v);..    iBegin
2db0: 42 65 66 6f 72 65 54 72 69 67 67 65 72 20 3d 20  BeforeTrigger = 
2dc0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2dd0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 28  ntAddr(v);.    (
2de0: 76 6f 69 64 29 73 71 6c 69 74 65 33 43 6f 64 65  void)sqlite3Code
2df0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
2e00: 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c  e, TK_DELETE, 0,
2e10: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c   TRIGGER_BEFORE,
2e20: 20 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 2d   pTab,.        -
2e30: 31 2c 20 6f 6c 64 49 64 78 2c 20 6f 72 63 6f 6e  1, oldIdx, orcon
2e40: 66 2c 20 61 64 64 72 2c 20 26 6f 6c 64 5f 63 6f  f, addr, &old_co
2e50: 6c 5f 6d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  l_mask, 0);.    
2e60: 69 45 6e 64 42 65 66 6f 72 65 54 72 69 67 67 65  iEndBeforeTrigge
2e70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2e80: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
2e90: 29 3b 0a 0a 20 20 20 20 69 42 65 67 69 6e 41 66  );..    iBeginAf
2ea0: 74 65 72 54 72 69 67 67 65 72 20 3d 20 73 71 6c  terTrigger = sql
2eb0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2ec0: 64 64 72 28 76 29 3b 0a 20 20 20 20 28 76 6f 69  ddr(v);.    (voi
2ed0: 64 29 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77  d)sqlite3CodeRow
2ee0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
2ef0: 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54 52  TK_DELETE, 0, TR
2f00: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
2f10: 62 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 6f  b, -1,.        o
2f20: 6c 64 49 64 78 2c 20 6f 72 63 6f 6e 66 2c 20 61  ldIdx, orconf, a
2f30: 64 64 72 2c 20 26 6f 6c 64 5f 63 6f 6c 5f 6d 61  ddr, &old_col_ma
2f40: 73 6b 2c 20 30 29 3b 0a 20 20 20 20 69 45 6e 64  sk, 0);.    iEnd
2f50: 41 66 74 65 72 54 72 69 67 67 65 72 20 3d 20 73  AfterTrigger = s
2f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
2f70: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
2f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f90: 6d 70 48 65 72 65 28 76 2c 20 69 47 6f 74 6f 29  mpHere(v, iGoto)
2fa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
2fb0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
2fc0: 64 65 6c 65 74 65 20 66 72 6f 6d 20 61 20 76 69  delete from a vi
2fd0: 65 77 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74  ew, realize that
2fe0: 20 76 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20   view into.  ** 
2ff0: 61 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  a ephemeral tabl
3000: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  e..  */.#if !def
3010: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3020: 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e  _VIEW) && !defin
3030: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
3040: 52 49 47 47 45 52 29 0a 20 20 69 66 28 20 69 73  RIGGER).  if( is
3050: 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  View ){.    sqli
3060: 74 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69  te3MaterializeVi
3070: 65 77 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ew(pParse, pTab,
3080: 20 70 57 68 65 72 65 2c 20 69 43 75 72 29 3b 0a   pWhere, iCur);.
3090: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
30a0: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
30b0: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  umn names in the
30c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
30d0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
30e0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
30f0: 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
3100: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43   = pParse;.  sNC
3110: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
3120: 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
3130: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
3140: 6d 65 73 28 26 73 4e 43 2c 20 70 57 68 65 72 65  mes(&sNC, pWhere
3150: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65  ) ){.    goto de
3160: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
3170: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  p;.  }..  /* Ini
3180: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
3190: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
31a0: 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 65 74 65  r of rows delete
31b0: 64 2c 20 69 66 0a 20 20 2a 2a 20 77 65 20 61 72  d, if.  ** we ar
31c0: 65 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77 73 2e  e counting rows.
31d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
31e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
31f0: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
3200: 6d 65 6d 43 6e 74 20 3d 20 2b 2b 70 50 61 72 73  memCnt = ++pPars
3210: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
3220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3230: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
3240: 20 6d 65 6d 43 6e 74 29 3b 0a 20 20 7d 0a 0a 23   memCnt);.  }..#
3250: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3260: 49 54 5f 54 52 55 4e 43 41 54 45 5f 4f 50 54 49  IT_TRUNCATE_OPTI
3270: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 70  MIZATION.  /* Sp
3280: 65 63 69 61 6c 20 63 61 73 65 3a 20 41 20 44 45  ecial case: A DE
3290: 4c 45 54 45 20 77 69 74 68 6f 75 74 20 61 20 57  LETE without a W
32a0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 65 6c 65  HERE clause dele
32b0: 74 65 73 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  tes everything..
32c0: 20 20 2a 2a 20 49 74 20 69 73 20 65 61 73 69 65    ** It is easie
32d0: 72 20 6a 75 73 74 20 74 6f 20 65 72 61 73 65 20  r just to erase 
32e0: 74 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e  the whole table.
32f0: 20 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c    Note, however,
3300: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20   that.  ** this 
3310: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
3320: 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
3330: 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 72 65 63  will be incorrec
3340: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
3350: 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  auth==SQLITE_OK 
3360: 26 26 20 70 57 68 65 72 65 3d 3d 30 20 26 26 20  && pWhere==0 && 
3370: 21 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  !triggers_exist 
3380: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
3390: 61 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ab) ){.    asser
33a0: 74 28 20 21 69 73 56 69 65 77 20 29 3b 0a 20 20  t( !isView );.  
33b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op3(v, OP_Clear,
33d0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62   pTab->tnum, iDb
33e0: 2c 20 6d 65 6d 43 6e 74 29 3b 0a 20 20 20 20 69  , memCnt);.    i
33f0: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
3400: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
3410: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
3420: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
3430: 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  me, P4_STATIC);.
3440: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
3450: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
3460: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
3470: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
3480: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
3490: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
34a0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
34b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34c0: 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 70 49 64  v, OP_Clear, pId
34d0: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
34e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
34f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3500: 49 54 5f 54 52 55 4e 43 41 54 45 5f 4f 50 54 49  IT_TRUNCATE_OPTI
3510: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 20 20 2f 2a  MIZATION */.  /*
3520: 20 54 68 65 20 75 73 75 61 6c 20 63 61 73 65 3a   The usual case:
3530: 20 54 68 65 72 65 20 69 73 20 61 20 57 48 45 52   There is a WHER
3540: 45 20 63 6c 61 75 73 65 20 73 6f 20 77 65 20 68  E clause so we h
3550: 61 76 65 20 74 6f 20 73 63 61 6e 20 74 68 72 6f  ave to scan thro
3560: 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ugh.  ** the tab
3570: 6c 65 20 61 6e 64 20 70 69 63 6b 20 77 68 69 63  le and pick whic
3580: 68 20 72 65 63 6f 72 64 73 20 74 6f 20 64 65 6c  h records to del
3590: 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ete..  */.  {.  
35a0: 20 20 69 6e 74 20 69 52 6f 77 69 64 20 3d 20 2b    int iRowid = +
35b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
35c0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 73 74    /* Used for st
35d0: 6f 72 69 6e 67 20 72 6f 77 69 64 20 76 61 6c 75  oring rowid valu
35e0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  es. */.    int i
35f0: 52 6f 77 53 65 74 20 3d 20 2b 2b 70 50 61 72 73  RowSet = ++pPars
3600: 65 2d 3e 6e 4d 65 6d 3b 20 20 20 2f 2a 20 52 65  e->nMem;   /* Re
3610: 67 69 73 74 65 72 20 66 6f 72 20 72 6f 77 73 65  gister for rowse
3620: 74 20 6f 66 20 72 6f 77 73 20 74 6f 20 64 65 6c  t of rows to del
3630: 65 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42  ete */..    /* B
3640: 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
3650: 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20  e scan.    */.  
3660: 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
3670: 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
3680: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
3690: 57 68 65 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Where, 0, 0);.  
36a0: 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
36b0: 29 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72  ) goto delete_fr
36c0: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20  om_cleanup;..   
36d0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
36e0: 20 72 6f 77 69 64 20 6f 66 20 65 76 65 72 79 20   rowid of every 
36f0: 69 74 65 6d 20 74 6f 20 62 65 20 64 65 6c 65 74  item to be delet
3700: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
3710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3720: 28 76 2c 20 49 73 56 69 72 74 75 61 6c 28 70 54  (v, IsVirtual(pT
3730: 61 62 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20  ab) ? OP_VRowid 
3740: 3a 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  : OP_Rowid, iCur
3750: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  , iRowid);.    s
3760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3770: 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  (v, OP_RowSetAdd
3780: 2c 20 69 52 6f 77 53 65 74 2c 20 69 52 6f 77 69  , iRowSet, iRowi
3790: 64 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  d);.    if( db->
37a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
37b0: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
37c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37d0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
37e0: 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20 20  , memCnt, 1);.  
37f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20    }..    /* End 
3800: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
3810: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
3820: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
3830: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 20  nd(pWInfo);..   
3840: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 73 65   /* Open the pse
3850: 75 64 6f 2d 74 61 62 6c 65 20 75 73 65 64 20 74  udo-table used t
3860: 6f 20 73 74 6f 72 65 20 4f 4c 44 20 69 66 20 74  o store OLD if t
3870: 68 65 72 65 20 61 72 65 20 74 72 69 67 67 65 72  here are trigger
3880: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
3890: 28 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74  ( triggers_exist
38a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
38b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
38c0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
38d0: 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b   0, pTab->nCol);
38e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
38f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
3900: 70 65 6e 50 73 65 75 64 6f 2c 20 6f 6c 64 49 64  penPseudo, oldId
3910: 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
3920: 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 69  * Delete every i
3930: 74 65 6d 20 77 68 6f 73 65 20 6b 65 79 20 77 61  tem whose key wa
3940: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
3950: 20 6c 69 73 74 20 64 75 72 69 6e 67 20 74 68 65   list during the
3960: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
3970: 20 73 63 61 6e 2e 20 20 57 65 20 68 61 76 65 20   scan.  We have 
3980: 74 6f 20 64 65 6c 65 74 65 20 69 74 65 6d 73 20  to delete items 
3990: 61 66 74 65 72 20 74 68 65 20 73 63 61 6e 20 69  after the scan i
39a0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  s complete.    *
39b0: 2a 20 62 65 63 61 75 73 65 20 64 65 6c 65 74 69  * because deleti
39c0: 6e 67 20 61 6e 20 69 74 65 6d 20 63 61 6e 20 63  ng an item can c
39d0: 68 61 6e 67 65 20 74 68 65 20 73 63 61 6e 20 6f  hange the scan o
39e0: 72 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rder..    */.   
39f0: 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64   end = sqlite3Vd
3a00: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
3a10: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
3a20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
3a30: 6e 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68  n cursors for th
3a40: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 64  e table we are d
3a50: 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 6e 64  eleting from and
3a60: 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 69   .      ** all i
3a70: 74 73 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ts indices..    
3a80: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
3a90: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
3aa0: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
3ab0: 61 62 2c 20 69 43 75 72 2c 20 4f 50 5f 4f 70 65  ab, iCur, OP_Ope
3ac0: 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 0a  nWrite);.    }..
3ad0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
3ae0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
3af0: 74 68 65 20 64 65 6c 65 74 65 20 6c 6f 6f 70 2e  the delete loop.
3b00: 20 49 66 20 61 20 74 72 69 67 67 65 72 20 65 6e   If a trigger en
3b10: 63 6f 75 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20  counters.    ** 
3b20: 61 6e 20 49 47 4e 4f 52 45 20 63 6f 6e 73 74 72  an IGNORE constr
3b30: 61 69 6e 74 2c 20 69 74 20 6a 75 6d 70 73 20 62  aint, it jumps b
3b40: 61 63 6b 20 74 6f 20 68 65 72 65 2e 0a 20 20 20  ack to here..   
3b50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 74 72 69 67   */.    if( trig
3b60: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
3b70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
3b80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
3b90: 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ddr);.    }.    
3ba0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3bb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
3bc0: 6f 77 53 65 74 52 65 61 64 2c 20 69 52 6f 77 53  owSetRead, iRowS
3bd0: 65 74 2c 20 65 6e 64 2c 20 69 52 6f 77 69 64 29  et, end, iRowid)
3be0: 3b 0a 0a 20 20 20 20 69 66 28 20 74 72 69 67 67  ;..    if( trigg
3bf0: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
3c00: 20 20 20 69 6e 74 20 69 44 61 74 61 20 3d 20 2b     int iData = +
3c10: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
3c20: 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20   /* For storing 
3c30: 72 6f 77 20 64 61 74 61 20 6f 66 20 4f 4c 44 20  row data of OLD 
3c40: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3c50: 2f 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  /* If the record
3c60: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 72   is no longer pr
3c70: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 74 61 62  esent in the tab
3c80: 6c 65 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 0a  le, jump to the.
3c90: 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
3ca0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
3cb0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
3cc0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3cd0: 66 69 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  fifo..      */. 
3ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3cf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
3d00: 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
3d10: 64 72 2c 20 69 52 6f 77 69 64 29 3b 0a 0a 20 20  dr, iRowid);..  
3d20: 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
3d30: 74 68 65 20 4f 4c 44 2e 2a 20 70 73 65 75 64 6f  the OLD.* pseudo
3d40: 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  -table */.      
3d50: 69 66 28 20 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b  if( old_col_mask
3d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3d70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3d80: 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 43 75   OP_RowData, iCu
3d90: 72 2c 20 69 44 61 74 61 29 3b 0a 20 20 20 20 20  r, iData);.     
3da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3db0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3dc0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
3dd0: 20 69 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d   iData);.      }
3de0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
3e00: 6e 73 65 72 74 2c 20 6f 6c 64 49 64 78 2c 20 69  nsert, oldIdx, i
3e10: 44 61 74 61 2c 20 69 52 6f 77 69 64 29 3b 0a 0a  Data, iRowid);..
3e20: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 62 61        /* Jump ba
3e30: 63 6b 20 61 6e 64 20 72 75 6e 20 74 68 65 20 42  ck and run the B
3e40: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 2a  EFORE triggers *
3e50: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
3e60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3e70: 47 6f 74 6f 2c 20 30 2c 20 69 42 65 67 69 6e 42  Goto, 0, iBeginB
3e80: 65 66 6f 72 65 54 72 69 67 67 65 72 29 3b 0a 20  eforeTrigger);. 
3e90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ea0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 45 6e 64  JumpHere(v, iEnd
3eb0: 42 65 66 6f 72 65 54 72 69 67 67 65 72 29 3b 0a  BeforeTrigger);.
3ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
3ed0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
3ee0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72 6f  /* Delete the ro
3ef0: 77 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  w */.#ifndef SQL
3f00: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
3f10: 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20  TABLE.      if( 
3f20: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
3f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
3f40: 20 63 68 61 72 20 2a 70 56 74 61 62 20 3d 20 28   char *pVtab = (
3f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 54 61  const char *)pTa
3f60: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
3f70: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b    sqlite3VtabMak
3f80: 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  eWritable(pParse
3f90: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  , pTab);.       
3fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3fb0: 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65  p4(v, OP_VUpdate
3fc0: 2c 20 30 2c 20 31 2c 20 69 52 6f 77 69 64 2c 20  , 0, 1, iRowid, 
3fd0: 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVtab, P4_VTAB);
3fe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
3ff0: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
4000: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
4010: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61  ateRowDelete(pPa
4020: 72 73 65 2c 20 70 54 61 62 2c 20 69 43 75 72 2c  rse, pTab, iCur,
4030: 20 69 52 6f 77 69 64 2c 20 70 50 61 72 73 65 2d   iRowid, pParse-
4040: 3e 6e 65 73 74 65 64 3d 3d 30 29 3b 0a 20 20 20  >nested==0);.   
4050: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
4060: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
4070: 72 6f 77 20 74 72 69 67 67 65 72 73 2c 20 63 6c  row triggers, cl
4080: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
4090: 74 68 65 6e 20 69 6e 76 6f 6b 65 0a 20 20 20 20  then invoke.    
40a0: 2a 2a 20 74 68 65 20 41 46 54 45 52 20 74 72 69  ** the AFTER tri
40b0: 67 67 65 72 73 0a 20 20 20 20 2a 2f 0a 20 20 20  ggers.    */.   
40c0: 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78   if( triggers_ex
40d0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ist ){.      /* 
40e0: 4a 75 6d 70 20 62 61 63 6b 20 61 6e 64 20 72 75  Jump back and ru
40f0: 6e 20 74 68 65 20 41 46 54 45 52 20 74 72 69 67  n the AFTER trig
4100: 67 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  gers */.      sq
4110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4120: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4130: 42 65 67 69 6e 41 66 74 65 72 54 72 69 67 67 65  BeginAfterTrigge
4140: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
4150: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
4160: 20 69 45 6e 64 41 66 74 65 72 54 72 69 67 67 65   iEndAfterTrigge
4170: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
4180: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 65 6c  * End of the del
4190: 65 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ete loop */.    
41a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
41b0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
41c0: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
41d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
41e0: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 0a 20 20  bel(v, end);..  
41f0: 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 63    /* Close the c
4200: 75 72 73 6f 72 73 20 61 66 74 65 72 20 74 68 65  ursors after the
4210: 20 6c 6f 6f 70 20 69 66 20 74 68 65 72 65 20 61   loop if there a
4220: 72 65 20 6e 6f 20 72 6f 77 20 74 72 69 67 67 65  re no row trigge
4230: 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  rs */.    if( !i
4240: 73 56 69 65 77 20 20 26 26 20 21 49 73 56 69 72  sView  && !IsVir
4250: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
4260: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
4270: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4280: 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64 78 3d  pIdx; i++, pIdx=
4290: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
42a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
42b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
42c0: 6f 73 65 2c 20 69 43 75 72 20 2b 20 69 2c 20 70  ose, iCur + i, p
42d0: 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Idx->tnum);.    
42e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
42f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4300: 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 29 3b 0a  P_Close, iCur);.
4310: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
4320: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
4330: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
4340: 68 61 74 20 77 65 72 65 20 64 65 6c 65 74 65 64  hat were deleted
4350: 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  . If this routin
4360: 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65 72  e is .  ** gener
4370: 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63 61 75  ating code becau
4380: 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f 20  se of a call to 
4390: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
43a0: 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a  se(), do not.  *
43b0: 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c  * invoke the cal
43c0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
43d0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66    */.  if( db->f
43e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
43f0: 75 6e 74 52 6f 77 73 20 26 26 20 70 50 61 72 73  untRows && pPars
4400: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26 20  e->nested==0 && 
4410: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
4420: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
4430: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4440: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 6d 65 6d  P_ResultRow, mem
4450: 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Cnt, 1);.    sql
4460: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
4470: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71  ls(v, 1);.    sq
4480: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
4490: 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d  ame(v, 0, COLNAM
44a0: 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 64 65  E_NAME, "rows de
44b0: 6c 65 74 65 64 22 2c 20 53 51 4c 49 54 45 5f 53  leted", SQLITE_S
44c0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 64 65 6c  TATIC);.  }..del
44d0: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
44e0: 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  :.  sqlite3AuthC
44f0: 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74  ontextPop(&sCont
4500: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ext);.  sqlite3S
4510: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
4520: 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71   pTabList);.  sq
4530: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4540: 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72  db, pWhere);.  r
4550: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
4560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
4570: 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
4580: 20 74 68 61 74 20 63 61 75 73 65 73 20 61 20 73   that causes a s
4590: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a  ingle row of a.*
45a0: 2a 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 74  * single table t
45b0: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o be deleted..**
45c0: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6d 75 73  .** The VDBE mus
45d0: 74 20 62 65 20 69 6e 20 61 20 70 61 72 74 69 63  t be in a partic
45e0: 75 6c 61 72 20 73 74 61 74 65 20 77 68 65 6e 20  ular state when 
45f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4600: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54 68 65 73 65  called..** These
4610: 20 61 72 65 20 74 68 65 20 72 65 71 75 69 72 65   are the require
4620: 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  ments:.**.**   1
4630: 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74 65 20  .  A read/write 
4640: 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
4650: 74 6f 20 70 54 61 62 2c 20 74 68 65 20 74 61 62  to pTab, the tab
4660: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
4670: 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74  e row.**       t
4680: 6f 20 62 65 20 64 65 6c 65 74 65 64 2c 20 6d 75  o be deleted, mu
4690: 73 74 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  st be opened as 
46a0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 22 62  cursor number "b
46b0: 61 73 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  ase"..**.**   2.
46c0: 20 20 52 65 61 64 2f 77 72 69 74 65 20 63 75 72    Read/write cur
46d0: 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
46e0: 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73  ices of pTab mus
46f0: 74 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20  t be open as.** 
4700: 20 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d        cursor num
4710: 62 65 72 20 62 61 73 65 2b 69 20 66 6f 72 20 74  ber base+i for t
4720: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a  he i-th index..*
4730: 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20 72  *.**   3.  The r
4740: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 6f 66 20  ecord number of 
4750: 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65  the row to be de
4760: 6c 65 74 65 64 20 6d 75 73 74 20 62 65 20 73 74  leted must be st
4770: 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20  ored in.**      
4780: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 52 6f   memory cell iRo
4790: 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  wid..**.** This 
47a0: 72 6f 75 74 69 6e 65 20 70 6f 70 73 20 74 68 65  routine pops the
47b0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
47c0: 6b 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  k to remove the 
47d0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 2a 2a  record number.**
47e0: 20 61 6e 64 20 74 68 65 6e 20 67 65 6e 65 72 61   and then genera
47f0: 74 65 73 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  tes code to remo
4800: 76 65 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c  ve both the tabl
4810: 65 20 72 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c  e record and all
4820: 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65   index.** entrie
4830: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
4840: 74 68 61 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  that record..*/.
4850: 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65  void sqlite3Gene
4860: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20  rateRowDelete(. 
4870: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4880: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
4890: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
48a0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f  e *pTab,       /
48b0: 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  * Table containi
48c0: 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  ng the row to be
48d0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
48e0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
48f0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
4900: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
4910: 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 2c  */.  int iRowid,
4920: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
4930: 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74  y cell that cont
4940: 61 69 6e 73 20 74 68 65 20 72 6f 77 69 64 20 74  ains the rowid t
4950: 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
4960: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
4970: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
4980: 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75  e row change cou
4990: 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nter */.){.  int
49a0: 20 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76   addr;.  Vdbe *v
49b0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
49c0: 3e 70 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d  >pVdbe;.  addr =
49d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
49e0: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
49f0: 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 69 52 6f  ts, iCur, 0, iRo
4a00: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  wid);.  sqlite3G
4a10: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
4a20: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54  elete(pParse, pT
4a30: 61 62 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  ab, iCur, 0);.  
4a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a50: 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  2(v, OP_Delete, 
4a60: 69 43 75 72 2c 20 28 63 6f 75 6e 74 3f 4f 50 46  iCur, (count?OPF
4a70: 4c 41 47 5f 4e 43 48 41 4e 47 45 3a 30 29 29 3b  LAG_NCHANGE:0));
4a80: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a  .  if( count ){.
4a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4aa0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
4ab0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53  Tab->zName, P4_S
4ac0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71  TATIC);.  }.  sq
4ad0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4ae0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 7d 0a 0a 2f  e(v, addr);.}../
4af0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4b00: 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
4b10: 20 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65   code that cause
4b20: 73 20 74 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f  s the deletion o
4b30: 66 20 61 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65  f all.** index e
4b40: 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
4b50: 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  d with a single 
4b60: 72 6f 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  row of a single 
4b70: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
4b80: 20 56 44 42 45 20 6d 75 73 74 20 62 65 20 69 6e   VDBE must be in
4b90: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 73 74   a particular st
4ba0: 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ate when this ro
4bb0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
4bc0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
4bd0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 3a 0a  e requirements:.
4be0: 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 41 20 72 65  **.**   1.  A re
4bf0: 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20  ad/write cursor 
4c00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 70 54 61 62  pointing to pTab
4c10: 2c 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  , the table cont
4c20: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 0a 2a  aining the row.*
4c30: 2a 20 20 20 20 20 20 20 74 6f 20 62 65 20 64 65  *       to be de
4c40: 6c 65 74 65 64 2c 20 6d 75 73 74 20 62 65 20 6f  leted, must be o
4c50: 70 65 6e 65 64 20 61 73 20 63 75 72 73 6f 72 20  pened as cursor 
4c60: 6e 75 6d 62 65 72 20 22 69 43 75 72 22 2e 0a 2a  number "iCur"..*
4c70: 2a 0a 2a 2a 20 20 20 32 2e 20 20 52 65 61 64 2f  *.**   2.  Read/
4c80: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 66 6f  write cursors fo
4c90: 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  r all indices of
4ca0: 20 70 54 61 62 20 6d 75 73 74 20 62 65 20 6f 70   pTab must be op
4cb0: 65 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 63  en as.**       c
4cc0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75  ursor number iCu
4cd0: 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d 74 68  r+i for the i-th
4ce0: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20   index..**.**   
4cf0: 33 2e 20 20 54 68 65 20 22 69 43 75 72 22 20 63  3.  The "iCur" c
4d00: 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f  ursor must be po
4d10: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72 6f  inting to the ro
4d20: 77 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a  w that is to be.
4d30: 2a 2a 20 20 20 20 20 20 20 64 65 6c 65 74 65 64  **       deleted
4d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4d50: 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65  3GenerateRowInde
4d60: 78 44 65 6c 65 74 65 28 0a 20 20 50 61 72 73 65  xDelete(.  Parse
4d70: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
4d80: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4d90: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4da0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
4db0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20  *pTab,       /* 
4dc0: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  Table containing
4dd0: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
4de0: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
4df0: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  iCur,          /
4e00: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4e10: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
4e20: 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 20  .  int *aRegIdx 
4e30: 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65        /* Only de
4e40: 6c 65 74 65 20 69 66 20 61 52 65 67 49 64 78 21  lete if aRegIdx!
4e50: 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b 69 5d  =0 && aRegIdx[i]
4e60: 3e 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  >0 */.){.  int i
4e70: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
4e80: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 66 6f  .  int r1;..  fo
4e90: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
4ea0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
4eb0: 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e  i++, pIdx=pIdx->
4ec0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4ed0: 61 52 65 67 49 64 78 21 3d 30 20 26 26 20 61 52  aRegIdx!=0 && aR
4ee0: 65 67 49 64 78 5b 69 2d 31 5d 3d 3d 30 20 29 20  egIdx[i-1]==0 ) 
4ef0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 31  continue;.    r1
4f00: 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61   = sqlite3Genera
4f10: 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
4f20: 65 2c 20 70 49 64 78 2c 20 69 43 75 72 2c 20 30  e, pIdx, iCur, 0
4f30: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4f40: 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
4f50: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 49 64  se->pVdbe, OP_Id
4f60: 78 44 65 6c 65 74 65 2c 20 69 43 75 72 2b 69 2c  xDelete, iCur+i,
4f70: 20 72 31 2c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   r1,pIdx->nColum
4f80: 6e 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n+1);.  }.}../*.
4f90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
4fa0: 20 74 68 61 74 20 77 69 6c 6c 20 61 73 73 65 6d   that will assem
4fb0: 62 6c 65 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ble an index key
4fc0: 20 61 6e 64 20 70 75 74 20 69 74 20 69 6e 20 72   and put it in r
4fd0: 65 67 69 73 74 65 72 0a 2a 2a 20 72 65 67 4f 75  egister.** regOu
4fe0: 74 2e 20 20 54 68 65 20 6b 65 79 20 77 69 74 68  t.  The key with
4ff0: 20 62 65 20 66 6f 72 20 69 6e 64 65 78 20 70 49   be for index pI
5000: 64 78 20 77 68 69 63 68 20 69 73 20 61 6e 20 69  dx which is an i
5010: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
5020: 20 69 43 75 72 20 69 73 20 74 68 65 20 69 6e 64   iCur is the ind
5030: 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f  ex of a cursor o
5040: 70 65 6e 20 6f 6e 20 74 68 65 20 70 54 61 62 20  pen on the pTab 
5050: 74 61 62 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69  table and pointi
5060: 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74  ng to.** the ent
5070: 72 79 20 74 68 61 74 20 6e 65 65 64 73 20 69 6e  ry that needs in
5080: 64 65 78 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 52 65  dexing..**.** Re
5090: 74 75 72 6e 20 61 20 72 65 67 69 73 74 65 72 20  turn a register 
50a0: 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
50b0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 62  the first in a b
50c0: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73  lock of.** regis
50d0: 74 65 72 73 20 74 68 61 74 20 68 6f 6c 64 73 20  ters that holds 
50e0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
50f0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 20 20  the index key.  
5100: 54 68 65 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  The.** block of 
5110: 72 65 67 69 73 74 65 72 73 20 68 61 73 20 61 6c  registers has al
5120: 72 65 61 64 79 20 62 65 65 6e 20 64 65 61 6c 6c  ready been deall
5130: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 74 69  ocated by the ti
5140: 6d 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  me.** this routi
5150: 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 69  ne returns..*/.i
5160: 6e 74 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  nt sqlite3Genera
5170: 74 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 50 61  teIndexKey(.  Pa
5180: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5190: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
51a0: 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
51b0: 70 49 64 78 2c 20 20 20 20 20 20 20 2f 2a 20 54  pIdx,       /* T
51c0: 68 65 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69  he index for whi
51d0: 63 68 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ch to generate a
51e0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43   key */.  int iC
51f0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
5200: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
5210: 72 20 74 68 65 20 70 49 64 78 2d 3e 70 54 61 62  r the pIdx->pTab
5220: 6c 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  le table */.  in
5230: 74 20 72 65 67 4f 75 74 2c 20 20 20 20 20 20 20  t regOut,       
5240: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
5250: 77 20 69 6e 64 65 78 20 6b 65 79 20 74 6f 20 74  w index key to t
5260: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
5270: 20 20 69 6e 74 20 64 6f 4d 61 6b 65 52 65 63 20    int doMakeRec 
5280: 20 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20       /* Run the 
5290: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e  OP_MakeRecord in
52a0: 73 74 72 75 63 74 69 6f 6e 20 69 66 20 74 72 75  struction if tru
52b0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
52c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
52d0: 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  e;.  int j;.  Ta
52e0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
52f0: 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  ->pTable;.  int 
5300: 72 65 67 42 61 73 65 3b 0a 20 20 69 6e 74 20 6e  regBase;.  int n
5310: 43 6f 6c 3b 0a 0a 20 20 6e 43 6f 6c 20 3d 20 70  Col;..  nCol = p
5320: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
5330: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
5340: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
5350: 61 72 73 65 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 20  arse, nCol+1);. 
5360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5370: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
5380: 69 43 75 72 2c 20 72 65 67 42 61 73 65 2b 6e 43  iCur, regBase+nC
5390: 6f 6c 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  ol);.  for(j=0; 
53a0: 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nCol; j++){.  
53b0: 20 20 69 6e 74 20 69 64 78 20 3d 20 70 49 64 78    int idx = pIdx
53c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
53d0: 20 20 20 69 66 28 20 69 64 78 3d 3d 70 54 61 62     if( idx==pTab
53e0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
53f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5400: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
5410: 72 65 67 42 61 73 65 2b 6e 43 6f 6c 2c 20 72 65  regBase+nCol, re
5420: 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 7d 65  gBase+j);.    }e
5430: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5440: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5450: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
5460: 20 69 64 78 2c 20 72 65 67 42 61 73 65 2b 6a 29   idx, regBase+j)
5470: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
5480: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
5490: 70 54 61 62 2c 20 69 64 78 29 3b 0a 20 20 20 20  pTab, idx);.    
54a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 64 6f 4d 61  }.  }.  if( doMa
54b0: 6b 65 52 65 63 20 29 7b 0a 20 20 20 20 73 71 6c  keRec ){.    sql
54c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
54d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
54e0: 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2b 31   regBase, nCol+1
54f0: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 73  , regOut);.    s
5500: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
5510: 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b  ityStr(v, pIdx);
5520: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5530: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5540: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
5550: 61 73 65 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 20 20  ase, nCol+1);.  
5560: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
5570: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
5580: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
5590: 6c 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  l+1);.  return r
55a0: 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 20 4d 61  egBase;.}../* Ma
55b0: 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22  ke sure "isView"
55c0: 20 67 65 74 73 20 75 6e 64 65 66 69 6e 65 64 20   gets undefined 
55d0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 66 69 6c  in case this fil
55e0: 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f  e becomes part o
55f0: 66 0a 2a 2a 20 74 68 65 20 61 6d 61 6c 67 61 6d  f.** the amalgam
5600: 61 74 69 6f 6e 20 2d 20 73 6f 20 74 68 61 74 20  ation - so that 
5610: 73 75 62 73 65 71 75 65 6e 74 20 66 69 6c 65 73  subsequent files
5620: 20 64 6f 20 6e 6f 74 20 73 65 65 20 69 73 56 69   do not see isVi
5630: 65 77 20 61 73 20 61 0a 2a 2a 20 6d 61 63 72 6f  ew as a.** macro
5640: 2e 20 2a 2f 0a 23 75 6e 64 65 66 20 69 73 56 69  . */.#undef isVi
5650: 65 77 0a                                         ew.