/ Hex Artifact Content
Login

Artifact 4a49ac22abb8b88a4c323af87e67289e4e802ebf336d745733e930bf928c0b80:


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 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
0610: 75 65 20 69 66 20 74 61 62 6c 65 20 70 54 61 62  ue if table pTab
0620: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
0630: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 69 73 20  *.** A table is 
0640: 72 65 61 64 2d 6f 6e 6c 79 20 69 66 20 61 6e 79  read-only if any
0650: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0660: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
0670: 2a 20 20 20 31 29 20 49 74 20 69 73 20 61 20 76  *   1) It is a v
0680: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
0690: 20 6e 6f 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   no implementati
06a0: 6f 6e 20 6f 66 20 74 68 65 20 78 55 70 64 61 74  on of the xUpdat
06b0: 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 20 20  e method.**     
06c0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 76 69 64   has been provid
06d0: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 74  ed.**.**   2) It
06e0: 20 69 73 20 61 20 73 79 73 74 65 6d 20 74 61 62   is a system tab
06f0: 6c 65 20 28 69 2e 65 2e 20 73 71 6c 69 74 65 5f  le (i.e. sqlite_
0700: 6d 61 73 74 65 72 29 2c 20 74 68 69 73 20 63 61  master), this ca
0710: 6c 6c 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ll is not.**    
0720: 20 20 70 61 72 74 20 6f 66 20 61 20 6e 65 73 74    part of a nest
0730: 65 64 20 70 61 72 73 65 20 61 6e 64 20 77 72 69  ed parse and wri
0740: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 70 72 61  table_schema pra
0750: 67 6d 61 20 68 61 73 20 6e 6f 74 20 0a 2a 2a 20  gma has not .** 
0760: 20 20 20 20 20 62 65 65 6e 20 73 70 65 63 69 66       been specif
0770: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 54  ied.**.**   3) T
0780: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 73 68  he table is a sh
0790: 61 64 6f 77 20 74 61 62 6c 65 2c 20 74 68 65 20  adow table, the 
07a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
07b0: 69 6f 6e 20 69 73 20 69 6e 0a 2a 2a 20 20 20 20  ion is in.**    
07c0: 20 20 64 65 66 65 6e 73 69 76 65 20 6d 6f 64 65    defensive mode
07d0: 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
07e0: 74 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  t sqlite3_prepar
07f0: 65 28 29 0a 2a 2a 20 20 20 20 20 20 69 73 20 66  e().**      is f
0800: 6f 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 53  or a top-level S
0810: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
0820: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 49  .static int tabI
0830: 73 52 65 61 64 4f 6e 6c 79 28 50 61 72 73 65 20  sReadOnly(Parse 
0840: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
0850: 70 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  pTab){.  sqlite3
0860: 20 2a 64 62 3b 0a 20 20 69 66 28 20 49 73 56 69   *db;.  if( IsVi
0870: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
0880: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0890: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
08a0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  e->db, pTab)->pM
08b0: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  od->pModule->xUp
08c0: 64 61 74 65 3d 3d 30 3b 0a 20 20 7d 0a 20 20 69  date==0;.  }.  i
08d0: 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
08e0: 67 73 20 26 20 28 54 46 5f 52 65 61 64 6f 6e 6c  gs & (TF_Readonl
08f0: 79 7c 54 46 5f 53 68 61 64 6f 77 29 29 3d 3d 30  y|TF_Shadow))==0
0900: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64   ) return 0;.  d
0910: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0920: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
0930: 46 6c 61 67 73 20 26 20 54 46 5f 52 65 61 64 6f  Flags & TF_Reado
0940: 6e 6c 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  nly)!=0 ){.    r
0950: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 57 72 69  eturn sqlite3Wri
0960: 74 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 3d  tableSchema(db)=
0970: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  =0 && pParse->ne
0980: 73 74 65 64 3d 3d 30 3b 0a 20 20 7d 0a 20 20 61  sted==0;.  }.  a
0990: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 74 61 62  ssert( pTab->tab
09a0: 46 6c 61 67 73 20 26 20 54 46 5f 53 68 61 64 6f  Flags & TF_Shado
09b0: 77 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64  w );.  return (d
09c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
09d0: 45 5f 44 65 66 65 6e 73 69 76 65 29 21 3d 30 0a  E_Defensive)!=0.
09e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 64 62             && db
09f0: 2d 3e 6e 56 64 62 65 45 78 65 63 3d 3d 30 0a 20  ->nVdbeExec==0. 
0a00: 20 20 20 20 20 20 20 20 20 20 26 26 20 64 62 2d            && db-
0a10: 3e 70 56 74 61 62 43 74 78 3d 3d 30 3b 0a 7d 0a  >pVtabCtx==0;.}.
0a20: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
0a30: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 69  make sure the gi
0a40: 76 65 6e 20 74 61 62 6c 65 20 69 73 20 77 72 69  ven table is wri
0a50: 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20 69 73  table.  If it is
0a60: 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61 62 6c 65   not.** writable
0a70: 2c 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  , generate an er
0a80: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
0a90: 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 69 74  return 1.  If it
0aa0: 20 69 73 0a 2a 2a 20 77 72 69 74 61 62 6c 65 20   is.** writable 
0ab0: 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a 69 6e 74  return 0;.*/.int
0ac0: 20 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e   sqlite3IsReadOn
0ad0: 6c 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ly(Parse *pParse
0ae0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
0af0: 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20 20 69 66  nt viewOk){.  if
0b00: 28 20 74 61 62 49 73 52 65 61 64 4f 6e 6c 79 28  ( tabIsReadOnly(
0b10: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
0b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
0b30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
0b40: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
0b50: 65 20 6d 6f 64 69 66 69 65 64 22 2c 20 70 54 61  e modified", pTa
0b60: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
0b70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66  eturn 1;.  }.#if
0b80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0b90: 5f 56 49 45 57 0a 20 20 69 66 28 20 21 76 69 65  _VIEW.  if( !vie
0ba0: 77 4f 6b 20 26 26 20 70 54 61 62 2d 3e 70 53 65  wOk && pTab->pSe
0bb0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
0bc0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
0bd0: 73 65 2c 22 63 61 6e 6e 6f 74 20 6d 6f 64 69 66  se,"cannot modif
0be0: 79 20 25 73 20 62 65 63 61 75 73 65 20 69 74 20  y %s because it 
0bf0: 69 73 20 61 20 76 69 65 77 22 2c 70 54 61 62 2d  is a view",pTab-
0c00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
0c10: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
0c20: 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
0c30: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0c40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
0c50: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0c60: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
0c70: 29 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65  )./*.** Evaluate
0c80: 20 61 20 76 69 65 77 20 61 6e 64 20 73 74 6f 72   a view and stor
0c90: 65 20 69 74 73 20 72 65 73 75 6c 74 20 69 6e 20  e its result in 
0ca0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
0cb0: 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 70 57 68 65  le.  The.** pWhe
0cc0: 72 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  re argument is a
0cd0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 57 48 45 52 45  n optional WHERE
0ce0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 73   clause that res
0cf0: 74 72 69 63 74 73 20 74 68 65 0a 2a 2a 20 73 65  tricts the.** se
0d00: 74 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  t of rows in the
0d10: 20 76 69 65 77 20 74 68 61 74 20 61 72 65 20 74   view that are t
0d20: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
0d30: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
0d40: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0d50: 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65  e3MaterializeVie
0d60: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
0d70: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
0d80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
0d90: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
0da0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0db0: 73 65 20 69 6e 20 77 68 69 63 68 20 76 69 65 77  se in which view
0dc0: 20 72 65 73 69 64 65 73 20 2a 2f 0a 20 20 54 61   resides */.  Ta
0dd0: 62 6c 65 20 2a 70 56 69 65 77 2c 20 20 20 20 20  ble *pView,     
0de0: 20 20 20 2f 2a 20 56 69 65 77 20 64 65 66 69 6e     /* View defin
0df0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ition */.  Expr 
0e00: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0e10: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 57 48 45 52  /* Optional WHER
0e20: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
0e30: 64 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  dded */.  ExprLi
0e40: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 2f  st *pOrderBy,  /
0e50: 2a 20 4f 70 74 69 6f 6e 61 6c 20 4f 52 44 45 52  * Optional ORDER
0e60: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0e70: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0e80: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
0e90: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
0ea0: 0a 20 20 69 6e 74 20 69 43 75 72 20 20 20 20 20  .  int iCur     
0eb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0ec0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 65 70 68  r number for eph
0ed0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  emeral table */.
0ee0: 29 7b 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  ){.  SelectDest 
0ef0: 64 65 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  dest;.  Select *
0f00: 70 53 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  pSel;.  SrcList 
0f10: 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
0f20: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0f30: 64 62 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 73  db;.  pWhere = s
0f40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
0f50: 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
0f60: 70 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53  pFrom = sqlite3S
0f70: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
0f80: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
0f90: 20 70 46 72 6f 6d 20 29 7b 0a 20 20 20 20 61 73   pFrom ){.    as
0fa0: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 53 72  sert( pFrom->nSr
0fb0: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 72 6f  c==1 );.    pFro
0fc0: 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  m->a[0].zName = 
0fd0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
0fe0: 64 62 2c 20 70 56 69 65 77 2d 3e 7a 4e 61 6d 65  db, pView->zName
0ff0: 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 5b  );.    pFrom->a[
1000: 30 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  0].zDatabase = s
1010: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1020: 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b, db->aDb[iDb].
1030: 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 61  zDbSName);.    a
1040: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 61 5b  ssert( pFrom->a[
1050: 30 5d 2e 70 4f 6e 3d 3d 30 20 29 3b 0a 20 20 20  0].pOn==0 );.   
1060: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1070: 61 5b 30 5d 2e 70 55 73 69 6e 67 3d 3d 30 20 29  a[0].pUsing==0 )
1080: 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 20 3d 20 73  ;.  }.  pSel = s
1090: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
10a0: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
10b0: 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20  , pWhere, 0, 0, 
10c0: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 53 46 5f 49 6e 63 6c 75 64 65 48       SF_IncludeH
10f0: 69 64 64 65 6e 2c 20 70 4c 69 6d 69 74 29 3b 0a  idden, pLimit);.
1100: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1110: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
1120: 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 69 43 75  RT_EphemTab, iCu
1130: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  r);.  sqlite3Sel
1140: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
1150: 2c 20 26 64 65 73 74 29 3b 0a 20 20 73 71 6c 69  , &dest);.  sqli
1160: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1170: 64 62 2c 20 70 53 65 6c 29 3b 0a 7d 0a 23 65 6e  db, pSel);.}.#en
1180: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
11b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
11c0: 52 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  R) */..#if defin
11d0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11e0: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
11f0: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
1200: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1210: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 47 65  BQUERY)./*.** Ge
1220: 6e 65 72 61 74 65 20 61 6e 20 65 78 70 72 65 73  nerate an expres
1230: 73 69 6f 6e 20 74 72 65 65 20 74 6f 20 69 6d 70  sion tree to imp
1240: 6c 65 6d 65 6e 74 20 74 68 65 20 57 48 45 52 45  lement the WHERE
1250: 2c 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 61  , ORDER BY,.** a
1260: 6e 64 20 4c 49 4d 49 54 2f 4f 46 46 53 45 54 20  nd LIMIT/OFFSET 
1270: 70 6f 72 74 69 6f 6e 20 6f 66 20 44 45 4c 45 54  portion of DELET
1280: 45 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  E and UPDATE sta
1290: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  tements..**.**  
12a0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
12b0: 61 62 6c 65 5f 77 78 79 7a 20 57 48 45 52 45 20  able_wxyz WHERE 
12c0: 61 3c 35 20 4f 52 44 45 52 20 42 59 20 61 20 4c  a<5 ORDER BY a L
12d0: 49 4d 49 54 20 31 3b 0a 2a 2a 20 20 20 20 20 20  IMIT 1;.**      
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1300: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1310: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 70 4c 69 6d 69 74 57 68 65 72 65 20      pLimitWhere 
1340: 28 70 49 6e 43 6c 61 75 73 65 29 0a 2a 2f 0a 45  (pInClause).*/.E
1350: 78 70 72 20 2a 73 71 6c 69 74 65 33 4c 69 6d 69  xpr *sqlite3Limi
1360: 74 57 68 65 72 65 28 0a 20 20 50 61 72 73 65 20  tWhere(.  Parse 
1370: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1380: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1390: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
13a0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
13d0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
13e0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
13f0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
1400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1410: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1420: 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f    May be null */
1430: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1440: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20  derBy,          
1450: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1460: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1470: 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  null */.  Expr *
1480: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
1490: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
14a0: 4d 49 54 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  MIT clause.  May
14b0: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 63 68   be null */.  ch
14c0: 61 72 20 2a 7a 53 74 6d 74 54 79 70 65 20 20 20  ar *zStmtType   
14d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69             /* Ei
14e0: 74 68 65 72 20 44 45 4c 45 54 45 20 6f 72 20 55  ther DELETE or U
14f0: 50 44 41 54 45 2e 20 20 46 6f 72 20 65 72 72 20  PDATE.  For err 
1500: 6d 73 67 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  msgs. */.){.  sq
1510: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1520: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
1530: 70 4c 68 73 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pLhs = NULL;    
1540: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
1550: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 20 6f   IN(SELECT...) o
1560: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
1570: 72 20 2a 70 49 6e 43 6c 61 75 73 65 20 3d 20 4e  r *pInClause = N
1580: 55 4c 4c 3b 20 20 20 20 20 20 2f 2a 20 57 48 45  ULL;      /* WHE
1590: 52 45 20 72 6f 77 69 64 20 49 4e 20 28 20 73 65  RE rowid IN ( se
15a0: 6c 65 63 74 20 29 20 2a 2f 0a 20 20 45 78 70 72  lect ) */.  Expr
15b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 4e  List *pEList = N
15c0: 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 45 78 70 72  ULL;     /* Expr
15d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
15e0: 61 6e 69 6e 67 20 6f 6e 6c 79 20 70 53 65 6c 65  aning only pSele
15f0: 63 74 52 6f 77 69 64 20 2a 2f 0a 20 20 53 72 63  ctRowid */.  Src
1600: 4c 69 73 74 20 2a 70 53 65 6c 65 63 74 53 72 63  List *pSelectSrc
1610: 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 53 45 4c   = NULL;  /* SEL
1620: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78  ECT rowid FROM x
1630: 20 2e 2e 2e 20 28 64 75 70 20 6f 66 20 70 53 72   ... (dup of pSr
1640: 63 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  c) */.  Select *
1650: 70 53 65 6c 65 63 74 20 3d 20 4e 55 4c 4c 3b 20  pSelect = NULL; 
1660: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
1670: 20 53 45 4c 45 43 54 20 74 72 65 65 20 2a 2f 0a   SELECT tree */.
1680: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
1690: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
16a0: 74 68 65 72 65 20 69 73 6e 27 74 20 61 6e 20 4f  there isn't an O
16b0: 52 44 45 52 20 42 59 20 77 69 74 68 6f 75 74 20  RDER BY without 
16c0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
16d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
16e0: 72 42 79 20 26 26 20 70 4c 69 6d 69 74 3d 3d 30  rBy && pLimit==0
16f0: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
1700: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1710: 20 22 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f   "ORDER BY witho
1720: 75 74 20 4c 49 4d 49 54 20 6f 6e 20 25 73 22 2c  ut LIMIT on %s",
1730: 20 7a 53 74 6d 74 54 79 70 65 29 3b 0a 20 20 20   zStmtType);.   
1740: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1750: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1760: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
1770: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1780: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  e(pParse->db, pO
1790: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 72 65 74  rderBy);.    ret
17a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
17b0: 20 57 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   We only need to
17c0: 20 67 65 6e 65 72 61 74 65 20 61 20 73 65 6c 65   generate a sele
17d0: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66  ct expression if
17e0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61   there.  ** is a
17f0: 20 6c 69 6d 69 74 2f 6f 66 66 73 65 74 20 74 65   limit/offset te
1800: 72 6d 20 74 6f 20 65 6e 66 6f 72 63 65 2e 0a 20  rm to enforce.. 
1810: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69 74   */.  if( pLimit
1820: 20 3d 3d 20 30 20 29 20 7b 0a 20 20 20 20 72 65   == 0 ) {.    re
1830: 74 75 72 6e 20 70 57 68 65 72 65 3b 0a 20 20 7d  turn pWhere;.  }
1840: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1850: 61 20 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  a select express
1860: 69 6f 6e 20 74 72 65 65 20 74 6f 20 65 6e 66 6f  ion tree to enfo
1870: 72 63 65 20 74 68 65 20 6c 69 6d 69 74 2f 6f 66  rce the limit/of
1880: 66 73 65 74 20 0a 20 20 2a 2a 20 74 65 72 6d 20  fset .  ** term 
1890: 66 6f 72 20 74 68 65 20 44 45 4c 45 54 45 20 6f  for the DELETE o
18a0: 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
18b0: 6e 74 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  nt.  For example
18c0: 3a 0a 20 20 2a 2a 20 20 20 44 45 4c 45 54 45 20  :.  **   DELETE 
18d0: 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45  FROM table_a WHE
18e0: 52 45 20 63 6f 6c 31 3d 31 20 4f 52 44 45 52 20  RE col1=1 ORDER 
18f0: 42 59 20 63 6f 6c 32 20 4c 49 4d 49 54 20 31 20  BY col2 LIMIT 1 
1900: 4f 46 46 53 45 54 20 31 0a 20 20 2a 2a 20 62 65  OFFSET 1.  ** be
1910: 63 6f 6d 65 73 3a 0a 20 20 2a 2a 20 20 20 44 45  comes:.  **   DE
1920: 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f  LETE FROM table_
1930: 61 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e  a WHERE rowid IN
1940: 20 28 20 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   ( .  **     SEL
1950: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
1960: 61 62 6c 65 5f 61 20 57 48 45 52 45 20 63 6f 6c  able_a WHERE col
1970: 31 3d 31 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  1=1 ORDER BY col
1980: 32 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54  2 LIMIT 1 OFFSET
1990: 20 31 0a 20 20 2a 2a 20 20 20 29 3b 0a 20 20 2a   1.  **   );.  *
19a0: 2f 0a 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  /..  pTab = pSrc
19b0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
19c0: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
19d0: 29 20 29 7b 0a 20 20 20 20 70 4c 68 73 20 3d 20  ) ){.    pLhs = 
19e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
19f0: 72 73 65 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20  rse, TK_ROW, 0, 
1a00: 30 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  0);.    pEList =
1a10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a20: 41 70 70 65 6e 64 28 0a 20 20 20 20 20 20 20 20  Append(.        
1a30: 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
1a40: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1a50: 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 29 0a 20 20  TK_ROW, 0, 0).  
1a60: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
1a70: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1a80: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1a90: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
1aa0: 20 69 66 28 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f   if( pPk->nKeyCo
1ab0: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 63 6f  l==1 ){.      co
1ac0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
1ad0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b  = pTab->aCol[pPk
1ae0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 7a  ->aiColumn[0]].z
1af0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4c 68 73  Name;.      pLhs
1b00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1b10: 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1b20: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
1b30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b40: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1b50: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
1b60: 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 29  , TK_ID, zName))
1b70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1b90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e  for(i=0; i<pPk->
1ba0: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1bb0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
1bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1bd0: 20 54 4b 5f 49 44 2c 20 70 54 61 62 2d 3e 61 43   TK_ID, pTab->aC
1be0: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
1bf0: 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  [i]].zName);.   
1c00: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71       pEList = sq
1c10: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1c20: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 4c 69  end(pParse, pELi
1c30: 73 74 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  st, p);.      }.
1c40: 20 20 20 20 20 20 70 4c 68 73 20 3d 20 73 71 6c        pLhs = sql
1c50: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1c60: 2c 20 54 4b 5f 56 45 43 54 4f 52 2c 20 30 2c 20  , TK_VECTOR, 0, 
1c70: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  0);.      if( pL
1c80: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  hs ){.        pL
1c90: 68 73 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  hs->x.pList = sq
1ca0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1cb0: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
1cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cd0: 20 7d 0a 0a 20 20 2f 2a 20 64 75 70 6c 69 63 61   }..  /* duplica
1ce0: 74 65 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  te the FROM clau
1cf0: 73 65 20 61 73 20 69 74 20 69 73 20 6e 65 65 64  se as it is need
1d00: 65 64 20 62 79 20 62 6f 74 68 20 74 68 65 20 44  ed by both the D
1d10: 45 4c 45 54 45 2f 55 50 44 41 54 45 20 74 72 65  ELETE/UPDATE tre
1d20: 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 53  e.  ** and the S
1d30: 45 4c 45 43 54 20 73 75 62 74 72 65 65 2e 20 2a  ELECT subtree. *
1d40: 2f 0a 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  /.  pSrc->a[0].p
1d50: 54 61 62 20 3d 20 30 3b 0a 20 20 70 53 65 6c 65  Tab = 0;.  pSele
1d60: 63 74 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ctSrc = sqlite3S
1d70: 72 63 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  rcListDup(pParse
1d80: 2d 3e 64 62 2c 20 70 53 72 63 2c 20 30 29 3b 0a  ->db, pSrc, 0);.
1d90: 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61    pSrc->a[0].pTa
1da0: 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53 72 63  b = pTab;.  pSrc
1db0: 2d 3e 61 5b 30 5d 2e 70 49 42 49 6e 64 65 78 20  ->a[0].pIBIndex 
1dc0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 67 65 6e 65 72  = 0;..  /* gener
1dd0: 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 65  ate the SELECT e
1de0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
1df0: 2a 2f 0a 20 20 70 53 65 6c 65 63 74 20 3d 20 73  */.  pSelect = s
1e00: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
1e10: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
1e20: 70 53 65 6c 65 63 74 53 72 63 2c 20 70 57 68 65  pSelectSrc, pWhe
1e30: 72 65 2c 20 30 20 2c 30 2c 20 0a 20 20 20 20 20  re, 0 ,0, .     
1e40: 20 70 4f 72 64 65 72 42 79 2c 30 2c 70 4c 69 6d   pOrderBy,0,pLim
1e50: 69 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 6e 6f  it.  );..  /* no
1e60: 77 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 6e  w generate the n
1e70: 65 77 20 57 48 45 52 45 20 72 6f 77 69 64 20 49  ew WHERE rowid I
1e80: 4e 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  N clause for the
1e90: 20 44 45 4c 45 54 45 2f 55 44 50 41 54 45 20 2a   DELETE/UDPATE *
1ea0: 2f 0a 20 20 70 49 6e 43 6c 61 75 73 65 20 3d 20  /.  pInClause = 
1eb0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1ec0: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 4c 68 73  rse, TK_IN, pLhs
1ed0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , 0);.  sqlite3P
1ee0: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
1ef0: 61 72 73 65 2c 20 70 49 6e 43 6c 61 75 73 65 2c  arse, pInClause,
1f00: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74   pSelect);.  ret
1f10: 75 72 6e 20 70 49 6e 43 6c 61 75 73 65 3b 0a 7d  urn pInClause;.}
1f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1f30: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1f40: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
1f50: 49 4d 49 54 29 20 2a 2f 0a 20 20 20 20 20 20 20  IMIT) */.       
1f60: 2f 2a 20 20 20 20 20 20 26 26 20 21 64 65 66 69  /*      && !defi
1f70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f80: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a  SUBQUERY) */../*
1f90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1fa0: 65 20 66 6f 72 20 61 20 44 45 4c 45 54 45 20 46  e for a DELETE F
1fb0: 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ROM statement..*
1fc0: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
1fd0: 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a 20  FROM table_wxyz 
1fe0: 57 48 45 52 45 20 61 3c 35 20 41 4e 44 20 62 20  WHERE a<5 AND b 
1ff0: 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20  NOT NULL;.**    
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
2010: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f  ______/       \_
2020: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
2030: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2040: 20 20 20 20 20 70 54 61 62 4c 69 73 74 20 20 20       pTabList   
2050: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
2060: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
2070: 33 44 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20 50  3DeleteFrom(.  P
2080: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2090: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
20a0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
20b0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
20c0: 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  st,     /* The t
20d0: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
20e0: 77 65 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65  we should delete
20f0: 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78 70   things */.  Exp
2100: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
2110: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2120: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2130: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 4c   null */.  ExprL
2140: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
2150: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
2160: 61 75 73 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c  ause. May be nul
2170: 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  l */.  Expr *pLi
2180: 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mit           /*
2190: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 4d   LIMIT clause. M
21a0: 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ay be null */.){
21b0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
21c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21d0: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
21e0: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 54 61  e engine */.  Ta
21f0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
2200: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2210: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 72 65 63  e from which rec
2220: 6f 72 64 73 20 77 69 6c 6c 20 62 65 20 64 65 6c  ords will be del
2230: 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  eted */.  int i;
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2260: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
2270: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
2280: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
2290: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
22a0: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
22b0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
22c0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
22d0: 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  er indices of th
22e0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
22f0: 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
2300: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2310: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2320: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74  le */.  int iDat
2330: 61 43 75 72 20 3d 20 30 3b 20 20 20 20 20 20 2f  aCur = 0;      /
2340: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  * VDBE cursor fo
2350: 72 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  r the canonical 
2360: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
2370: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 30   int iIdxCur = 0
2380: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ;       /* Curso
2390: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
23a0: 66 69 72 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  first index */. 
23b0: 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20   int nIdx;      
23c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23d0: 72 20 6f 66 20 69 6e 64 69 63 65 73 20 2a 2f 0a  r of indices */.
23e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
23f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
2400: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
2410: 75 72 65 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e  ure */.  AuthCon
2420: 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20  text sContext;  
2430: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
2440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
2450: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2460: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
2470: 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  text to resolve 
2480: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a  expressions in *
2490: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
24a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24b0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
24c0: 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74 20 3d 20  .  int memCnt = 
24d0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  0;        /* Mem
24e0: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 66 6f  ory cell used fo
24f0: 72 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 69 6e  r change countin
2500: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 61 75 74  g */.  int rcaut
2510: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h;            /*
2520: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
2530: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
2540: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
2550: 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20 20 20  nt eOnePass;    
2560: 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53 53        /* ONEPASS
2570: 5f 4f 46 46 20 6f 72 20 5f 53 49 4e 47 4c 45 20  _OFF or _SINGLE 
2580: 6f 72 20 5f 4d 55 4c 54 49 20 2a 2f 0a 20 20 69  or _MULTI */.  i
2590: 6e 74 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  nt aiCurOnePass[
25a0: 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20 77 72 69  2];   /* The wri
25b0: 74 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  te cursors opene
25c0: 64 20 62 79 20 57 48 45 52 45 5f 4f 4e 45 50 41  d by WHERE_ONEPA
25d0: 53 53 20 2a 2f 0a 20 20 75 38 20 2a 61 54 6f 4f  SS */.  u8 *aToO
25e0: 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  pen = 0;       /
25f0: 2a 20 4f 70 65 6e 20 63 75 72 73 6f 72 20 69 54  * Open cursor iT
2600: 61 62 43 75 72 2b 6a 20 69 66 20 61 54 6f 4f 70  abCur+j if aToOp
2610: 65 6e 5b 6a 5d 20 69 73 20 74 72 75 65 20 2a 2f  en[j] is true */
2620: 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20  .  Index *pPk;  
2630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2640: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
2650: 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ex on the table 
2660: 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 30  */.  int iPk = 0
2670: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
2680: 69 72 73 74 20 6f 66 20 6e 50 6b 20 72 65 67 69  irst of nPk regi
2690: 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 50 52  sters holding PR
26a0: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20  IMARY KEY value 
26b0: 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 20 3d 20 31  */.  i16 nPk = 1
26c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
26d0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
26e0: 20 69 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20   in the PRIMARY 
26f0: 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20 69 4b 65  KEY */.  int iKe
2700: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2710: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
2720: 6f 6c 64 69 6e 67 20 6b 65 79 20 6f 66 20 72 6f  olding key of ro
2730: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
2740: 2a 2f 0a 20 20 69 31 36 20 6e 4b 65 79 3b 20 20  */.  i16 nKey;  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2760: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
2770: 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 72 6f 77  cells in the row
2780: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 45   key */.  int iE
2790: 70 68 43 75 72 20 3d 20 30 3b 20 20 20 20 20 20  phCur = 0;      
27a0: 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74 61   /* Ephemeral ta
27b0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ble holding all 
27c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
27d0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  es */.  int iRow
27e0: 53 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Set = 0;       /
27f0: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 72  * Register for r
2800: 6f 77 73 65 74 20 6f 66 20 72 6f 77 73 20 74 6f  owset of rows to
2810: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
2820: 20 61 64 64 72 42 79 70 61 73 73 20 3d 20 30 3b   addrBypass = 0;
2830: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2840: 66 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  f jump over the 
2850: 64 65 6c 65 74 65 20 6c 6f 67 69 63 20 2a 2f 0a  delete logic */.
2860: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 20 3d    int addrLoop =
2870: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20   0;      /* Top 
2880: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f  of the delete lo
2890: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
28a0: 45 70 68 4f 70 65 6e 20 3d 20 30 3b 20 20 20 2f  EphOpen = 0;   /
28b0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
28c0: 20 6f 70 65 6e 20 74 68 65 20 45 70 68 65 6d 65   open the Epheme
28d0: 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ral table */.  i
28e0: 6e 74 20 62 43 6f 6d 70 6c 65 78 3b 20 20 20 20  nt bComplex;    
28f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2900: 20 74 68 65 72 65 20 61 72 65 20 74 72 69 67 67   there are trigg
2910: 65 72 73 20 6f 72 20 46 4b 73 20 6f 72 0a 20 20  ers or FKs or.  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 71 75 65         ** subque
2940: 72 69 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ries in the WHER
2950: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 0a 23 69  E clause */. .#i
2960: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2970: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
2980: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
2990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29a0: 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74   if attempting t
29b0: 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 61 20  o delete from a 
29c0: 76 69 65 77 20 2a 2f 0a 20 20 54 72 69 67 67 65  view */.  Trigge
29d0: 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20  r *pTrigger;    
29e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
29f0: 66 20 74 61 62 6c 65 20 74 72 69 67 67 65 72 73  f table triggers
2a00: 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
2a10: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
2a20: 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20  t(&sContext, 0, 
2a30: 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29  sizeof(sContext)
2a40: 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
2a50: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
2a60: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2a70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2a80: 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f      goto delete_
2a90: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
2aa0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
2ab0: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  List->nSrc==1 );
2ac0: 0a 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ...  /* Locate t
2ad0: 68 65 20 74 61 62 6c 65 20 77 68 69 63 68 20 77  he table which w
2ae0: 65 20 77 61 6e 74 20 74 6f 20 64 65 6c 65 74 65  e want to delete
2af0: 2e 20 20 54 68 69 73 20 74 61 62 6c 65 20 68 61  .  This table ha
2b00: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 75 74  s to be.  ** put
2b10: 20 69 6e 20 61 6e 20 53 72 63 4c 69 73 74 20 73   in an SrcList s
2b20: 74 72 75 63 74 75 72 65 20 62 65 63 61 75 73 65  tructure because
2b30: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 75 62   some of the sub
2b40: 72 6f 75 74 69 6e 65 73 20 77 65 0a 20 20 2a 2a  routines we.  **
2b50: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 69 6e 67   will be calling
2b60: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
2b70: 20 77 6f 72 6b 20 77 69 74 68 20 6d 75 6c 74 69   work with multi
2b80: 70 6c 65 20 74 61 62 6c 65 73 20 61 6e 64 20 65  ple tables and e
2b90: 78 70 65 63 74 0a 20 20 2a 2a 20 61 6e 20 53 72  xpect.  ** an Sr
2ba0: 63 4c 69 73 74 2a 20 70 61 72 61 6d 65 74 65 72  cList* parameter
2bb0: 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74   instead of just
2bc0: 20 61 20 54 61 62 6c 65 2a 20 70 61 72 61 6d 65   a Table* parame
2bd0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ter..  */.  pTab
2be0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
2bf0: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
2c00: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28  pTabList);.  if(
2c10: 20 70 54 61 62 3d 3d 30 20 29 20 20 67 6f 74 6f   pTab==0 )  goto
2c20: 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65   delete_from_cle
2c30: 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  anup;..  /* Figu
2c40: 72 65 20 6f 75 74 20 69 66 20 77 65 20 68 61 76  re out if we hav
2c50: 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 61  e any triggers a
2c60: 6e 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  nd if the table 
2c70: 62 65 69 6e 67 0a 20 20 2a 2a 20 64 65 6c 65 74  being.  ** delet
2c80: 65 64 20 66 72 6f 6d 20 69 73 20 61 20 76 69 65  ed from is a vie
2c90: 77 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  w.  */.#ifndef S
2ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
2cb0: 45 52 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  ER.  pTrigger = 
2cc0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45  sqlite3TriggersE
2cd0: 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  xist(pParse, pTa
2ce0: 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c  b, TK_DELETE, 0,
2cf0: 20 30 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20   0);.  isView = 
2d00: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30  pTab->pSelect!=0
2d10: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2d20: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
2d30: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65  fine isView 0.#e
2d40: 6e 64 69 66 0a 20 20 62 43 6f 6d 70 6c 65 78 20  ndif.  bComplex 
2d50: 3d 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71  = pTrigger || sq
2d60: 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28  lite3FkRequired(
2d70: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
2d80: 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
2d90: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75  TE_OMIT_VIEW.# u
2da0: 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64 65  ndef isView.# de
2db0: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65  fine isView 0.#e
2dc0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2dd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
2de0: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 20  E_DELETE_LIMIT. 
2df0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
2e00: 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
2e10: 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 0a  ite3LimitWhere(.
2e20: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
2e30: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2e40: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d  , pOrderBy, pLim
2e50: 69 74 2c 20 22 44 45 4c 45 54 45 22 0a 20 20 20  it, "DELETE".   
2e60: 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   );.    pOrderBy
2e70: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74   = 0;.    pLimit
2e80: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2e90: 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
2ea0: 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 2c  s really a view,
2eb0: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68 61   make sure it ha
2ec0: 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
2ed0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ed..  */.  if( s
2ee0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
2ef0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2f00: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
2f10: 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  to delete_from_c
2f20: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 69  leanup;.  }..  i
2f30: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
2f40: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
2f50: 62 2c 20 28 70 54 72 69 67 67 65 72 3f 31 3a 30  b, (pTrigger?1:0
2f60: 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  )) ){.    goto d
2f70: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
2f80: 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  up;.  }.  iDb = 
2f90: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2fa0: 6e 64 65 78 32 28 64 62 2c 20 70 54 61 62 2d 3e  ndex2(db, pTab->
2fb0: 70 53 63 68 65 6d 61 2c 20 70 54 61 62 4c 69 73  pSchema, pTabLis
2fc0: 74 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  t->a[0].zDatabas
2fd0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  e);.  assert( iD
2fe0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72  b<db->nDb );.  r
2ff0: 63 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41  cauth = sqlite3A
3000: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
3010: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
3020: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
3030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
3050: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
3060: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  me);.  assert( r
3070: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b  cauth==SQLITE_OK
3080: 20 7c 7c 20 72 63 61 75 74 68 3d 3d 53 51 4c 49   || rcauth==SQLI
3090: 54 45 5f 44 45 4e 59 20 7c 7c 20 72 63 61 75 74  TE_DENY || rcaut
30a0: 68 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  h==SQLITE_IGNORE
30b0: 20 29 3b 0a 20 20 69 66 28 20 72 63 61 75 74 68   );.  if( rcauth
30c0: 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b  ==SQLITE_DENY ){
30d0: 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  .    goto delete
30e0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
30f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 21 69 73 56   }.  assert(!isV
3100: 69 65 77 20 7c 7c 20 70 54 72 69 67 67 65 72 29  iew || pTrigger)
3110: 3b 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 63  ;..  /* Assign c
3120: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
3130: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 61   the table and a
3140: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 0a  ll its indices..
3150: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
3160: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
3170: 20 29 3b 0a 20 20 69 54 61 62 43 75 72 20 3d 20   );.  iTabCur = 
3180: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
3190: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
31a0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f 72 28 6e  >nTab++;.  for(n
31b0: 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Idx=0, pIdx=pTab
31c0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
31d0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
31e0: 2c 20 6e 49 64 78 2b 2b 29 7b 0a 20 20 20 20 70  , nIdx++){.    p
31f0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
3200: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 74   }..  /* Start t
3210: 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78 74 0a  he view context.
3220: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
3230: 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
3240: 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28  AuthContextPush(
3250: 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78  pParse, &sContex
3260: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
3270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
3280: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
3290: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
32a0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
32b0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
32c0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  ){.    goto dele
32d0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
32e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
32f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20 73  e->nested==0 ) s
3300: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
3310: 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71 6c  hanges(v);.  sql
3320: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
3330: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
3340: 62 43 6f 6d 70 6c 65 78 2c 20 69 44 62 29 3b 0a  bComplex, iDb);.
3350: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
3360: 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  trying to delete
3370: 20 66 72 6f 6d 20 61 20 76 69 65 77 2c 20 72 65   from a view, re
3380: 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77 20  alize that view 
3390: 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20 65 70 68  into.  ** an eph
33a0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
33b0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
33c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
33d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
33e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
33f0: 52 29 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  R).  if( isView 
3400: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
3410: 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70 50  terializeView(pP
3420: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c  arse, iDb, pTab,
3430: 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42   pWhere, pOrderB
3440: 79 2c 20 70 4c 69 6d 69 74 2c 69 54 61 62 43 75  y, pLimit,iTabCu
3450: 72 29 3b 0a 20 20 20 20 69 44 61 74 61 43 75 72  r);.    iDataCur
3460: 20 3d 20 69 49 64 78 43 75 72 20 3d 20 69 54 61   = iIdxCur = iTa
3470: 62 43 75 72 3b 0a 20 20 20 20 70 4f 72 64 65 72  bCur;.    pOrder
3480: 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d  By = 0;.    pLim
3490: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  it = 0;.  }.#end
34a0: 69 66 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  if..  /* Resolve
34b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
34c0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
34d0: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  lause..  */.  me
34e0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
34f0: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
3500: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
3510: 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  e;.  sNC.pSrcLis
3520: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
3530: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
3540: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
3550: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
3560: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
3570: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  m_cleanup;.  }..
3580: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
3590: 74 68 65 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  the counter of t
35a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
35b0: 73 20 64 65 6c 65 74 65 64 2c 20 69 66 0a 20 20  s deleted, if.  
35c0: 2a 2a 20 77 65 20 61 72 65 20 63 6f 75 6e 74 69  ** we are counti
35d0: 6e 67 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  ng rows..  */.  
35e0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
35f0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
3600: 73 29 21 3d 30 0a 20 20 20 26 26 20 21 70 50 61  s)!=0.   && !pPa
3610: 72 73 65 2d 3e 6e 65 73 74 65 64 0a 20 20 20 26  rse->nested.   &
3620: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
3630: 67 65 72 54 61 62 0a 20 20 29 7b 0a 20 20 20 20  gerTab.  ){.    
3640: 6d 65 6d 43 6e 74 20 3d 20 2b 2b 70 50 61 72 73  memCnt = ++pPars
3650: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
3660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3670: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
3680: 20 6d 65 6d 43 6e 74 29 3b 0a 20 20 7d 0a 0a 23   memCnt);.  }..#
3690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36a0: 49 54 5f 54 52 55 4e 43 41 54 45 5f 4f 50 54 49  IT_TRUNCATE_OPTI
36b0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 70  MIZATION.  /* Sp
36c0: 65 63 69 61 6c 20 63 61 73 65 3a 20 41 20 44 45  ecial case: A DE
36d0: 4c 45 54 45 20 77 69 74 68 6f 75 74 20 61 20 57  LETE without a W
36e0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 65 6c 65  HERE clause dele
36f0: 74 65 73 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  tes everything..
3700: 20 20 2a 2a 20 49 74 20 69 73 20 65 61 73 69 65    ** It is easie
3710: 72 20 6a 75 73 74 20 74 6f 20 65 72 61 73 65 20  r just to erase 
3720: 74 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e  the whole table.
3730: 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
3740: 6e 20 33 2e 36 2e 35 2c 0a 20 20 2a 2a 20 74 68  n 3.6.5,.  ** th
3750: 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
3760: 63 61 75 73 65 64 20 74 68 65 20 72 6f 77 20 63  caused the row c
3770: 68 61 6e 67 65 20 63 6f 75 6e 74 20 28 74 68 65  hange count (the
3780: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
3790: 62 79 20 0a 20 20 2a 2a 20 41 50 49 20 66 75 6e  by .  ** API fun
37a0: 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 63 6f  ction sqlite3_co
37b0: 75 6e 74 5f 63 68 61 6e 67 65 73 29 20 74 6f 20  unt_changes) to 
37c0: 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  be set incorrect
37d0: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ly..  **.  ** Th
37e0: 65 20 22 72 63 61 75 74 68 3d 3d 53 51 4c 49 54  e "rcauth==SQLIT
37f0: 45 5f 4f 4b 22 20 74 65 72 6d 73 20 69 73 20 74  E_OK" terms is t
3800: 68 65 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  he.  ** IMPLEMEN
3810: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 37 32  TATION-OF: R-172
3820: 32 38 2d 33 37 31 32 34 20 49 66 20 74 68 65 20  28-37124 If the 
3830: 61 63 74 69 6f 6e 20 63 6f 64 65 20 69 73 20 53  action code is S
3840: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 61 6e 64  QLITE_DELETE and
3850: 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 62 61  .  ** the callba
3860: 63 6b 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ck returns SQLIT
3870: 45 5f 49 47 4e 4f 52 45 20 74 68 65 6e 20 74 68  E_IGNORE then th
3880: 65 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  e DELETE operati
3890: 6f 6e 20 70 72 6f 63 65 65 64 73 20 62 75 74 0a  on proceeds but.
38a0: 20 20 2a 2a 20 74 68 65 20 74 72 75 6e 63 61 74    ** the truncat
38b0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
38c0: 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 61  s disabled and a
38d0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ll rows are dele
38e0: 74 65 64 0a 20 20 2a 2a 20 69 6e 64 69 76 69 64  ted.  ** individ
38f0: 75 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ually..  */.  if
3900: 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45  ( rcauth==SQLITE
3910: 5f 4f 4b 0a 20 20 20 26 26 20 70 57 68 65 72 65  _OK.   && pWhere
3920: 3d 3d 30 0a 20 20 20 26 26 20 21 62 43 6f 6d 70  ==0.   && !bComp
3930: 6c 65 78 0a 20 20 20 26 26 20 21 49 73 56 69 72  lex.   && !IsVir
3940: 74 75 61 6c 28 70 54 61 62 29 0a 23 69 66 64 65  tual(pTab).#ifde
3950: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3960: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
3970: 20 20 26 26 20 64 62 2d 3e 78 50 72 65 55 70 64    && db->xPreUpd
3980: 61 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 0a 23  ateCallback==0.#
3990: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 61  endif.  ){.    a
39a0: 73 73 65 72 74 28 20 21 69 73 56 69 65 77 20 29  ssert( !isView )
39b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
39c0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
39d0: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
39e0: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
39f0: 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
3a00: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
3a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a20: 70 34 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p4(v, OP_Clear, 
3a30: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pTab->tnum, iDb,
3a40: 20 6d 65 6d 43 6e 74 20 3f 20 6d 65 6d 43 6e 74   memCnt ? memCnt
3a50: 20 3a 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20   : -1,.         
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3a70: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53  Tab->zName, P4_S
3a80: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
3a90: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
3aa0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
3ab0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
3ac0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3ad0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
3ae0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
3af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3b00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
3b10: 65 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  ear, pIdx->tnum,
3b20: 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iDb);.    }.  }
3b30: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
3b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43  QLITE_OMIT_TRUNC
3b50: 41 54 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  ATE_OPTIMIZATION
3b60: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 31 36 20   */.  {.    u16 
3b70: 77 63 66 20 3d 20 57 48 45 52 45 5f 4f 4e 45 50  wcf = WHERE_ONEP
3b80: 41 53 53 5f 44 45 53 49 52 45 44 7c 57 48 45 52  ASS_DESIRED|WHER
3b90: 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 7c  E_DUPLICATES_OK|
3ba0: 57 48 45 52 45 5f 53 45 45 4b 5f 54 41 42 4c 45  WHERE_SEEK_TABLE
3bb0: 3b 0a 20 20 20 20 69 66 28 20 73 4e 43 2e 6e 63  ;.    if( sNC.nc
3bc0: 46 6c 61 67 73 20 26 20 4e 43 5f 56 61 72 53 65  Flags & NC_VarSe
3bd0: 6c 65 63 74 20 29 20 62 43 6f 6d 70 6c 65 78 20  lect ) bComplex 
3be0: 3d 20 31 3b 0a 20 20 20 20 77 63 66 20 7c 3d 20  = 1;.    wcf |= 
3bf0: 28 62 43 6f 6d 70 6c 65 78 20 3f 20 30 20 3a 20  (bComplex ? 0 : 
3c00: 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
3c10: 4c 54 49 52 4f 57 29 3b 0a 20 20 20 20 69 66 28  LTIROW);.    if(
3c20: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
3c30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
3c40: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 69  a rowid table, i
3c50: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52 6f  nitialize the Ro
3c60: 77 53 65 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  wSet to an empty
3c70: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 50   set */.      pP
3c80: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 50 6b  k = 0;.      nPk
3c90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 52 6f 77   = 1;.      iRow
3ca0: 53 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Set = ++pParse->
3cb0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
3cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3cd0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 6f   OP_Null, 0, iRo
3ce0: 77 53 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  wSet);.    }else
3cf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
3d00: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
3d10: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 6e 20  able, create an 
3d20: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
3d30: 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  used to.      **
3d40: 20 68 6f 6c 64 20 61 6c 6c 20 70 72 69 6d 61 72   hold all primar
3d50: 79 20 6b 65 79 73 20 66 6f 72 20 72 6f 77 73 20  y keys for rows 
3d60: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 2a  to be deleted. *
3d70: 2f 0a 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71  /.      pPk = sq
3d80: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
3d90: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
3da0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
3db0: 20 29 3b 0a 20 20 20 20 20 20 6e 50 6b 20 3d 20   );.      nPk = 
3dc0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
3dd0: 20 20 20 20 69 50 6b 20 3d 20 70 50 61 72 73 65      iPk = pParse
3de0: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
3df0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
3e00: 6e 50 6b 3b 0a 20 20 20 20 20 20 69 45 70 68 43  nPk;.      iEphC
3e10: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
3e20: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 45  b++;.      addrE
3e30: 70 68 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  phOpen = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e50: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
3e60: 69 45 70 68 43 75 72 2c 20 6e 50 6b 29 3b 0a 20  iEphCur, nPk);. 
3e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3e80: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
3e90: 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 7d  rse, pPk);.    }
3ea0: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  .  .    /* Const
3eb0: 72 75 63 74 20 61 20 71 75 65 72 79 20 74 6f 20  ruct a query to 
3ec0: 66 69 6e 64 20 74 68 65 20 72 6f 77 69 64 20 6f  find the rowid o
3ed0: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f  r primary key fo
3ee0: 72 20 65 76 65 72 79 20 72 6f 77 0a 20 20 20 20  r every row.    
3ef0: 2a 2a 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ** to be deleted
3f00: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57  , based on the W
3f10: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 53 65 74  HERE clause. Set
3f20: 20 76 61 72 69 61 62 6c 65 20 65 4f 6e 65 50 61   variable eOnePa
3f30: 73 73 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 64  ss.    ** to ind
3f40: 69 63 61 74 65 20 74 68 65 20 73 74 72 61 74 65  icate the strate
3f50: 67 79 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  gy used to imple
3f60: 6d 65 6e 74 20 74 68 69 73 20 64 65 6c 65 74 65  ment this delete
3f70: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
3f80: 20 4f 4e 45 50 41 53 53 5f 4f 46 46 3a 20 20 20   ONEPASS_OFF:   
3f90: 20 54 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   Two-pass approa
3fa0: 63 68 20 2d 20 75 73 65 20 61 20 46 49 46 4f 20  ch - use a FIFO 
3fb0: 66 6f 72 20 72 6f 77 69 64 73 2f 50 4b 20 76 61  for rowids/PK va
3fc0: 6c 75 65 73 2e 0a 20 20 20 20 2a 2a 20 20 4f 4e  lues..    **  ON
3fd0: 45 50 41 53 53 5f 53 49 4e 47 4c 45 3a 20 4f 6e  EPASS_SINGLE: On
3fe0: 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
3ff0: 2d 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f  - at most one ro
4000: 77 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  w deleted..    *
4010: 2a 20 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  *  ONEPASS_MULTI
4020: 3a 20 20 4f 6e 65 2d 70 61 73 73 20 61 70 70 72  :  One-pass appr
4030: 6f 61 63 68 20 2d 20 61 6e 79 20 6e 75 6d 62 65  oach - any numbe
4040: 72 20 6f 66 20 72 6f 77 73 20 6d 61 79 20 62 65  r of rows may be
4050: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
4060: 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
4070: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
4080: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
4090: 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20  , pWhere, 0, 0, 
40a0: 77 63 66 2c 20 69 54 61 62 43 75 72 2b 31 29 3b  wcf, iTabCur+1);
40b0: 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
40c0: 3d 30 20 29 20 67 6f 74 6f 20 64 65 6c 65 74 65  =0 ) goto delete
40d0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
40e0: 20 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 73 71     eOnePass = sq
40f0: 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50  lite3WhereOkOneP
4100: 61 73 73 28 70 57 49 6e 66 6f 2c 20 61 69 43 75  ass(pWInfo, aiCu
4110: 72 4f 6e 65 50 61 73 73 29 3b 0a 20 20 20 20 61  rOnePass);.    a
4120: 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
4130: 28 70 54 61 62 29 3d 3d 30 20 7c 7c 20 65 4f 6e  (pTab)==0 || eOn
4140: 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4d  ePass!=ONEPASS_M
4150: 55 4c 54 49 20 29 3b 0a 20 20 20 20 61 73 73 65  ULTI );.    asse
4160: 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
4170: 61 62 29 20 7c 7c 20 62 43 6f 6d 70 6c 65 78 20  ab) || bComplex 
4180: 7c 7c 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  || eOnePass!=ONE
4190: 50 41 53 53 5f 4f 46 46 20 29 3b 0a 20 20 20 20  PASS_OFF );.    
41a0: 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  if( eOnePass!=ON
41b0: 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 20 73  EPASS_SINGLE ) s
41c0: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
41d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20  (pParse);.  .   
41e0: 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   /* Keep track o
41f0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
4200: 72 6f 77 73 20 74 6f 20 62 65 20 64 65 6c 65 74  rows to be delet
4210: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  ed */.    if( me
4220: 6d 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  mCnt ){.      sq
4230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4240: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 6d 65  v, OP_AddImm, me
4250: 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  mCnt, 1);.    }.
4260: 20 20 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63    .    /* Extrac
4270: 74 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 70  t the rowid or p
4280: 72 69 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 74  rimary key for t
4290: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  he current row *
42a0: 2f 0a 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b  /.    if( pPk ){
42b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
42c0: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
42d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
42e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
42f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4300: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
4310: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
4320: 54 61 62 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  Tab, iTabCur,.  
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
4360: 75 6d 6e 5b 69 5d 2c 20 69 50 6b 2b 69 29 3b 0a  umn[i], iPk+i);.
4370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4b        }.      iK
4380: 65 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65  ey = iPk;.    }e
4390: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  lse{.      iKey 
43a0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
43b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
43c0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
43d0: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
43e0: 20 69 54 61 62 43 75 72 2c 20 2d 31 2c 20 69 4b   iTabCur, -1, iK
43f0: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ey);.    }.  .  
4400: 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d    if( eOnePass!=
4410: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
4420: 20 20 20 20 20 2f 2a 20 46 6f 72 20 4f 4e 45 50       /* For ONEP
4430: 41 53 53 2c 20 6e 6f 20 6e 65 65 64 20 74 6f 20  ASS, no need to 
4440: 73 74 6f 72 65 20 74 68 65 20 72 6f 77 69 64 2f  store the rowid/
4450: 70 72 69 6d 61 72 79 2d 6b 65 79 2e 20 54 68 65  primary-key. The
4460: 72 65 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20  re is only.     
4470: 20 2a 2a 20 6f 6e 65 2c 20 73 6f 20 6a 75 73 74   ** one, so just
4480: 20 6b 65 65 70 20 69 74 20 69 6e 20 69 74 73 20   keep it in its 
4490: 72 65 67 69 73 74 65 72 28 73 29 20 61 6e 64 20  register(s) and 
44a0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
44b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c  the.      ** del
44c0: 65 74 65 20 63 6f 64 65 2e 20 20 2a 2f 0a 20 20  ete code.  */.  
44d0: 20 20 20 20 6e 4b 65 79 20 3d 20 6e 50 6b 3b 20      nKey = nPk; 
44e0: 2f 2a 20 4f 50 5f 46 6f 75 6e 64 20 77 69 6c 6c  /* OP_Found will
44f0: 20 75 73 65 20 61 6e 20 75 6e 70 61 63 6b 65 64   use an unpacked
4500: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 61 54   key */.      aT
4510: 6f 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  oOpen = sqlite3D
4520: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
4530: 20 6e 49 64 78 2b 32 29 3b 0a 20 20 20 20 20 20   nIdx+2);.      
4540: 69 66 28 20 61 54 6f 4f 70 65 6e 3d 3d 30 20 29  if( aToOpen==0 )
4550: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4560: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
4570: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
4580: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
4590: 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
45a0: 20 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f 70 65     memset(aToOpe
45b0: 6e 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b 0a 20  n, 1, nIdx+1);. 
45c0: 20 20 20 20 20 61 54 6f 4f 70 65 6e 5b 6e 49 64       aToOpen[nId
45d0: 78 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x+1] = 0;.      
45e0: 69 66 28 20 61 69 43 75 72 4f 6e 65 50 61 73 73  if( aiCurOnePass
45f0: 5b 30 5d 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e  [0]>=0 ) aToOpen
4600: 5b 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  [aiCurOnePass[0]
4610: 2d 69 54 61 62 43 75 72 5d 20 3d 20 30 3b 0a 20  -iTabCur] = 0;. 
4620: 20 20 20 20 20 69 66 28 20 61 69 43 75 72 4f 6e       if( aiCurOn
4630: 65 50 61 73 73 5b 31 5d 3e 3d 30 20 29 20 61 54  ePass[1]>=0 ) aT
4640: 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61  oOpen[aiCurOnePa
4650: 73 73 5b 31 5d 2d 69 54 61 62 43 75 72 5d 20 3d  ss[1]-iTabCur] =
4660: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64   0;.      if( ad
4670: 64 72 45 70 68 4f 70 65 6e 20 29 20 73 71 6c 69  drEphOpen ) sqli
4680: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4690: 6f 6f 70 28 76 2c 20 61 64 64 72 45 70 68 4f 70  oop(v, addrEphOp
46a0: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  en);.    }else{.
46b0: 20 20 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b        if( pPk ){
46c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
46d0: 74 68 65 20 50 4b 20 6b 65 79 20 66 6f 72 20 74  the PK key for t
46e0: 68 69 73 20 72 6f 77 20 74 6f 20 74 68 65 20 74  his row to the t
46f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 2a  emporary table *
4700: 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
4710: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4720: 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  .        nKey = 
4730: 30 3b 20 20 20 2f 2a 20 5a 65 72 6f 20 74 65 6c  0;   /* Zero tel
4740: 6c 73 20 4f 50 5f 46 6f 75 6e 64 20 74 6f 20 75  ls OP_Found to u
4750: 73 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b  se a composite k
4760: 65 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ey */.        sq
4770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
4780: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4790: 2c 20 69 50 6b 2c 20 6e 50 6b 2c 20 69 4b 65 79  , iPk, nPk, iKey
47a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
47b0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
47c0: 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e 64 62  tyStr(pParse->db
47d0: 2c 20 70 50 6b 29 2c 20 6e 50 6b 29 3b 0a 20 20  , pPk), nPk);.  
47e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
47f0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
4800: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 45 70 68  _IdxInsert, iEph
4810: 43 75 72 2c 20 69 4b 65 79 2c 20 69 50 6b 2c 20  Cur, iKey, iPk, 
4820: 6e 50 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nPk);.      }els
4830: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  e{.        /* Ad
4840: 64 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  d the rowid of t
4850: 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  he row to be del
4860: 65 74 65 64 20 74 6f 20 74 68 65 20 52 6f 77 53  eted to the RowS
4870: 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 4b  et */.        nK
4880: 65 79 20 3d 20 31 3b 20 20 2f 2a 20 4f 50 5f 44  ey = 1;  /* OP_D
4890: 65 66 65 72 72 65 64 53 65 65 6b 20 61 6c 77 61  eferredSeek alwa
48a0: 79 73 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ys uses a single
48b0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20 20   rowid */.      
48c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48d0: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Op2(v, OP_RowSet
48e0: 41 64 64 2c 20 69 52 6f 77 53 65 74 2c 20 69 4b  Add, iRowSet, iK
48f0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
4900: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
4910: 74 68 69 73 20 44 45 4c 45 54 45 20 63 61 6e 6e  this DELETE cann
4920: 6f 74 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  ot use the ONEPA
4930: 53 53 20 73 74 72 61 74 65 67 79 2c 20 74 68 69  SS strategy, thi
4940: 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
4950: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
4960: 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66  E loop */.    if
4970: 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ( eOnePass!=ONEP
4980: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
4990: 20 61 64 64 72 42 79 70 61 73 73 20 3d 20 73 71   addrBypass = sq
49a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
49b0: 65 6c 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  el(v);.    }else
49c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
49d0: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
49e0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
49f0: 20 55 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   Unless this is 
4a00: 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 63 75 72  a view, open cur
4a10: 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62  sors for the tab
4a20: 6c 65 20 77 65 20 61 72 65 20 0a 20 20 20 20 2a  le we are .    *
4a30: 2a 20 64 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20  * deleting from 
4a40: 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  and all its indi
4a50: 63 65 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ces. If this is 
4a60: 61 20 76 69 65 77 2c 20 74 68 65 6e 20 74 68 65  a view, then the
4a70: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 65 66 66  .    ** only eff
4a80: 65 63 74 20 74 68 69 73 20 73 74 61 74 65 6d 65  ect this stateme
4a90: 6e 74 20 68 61 73 20 69 73 20 74 6f 20 66 69 72  nt has is to fir
4aa0: 65 20 74 68 65 20 49 4e 53 54 45 41 44 20 4f 46  e the INSTEAD OF
4ab0: 20 0a 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72   .    ** trigger
4ac0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
4ad0: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
4ae0: 20 20 20 69 6e 74 20 69 41 64 64 72 4f 6e 63 65     int iAddrOnce
4af0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
4b00: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
4b10: 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20  S_MULTI ){.     
4b20: 20 20 20 69 41 64 64 72 4f 6e 63 65 20 3d 20 73     iAddrOnce = s
4b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
4b40: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
4b50: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
4b70: 74 63 61 73 65 28 20 49 73 56 69 72 74 75 61 6c  tcase( IsVirtual
4b80: 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20  (pTab) );.      
4b90: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
4ba0: 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73  AndIndices(pPars
4bb0: 65 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  e, iDb, pTab, OP
4bc0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 0a 20 20 20  _OpenWrite, .   
4bd0: 20 20 20 20 20 20 20 4f 50 46 4c 41 47 5f 46 4f         OPFLAG_FO
4be0: 52 44 45 4c 45 54 45 2c 20 69 54 61 62 43 75 72  RDELETE, iTabCur
4bf0: 2c 20 61 54 6f 4f 70 65 6e 2c 20 26 69 44 61 74  , aToOpen, &iDat
4c00: 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b  aCur, &iIdxCur);
4c10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4c20: 50 6b 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  Pk || IsVirtual(
4c30: 70 54 61 62 29 20 7c 7c 20 69 44 61 74 61 43 75  pTab) || iDataCu
4c40: 72 3d 3d 69 54 61 62 43 75 72 20 29 3b 0a 20 20  r==iTabCur );.  
4c50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 20      assert( pPk 
4c60: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
4c70: 62 29 20 7c 7c 20 69 49 64 78 43 75 72 3d 3d 69  b) || iIdxCur==i
4c80: 44 61 74 61 43 75 72 2b 31 20 29 3b 0a 20 20 20  DataCur+1 );.   
4c90: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d     if( eOnePass=
4ca0: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29  =ONEPASS_MULTI )
4cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4cc0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 4f 6e 63  Here(v, iAddrOnc
4cd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
4ce0: 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6c 6f 6f   /* Set up a loo
4cf0: 70 20 6f 76 65 72 20 74 68 65 20 72 6f 77 69 64  p over the rowid
4d00: 73 2f 70 72 69 6d 61 72 79 2d 6b 65 79 73 20 74  s/primary-keys t
4d10: 68 61 74 20 77 65 72 65 20 66 6f 75 6e 64 20 69  hat were found i
4d20: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 77 68 65  n the.    ** whe
4d30: 72 65 2d 63 6c 61 75 73 65 20 6c 6f 6f 70 20 61  re-clause loop a
4d40: 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bove..    */.   
4d50: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f   if( eOnePass!=O
4d60: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
4d70: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
4d80: 3d 3d 6e 50 6b 20 29 3b 20 20 2f 2a 20 4f 50 5f  ==nPk );  /* OP_
4d90: 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61  Found will use a
4da0: 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 2a  n unpacked key *
4db0: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  /.      if( !IsV
4dc0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
4dd0: 61 54 6f 4f 70 65 6e 5b 69 44 61 74 61 43 75 72  aToOpen[iDataCur
4de0: 2d 69 54 61 62 43 75 72 5d 20 29 7b 0a 20 20 20  -iTabCur] ){.   
4df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
4e00: 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
4e10: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
4e20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e30: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
4e40: 74 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72  tFound, iDataCur
4e50: 2c 20 61 64 64 72 42 79 70 61 73 73 2c 20 69 4b  , addrBypass, iK
4e60: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ey, nKey);.     
4e70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4e80: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
4e90: 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b  }else if( pPk ){
4ea0: 0a 20 20 20 20 20 20 61 64 64 72 4c 6f 6f 70 20  .      addrLoop 
4eb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4ec0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
4ed0: 2c 20 69 45 70 68 43 75 72 29 3b 20 56 64 62 65  , iEphCur); Vdbe
4ee0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4ef0: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
4f00: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f20: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
4f30: 2c 20 69 45 70 68 43 75 72 2c 20 30 2c 20 69 4b  , iEphCur, 0, iK
4f40: 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ey);.      }else
4f50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4f60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4f70: 50 5f 52 6f 77 44 61 74 61 2c 20 69 45 70 68 43  P_RowData, iEphC
4f80: 75 72 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  ur, iKey);.     
4f90: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
4fa0: 20 6e 4b 65 79 3d 3d 30 20 29 3b 20 20 2f 2a 20   nKey==0 );  /* 
4fb0: 4f 50 5f 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73  OP_Found will us
4fc0: 65 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65  e a composite ke
4fd0: 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  y */.    }else{.
4fe0: 20 20 20 20 20 20 61 64 64 72 4c 6f 6f 70 20 3d        addrLoop =
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 52  p3(v, OP_RowSetR
5010: 65 61 64 2c 20 69 52 6f 77 53 65 74 2c 20 30 2c  ead, iRowSet, 0,
5020: 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 56 64   iKey);.      Vd
5030: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5040: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65       assert( nKe
5050: 79 3d 3d 31 20 29 3b 0a 20 20 20 20 7d 20 20 0a  y==1 );.    }  .
5060: 20 20 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65    .    /* Delete
5070: 20 74 68 65 20 72 6f 77 20 2a 2f 0a 23 69 66 6e   the row */.#ifn
5080: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5090: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
50a0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
50b0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
50c0: 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
50d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
50e0: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
50f0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
5100: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b    sqlite3VtabMak
5110: 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  eWritable(pParse
5120: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 61  , pTab);.      a
5130: 73 73 65 72 74 28 20 65 4f 6e 65 50 61 73 73 3d  ssert( eOnePass=
5140: 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20  =ONEPASS_OFF || 
5150: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
5160: 53 5f 53 49 4e 47 4c 45 20 29 3b 0a 20 20 20 20  S_SINGLE );.    
5170: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
5180: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
5190: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
51a0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 7b  NEPASS_SINGLE ){
51b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
51c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
51d0: 5f 43 6c 6f 73 65 2c 20 69 54 61 62 43 75 72 29  _Close, iTabCur)
51e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
51f0: 6c 69 74 65 33 49 73 54 6f 70 6c 65 76 65 6c 28  lite3IsToplevel(
5200: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
5210: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73 4d       pParse->isM
5220: 75 6c 74 69 57 72 69 74 65 20 3d 20 30 3b 0a 20  ultiWrite = 0;. 
5230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5250: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
5260: 55 70 64 61 74 65 2c 20 30 2c 20 31 2c 20 69 4b  Update, 0, 1, iK
5270: 65 79 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54  ey, pVTab, P4_VT
5280: 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  AB);.      sqlit
5290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
52a0: 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20  , OE_Abort);.   
52b0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
52c0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f    {.      int co
52d0: 75 6e 74 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e  unt = (pParse->n
52e0: 65 73 74 65 64 3d 3d 30 29 3b 20 20 20 20 2f 2a  ested==0);    /*
52f0: 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 63   True to count c
5300: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 20 20  hanges */.      
5310: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
5320: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  owDelete(pParse,
5330: 20 69 44 62 2c 20 70 54 61 62 2c 20 70 54 72 69   iDb, pTab, pTri
5340: 67 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20  gger, iDataCur, 
5350: 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20  iIdxCur,.       
5360: 20 20 20 69 4b 65 79 2c 20 6e 4b 65 79 2c 20 63     iKey, nKey, c
5370: 6f 75 6e 74 2c 20 4f 45 5f 44 65 66 61 75 6c 74  ount, OE_Default
5380: 2c 20 65 4f 6e 65 50 61 73 73 2c 20 61 69 43 75  , eOnePass, aiCu
5390: 72 4f 6e 65 50 61 73 73 5b 31 5d 29 3b 0a 20 20  rOnePass[1]);.  
53a0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 45 6e    }.  .    /* En
53b0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6f 76  d of the loop ov
53c0: 65 72 20 61 6c 6c 20 72 6f 77 69 64 73 2f 70 72  er all rowids/pr
53d0: 69 6d 61 72 79 2d 6b 65 79 73 2e 20 2a 2f 0a 20  imary-keys. */. 
53e0: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21     if( eOnePass!
53f0: 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
5400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5410: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
5420: 20 61 64 64 72 42 79 70 61 73 73 29 3b 0a 20 20   addrBypass);.  
5430: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
5440: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
5450: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29   }else if( pPk )
5460: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5480: 4e 65 78 74 2c 20 69 45 70 68 43 75 72 2c 20 61  Next, iEphCur, a
5490: 64 64 72 4c 6f 6f 70 2b 31 29 3b 20 56 64 62 65  ddrLoop+1); Vdbe
54a0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
54b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
54c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4c 6f  mpHere(v, addrLo
54d0: 6f 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  op);.    }else{.
54e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
54f0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4c 6f 6f  eGoto(v, addrLoo
5500: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
5510: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
5520: 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20 20   addrLoop);.    
5530: 7d 20 20 20 20 20 0a 20 20 7d 20 2f 2a 20 45 6e  }     .  } /* En
5540: 64 20 6e 6f 6e 2d 74 72 75 6e 63 61 74 65 20 70  d non-truncate p
5550: 61 74 68 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64  ath */..  /* Upd
5560: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ate the sqlite_s
5570: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79  equence table by
5580: 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e   storing the con
5590: 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tent of the.  **
55a0: 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63   maximum rowid c
55b0: 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65  ounter values re
55c0: 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73  corded while ins
55d0: 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a  erting into.  **
55e0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74   autoincrement t
55f0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
5600: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
5610: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70  ==0 && pParse->p
5620: 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 7b  TriggerTab==0 ){
5630: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
5640: 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61  incrementEnd(pPa
5650: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
5660: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5670: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
5680: 65 72 65 20 64 65 6c 65 74 65 64 2e 20 49 66 20  ere deleted. If 
5690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
56a0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  .  ** generating
56b0: 20 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66   code because of
56c0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
56d0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c  e3NestedParse(),
56e0: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76   do not.  ** inv
56f0: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
5700: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
5710: 20 20 69 66 28 20 6d 65 6d 43 6e 74 20 29 7b 0a    if( memCnt ){.
5720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5730: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5740: 6c 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20 31  ltRow, memCnt, 1
5750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5760: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
5770: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5780: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5790: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
57a0: 2c 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64 22  , "rows deleted"
57b0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
57c0: 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65 5f 66 72  ;.  }..delete_fr
57d0: 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  om_cleanup:.  sq
57e0: 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74  lite3AuthContext
57f0: 50 6f 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a  Pop(&sContext);.
5800: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
5810: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 4c  Delete(db, pTabL
5820: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
5830: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
5840: 68 65 72 65 29 3b 0a 23 69 66 20 64 65 66 69 6e  here);.#if defin
5850: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5860: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
5870: 49 4d 49 54 29 20 0a 20 20 73 71 6c 69 74 65 33  IMIT) .  sqlite3
5880: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5890: 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  b, pOrderBy);.  
58a0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
58b0: 65 28 64 62 2c 20 70 4c 69 6d 69 74 29 3b 0a 23  e(db, pLimit);.#
58c0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
58d0: 62 46 72 65 65 28 64 62 2c 20 61 54 6f 4f 70 65  bFree(db, aToOpe
58e0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  n);.  return;.}.
58f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73  /* Make sure "is
5900: 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20  View" and other 
5910: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61  macros defined a
5920: 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e  bove are undefin
5930: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  ed. Otherwise.**
5940: 20 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72 66   they may interf
5950: 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61  ere with compila
5960: 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75  tion of other fu
5970: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  nctions in this 
5980: 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61  file.** (or in a
5990: 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20  nother file, if 
59a0: 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65  this file become
59b0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d  s part of the am
59c0: 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f  algamation).  */
59d0: 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a 20  .#ifdef isView. 
59e0: 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65  #undef isView.#e
59f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72 69  ndif.#ifdef pTri
5a00: 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72  gger. #undef pTr
5a10: 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  igger.#endif../*
5a20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5a30: 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20   generates VDBE 
5a40: 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65 73  code that causes
5a50: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
5a60: 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61 62   a.** single tab
5a70: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
5a80: 2e 20 20 42 6f 74 68 20 74 68 65 20 6f 72 69 67  .  Both the orig
5a90: 69 6e 61 6c 20 74 61 62 6c 65 20 65 6e 74 72 79  inal table entry
5aa0: 20 61 6e 64 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69   and.** all indi
5ab0: 63 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ces are removed.
5ac0: 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e 64 69 74  .**.** Precondit
5ad0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  ions:.**.**   1.
5ae0: 20 20 69 44 61 74 61 43 75 72 20 69 73 20 61 6e    iDataCur is an
5af0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 6f 6e 20   open cursor on 
5b00: 74 68 65 20 62 74 72 65 65 20 74 68 61 74 20 69  the btree that i
5b10: 73 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  s the canonical 
5b20: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 73 74  data.**       st
5b30: 6f 72 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ore for the tabl
5b40: 65 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20 62  e.  (This will b
5b50: 65 20 65 69 74 68 65 72 20 74 68 65 20 74 61 62  e either the tab
5b60: 6c 65 20 69 74 73 65 6c 66 2c 0a 2a 2a 20 20 20  le itself,.**   
5b70: 20 20 20 20 69 6e 20 74 68 65 20 63 61 73 65 20      in the case 
5b80: 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  of a rowid table
5b90: 2c 20 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59  , or the PRIMARY
5ba0: 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20 74 68   KEY index in th
5bb0: 65 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  e case.**       
5bc0: 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
5bd0: 49 44 20 74 61 62 6c 65 2e 29 0a 2a 2a 0a 2a 2a  ID table.).**.**
5be0: 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74     2.  Read/writ
5bf0: 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  e cursors for al
5c00: 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
5c10: 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61  b must be open a
5c20: 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f  s.**       curso
5c30: 72 20 6e 75 6d 62 65 72 20 69 49 64 78 43 75 72  r number iIdxCur
5c40: 2b 69 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20  +i for the i-th 
5c50: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  index..**.**   3
5c60: 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20 6b  .  The primary k
5c70: 65 79 20 66 6f 72 20 74 68 65 20 72 6f 77 20 74  ey for the row t
5c80: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6d 75 73  o be deleted mus
5c90: 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  t be stored in a
5ca0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 71 75 65 6e  .**       sequen
5cb0: 63 65 20 6f 66 20 6e 50 6b 20 6d 65 6d 6f 72 79  ce of nPk memory
5cc0: 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 20   cells starting 
5cd0: 61 74 20 69 50 6b 2e 20 20 49 66 20 6e 50 6b 3d  at iPk.  If nPk=
5ce0: 3d 30 20 74 68 61 74 20 6d 65 61 6e 73 0a 2a 2a  =0 that means.**
5cf0: 20 20 20 20 20 20 20 74 68 61 74 20 61 20 73 65         that a se
5d00: 61 72 63 68 20 72 65 63 6f 72 64 20 66 6f 72 6d  arch record form
5d10: 65 64 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52  ed from OP_MakeR
5d20: 65 63 6f 72 64 20 69 73 20 63 6f 6e 74 61 69 6e  ecord is contain
5d30: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ed in the.**    
5d40: 20 20 20 73 69 6e 67 6c 65 20 6d 65 6d 6f 72 79     single memory
5d50: 20 6c 6f 63 61 74 69 6f 6e 20 69 50 6b 2e 0a 2a   location iPk..*
5d60: 2a 0a 2a 2a 20 65 4d 6f 64 65 3a 0a 2a 2a 20 20  *.** eMode:.**  
5d70: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
5d80: 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 65   may be passed e
5d90: 69 74 68 65 72 20 4f 4e 45 50 41 53 53 5f 4f 46  ither ONEPASS_OF
5da0: 46 20 28 30 29 2c 20 4f 4e 45 50 41 53 53 5f 53  F (0), ONEPASS_S
5db0: 49 4e 47 4c 45 2c 20 6f 72 0a 2a 2a 20 20 20 4f  INGLE, or.**   O
5dc0: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 2e 20 20 49  NEPASS_MULTI.  I
5dd0: 66 20 65 4d 6f 64 65 20 69 73 20 6e 6f 74 20 4f  f eMode is not O
5de0: 4e 45 50 41 53 53 5f 4f 46 46 2c 20 74 68 65 6e  NEPASS_OFF, then
5df0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 20   the cursor.**  
5e00: 20 69 44 61 74 61 43 75 72 20 61 6c 72 65 61 64   iDataCur alread
5e10: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
5e20: 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 49  row to delete. I
5e30: 66 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41  f eMode is ONEPA
5e40: 53 53 5f 4f 46 46 0a 2a 2a 20 20 20 74 68 65 6e  SS_OFF.**   then
5e50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
5e60: 75 73 74 20 73 65 65 6b 20 69 44 61 74 61 43 75  ust seek iDataCu
5e70: 72 20 74 6f 20 74 68 65 20 65 6e 74 72 79 20 69  r to the entry i
5e80: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 50 6b  dentified by iPk
5e90: 0a 2a 2a 20 20 20 61 6e 64 20 6e 50 6b 20 62 65  .**   and nPk be
5ea0: 66 6f 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f  fore reading fro
5eb0: 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66  m it..**.**   If
5ec0: 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41 53   eMode is ONEPAS
5ed0: 53 5f 4d 55 4c 54 49 2c 20 74 68 65 6e 20 74 68  S_MULTI, then th
5ee0: 69 73 20 63 61 6c 6c 20 69 73 20 62 65 69 6e 67  is call is being
5ef0: 20 6d 61 64 65 20 61 73 20 70 61 72 74 0a 2a 2a   made as part.**
5f00: 20 20 20 6f 66 20 61 20 4f 4e 45 50 41 53 53 20     of a ONEPASS 
5f10: 64 65 6c 65 74 65 20 74 68 61 74 20 61 66 66 65  delete that affe
5f20: 63 74 73 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  cts multiple row
5f30: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
5f40: 20 69 66 20 0a 2a 2a 20 20 20 69 49 64 78 4e 6f   if .**   iIdxNo
5f50: 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64 20  Seek is a valid 
5f60: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28 3e  cursor number (>
5f70: 3d 30 29 20 61 6e 64 20 69 73 20 6e 6f 74 20 74  =0) and is not t
5f80: 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 20 20  he same as.**   
5f90: 69 44 61 74 61 43 75 72 2c 20 74 68 65 6e 20 69  iDataCur, then i
5fa0: 74 73 20 70 6f 73 69 74 69 6f 6e 20 73 68 6f 75  ts position shou
5fb0: 6c 64 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ld be preserved 
5fc0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65  following the de
5fd0: 6c 65 74 65 0a 2a 2a 20 20 20 6f 70 65 72 61 74  lete.**   operat
5fe0: 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ion. Or, if iIdx
5ff0: 4e 6f 53 65 65 6b 20 69 73 20 6e 6f 74 20 61 20  NoSeek is not a 
6000: 76 61 6c 69 64 20 63 75 72 73 6f 72 20 6e 75 6d  valid cursor num
6010: 62 65 72 2c 20 74 68 65 0a 2a 2a 20 20 20 70 6f  ber, the.**   po
6020: 73 69 74 69 6f 6e 20 6f 66 20 69 44 61 74 61 43  sition of iDataC
6030: 75 72 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65  ur should be pre
6040: 73 65 72 76 65 64 20 69 6e 73 74 65 61 64 2e 0a  served instead..
6050: 2a 2a 0a 2a 2a 20 69 49 64 78 4e 6f 53 65 65 6b  **.** iIdxNoSeek
6060: 3a 0a 2a 2a 20 20 20 49 66 20 69 49 64 78 4e 6f  :.**   If iIdxNo
6070: 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64 20  Seek is a valid 
6080: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28 3e  cursor number (>
6090: 3d 30 29 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f  =0) not equal to
60a0: 20 69 44 61 74 61 43 75 72 2c 0a 2a 2a 20 20 20   iDataCur,.**   
60b0: 74 68 65 6e 20 69 74 20 69 64 65 6e 74 69 66 69  then it identifi
60c0: 65 73 20 61 6e 20 69 6e 64 65 78 20 63 75 72 73  es an index curs
60d0: 6f 72 20 28 66 72 6f 6d 20 77 69 74 68 69 6e 20  or (from within 
60e0: 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
60f0: 0a 2a 2a 20 20 20 73 74 61 72 74 69 6e 67 20 61  .**   starting a
6100: 74 20 69 49 64 78 43 75 72 29 20 74 68 61 74 20  t iIdxCur) that 
6110: 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
6120: 6f 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  o the index entr
6130: 79 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  y to be deleted.
6140: 0a 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 74 68  .**   Except, th
6150: 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
6160: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
6170: 68 65 72 65 20 61 72 65 20 42 45 46 4f 52 45 20  here are BEFORE 
6180: 74 72 69 67 67 65 72 73 20 73 69 6e 63 65 0a 2a  triggers since.*
6190: 2a 20 20 20 74 68 65 20 74 72 69 67 67 65 72 20  *   the trigger 
61a0: 62 6f 64 79 20 6d 69 67 68 74 20 68 61 76 65 20  body might have 
61b0: 6d 6f 76 65 64 20 74 68 65 20 63 75 72 73 6f 72  moved the cursor
61c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
61d0: 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65  3GenerateRowDele
61e0: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
61f0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
6200: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6210: 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
6220: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6230: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 20  containing pTab 
6240: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
6250: 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ,       /* Table
6260: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6270: 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65  row to be delete
6280: 64 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  d */.  Trigger *
6290: 70 54 72 69 67 67 65 72 2c 20 2f 2a 20 4c 69 73  pTrigger, /* Lis
62a0: 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f  t of triggers to
62b0: 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79 29 20 66   (potentially) f
62c0: 69 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ire */.  int iDa
62d0: 74 61 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  taCur,      /* C
62e0: 75 72 73 6f 72 20 66 72 6f 6d 20 77 68 69 63 68  ursor from which
62f0: 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 69 73 20   column data is 
6300: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
6310: 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20 20 20  nt iIdxCur,     
6320: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78    /* First index
6330: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
6340: 20 69 50 6b 2c 20 20 20 20 20 20 20 20 20 20 20   iPk,           
6350: 2f 2a 20 46 69 72 73 74 20 6d 65 6d 6f 72 79 20  /* First memory 
6360: 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20  cell containing 
6370: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
6380: 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 2c 20 20 20  */.  i16 nPk,   
6390: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
63a0: 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
63b0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f   memory cells */
63c0: 0a 20 20 75 38 20 63 6f 75 6e 74 2c 20 20 20 20  .  u8 count,    
63d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
63e0: 7a 65 72 6f 2c 20 69 6e 63 72 65 6d 65 6e 74 20  zero, increment 
63f0: 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63  the row change c
6400: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f  ounter */.  u8 o
6410: 6e 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 2f  nconf,         /
6420: 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e  * Default ON CON
6430: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66 6f 72  FLICT policy for
6440: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 75   triggers */.  u
6450: 38 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  8 eMode,        
6460: 20 20 2f 2a 20 4f 4e 45 50 41 53 53 5f 4f 46 46    /* ONEPASS_OFF
6470: 2c 20 5f 53 49 4e 47 4c 45 2c 20 6f 72 20 5f 4d  , _SINGLE, or _M
6480: 55 4c 54 49 2e 20 20 53 65 65 20 61 62 6f 76 65  ULTI.  See above
6490: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 4e 6f   */.  int iIdxNo
64a0: 53 65 65 6b 20 20 20 20 20 2f 2a 20 43 75 72 73  Seek     /* Curs
64b0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  or number of cur
64c0: 73 6f 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  sor that does no
64d0: 74 20 6e 65 65 64 20 73 65 65 6b 69 6e 67 20 2a  t need seeking *
64e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
64f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
6500: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 2a         /* Vdbe *
6510: 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 20 3d 20 30  /.  int iOld = 0
6520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6530: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
6540: 69 73 74 65 72 20 69 6e 20 4f 4c 44 2e 2a 20 61  ister in OLD.* a
6550: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rray */.  int iL
6560: 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
6570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
6580: 65 6c 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 65  el resolved to e
6590: 6e 64 20 6f 66 20 67 65 6e 65 72 61 74 65 64 20  nd of generated 
65a0: 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6f 70 53  code */.  u8 opS
65b0: 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eek;            
65c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
65d0: 6b 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  k opcode */..  /
65e0: 2a 20 56 64 62 65 20 69 73 20 67 75 61 72 61 6e  * Vdbe is guaran
65f0: 74 65 65 64 20 74 6f 20 68 61 76 65 20 62 65 65  teed to have bee
6600: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  n allocated by t
6610: 68 69 73 20 73 74 61 67 65 2e 20 2a 2f 0a 20 20  his stage. */.  
6620: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 56  assert( v );.  V
6630: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
6640: 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e  ((v, "BEGIN: Gen
6650: 52 6f 77 44 65 6c 28 25 64 2c 25 64 2c 25 64 2c  RowDel(%d,%d,%d,
6660: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d)",.          
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6680: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
6690: 2c 20 69 50 6b 2c 20 28 69 6e 74 29 6e 50 6b 29  , iPk, (int)nPk)
66a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 6b 20 63 75  );..  /* Seek cu
66b0: 72 73 6f 72 20 69 43 75 72 20 74 6f 20 74 68 65  rsor iCur to the
66c0: 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20   row to delete. 
66d0: 49 66 20 74 68 69 73 20 72 6f 77 20 6e 6f 20 6c  If this row no l
66e0: 6f 6e 67 65 72 20 65 78 69 73 74 73 20 0a 20 20  onger exists .  
66f0: 2a 2a 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ** (this can hap
6700: 70 65 6e 20 69 66 20 61 20 74 72 69 67 67 65 72  pen if a trigger
6710: 20 70 72 6f 67 72 61 6d 20 68 61 73 20 61 6c 72   program has alr
6720: 65 61 64 79 20 64 65 6c 65 74 65 64 20 69 74 29  eady deleted it)
6730: 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 61 74  , do.  ** not at
6740: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
6750: 69 74 20 6f 72 20 66 69 72 65 20 61 6e 79 20 44  it or fire any D
6760: 45 4c 45 54 45 20 74 72 69 67 67 65 72 73 2e 20  ELETE triggers. 
6770: 20 2a 2f 0a 20 20 69 4c 61 62 65 6c 20 3d 20 73   */.  iLabel = s
6780: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6790: 62 65 6c 28 76 29 3b 0a 20 20 6f 70 53 65 65 6b  bel(v);.  opSeek
67a0: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
67b0: 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ) ? OP_NotExists
67c0: 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a   : OP_NotFound;.
67d0: 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 4f 4e 45    if( eMode==ONE
67e0: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
67f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6800: 34 49 6e 74 28 76 2c 20 6f 70 53 65 65 6b 2c 20  4Int(v, opSeek, 
6810: 69 44 61 74 61 43 75 72 2c 20 69 4c 61 62 65 6c  iDataCur, iLabel
6820: 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20  , iPk, nPk);.   
6830: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
6840: 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f  v, opSeek==OP_No
6850: 74 45 78 69 73 74 73 29 3b 0a 20 20 20 20 56 64  tExists);.    Vd
6860: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
6870: 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 46 6f  opSeek==OP_NotFo
6880: 75 6e 64 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  und);.  }. .  /*
6890: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
68a0: 79 20 74 72 69 67 67 65 72 73 20 74 6f 20 66 69  y triggers to fi
68b0: 72 65 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 72  re, allocate a r
68c0: 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
68d0: 73 20 74 6f 0a 20 20 2a 2a 20 75 73 65 20 66 6f  s to.  ** use fo
68e0: 72 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65 66 65  r the old.* refe
68f0: 72 65 6e 63 65 73 20 69 6e 20 74 68 65 20 74 72  rences in the tr
6900: 69 67 67 65 72 73 2e 20 20 2a 2f 0a 20 20 69 66  iggers.  */.  if
6910: 28 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69  ( sqlite3FkRequi
6920: 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61 62  red(pParse, pTab
6930: 2c 20 30 2c 20 30 29 20 7c 7c 20 70 54 72 69 67  , 0, 0) || pTrig
6940: 67 65 72 20 29 7b 0a 20 20 20 20 75 33 32 20 6d  ger ){.    u32 m
6950: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
6960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
6970: 20 6f 66 20 4f 4c 44 2e 2a 20 63 6f 6c 75 6d 6e   of OLD.* column
6980: 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 20 20  s in use */.    
6990: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
69b0: 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 77   Iterator used w
69c0: 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
69d0: 4f 4c 44 2e 2a 20 2a 2f 0a 20 20 20 20 69 6e 74  OLD.* */.    int
69e0: 20 61 64 64 72 53 74 61 72 74 3b 20 20 20 20 20   addrStart;     
69f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
6a00: 61 72 74 20 6f 66 20 42 45 46 4f 52 45 20 74 72  art of BEFORE tr
6a10: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 2a  igger programs *
6a20: 2f 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  /..    /* TODO: 
6a30: 43 6f 75 6c 64 20 75 73 65 20 74 65 6d 70 6f 72  Could use tempor
6a40: 61 72 79 20 72 65 67 69 73 74 65 72 73 20 68 65  ary registers he
6a50: 72 65 2e 20 41 6c 73 6f 20 63 6f 75 6c 64 20 61  re. Also could a
6a60: 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20 2a 2a  ttempt to.    **
6a70: 20 61 76 6f 69 64 20 63 6f 70 79 69 6e 67 20 74   avoid copying t
6a80: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
6a90: 68 65 20 72 6f 77 69 64 20 72 65 67 69 73 74 65  he rowid registe
6aa0: 72 2e 20 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20  r.  */.    mask 
6ab0: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
6ac0: 43 6f 6c 6d 61 73 6b 28 0a 20 20 20 20 20 20 20  Colmask(.       
6ad0: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54   pParse, iDb, pT
6ae0: 72 69 67 67 65 72 2c 20 30 2c 20 30 2c 20 54 52  rigger, 0, 0, TR
6af0: 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49  IGGER_BEFORE|TRI
6b00: 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61 62  GGER_AFTER, pTab
6b10: 2c 20 6f 6e 63 6f 6e 66 0a 20 20 20 20 29 3b 0a  , onconf.    );.
6b20: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69      mask |= sqli
6b30: 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 70 50 61  te3FkOldmask(pPa
6b40: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
6b50: 69 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iOld = pParse->n
6b60: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
6b70: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 31 20 2b 20  e->nMem += (1 + 
6b80: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20 20  pTab->nCol);..  
6b90: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
6ba0: 65 20 4f 4c 44 2e 2a 20 70 73 65 75 64 6f 2d 74  e OLD.* pseudo-t
6bb0: 61 62 6c 65 20 72 65 67 69 73 74 65 72 20 61 72  able register ar
6bc0: 72 61 79 2e 20 54 68 65 73 65 20 76 61 6c 75 65  ray. These value
6bd0: 73 20 77 69 6c 6c 20 62 65 20 0a 20 20 20 20 2a  s will be .    *
6be0: 2a 20 75 73 65 64 20 62 79 20 61 6e 79 20 42 45  * used by any BE
6bf0: 46 4f 52 45 20 61 6e 64 20 41 46 54 45 52 20 74  FORE and AFTER t
6c00: 72 69 67 67 65 72 73 20 74 68 61 74 20 65 78 69  riggers that exi
6c10: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  st.  */.    sqli
6c20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6c30: 20 4f 50 5f 43 6f 70 79 2c 20 69 50 6b 2c 20 69   OP_Copy, iPk, i
6c40: 4f 6c 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 43  Old);.    for(iC
6c50: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
6c60: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
6c70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6c80: 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66  mask!=0xffffffff
6c90: 20 26 26 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a   && iCol==31 );.
6ca0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6cb0: 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66  mask!=0xffffffff
6cc0: 20 26 26 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a   && iCol==32 );.
6cd0: 20 20 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d        if( mask==
6ce0: 30 78 66 66 66 66 66 66 66 66 20 7c 7c 20 28 69  0xffffffff || (i
6cf0: 43 6f 6c 3c 3d 33 31 20 26 26 20 28 6d 61 73 6b  Col<=31 && (mask
6d00: 20 26 20 4d 41 53 4b 42 49 54 33 32 28 69 43 6f   & MASKBIT32(iCo
6d10: 6c 29 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  l))!=0) ){.     
6d20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6d30: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
6d40: 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74  le(v, pTab, iDat
6d50: 61 43 75 72 2c 20 69 43 6f 6c 2c 20 69 4f 6c 64  aCur, iCol, iOld
6d60: 2b 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20  +iCol+1);.      
6d70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
6d80: 49 6e 76 6f 6b 65 20 42 45 46 4f 52 45 20 44 45  Invoke BEFORE DE
6d90: 4c 45 54 45 20 74 72 69 67 67 65 72 20 70 72 6f  LETE trigger pro
6da0: 67 72 61 6d 73 2e 20 2a 2f 0a 20 20 20 20 61 64  grams. */.    ad
6db0: 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
6dc0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6dd0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6de0: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  CodeRowTrigger(p
6df0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 72 69  Parse, iDb, pTri
6e00: 67 67 65 72 2c 20 0a 20 20 20 20 20 20 20 20 54  gger, .        T
6e10: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54 52 49  K_DELETE, 0, TRI
6e20: 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 70 54 61  GGER_BEFORE, pTa
6e30: 62 2c 20 69 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c  b, iOld, onconf,
6e40: 20 69 4c 61 62 65 6c 0a 20 20 20 20 29 3b 0a 0a   iLabel.    );..
6e50: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 42 45      /* If any BE
6e60: 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 77 65  FORE triggers we
6e70: 72 65 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 73  re coded, then s
6e80: 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 74  eek the cursor t
6e90: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f  o the .    ** ro
6ea0: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
6eb0: 61 67 61 69 6e 2e 20 49 74 20 6d 61 79 20 62 65  again. It may be
6ec0: 20 74 68 61 74 20 74 68 65 20 42 45 46 4f 52 45   that the BEFORE
6ed0: 20 74 72 69 67 67 65 72 73 20 6d 6f 76 65 64 0a   triggers moved.
6ee0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
6ef0: 72 20 6f 72 20 61 6c 72 65 61 64 79 20 64 65 6c  r or already del
6f00: 65 74 65 64 20 74 68 65 20 72 6f 77 20 74 68 61  eted the row tha
6f10: 74 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  t the cursor was
6f20: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 69 6e 67  .    ** pointing
6f30: 20 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   to..    **.    
6f40: 2a 2a 20 41 6c 73 6f 20 64 69 73 61 62 6c 65 20  ** Also disable 
6f50: 74 68 65 20 69 49 64 78 4e 6f 53 65 65 6b 20 6f  the iIdxNoSeek o
6f60: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 69 6e 63  ptimization sinc
6f70: 65 20 74 68 65 20 42 45 46 4f 52 45 20 74 72 69  e the BEFORE tri
6f80: 67 67 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  gger.    ** may 
6f90: 68 61 76 65 20 6d 6f 76 65 64 20 74 68 61 74 20  have moved that 
6fa0: 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
6fb0: 20 20 20 69 66 28 20 61 64 64 72 53 74 61 72 74     if( addrStart
6fc0: 3c 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72  <sqlite3VdbeCurr
6fd0: 65 6e 74 41 64 64 72 28 76 29 20 29 7b 0a 20 20  entAddr(v) ){.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ff0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 53 65  ddOp4Int(v, opSe
7000: 65 6b 2c 20 69 44 61 74 61 43 75 72 2c 20 69 4c  ek, iDataCur, iL
7010: 61 62 65 6c 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b  abel, iPk, nPk);
7020: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
7030: 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d  ageIf(v, opSeek=
7040: 3d 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 3b 0a  =OP_NotExists);.
7050: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7060: 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d  geIf(v, opSeek==
7070: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  OP_NotFound);.  
7080: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 49      testcase( iI
7090: 64 78 4e 6f 53 65 65 6b 3e 3d 30 20 29 3b 0a 20  dxNoSeek>=0 );. 
70a0: 20 20 20 20 20 69 49 64 78 4e 6f 53 65 65 6b 20       iIdxNoSeek 
70b0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
70c0: 20 2f 2a 20 44 6f 20 46 4b 20 70 72 6f 63 65 73   /* Do FK proces
70d0: 73 69 6e 67 2e 20 54 68 69 73 20 63 61 6c 6c 20  sing. This call 
70e0: 63 68 65 63 6b 73 20 74 68 61 74 20 61 6e 79 20  checks that any 
70f0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  FK constraints t
7100: 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
7110: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 28   to this table (
7120: 69 2e 65 2e 20 63 6f 6e 73 74 72 61 69 6e 74 73  i.e. constraints
7130: 20 61 74 74 61 63 68 65 64 20 74 6f 20 6f 74 68   attached to oth
7140: 65 72 20 74 61 62 6c 65 73 29 20 0a 20 20 20 20  er tables) .    
7150: 2a 2a 20 61 72 65 20 6e 6f 74 20 76 69 6f 6c 61  ** are not viola
7160: 74 65 64 20 62 79 20 64 65 6c 65 74 69 6e 67 20  ted by deleting 
7170: 74 68 69 73 20 72 6f 77 2e 20 20 2a 2f 0a 20 20  this row.  */.  
7180: 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b    sqlite3FkCheck
7190: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
71a0: 61 62 2c 20 69 4f 6c 64 2c 20 30 2c 20 30 2c 20  ab, iOld, 0, 0, 
71b0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  0);.  }..  /* De
71c0: 6c 65 74 65 20 74 68 65 20 69 6e 64 65 78 20 61  lete the index a
71d0: 6e 64 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  nd table entries
71e0: 2e 20 53 6b 69 70 20 74 68 69 73 20 73 74 65 70  . Skip this step
71f0: 20 69 66 20 70 54 61 62 20 69 73 20 72 65 61 6c   if pTab is real
7200: 6c 79 0a 20 20 2a 2a 20 61 20 76 69 65 77 20 28  ly.  ** a view (
7210: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
7220: 65 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 6f 66  e only effect of
7230: 20 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   the DELETE stat
7240: 65 6d 65 6e 74 20 69 73 20 74 6f 0a 20 20 2a 2a  ement is to.  **
7250: 20 66 69 72 65 20 74 68 65 20 49 4e 53 54 45 41   fire the INSTEA
7260: 44 20 4f 46 20 74 72 69 67 67 65 72 73 29 2e 20  D OF triggers). 
7270: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 76   .  **.  ** If v
7280: 61 72 69 61 62 6c 65 20 27 63 6f 75 6e 74 27 20  ariable 'count' 
7290: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
72a0: 6e 20 74 68 69 73 20 4f 50 5f 44 65 6c 65 74 65  n this OP_Delete
72b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 68 6f   instruction sho
72c0: 75 6c 64 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20  uld.  ** invoke 
72d0: 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 2e  the update-hook.
72e0: 20 54 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d   The pre-update-
72f0: 68 6f 6f 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  hook, on the oth
7300: 65 72 20 68 61 6e 64 20 73 68 6f 75 6c 64 0a 20  er hand should. 
7310: 20 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 75   ** be invoked u
7320: 6e 6c 65 73 73 20 74 61 62 6c 65 20 70 54 61 62  nless table pTab
7330: 20 69 73 20 61 20 73 79 73 74 65 6d 20 74 61 62   is a system tab
7340: 6c 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  le. The differen
7350: 63 65 20 69 73 20 74 68 61 74 0a 20 20 2a 2a 20  ce is that.  ** 
7360: 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
7370: 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 66  is not invoked f
7380: 6f 72 20 72 6f 77 73 20 72 65 6d 6f 76 65 64 20  or rows removed 
7390: 62 79 20 52 45 50 4c 41 43 45 2c 20 62 75 74 20  by REPLACE, but 
73a0: 74 68 65 20 0a 20 20 2a 2a 20 70 72 65 2d 75 70  the .  ** pre-up
73b0: 64 61 74 65 2d 68 6f 6f 6b 20 69 73 2e 0a 20 20  date-hook is..  
73c0: 2a 2f 20 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  */ .  if( pTab->
73d0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
73e0: 20 20 75 38 20 70 35 20 3d 20 30 3b 0a 20 20 20    u8 p5 = 0;.   
73f0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
7400: 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70  RowIndexDelete(p
7410: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61  Parse, pTab, iDa
7420: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 30  taCur, iIdxCur,0
7430: 2c 69 49 64 78 4e 6f 53 65 65 6b 29 3b 0a 20 20  ,iIdxNoSeek);.  
7440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7450: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op2(v, OP_Delete
7460: 2c 20 69 44 61 74 61 43 75 72 2c 20 28 63 6f 75  , iDataCur, (cou
7470: 6e 74 3f 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  nt?OPFLAG_NCHANG
7480: 45 3a 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  E:0));.    if( p
7490: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
74a0: 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   || 0==sqlite3_s
74b0: 74 72 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  tricmp(pTab->zNa
74c0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
74d0: 31 22 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  1") ){.      sql
74e0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
74f0: 28 76 2c 20 28 63 68 61 72 2a 29 70 54 61 62 2c  (v, (char*)pTab,
7500: 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20   P4_TABLE);.    
7510: 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 21  }.    if( eMode!
7520: 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
7530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7540: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
7550: 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 29 3b 0a  LAG_AUXDELETE);.
7560: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49      }.    if( iI
7570: 64 78 4e 6f 53 65 65 6b 3e 3d 30 20 26 26 20 69  dxNoSeek>=0 && i
7580: 49 64 78 4e 6f 53 65 65 6b 21 3d 69 44 61 74 61  IdxNoSeek!=iData
7590: 43 75 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cur ){.      sql
75a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
75b0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 49 64  , OP_Delete, iId
75c0: 78 4e 6f 53 65 65 6b 29 3b 0a 20 20 20 20 7d 0a  xNoSeek);.    }.
75d0: 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 4f      if( eMode==O
75e0: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 20 70  NEPASS_MULTI ) p
75f0: 35 20 7c 3d 20 4f 50 46 4c 41 47 5f 53 41 56 45  5 |= OPFLAG_SAVE
7600: 50 4f 53 49 54 49 4f 4e 3b 0a 20 20 20 20 73 71  POSITION;.    sq
7610: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7620: 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 0a 20  5(v, p5);.  }.. 
7630: 20 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e 20 43 41   /* Do any ON CA
7640: 53 43 41 44 45 2c 20 53 45 54 20 4e 55 4c 4c 20  SCADE, SET NULL 
7650: 6f 72 20 53 45 54 20 44 45 46 41 55 4c 54 20 6f  or SET DEFAULT o
7660: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
7670: 65 64 20 74 6f 0a 20 20 2a 2a 20 68 61 6e 64 6c  ed to.  ** handl
7680: 65 20 72 6f 77 73 20 28 70 6f 73 73 69 62 6c 79  e rows (possibly
7690: 20 69 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73   in other tables
76a0: 29 20 74 68 61 74 20 72 65 66 65 72 20 76 69 61  ) that refer via
76b0: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 20   a foreign key. 
76c0: 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 6a   ** to the row j
76d0: 75 73 74 20 64 65 6c 65 74 65 64 2e 20 2a 2f 20  ust deleted. */ 
76e0: 0a 20 20 73 71 6c 69 74 65 33 46 6b 41 63 74 69  .  sqlite3FkActi
76f0: 6f 6e 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ons(pParse, iDb,
7700: 20 70 54 61 62 2c 20 30 2c 20 69 4f 6c 64 2c 20   pTab, 0, iOld, 
7710: 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76  0, 0);..  /* Inv
7720: 6f 6b 65 20 41 46 54 45 52 20 44 45 4c 45 54 45  oke AFTER DELETE
7730: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
7740: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
7750: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
7760: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 72 69 67  arse, iDb, pTrig
7770: 67 65 72 2c 20 0a 20 20 20 20 20 20 54 4b 5f 44  ger, .      TK_D
7780: 45 4c 45 54 45 2c 20 30 2c 20 54 52 49 47 47 45  ELETE, 0, TRIGGE
7790: 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 69  R_AFTER, pTab, i
77a0: 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c 20 69 4c 61  Old, onconf, iLa
77b0: 62 65 6c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4a  bel.  );..  /* J
77c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
77d0: 72 6f 77 20 68 61 64 20 61 6c 72 65 61 64 79 20  row had already 
77e0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 62 65 66  been deleted bef
77f0: 6f 72 65 20 61 6e 79 20 42 45 46 4f 52 45 0a 20  ore any BEFORE. 
7800: 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
7810: 72 61 6d 73 20 77 65 72 65 20 69 6e 76 6f 6b 65  rams were invoke
7820: 64 2e 20 4f 72 20 69 66 20 61 20 74 72 69 67 67  d. Or if a trigg
7830: 65 72 20 70 72 6f 67 72 61 6d 20 74 68 72 6f 77  er program throw
7840: 73 20 61 20 0a 20 20 2a 2a 20 52 41 49 53 45 28  s a .  ** RAISE(
7850: 49 47 4e 4f 52 45 29 20 65 78 63 65 70 74 69 6f  IGNORE) exceptio
7860: 6e 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
7870: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7880: 28 76 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20 56  (v, iLabel);.  V
7890: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
78a0: 28 28 76 2c 20 22 45 4e 44 3a 20 47 65 6e 52 6f  ((v, "END: GenRo
78b0: 77 44 65 6c 28 29 22 29 29 3b 0a 7d 0a 0a 2f 2a  wDel()"));.}../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20   generates VDBE 
78e0: 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65 73  code that causes
78f0: 20 74 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f 66   the deletion of
7900: 20 61 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65 6e   all.** index en
7910: 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
7920: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72   with a single r
7930: 6f 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  ow of a single t
7940: 61 62 6c 65 2c 20 70 54 61 62 0a 2a 2a 0a 2a 2a  able, pTab.**.**
7950: 20 50 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   Preconditions:.
7960: 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 41 20 72 65  **.**   1.  A re
7970: 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20  ad/write cursor 
7980: 22 69 44 61 74 61 43 75 72 22 20 6d 75 73 74 20  "iDataCur" must 
7990: 62 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 63  be open on the c
79a0: 61 6e 6f 6e 69 63 61 6c 20 73 74 6f 72 61 67 65  anonical storage
79b0: 0a 2a 2a 20 20 20 20 20 20 20 62 74 72 65 65 20  .**       btree 
79c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 54  for the table pT
79d0: 61 62 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20  ab.  (This will 
79e0: 62 65 20 65 69 74 68 65 72 20 74 68 65 20 74 61  be either the ta
79f0: 62 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 20 20  ble itself.**   
7a00: 20 20 20 20 66 6f 72 20 72 6f 77 69 64 20 74 61      for rowid ta
7a10: 62 6c 65 73 20 6f 72 20 74 6f 20 74 68 65 20 70  bles or to the p
7a20: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
7a30: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
7a40: 49 44 0a 2a 2a 20 20 20 20 20 20 20 74 61 62 6c  ID.**       tabl
7a50: 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  es.).**.**   2. 
7a60: 20 52 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   Read/write curs
7a70: 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69  ors for all indi
7a80: 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74  ces of pTab must
7a90: 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20   be open as.**  
7aa0: 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62       cursor numb
7ab0: 65 72 20 69 49 64 78 43 75 72 2b 69 20 66 6f 72  er iIdxCur+i for
7ac0: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e   the i-th index.
7ad0: 20 20 28 54 68 65 20 70 54 61 62 2d 3e 70 49 6e    (The pTab->pIn
7ae0: 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64  dex.**       ind
7af0: 65 78 20 69 73 20 74 68 65 20 30 2d 74 68 20 69  ex is the 0-th i
7b00: 6e 64 65 78 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 33  ndex.).**.**   3
7b10: 2e 20 20 54 68 65 20 22 69 44 61 74 61 43 75 72  .  The "iDataCur
7b20: 22 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  " cursor must be
7b30: 20 61 6c 72 65 61 64 79 20 62 65 20 70 6f 73 69   already be posi
7b40: 74 69 6f 6e 65 64 20 6f 6e 20 74 68 65 20 72 6f  tioned on the ro
7b50: 77 0a 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20  w.**       that 
7b60: 69 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  is to be deleted
7b70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7b80: 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65  3GenerateRowInde
7b90: 78 44 65 6c 65 74 65 28 0a 20 20 50 61 72 73 65  xDelete(.  Parse
7ba0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7bb0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
7bc0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
7bd0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
7be0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20  *pTab,       /* 
7bf0: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  Table containing
7c00: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
7c10: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
7c20: 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 2f  iDataCur,      /
7c30: 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61 62 6c  * Cursor of tabl
7c40: 65 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 2e 20  e holding data. 
7c50: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
7c60: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
7c70: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
7c80: 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c  .  int *aRegIdx,
7c90: 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65        /* Only de
7ca0: 6c 65 74 65 20 69 66 20 61 52 65 67 49 64 78 21  lete if aRegIdx!
7cb0: 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b 69 5d  =0 && aRegIdx[i]
7cc0: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  >0 */.  int iIdx
7cd0: 4e 6f 53 65 65 6b 20 20 20 20 20 2f 2a 20 44 6f  NoSeek     /* Do
7ce0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 66 72 6f 6d   not delete from
7cf0: 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
7d00: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
7d10: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
7d20: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
7d30: 0a 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 20  .  int r1 = -1; 
7d40: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
7d50: 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64  r holding an ind
7d60: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ex key */.  int 
7d70: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 2f  iPartIdxLabel; /
7d80: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
7d90: 6f 6e 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20  on for skipping 
7da0: 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 65 6e  partial index en
7db0: 74 72 69 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  tries */.  Index
7dc0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a   *pIdx;       /*
7dd0: 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 2a   Current index *
7de0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f  /.  Index *pPrio
7df0: 72 20 3d 20 30 3b 20 2f 2a 20 50 72 69 6f 72 20  r = 0; /* Prior 
7e00: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
7e10: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *v;           /*
7e20: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
7e30: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
7e40: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
7e50: 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20 20 20 20  Index *pPk;     
7e60: 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
7e70: 59 20 69 6e 64 65 78 2c 20 6f 72 20 4e 55 4c 4c  Y index, or NULL
7e80: 20 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65   for rowid table
7e90: 73 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72  s */..  v = pPar
7ea0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 50 6b  se->pVdbe;.  pPk
7eb0: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
7ec0: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50  ) ? 0 : sqlite3P
7ed0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
7ee0: 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Tab);.  for(i=0,
7ef0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
7f00: 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70  ex; pIdx; i++, p
7f10: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
7f20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49  {.    assert( iI
7f30: 64 78 43 75 72 2b 69 21 3d 69 44 61 74 61 43 75  dxCur+i!=iDataCu
7f40: 72 20 7c 7c 20 70 50 6b 3d 3d 70 49 64 78 20 29  r || pPk==pIdx )
7f50: 3b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64  ;.    if( aRegId
7f60: 78 21 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b  x!=0 && aRegIdx[
7f70: 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
7f80: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  ;.    if( pIdx==
7f90: 70 50 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  pPk ) continue;.
7fa0: 20 20 20 20 69 66 28 20 69 49 64 78 43 75 72 2b      if( iIdxCur+
7fb0: 69 3d 3d 69 49 64 78 4e 6f 53 65 65 6b 20 29 20  i==iIdxNoSeek ) 
7fc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56 64  continue;.    Vd
7fd0: 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
7fe0: 28 76 2c 20 22 47 65 6e 52 6f 77 49 64 78 44 65  (v, "GenRowIdxDe
7ff0: 6c 20 66 6f 72 20 25 73 22 2c 20 70 49 64 78 2d  l for %s", pIdx-
8000: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 31  >zName));.    r1
8010: 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61   = sqlite3Genera
8020: 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
8030: 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43 75  e, pIdx, iDataCu
8040: 72 2c 20 30 2c 20 31 2c 0a 20 20 20 20 20 20 20  r, 0, 1,.       
8050: 20 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c   &iPartIdxLabel,
8060: 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20   pPrior, r1);.  
8070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8080: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
8090: 65 74 65 2c 20 69 49 64 78 43 75 72 2b 69 2c 20  ete, iIdxCur+i, 
80a0: 72 31 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78  r1,.        pIdx
80b0: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
80c0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20  pIdx->nKeyCol : 
80d0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
80e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
80f0: 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
8100: 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
8110: 61 62 65 6c 29 3b 0a 20 20 20 20 70 50 72 69 6f  abel);.    pPrio
8120: 72 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 7d 0a  r = pIdx;.  }.}.
8130: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8140: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 61  code that will a
8150: 73 73 65 6d 62 6c 65 20 61 6e 20 69 6e 64 65 78  ssemble an index
8160: 20 6b 65 79 20 61 6e 64 20 73 74 6f 72 65 73 20   key and stores 
8170: 69 74 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a  it in register.*
8180: 2a 20 72 65 67 4f 75 74 2e 20 20 54 68 65 20 6b  * regOut.  The k
8190: 65 79 20 77 69 74 68 20 62 65 20 66 6f 72 20 69  ey with be for i
81a0: 6e 64 65 78 20 70 49 64 78 20 77 68 69 63 68 20  ndex pIdx which 
81b0: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70  is an index on p
81c0: 54 61 62 2e 0a 2a 2a 20 69 43 75 72 20 69 73 20  Tab..** iCur is 
81d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
81e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
81f0: 65 20 70 54 61 62 20 74 61 62 6c 65 20 61 6e 64  e pTab table and
8200: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
8210: 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 6e  the entry that n
8220: 65 65 64 73 20 69 6e 64 65 78 69 6e 67 2e 20 20  eeds indexing.  
8230: 49 66 20 70 54 61 62 20 69 73 20 61 20 57 49 54  If pTab is a WIT
8240: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
8250: 2c 20 74 68 65 6e 0a 2a 2a 20 69 43 75 72 20 6d  , then.** iCur m
8260: 75 73 74 20 62 65 20 74 68 65 20 63 75 72 73 6f  ust be the curso
8270: 72 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  r of the PRIMARY
8280: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   KEY index..**.*
8290: 2a 20 52 65 74 75 72 6e 20 61 20 72 65 67 69 73  * Return a regis
82a0: 74 65 72 20 6e 75 6d 62 65 72 20 77 68 69 63 68  ter number which
82b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
82c0: 20 61 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 72   a block of.** r
82d0: 65 67 69 73 74 65 72 73 20 74 68 61 74 20 68 6f  egisters that ho
82e0: 6c 64 73 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  lds the elements
82f0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b 65   of the index ke
8300: 79 2e 20 20 54 68 65 0a 2a 2a 20 62 6c 6f 63 6b  y.  The.** block
8310: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 61   of registers ha
8320: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  s already been d
8330: 65 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68  eallocated by th
8340: 65 20 74 69 6d 65 0a 2a 2a 20 74 68 69 73 20 72  e time.** this r
8350: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
8360: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 69 50 61 72 74  **.** If *piPart
8370: 49 64 78 4c 61 62 65 6c 20 69 73 20 6e 6f 74 20  IdxLabel is not 
8380: 4e 55 4c 4c 2c 20 66 69 6c 6c 20 69 74 20 69 6e  NULL, fill it in
8390: 20 77 69 74 68 20 61 20 6c 61 62 65 6c 20 61 6e   with a label an
83a0: 64 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 74 68 61  d jump.** to tha
83b0: 74 20 6c 61 62 65 6c 20 69 66 20 70 49 64 78 20  t label if pIdx 
83c0: 69 73 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  is a partial ind
83d0: 65 78 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ex that should b
83e0: 65 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 20 54 68  e skipped..** Th
83f0: 65 20 6c 61 62 65 6c 20 73 68 6f 75 6c 64 20 62  e label should b
8400: 65 20 72 65 73 6f 6c 76 65 64 20 75 73 69 6e 67  e resolved using
8410: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
8420: 61 72 74 49 64 78 4c 61 62 65 6c 28 29 2e 0a 2a  artIdxLabel()..*
8430: 2a 20 41 20 70 61 72 74 69 61 6c 20 69 6e 64 65  * A partial inde
8440: 78 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70  x should be skip
8450: 70 65 64 20 69 66 20 69 74 73 20 57 48 45 52 45  ped if its WHERE
8460: 20 63 6c 61 75 73 65 20 65 76 61 6c 75 61 74 65   clause evaluate
8470: 73 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 6f 72  s.** to false or
8480: 20 6e 75 6c 6c 2e 20 20 49 66 20 70 49 64 78 20   null.  If pIdx 
8490: 69 73 20 6e 6f 74 20 61 20 70 61 72 74 69 61 6c  is not a partial
84a0: 20 69 6e 64 65 78 2c 20 2a 70 69 50 61 72 74 49   index, *piPartI
84b0: 64 78 4c 61 62 65 6c 0a 2a 2a 20 77 69 6c 6c 20  dxLabel.** will 
84c0: 62 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 77  be set to zero w
84d0: 68 69 63 68 20 69 73 20 61 6e 20 65 6d 70 74 79  hich is an empty
84e0: 20 6c 61 62 65 6c 20 74 68 61 74 20 69 73 20 69   label that is i
84f0: 67 6e 6f 72 65 64 20 62 79 0a 2a 2a 20 73 71 6c  gnored by.** sql
8500: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
8510: 64 78 4c 61 62 65 6c 28 29 2e 0a 2a 2a 0a 2a 2a  dxLabel()..**.**
8520: 20 54 68 65 20 70 50 72 69 6f 72 20 61 6e 64 20   The pPrior and 
8530: 72 65 67 50 72 69 6f 72 20 70 61 72 61 6d 65 74  regPrior paramet
8540: 65 72 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ers are used to 
8550: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 63 61 63 68  implement a cach
8560: 65 20 74 6f 0a 2a 2a 20 61 76 6f 69 64 20 75 6e  e to.** avoid un
8570: 6e 65 63 65 73 73 61 72 79 20 72 65 67 69 73 74  necessary regist
8580: 65 72 20 6c 6f 61 64 73 2e 20 20 49 66 20 70 50  er loads.  If pP
8590: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
85a0: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
85b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
85c0: 69 66 66 65 72 65 6e 74 20 69 6e 64 65 78 20 66  ifferent index f
85d0: 6f 72 20 77 68 69 63 68 20 61 6e 20 69 6e 64 65  or which an inde
85e0: 78 20 6b 65 79 20 68 61 73 20 6a 75 73 74 20 62  x key has just b
85f0: 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 20  een.** computed 
8600: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
8610: 67 50 72 69 6f 72 2e 20 20 49 66 20 74 68 65 20  gPrior.  If the 
8620: 63 75 72 72 65 6e 74 20 70 49 64 78 20 69 6e 64  current pIdx ind
8630: 65 78 20 69 73 20 67 65 6e 65 72 61 74 69 6e 67  ex is generating
8640: 0a 2a 2a 20 69 74 73 20 6b 65 79 20 69 6e 74 6f  .** its key into
8650: 20 74 68 65 20 73 61 6d 65 20 73 65 71 75 65 6e   the same sequen
8660: 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
8670: 61 6e 64 20 69 66 20 70 50 72 69 6f 72 20 61 6e  and if pPrior an
8680: 64 20 70 49 64 78 20 73 68 61 72 65 0a 2a 2a 20  d pIdx share.** 
8690: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 63 6f 6d 6d  a column in comm
86a0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 67  on, then the reg
86b0: 69 73 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  ister correspond
86c0: 69 6e 67 20 74 6f 20 74 68 61 74 20 63 6f 6c 75  ing to that colu
86d0: 6d 6e 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 6f  mn already.** ho
86e0: 6c 64 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  lds the correct 
86f0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6c 6f  value and the lo
8700: 61 64 69 6e 67 20 6f 66 20 74 68 61 74 20 72 65  ading of that re
8710: 67 69 73 74 65 72 20 69 73 20 73 6b 69 70 70 65  gister is skippe
8720: 64 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d  d..** This optim
8730: 69 7a 61 74 69 6f 6e 20 69 73 20 68 65 6c 70 66  ization is helpf
8740: 75 6c 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ul when doing a 
8750: 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e 54  DELETE or an INT
8760: 45 47 52 49 54 59 5f 43 48 45 43 4b 20 0a 2a 2a  EGRITY_CHECK .**
8770: 20 6f 6e 20 61 20 74 61 62 6c 65 20 77 69 74 68   on a table with
8780: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
8790: 73 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c  s, and especiall
87a0: 79 20 77 69 74 68 20 74 68 65 20 52 4f 57 49 44  y with the ROWID
87b0: 20 6f 72 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b   or.** PRIMARY K
87c0: 45 59 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  EY columns of th
87d0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20  e index..*/.int 
87e0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
87f0: 6e 64 65 78 4b 65 79 28 0a 20 20 50 61 72 73 65  ndexKey(.  Parse
8800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8810: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8820: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
8830: 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
8840: 54 68 65 20 69 6e 64 65 78 20 66 6f 72 20 77 68  The index for wh
8850: 69 63 68 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ich to generate 
8860: 61 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69  a key */.  int i
8870: 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 20 20  DataCur,        
8880: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
8890: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 74   from which to t
88a0: 61 6b 65 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20  ake column data 
88b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 2c  */.  int regOut,
88c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 74            /* Put
88d0: 20 74 68 65 20 6e 65 77 20 6b 65 79 20 69 6e 74   the new key int
88e0: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
88f0: 69 66 20 6e 6f 74 20 30 20 2a 2f 0a 20 20 69 6e  if not 0 */.  in
8900: 74 20 70 72 65 66 69 78 4f 6e 6c 79 2c 20 20 20  t prefixOnly,   
8910: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6f 6e     /* Compute on
8920: 6c 79 20 61 20 75 6e 69 71 75 65 20 70 72 65 66  ly a unique pref
8930: 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f  ix of the key */
8940: 0a 20 20 69 6e 74 20 2a 70 69 50 61 72 74 49 64  .  int *piPartId
8950: 78 4c 61 62 65 6c 2c 20 2f 2a 20 4f 55 54 3a 20  xLabel, /* OUT: 
8960: 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
8970: 65 6c 20 74 6f 20 73 6b 69 70 20 70 61 72 74 69  el to skip parti
8980: 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 49 6e  al index */.  In
8990: 64 65 78 20 2a 70 50 72 69 6f 72 2c 20 20 20 20  dex *pPrior,    
89a0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
89b0: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 64 65 78   generated index
89c0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65   key */.  int re
89d0: 67 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 2f  gPrior         /
89e0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
89f0: 6e 67 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  ng previous gene
8a00: 72 61 74 65 64 20 6b 65 79 20 2a 2f 0a 29 7b 0a  rated key */.){.
8a10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8a20: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
8a30: 20 6a 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73   j;.  int regBas
8a40: 65 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a  e;.  int nCol;..
8a50: 20 20 69 66 28 20 70 69 50 61 72 74 49 64 78 4c    if( piPartIdxL
8a60: 61 62 65 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  abel ){.    if( 
8a70: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
8a80: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  ere ){.      *pi
8a90: 50 61 72 74 49 64 78 4c 61 62 65 6c 20 3d 20 73  PartIdxLabel = s
8aa0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8ab0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 70 50  bel(v);.      pP
8ac0: 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
8ad0: 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a 20   iDataCur + 1;. 
8ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8af0: 49 66 46 61 6c 73 65 44 75 70 28 70 50 61 72 73  IfFalseDup(pPars
8b00: 65 2c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  e, pIdx->pPartId
8b10: 78 57 68 65 72 65 2c 20 2a 70 69 50 61 72 74 49  xWhere, *piPartI
8b20: 64 78 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  dxLabel, .      
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d        SQLITE_JUM
8b50: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
8b60: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
8b70: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8b80: 0a 20 20 20 20 20 20 2a 70 69 50 61 72 74 49 64  .      *piPartId
8b90: 78 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20  xLabel = 0;.    
8ba0: 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 28  }.  }.  nCol = (
8bb0: 70 72 65 66 69 78 4f 6e 6c 79 20 26 26 20 70 49  prefixOnly && pI
8bc0: 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 29  dx->uniqNotNull)
8bd0: 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   ? pIdx->nKeyCol
8be0: 20 3a 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   : pIdx->nColumn
8bf0: 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71  ;.  regBase = sq
8c00: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
8c10: 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
8c20: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 26 26  .  if( pPrior &&
8c30: 20 28 72 65 67 42 61 73 65 21 3d 72 65 67 50 72   (regBase!=regPr
8c40: 69 6f 72 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70  ior || pPrior->p
8c50: 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 20  PartIdxWhere) ) 
8c60: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 66 6f  pPrior = 0;.  fo
8c70: 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a  r(j=0; j<nCol; j
8c80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
8c90: 69 6f 72 0a 20 20 20 20 20 26 26 20 70 50 72 69  ior.     && pPri
8ca0: 6f 72 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d  or->aiColumn[j]=
8cb0: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
8cc0: 6a 5d 0a 20 20 20 20 20 26 26 20 70 50 72 69 6f  j].     && pPrio
8cd0: 72 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  r->aiColumn[j]!=
8ce0: 58 4e 5f 45 58 50 52 0a 20 20 20 20 29 7b 0a 20  XN_EXPR.    ){. 
8cf0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6c       /* This col
8d00: 75 6d 6e 20 77 61 73 20 61 6c 72 65 61 64 79 20  umn was already 
8d10: 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
8d20: 70 72 65 76 69 6f 75 73 20 69 6e 64 65 78 20 2a  previous index *
8d30: 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
8d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8d50: 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
8d60: 6e 64 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73  ndexColumn(pPars
8d70: 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43 75  e, pIdx, iDataCu
8d80: 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29  r, j, regBase+j)
8d90: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ;.    /* If the 
8da0: 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
8db0: 69 73 20 52 45 41 4c 20 62 75 74 20 74 68 65 20  is REAL but the 
8dc0: 6e 75 6d 62 65 72 20 69 73 20 61 6e 20 69 6e 74  number is an int
8dd0: 65 67 65 72 2c 20 74 68 65 6e 20 69 74 0a 20 20  eger, then it.  
8de0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 74    ** might be st
8df0: 6f 72 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ored in the tabl
8e00: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e as an integer 
8e10: 28 75 73 69 6e 67 20 61 20 63 6f 6d 70 61 63 74  (using a compact
8e20: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
8e30: 74 61 74 69 6f 6e 29 20 74 68 65 6e 20 63 6f 6e  tation) then con
8e40: 76 65 72 74 65 64 20 74 6f 20 52 45 41 4c 20 62  verted to REAL b
8e50: 79 20 61 6e 20 4f 50 5f 52 65 61 6c 41 66 66 69  y an OP_RealAffi
8e60: 6e 69 74 79 20 6f 70 63 6f 64 65 2e 0a 20 20 20  nity opcode..   
8e70: 20 2a 2a 20 42 75 74 20 77 65 20 61 72 65 20 67   ** But we are g
8e80: 65 74 74 69 6e 67 20 72 65 61 64 79 20 74 6f 20  etting ready to 
8e90: 73 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  store this value
8ea0: 20 62 61 63 6b 20 69 6e 74 6f 20 61 6e 20 69 6e   back into an in
8eb0: 64 65 78 2c 20 77 68 65 72 65 0a 20 20 20 20 2a  dex, where.    *
8ec0: 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  * it should be c
8ed0: 6f 6e 76 65 72 74 65 64 20 62 79 20 74 6f 20 49  onverted by to I
8ee0: 4e 54 45 47 45 52 20 61 67 61 69 6e 2e 20 20 53  NTEGER again.  S
8ef0: 6f 20 6f 6d 69 74 20 74 68 65 20 4f 50 5f 52 65  o omit the OP_Re
8f00: 61 6c 41 66 66 69 6e 69 74 79 0a 20 20 20 20 2a  alAffinity.    *
8f10: 2a 20 6f 70 63 6f 64 65 20 69 66 20 69 74 20 69  * opcode if it i
8f20: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20  s present */.   
8f30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
8f40: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c  tePriorOpcode(v,
8f50: 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
8f60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67  );.  }.  if( reg
8f70: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
8f80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8f90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8fa0: 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
8fb0: 67 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  gOut);.    if( p
8fc0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 53 65  Idx->pTable->pSe
8fd0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
8fe0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  nst char *zAff =
8ff0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
9000: 69 6e 69 74 79 53 74 72 28 70 50 61 72 73 65 2d  inityStr(pParse-
9010: 3e 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  >db, pIdx);.    
9020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9030: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
9040: 66 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  f, P4_TRANSIENT)
9050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
9060: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9070: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
9080: 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
9090: 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
90a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 70 72  }../*.** If a pr
90b0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
90c0: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
90d0: 4b 65 79 28 29 20 67 65 6e 65 72 61 74 65 64 20  Key() generated 
90e0: 61 20 6a 75 6d 70 2d 6f 76 65 72 20 6c 61 62 65  a jump-over labe
90f0: 6c 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20  l.** because it 
9100: 77 61 73 20 61 20 70 61 72 74 69 61 6c 20 69 6e  was a partial in
9110: 64 65 78 2c 20 74 68 65 6e 20 74 68 69 73 20 72  dex, then this r
9120: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
9130: 20 63 61 6c 6c 65 64 20 74 6f 0a 2a 2a 20 72 65   called to.** re
9140: 73 6f 6c 76 65 20 74 68 61 74 20 6c 61 62 65 6c  solve that label
9150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9160: 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
9170: 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50 61 72  abel(Parse *pPar
9180: 73 65 2c 20 69 6e 74 20 69 4c 61 62 65 6c 29 7b  se, int iLabel){
9190: 0a 20 20 69 66 28 20 69 4c 61 62 65 6c 20 29 7b  .  if( iLabel ){
91a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61  ResolveLabel(pPa
91c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 4c 61 62  rse->pVdbe, iLab
91d0: 65 6c 29 3b 0a 20 20 7d 0a 7d 0a                 el);.  }.}.