/ Hex Artifact Content
Login

Artifact d058ed72fc9b975dbf42fd8bdacbb530106440595847dc8aba6bb1d138ca2c5f:


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 2f 0a 23 69 6e 63 6c 75 64 65 20  ts..*/.#include 
0200: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0210: 2a 0a 2a 2a 20 57 68 69 6c 65 20 61 20 53 72 63  *.** While a Src
0220: 4c 69 73 74 20 63 61 6e 20 69 6e 20 67 65 6e 65  List can in gene
0230: 72 61 6c 20 72 65 70 72 65 73 65 6e 74 20 6d 75  ral represent mu
0240: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 6e  ltiple tables an
0250: 64 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  d subqueries.** 
0260: 28 61 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  (as in the FROM 
0270: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
0280: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 69 6e  CT statement) in
0290: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 63 6f   this case it co
02a0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e 61  ntains.** the na
02b0: 6d 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  me of a single t
02c0: 61 62 6c 65 2c 20 61 73 20 6f 6e 65 20 6d 69 67  able, as one mig
02d0: 68 74 20 66 69 6e 64 20 69 6e 20 61 6e 20 49 4e  ht find in an IN
02e0: 53 45 52 54 2c 20 44 45 4c 45 54 45 2c 0a 2a 2a  SERT, DELETE,.**
02f0: 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
0300: 6d 65 6e 74 2e 20 20 4c 6f 6f 6b 20 75 70 20 74  ment.  Look up t
0310: 68 61 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  hat table in the
0320: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 61 6e   symbol table an
0330: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
0340: 69 6e 74 65 72 2e 20 20 53 65 74 20 61 6e 20 65  inter.  Set an e
0350: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
0360: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
0370: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 6e 61  the table .** na
0380: 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  me is not found 
0390: 6f 72 20 69 66 20 61 6e 79 20 6f 74 68 65 72 20  or if any other 
03a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
03b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
03c0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
03d0: 74 69 61 6c 69 7a 65 64 20 61 70 70 72 6f 70 72  tialized appropr
03e0: 69 61 74 65 20 69 6e 20 70 53 72 63 3a 0a 2a 2a  iate in pSrc:.**
03f0: 0a 2a 2a 20 20 20 20 70 53 72 63 2d 3e 61 5b 30  .**    pSrc->a[0
0400: 5d 2e 70 54 61 62 20 20 20 20 20 20 20 50 6f 69  ].pTab       Poi
0410: 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
0420: 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 70  e object.**    p
0430: 53 72 63 2d 3e 61 5b 30 5d 2e 70 49 6e 64 65 78  Src->a[0].pIndex
0440: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0450: 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 69  the INDEXED BY i
0460: 6e 64 65 78 2c 20 69 66 20 74 68 65 72 65 20 69  ndex, if there i
0470: 73 20 6f 6e 65 0a 2a 2a 0a 2a 2f 0a 54 61 62 6c  s one.**.*/.Tabl
0480: 65 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  e *sqlite3SrcLis
0490: 74 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  tLookup(Parse *p
04a0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
04b0: 70 53 72 63 29 7b 0a 20 20 73 74 72 75 63 74 20  pSrc){.  struct 
04c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
04d0: 74 65 6d 20 3d 20 70 53 72 63 2d 3e 61 3b 0a 20  tem = pSrc->a;. 
04e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
04f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 20 26 26  assert( pItem &&
0500: 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29   pSrc->nSrc==1 )
0510: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
0520: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
0530: 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74  m(pParse, 0, pIt
0540: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  em);.  sqlite3De
0550: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
0560: 2d 3e 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  ->db, pItem->pTa
0570: 62 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 54 61  b);.  pItem->pTa
0580: 62 20 3d 20 70 54 61 62 3b 0a 20 20 69 66 28 20  b = pTab;.  if( 
0590: 70 54 61 62 20 29 7b 0a 20 20 20 20 70 54 61 62  pTab ){.    pTab
05a0: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 7d  ->nTabRef++;.  }
05b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e  .  if( sqlite3In
05c0: 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
05d0: 61 72 73 65 2c 20 70 49 74 65 6d 29 20 29 7b 0a  arse, pItem) ){.
05e0: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
05f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
0600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0610: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
0620: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 69 73 20   given table is 
0630: 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 74  writable.  If it
0640: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61   is not.** writa
0650: 62 6c 65 2c 20 67 65 6e 65 72 61 74 65 20 61 6e  ble, generate an
0660: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
0670: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
0680: 20 69 74 20 69 73 0a 2a 2a 20 77 72 69 74 61 62   it is.** writab
0690: 6c 65 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a  le return 0;.*/.
06a0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 65 61  int sqlite3IsRea
06b0: 64 4f 6e 6c 79 28 50 61 72 73 65 20 2a 70 50 61  dOnly(Parse *pPa
06c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
06d0: 2c 20 69 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20  , int viewOk){. 
06e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
06f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 2f 2a 20  Parse->db;.  /* 
0700: 41 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 77  A table is not w
0710: 72 69 74 61 62 6c 65 20 75 6e 64 65 72 20 74 68  ritable under th
0720: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 69 72 63  e following circ
0730: 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
0740: 20 20 2a 2a 20 20 20 31 29 20 49 74 20 69 73 20    **   1) It is 
0750: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
0760: 61 6e 64 20 6e 6f 20 69 6d 70 6c 65 6d 65 6e 74  and no implement
0770: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 55 70  ation of the xUp
0780: 64 61 74 65 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  date method.  **
0790: 20 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 70        has been p
07a0: 72 6f 76 69 64 65 64 2c 20 6f 72 0a 20 20 2a 2a  rovided, or.  **
07b0: 20 20 20 32 29 20 49 74 20 69 73 20 61 20 73 79     2) It is a sy
07c0: 73 74 65 6d 20 74 61 62 6c 65 20 28 69 2e 65 2e  stem table (i.e.
07d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 29 2c   sqlite_master),
07e0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 6e 6f   this call is no
07f0: 74 0a 20 20 2a 2a 20 20 20 20 20 20 70 61 72 74  t.  **      part
0800: 20 6f 66 20 61 20 6e 65 73 74 65 64 20 70 61 72   of a nested par
0810: 73 65 20 61 6e 64 20 77 72 69 74 61 62 6c 65 5f  se and writable_
0820: 73 63 68 65 6d 61 20 70 72 61 67 6d 61 20 68 61  schema pragma ha
0830: 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 20 20 20 20  s not .  **     
0840: 20 62 65 65 6e 20 73 70 65 63 69 66 69 65 64 2e   been specified.
0850: 0a 20 20 2a 2a 20 20 20 33 29 20 54 68 65 20 74  .  **   3) The t
0860: 61 62 6c 65 20 69 73 20 61 20 73 68 61 64 6f 77  able is a shadow
0870: 20 74 61 62 6c 65 2c 20 74 68 65 20 64 61 74 61   table, the data
0880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
0890: 69 73 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  is in.  **      
08a0: 64 65 66 65 6e 73 69 76 65 20 6d 6f 64 65 2c 20  defensive mode, 
08b0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
08c0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
08d0: 29 0a 20 20 2a 2a 20 20 20 20 20 20 69 73 20 66  ).  **      is f
08e0: 6f 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 53  or a top-level S
08f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  QL statement..  
0900: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 65 69 74 68 65  **.  ** In eithe
0910: 72 20 63 61 73 65 20 6c 65 61 76 65 20 61 6e 20  r case leave an 
0920: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
0930: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
0940: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  rn non-zero..  *
0950: 2f 0a 20 20 69 66 28 20 28 20 49 73 56 69 72 74  /.  if( ( IsVirt
0960: 75 61 6c 28 70 54 61 62 29 20 0a 20 20 20 20 20  ual(pTab) .     
0970: 26 26 20 73 71 6c 69 74 65 33 47 65 74 56 54 61  && sqlite3GetVTa
0980: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70  ble(db, pTab)->p
0990: 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55  Mod->pModule->xU
09a0: 70 64 61 74 65 3d 3d 30 20 29 0a 20 20 20 7c 7c  pdate==0 ).   ||
09b0: 20 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61   ( (pTab->tabFla
09c0: 67 73 20 26 20 54 46 5f 52 65 61 64 6f 6e 6c 79  gs & TF_Readonly
09d0: 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )!=0.     && sql
09e0: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
09f0: 6d 61 28 64 62 29 3d 3d 30 0a 20 20 20 20 20 26  ma(db)==0.     &
0a00: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
0a10: 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 20 28 70 54  ==0).   || ( (pT
0a20: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
0a30: 46 5f 53 68 61 64 6f 77 29 21 3d 30 0a 20 20 20  F_Shadow)!=0.   
0a40: 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20    && (db->flags 
0a50: 26 20 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  & SQLITE_Defensi
0a60: 76 65 29 21 3d 30 0a 20 20 20 20 20 26 26 20 64  ve)!=0.     && d
0a70: 62 2d 3e 6e 56 64 62 65 45 78 65 63 3d 3d 30 29  b->nVdbeExec==0)
0a80: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
0a90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
0aa0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
0ab0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22  not be modified"
0ac0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
0ad0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
0ae0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
0af0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
0b00: 28 20 21 76 69 65 77 4f 6b 20 26 26 20 70 54 61  ( !viewOk && pTa
0b10: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
0b20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0b30: 67 28 70 50 61 72 73 65 2c 22 63 61 6e 6e 6f 74  g(pParse,"cannot
0b40: 20 6d 6f 64 69 66 79 20 25 73 20 62 65 63 61 75   modify %s becau
0b50: 73 65 20 69 74 20 69 73 20 61 20 76 69 65 77 22  se it is a view"
0b60: 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ,pTab->zName);. 
0b70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0b80: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0b90: 20 30 3b 0a 7d 0a 0a 0a 23 69 66 20 21 64 65 66   0;.}...#if !def
0ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0bb0: 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e  _VIEW) && !defin
0bc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
0bd0: 52 49 47 47 45 52 29 0a 2f 2a 0a 2a 2a 20 45 76  RIGGER)./*.** Ev
0be0: 61 6c 75 61 74 65 20 61 20 76 69 65 77 20 61 6e  aluate a view an
0bf0: 64 20 73 74 6f 72 65 20 69 74 73 20 72 65 73 75  d store its resu
0c00: 6c 74 20 69 6e 20 61 6e 20 65 70 68 65 6d 65 72  lt in an ephemer
0c10: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a  al table.  The.*
0c20: 2a 20 70 57 68 65 72 65 20 61 72 67 75 6d 65 6e  * pWhere argumen
0c30: 74 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  t is an optional
0c40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
0c50: 61 74 20 72 65 73 74 72 69 63 74 73 20 74 68 65  at restricts the
0c60: 0a 2a 2a 20 73 65 74 20 6f 66 20 72 6f 77 73 20  .** set of rows 
0c70: 69 6e 20 74 68 65 20 76 69 65 77 20 74 68 61 74  in the view that
0c80: 20 61 72 65 20 74 6f 20 62 65 20 61 64 64 65 64   are to be added
0c90: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
0ca0: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  l table..*/.void
0cb0: 20 73 71 6c 69 74 65 33 4d 61 74 65 72 69 61 6c   sqlite3Material
0cc0: 69 7a 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  izeView(.  Parse
0cd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0ce0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cf0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
0d00: 56 69 65 77 2c 20 20 20 20 20 20 20 20 2f 2a 20  View,        /* 
0d10: 56 69 65 77 20 64 65 66 69 6e 69 74 69 6f 6e 20  View definition 
0d20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0d30: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  e,        /* Opt
0d40: 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ional WHERE clau
0d50: 73 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  se to be added *
0d60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
0d70: 72 64 65 72 42 79 2c 20 20 2f 2a 20 4f 70 74 69  rderBy,  /* Opti
0d80: 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59 20 63 6c  onal ORDER BY cl
0d90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0da0: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 2f  pLimit,        /
0db0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 4c 49 4d 49 54  * Optional LIMIT
0dc0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0dd0: 20 69 43 75 72 20 20 20 20 20 20 20 20 20 20 20   iCur           
0de0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0df0: 65 72 20 66 6f 72 20 65 70 68 65 6d 65 72 61 6c  er for ephemeral
0e00: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 53   table */.){.  S
0e10: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
0e20: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
0e30: 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d    SrcList *pFrom
0e40: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
0e50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0e60: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
0e70: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
0e80: 62 2c 20 70 56 69 65 77 2d 3e 70 53 63 68 65 6d  b, pView->pSchem
0e90: 61 29 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 73  a);.  pWhere = s
0ea0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
0eb0: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
0ec0: 70 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53  pFrom = sqlite3S
0ed0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
0ee0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
0ef0: 20 70 46 72 6f 6d 20 29 7b 0a 20 20 20 20 61 73   pFrom ){.    as
0f00: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 53 72  sert( pFrom->nSr
0f10: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 72 6f  c==1 );.    pFro
0f20: 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  m->a[0].zName = 
0f30: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
0f40: 64 62 2c 20 70 56 69 65 77 2d 3e 7a 4e 61 6d 65  db, pView->zName
0f50: 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 5b  );.    pFrom->a[
0f60: 30 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  0].zDatabase = s
0f70: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
0f80: 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b, db->aDb[iDb].
0f90: 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 61  zDbSName);.    a
0fa0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 61 5b  ssert( pFrom->a[
0fb0: 30 5d 2e 70 4f 6e 3d 3d 30 20 29 3b 0a 20 20 20  0].pOn==0 );.   
0fc0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
0fd0: 61 5b 30 5d 2e 70 55 73 69 6e 67 3d 3d 30 20 29  a[0].pUsing==0 )
0fe0: 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 20 3d 20 73  ;.  }.  pSel = s
0ff0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
1000: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
1010: 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20  , pWhere, 0, 0, 
1020: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 53 46 5f 49 6e 63 6c 75 64 65 48       SF_IncludeH
1050: 69 64 64 65 6e 2c 20 70 4c 69 6d 69 74 29 3b 0a  idden, pLimit);.
1060: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1070: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
1080: 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 69 43 75  RT_EphemTab, iCu
1090: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  r);.  sqlite3Sel
10a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10b0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 73 71 6c 69  , &dest);.  sqli
10c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10d0: 64 62 2c 20 70 53 65 6c 29 3b 0a 7d 0a 23 65 6e  db, pSel);.}.#en
10e0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1100: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1110: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
1120: 52 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  R) */..#if defin
1130: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1140: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
1150: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
1160: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1170: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 47 65  BQUERY)./*.** Ge
1180: 6e 65 72 61 74 65 20 61 6e 20 65 78 70 72 65 73  nerate an expres
1190: 73 69 6f 6e 20 74 72 65 65 20 74 6f 20 69 6d 70  sion tree to imp
11a0: 6c 65 6d 65 6e 74 20 74 68 65 20 57 48 45 52 45  lement the WHERE
11b0: 2c 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 61  , ORDER BY,.** a
11c0: 6e 64 20 4c 49 4d 49 54 2f 4f 46 46 53 45 54 20  nd LIMIT/OFFSET 
11d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 44 45 4c 45 54  portion of DELET
11e0: 45 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  E and UPDATE sta
11f0: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  tements..**.**  
1200: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1210: 61 62 6c 65 5f 77 78 79 7a 20 57 48 45 52 45 20  able_wxyz WHERE 
1220: 61 3c 35 20 4f 52 44 45 52 20 42 59 20 61 20 4c  a<5 ORDER BY a L
1230: 49 4d 49 54 20 31 3b 0a 2a 2a 20 20 20 20 20 20  IMIT 1;.**      
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1260: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1270: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 70 4c 69 6d 69 74 57 68 65 72 65 20      pLimitWhere 
12a0: 28 70 49 6e 43 6c 61 75 73 65 29 0a 2a 2f 0a 45  (pInClause).*/.E
12b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 4c 69 6d 69  xpr *sqlite3Limi
12c0: 74 57 68 65 72 65 28 0a 20 20 50 61 72 73 65 20  tWhere(.  Parse 
12d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12f0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1300: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1320: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1330: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
1340: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
1350: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
1360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1370: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1380: 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f    May be null */
1390: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
13a0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20  derBy,          
13b0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
13c0: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
13d0: 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  null */.  Expr *
13e0: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
13f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
1400: 4d 49 54 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  MIT clause.  May
1410: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 63 68   be null */.  ch
1420: 61 72 20 2a 7a 53 74 6d 74 54 79 70 65 20 20 20  ar *zStmtType   
1430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69             /* Ei
1440: 74 68 65 72 20 44 45 4c 45 54 45 20 6f 72 20 55  ther DELETE or U
1450: 50 44 41 54 45 2e 20 20 46 6f 72 20 65 72 72 20  PDATE.  For err 
1460: 6d 73 67 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  msgs. */.){.  sq
1470: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1480: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
1490: 70 4c 68 73 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pLhs = NULL;    
14a0: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
14b0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 20 6f   IN(SELECT...) o
14c0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
14d0: 72 20 2a 70 49 6e 43 6c 61 75 73 65 20 3d 20 4e  r *pInClause = N
14e0: 55 4c 4c 3b 20 20 20 20 20 20 2f 2a 20 57 48 45  ULL;      /* WHE
14f0: 52 45 20 72 6f 77 69 64 20 49 4e 20 28 20 73 65  RE rowid IN ( se
1500: 6c 65 63 74 20 29 20 2a 2f 0a 20 20 45 78 70 72  lect ) */.  Expr
1510: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 4e  List *pEList = N
1520: 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 45 78 70 72  ULL;     /* Expr
1530: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
1540: 61 6e 69 6e 67 20 6f 6e 6c 79 20 70 53 65 6c 65  aning only pSele
1550: 63 74 52 6f 77 69 64 20 2a 2f 0a 20 20 53 72 63  ctRowid */.  Src
1560: 4c 69 73 74 20 2a 70 53 65 6c 65 63 74 53 72 63  List *pSelectSrc
1570: 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 53 45 4c   = NULL;  /* SEL
1580: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78  ECT rowid FROM x
1590: 20 2e 2e 2e 20 28 64 75 70 20 6f 66 20 70 53 72   ... (dup of pSr
15a0: 63 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  c) */.  Select *
15b0: 70 53 65 6c 65 63 74 20 3d 20 4e 55 4c 4c 3b 20  pSelect = NULL; 
15c0: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
15d0: 20 53 45 4c 45 43 54 20 74 72 65 65 20 2a 2f 0a   SELECT tree */.
15e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
15f0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1600: 74 68 65 72 65 20 69 73 6e 27 74 20 61 6e 20 4f  there isn't an O
1610: 52 44 45 52 20 42 59 20 77 69 74 68 6f 75 74 20  RDER BY without 
1620: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
1630: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1640: 72 42 79 20 26 26 20 70 4c 69 6d 69 74 3d 3d 30  rBy && pLimit==0
1650: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
1660: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1670: 20 22 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f   "ORDER BY witho
1680: 75 74 20 4c 49 4d 49 54 20 6f 6e 20 25 73 22 2c  ut LIMIT on %s",
1690: 20 7a 53 74 6d 74 54 79 70 65 29 3b 0a 20 20 20   zStmtType);.   
16a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
16b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
16c0: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
16d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
16e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  e(pParse->db, pO
16f0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 72 65 74  rderBy);.    ret
1700: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1710: 20 57 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   We only need to
1720: 20 67 65 6e 65 72 61 74 65 20 61 20 73 65 6c 65   generate a sele
1730: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66  ct expression if
1740: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
1750: 20 6c 69 6d 69 74 2f 6f 66 66 73 65 74 20 74 65   limit/offset te
1760: 72 6d 20 74 6f 20 65 6e 66 6f 72 63 65 2e 0a 20  rm to enforce.. 
1770: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69 74   */.  if( pLimit
1780: 20 3d 3d 20 30 20 29 20 7b 0a 20 20 20 20 72 65   == 0 ) {.    re
1790: 74 75 72 6e 20 70 57 68 65 72 65 3b 0a 20 20 7d  turn pWhere;.  }
17a0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17b0: 61 20 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  a select express
17c0: 69 6f 6e 20 74 72 65 65 20 74 6f 20 65 6e 66 6f  ion tree to enfo
17d0: 72 63 65 20 74 68 65 20 6c 69 6d 69 74 2f 6f 66  rce the limit/of
17e0: 66 73 65 74 20 0a 20 20 2a 2a 20 74 65 72 6d 20  fset .  ** term 
17f0: 66 6f 72 20 74 68 65 20 44 45 4c 45 54 45 20 6f  for the DELETE o
1800: 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
1810: 6e 74 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  nt.  For example
1820: 3a 0a 20 20 2a 2a 20 20 20 44 45 4c 45 54 45 20  :.  **   DELETE 
1830: 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45  FROM table_a WHE
1840: 52 45 20 63 6f 6c 31 3d 31 20 4f 52 44 45 52 20  RE col1=1 ORDER 
1850: 42 59 20 63 6f 6c 32 20 4c 49 4d 49 54 20 31 20  BY col2 LIMIT 1 
1860: 4f 46 46 53 45 54 20 31 0a 20 20 2a 2a 20 62 65  OFFSET 1.  ** be
1870: 63 6f 6d 65 73 3a 0a 20 20 2a 2a 20 20 20 44 45  comes:.  **   DE
1880: 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f  LETE FROM table_
1890: 61 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e  a WHERE rowid IN
18a0: 20 28 20 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   ( .  **     SEL
18b0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
18c0: 61 62 6c 65 5f 61 20 57 48 45 52 45 20 63 6f 6c  able_a WHERE col
18d0: 31 3d 31 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  1=1 ORDER BY col
18e0: 32 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54  2 LIMIT 1 OFFSET
18f0: 20 31 0a 20 20 2a 2a 20 20 20 29 3b 0a 20 20 2a   1.  **   );.  *
1900: 2f 0a 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  /..  pTab = pSrc
1910: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
1920: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1930: 29 20 29 7b 0a 20 20 20 20 70 4c 68 73 20 3d 20  ) ){.    pLhs = 
1940: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1950: 72 73 65 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20  rse, TK_ROW, 0, 
1960: 30 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  0);.    pEList =
1970: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1980: 41 70 70 65 6e 64 28 0a 20 20 20 20 20 20 20 20  Append(.        
1990: 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
19a0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
19b0: 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 29 0a 20 20  TK_ROW, 0, 0).  
19c0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
19d0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
19e0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
19f0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
1a00: 20 69 66 28 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f   if( pPk->nKeyCo
1a10: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 63 6f  l==1 ){.      co
1a20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
1a30: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b  = pTab->aCol[pPk
1a40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 7a  ->aiColumn[0]].z
1a50: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4c 68 73  Name;.      pLhs
1a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1a70: 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1a80: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
1a90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1aa0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1ab0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
1ac0: 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 29  , TK_ID, zName))
1ad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ae0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e  for(i=0; i<pPk->
1b00: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1b10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
1b20: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1b30: 20 54 4b 5f 49 44 2c 20 70 54 61 62 2d 3e 61 43   TK_ID, pTab->aC
1b40: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
1b50: 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  [i]].zName);.   
1b60: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71       pEList = sq
1b70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1b80: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 4c 69  end(pParse, pELi
1b90: 73 74 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  st, p);.      }.
1ba0: 20 20 20 20 20 20 70 4c 68 73 20 3d 20 73 71 6c        pLhs = sql
1bb0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1bc0: 2c 20 54 4b 5f 56 45 43 54 4f 52 2c 20 30 2c 20  , TK_VECTOR, 0, 
1bd0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  0);.      if( pL
1be0: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  hs ){.        pL
1bf0: 68 73 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  hs->x.pList = sq
1c00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1c10: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
1c20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c30: 20 7d 0a 0a 20 20 2f 2a 20 64 75 70 6c 69 63 61   }..  /* duplica
1c40: 74 65 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  te the FROM clau
1c50: 73 65 20 61 73 20 69 74 20 69 73 20 6e 65 65 64  se as it is need
1c60: 65 64 20 62 79 20 62 6f 74 68 20 74 68 65 20 44  ed by both the D
1c70: 45 4c 45 54 45 2f 55 50 44 41 54 45 20 74 72 65  ELETE/UPDATE tre
1c80: 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 53  e.  ** and the S
1c90: 45 4c 45 43 54 20 73 75 62 74 72 65 65 2e 20 2a  ELECT subtree. *
1ca0: 2f 0a 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  /.  pSrc->a[0].p
1cb0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 53 65 6c 65  Tab = 0;.  pSele
1cc0: 63 74 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ctSrc = sqlite3S
1cd0: 72 63 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  rcListDup(pParse
1ce0: 2d 3e 64 62 2c 20 70 53 72 63 2c 20 30 29 3b 0a  ->db, pSrc, 0);.
1cf0: 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61    pSrc->a[0].pTa
1d00: 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53 72 63  b = pTab;.  pSrc
1d10: 2d 3e 61 5b 30 5d 2e 70 49 42 49 6e 64 65 78 20  ->a[0].pIBIndex 
1d20: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 67 65 6e 65 72  = 0;..  /* gener
1d30: 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 65  ate the SELECT e
1d40: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
1d50: 2a 2f 0a 20 20 70 53 65 6c 65 63 74 20 3d 20 73  */.  pSelect = s
1d60: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
1d70: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
1d80: 70 53 65 6c 65 63 74 53 72 63 2c 20 70 57 68 65  pSelectSrc, pWhe
1d90: 72 65 2c 20 30 20 2c 30 2c 20 0a 20 20 20 20 20  re, 0 ,0, .     
1da0: 20 70 4f 72 64 65 72 42 79 2c 30 2c 70 4c 69 6d   pOrderBy,0,pLim
1db0: 69 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 6e 6f  it.  );..  /* no
1dc0: 77 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 6e  w generate the n
1dd0: 65 77 20 57 48 45 52 45 20 72 6f 77 69 64 20 49  ew WHERE rowid I
1de0: 4e 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  N clause for the
1df0: 20 44 45 4c 45 54 45 2f 55 44 50 41 54 45 20 2a   DELETE/UDPATE *
1e00: 2f 0a 20 20 70 49 6e 43 6c 61 75 73 65 20 3d 20  /.  pInClause = 
1e10: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1e20: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 4c 68 73  rse, TK_IN, pLhs
1e30: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , 0);.  sqlite3P
1e40: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
1e50: 61 72 73 65 2c 20 70 49 6e 43 6c 61 75 73 65 2c  arse, pInClause,
1e60: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74   pSelect);.  ret
1e70: 75 72 6e 20 70 49 6e 43 6c 61 75 73 65 3b 0a 7d  urn pInClause;.}
1e80: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1e90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1ea0: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
1eb0: 49 4d 49 54 29 20 2a 2f 0a 20 20 20 20 20 20 20  IMIT) */.       
1ec0: 2f 2a 20 20 20 20 20 20 26 26 20 21 64 65 66 69  /*      && !defi
1ed0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ee0: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a  SUBQUERY) */../*
1ef0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1f00: 65 20 66 6f 72 20 61 20 44 45 4c 45 54 45 20 46  e for a DELETE F
1f10: 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ROM statement..*
1f20: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
1f30: 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a 20  FROM table_wxyz 
1f40: 57 48 45 52 45 20 61 3c 35 20 41 4e 44 20 62 20  WHERE a<5 AND b 
1f50: 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20  NOT NULL;.**    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1f70: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f  ______/       \_
1f80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1f90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fa0: 20 20 20 20 20 70 54 61 62 4c 69 73 74 20 20 20       pTabList   
1fb0: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
1fc0: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
1fd0: 33 44 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20 50  3DeleteFrom(.  P
1fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2000: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2010: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2020: 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  st,     /* The t
2030: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
2040: 77 65 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65  we should delete
2050: 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78 70   things */.  Exp
2060: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
2070: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2080: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2090: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 4c   null */.  ExprL
20a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
20b0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
20c0: 61 75 73 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c  ause. May be nul
20d0: 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  l */.  Expr *pLi
20e0: 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mit           /*
20f0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 4d   LIMIT clause. M
2100: 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ay be null */.){
2110: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2130: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
2140: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 54 61  e engine */.  Ta
2150: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
2160: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2170: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 72 65 63  e from which rec
2180: 6f 72 64 73 20 77 69 6c 6c 20 62 65 20 64 65 6c  ords will be del
2190: 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  eted */.  int i;
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21c0: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
21d0: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
21e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
21f0: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
2200: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
2210: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
2220: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2230: 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  er indices of th
2240: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
2250: 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
2260: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2270: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2280: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74  le */.  int iDat
2290: 61 43 75 72 20 3d 20 30 3b 20 20 20 20 20 20 2f  aCur = 0;      /
22a0: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  * VDBE cursor fo
22b0: 72 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  r the canonical 
22c0: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
22d0: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 30   int iIdxCur = 0
22e0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ;       /* Curso
22f0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
2300: 66 69 72 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  first index */. 
2310: 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20   int nIdx;      
2320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2330: 72 20 6f 66 20 69 6e 64 69 63 65 73 20 2a 2f 0a  r of indices */.
2340: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
2360: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
2370: 75 72 65 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e  ure */.  AuthCon
2380: 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20  text sContext;  
2390: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
23a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
23b0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
23c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
23d0: 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  text to resolve 
23e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a  expressions in *
23f0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
2400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2410: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
2420: 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74 20 3d 20  .  int memCnt = 
2430: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  0;        /* Mem
2440: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 66 6f  ory cell used fo
2450: 72 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 69 6e  r change countin
2460: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 61 75 74  g */.  int rcaut
2470: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h;            /*
2480: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
2490: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
24a0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
24b0: 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20 20 20  nt eOnePass;    
24c0: 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53 53        /* ONEPASS
24d0: 5f 4f 46 46 20 6f 72 20 5f 53 49 4e 47 4c 45 20  _OFF or _SINGLE 
24e0: 6f 72 20 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 69  or _MULTI */.  i
24f0: 6e 74 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  nt aiCurOnePass[
2500: 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20 77 72 69  2];   /* The wri
2510: 74 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  te cursors opene
2520: 64 20 62 79 20 57 48 45 52 45 5f 4f 4e 45 50 41  d by WHERE_ONEPA
2530: 53 53 20 2a 2f 0a 20 20 75 38 20 2a 61 54 6f 4f  SS */.  u8 *aToO
2540: 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  pen = 0;       /
2550: 2a 20 4f 70 65 6e 20 63 75 72 73 6f 72 20 69 54  * Open cursor iT
2560: 61 62 43 75 72 2b 6a 20 69 66 20 61 54 6f 4f 70  abCur+j if aToOp
2570: 65 6e 5b 6a 5d 20 69 73 20 74 72 75 65 20 2a 2f  en[j] is true */
2580: 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20  .  Index *pPk;  
2590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
25b0: 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ex on the table 
25c0: 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 30  */.  int iPk = 0
25d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
25e0: 69 72 73 74 20 6f 66 20 6e 50 6b 20 72 65 67 69  irst of nPk regi
25f0: 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 50 52  sters holding PR
2600: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20  IMARY KEY value 
2610: 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 20 3d 20 31  */.  i16 nPk = 1
2620: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2630: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2640: 20 69 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20   in the PRIMARY 
2650: 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20 69 4b 65  KEY */.  int iKe
2660: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2670: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
2680: 6f 6c 64 69 6e 67 20 6b 65 79 20 6f 66 20 72 6f  olding key of ro
2690: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
26a0: 2a 2f 0a 20 20 69 31 36 20 6e 4b 65 79 3b 20 20  */.  i16 nKey;  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26c0: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
26d0: 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 72 6f 77  cells in the row
26e0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 45   key */.  int iE
26f0: 70 68 43 75 72 20 3d 20 30 3b 20 20 20 20 20 20  phCur = 0;      
2700: 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74 61   /* Ephemeral ta
2710: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ble holding all 
2720: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
2730: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  es */.  int iRow
2740: 53 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Set = 0;       /
2750: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 72  * Register for r
2760: 6f 77 73 65 74 20 6f 66 20 72 6f 77 73 20 74 6f  owset of rows to
2770: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
2780: 20 61 64 64 72 42 79 70 61 73 73 20 3d 20 30 3b   addrBypass = 0;
2790: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
27a0: 66 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  f jump over the 
27b0: 64 65 6c 65 74 65 20 6c 6f 67 69 63 20 2a 2f 0a  delete logic */.
27c0: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 20 3d    int addrLoop =
27d0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20   0;      /* Top 
27e0: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f  of the delete lo
27f0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
2800: 45 70 68 4f 70 65 6e 20 3d 20 30 3b 20 20 20 2f  EphOpen = 0;   /
2810: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
2820: 20 6f 70 65 6e 20 74 68 65 20 45 70 68 65 6d 65   open the Epheme
2830: 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ral table */.  i
2840: 6e 74 20 62 43 6f 6d 70 6c 65 78 3b 20 20 20 20  nt bComplex;    
2850: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2860: 20 74 68 65 72 65 20 61 72 65 20 74 72 69 67 67   there are trigg
2870: 65 72 73 20 6f 72 20 46 4b 73 20 6f 72 0a 20 20  ers or FKs or.  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 71 75 65         ** subque
28a0: 72 69 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ries in the WHER
28b0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 0a 23 69  E clause */. .#i
28c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28d0: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
28e0: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
28f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2900: 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74   if attempting t
2910: 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 61 20  o delete from a 
2920: 76 69 65 77 20 2a 2f 0a 20 20 54 72 69 67 67 65  view */.  Trigge
2930: 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20  r *pTrigger;    
2940: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2950: 66 20 74 61 62 6c 65 20 74 72 69 67 67 65 72 73  f table triggers
2960: 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
2970: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
2980: 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20  t(&sContext, 0, 
2990: 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29  sizeof(sContext)
29a0: 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
29b0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
29c0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
29d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
29e0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f      goto delete_
29f0: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
2a00: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
2a10: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  List->nSrc==1 );
2a20: 0a 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ...  /* Locate t
2a30: 68 65 20 74 61 62 6c 65 20 77 68 69 63 68 20 77  he table which w
2a40: 65 20 77 61 6e 74 20 74 6f 20 64 65 6c 65 74 65  e want to delete
2a50: 2e 20 20 54 68 69 73 20 74 61 62 6c 65 20 68 61  .  This table ha
2a60: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 75 74  s to be.  ** put
2a70: 20 69 6e 20 61 6e 20 53 72 63 4c 69 73 74 20 73   in an SrcList s
2a80: 74 72 75 63 74 75 72 65 20 62 65 63 61 75 73 65  tructure because
2a90: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 75 62   some of the sub
2aa0: 72 6f 75 74 69 6e 65 73 20 77 65 0a 20 20 2a 2a  routines we.  **
2ab0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 69 6e 67   will be calling
2ac0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
2ad0: 20 77 6f 72 6b 20 77 69 74 68 20 6d 75 6c 74 69   work with multi
2ae0: 70 6c 65 20 74 61 62 6c 65 73 20 61 6e 64 20 65  ple tables and e
2af0: 78 70 65 63 74 0a 20 20 2a 2a 20 61 6e 20 53 72  xpect.  ** an Sr
2b00: 63 4c 69 73 74 2a 20 70 61 72 61 6d 65 74 65 72  cList* parameter
2b10: 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74   instead of just
2b20: 20 61 20 54 61 62 6c 65 2a 20 70 61 72 61 6d 65   a Table* parame
2b30: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ter..  */.  pTab
2b40: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
2b50: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
2b60: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28  pTabList);.  if(
2b70: 20 70 54 61 62 3d 3d 30 20 29 20 20 67 6f 74 6f   pTab==0 )  goto
2b80: 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65   delete_from_cle
2b90: 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  anup;..  /* Figu
2ba0: 72 65 20 6f 75 74 20 69 66 20 77 65 20 68 61 76  re out if we hav
2bb0: 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 61  e any triggers a
2bc0: 6e 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  nd if the table 
2bd0: 62 65 69 6e 67 0a 20 20 2a 2a 20 64 65 6c 65 74  being.  ** delet
2be0: 65 64 20 66 72 6f 6d 20 69 73 20 61 20 76 69 65  ed from is a vie
2bf0: 77 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  w.  */.#ifndef S
2c00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
2c10: 45 52 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  ER.  pTrigger = 
2c20: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45  sqlite3TriggersE
2c30: 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  xist(pParse, pTa
2c40: 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c  b, TK_DELETE, 0,
2c50: 20 30 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20   0);.  isView = 
2c60: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30  pTab->pSelect!=0
2c70: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2c80: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
2c90: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65  fine isView 0.#e
2ca0: 6e 64 69 66 0a 20 20 62 43 6f 6d 70 6c 65 78 20  ndif.  bComplex 
2cb0: 3d 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71  = pTrigger || sq
2cc0: 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28  lite3FkRequired(
2cd0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
2ce0: 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
2cf0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75  TE_OMIT_VIEW.# u
2d00: 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64 65  ndef isView.# de
2d10: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65  fine isView 0.#e
2d20: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2d30: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
2d40: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 20  E_DELETE_LIMIT. 
2d50: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
2d60: 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
2d70: 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 0a  ite3LimitWhere(.
2d80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2d90: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2da0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d  , pOrderBy, pLim
2db0: 69 74 2c 20 22 44 45 4c 45 54 45 22 0a 20 20 20  it, "DELETE".   
2dc0: 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   );.    pOrderBy
2dd0: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74   = 0;.    pLimit
2de0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2df0: 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
2e00: 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 2c  s really a view,
2e10: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68 61   make sure it ha
2e20: 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
2e30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ed..  */.  if( s
2e40: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
2e50: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2e60: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
2e70: 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  to delete_from_c
2e80: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 69  leanup;.  }..  i
2e90: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
2ea0: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
2eb0: 62 2c 20 28 70 54 72 69 67 67 65 72 3f 31 3a 30  b, (pTrigger?1:0
2ec0: 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  )) ){.    goto d
2ed0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
2ee0: 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  up;.  }.  iDb = 
2ef0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2f00: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2f10: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
2f20: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
2f30: 3b 0a 20 20 72 63 61 75 74 68 20 3d 20 73 71 6c  ;.  rcauth = sql
2f40: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2f50: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
2f60: 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
2f70: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
2fa0: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65  DbSName);.  asse
2fb0: 72 74 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49  rt( rcauth==SQLI
2fc0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 61 75 74 68 3d  TE_OK || rcauth=
2fd0: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 7c 7c 20  =SQLITE_DENY || 
2fe0: 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 49  rcauth==SQLITE_I
2ff0: 47 4e 4f 52 45 20 29 3b 0a 20 20 69 66 28 20 72  GNORE );.  if( r
3000: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45  cauth==SQLITE_DE
3010: 4e 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  NY ){.    goto d
3020: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
3030: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
3040: 28 21 69 73 56 69 65 77 20 7c 7c 20 70 54 72 69  (!isView || pTri
3050: 67 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  gger);..  /* Ass
3060: 69 67 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ign cursor numbe
3070: 72 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  rs to the table 
3080: 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  and all its indi
3090: 63 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ces..  */.  asse
30a0: 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  rt( pTabList->nS
30b0: 72 63 3d 3d 31 20 29 3b 0a 20 20 69 54 61 62 43  rc==1 );.  iTabC
30c0: 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ur = pTabList->a
30d0: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50  [0].iCursor = pP
30e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
30f0: 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78  for(nIdx=0, pIdx
3100: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
3110: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
3120: 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 0a  pNext, nIdx++){.
3130: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
3140: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ++;.  }..  /* St
3150: 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f 6e  art the view con
3160: 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20  text.  */.  if( 
3170: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71  isView ){.    sq
3180: 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74  lite3AuthContext
3190: 50 75 73 68 28 70 50 61 72 73 65 2c 20 26 73 43  Push(pParse, &sC
31a0: 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a 4e  ontext, pTab->zN
31b0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
31c0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
31d0: 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
31e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
31f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
3200: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  v==0 ){.    goto
3210: 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65   delete_from_cle
3220: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
3230: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
3240: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
3250: 6f 75 6e 74 43 68 61 6e 67 65 73 28 76 29 3b 0a  ountChanges(v);.
3260: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
3270: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
3280: 72 73 65 2c 20 62 43 6f 6d 70 6c 65 78 2c 20 69  rse, bComplex, i
3290: 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Db);..  /* If we
32a0: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 64   are trying to d
32b0: 65 6c 65 74 65 20 66 72 6f 6d 20 61 20 76 69 65  elete from a vie
32c0: 77 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20  w, realize that 
32d0: 76 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  view into.  ** a
32e0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
32f0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  e..  */.#if !def
3300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3310: 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e  _VIEW) && !defin
3320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
3330: 52 49 47 47 45 52 29 0a 20 20 69 66 28 20 69 73  RIGGER).  if( is
3340: 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  View ){.    sqli
3350: 74 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69  te3MaterializeVi
3360: 65 77 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ew(pParse, pTab,
3370: 20 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65   .        pWhere
3380: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d  , pOrderBy, pLim
3390: 69 74 2c 20 69 54 61 62 43 75 72 0a 20 20 20 20  it, iTabCur.    
33a0: 29 3b 0a 20 20 20 20 69 44 61 74 61 43 75 72 20  );.    iDataCur 
33b0: 3d 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62  = iIdxCur = iTab
33c0: 43 75 72 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  Cur;.    pOrderB
33d0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69  y = 0;.    pLimi
33e0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  t = 0;.  }.#endi
33f0: 66 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  f..  /* Resolve 
3400: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3410: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
3420: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ause..  */.  mem
3430: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
3440: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
3450: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
3460: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
3470: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 69   = pTabList;.  i
3480: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
3490: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
34a0: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
34b0: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
34c0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
34d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
34e0: 68 65 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68  he counter of th
34f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
3500: 20 64 65 6c 65 74 65 64 2c 20 69 66 0a 20 20 2a   deleted, if.  *
3510: 2a 20 77 65 20 61 72 65 20 63 6f 75 6e 74 69 6e  * we are countin
3520: 67 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  g rows..  */.  i
3530: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
3540: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
3550: 29 21 3d 30 0a 20 20 20 26 26 20 21 70 50 61 72  )!=0.   && !pPar
3560: 73 65 2d 3e 6e 65 73 74 65 64 0a 20 20 20 26 26  se->nested.   &&
3570: 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
3580: 65 72 54 61 62 0a 20 20 29 7b 0a 20 20 20 20 6d  erTab.  ){.    m
3590: 65 6d 43 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  emCnt = ++pParse
35a0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
35b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
35d0: 6d 65 6d 43 6e 74 29 3b 0a 20 20 7d 0a 0a 23 69  memCnt);.  }..#i
35e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35f0: 54 5f 54 52 55 4e 43 41 54 45 5f 4f 50 54 49 4d  T_TRUNCATE_OPTIM
3600: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 70 65  IZATION.  /* Spe
3610: 63 69 61 6c 20 63 61 73 65 3a 20 41 20 44 45 4c  cial case: A DEL
3620: 45 54 45 20 77 69 74 68 6f 75 74 20 61 20 57 48  ETE without a WH
3630: 45 52 45 20 63 6c 61 75 73 65 20 64 65 6c 65 74  ERE clause delet
3640: 65 73 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  es everything.. 
3650: 20 2a 2a 20 49 74 20 69 73 20 65 61 73 69 65 72   ** It is easier
3660: 20 6a 75 73 74 20 74 6f 20 65 72 61 73 65 20 74   just to erase t
3670: 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e 20  he whole table. 
3680: 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
3690: 20 33 2e 36 2e 35 2c 0a 20 20 2a 2a 20 74 68 69   3.6.5,.  ** thi
36a0: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
36b0: 61 75 73 65 64 20 74 68 65 20 72 6f 77 20 63 68  aused the row ch
36c0: 61 6e 67 65 20 63 6f 75 6e 74 20 28 74 68 65 20  ange count (the 
36d0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
36e0: 79 20 0a 20 20 2a 2a 20 41 50 49 20 66 75 6e 63  y .  ** API func
36f0: 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 63 6f 75  tion sqlite3_cou
3700: 6e 74 5f 63 68 61 6e 67 65 73 29 20 74 6f 20 62  nt_changes) to b
3710: 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  e set incorrectl
3720: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  y..  **.  ** The
3730: 20 22 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45   "rcauth==SQLITE
3740: 5f 4f 4b 22 20 74 65 72 6d 73 20 69 73 20 74 68  _OK" terms is th
3750: 65 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  e.  ** IMPLEMENT
3760: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 37 32 32  ATION-OF: R-1722
3770: 38 2d 33 37 31 32 34 20 49 66 20 74 68 65 20 61  8-37124 If the a
3780: 63 74 69 6f 6e 20 63 6f 64 65 20 69 73 20 53 51  ction code is SQ
3790: 4c 49 54 45 5f 44 45 4c 45 54 45 20 61 6e 64 0a  LITE_DELETE and.
37a0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 62 61 63    ** the callbac
37b0: 6b 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  k returns SQLITE
37c0: 5f 49 47 4e 4f 52 45 20 74 68 65 6e 20 74 68 65  _IGNORE then the
37d0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
37e0: 6e 20 70 72 6f 63 65 65 64 73 20 62 75 74 0a 20  n proceeds but. 
37f0: 20 2a 2a 20 74 68 65 20 74 72 75 6e 63 61 74 65   ** the truncate
3800: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
3810: 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 61 6c   disabled and al
3820: 6c 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  l rows are delet
3830: 65 64 0a 20 20 2a 2a 20 69 6e 64 69 76 69 64 75  ed.  ** individu
3840: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ally..  */.  if(
3850: 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f   rcauth==SQLITE_
3860: 4f 4b 0a 20 20 20 26 26 20 70 57 68 65 72 65 3d  OK.   && pWhere=
3870: 3d 30 0a 20 20 20 26 26 20 21 62 43 6f 6d 70 6c  =0.   && !bCompl
3880: 65 78 0a 20 20 20 26 26 20 21 49 73 56 69 72 74  ex.   && !IsVirt
3890: 75 61 6c 28 70 54 61 62 29 0a 23 69 66 64 65 66  ual(pTab).#ifdef
38a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
38b0: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
38c0: 20 26 26 20 64 62 2d 3e 78 50 72 65 55 70 64 61   && db->xPreUpda
38d0: 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 0a 23 65  teCallback==0.#e
38e0: 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 61 73  ndif.  ){.    as
38f0: 73 65 72 74 28 20 21 69 73 56 69 65 77 20 29 3b  sert( !isView );
3900: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
3910: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
3920: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
3930: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
3940: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
3950: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
3960: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3970: 34 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 70  4(v, OP_Clear, p
3980: 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 20  Tab->tnum, iDb, 
3990: 6d 65 6d 43 6e 74 20 3f 20 6d 65 6d 43 6e 74 20  memCnt ? memCnt 
39a0: 3a 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  : -1,.          
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
39c0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54  ab->zName, P4_ST
39d0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
39e0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
39f0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
3a00: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
3a10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3a20: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
3a30: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
3a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3a50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
3a60: 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ar, pIdx->tnum, 
3a70: 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  iDb);.    }.  }e
3a80: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
3a90: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41  LITE_OMIT_TRUNCA
3aa0: 54 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  TE_OPTIMIZATION 
3ab0: 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 31 36 20 77  */.  {.    u16 w
3ac0: 63 66 20 3d 20 57 48 45 52 45 5f 4f 4e 45 50 41  cf = WHERE_ONEPA
3ad0: 53 53 5f 44 45 53 49 52 45 44 7c 57 48 45 52 45  SS_DESIRED|WHERE
3ae0: 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 7c 57  _DUPLICATES_OK|W
3af0: 48 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45 3b  HERE_SEEK_TABLE;
3b00: 0a 20 20 20 20 69 66 28 20 73 4e 43 2e 6e 63 46  .    if( sNC.ncF
3b10: 6c 61 67 73 20 26 20 4e 43 5f 56 61 72 53 65 6c  lags & NC_VarSel
3b20: 65 63 74 20 29 20 62 43 6f 6d 70 6c 65 78 20 3d  ect ) bComplex =
3b30: 20 31 3b 0a 20 20 20 20 77 63 66 20 7c 3d 20 28   1;.    wcf |= (
3b40: 62 43 6f 6d 70 6c 65 78 20 3f 20 30 20 3a 20 57  bComplex ? 0 : W
3b50: 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
3b60: 54 49 52 4f 57 29 3b 0a 20 20 20 20 69 66 28 20  TIROW);.    if( 
3b70: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
3b80: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
3b90: 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 69 6e   rowid table, in
3ba0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52 6f 77  itialize the Row
3bb0: 53 65 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  Set to an empty 
3bc0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 50 6b  set */.      pPk
3bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 50 6b 20   = 0;.      nPk 
3be0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 52 6f 77 53  = 1;.      iRowS
3bf0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
3c00: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
3c10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3c20: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 6f 77  OP_Null, 0, iRow
3c30: 53 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Set);.    }else{
3c40: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  .      /* For a 
3c50: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3c60: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 6e 20 65  ble, create an e
3c70: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75  phemeral table u
3c80: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
3c90: 68 6f 6c 64 20 61 6c 6c 20 70 72 69 6d 61 72 79  hold all primary
3ca0: 20 6b 65 79 73 20 66 6f 72 20 72 6f 77 73 20 74   keys for rows t
3cb0: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 2a 2f  o be deleted. */
3cc0: 0a 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  .      pPk = sql
3cd0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
3ce0: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
3cf0: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
3d00: 29 3b 0a 20 20 20 20 20 20 6e 50 6b 20 3d 20 70  );.      nPk = p
3d10: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
3d20: 20 20 20 69 50 6b 20 3d 20 70 50 61 72 73 65 2d     iPk = pParse-
3d30: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
3d40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
3d50: 50 6b 3b 0a 20 20 20 20 20 20 69 45 70 68 43 75  Pk;.      iEphCu
3d60: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
3d70: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 45 70  ++;.      addrEp
3d80: 68 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 56  hOpen = sqlite3V
3d90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3da0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
3db0: 45 70 68 43 75 72 2c 20 6e 50 6b 29 3b 0a 20 20  EphCur, nPk);.  
3dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3dd0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
3de0: 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 7d 0a  se, pPk);.    }.
3df0: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72    .    /* Constr
3e00: 75 63 74 20 61 20 71 75 65 72 79 20 74 6f 20 66  uct a query to f
3e10: 69 6e 64 20 74 68 65 20 72 6f 77 69 64 20 6f 72  ind the rowid or
3e20: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f 72   primary key for
3e30: 20 65 76 65 72 79 20 72 6f 77 0a 20 20 20 20 2a   every row.    *
3e40: 2a 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c  * to be deleted,
3e50: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57 48   based on the WH
3e60: 45 52 45 20 63 6c 61 75 73 65 2e 20 53 65 74 20  ERE clause. Set 
3e70: 76 61 72 69 61 62 6c 65 20 65 4f 6e 65 50 61 73  variable eOnePas
3e80: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 64 69  s.    ** to indi
3e90: 63 61 74 65 20 74 68 65 20 73 74 72 61 74 65 67  cate the strateg
3ea0: 79 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  y used to implem
3eb0: 65 6e 74 20 74 68 69 73 20 64 65 6c 65 74 65 3a  ent this delete:
3ec0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
3ed0: 4f 4e 45 50 41 53 53 5f 4f 46 46 3a 20 20 20 20  ONEPASS_OFF:    
3ee0: 54 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  Two-pass approac
3ef0: 68 20 2d 20 75 73 65 20 61 20 46 49 46 4f 20 66  h - use a FIFO f
3f00: 6f 72 20 72 6f 77 69 64 73 2f 50 4b 20 76 61 6c  or rowids/PK val
3f10: 75 65 73 2e 0a 20 20 20 20 2a 2a 20 20 4f 4e 45  ues..    **  ONE
3f20: 50 41 53 53 5f 53 49 4e 47 4c 45 3a 20 4f 6e 65  PASS_SINGLE: One
3f30: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 2d  -pass approach -
3f40: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77   at most one row
3f50: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3f60: 20 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3a    ONEPASS_MULTI:
3f70: 20 20 4f 6e 65 2d 70 61 73 73 20 61 70 70 72 6f    One-pass appro
3f80: 61 63 68 20 2d 20 61 6e 79 20 6e 75 6d 62 65 72  ach - any number
3f90: 20 6f 66 20 72 6f 77 73 20 6d 61 79 20 62 65 20   of rows may be 
3fa0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
3fb0: 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
3fc0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
3fd0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
3fe0: 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20 77   pWhere, 0, 0, w
3ff0: 63 66 2c 20 69 54 61 62 43 75 72 2b 31 29 3b 0a  cf, iTabCur+1);.
4000: 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
4010: 30 20 29 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f  0 ) goto delete_
4020: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
4030: 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c    eOnePass = sql
4040: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
4050: 73 73 28 70 57 49 6e 66 6f 2c 20 61 69 43 75 72  ss(pWInfo, aiCur
4060: 4f 6e 65 50 61 73 73 29 3b 0a 20 20 20 20 61 73  OnePass);.    as
4070: 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
4080: 70 54 61 62 29 3d 3d 30 20 7c 7c 20 65 4f 6e 65  pTab)==0 || eOne
4090: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4d 55  Pass!=ONEPASS_MU
40a0: 4c 54 49 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LTI );.    asser
40b0: 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  t( IsVirtual(pTa
40c0: 62 29 20 7c 7c 20 62 43 6f 6d 70 6c 65 78 20 7c  b) || bComplex |
40d0: 7c 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  | eOnePass!=ONEP
40e0: 41 53 53 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ASS_OFF );.    i
40f0: 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  f( eOnePass!=ONE
4100: 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 20 73 71  PASS_SINGLE ) sq
4110: 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
4120: 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20 20  pParse);.  .    
4130: 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  /* Keep track of
4140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
4150: 6f 77 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ows to be delete
4160: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d  d */.    if( mem
4170: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
4180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4190: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 6d 65 6d  , OP_AddImm, mem
41a0: 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  Cnt, 1);.    }. 
41b0: 20 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74   .    /* Extract
41c0: 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 70 72   the rowid or pr
41d0: 69 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 74 68  imary key for th
41e0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f  e current row */
41f0: 0a 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b 0a  .    if( pPk ){.
4200: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4210: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
4220: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
4230: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
4240: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4250: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
4260: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
4270: 61 62 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  ab, iTabCur,.   
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42a0: 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
42b0: 6d 6e 5b 69 5d 2c 20 69 50 6b 2b 69 29 3b 0a 20  mn[i], iPk+i);. 
42c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4b 65       }.      iKe
42d0: 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65 6c  y = iPk;.    }el
42e0: 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d  se{.      iKey =
42f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4310: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
4320: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
4330: 69 54 61 62 43 75 72 2c 20 2d 31 2c 20 69 4b 65  iTabCur, -1, iKe
4340: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  y);.    }.  .   
4350: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f   if( eOnePass!=O
4360: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
4370: 20 20 20 20 2f 2a 20 46 6f 72 20 4f 4e 45 50 41      /* For ONEPA
4380: 53 53 2c 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73  SS, no need to s
4390: 74 6f 72 65 20 74 68 65 20 72 6f 77 69 64 2f 70  tore the rowid/p
43a0: 72 69 6d 61 72 79 2d 6b 65 79 2e 20 54 68 65 72  rimary-key. Ther
43b0: 65 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20  e is only.      
43c0: 2a 2a 20 6f 6e 65 2c 20 73 6f 20 6a 75 73 74 20  ** one, so just 
43d0: 6b 65 65 70 20 69 74 20 69 6e 20 69 74 73 20 72  keep it in its r
43e0: 65 67 69 73 74 65 72 28 73 29 20 61 6e 64 20 66  egister(s) and f
43f0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
4400: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65  he.      ** dele
4410: 74 65 20 63 6f 64 65 2e 20 20 2a 2f 0a 20 20 20  te code.  */.   
4420: 20 20 20 6e 4b 65 79 20 3d 20 6e 50 6b 3b 20 2f     nKey = nPk; /
4430: 2a 20 4f 50 5f 46 6f 75 6e 64 20 77 69 6c 6c 20  * OP_Found will 
4440: 75 73 65 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  use an unpacked 
4450: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 61 54 6f  key */.      aTo
4460: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Open = sqlite3Db
4470: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
4480: 6e 49 64 78 2b 32 29 3b 0a 20 20 20 20 20 20 69  nIdx+2);.      i
4490: 66 28 20 61 54 6f 4f 70 65 6e 3d 3d 30 20 29 7b  f( aToOpen==0 ){
44a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
44b0: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
44c0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
44d0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
44e0: 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
44f0: 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f 70 65 6e    memset(aToOpen
4500: 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b 0a 20 20  , 1, nIdx+1);.  
4510: 20 20 20 20 61 54 6f 4f 70 65 6e 5b 6e 49 64 78      aToOpen[nIdx
4520: 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  +1] = 0;.      i
4530: 66 28 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  f( aiCurOnePass[
4540: 30 5d 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e 5b  0]>=0 ) aToOpen[
4550: 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 2d  aiCurOnePass[0]-
4560: 69 54 61 62 43 75 72 5d 20 3d 20 30 3b 0a 20 20  iTabCur] = 0;.  
4570: 20 20 20 20 69 66 28 20 61 69 43 75 72 4f 6e 65      if( aiCurOne
4580: 50 61 73 73 5b 31 5d 3e 3d 30 20 29 20 61 54 6f  Pass[1]>=0 ) aTo
4590: 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61 73  Open[aiCurOnePas
45a0: 73 5b 31 5d 2d 69 54 61 62 43 75 72 5d 20 3d 20  s[1]-iTabCur] = 
45b0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  0;.      if( add
45c0: 72 45 70 68 4f 70 65 6e 20 29 20 73 71 6c 69 74  rEphOpen ) sqlit
45d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
45e0: 6f 70 28 76 2c 20 61 64 64 72 45 70 68 4f 70 65  op(v, addrEphOpe
45f0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
4600: 20 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b 0a       if( pPk ){.
4610: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
4620: 68 65 20 50 4b 20 6b 65 79 20 66 6f 72 20 74 68  he PK key for th
4630: 69 73 20 72 6f 77 20 74 6f 20 74 68 65 20 74 65  is row to the te
4640: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 2a 2f  mporary table */
4650: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
4660: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
4670: 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 30          nKey = 0
4680: 3b 20 20 20 2f 2a 20 5a 65 72 6f 20 74 65 6c 6c  ;   /* Zero tell
4690: 73 20 4f 50 5f 46 6f 75 6e 64 20 74 6f 20 75 73  s OP_Found to us
46a0: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
46b0: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  y */.        sql
46c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
46d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
46e0: 20 69 50 6b 2c 20 6e 50 6b 2c 20 69 4b 65 79 2c   iPk, nPk, iKey,
46f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4700: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
4710: 79 53 74 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  yStr(pParse->db,
4720: 20 70 50 6b 29 2c 20 6e 50 6b 29 3b 0a 20 20 20   pPk), nPk);.   
4730: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4740: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
4750: 49 64 78 49 6e 73 65 72 74 2c 20 69 45 70 68 43  IdxInsert, iEphC
4760: 75 72 2c 20 69 4b 65 79 2c 20 69 50 6b 2c 20 6e  ur, iKey, iPk, n
4770: 50 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pk);.      }else
4780: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  {.        /* Add
4790: 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
47a0: 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  e row to be dele
47b0: 74 65 64 20 74 6f 20 74 68 65 20 52 6f 77 53 65  ted to the RowSe
47c0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 4b 65  t */.        nKe
47d0: 79 20 3d 20 31 3b 20 20 2f 2a 20 4f 50 5f 44 65  y = 1;  /* OP_De
47e0: 66 65 72 72 65 64 53 65 65 6b 20 61 6c 77 61 79  ferredSeek alway
47f0: 73 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  s uses a single 
4800: 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20 20 20  rowid */.       
4810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4820: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41  p2(v, OP_RowSetA
4830: 64 64 2c 20 69 52 6f 77 53 65 74 2c 20 69 4b 65  dd, iRowSet, iKe
4840: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4850: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
4860: 68 69 73 20 44 45 4c 45 54 45 20 63 61 6e 6e 6f  his DELETE canno
4870: 74 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41 53  t use the ONEPAS
4880: 53 20 73 74 72 61 74 65 67 79 2c 20 74 68 69 73  S strategy, this
4890: 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
48a0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
48b0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28   loop */.    if(
48c0: 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41   eOnePass!=ONEPA
48d0: 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
48e0: 61 64 64 72 42 79 70 61 73 73 20 3d 20 73 71 6c  addrBypass = sql
48f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4900: 6c 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l(v);.    }else{
4910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
4920: 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
4930: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
4940: 55 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  Unless this is a
4950: 20 76 69 65 77 2c 20 6f 70 65 6e 20 63 75 72 73   view, open curs
4960: 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ors for the tabl
4970: 65 20 77 65 20 61 72 65 20 0a 20 20 20 20 2a 2a  e we are .    **
4980: 20 64 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61   deleting from a
4990: 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  nd all its indic
49a0: 65 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  es. If this is a
49b0: 20 76 69 65 77 2c 20 74 68 65 6e 20 74 68 65 0a   view, then the.
49c0: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 65 66 66 65      ** only effe
49d0: 63 74 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ct this statemen
49e0: 74 20 68 61 73 20 69 73 20 74 6f 20 66 69 72 65  t has is to fire
49f0: 20 74 68 65 20 49 4e 53 54 45 41 44 20 4f 46 20   the INSTEAD OF 
4a00: 0a 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 73  .    ** triggers
4a10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
4a20: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
4a30: 20 20 69 6e 74 20 69 41 64 64 72 4f 6e 63 65 20    int iAddrOnce 
4a40: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65  = 0;.      if( e
4a50: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
4a60: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20 20  _MULTI ){.      
4a70: 20 20 69 41 64 64 72 4f 6e 63 65 20 3d 20 73 71    iAddrOnce = sq
4a80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
4a90: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
4aa0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
4ac0: 63 61 73 65 28 20 49 73 56 69 72 74 75 61 6c 28  case( IsVirtual(
4ad0: 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20 73  pTab) );.      s
4ae0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41  qlite3OpenTableA
4af0: 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65  ndIndices(pParse
4b00: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57  , pTab, OP_OpenW
4b10: 72 69 74 65 2c 20 4f 50 46 4c 41 47 5f 46 4f 52  rite, OPFLAG_FOR
4b20: 44 45 4c 45 54 45 2c 0a 20 20 20 20 20 20 20 20  DELETE,.        
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 20 20 69 54 61 62 43 75 72           iTabCur
4b50: 2c 20 61 54 6f 4f 70 65 6e 2c 20 26 69 44 61 74  , aToOpen, &iDat
4b60: 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b  aCur, &iIdxCur);
4b70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4b80: 50 6b 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  Pk || IsVirtual(
4b90: 70 54 61 62 29 20 7c 7c 20 69 44 61 74 61 43 75  pTab) || iDataCu
4ba0: 72 3d 3d 69 54 61 62 43 75 72 20 29 3b 0a 20 20  r==iTabCur );.  
4bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 20      assert( pPk 
4bc0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
4bd0: 62 29 20 7c 7c 20 69 49 64 78 43 75 72 3d 3d 69  b) || iIdxCur==i
4be0: 44 61 74 61 43 75 72 2b 31 20 29 3b 0a 20 20 20  DataCur+1 );.   
4bf0: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d     if( eOnePass=
4c00: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29  =ONEPASS_MULTI )
4c10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4c20: 48 65 72 65 28 76 2c 20 69 41 64 64 72 4f 6e 63  Here(v, iAddrOnc
4c30: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
4c40: 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6c 6f 6f   /* Set up a loo
4c50: 70 20 6f 76 65 72 20 74 68 65 20 72 6f 77 69 64  p over the rowid
4c60: 73 2f 70 72 69 6d 61 72 79 2d 6b 65 79 73 20 74  s/primary-keys t
4c70: 68 61 74 20 77 65 72 65 20 66 6f 75 6e 64 20 69  hat were found i
4c80: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 77 68 65  n the.    ** whe
4c90: 72 65 2d 63 6c 61 75 73 65 20 6c 6f 6f 70 20 61  re-clause loop a
4ca0: 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bove..    */.   
4cb0: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f   if( eOnePass!=O
4cc0: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
4cd0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
4ce0: 3d 3d 6e 50 6b 20 29 3b 20 20 2f 2a 20 4f 50 5f  ==nPk );  /* OP_
4cf0: 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61  Found will use a
4d00: 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 2a  n unpacked key *
4d10: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  /.      if( !IsV
4d20: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
4d30: 61 54 6f 4f 70 65 6e 5b 69 44 61 74 61 43 75 72  aToOpen[iDataCur
4d40: 2d 69 54 61 62 43 75 72 5d 20 29 7b 0a 20 20 20  -iTabCur] ){.   
4d50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
4d60: 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
4d70: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
4d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d90: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
4da0: 74 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72  tFound, iDataCur
4db0: 2c 20 61 64 64 72 42 79 70 61 73 73 2c 20 69 4b  , addrBypass, iK
4dc0: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ey, nKey);.     
4dd0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4de0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
4df0: 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b  }else if( pPk ){
4e00: 0a 20 20 20 20 20 20 61 64 64 72 4c 6f 6f 70 20  .      addrLoop 
4e10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4e20: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
4e30: 2c 20 69 45 70 68 43 75 72 29 3b 20 56 64 62 65  , iEphCur); Vdbe
4e40: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4e50: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
4e60: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
4e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e80: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
4e90: 2c 20 69 45 70 68 43 75 72 2c 20 30 2c 20 69 4b  , iEphCur, 0, iK
4ea0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ey);.      }else
4eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4ec0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ed0: 50 5f 52 6f 77 44 61 74 61 2c 20 69 45 70 68 43  P_RowData, iEphC
4ee0: 75 72 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  ur, iKey);.     
4ef0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
4f00: 20 6e 4b 65 79 3d 3d 30 20 29 3b 20 20 2f 2a 20   nKey==0 );  /* 
4f10: 4f 50 5f 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73  OP_Found will us
4f20: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
4f30: 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  y */.    }else{.
4f40: 20 20 20 20 20 20 61 64 64 72 4c 6f 6f 70 20 3d        addrLoop =
4f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f60: 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 52  p3(v, OP_RowSetR
4f70: 65 61 64 2c 20 69 52 6f 77 53 65 74 2c 20 30 2c  ead, iRowSet, 0,
4f80: 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 56 64   iKey);.      Vd
4f90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65       assert( nKe
4fb0: 79 3d 3d 31 20 29 3b 0a 20 20 20 20 7d 20 20 0a  y==1 );.    }  .
4fc0: 20 20 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65    .    /* Delete
4fd0: 20 74 68 65 20 72 6f 77 20 2a 2f 0a 23 69 66 6e   the row */.#ifn
4fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4ff0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
5000: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
5010: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
5020: 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
5030: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
5040: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
5050: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
5060: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b    sqlite3VtabMak
5070: 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  eWritable(pParse
5080: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 61  , pTab);.      a
5090: 73 73 65 72 74 28 20 65 4f 6e 65 50 61 73 73 3d  ssert( eOnePass=
50a0: 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20  =ONEPASS_OFF || 
50b0: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
50c0: 53 5f 53 49 4e 47 4c 45 20 29 3b 0a 20 20 20 20  S_SINGLE );.    
50d0: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
50e0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
50f0: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
5100: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 7b  NEPASS_SINGLE ){
5110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5120: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5130: 5f 43 6c 6f 73 65 2c 20 69 54 61 62 43 75 72 29  _Close, iTabCur)
5140: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
5150: 6c 69 74 65 33 49 73 54 6f 70 6c 65 76 65 6c 28  lite3IsToplevel(
5160: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
5170: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73 4d       pParse->isM
5180: 75 6c 74 69 57 72 69 74 65 20 3d 20 30 3b 0a 20  ultiWrite = 0;. 
5190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
51a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
51b0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
51c0: 55 70 64 61 74 65 2c 20 30 2c 20 31 2c 20 69 4b  Update, 0, 1, iK
51d0: 65 79 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54  ey, pVTab, P4_VT
51e0: 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  AB);.      sqlit
51f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
5200: 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20  , OE_Abort);.   
5210: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5220: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f    {.      int co
5230: 75 6e 74 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e  unt = (pParse->n
5240: 65 73 74 65 64 3d 3d 30 29 3b 20 20 20 20 2f 2a  ested==0);    /*
5250: 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 63   True to count c
5260: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 20 20  hanges */.      
5270: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
5280: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  owDelete(pParse,
5290: 20 70 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c   pTab, pTrigger,
52a0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
52b0: 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4b  ur,.          iK
52c0: 65 79 2c 20 6e 4b 65 79 2c 20 63 6f 75 6e 74 2c  ey, nKey, count,
52d0: 20 4f 45 5f 44 65 66 61 75 6c 74 2c 20 65 4f 6e   OE_Default, eOn
52e0: 65 50 61 73 73 2c 20 61 69 43 75 72 4f 6e 65 50  ePass, aiCurOneP
52f0: 61 73 73 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  ass[1]);.    }. 
5300: 20 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20   .    /* End of 
5310: 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
5320: 6c 20 72 6f 77 69 64 73 2f 70 72 69 6d 61 72 79  l rowids/primary
5330: 2d 6b 65 79 73 2e 20 2a 2f 0a 20 20 20 20 69 66  -keys. */.    if
5340: 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ( eOnePass!=ONEP
5350: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
5360: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
5370: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
5380: 42 79 70 61 73 73 29 3b 0a 20 20 20 20 20 20 73  Bypass);.      s
5390: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
53a0: 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  WInfo);.    }els
53b0: 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20  e if( pPk ){.   
53c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
53d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
53e0: 20 69 45 70 68 43 75 72 2c 20 61 64 64 72 4c 6f   iEphCur, addrLo
53f0: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
5400: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
5410: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5420: 65 28 76 2c 20 61 64 64 72 4c 6f 6f 70 29 3b 0a  e(v, addrLoop);.
5430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5440: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
5450: 28 76 2c 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20  (v, addrLoop);. 
5460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5470: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
5480: 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 20 20 20 20  Loop);.    }    
5490: 20 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6e 6f 6e   .  } /* End non
54a0: 2d 74 72 75 6e 63 61 74 65 20 70 61 74 68 20 2a  -truncate path *
54b0: 2f 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  /..  /* Update t
54c0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
54d0: 63 65 20 74 61 62 6c 65 20 62 79 20 73 74 6f 72  ce table by stor
54e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
54f0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69  of the.  ** maxi
5500: 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e 74 65  mum rowid counte
5510: 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72 64 65  r values recorde
5520: 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  d while insertin
5530: 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75 74 6f  g into.  ** auto
5540: 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c 65 73  increment tables
5550: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
5560: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26  rse->nested==0 &
5570: 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  & pParse->pTrigg
5580: 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  erTab==0 ){.    
5590: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
55a0: 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29 3b  mentEnd(pParse);
55b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
55c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
55d0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 64  rows that were d
55e0: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
55f0: 72 6f 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a  routine is .  **
5600: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
5610: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 63 61   because of a ca
5620: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73  ll to sqlite3Nes
5630: 74 65 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e  tedParse(), do n
5640: 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74  ot.  ** invoke t
5650: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
5660: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
5670: 20 6d 65 6d 43 6e 74 20 29 7b 0a 20 20 20 20 73   memCnt ){.    s
5680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5690: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
56a0: 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20 20  , memCnt, 1);.  
56b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
56c0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
56d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
56e0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
56f0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f  OLNAME_NAME, "ro
5700: 77 73 20 64 65 6c 65 74 65 64 22 2c 20 53 51 4c  ws deleted", SQL
5710: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
5720: 0a 0a 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  ..delete_from_cl
5730: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
5740: 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70 28 26  AuthContextPop(&
5750: 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c  sContext);.  sql
5760: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
5770: 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74 29 3b  e(db, pTabList);
5780: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
5790: 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29  lete(db, pWhere)
57a0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
57b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
57c0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
57d0: 20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c   .  sqlite3ExprL
57e0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  istDelete(db, pO
57f0: 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74  rderBy);.  sqlit
5800: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5810: 20 70 4c 69 6d 69 74 29 3b 0a 23 65 6e 64 69 66   pLimit);.#endif
5820: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5830: 28 64 62 2c 20 61 54 6f 4f 70 65 6e 29 3b 0a 20  (db, aToOpen);. 
5840: 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 20 4d 61   return;.}./* Ma
5850: 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22  ke sure "isView"
5860: 20 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f   and other macro
5870: 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20  s defined above 
5880: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f  are undefined. O
5890: 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79  therwise.** they
58a0: 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77   may interfere w
58b0: 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ith compilation 
58c0: 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  of other functio
58d0: 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a  ns in this file.
58e0: 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65  ** (or in anothe
58f0: 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20  r file, if this 
5900: 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72  file becomes par
5910: 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d  t of the amalgam
5920: 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64  ation).  */.#ifd
5930: 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65  ef isView. #unde
5940: 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a  f isView.#endif.
5950: 23 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a  #ifdef pTrigger.
5960: 20 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72   #undef pTrigger
5970: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5980: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
5990: 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
59a0: 74 68 61 74 20 63 61 75 73 65 73 20 61 20 73 69  that causes a si
59b0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a 2a  ngle row of a.**
59c0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 74 6f   single table to
59d0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 42 6f   be deleted.  Bo
59e0: 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  th the original 
59f0: 74 61 62 6c 65 20 65 6e 74 72 79 20 61 6e 64 0a  table entry and.
5a00: 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  ** all indices a
5a10: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
5a20: 2a 20 50 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  * Preconditions:
5a30: 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 69 44 61  .**.**   1.  iDa
5a40: 74 61 43 75 72 20 69 73 20 61 6e 20 6f 70 65 6e  taCur is an open
5a50: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 62   cursor on the b
5a60: 74 72 65 65 20 74 68 61 74 20 69 73 20 74 68 65  tree that is the
5a70: 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 0a   canonical data.
5a80: 2a 2a 20 20 20 20 20 20 20 73 74 6f 72 65 20 66  **       store f
5a90: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 28  or the table.  (
5aa0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 65 69 74  This will be eit
5ab0: 68 65 72 20 74 68 65 20 74 61 62 6c 65 20 69 74  her the table it
5ac0: 73 65 6c 66 2c 0a 2a 2a 20 20 20 20 20 20 20 69  self,.**       i
5ad0: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
5ae0: 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 6f 72 20  rowid table, or 
5af0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5b00: 69 6e 64 65 78 20 69 6e 20 74 68 65 20 63 61 73  index in the cas
5b10: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
5b20: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
5b30: 62 6c 65 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  ble.).**.**   2.
5b40: 20 20 52 65 61 64 2f 77 72 69 74 65 20 63 75 72    Read/write cur
5b50: 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
5b60: 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73  ices of pTab mus
5b70: 74 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20  t be open as.** 
5b80: 20 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d        cursor num
5b90: 62 65 72 20 69 49 64 78 43 75 72 2b 69 20 66 6f  ber iIdxCur+i fo
5ba0: 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  r the i-th index
5bb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68  ..**.**   3.  Th
5bc0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f  e primary key fo
5bd0: 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  r the row to be 
5be0: 64 65 6c 65 74 65 64 20 6d 75 73 74 20 62 65 20  deleted must be 
5bf0: 73 74 6f 72 65 64 20 69 6e 20 61 0a 2a 2a 20 20  stored in a.**  
5c00: 20 20 20 20 20 73 65 71 75 65 6e 63 65 20 6f 66       sequence of
5c10: 20 6e 50 6b 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nPk memory cell
5c20: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 50  s starting at iP
5c30: 6b 2e 20 20 49 66 20 6e 50 6b 3d 3d 30 20 74 68  k.  If nPk==0 th
5c40: 61 74 20 6d 65 61 6e 73 0a 2a 2a 20 20 20 20 20  at means.**     
5c50: 20 20 74 68 61 74 20 61 20 73 65 61 72 63 68 20    that a search 
5c60: 72 65 63 6f 72 64 20 66 6f 72 6d 65 64 20 66 72  record formed fr
5c70: 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  om OP_MakeRecord
5c80: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
5c90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 73 69   the.**       si
5ca0: 6e 67 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  ngle memory loca
5cb0: 74 69 6f 6e 20 69 50 6b 2e 0a 2a 2a 0a 2a 2a 20  tion iPk..**.** 
5cc0: 65 4d 6f 64 65 3a 0a 2a 2a 20 20 20 50 61 72 61  eMode:.**   Para
5cd0: 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 61 79 20  meter eMode may 
5ce0: 62 65 20 70 61 73 73 65 64 20 65 69 74 68 65 72  be passed either
5cf0: 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 28 30 29   ONEPASS_OFF (0)
5d00: 2c 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  , ONEPASS_SINGLE
5d10: 2c 20 6f 72 0a 2a 2a 20 20 20 4f 4e 45 50 41 53  , or.**   ONEPAS
5d20: 53 5f 4d 55 4c 54 49 2e 20 20 49 66 20 65 4d 6f  S_MULTI.  If eMo
5d30: 64 65 20 69 73 20 6e 6f 74 20 4f 4e 45 50 41 53  de is not ONEPAS
5d40: 53 5f 4f 46 46 2c 20 74 68 65 6e 20 74 68 65 20  S_OFF, then the 
5d50: 63 75 72 73 6f 72 0a 2a 2a 20 20 20 69 44 61 74  cursor.**   iDat
5d60: 61 43 75 72 20 61 6c 72 65 61 64 79 20 70 6f 69  aCur already poi
5d70: 6e 74 73 20 74 6f 20 74 68 65 20 72 6f 77 20 74  nts to the row t
5d80: 6f 20 64 65 6c 65 74 65 2e 20 49 66 20 65 4d 6f  o delete. If eMo
5d90: 64 65 20 69 73 20 4f 4e 45 50 41 53 53 5f 4f 46  de is ONEPASS_OF
5da0: 46 0a 2a 2a 20 20 20 74 68 65 6e 20 74 68 69 73  F.**   then this
5db0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
5dc0: 65 65 6b 20 69 44 61 74 61 43 75 72 20 74 6f 20  eek iDataCur to 
5dd0: 74 68 65 20 65 6e 74 72 79 20 69 64 65 6e 74 69  the entry identi
5de0: 66 69 65 64 20 62 79 20 69 50 6b 0a 2a 2a 20 20  fied by iPk.**  
5df0: 20 61 6e 64 20 6e 50 6b 20 62 65 66 6f 72 65 20   and nPk before 
5e00: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 69 74 2e  reading from it.
5e10: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 65 4d 6f 64  .**.**   If eMod
5e20: 65 20 69 73 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  e is ONEPASS_MUL
5e30: 54 49 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  TI, then this ca
5e40: 6c 6c 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  ll is being made
5e50: 20 61 73 20 70 61 72 74 0a 2a 2a 20 20 20 6f 66   as part.**   of
5e60: 20 61 20 4f 4e 45 50 41 53 53 20 64 65 6c 65 74   a ONEPASS delet
5e70: 65 20 74 68 61 74 20 61 66 66 65 63 74 73 20 6d  e that affects m
5e80: 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e 20 49 6e  ultiple rows. In
5e90: 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 0a   this case, if .
5ea0: 2a 2a 20 20 20 69 49 64 78 4e 6f 53 65 65 6b 20  **   iIdxNoSeek 
5eb0: 69 73 20 61 20 76 61 6c 69 64 20 63 75 72 73 6f  is a valid curso
5ec0: 72 20 6e 75 6d 62 65 72 20 28 3e 3d 30 29 20 61  r number (>=0) a
5ed0: 6e 64 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  nd is not the sa
5ee0: 6d 65 20 61 73 0a 2a 2a 20 20 20 69 44 61 74 61  me as.**   iData
5ef0: 43 75 72 2c 20 74 68 65 6e 20 69 74 73 20 70 6f  Cur, then its po
5f00: 73 69 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  sition should be
5f10: 20 70 72 65 73 65 72 76 65 64 20 66 6f 6c 6c 6f   preserved follo
5f20: 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65 0a  wing the delete.
5f30: 2a 2a 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 20  **   operation. 
5f40: 4f 72 2c 20 69 66 20 69 49 64 78 4e 6f 53 65 65  Or, if iIdxNoSee
5f50: 6b 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  k is not a valid
5f60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2c 20   cursor number, 
5f70: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
5f80: 6e 20 6f 66 20 69 44 61 74 61 43 75 72 20 73 68  n of iDataCur sh
5f90: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 72 76 65  ould be preserve
5fa0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
5fb0: 20 69 49 64 78 4e 6f 53 65 65 6b 3a 0a 2a 2a 20   iIdxNoSeek:.** 
5fc0: 20 20 49 66 20 69 49 64 78 4e 6f 53 65 65 6b 20    If iIdxNoSeek 
5fd0: 69 73 20 61 20 76 61 6c 69 64 20 63 75 72 73 6f  is a valid curso
5fe0: 72 20 6e 75 6d 62 65 72 20 28 3e 3d 30 29 20 6e  r number (>=0) n
5ff0: 6f 74 20 65 71 75 61 6c 20 74 6f 20 69 44 61 74  ot equal to iDat
6000: 61 43 75 72 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  aCur,.**   then 
6010: 69 74 20 69 64 65 6e 74 69 66 69 65 73 20 61 6e  it identifies an
6020: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 28 66   index cursor (f
6030: 72 6f 6d 20 77 69 74 68 69 6e 20 61 72 72 61 79  rom within array
6040: 20 6f 66 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20   of cursors.**  
6050: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 49 64   starting at iId
6060: 78 43 75 72 29 20 74 68 61 74 20 61 6c 72 65 61  xCur) that alrea
6070: 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
6080: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 6f 20   index entry to 
6090: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 20  be deleted..**  
60a0: 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 6f 70   Except, this op
60b0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69  timization is di
60c0: 73 61 62 6c 65 64 20 69 66 20 74 68 65 72 65 20  sabled if there 
60d0: 61 72 65 20 42 45 46 4f 52 45 20 74 72 69 67 67  are BEFORE trigg
60e0: 65 72 73 20 73 69 6e 63 65 0a 2a 2a 20 20 20 74  ers since.**   t
60f0: 68 65 20 74 72 69 67 67 65 72 20 62 6f 64 79 20  he trigger body 
6100: 6d 69 67 68 74 20 68 61 76 65 20 6d 6f 76 65 64  might have moved
6110: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
6120: 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65  void sqlite3Gene
6130: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20  rateRowDelete(. 
6140: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6150: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6160: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
6170: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f  e *pTab,       /
6180: 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  * Table containi
6190: 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  ng the row to be
61a0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 54 72   deleted */.  Tr
61b0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c  igger *pTrigger,
61c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67   /* List of trig
61d0: 67 65 72 73 20 74 6f 20 28 70 6f 74 65 6e 74 69  gers to (potenti
61e0: 61 6c 6c 79 29 20 66 69 72 65 20 2a 2f 0a 20 20  ally) fire */.  
61f0: 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20 20  int iDataCur,   
6200: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 72 6f     /* Cursor fro
6210: 6d 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 20 64  m which column d
6220: 61 74 61 20 69 73 20 65 78 74 72 61 63 74 65 64  ata is extracted
6230: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
6240: 72 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  r,       /* Firs
6250: 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a  t index cursor *
6260: 2f 0a 20 20 69 6e 74 20 69 50 6b 2c 20 20 20 20  /.  int iPk,    
6270: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
6280: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 6e 74  memory cell cont
6290: 61 69 6e 69 6e 67 20 74 68 65 20 50 52 49 4d 41  aining the PRIMA
62a0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 31 36 20  RY KEY */.  i16 
62b0: 6e 50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nPk,           /
62c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
62d0: 41 52 59 20 4b 45 59 20 6d 65 6d 6f 72 79 20 63  ARY KEY memory c
62e0: 65 6c 6c 73 20 2a 2f 0a 20 20 75 38 20 63 6f 75  ells */.  u8 cou
62f0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
6300: 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 63  If non-zero, inc
6310: 72 65 6d 65 6e 74 20 74 68 65 20 72 6f 77 20 63  rement the row c
6320: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f  hange counter */
6330: 0a 20 20 75 38 20 6f 6e 63 6f 6e 66 2c 20 20 20  .  u8 onconf,   
6340: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
6350: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
6360: 69 63 79 20 66 6f 72 20 74 72 69 67 67 65 72 73  icy for triggers
6370: 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 2c 20   */.  u8 eMode, 
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50           /* ONEP
6390: 41 53 53 5f 4f 46 46 2c 20 5f 53 49 4e 47 4c 45  ASS_OFF, _SINGLE
63a0: 2c 20 6f 72 20 5f 4d 55 4c 54 49 2e 20 20 53 65  , or _MULTI.  Se
63b0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e 74  e above */.  int
63c0: 20 69 49 64 78 4e 6f 53 65 65 6b 20 20 20 20 20   iIdxNoSeek     
63d0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
63e0: 20 6f 66 20 63 75 72 73 6f 72 20 74 68 61 74 20   of cursor that 
63f0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 73 65  does not need se
6400: 65 6b 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 56 64  eking */.){.  Vd
6410: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6420: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 2f 2a  pVdbe;        /*
6430: 20 56 64 62 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Vdbe */.  int i
6440: 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Old = 0;        
6450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6460: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
6470: 4f 4c 44 2e 2a 20 61 72 72 61 79 20 2a 2f 0a 20  OLD.* array */. 
6480: 20 69 6e 74 20 69 4c 61 62 65 6c 3b 20 20 20 20   int iLabel;    
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 2f 2a 20 4c 61 62 65 6c 20 72 65 73 6f 6c 76   /* Label resolv
64b0: 65 64 20 74 6f 20 65 6e 64 20 6f 66 20 67 65 6e  ed to end of gen
64c0: 65 72 61 74 65 64 20 63 6f 64 65 20 2a 2f 0a 20  erated code */. 
64d0: 20 75 38 20 6f 70 53 65 65 6b 3b 20 20 20 20 20   u8 opSeek;     
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 2f 2a 20 53 65 65 6b 20 6f 70 63 6f 64 65 20   /* Seek opcode 
6500: 2a 2f 0a 0a 20 20 2f 2a 20 56 64 62 65 20 69 73  */..  /* Vdbe is
6510: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
6520: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
6530: 65 64 20 62 79 20 74 68 69 73 20 73 74 61 67 65  ed by this stage
6540: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 76  . */.  assert( v
6550: 20 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   );.  VdbeModule
6560: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 45 47  Comment((v, "BEG
6570: 49 4e 3a 20 47 65 6e 52 6f 77 44 65 6c 28 25 64  IN: GenRowDel(%d
6580: 2c 25 64 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20  ,%d,%d,%d)",.   
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 20 20 20 69 44 61 74 61 43 75 72 2c 20        iDataCur, 
65b0: 69 49 64 78 43 75 72 2c 20 69 50 6b 2c 20 28 69  iIdxCur, iPk, (i
65c0: 6e 74 29 6e 50 6b 29 29 3b 0a 0a 20 20 2f 2a 20  nt)nPk));..  /* 
65d0: 53 65 65 6b 20 63 75 72 73 6f 72 20 69 43 75 72  Seek cursor iCur
65e0: 20 74 6f 20 74 68 65 20 72 6f 77 20 74 6f 20 64   to the row to d
65f0: 65 6c 65 74 65 2e 20 49 66 20 74 68 69 73 20 72  elete. If this r
6600: 6f 77 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  ow no longer exi
6610: 73 74 73 20 0a 20 20 2a 2a 20 28 74 68 69 73 20  sts .  ** (this 
6620: 63 61 6e 20 68 61 70 70 65 6e 20 69 66 20 61 20  can happen if a 
6630: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
6640: 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 6c 65  has already dele
6650: 74 65 64 20 69 74 29 2c 20 64 6f 0a 20 20 2a 2a  ted it), do.  **
6660: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
6670: 64 65 6c 65 74 65 20 69 74 20 6f 72 20 66 69 72  delete it or fir
6680: 65 20 61 6e 79 20 44 45 4c 45 54 45 20 74 72 69  e any DELETE tri
6690: 67 67 65 72 73 2e 20 20 2a 2f 0a 20 20 69 4c 61  ggers.  */.  iLa
66a0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
66b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
66c0: 20 6f 70 53 65 65 6b 20 3d 20 48 61 73 52 6f 77   opSeek = HasRow
66d0: 69 64 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e 6f  id(pTab) ? OP_No
66e0: 74 45 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f 74  tExists : OP_Not
66f0: 46 6f 75 6e 64 3b 0a 20 20 69 66 28 20 65 4d 6f  Found;.  if( eMo
6700: 64 65 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  de==ONEPASS_OFF 
6710: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6720: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
6730: 70 53 65 65 6b 2c 20 69 44 61 74 61 43 75 72 2c  pSeek, iDataCur,
6740: 20 69 4c 61 62 65 6c 2c 20 69 50 6b 2c 20 6e 50   iLabel, iPk, nP
6750: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
6760: 72 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b  rageIf(v, opSeek
6770: 3d 3d 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 3b  ==OP_NotExists);
6780: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6790: 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f  eIf(v, opSeek==O
67a0: 50 5f 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 7d  P_NotFound);.  }
67b0: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
67c0: 20 61 72 65 20 61 6e 79 20 74 72 69 67 67 65 72   are any trigger
67d0: 73 20 74 6f 20 66 69 72 65 2c 20 61 6c 6c 6f 63  s to fire, alloc
67e0: 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 72  ate a range of r
67f0: 65 67 69 73 74 65 72 73 20 74 6f 0a 20 20 2a 2a  egisters to.  **
6800: 20 75 73 65 20 66 6f 72 20 74 68 65 20 6f 6c 64   use for the old
6810: 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 20 69 6e  .* references in
6820: 20 74 68 65 20 74 72 69 67 67 65 72 73 2e 20 20   the triggers.  
6830: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
6840: 46 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73  FkRequired(pPars
6850: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 29 20 7c  e, pTab, 0, 0) |
6860: 7c 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  | pTrigger ){.  
6870: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 20    u32 mask;     
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 4c 44 2e 2a  /* Mask of OLD.*
68a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 75 73 65 20   columns in use 
68b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  */.    int iCol;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
68e0: 20 75 73 65 64 20 77 68 69 6c 65 20 70 6f 70 75   used while popu
68f0: 6c 61 74 69 6e 67 20 4f 4c 44 2e 2a 20 2a 2f 0a  lating OLD.* */.
6900: 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72      int addrStar
6910: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6920: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 42 45    /* Start of BE
6930: 46 4f 52 45 20 74 72 69 67 67 65 72 20 70 72 6f  FORE trigger pro
6940: 67 72 61 6d 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  grams */..    /*
6950: 20 54 4f 44 4f 3a 20 43 6f 75 6c 64 20 75 73 65   TODO: Could use
6960: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
6970: 74 65 72 73 20 68 65 72 65 2e 20 41 6c 73 6f 20  ters here. Also 
6980: 63 6f 75 6c 64 20 61 74 74 65 6d 70 74 20 74 6f  could attempt to
6990: 0a 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 63 6f  .    ** avoid co
69a0: 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
69b0: 74 73 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ts of the rowid 
69c0: 72 65 67 69 73 74 65 72 2e 20 20 2a 2f 0a 20 20  register.  */.  
69d0: 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33    mask = sqlite3
69e0: 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b 28 0a  TriggerColmask(.
69f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
6a00: 70 54 72 69 67 67 65 72 2c 20 30 2c 20 30 2c 20  pTrigger, 0, 0, 
6a10: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54  TRIGGER_BEFORE|T
6a20: 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54  RIGGER_AFTER, pT
6a30: 61 62 2c 20 6f 6e 63 6f 6e 66 0a 20 20 20 20 29  ab, onconf.    )
6a40: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71  ;.    mask |= sq
6a50: 6c 69 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 70  lite3FkOldmask(p
6a60: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
6a70: 20 20 69 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d    iOld = pParse-
6a80: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
6a90: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 31 20  rse->nMem += (1 
6aa0: 2b 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 0a  + pTab->nCol);..
6ab0: 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
6ac0: 74 68 65 20 4f 4c 44 2e 2a 20 70 73 65 75 64 6f  the OLD.* pseudo
6ad0: 2d 74 61 62 6c 65 20 72 65 67 69 73 74 65 72 20  -table register 
6ae0: 61 72 72 61 79 2e 20 54 68 65 73 65 20 76 61 6c  array. These val
6af0: 75 65 73 20 77 69 6c 6c 20 62 65 20 0a 20 20 20  ues will be .   
6b00: 20 2a 2a 20 75 73 65 64 20 62 79 20 61 6e 79 20   ** used by any 
6b10: 42 45 46 4f 52 45 20 61 6e 64 20 41 46 54 45 52  BEFORE and AFTER
6b20: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 65   triggers that e
6b30: 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 73 71  xist.  */.    sq
6b40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b50: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 50 6b 2c  v, OP_Copy, iPk,
6b60: 20 69 4f 6c 64 29 3b 0a 20 20 20 20 66 6f 72 28   iOld);.    for(
6b70: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
6b80: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
6b90: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6ba0: 28 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66  ( mask!=0xffffff
6bb0: 66 66 20 26 26 20 69 43 6f 6c 3d 3d 33 31 20 29  ff && iCol==31 )
6bc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6bd0: 28 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66  ( mask!=0xffffff
6be0: 66 66 20 26 26 20 69 43 6f 6c 3d 3d 33 32 20 29  ff && iCol==32 )
6bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 73 6b  ;.      if( mask
6c00: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 7c 7c 20  ==0xffffffff || 
6c10: 28 69 43 6f 6c 3c 3d 33 31 20 26 26 20 28 6d 61  (iCol<=31 && (ma
6c20: 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 69  sk & MASKBIT32(i
6c30: 43 6f 6c 29 29 21 3d 30 29 20 29 7b 0a 20 20 20  Col))!=0) ){.   
6c40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6c50: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
6c60: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44  able(v, pTab, iD
6c70: 61 74 61 43 75 72 2c 20 69 43 6f 6c 2c 20 69 4f  ataCur, iCol, iO
6c80: 6c 64 2b 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  ld+iCol+1);.    
6c90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
6ca0: 2a 20 49 6e 76 6f 6b 65 20 42 45 46 4f 52 45 20  * Invoke BEFORE 
6cb0: 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 20 70  DELETE trigger p
6cc0: 72 6f 67 72 61 6d 73 2e 20 2a 2f 0a 20 20 20 20  rograms. */.    
6cd0: 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69  addrStart = sqli
6ce0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
6cf0: 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
6d00: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
6d10: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
6d20: 72 2c 20 0a 20 20 20 20 20 20 20 20 54 4b 5f 44  r, .        TK_D
6d30: 45 4c 45 54 45 2c 20 30 2c 20 54 52 49 47 47 45  ELETE, 0, TRIGGE
6d40: 52 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20  R_BEFORE, pTab, 
6d50: 69 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c 20 69 4c  iOld, onconf, iL
6d60: 61 62 65 6c 0a 20 20 20 20 29 3b 0a 0a 20 20 20  abel.    );..   
6d70: 20 2f 2a 20 49 66 20 61 6e 79 20 42 45 46 4f 52   /* If any BEFOR
6d80: 45 20 74 72 69 67 67 65 72 73 20 77 65 72 65 20  E triggers were 
6d90: 63 6f 64 65 64 2c 20 74 68 65 6e 20 73 65 65 6b  coded, then seek
6da0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6db0: 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 20 74  he .    ** row t
6dc0: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 61 67 61  o be deleted aga
6dd0: 69 6e 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  in. It may be th
6de0: 61 74 20 74 68 65 20 42 45 46 4f 52 45 20 74 72  at the BEFORE tr
6df0: 69 67 67 65 72 73 20 6d 6f 76 65 64 0a 20 20 20  iggers moved.   
6e00: 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6f   ** the cursor o
6e10: 72 20 61 6c 72 65 61 64 79 20 64 65 6c 65 74 65  r already delete
6e20: 64 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  d the row that t
6e30: 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 20 20  he cursor was.  
6e40: 20 20 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f    ** pointing to
6e50: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6e60: 41 6c 73 6f 20 64 69 73 61 62 6c 65 20 74 68 65  Also disable the
6e70: 20 69 49 64 78 4e 6f 53 65 65 6b 20 6f 70 74 69   iIdxNoSeek opti
6e80: 6d 69 7a 61 74 69 6f 6e 20 73 69 6e 63 65 20 74  mization since t
6e90: 68 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  he BEFORE trigge
6ea0: 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76  r.    ** may hav
6eb0: 65 20 6d 6f 76 65 64 20 74 68 61 74 20 63 75 72  e moved that cur
6ec0: 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
6ed0: 69 66 28 20 61 64 64 72 53 74 61 72 74 3c 73 71  if( addrStart<sq
6ee0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
6ef0: 41 64 64 72 28 76 29 20 29 7b 0a 20 20 20 20 20  Addr(v) ){.     
6f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6f10: 70 34 49 6e 74 28 76 2c 20 6f 70 53 65 65 6b 2c  p4Int(v, opSeek,
6f20: 20 69 44 61 74 61 43 75 72 2c 20 69 4c 61 62 65   iDataCur, iLabe
6f30: 6c 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20  l, iPk, nPk);.  
6f40: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6f50: 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50  If(v, opSeek==OP
6f60: 5f 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20 20 20  _NotExists);.   
6f70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
6f80: 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f  f(v, opSeek==OP_
6f90: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
6fa0: 20 74 65 73 74 63 61 73 65 28 20 69 49 64 78 4e   testcase( iIdxN
6fb0: 6f 53 65 65 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  oSeek>=0 );.    
6fc0: 20 20 69 49 64 78 4e 6f 53 65 65 6b 20 3d 20 2d    iIdxNoSeek = -
6fd0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
6fe0: 20 44 6f 20 46 4b 20 70 72 6f 63 65 73 73 69 6e   Do FK processin
6ff0: 67 2e 20 54 68 69 73 20 63 61 6c 6c 20 63 68 65  g. This call che
7000: 63 6b 73 20 74 68 61 74 20 61 6e 79 20 46 4b 20  cks that any FK 
7010: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
7020: 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  .    ** refer to
7030: 20 74 68 69 73 20 74 61 62 6c 65 20 28 69 2e 65   this table (i.e
7040: 2e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 74  . constraints at
7050: 74 61 63 68 65 64 20 74 6f 20 6f 74 68 65 72 20  tached to other 
7060: 74 61 62 6c 65 73 29 20 0a 20 20 20 20 2a 2a 20  tables) .    ** 
7070: 61 72 65 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64  are not violated
7080: 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74 68 69   by deleting thi
7090: 73 20 72 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 73  s row.  */.    s
70a0: 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28 70 50  qlite3FkCheck(pP
70b0: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 4f 6c 64  arse, pTab, iOld
70c0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
70d0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
70e0: 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
70f0: 20 65 6e 74 72 69 65 73 2e 20 53 6b 69 70 20 74   entries. Skip t
7100: 68 69 73 20 73 74 65 70 20 69 66 20 70 54 61 62  his step if pTab
7110: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20   is really.  ** 
7120: 61 20 76 69 65 77 20 28 69 6e 20 77 68 69 63 68  a view (in which
7130: 20 63 61 73 65 20 74 68 65 20 6f 6e 6c 79 20 65   case the only e
7140: 66 66 65 63 74 20 6f 66 20 74 68 65 20 44 45 4c  ffect of the DEL
7150: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ETE statement is
7160: 20 74 6f 0a 20 20 2a 2a 20 66 69 72 65 20 74 68   to.  ** fire th
7170: 65 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  e INSTEAD OF tri
7180: 67 67 65 72 73 29 2e 20 20 0a 20 20 2a 2a 0a 20  ggers).  .  **. 
7190: 20 2a 2a 20 49 66 20 76 61 72 69 61 62 6c 65 20   ** If variable 
71a0: 27 63 6f 75 6e 74 27 20 69 73 20 6e 6f 6e 2d 7a  'count' is non-z
71b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 4f  ero, then this O
71c0: 50 5f 44 65 6c 65 74 65 20 69 6e 73 74 72 75 63  P_Delete instruc
71d0: 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  tion should.  **
71e0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   invoke the upda
71f0: 74 65 2d 68 6f 6f 6b 2e 20 54 68 65 20 70 72 65  te-hook. The pre
7200: 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 2c 20 6f 6e  -update-hook, on
7210: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
7220: 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20 69  should.  ** be i
7230: 6e 76 6f 6b 65 64 20 75 6e 6c 65 73 73 20 74 61  nvoked unless ta
7240: 62 6c 65 20 70 54 61 62 20 69 73 20 61 20 73 79  ble pTab is a sy
7250: 73 74 65 6d 20 74 61 62 6c 65 2e 20 54 68 65 20  stem table. The 
7260: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68  difference is th
7270: 61 74 0a 20 20 2a 2a 20 74 68 65 20 75 70 64 61  at.  ** the upda
7280: 74 65 2d 68 6f 6f 6b 20 69 73 20 6e 6f 74 20 69  te-hook is not i
7290: 6e 76 6f 6b 65 64 20 66 6f 72 20 72 6f 77 73 20  nvoked for rows 
72a0: 72 65 6d 6f 76 65 64 20 62 79 20 52 45 50 4c 41  removed by REPLA
72b0: 43 45 2c 20 62 75 74 20 74 68 65 20 0a 20 20 2a  CE, but the .  *
72c0: 2a 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f  * pre-update-hoo
72d0: 6b 20 69 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  k is..  */ .  if
72e0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
72f0: 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 70 35 20  =0 ){.    u8 p5 
7300: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7310: 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78  GenerateRowIndex
7320: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
7330: 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69  Tab, iDataCur, i
7340: 49 64 78 43 75 72 2c 30 2c 69 49 64 78 4e 6f 53  IdxCur,0,iIdxNoS
7350: 65 65 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eek);.    sqlite
7360: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7370: 50 5f 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43  P_Delete, iDataC
7380: 75 72 2c 20 28 63 6f 75 6e 74 3f 4f 50 46 4c 41  ur, (count?OPFLA
7390: 47 5f 4e 43 48 41 4e 47 45 3a 30 29 29 3b 0a 20  G_NCHANGE:0));. 
73a0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
73b0: 65 73 74 65 64 3d 3d 30 20 7c 7c 20 30 3d 3d 73  ested==0 || 0==s
73c0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
73d0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
73e0: 69 74 65 5f 73 74 61 74 31 22 29 20 29 7b 0a 20  ite_stat1") ){. 
73f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7400: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
7410: 72 2a 29 70 54 61 62 2c 20 50 34 5f 54 41 42 4c  r*)pTab, P4_TABL
7420: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
7430: 28 20 65 4d 6f 64 65 21 3d 4f 4e 45 50 41 53 53  ( eMode!=ONEPASS
7440: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71  _OFF ){.      sq
7450: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7460: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 55 58 44  5(v, OPFLAG_AUXD
7470: 45 4c 45 54 45 29 3b 0a 20 20 20 20 7d 0a 20 20  ELETE);.    }.  
7480: 20 20 69 66 28 20 69 49 64 78 4e 6f 53 65 65 6b    if( iIdxNoSeek
7490: 3e 3d 30 20 26 26 20 69 49 64 78 4e 6f 53 65 65  >=0 && iIdxNoSee
74a0: 6b 21 3d 69 44 61 74 61 43 75 72 20 29 7b 0a 20  k!=iDataCur ){. 
74b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
74d0: 65 74 65 2c 20 69 49 64 78 4e 6f 53 65 65 6b 29  ete, iIdxNoSeek)
74e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
74f0: 65 4d 6f 64 65 3d 3d 4f 4e 45 50 41 53 53 5f 4d  eMode==ONEPASS_M
7500: 55 4c 54 49 20 29 20 70 35 20 7c 3d 20 4f 50 46  ULTI ) p5 |= OPF
7510: 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
7520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7530: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
7540: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  ;.  }..  /* Do a
7550: 6e 79 20 4f 4e 20 43 41 53 43 41 44 45 2c 20 53  ny ON CASCADE, S
7560: 45 54 20 4e 55 4c 4c 20 6f 72 20 53 45 54 20 44  ET NULL or SET D
7570: 45 46 41 55 4c 54 20 6f 70 65 72 61 74 69 6f 6e  EFAULT operation
7580: 73 20 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20  s required to.  
7590: 2a 2a 20 68 61 6e 64 6c 65 20 72 6f 77 73 20 28  ** handle rows (
75a0: 70 6f 73 73 69 62 6c 79 20 69 6e 20 6f 74 68 65  possibly in othe
75b0: 72 20 74 61 62 6c 65 73 29 20 74 68 61 74 20 72  r tables) that r
75c0: 65 66 65 72 20 76 69 61 20 61 20 66 6f 72 65 69  efer via a forei
75d0: 67 6e 20 6b 65 79 0a 20 20 2a 2a 20 74 6f 20 74  gn key.  ** to t
75e0: 68 65 20 72 6f 77 20 6a 75 73 74 20 64 65 6c 65  he row just dele
75f0: 74 65 64 2e 20 2a 2f 20 0a 20 20 73 71 6c 69 74  ted. */ .  sqlit
7600: 65 33 46 6b 41 63 74 69 6f 6e 73 28 70 50 61 72  e3FkActions(pPar
7610: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 4f 6c  se, pTab, 0, iOl
7620: 64 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  d, 0, 0);..  /* 
7630: 49 6e 76 6f 6b 65 20 41 46 54 45 52 20 44 45 4c  Invoke AFTER DEL
7640: 45 54 45 20 74 72 69 67 67 65 72 20 70 72 6f 67  ETE trigger prog
7650: 72 61 6d 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  rams. */.  sqlit
7660: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
7670: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
7680: 72 2c 20 0a 20 20 20 20 20 20 54 4b 5f 44 45 4c  r, .      TK_DEL
7690: 45 54 45 2c 20 30 2c 20 54 52 49 47 47 45 52 5f  ETE, 0, TRIGGER_
76a0: 41 46 54 45 52 2c 20 70 54 61 62 2c 20 69 4f 6c  AFTER, pTab, iOl
76b0: 64 2c 20 6f 6e 63 6f 6e 66 2c 20 69 4c 61 62 65  d, onconf, iLabe
76c0: 6c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  l.  );..  /* Jum
76d0: 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 6f  p here if the ro
76e0: 77 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  w had already be
76f0: 65 6e 20 64 65 6c 65 74 65 64 20 62 65 66 6f 72  en deleted befor
7700: 65 20 61 6e 79 20 42 45 46 4f 52 45 0a 20 20 2a  e any BEFORE.  *
7710: 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
7720: 6d 73 20 77 65 72 65 20 69 6e 76 6f 6b 65 64 2e  ms were invoked.
7730: 20 4f 72 20 69 66 20 61 20 74 72 69 67 67 65 72   Or if a trigger
7740: 20 70 72 6f 67 72 61 6d 20 74 68 72 6f 77 73 20   program throws 
7750: 61 20 0a 20 20 2a 2a 20 52 41 49 53 45 28 49 47  a .  ** RAISE(IG
7760: 4e 4f 52 45 29 20 65 78 63 65 70 74 69 6f 6e 2e  NORE) exception.
7770: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
7780: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7790: 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20 56 64 62  , iLabel);.  Vdb
77a0: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
77b0: 76 2c 20 22 45 4e 44 3a 20 47 65 6e 52 6f 77 44  v, "END: GenRowD
77c0: 65 6c 28 29 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  el()"));.}../*.*
77d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
77e0: 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
77f0: 64 65 20 74 68 61 74 20 63 61 75 73 65 73 20 74  de that causes t
7800: 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 61  he deletion of a
7810: 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72  ll.** index entr
7820: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
7830: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ith a single row
7840: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62   of a single tab
7850: 6c 65 2c 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 50  le, pTab.**.** P
7860: 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a  reconditions:.**
7870: 0a 2a 2a 20 20 20 31 2e 20 20 41 20 72 65 61 64  .**   1.  A read
7880: 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 22 69  /write cursor "i
7890: 44 61 74 61 43 75 72 22 20 6d 75 73 74 20 62 65  DataCur" must be
78a0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 63 61 6e   open on the can
78b0: 6f 6e 69 63 61 6c 20 73 74 6f 72 61 67 65 0a 2a  onical storage.*
78c0: 2a 20 20 20 20 20 20 20 62 74 72 65 65 20 66 6f  *       btree fo
78d0: 72 20 74 68 65 20 74 61 62 6c 65 20 70 54 61 62  r the table pTab
78e0: 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20 62 65  .  (This will be
78f0: 20 65 69 74 68 65 72 20 74 68 65 20 74 61 62 6c   either the tabl
7900: 65 20 69 74 73 65 6c 66 0a 2a 2a 20 20 20 20 20  e itself.**     
7910: 20 20 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c    for rowid tabl
7920: 65 73 20 6f 72 20 74 6f 20 74 68 65 20 70 72 69  es or to the pri
7930: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 66  mary key index f
7940: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
7950: 0a 2a 2a 20 20 20 20 20 20 20 74 61 62 6c 65 73  .**       tables
7960: 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 52  .).**.**   2.  R
7970: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
7980: 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
7990: 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74 20 62  s of pTab must b
79a0: 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20 20  e open as.**    
79b0: 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72     cursor number
79c0: 20 69 49 64 78 43 75 72 2b 69 20 66 6f 72 20 74   iIdxCur+i for t
79d0: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e 20 20  he i-th index.  
79e0: 28 54 68 65 20 70 54 61 62 2d 3e 70 49 6e 64 65  (The pTab->pInde
79f0: 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78  x.**       index
7a00: 20 69 73 20 74 68 65 20 30 2d 74 68 20 69 6e 64   is the 0-th ind
7a10: 65 78 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20  ex.).**.**   3. 
7a20: 20 54 68 65 20 22 69 44 61 74 61 43 75 72 22 20   The "iDataCur" 
7a30: 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 61  cursor must be a
7a40: 6c 72 65 61 64 79 20 62 65 20 70 6f 73 69 74 69  lready be positi
7a50: 6f 6e 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 0a  oned on the row.
7a60: 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20 69 73  **       that is
7a70: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0a   to be deleted..
7a80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47  */.void sqlite3G
7a90: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
7aa0: 65 6c 65 74 65 28 0a 20 20 50 61 72 73 65 20 2a  elete(.  Parse *
7ab0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
7ac0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
7ad0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
7ae0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
7af0: 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61  Tab,       /* Ta
7b00: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
7b10: 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  he row to be del
7b20: 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 44  eted */.  int iD
7b30: 61 74 61 43 75 72 2c 20 20 20 20 20 20 2f 2a 20  ataCur,      /* 
7b40: 43 75 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20  Cursor of table 
7b50: 68 6f 6c 64 69 6e 67 20 64 61 74 61 2e 20 2a 2f  holding data. */
7b60: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20  .  int iIdxCur, 
7b70: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
7b80: 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ndex cursor */. 
7b90: 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20 20   int *aRegIdx,  
7ba0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65 6c 65      /* Only dele
7bb0: 74 65 20 69 66 20 61 52 65 67 49 64 78 21 3d 30  te if aRegIdx!=0
7bc0: 20 26 26 20 61 52 65 67 49 64 78 5b 69 5d 3e 30   && aRegIdx[i]>0
7bd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 4e 6f   */.  int iIdxNo
7be0: 53 65 65 6b 20 20 20 20 20 2f 2a 20 44 6f 20 6e  Seek     /* Do n
7bf0: 6f 74 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 74  ot delete from t
7c00: 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  his cursor */.){
7c10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7c20: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
7c30: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7c40: 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 20 20 20   int r1 = -1;   
7c50: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
7c60: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
7c70: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50   key */.  int iP
7c80: 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 2f 2a 20  artIdxLabel; /* 
7c90: 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
7ca0: 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20 70 61   for skipping pa
7cb0: 72 74 69 61 6c 20 69 6e 64 65 78 20 65 6e 74 72  rtial index entr
7cc0: 69 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ies */.  Index *
7cd0: 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 43  pIdx;       /* C
7ce0: 75 72 72 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  urrent index */.
7cf0: 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20    Index *pPrior 
7d00: 3d 20 30 3b 20 2f 2a 20 50 72 69 6f 72 20 69 6e  = 0; /* Prior in
7d10: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
7d30: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
7d40: 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
7d50: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
7d60: 64 65 78 20 2a 70 50 6b 3b 20 20 20 20 20 20 20  dex *pPk;       
7d70: 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
7d80: 69 6e 64 65 78 2c 20 6f 72 20 4e 55 4c 4c 20 66  index, or NULL f
7d90: 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73 20  or rowid tables 
7da0: 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  */..  v = pParse
7db0: 2d 3e 70 56 64 62 65 3b 0a 20 20 70 50 6b 20 3d  ->pVdbe;.  pPk =
7dc0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
7dd0: 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69  ? 0 : sqlite3Pri
7de0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
7df0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  b);.  for(i=0, p
7e00: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
7e10: 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64  ; pIdx; i++, pId
7e20: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
7e30: 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78      assert( iIdx
7e40: 43 75 72 2b 69 21 3d 69 44 61 74 61 43 75 72 20  Cur+i!=iDataCur 
7e50: 7c 7c 20 70 50 6b 3d 3d 70 49 64 78 20 29 3b 0a  || pPk==pIdx );.
7e60: 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78 21      if( aRegIdx!
7e70: 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b 69 5d  =0 && aRegIdx[i]
7e80: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7e90: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 70 50      if( pIdx==pP
7ea0: 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  k ) continue;.  
7eb0: 20 20 69 66 28 20 69 49 64 78 43 75 72 2b 69 3d    if( iIdxCur+i=
7ec0: 3d 69 49 64 78 4e 6f 53 65 65 6b 20 29 20 63 6f  =iIdxNoSeek ) co
7ed0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56 64 62 65  ntinue;.    Vdbe
7ee0: 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
7ef0: 2c 20 22 47 65 6e 52 6f 77 49 64 78 44 65 6c 20  , "GenRowIdxDel 
7f00: 66 6f 72 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a  for %s", pIdx->z
7f10: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 31 20 3d  Name));.    r1 =
7f20: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
7f30: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
7f40: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
7f50: 20 30 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 26   0, 1,.        &
7f60: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 20 70  iPartIdxLabel, p
7f70: 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20  Prior, r1);.    
7f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f90: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
7fa0: 65 2c 20 69 49 64 78 43 75 72 2b 69 2c 20 72 31  e, iIdxCur+i, r1
7fb0: 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ,.        pIdx->
7fc0: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49  uniqNotNull ? pI
7fd0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 70 49  dx->nKeyCol : pI
7fe0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
7ff0: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
8000: 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
8010: 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
8020: 65 6c 29 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  el);.    pPrior 
8030: 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = pIdx;.  }.}../
8040: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8050: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 61 73 73  de that will ass
8060: 65 6d 62 6c 65 20 61 6e 20 69 6e 64 65 78 20 6b  emble an index k
8070: 65 79 20 61 6e 64 20 73 74 6f 72 65 73 20 69 74  ey and stores it
8080: 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20   in register.** 
8090: 72 65 67 4f 75 74 2e 20 20 54 68 65 20 6b 65 79  regOut.  The key
80a0: 20 77 69 74 68 20 62 65 20 66 6f 72 20 69 6e 64   with be for ind
80b0: 65 78 20 70 49 64 78 20 77 68 69 63 68 20 69 73  ex pIdx which is
80c0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
80d0: 62 2e 0a 2a 2a 20 69 43 75 72 20 69 73 20 74 68  b..** iCur is th
80e0: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72  e index of a cur
80f0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
8100: 70 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20 70  pTab table and p
8110: 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 74 68  ointing to.** th
8120: 65 20 65 6e 74 72 79 20 74 68 61 74 20 6e 65 65  e entry that nee
8130: 64 73 20 69 6e 64 65 78 69 6e 67 2e 20 20 49 66  ds indexing.  If
8140: 20 70 54 61 62 20 69 73 20 61 20 57 49 54 48 4f   pTab is a WITHO
8150: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
8160: 74 68 65 6e 0a 2a 2a 20 69 43 75 72 20 6d 75 73  then.** iCur mus
8170: 74 20 62 65 20 74 68 65 20 63 75 72 73 6f 72 20  t be the cursor 
8180: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
8190: 45 59 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  EY index..**.** 
81a0: 52 65 74 75 72 6e 20 61 20 72 65 67 69 73 74 65  Return a registe
81b0: 72 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69  r number which i
81c0: 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
81d0: 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 72 65 67   block of.** reg
81e0: 69 73 74 65 72 73 20 74 68 61 74 20 68 6f 6c 64  isters that hold
81f0: 73 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  s the elements o
8200: 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e  f the index key.
8210: 20 20 54 68 65 0a 2a 2a 20 62 6c 6f 63 6b 20 6f    The.** block o
8220: 66 20 72 65 67 69 73 74 65 72 73 20 68 61 73 20  f registers has 
8230: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 61  already been dea
8240: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
8250: 74 69 6d 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  time.** this rou
8260: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tine returns..**
8270: 0a 2a 2a 20 49 66 20 2a 70 69 50 61 72 74 49 64  .** If *piPartId
8280: 78 4c 61 62 65 6c 20 69 73 20 6e 6f 74 20 4e 55  xLabel is not NU
8290: 4c 4c 2c 20 66 69 6c 6c 20 69 74 20 69 6e 20 77  LL, fill it in w
82a0: 69 74 68 20 61 20 6c 61 62 65 6c 20 61 6e 64 20  ith a label and 
82b0: 6a 75 6d 70 0a 2a 2a 20 74 6f 20 74 68 61 74 20  jump.** to that 
82c0: 6c 61 62 65 6c 20 69 66 20 70 49 64 78 20 69 73  label if pIdx is
82d0: 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
82e0: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
82f0: 73 6b 69 70 70 65 64 2e 0a 2a 2a 20 54 68 65 20  skipped..** The 
8300: 6c 61 62 65 6c 20 73 68 6f 75 6c 64 20 62 65 20  label should be 
8310: 72 65 73 6f 6c 76 65 64 20 75 73 69 6e 67 20 73  resolved using s
8320: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
8330: 74 49 64 78 4c 61 62 65 6c 28 29 2e 0a 2a 2a 20  tIdxLabel()..** 
8340: 41 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  A partial index 
8350: 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65  should be skippe
8360: 64 20 69 66 20 69 74 73 20 57 48 45 52 45 20 63  d if its WHERE c
8370: 6c 61 75 73 65 20 65 76 61 6c 75 61 74 65 73 0a  lause evaluates.
8380: 2a 2a 20 74 6f 20 66 61 6c 73 65 20 6f 72 20 6e  ** to false or n
8390: 75 6c 6c 2e 20 20 49 66 20 70 49 64 78 20 69 73  ull.  If pIdx is
83a0: 20 6e 6f 74 20 61 20 70 61 72 74 69 61 6c 20 69   not a partial i
83b0: 6e 64 65 78 2c 20 2a 70 69 50 61 72 74 49 64 78  ndex, *piPartIdx
83c0: 4c 61 62 65 6c 0a 2a 2a 20 77 69 6c 6c 20 62 65  Label.** will be
83d0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 77 68 69   set to zero whi
83e0: 63 68 20 69 73 20 61 6e 20 65 6d 70 74 79 20 6c  ch is an empty l
83f0: 61 62 65 6c 20 74 68 61 74 20 69 73 20 69 67 6e  abel that is ign
8400: 6f 72 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74  ored by.** sqlit
8410: 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
8420: 4c 61 62 65 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Label()..**.** T
8430: 68 65 20 70 50 72 69 6f 72 20 61 6e 64 20 72 65  he pPrior and re
8440: 67 50 72 69 6f 72 20 70 61 72 61 6d 65 74 65 72  gPrior parameter
8450: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
8460: 70 6c 65 6d 65 6e 74 20 61 20 63 61 63 68 65 20  plement a cache 
8470: 74 6f 0a 2a 2a 20 61 76 6f 69 64 20 75 6e 6e 65  to.** avoid unne
8480: 63 65 73 73 61 72 79 20 72 65 67 69 73 74 65 72  cessary register
8490: 20 6c 6f 61 64 73 2e 20 20 49 66 20 70 50 72 69   loads.  If pPri
84a0: 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  or is not NULL, 
84b0: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 61 20  then it is.** a 
84c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 69 66  pointer to a dif
84d0: 66 65 72 65 6e 74 20 69 6e 64 65 78 20 66 6f 72  ferent index for
84e0: 20 77 68 69 63 68 20 61 6e 20 69 6e 64 65 78 20   which an index 
84f0: 6b 65 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  key has just bee
8500: 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 20 69 6e  n.** computed in
8510: 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 50  to register regP
8520: 72 69 6f 72 2e 20 20 49 66 20 74 68 65 20 63 75  rior.  If the cu
8530: 72 72 65 6e 74 20 70 49 64 78 20 69 6e 64 65 78  rrent pIdx index
8540: 20 69 73 20 67 65 6e 65 72 61 74 69 6e 67 0a 2a   is generating.*
8550: 2a 20 69 74 73 20 6b 65 79 20 69 6e 74 6f 20 74  * its key into t
8560: 68 65 20 73 61 6d 65 20 73 65 71 75 65 6e 63 65  he same sequence
8570: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
8580: 64 20 69 66 20 70 50 72 69 6f 72 20 61 6e 64 20  d if pPrior and 
8590: 70 49 64 78 20 73 68 61 72 65 0a 2a 2a 20 61 20  pIdx share.** a 
85a0: 63 6f 6c 75 6d 6e 20 69 6e 20 63 6f 6d 6d 6f 6e  column in common
85b0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 67 69 73  , then the regis
85c0: 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ter correspondin
85d0: 67 20 74 6f 20 74 68 61 74 20 63 6f 6c 75 6d 6e  g to that column
85e0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f 6c 64   already.** hold
85f0: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  s the correct va
8600: 6c 75 65 20 61 6e 64 20 74 68 65 20 6c 6f 61 64  lue and the load
8610: 69 6e 67 20 6f 66 20 74 68 61 74 20 72 65 67 69  ing of that regi
8620: 73 74 65 72 20 69 73 20 73 6b 69 70 70 65 64 2e  ster is skipped.
8630: 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a  .** This optimiz
8640: 61 74 69 6f 6e 20 69 73 20 68 65 6c 70 66 75 6c  ation is helpful
8650: 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 44 45   when doing a DE
8660: 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 54 45 47  LETE or an INTEG
8670: 52 49 54 59 5f 43 48 45 43 4b 20 0a 2a 2a 20 6f  RITY_CHECK .** o
8680: 6e 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 6d  n a table with m
8690: 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 2c  ultiple indices,
86a0: 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20   and especially 
86b0: 77 69 74 68 20 74 68 65 20 52 4f 57 49 44 20 6f  with the ROWID o
86c0: 72 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59  r.** PRIMARY KEY
86d0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
86e0: 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  index..*/.int sq
86f0: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
8700: 65 78 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  exKey(.  Parse *
8710: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
8720: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8730: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8740: 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  x,         /* Th
8750: 65 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63  e index for whic
8760: 68 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  h to generate a 
8770: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  key */.  int iDa
8780: 74 61 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a  taCur,        /*
8790: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
87a0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 74 61 6b  rom which to tak
87b0: 65 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 2a 2f  e column data */
87c0: 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 2c 20 20  .  int regOut,  
87d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74          /* Put t
87e0: 68 65 20 6e 65 77 20 6b 65 79 20 69 6e 74 6f 20  he new key into 
87f0: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 69 66  this register if
8800: 20 6e 6f 74 20 30 20 2a 2f 0a 20 20 69 6e 74 20   not 0 */.  int 
8810: 70 72 65 66 69 78 4f 6e 6c 79 2c 20 20 20 20 20  prefixOnly,     
8820: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6f 6e 6c 79   /* Compute only
8830: 20 61 20 75 6e 69 71 75 65 20 70 72 65 66 69 78   a unique prefix
8840: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
8850: 20 69 6e 74 20 2a 70 69 50 61 72 74 49 64 78 4c   int *piPartIdxL
8860: 61 62 65 6c 2c 20 2f 2a 20 4f 55 54 3a 20 4a 75  abel, /* OUT: Ju
8870: 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
8880: 20 74 6f 20 73 6b 69 70 20 70 61 72 74 69 61 6c   to skip partial
8890: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 49 6e 64 65   index */.  Inde
88a0: 78 20 2a 70 50 72 69 6f 72 2c 20 20 20 20 20 20  x *pPrior,      
88b0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 67   /* Previously g
88c0: 65 6e 65 72 61 74 65 64 20 69 6e 64 65 78 20 6b  enerated index k
88d0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  ey */.  int regP
88e0: 72 69 6f 72 20 20 20 20 20 20 20 20 20 2f 2a 20  rior         /* 
88f0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
8900: 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
8910: 74 65 64 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ted key */.){.  
8920: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
8930: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6a  ->pVdbe;.  int j
8940: 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  ;.  int regBase;
8950: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20 20  .  int nCol;..  
8960: 69 66 28 20 70 69 50 61 72 74 49 64 78 4c 61 62  if( piPartIdxLab
8970: 65 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  el ){.    if( pI
8980: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
8990: 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 50 61  e ){.      *piPa
89a0: 72 74 49 64 78 4c 61 62 65 6c 20 3d 20 73 71 6c  rtIdxLabel = sql
89b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
89c0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 70 50 61 72  l(v);.      pPar
89d0: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69  se->iSelfTab = i
89e0: 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20 20 20  DataCur + 1;.   
89f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
8a00: 46 61 6c 73 65 44 75 70 28 70 50 61 72 73 65 2c  FalseDup(pParse,
8a10: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
8a20: 68 65 72 65 2c 20 2a 70 69 50 61 72 74 49 64 78  here, *piPartIdx
8a30: 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20  Label, .        
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49      SQLITE_JUMPI
8a60: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50  FNULL);.      pP
8a70: 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
8a80: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8a90: 20 20 20 20 20 2a 70 69 50 61 72 74 49 64 78 4c       *piPartIdxL
8aa0: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  abel = 0;.    }.
8ab0: 20 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 28 70 72    }.  nCol = (pr
8ac0: 65 66 69 78 4f 6e 6c 79 20 26 26 20 70 49 64 78  efixOnly && pIdx
8ad0: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 29 20 3f  ->uniqNotNull) ?
8ae0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3a   pIdx->nKeyCol :
8af0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
8b00: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
8b10: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8b20: 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
8b30: 20 69 66 28 20 70 50 72 69 6f 72 20 26 26 20 28   if( pPrior && (
8b40: 72 65 67 42 61 73 65 21 3d 72 65 67 50 72 69 6f  regBase!=regPrio
8b50: 72 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 50 61  r || pPrior->pPa
8b60: 72 74 49 64 78 57 68 65 72 65 29 20 29 20 70 50  rtIdxWhere) ) pP
8b70: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  rior = 0;.  for(
8b80: 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b  j=0; j<nCol; j++
8b90: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f  ){.    if( pPrio
8ba0: 72 0a 20 20 20 20 20 26 26 20 70 50 72 69 6f 72  r.     && pPrior
8bb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70  ->aiColumn[j]==p
8bc0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
8bd0: 0a 20 20 20 20 20 26 26 20 70 50 72 69 6f 72 2d  .     && pPrior-
8be0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 58 4e  >aiColumn[j]!=XN
8bf0: 5f 45 58 50 52 0a 20 20 20 20 29 7b 0a 20 20 20  _EXPR.    ){.   
8c00: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6c 75 6d     /* This colum
8c10: 6e 20 77 61 73 20 61 6c 72 65 61 64 79 20 63 6f  n was already co
8c20: 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
8c30: 65 76 69 6f 75 73 20 69 6e 64 65 78 20 2a 2f 0a  evious index */.
8c40: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8c50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8c60: 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
8c70: 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  exColumn(pParse,
8c80: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
8c90: 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a   j, regBase+j);.
8ca0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
8cb0: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 69 73  lumn affinity is
8cc0: 20 52 45 41 4c 20 62 75 74 20 74 68 65 20 6e 75   REAL but the nu
8cd0: 6d 62 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  mber is an integ
8ce0: 65 72 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20  er, then it.    
8cf0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  ** might be stor
8d00: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ed in the table 
8d10: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 28 75  as an integer (u
8d20: 73 69 6e 67 20 61 20 63 6f 6d 70 61 63 74 0a 20  sing a compact. 
8d30: 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61     ** representa
8d40: 74 69 6f 6e 29 20 74 68 65 6e 20 63 6f 6e 76 65  tion) then conve
8d50: 72 74 65 64 20 74 6f 20 52 45 41 4c 20 62 79 20  rted to REAL by 
8d60: 61 6e 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  an OP_RealAffini
8d70: 74 79 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 2a  ty opcode..    *
8d80: 2a 20 42 75 74 20 77 65 20 61 72 65 20 67 65 74  * But we are get
8d90: 74 69 6e 67 20 72 65 61 64 79 20 74 6f 20 73 74  ting ready to st
8da0: 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 62  ore this value b
8db0: 61 63 6b 20 69 6e 74 6f 20 61 6e 20 69 6e 64 65  ack into an inde
8dc0: 78 2c 20 77 68 65 72 65 0a 20 20 20 20 2a 2a 20  x, where.    ** 
8dd0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e  it should be con
8de0: 76 65 72 74 65 64 20 62 79 20 74 6f 20 49 4e 54  verted by to INT
8df0: 45 47 45 52 20 61 67 61 69 6e 2e 20 20 53 6f 20  EGER again.  So 
8e00: 6f 6d 69 74 20 74 68 65 20 4f 50 5f 52 65 61 6c  omit the OP_Real
8e10: 41 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20  Affinity.    ** 
8e20: 6f 70 63 6f 64 65 20 69 66 20 69 74 20 69 73 20  opcode if it is 
8e30: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 73  present */.    s
8e40: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
8e50: 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20 4f  PriorOpcode(v, O
8e60: 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 29 3b  P_RealAffinity);
8e70: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 4f 75  .  }.  if( regOu
8e80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8e90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8ea0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8eb0: 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 4f  Base, nCol, regO
8ec0: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ut);.    if( pId
8ed0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  x->pTable->pSele
8ee0: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
8ef0: 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 73  t char *zAff = s
8f00: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
8f10: 69 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e 64  ityStr(pParse->d
8f20: 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  b, pIdx);.      
8f30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8f40: 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c  eP4(v, -1, zAff,
8f50: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
8f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8f70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
8f80: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
8f90: 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 72 65  ase, nCol);.  re
8fa0: 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
8fb0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 70 72 69 6f  ./*.** If a prio
8fc0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
8fd0: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
8fe0: 79 28 29 20 67 65 6e 65 72 61 74 65 64 20 61 20  y() generated a 
8ff0: 6a 75 6d 70 2d 6f 76 65 72 20 6c 61 62 65 6c 0a  jump-over label.
9000: 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
9010: 73 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  s a partial inde
9020: 78 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  x, then this rou
9030: 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
9040: 61 6c 6c 65 64 20 74 6f 0a 2a 2a 20 72 65 73 6f  alled to.** reso
9050: 6c 76 65 20 74 68 61 74 20 6c 61 62 65 6c 2e 0a  lve that label..
9060: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
9070: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
9080: 65 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  el(Parse *pParse
9090: 2c 20 69 6e 74 20 69 4c 61 62 65 6c 29 7b 0a 20  , int iLabel){. 
90a0: 20 69 66 28 20 69 4c 61 62 65 6c 20 29 7b 0a 20   if( iLabel ){. 
90b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
90c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73  solveLabel(pPars
90d0: 65 2d 3e 70 56 64 62 65 2c 20 69 4c 61 62 65 6c  e->pVdbe, iLabel
90e0: 29 3b 0a 20 20 7d 0a 7d 0a                       );.  }.}.