/ Hex Artifact Content
Login

Artifact e1ac11c062a4a2ed29a9e9a63f4cbc7f0330291ae276d768b26fb2c5152cc3b4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 69 6e  the parser.** in
01c0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
01d0: 74 65 20 63 6f 64 65 20 66 6f 72 20 44 45 4c 45  te code for DELE
01e0: 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e  TE FROM statemen
01f0: 74 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ts..*/.#include 
0200: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0210: 2a 0a 2a 2a 20 57 68 69 6c 65 20 61 20 53 72 63  *.** While a Src
0220: 4c 69 73 74 20 63 61 6e 20 69 6e 20 67 65 6e 65  List can in gene
0230: 72 61 6c 20 72 65 70 72 65 73 65 6e 74 20 6d 75  ral represent mu
0240: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 6e  ltiple tables an
0250: 64 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  d subqueries.** 
0260: 28 61 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  (as in the FROM 
0270: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
0280: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 69 6e  CT statement) in
0290: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 63 6f   this case it co
02a0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e 61  ntains.** the na
02b0: 6d 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  me of a single t
02c0: 61 62 6c 65 2c 20 61 73 20 6f 6e 65 20 6d 69 67  able, as one mig
02d0: 68 74 20 66 69 6e 64 20 69 6e 20 61 6e 20 49 4e  ht find in an IN
02e0: 53 45 52 54 2c 20 44 45 4c 45 54 45 2c 0a 2a 2a  SERT, DELETE,.**
02f0: 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
0300: 6d 65 6e 74 2e 20 20 4c 6f 6f 6b 20 75 70 20 74  ment.  Look up t
0310: 68 61 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  hat table in the
0320: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 61 6e   symbol table an
0330: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
0340: 69 6e 74 65 72 2e 20 20 53 65 74 20 61 6e 20 65  inter.  Set an e
0350: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
0360: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
0370: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 6e 61  the table .** na
0380: 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  me is not found 
0390: 6f 72 20 69 66 20 61 6e 79 20 6f 74 68 65 72 20  or if any other 
03a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
03b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
03c0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
03d0: 74 69 61 6c 69 7a 65 64 20 61 70 70 72 6f 70 72  tialized appropr
03e0: 69 61 74 65 20 69 6e 20 70 53 72 63 3a 0a 2a 2a  iate in pSrc:.**
03f0: 0a 2a 2a 20 20 20 20 70 53 72 63 2d 3e 61 5b 30  .**    pSrc->a[0
0400: 5d 2e 70 54 61 62 20 20 20 20 20 20 20 50 6f 69  ].pTab       Poi
0410: 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
0420: 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 70  e object.**    p
0430: 53 72 63 2d 3e 61 5b 30 5d 2e 70 49 6e 64 65 78  Src->a[0].pIndex
0440: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0450: 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 69  the INDEXED BY i
0460: 6e 64 65 78 2c 20 69 66 20 74 68 65 72 65 20 69  ndex, if there i
0470: 73 20 6f 6e 65 0a 2a 2a 0a 2a 2f 0a 54 61 62 6c  s one.**.*/.Tabl
0480: 65 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  e *sqlite3SrcLis
0490: 74 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  tLookup(Parse *p
04a0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
04b0: 70 53 72 63 29 7b 0a 20 20 73 74 72 75 63 74 20  pSrc){.  struct 
04c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
04d0: 74 65 6d 20 3d 20 70 53 72 63 2d 3e 61 3b 0a 20  tem = pSrc->a;. 
04e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
04f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 20 26 26  assert( pItem &&
0500: 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29   pSrc->nSrc==1 )
0510: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
0520: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
0530: 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74  m(pParse, 0, pIt
0540: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  em);.  sqlite3De
0550: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
0560: 2d 3e 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  ->db, pItem->pTa
0570: 62 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 54 61  b);.  pItem->pTa
0580: 62 20 3d 20 70 54 61 62 3b 0a 20 20 69 66 28 20  b = pTab;.  if( 
0590: 70 54 61 62 20 29 7b 0a 20 20 20 20 70 54 61 62  pTab ){.    pTab
05a0: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 7d  ->nTabRef++;.  }
05b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e  .  if( sqlite3In
05c0: 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
05d0: 61 72 73 65 2c 20 70 49 74 65 6d 29 20 29 7b 0a  arse, pItem) ){.
05e0: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
05f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
0600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0610: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
0620: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 69 73 20   given table is 
0630: 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 74  writable.  If it
0640: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61   is not.** writa
0650: 62 6c 65 2c 20 67 65 6e 65 72 61 74 65 20 61 6e  ble, generate an
0660: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
0670: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
0680: 20 69 74 20 69 73 0a 2a 2a 20 77 72 69 74 61 62   it is.** writab
0690: 6c 65 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a  le return 0;.*/.
06a0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 65 61  int sqlite3IsRea
06b0: 64 4f 6e 6c 79 28 50 61 72 73 65 20 2a 70 50 61  dOnly(Parse *pPa
06c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
06d0: 2c 20 69 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20  , int viewOk){. 
06e0: 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 73 20 6e   /* A table is n
06f0: 6f 74 20 77 72 69 74 61 62 6c 65 20 75 6e 64 65  ot writable unde
0700: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
0710: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
0720: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 49 74   **.  **   1) It
0730: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
0740: 62 6c 65 20 61 6e 64 20 6e 6f 20 69 6d 70 6c 65  ble and no imple
0750: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0760: 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 0a   xUpdate method.
0770: 20 20 2a 2a 20 20 20 20 20 20 68 61 73 20 62 65    **      has be
0780: 65 6e 20 70 72 6f 76 69 64 65 64 2c 20 6f 72 0a  en provided, or.
0790: 20 20 2a 2a 20 20 20 32 29 20 49 74 20 69 73 20    **   2) It is 
07a0: 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 28  a system table (
07b0: 69 2e 65 2e 20 73 71 6c 69 74 65 5f 6d 61 73 74  i.e. sqlite_mast
07c0: 65 72 29 2c 20 74 68 69 73 20 63 61 6c 6c 20 69  er), this call i
07d0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
07e0: 70 61 72 74 20 6f 66 20 61 20 6e 65 73 74 65 64  part of a nested
07f0: 20 70 61 72 73 65 20 61 6e 64 20 77 72 69 74 61   parse and writa
0800: 62 6c 65 5f 73 63 68 65 6d 61 20 70 72 61 67 6d  ble_schema pragm
0810: 61 20 68 61 73 20 6e 6f 74 20 0a 20 20 2a 2a 20  a has not .  ** 
0820: 20 20 20 20 20 62 65 65 6e 20 73 70 65 63 69 66       been specif
0830: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ied..  **.  ** I
0840: 6e 20 65 69 74 68 65 72 20 63 61 73 65 20 6c 65  n either case le
0850: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
0860: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
0870: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
0880: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ro..  */.  if( (
0890: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
08a0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
08b0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
08c0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  e->db, pTab)->pM
08d0: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  od->pModule->xUp
08e0: 64 61 74 65 3d 3d 30 20 29 0a 20 20 20 7c 7c 20  date==0 ).   || 
08f0: 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
0900: 73 20 26 20 54 46 5f 52 65 61 64 6f 6e 6c 79 29  s & TF_Readonly)
0910: 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  !=0.     && sqli
0920: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
0930: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  a(pParse->db)==0
0940: 0a 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d  .     && pParse-
0950: 3e 6e 65 73 74 65 64 3d 3d 30 29 0a 20 20 29 7b  >nested==0).  ){
0960: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
0970: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
0980: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
0990: 65 20 6d 6f 64 69 66 69 65 64 22 2c 20 70 54 61  e modified", pTa
09a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
09b0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 23 69  eturn 1;.  }..#i
09c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
09d0: 54 5f 56 49 45 57 0a 20 20 69 66 28 20 21 76 69  T_VIEW.  if( !vi
09e0: 65 77 4f 6b 20 26 26 20 70 54 61 62 2d 3e 70 53  ewOk && pTab->pS
09f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
0a00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0a10: 72 73 65 2c 22 63 61 6e 6e 6f 74 20 6d 6f 64 69  rse,"cannot modi
0a20: 66 79 20 25 73 20 62 65 63 61 75 73 65 20 69 74  fy %s because it
0a30: 20 69 73 20 61 20 76 69 65 77 22 2c 70 54 61 62   is a view",pTab
0a40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
0a50: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
0a60: 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  if.  return 0;.}
0a70: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
0a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
0a90: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
0ab0: 52 29 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  R)./*.** Evaluat
0ac0: 65 20 61 20 76 69 65 77 20 61 6e 64 20 73 74 6f  e a view and sto
0ad0: 72 65 20 69 74 73 20 72 65 73 75 6c 74 20 69 6e  re its result in
0ae0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
0af0: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 70 57 68  ble.  The.** pWh
0b00: 65 72 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ere argument is 
0b10: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 57 48 45 52  an optional WHER
0b20: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
0b30: 73 74 72 69 63 74 73 20 74 68 65 0a 2a 2a 20 73  stricts the.** s
0b40: 65 74 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  et of rows in th
0b50: 65 20 76 69 65 77 20 74 68 61 74 20 61 72 65 20  e view that are 
0b60: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
0b70: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
0b80: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
0b90: 74 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69  te3MaterializeVi
0ba0: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0bb0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
0bc0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0bd0: 0a 20 20 54 61 62 6c 65 20 2a 70 56 69 65 77 2c  .  Table *pView,
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 65 77 20          /* View 
0bf0: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
0c00: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
0c10: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
0c20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
0c30: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 45   be added */.  E
0c40: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
0c50: 79 2c 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  y,  /* Optional 
0c60: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
0c70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0c80: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  t,        /* Opt
0c90: 69 6f 6e 61 6c 20 4c 49 4d 49 54 20 63 6c 61 75  ional LIMIT clau
0ca0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  se */.  int iCur
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cc0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
0cd0: 72 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  r ephemeral tabl
0ce0: 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  e */.){.  Select
0cf0: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 53 65 6c  Dest dest;.  Sel
0d00: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 53 72 63  ect *pSel;.  Src
0d10: 4c 69 73 74 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  List *pFrom;.  s
0d20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0d30: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
0d40: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
0d50: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 56  maToIndex(db, pV
0d60: 69 65 77 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  iew->pSchema);. 
0d70: 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
0d80: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
0d90: 65 72 65 2c 20 30 29 3b 0a 20 20 70 46 72 6f 6d  ere, 0);.  pFrom
0da0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
0db0: 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
0dc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  , 0);.  if( pFro
0dd0: 6d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  m ){.    assert(
0de0: 20 70 46 72 6f 6d 2d 3e 6e 53 72 63 3d 3d 31 20   pFrom->nSrc==1 
0df0: 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 5b  );.    pFrom->a[
0e00: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  0].zName = sqlit
0e10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
0e20: 56 69 65 77 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  View->zName);.  
0e30: 20 20 70 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 7a 44    pFrom->a[0].zD
0e40: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
0e50: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 64 62  3DbStrDup(db, db
0e60: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
0e70: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
0e80: 28 20 70 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 70 4f  ( pFrom->a[0].pO
0e90: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  n==0 );.    asse
0ea0: 72 74 28 20 70 46 72 6f 6d 2d 3e 61 5b 30 5d 2e  rt( pFrom->a[0].
0eb0: 70 55 73 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 7d  pUsing==0 );.  }
0ec0: 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
0ed0: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
0ee0: 65 2c 20 30 2c 20 70 46 72 6f 6d 2c 20 70 57 68  e, 0, pFrom, pWh
0ef0: 65 72 65 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ere, 0, 0, pOrde
0f00: 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rBy, .          
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
0f30: 2c 20 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c  , pLimit);.  sql
0f40: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0f50: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
0f60: 68 65 6d 54 61 62 2c 20 69 43 75 72 29 3b 0a 20  hemTab, iCur);. 
0f70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
0f80: 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
0f90: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
0fa0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
0fb0: 53 65 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Sel);.}.#endif /
0fc0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
0fd0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20  E_OMIT_VIEW) && 
0fe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0ff0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
1000: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1010: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
1020: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
1030: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1040: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1050: 59 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  Y)./*.** Generat
1060: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1070: 74 72 65 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tree to implemen
1080: 74 20 74 68 65 20 57 48 45 52 45 2c 20 4f 52 44  t the WHERE, ORD
1090: 45 52 20 42 59 2c 0a 2a 2a 20 61 6e 64 20 4c 49  ER BY,.** and LI
10a0: 4d 49 54 2f 4f 46 46 53 45 54 20 70 6f 72 74 69  MIT/OFFSET porti
10b0: 6f 6e 20 6f 66 20 44 45 4c 45 54 45 20 61 6e 64  on of DELETE and
10c0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
10d0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45  ts..**.**     DE
10e0: 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f  LETE FROM table_
10f0: 77 78 79 7a 20 57 48 45 52 45 20 61 3c 35 20 4f  wxyz WHERE a<5 O
1100: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
1110: 31 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1;.**           
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1140: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1170: 4c 69 6d 69 74 57 68 65 72 65 20 28 70 49 6e 43  LimitWhere (pInC
1180: 6c 61 75 73 65 29 0a 2a 2f 0a 45 78 70 72 20 2a  lause).*/.Expr *
1190: 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72  sqlite3LimitWher
11a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
11b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
11c0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
11d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
11e0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
11f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
1200: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
1210: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
1220: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
1230: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
1240: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1250: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
1260: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78   be null */.  Ex
1270: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1280: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1290: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12a0: 65 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20  e.  May be null 
12b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
12c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
12d0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
12e0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
12f0: 75 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ull */.  char *z
1300: 53 74 6d 74 54 79 70 65 20 20 20 20 20 20 20 20  StmtType        
1310: 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
1320: 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
1330: 2e 20 20 46 6f 72 20 65 72 72 20 6d 73 67 73 2e  .  For err msgs.
1340: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1350: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1360: 62 3b 0a 20 20 45 78 70 72 20 2a 70 4c 68 73 20  b;.  Expr *pLhs 
1370: 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
1380: 20 20 2f 2a 20 4c 48 53 20 6f 66 20 49 4e 28 53    /* LHS of IN(S
1390: 45 4c 45 43 54 2e 2e 2e 29 20 6f 70 65 72 61 74  ELECT...) operat
13a0: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 49  or */.  Expr *pI
13b0: 6e 43 6c 61 75 73 65 20 3d 20 4e 55 4c 4c 3b 20  nClause = NULL; 
13c0: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 72 6f       /* WHERE ro
13d0: 77 69 64 20 49 4e 20 28 20 73 65 6c 65 63 74 20  wid IN ( select 
13e0: 29 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  ) */.  ExprList 
13f0: 2a 70 45 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 20  *pEList = NULL; 
1400: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1410: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 6e 69 6e 67  n list contaning
1420: 20 6f 6e 6c 79 20 70 53 65 6c 65 63 74 52 6f 77   only pSelectRow
1430: 69 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  id */.  SrcList 
1440: 2a 70 53 65 6c 65 63 74 53 72 63 20 3d 20 4e 55  *pSelectSrc = NU
1450: 4c 4c 3b 20 20 2f 2a 20 53 45 4c 45 43 54 20 72  LL;  /* SELECT r
1460: 6f 77 69 64 20 46 52 4f 4d 20 78 20 2e 2e 2e 20  owid FROM x ... 
1470: 28 64 75 70 20 6f 66 20 70 53 72 63 29 20 2a 2f  (dup of pSrc) */
1480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
1490: 63 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ct = NULL;      
14a0: 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53 45 4c 45  /* Complete SELE
14b0: 43 54 20 74 72 65 65 20 2a 2f 0a 20 20 54 61 62  CT tree */.  Tab
14c0: 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  le *pTab;..  /* 
14d0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  Check that there
14e0: 20 69 73 6e 27 74 20 61 6e 20 4f 52 44 45 52 20   isn't an ORDER 
14f0: 42 59 20 77 69 74 68 6f 75 74 20 61 20 4c 49 4d  BY without a LIM
1500: 49 54 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  IT clause..  */.
1510: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
1520: 26 20 70 4c 69 6d 69 74 3d 3d 30 20 29 20 7b 0a  & pLimit==0 ) {.
1530: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1540: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 4f 52 44  Msg(pParse, "ORD
1550: 45 52 20 42 59 20 77 69 74 68 6f 75 74 20 4c 49  ER BY without LI
1560: 4d 49 54 20 6f 6e 20 25 73 22 2c 20 7a 53 74 6d  MIT on %s", zStm
1570: 74 54 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69  tType);.    sqli
1580: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
1590: 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
15a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
15b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
15c0: 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
15d0: 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  y);.    return 0
15e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 6f  ;.  }..  /* We o
15f0: 6e 6c 79 20 6e 65 65 64 20 74 6f 20 67 65 6e 65  nly need to gene
1600: 72 61 74 65 20 61 20 73 65 6c 65 63 74 20 65 78  rate a select ex
1610: 70 72 65 73 73 69 6f 6e 20 69 66 20 74 68 65 72  pression if ther
1620: 65 0a 20 20 2a 2a 20 69 73 20 61 20 6c 69 6d 69  e.  ** is a limi
1630: 74 2f 6f 66 66 73 65 74 20 74 65 72 6d 20 74 6f  t/offset term to
1640: 20 65 6e 66 6f 72 63 65 2e 0a 20 20 2a 2f 0a 20   enforce..  */. 
1650: 20 69 66 28 20 70 4c 69 6d 69 74 20 3d 3d 20 30   if( pLimit == 0
1660: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
1670: 70 57 68 65 72 65 3b 0a 20 20 7d 0a 0a 20 20 2f  pWhere;.  }..  /
1680: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 65 6c  * Generate a sel
1690: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ect expression t
16a0: 72 65 65 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  ree to enforce t
16b0: 68 65 20 6c 69 6d 69 74 2f 6f 66 66 73 65 74 20  he limit/offset 
16c0: 0a 20 20 2a 2a 20 74 65 72 6d 20 66 6f 72 20 74  .  ** term for t
16d0: 68 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  he DELETE or UPD
16e0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
16f0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  For example:.  *
1700: 2a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  *   DELETE FROM 
1710: 74 61 62 6c 65 5f 61 20 57 48 45 52 45 20 63 6f  table_a WHERE co
1720: 6c 31 3d 31 20 4f 52 44 45 52 20 42 59 20 63 6f  l1=1 ORDER BY co
1730: 6c 32 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45  l2 LIMIT 1 OFFSE
1740: 54 20 31 0a 20 20 2a 2a 20 62 65 63 6f 6d 65 73  T 1.  ** becomes
1750: 3a 0a 20 20 2a 2a 20 20 20 44 45 4c 45 54 45 20  :.  **   DELETE 
1760: 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45  FROM table_a WHE
1770: 52 45 20 72 6f 77 69 64 20 49 4e 20 28 20 0a 20  RE rowid IN ( . 
1780: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 72   **     SELECT r
1790: 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 5f  owid FROM table_
17a0: 61 20 57 48 45 52 45 20 63 6f 6c 31 3d 31 20 4f  a WHERE col1=1 O
17b0: 52 44 45 52 20 42 59 20 63 6f 6c 32 20 4c 49 4d  RDER BY col2 LIM
17c0: 49 54 20 31 20 4f 46 46 53 45 54 20 31 0a 20 20  IT 1 OFFSET 1.  
17d0: 2a 2a 20 20 20 29 3b 0a 20 20 2a 2f 0a 0a 20 20  **   );.  */..  
17e0: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
17f0: 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 48 61  ].pTab;.  if( Ha
1800: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
1810: 20 20 20 20 70 4c 68 73 20 3d 20 73 71 6c 69 74      pLhs = sqlit
1820: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1830: 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  TK_ROW, 0, 0);. 
1840: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
1850: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1860: 64 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  d(.        pPars
1870: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 50 45 78  e, 0, sqlite3PEx
1880: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 4f  pr(pParse, TK_RO
1890: 57 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 3b 0a  W, 0, 0).    );.
18a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
18b0: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
18c0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18d0: 28 70 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  (pTab);.    if( 
18e0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  pPk->nKeyCol==1 
18f0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1900: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1910: 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43  b->aCol[pPk->aiC
1920: 6f 6c 75 6d 6e 5b 30 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[0]].zName;
1930: 0a 20 20 20 20 20 20 70 4c 68 73 20 3d 20 73 71  .      pLhs = sq
1940: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1950: 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
1960: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
1970: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1980: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
1990: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
19a0: 49 44 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ID, zName));.   
19b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
19c0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
19d0: 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; i<pPk->nKeyC
19e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
19f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1a00: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1a10: 44 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50  D, pTab->aCol[pP
1a20: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  k->aiColumn[i]].
1a30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1a40: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
1a50: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1a60: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
1a70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a80: 20 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 50   pLhs = sqlite3P
1a90: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1aa0: 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a 20  VECTOR, 0, 0);. 
1ab0: 20 20 20 20 20 69 66 28 20 70 4c 68 73 20 29 7b       if( pLhs ){
1ac0: 0a 20 20 20 20 20 20 20 20 70 4c 68 73 2d 3e 78  .        pLhs->x
1ad0: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
1ae0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1af0: 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  pEList, 0);.    
1b00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1b10: 20 2f 2a 20 64 75 70 6c 69 63 61 74 65 20 74 68   /* duplicate th
1b20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 73  e FROM clause as
1b30: 20 69 74 20 69 73 20 6e 65 65 64 65 64 20 62 79   it is needed by
1b40: 20 62 6f 74 68 20 74 68 65 20 44 45 4c 45 54 45   both the DELETE
1b50: 2f 55 50 44 41 54 45 20 74 72 65 65 0a 20 20 2a  /UPDATE tree.  *
1b60: 2a 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54  * and the SELECT
1b70: 20 73 75 62 74 72 65 65 2e 20 2a 2f 0a 20 20 70   subtree. */.  p
1b80: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d  Src->a[0].pTab =
1b90: 20 30 3b 0a 20 20 70 53 65 6c 65 63 74 53 72 63   0;.  pSelectSrc
1ba0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1bb0: 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1bc0: 20 70 53 72 63 2c 20 30 29 3b 0a 20 20 70 53 72   pSrc, 0);.  pSr
1bd0: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  c->a[0].pTab = p
1be0: 54 61 62 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 30  Tab;.  pSrc->a[0
1bf0: 5d 2e 70 49 42 49 6e 64 65 78 20 3d 20 30 3b 0a  ].pIBIndex = 0;.
1c00: 0a 20 20 2f 2a 20 67 65 6e 65 72 61 74 65 20 74  .  /* generate t
1c10: 68 65 20 53 45 4c 45 43 54 20 65 78 70 72 65 73  he SELECT expres
1c20: 73 69 6f 6e 20 74 72 65 65 2e 20 2a 2f 0a 20 20  sion tree. */.  
1c30: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1c40: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
1c50: 65 2c 20 70 45 4c 69 73 74 2c 20 70 53 65 6c 65  e, pEList, pSele
1c60: 63 74 53 72 63 2c 20 70 57 68 65 72 65 2c 20 30  ctSrc, pWhere, 0
1c70: 20 2c 30 2c 20 0a 20 20 20 20 20 20 70 4f 72 64   ,0, .      pOrd
1c80: 65 72 42 79 2c 30 2c 70 4c 69 6d 69 74 0a 20 20  erBy,0,pLimit.  
1c90: 29 3b 0a 0a 20 20 2f 2a 20 6e 6f 77 20 67 65 6e  );..  /* now gen
1ca0: 65 72 61 74 65 20 74 68 65 20 6e 65 77 20 57 48  erate the new WH
1cb0: 45 52 45 20 72 6f 77 69 64 20 49 4e 20 63 6c 61  ERE rowid IN cla
1cc0: 75 73 65 20 66 6f 72 20 74 68 65 20 44 45 4c 45  use for the DELE
1cd0: 54 45 2f 55 44 50 41 54 45 20 2a 2f 0a 20 20 70  TE/UDPATE */.  p
1ce0: 49 6e 43 6c 61 75 73 65 20 3d 20 73 71 6c 69 74  InClause = sqlit
1cf0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1d00: 54 4b 5f 49 4e 2c 20 70 4c 68 73 2c 20 30 29 3b  TK_IN, pLhs, 0);
1d10: 0a 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41  .  sqlite3PExprA
1d20: 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ddSelect(pParse,
1d30: 20 70 49 6e 43 6c 61 75 73 65 2c 20 70 53 65 6c   pInClause, pSel
1d40: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ect);.  return p
1d50: 49 6e 43 6c 61 75 73 65 3b 0a 7d 0a 23 65 6e 64  InClause;.}.#end
1d60: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1d70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
1d80: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
1d90: 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 20 20   */.       /*   
1da0: 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
1db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1dc0: 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  ERY) */../*.** G
1dd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1de0: 20 61 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73   a DELETE FROM s
1df0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1e00: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1e10: 74 61 62 6c 65 5f 77 78 79 7a 20 57 48 45 52 45  table_wxyz WHERE
1e20: 20 61 3c 35 20 41 4e 44 20 62 20 4e 4f 54 20 4e   a<5 AND b NOT N
1e30: 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ULL;.**         
1e40: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1e50: 5f 2f 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  _/       \______
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 70 54 61 62 4c 69 73 74 20 20 20 20 20 20 20 20  pTabList        
1e90: 20 20 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a        pWhere.*/.
1ea0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
1eb0: 74 65 46 72 6f 6d 28 0a 20 20 50 61 72 73 65 20  teFrom(.  Parse 
1ec0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1ed0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1ee0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1ef0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1f00: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1f10: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 73 68  from which we sh
1f20: 6f 75 6c 64 20 64 65 6c 65 74 65 20 74 68 69 6e  ould delete thin
1f30: 67 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  gs */.  Expr *pW
1f40: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 2f  here,          /
1f50: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1f60: 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c  se.  May be null
1f70: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1f80: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
1f90: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1fa0: 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a   May be null */.
1fb0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20    Expr *pLimit  
1fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49           /* LIMI
1fd0: 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20 62 65  T clause. May be
1fe0: 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 56 64   null */.){.  Vd
1ff0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2000: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2010: 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
2020: 69 6e 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ine */.  Table *
2030: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
2040: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f  /* The table fro
2050: 6d 20 77 68 69 63 68 20 72 65 63 6f 72 64 73 20  m which records 
2060: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
2070: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2090: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
20b0: 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo;     /* Infor
20c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
20d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
20e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2100: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e   looping over in
2110: 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2120: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  le */.  int iTab
2130: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Cur;           /
2140: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2150: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
2160: 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 20  .  int iDataCur 
2170: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 56 44 42  = 0;      /* VDB
2180: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
2190: 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20   canonical data 
21a0: 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20  source */.  int 
21b0: 69 49 64 78 43 75 72 20 3d 20 30 3b 20 20 20 20  iIdxCur = 0;    
21c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
21d0: 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
21e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
21f0: 6e 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  nIdx;           
2200: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2210: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 73 71 6c  indices */.  sql
2220: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2230: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
2240: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
2250: 2f 0a 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20  /.  AuthContext 
2260: 73 43 6f 6e 74 65 78 74 3b 20 20 2f 2a 20 41 75  sContext;  /* Au
2270: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e 74  thorization cont
2280: 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ext */.  NameCon
2290: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
22a0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
22b0: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
22c0: 73 73 69 6f 6e 73 20 69 6e 20 2a 2f 0a 20 20 69  ssions in */.  i
22d0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
22e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
22f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
2300: 74 20 6d 65 6d 43 6e 74 20 3d 20 30 3b 20 20 20  t memCnt = 0;   
2310: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
2320: 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 63 68 61  ell used for cha
2330: 6e 67 65 20 63 6f 75 6e 74 69 6e 67 20 2a 2f 0a  nge counting */.
2340: 20 20 69 6e 74 20 72 63 61 75 74 68 3b 20 20 20    int rcauth;   
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
2360: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 75  e returned by au
2370: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
2380: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  back */.  int eO
2390: 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20 20 20  nePass;         
23a0: 20 2f 2a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20   /* ONEPASS_OFF 
23b0: 6f 72 20 5f 53 49 4e 47 4c 45 20 6f 72 20 5f 4d  or _SINGLE or _M
23c0: 55 4c 54 49 20 2a 2f 0a 20 20 69 6e 74 20 61 69  ULTI */.  int ai
23d0: 43 75 72 4f 6e 65 50 61 73 73 5b 32 5d 3b 20 20  CurOnePass[2];  
23e0: 20 2f 2a 20 54 68 65 20 77 72 69 74 65 20 63 75   /* The write cu
23f0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  rsors opened by 
2400: 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 20 2a 2f  WHERE_ONEPASS */
2410: 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 20 3d  .  u8 *aToOpen =
2420: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 70 65   0;       /* Ope
2430: 6e 20 63 75 72 73 6f 72 20 69 54 61 62 43 75 72  n cursor iTabCur
2440: 2b 6a 20 69 66 20 61 54 6f 4f 70 65 6e 5b 6a 5d  +j if aToOpen[j]
2450: 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 49 6e   is true */.  In
2460: 64 65 78 20 2a 70 50 6b 3b 20 20 20 20 20 20 20  dex *pPk;       
2470: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 52 49 4d       /* The PRIM
2480: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 6e  ARY KEY index on
2490: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
24a0: 69 6e 74 20 69 50 6b 20 3d 20 30 3b 20 20 20 20  int iPk = 0;    
24b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
24c0: 6f 66 20 6e 50 6b 20 72 65 67 69 73 74 65 72 73  of nPk registers
24d0: 20 68 6f 6c 64 69 6e 67 20 50 52 49 4d 41 52 59   holding PRIMARY
24e0: 20 4b 45 59 20 76 61 6c 75 65 20 2a 2f 0a 20 20   KEY value */.  
24f0: 69 31 36 20 6e 50 6b 20 3d 20 31 3b 20 20 20 20  i16 nPk = 1;    
2500: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2510: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2520: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  he PRIMARY KEY *
2530: 2f 0a 20 20 69 6e 74 20 69 4b 65 79 3b 20 20 20  /.  int iKey;   
2540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
2550: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 69 6e  mory cell holdin
2560: 67 20 6b 65 79 20 6f 66 20 72 6f 77 20 74 6f 20  g key of row to 
2570: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2580: 69 31 36 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  i16 nKey;       
2590: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25a0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
25b0: 20 69 6e 20 74 68 65 20 72 6f 77 20 6b 65 79 20   in the row key 
25c0: 2a 2f 0a 20 20 69 6e 74 20 69 45 70 68 43 75 72  */.  int iEphCur
25d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 45   = 0;       /* E
25e0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 68  phemeral table h
25f0: 6f 6c 64 69 6e 67 20 61 6c 6c 20 70 72 69 6d 61  olding all prima
2600: 72 79 20 6b 65 79 20 76 61 6c 75 65 73 20 2a 2f  ry key values */
2610: 0a 20 20 69 6e 74 20 69 52 6f 77 53 65 74 20 3d  .  int iRowSet =
2620: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67   0;       /* Reg
2630: 69 73 74 65 72 20 66 6f 72 20 72 6f 77 73 65 74  ister for rowset
2640: 20 6f 66 20 72 6f 77 73 20 74 6f 20 64 65 6c 65   of rows to dele
2650: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
2660: 42 79 70 61 73 73 20 3d 20 30 3b 20 20 20 20 2f  Bypass = 0;    /
2670: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
2680: 70 20 6f 76 65 72 20 74 68 65 20 64 65 6c 65 74  p over the delet
2690: 65 20 6c 6f 67 69 63 20 2a 2f 0a 20 20 69 6e 74  e logic */.  int
26a0: 20 61 64 64 72 4c 6f 6f 70 20 3d 20 30 3b 20 20   addrLoop = 0;  
26b0: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
26c0: 65 20 64 65 6c 65 74 65 20 6c 6f 6f 70 20 2a 2f  e delete loop */
26d0: 0a 20 20 69 6e 74 20 61 64 64 72 45 70 68 4f 70  .  int addrEphOp
26e0: 65 6e 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 73  en = 0;   /* Ins
26f0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 6f 70 65 6e  truction to open
2700: 20 74 68 65 20 45 70 68 65 6d 65 72 61 6c 20 74   the Ephemeral t
2710: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 43  able */.  int bC
2720: 6f 6d 70 6c 65 78 3b 20 20 20 20 20 20 20 20 20  omplex;         
2730: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
2740: 65 20 61 72 65 20 74 72 69 67 67 65 72 73 20 6f  e are triggers o
2750: 72 20 46 4b 73 20 6f 72 0a 20 20 20 20 20 20 20  r FKs or.       
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20    ** subqueries 
2780: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2790: 75 73 65 20 2a 2f 0a 20 0a 23 69 66 6e 64 65 66  use */. .#ifndef
27a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
27b0: 47 47 45 52 0a 20 20 69 6e 74 20 69 73 56 69 65  GGER.  int isVie
27c0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
27d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
27e0: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 6c  ttempting to del
27f0: 65 74 65 20 66 72 6f 6d 20 61 20 76 69 65 77 20  ete from a view 
2800: 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  */.  Trigger *pT
2810: 72 69 67 67 65 72 3b 20 20 20 20 20 20 20 20 20  rigger;         
2820: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2830: 6c 65 20 74 72 69 67 67 65 72 73 2c 20 69 66 20  le triggers, if 
2840: 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 65 6e 64  required */.#end
2850: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 43  if..  memset(&sC
2860: 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
2870: 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  f(sContext));.  
2880: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2890: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28a0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
28b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
28c0: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
28d0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61  cleanup;.  }.  a
28e0: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
28f0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 0a 20 20  >nSrc==1 );...  
2900: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
2910: 62 6c 65 20 77 68 69 63 68 20 77 65 20 77 61 6e  ble which we wan
2920: 74 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 54 68  t to delete.  Th
2930: 69 73 20 74 61 62 6c 65 20 68 61 73 20 74 6f 20  is table has to 
2940: 62 65 0a 20 20 2a 2a 20 70 75 74 20 69 6e 20 61  be.  ** put in a
2950: 6e 20 53 72 63 4c 69 73 74 20 73 74 72 75 63 74  n SrcList struct
2960: 75 72 65 20 62 65 63 61 75 73 65 20 73 6f 6d 65  ure because some
2970: 20 6f 66 20 74 68 65 20 73 75 62 72 6f 75 74 69   of the subrouti
2980: 6e 65 73 20 77 65 0a 20 20 2a 2a 20 77 69 6c 6c  nes we.  ** will
2990: 20 62 65 20 63 61 6c 6c 69 6e 67 20 61 72 65 20   be calling are 
29a0: 64 65 73 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b  designed to work
29b0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 74   with multiple t
29c0: 61 62 6c 65 73 20 61 6e 64 20 65 78 70 65 63 74  ables and expect
29d0: 0a 20 20 2a 2a 20 61 6e 20 53 72 63 4c 69 73 74  .  ** an SrcList
29e0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 73 74  * parameter inst
29f0: 65 61 64 20 6f 66 20 6a 75 73 74 20 61 20 54 61  ead of just a Ta
2a00: 62 6c 65 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a  ble* parameter..
2a10: 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71    */.  pTab = sq
2a20: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
2a30: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  up(pParse, pTabL
2a40: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ist);.  if( pTab
2a50: 3d 3d 30 20 29 20 20 67 6f 74 6f 20 64 65 6c 65  ==0 )  goto dele
2a60: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
2a70: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2a80: 74 20 69 66 20 77 65 20 68 61 76 65 20 61 6e 79  t if we have any
2a90: 20 74 72 69 67 67 65 72 73 20 61 6e 64 20 69 66   triggers and if
2aa0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2ab0: 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 66 72  .  ** deleted fr
2ac0: 6f 6d 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a  om is a view.  *
2ad0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2ae0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
2af0: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
2b00: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
2b10: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b  pParse, pTab, TK
2b20: 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a  _DELETE, 0, 0);.
2b30: 20 20 69 73 56 69 65 77 20 3d 20 70 54 61 62 2d    isView = pTab-
2b40: 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 23 65 6c  >pSelect!=0;.#el
2b50: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 54 72 69  se.# define pTri
2b60: 67 67 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  gger 0.# define 
2b70: 69 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a  isView 0.#endif.
2b80: 20 20 62 43 6f 6d 70 6c 65 78 20 3d 20 70 54 72    bComplex = pTr
2b90: 69 67 67 65 72 20 7c 7c 20 73 71 6c 69 74 65 33  igger || sqlite3
2ba0: 46 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73  FkRequired(pPars
2bb0: 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 29 3b 0a  e, pTab, 0, 0);.
2bc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2bd0: 49 54 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20  IT_VIEW.# undef 
2be0: 69 73 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20  isView.# define 
2bf0: 69 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a  isView 0.#endif.
2c00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c10: 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c  NABLE_UPDATE_DEL
2c20: 45 54 45 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20  ETE_LIMIT.  if( 
2c30: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 70  !isView ){.    p
2c40: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4c  Where = sqlite3L
2c50: 69 6d 69 74 57 68 65 72 65 28 0a 20 20 20 20 20  imitWhere(.     
2c60: 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
2c70: 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72  ist, pWhere, pOr
2c80: 64 65 72 42 79 2c 20 70 4c 69 6d 69 74 2c 20 22  derBy, pLimit, "
2c90: 44 45 4c 45 54 45 22 0a 20 20 20 20 29 3b 0a 20  DELETE".    );. 
2ca0: 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
2cb0: 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 30 3b  .    pLimit = 0;
2cc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2cd0: 2a 20 49 66 20 70 54 61 62 20 69 73 20 72 65 61  * If pTab is rea
2ce0: 6c 6c 79 20 61 20 76 69 65 77 2c 20 6d 61 6b 65  lly a view, make
2cf0: 20 73 75 72 65 20 69 74 20 68 61 73 20 62 65 65   sure it has bee
2d00: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  n initialized.. 
2d10: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2d20: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
2d30: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
2d40: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65  ) ){.    goto de
2d50: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
2d60: 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71  p;.  }..  if( sq
2d70: 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c 79 28  lite3IsReadOnly(
2d80: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 28 70  pParse, pTab, (p
2d90: 54 72 69 67 67 65 72 3f 31 3a 30 29 29 20 29 7b  Trigger?1:0)) ){
2da0: 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  .    goto delete
2db0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
2dc0: 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
2dd0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2de0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2df0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
2e00: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72  b<db->nDb );.  r
2e10: 63 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41  cauth = sqlite3A
2e20: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2e30: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
2e40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
2e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
2e70: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
2e80: 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  me);.  assert( r
2e90: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b  cauth==SQLITE_OK
2ea0: 20 7c 7c 20 72 63 61 75 74 68 3d 3d 53 51 4c 49   || rcauth==SQLI
2eb0: 54 45 5f 44 45 4e 59 20 7c 7c 20 72 63 61 75 74  TE_DENY || rcaut
2ec0: 68 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  h==SQLITE_IGNORE
2ed0: 20 29 3b 0a 20 20 69 66 28 20 72 63 61 75 74 68   );.  if( rcauth
2ee0: 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b  ==SQLITE_DENY ){
2ef0: 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  .    goto delete
2f00: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
2f10: 20 7d 0a 20 20 61 73 73 65 72 74 28 21 69 73 56   }.  assert(!isV
2f20: 69 65 77 20 7c 7c 20 70 54 72 69 67 67 65 72 29  iew || pTrigger)
2f30: 3b 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 63  ;..  /* Assign c
2f40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
2f50: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 61   the table and a
2f60: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 0a  ll its indices..
2f70: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2f80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2f90: 20 29 3b 0a 20 20 69 54 61 62 43 75 72 20 3d 20   );.  iTabCur = 
2fa0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
2fb0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
2fc0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f 72 28 6e  >nTab++;.  for(n
2fd0: 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Idx=0, pIdx=pTab
2fe0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2ff0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
3000: 2c 20 6e 49 64 78 2b 2b 29 7b 0a 20 20 20 20 70  , nIdx++){.    p
3010: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
3020: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 74   }..  /* Start t
3030: 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78 74 0a  he view context.
3040: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
3050: 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
3060: 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28  AuthContextPush(
3070: 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78  pParse, &sContex
3080: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
3090: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
30a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
30b0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
30c0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
30d0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
30e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  ){.    goto dele
30f0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
3100: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
3110: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20 73  e->nested==0 ) s
3120: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
3130: 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71 6c  hanges(v);.  sql
3140: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
3150: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
3160: 62 43 6f 6d 70 6c 65 78 2c 20 69 44 62 29 3b 0a  bComplex, iDb);.
3170: 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
3180: 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  trying to delete
3190: 20 66 72 6f 6d 20 61 20 76 69 65 77 2c 20 72 65   from a view, re
31a0: 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77 20  alize that view 
31b0: 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20 65 70 68  into.  ** an eph
31c0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
31d0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
31e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
31f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
3200: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
3210: 52 29 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  R).  if( isView 
3220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
3230: 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70 50  terializeView(pP
3240: 61 72 73 65 2c 20 70 54 61 62 2c 20 0a 20 20 20  arse, pTab, .   
3250: 20 20 20 20 20 70 57 68 65 72 65 2c 20 70 4f 72       pWhere, pOr
3260: 64 65 72 42 79 2c 20 70 4c 69 6d 69 74 2c 20 69  derBy, pLimit, i
3270: 54 61 62 43 75 72 0a 20 20 20 20 29 3b 0a 20 20  TabCur.    );.  
3280: 20 20 69 44 61 74 61 43 75 72 20 3d 20 69 49 64    iDataCur = iId
3290: 78 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b 0a  xCur = iTabCur;.
32a0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
32b0: 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 30  ;.    pLimit = 0
32c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
32d0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  /* Resolve the c
32e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 74  olumn names in t
32f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
3300: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
3310: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
3320: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72  NC));.  sNC.pPar
3330: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
3340: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
3350: 61 62 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  abList;.  if( sq
3360: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
3370: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68 65  Names(&sNC, pWhe
3380: 72 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  re) ){.    goto 
3390: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
33a0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  nup;.  }..  /* I
33b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
33c0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
33d0: 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 65  ber of rows dele
33e0: 74 65 64 2c 20 69 66 0a 20 20 2a 2a 20 77 65 20  ted, if.  ** we 
33f0: 61 72 65 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77  are counting row
3400: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64  s..  */.  if( (d
3410: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
3420: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 0a  E_CountRows)!=0.
3430: 20 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e     && !pParse->n
3440: 65 73 74 65 64 0a 20 20 20 26 26 20 21 70 50 61  ested.   && !pPa
3450: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
3460: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 43 6e 74  .  ){.    memCnt
3470: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
3480: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
3490: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
34a0: 6e 74 65 67 65 72 2c 20 30 2c 20 6d 65 6d 43 6e  nteger, 0, memCn
34b0: 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
34c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 55   SQLITE_OMIT_TRU
34d0: 4e 43 41 54 45 5f 4f 50 54 49 4d 49 5a 41 54 49  NCATE_OPTIMIZATI
34e0: 4f 4e 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ON.  /* Special 
34f0: 63 61 73 65 3a 20 41 20 44 45 4c 45 54 45 20 77  case: A DELETE w
3500: 69 74 68 6f 75 74 20 61 20 57 48 45 52 45 20 63  ithout a WHERE c
3510: 6c 61 75 73 65 20 64 65 6c 65 74 65 73 20 65 76  lause deletes ev
3520: 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 49  erything..  ** I
3530: 74 20 69 73 20 65 61 73 69 65 72 20 6a 75 73 74  t is easier just
3540: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 77 68   to erase the wh
3550: 6f 6c 65 20 74 61 62 6c 65 2e 20 50 72 69 6f 72  ole table. Prior
3560: 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   to version 3.6.
3570: 35 2c 0a 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  5,.  ** this opt
3580: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 75 73 65 64  imization caused
3590: 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20   the row change 
35a0: 63 6f 75 6e 74 20 28 74 68 65 20 76 61 6c 75 65  count (the value
35b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a 20 20   returned by .  
35c0: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  ** API function 
35d0: 73 71 6c 69 74 65 33 5f 63 6f 75 6e 74 5f 63 68  sqlite3_count_ch
35e0: 61 6e 67 65 73 29 20 74 6f 20 62 65 20 73 65 74  anges) to be set
35f0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20   incorrectly..  
3600: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 72 63 61  **.  ** The "rca
3610: 75 74 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b 22 20  uth==SQLITE_OK" 
3620: 74 65 72 6d 73 20 69 73 20 74 68 65 0a 20 20 2a  terms is the.  *
3630: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
3640: 2d 4f 46 3a 20 52 2d 31 37 32 32 38 2d 33 37 31  -OF: R-17228-371
3650: 32 34 20 49 66 20 74 68 65 20 61 63 74 69 6f 6e  24 If the action
3660: 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
3670: 44 45 4c 45 54 45 20 61 6e 64 0a 20 20 2a 2a 20  DELETE and.  ** 
3680: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  the callback ret
3690: 75 72 6e 73 20 53 51 4c 49 54 45 5f 49 47 4e 4f  urns SQLITE_IGNO
36a0: 52 45 20 74 68 65 6e 20 74 68 65 20 44 45 4c 45  RE then the DELE
36b0: 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 70 72 6f  TE operation pro
36c0: 63 65 65 64 73 20 62 75 74 0a 20 20 2a 2a 20 74  ceeds but.  ** t
36d0: 68 65 20 74 72 75 6e 63 61 74 65 20 6f 70 74 69  he truncate opti
36e0: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61  mization is disa
36f0: 62 6c 65 64 20 61 6e 64 20 61 6c 6c 20 72 6f 77  bled and all row
3700: 73 20 61 72 65 20 64 65 6c 65 74 65 64 0a 20 20  s are deleted.  
3710: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 2e  ** individually.
3720: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 61 75  .  */.  if( rcau
3730: 74 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  th==SQLITE_OK.  
3740: 20 26 26 20 70 57 68 65 72 65 3d 3d 30 0a 20 20   && pWhere==0.  
3750: 20 26 26 20 21 62 43 6f 6d 70 6c 65 78 0a 20 20   && !bComplex.  
3760: 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
3770: 54 61 62 29 0a 23 69 66 64 65 66 20 53 51 4c 49  Tab).#ifdef SQLI
3780: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
3790: 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 26 26 20 64  ATE_HOOK.   && d
37a0: 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
37b0: 6c 62 61 63 6b 3d 3d 30 0a 23 65 6e 64 69 66 0a  lback==0.#endif.
37c0: 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
37d0: 20 21 69 73 56 69 65 77 20 29 3b 0a 20 20 20 20   !isView );.    
37e0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
37f0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
3800: 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
3810: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
3820: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
3830: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
3840: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
3850: 4f 50 5f 43 6c 65 61 72 2c 20 70 54 61 62 2d 3e  OP_Clear, pTab->
3860: 74 6e 75 6d 2c 20 69 44 62 2c 20 6d 65 6d 43 6e  tnum, iDb, memCn
3870: 74 20 3f 20 6d 65 6d 43 6e 74 20 3a 20 2d 31 2c  t ? memCnt : -1,
3880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3890: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
38a0: 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29  Name, P4_STATIC)
38b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
38c0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
38d0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
38e0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
38f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
3900: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
3910: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
3920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3930: 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 70  2(v, OP_Clear, p
3940: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
3950: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
3960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3970: 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45 5f 4f 50  OMIT_TRUNCATE_OP
3980: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 20 20  TIMIZATION */.  
3990: 7b 0a 20 20 20 20 75 31 36 20 77 63 66 20 3d 20  {.    u16 wcf = 
39a0: 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
39b0: 53 49 52 45 44 7c 57 48 45 52 45 5f 44 55 50 4c  SIRED|WHERE_DUPL
39c0: 49 43 41 54 45 53 5f 4f 4b 7c 57 48 45 52 45 5f  ICATES_OK|WHERE_
39d0: 53 45 45 4b 5f 54 41 42 4c 45 3b 0a 20 20 20 20  SEEK_TABLE;.    
39e0: 69 66 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  if( sNC.ncFlags 
39f0: 26 20 4e 43 5f 56 61 72 53 65 6c 65 63 74 20 29  & NC_VarSelect )
3a00: 20 62 43 6f 6d 70 6c 65 78 20 3d 20 31 3b 0a 20   bComplex = 1;. 
3a10: 20 20 20 77 63 66 20 7c 3d 20 28 62 43 6f 6d 70     wcf |= (bComp
3a20: 6c 65 78 20 3f 20 30 20 3a 20 57 48 45 52 45 5f  lex ? 0 : WHERE_
3a30: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
3a40: 29 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f  );.    if( HasRo
3a50: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
3a60: 20 20 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69     /* For a rowi
3a70: 64 20 74 61 62 6c 65 2c 20 69 6e 69 74 69 61 6c  d table, initial
3a80: 69 7a 65 20 74 68 65 20 52 6f 77 53 65 74 20 74  ize the RowSet t
3a90: 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74 20 2a  o an empty set *
3aa0: 2f 0a 20 20 20 20 20 20 70 50 6b 20 3d 20 30 3b  /.      pPk = 0;
3ab0: 0a 20 20 20 20 20 20 6e 50 6b 20 3d 20 31 3b 0a  .      nPk = 1;.
3ac0: 20 20 20 20 20 20 69 52 6f 77 53 65 74 20 3d 20        iRowSet = 
3ad0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
3ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3af0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
3b00: 6c 6c 2c 20 30 2c 20 69 52 6f 77 53 65 74 29 3b  ll, 0, iRowSet);
3b10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b20: 20 20 2f 2a 20 46 6f 72 20 61 20 57 49 54 48 4f    /* For a WITHO
3b30: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
3b40: 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
3b50: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 74  ral table used t
3b60: 6f 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 20  o.      ** hold 
3b70: 61 6c 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 73  all primary keys
3b80: 20 66 6f 72 20 72 6f 77 73 20 74 6f 20 62 65 20   for rows to be 
3b90: 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20  deleted. */.    
3ba0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
3bb0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
3bc0: 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Tab);.      asse
3bd0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
3be0: 20 20 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e      nPk = pPk->n
3bf0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 69 50  KeyCol;.      iP
3c00: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  k = pParse->nMem
3c10: 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
3c20: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 6b 3b 0a 20  ->nMem += nPk;. 
3c30: 20 20 20 20 20 69 45 70 68 43 75 72 20 3d 20 70       iEphCur = p
3c40: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
3c50: 20 20 20 20 20 61 64 64 72 45 70 68 4f 70 65 6e       addrEphOpen
3c60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3c70: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
3c80: 70 68 65 6d 65 72 61 6c 2c 20 69 45 70 68 43 75  phemeral, iEphCu
3c90: 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 73  r, nPk);.      s
3ca0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
3cb0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
3cc0: 50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pk);.    }.  .  
3cd0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
3ce0: 20 71 75 65 72 79 20 74 6f 20 66 69 6e 64 20 74   query to find t
3cf0: 68 65 20 72 6f 77 69 64 20 6f 72 20 70 72 69 6d  he rowid or prim
3d00: 61 72 79 20 6b 65 79 20 66 6f 72 20 65 76 65 72  ary key for ever
3d10: 79 20 72 6f 77 0a 20 20 20 20 2a 2a 20 74 6f 20  y row.    ** to 
3d20: 62 65 20 64 65 6c 65 74 65 64 2c 20 62 61 73 65  be deleted, base
3d30: 64 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  d on the WHERE c
3d40: 6c 61 75 73 65 2e 20 53 65 74 20 76 61 72 69 61  lause. Set varia
3d50: 62 6c 65 20 65 4f 6e 65 50 61 73 73 0a 20 20 20  ble eOnePass.   
3d60: 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
3d70: 74 68 65 20 73 74 72 61 74 65 67 79 20 75 73 65  the strategy use
3d80: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
3d90: 68 69 73 20 64 65 6c 65 74 65 3a 0a 20 20 20 20  his delete:.    
3da0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 4f 4e 45 50 41  **.    **  ONEPA
3db0: 53 53 5f 4f 46 46 3a 20 20 20 20 54 77 6f 2d 70  SS_OFF:    Two-p
3dc0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 2d 20 75  ass approach - u
3dd0: 73 65 20 61 20 46 49 46 4f 20 66 6f 72 20 72 6f  se a FIFO for ro
3de0: 77 69 64 73 2f 50 4b 20 76 61 6c 75 65 73 2e 0a  wids/PK values..
3df0: 20 20 20 20 2a 2a 20 20 4f 4e 45 50 41 53 53 5f      **  ONEPASS_
3e00: 53 49 4e 47 4c 45 3a 20 4f 6e 65 2d 70 61 73 73  SINGLE: One-pass
3e10: 20 61 70 70 72 6f 61 63 68 20 2d 20 61 74 20 6d   approach - at m
3e20: 6f 73 74 20 6f 6e 65 20 72 6f 77 20 64 65 6c 65  ost one row dele
3e30: 74 65 64 2e 0a 20 20 20 20 2a 2a 20 20 4f 4e 45  ted..    **  ONE
3e40: 50 41 53 53 5f 4d 55 4c 54 49 3a 20 20 4f 6e 65  PASS_MULTI:  One
3e50: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 2d  -pass approach -
3e60: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 72   any number of r
3e70: 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74  ows may be delet
3e80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
3e90: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
3ea0: 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
3eb0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
3ec0: 72 65 2c 20 30 2c 20 30 2c 20 77 63 66 2c 20 69  re, 0, 0, wcf, i
3ed0: 54 61 62 43 75 72 2b 31 29 3b 0a 20 20 20 20 69  TabCur+1);.    i
3ee0: 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
3ef0: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
3f00: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 65 4f 6e  cleanup;.    eOn
3f10: 65 50 61 73 73 20 3d 20 73 71 6c 69 74 65 33 57  ePass = sqlite3W
3f20: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 70 57  hereOkOnePass(pW
3f30: 49 6e 66 6f 2c 20 61 69 43 75 72 4f 6e 65 50 61  Info, aiCurOnePa
3f40: 73 73 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ss);.    assert(
3f50: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
3f60: 3d 3d 30 20 7c 7c 20 65 4f 6e 65 50 61 73 73 21  ==0 || eOnePass!
3f70: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29  =ONEPASS_MULTI )
3f80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
3f90: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
3fa0: 20 62 43 6f 6d 70 6c 65 78 20 7c 7c 20 65 4f 6e   bComplex || eOn
3fb0: 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
3fc0: 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4f  FF );.    if( eO
3fd0: 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
3fe0: 53 49 4e 47 4c 45 20 29 20 73 71 6c 69 74 65 33  SINGLE ) sqlite3
3ff0: 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73  MultiWrite(pPars
4000: 65 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4b 65  e);.  .    /* Ke
4010: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
4020: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
4030: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
4040: 20 20 20 20 69 66 28 20 6d 65 6d 43 6e 74 20 29      if( memCnt )
4050: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4060: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4070: 41 64 64 49 6d 6d 2c 20 6d 65 6d 43 6e 74 2c 20  AddImm, memCnt, 
4080: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
4090: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
40a0: 72 6f 77 69 64 20 6f 72 20 70 72 69 6d 61 72 79  rowid or primary
40b0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
40c0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  rent row */.    
40d0: 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20  if( pPk ){.     
40e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
40f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
4100: 73 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f  ssert( pPk->aiCo
4110: 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[i]>=0 );.  
4120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4130: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
4140: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
4150: 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
4190: 2c 20 69 50 6b 2b 69 29 3b 0a 20 20 20 20 20 20  , iPk+i);.      
41a0: 7d 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 69  }.      iKey = i
41b0: 50 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pk;.    }else{. 
41c0: 20 20 20 20 20 69 4b 65 79 20 3d 20 2b 2b 70 50       iKey = ++pP
41d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
41e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
41f0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
4200: 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 43  e(v, pTab, iTabC
4210: 75 72 2c 20 2d 31 2c 20 69 4b 65 79 29 3b 0a 20  ur, -1, iKey);. 
4220: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
4230: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
4240: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 2f  S_OFF ){.      /
4250: 2a 20 46 6f 72 20 4f 4e 45 50 41 53 53 2c 20 6e  * For ONEPASS, n
4260: 6f 20 6e 65 65 64 20 74 6f 20 73 74 6f 72 65 20  o need to store 
4270: 74 68 65 20 72 6f 77 69 64 2f 70 72 69 6d 61 72  the rowid/primar
4280: 79 2d 6b 65 79 2e 20 54 68 65 72 65 20 69 73 20  y-key. There is 
4290: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  only.      ** on
42a0: 65 2c 20 73 6f 20 6a 75 73 74 20 6b 65 65 70 20  e, so just keep 
42b0: 69 74 20 69 6e 20 69 74 73 20 72 65 67 69 73 74  it in its regist
42c0: 65 72 28 73 29 20 61 6e 64 20 66 61 6c 6c 20 74  er(s) and fall t
42d0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 20 20  hrough to the.  
42e0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 63 6f      ** delete co
42f0: 64 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4b  de.  */.      nK
4300: 65 79 20 3d 20 6e 50 6b 3b 20 2f 2a 20 4f 50 5f  ey = nPk; /* OP_
4310: 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61  Found will use a
4320: 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 2a  n unpacked key *
4330: 2f 0a 20 20 20 20 20 20 61 54 6f 4f 70 65 6e 20  /.      aToOpen 
4340: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4350: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 49 64 78 2b  cRawNN(db, nIdx+
4360: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 54  2);.      if( aT
4370: 6f 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  oOpen==0 ){.    
4380: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
4390: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
43a0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65       goto delete
43b0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
43c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
43d0: 73 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31 2c 20  set(aToOpen, 1, 
43e0: 6e 49 64 78 2b 31 29 3b 0a 20 20 20 20 20 20 61  nIdx+1);.      a
43f0: 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b 31 5d 20 3d  ToOpen[nIdx+1] =
4400: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69   0;.      if( ai
4410: 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d 30  CurOnePass[0]>=0
4420: 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72   ) aToOpen[aiCur
4430: 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 54 61 62 43  OnePass[0]-iTabC
4440: 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ur] = 0;.      i
4450: 66 28 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  f( aiCurOnePass[
4460: 31 5d 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e 5b  1]>=0 ) aToOpen[
4470: 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 2d  aiCurOnePass[1]-
4480: 69 54 61 62 43 75 72 5d 20 3d 20 30 3b 0a 20 20  iTabCur] = 0;.  
4490: 20 20 20 20 69 66 28 20 61 64 64 72 45 70 68 4f      if( addrEphO
44a0: 70 65 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  pen ) sqlite3Vdb
44b0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
44c0: 20 61 64 64 72 45 70 68 4f 70 65 6e 29 3b 0a 20   addrEphOpen);. 
44d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
44e0: 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20  if( pPk ){.     
44f0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 50 4b     /* Add the PK
4500: 20 6b 65 79 20 66 6f 72 20 74 68 69 73 20 72 6f   key for this ro
4510: 77 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  w to the tempora
4520: 72 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ry table */.    
4530: 20 20 20 20 69 4b 65 79 20 3d 20 2b 2b 70 50 61      iKey = ++pPa
4540: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
4550: 20 20 20 6e 4b 65 79 20 3d 20 30 3b 20 20 20 2f     nKey = 0;   /
4560: 2a 20 5a 65 72 6f 20 74 65 6c 6c 73 20 4f 50 5f  * Zero tells OP_
4570: 46 6f 75 6e 64 20 74 6f 20 75 73 65 20 61 20 63  Found to use a c
4580: 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20 2a 2f 0a  omposite key */.
4590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
45a0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
45b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 50 6b 2c  MakeRecord, iPk,
45c0: 20 6e 50 6b 2c 20 69 4b 65 79 2c 0a 20 20 20 20   nPk, iKey,.    
45d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
45e0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
45f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 6b 29  pParse->db, pPk)
4600: 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
4610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4620: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
4630: 73 65 72 74 2c 20 69 45 70 68 43 75 72 2c 20 69  sert, iEphCur, i
4640: 4b 65 79 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a  Key, iPk, nPk);.
4650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4660: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
4670: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
4680: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74   to be deleted t
4690: 6f 20 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a  o the RowSet */.
46a0: 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 31          nKey = 1
46b0: 3b 20 20 2f 2a 20 4f 50 5f 44 65 66 65 72 72 65  ;  /* OP_Deferre
46c0: 64 53 65 65 6b 20 61 6c 77 61 79 73 20 75 73 65  dSeek always use
46d0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 69 64  s a single rowid
46e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
46f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4700: 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 69   OP_RowSetAdd, i
4710: 52 6f 77 53 65 74 2c 20 69 4b 65 79 29 3b 0a 20  RowSet, iKey);. 
4720: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
4730: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 44      /* If this D
4740: 45 4c 45 54 45 20 63 61 6e 6e 6f 74 20 75 73 65  ELETE cannot use
4750: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 73 74 72   the ONEPASS str
4760: 61 74 65 67 79 2c 20 74 68 69 73 20 69 73 20 74  ategy, this is t
4770: 68 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  he .    ** end o
4780: 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
4790: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e 65   */.    if( eOne
47a0: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
47b0: 46 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 42  F ){.      addrB
47c0: 79 70 61 73 73 20 3d 20 73 71 6c 69 74 65 33 56  ypass = sqlite3V
47d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
47e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
47f0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
4800: 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  d(pWInfo);.    }
4810: 0a 20 20 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73  .  .    /* Unles
4820: 73 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  s this is a view
4830: 2c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 66  , open cursors f
4840: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  or the table we 
4850: 61 72 65 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65  are .    ** dele
4860: 74 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 61 6c  ting from and al
4870: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 20 49  l its indices. I
4880: 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  f this is a view
4890: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
48a0: 2a 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 74 68  * only effect th
48b0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
48c0: 20 69 73 20 74 6f 20 66 69 72 65 20 74 68 65 20   is to fire the 
48d0: 49 4e 53 54 45 41 44 20 4f 46 20 0a 20 20 20 20  INSTEAD OF .    
48e0: 2a 2a 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20  ** triggers..   
48f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56   */.    if( !isV
4900: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  iew ){.      int
4910: 20 69 41 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a   iAddrOnce = 0;.
4920: 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61        if( eOnePa
4930: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ss==ONEPASS_MULT
4940: 49 20 29 7b 0a 20 20 20 20 20 20 20 20 69 41 64  I ){.        iAd
4950: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
4960: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
4970: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
4980: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
4990: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
49a0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
49b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
49c0: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
49d0: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
49e0: 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  b, OP_OpenWrite,
49f0: 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
4a00: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 69 54 61 62 43 75 72 2c 20 61 54 6f      iTabCur, aTo
4a30: 4f 70 65 6e 2c 20 26 69 44 61 74 61 43 75 72 2c  Open, &iDataCur,
4a40: 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20   &iIdxCur);.    
4a50: 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 7c 7c    assert( pPk ||
4a60: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
4a70: 20 7c 7c 20 69 44 61 74 61 43 75 72 3d 3d 69 54   || iDataCur==iT
4a80: 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  abCur );.      a
4a90: 73 73 65 72 74 28 20 70 50 6b 20 7c 7c 20 49 73  ssert( pPk || Is
4aa0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
4ab0: 20 69 49 64 78 43 75 72 3d 3d 69 44 61 74 61 43   iIdxCur==iDataC
4ac0: 75 72 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ur+1 );.      if
4ad0: 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ( eOnePass==ONEP
4ae0: 41 53 53 5f 4d 55 4c 54 49 20 29 20 73 71 6c 69  ASS_MULTI ) sqli
4af0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4b00: 76 2c 20 69 41 64 64 72 4f 6e 63 65 29 3b 0a 20  v, iAddrOnce);. 
4b10: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
4b20: 65 74 20 75 70 20 61 20 6c 6f 6f 70 20 6f 76 65  et up a loop ove
4b30: 72 20 74 68 65 20 72 6f 77 69 64 73 2f 70 72 69  r the rowids/pri
4b40: 6d 61 72 79 2d 6b 65 79 73 20 74 68 61 74 20 77  mary-keys that w
4b50: 65 72 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  ere found in the
4b60: 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 2d 63 6c  .    ** where-cl
4b70: 61 75 73 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e  ause loop above.
4b80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4b90: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
4ba0: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61  S_OFF ){.      a
4bb0: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 6e 50 6b  ssert( nKey==nPk
4bc0: 20 29 3b 20 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64   );  /* OP_Found
4bd0: 20 77 69 6c 6c 20 75 73 65 20 61 6e 20 75 6e 70   will use an unp
4be0: 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a 20 20 20  acked key */.   
4bf0: 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
4c00: 6c 28 70 54 61 62 29 20 26 26 20 61 54 6f 4f 70  l(pTab) && aToOp
4c10: 65 6e 5b 69 44 61 74 61 43 75 72 2d 69 54 61 62  en[iDataCur-iTab
4c20: 43 75 72 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  Cur] ){.        
4c30: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 7c  assert( pPk!=0 |
4c40: 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21  | pTab->pSelect!
4c50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
4c60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
4c70: 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
4c80: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 61 64 64  d, iDataCur, add
4c90: 72 42 79 70 61 73 73 2c 20 69 4b 65 79 2c 20 6e  rBypass, iKey, n
4ca0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Key);.        Vd
4cb0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4cd0: 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
4ce0: 20 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71 6c    addrLoop = sql
4cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
4d00: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 45 70  , OP_Rewind, iEp
4d10: 68 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  hCur); VdbeCover
4d20: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
4d30: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
4d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
4d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4d60: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70  , OP_Column, iEp
4d70: 68 43 75 72 2c 20 30 2c 20 69 4b 65 79 29 3b 0a  hCur, 0, iKey);.
4d80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4d90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4da0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
4db0: 44 61 74 61 2c 20 69 45 70 68 43 75 72 2c 20 69  Data, iEphCur, i
4dc0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4dd0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
4de0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 50 5f 46 6f  ==0 );  /* OP_Fo
4df0: 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61 20 63  und will use a c
4e00: 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20 2a 2f 0a  omposite key */.
4e10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e20: 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71 6c 69   addrLoop = sqli
4e30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4e40: 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c 20   OP_RowSetRead, 
4e50: 69 52 6f 77 53 65 74 2c 20 30 2c 20 69 4b 65 79  iRowSet, 0, iKey
4e60: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4e70: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4e80: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 31 20  assert( nKey==1 
4e90: 29 3b 0a 20 20 20 20 7d 20 20 0a 20 20 0a 20 20  );.    }  .  .  
4ea0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4eb0: 72 6f 77 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  row */.#ifndef S
4ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4ed0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
4ee0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
4ef0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
4f00: 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
4f10: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
4f20: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
4f30: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  pTab);.      sql
4f40: 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69 74  ite3VtabMakeWrit
4f50: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
4f60: 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
4f70: 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ( eOnePass==ONEP
4f80: 41 53 53 5f 4f 46 46 20 7c 7c 20 65 4f 6e 65 50  ASS_OFF || eOneP
4f90: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
4fa0: 47 4c 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  GLE );.      sql
4fb0: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
4fc0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
4fd0: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
4fe0: 53 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20  S_SINGLE ){.    
4ff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5000: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
5010: 65 2c 20 69 54 61 62 43 75 72 29 3b 0a 20 20 20  e, iTabCur);.   
5020: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5030: 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  IsToplevel(pPars
5040: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
5050: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
5060: 72 69 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rite = 0;.      
5070: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5090: 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74  Op4(v, OP_VUpdat
50a0: 65 2c 20 30 2c 20 31 2c 20 69 4b 65 79 2c 20 70  e, 0, 1, iKey, p
50b0: 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
50d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 45 5f  eChangeP5(v, OE_
50e0: 41 62 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Abort);.    }els
50f0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
5100: 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d       int count =
5110: 20 28 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   (pParse->nested
5120: 3d 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72 75 65  ==0);    /* True
5130: 20 74 6f 20 63 6f 75 6e 74 20 63 68 61 6e 67 65   to count change
5140: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
5150: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
5160: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
5170: 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
5180: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
5190: 20 20 20 20 20 20 20 20 20 69 4b 65 79 2c 20 6e           iKey, n
51a0: 4b 65 79 2c 20 63 6f 75 6e 74 2c 20 4f 45 5f 44  Key, count, OE_D
51b0: 65 66 61 75 6c 74 2c 20 65 4f 6e 65 50 61 73 73  efault, eOnePass
51c0: 2c 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  , aiCurOnePass[1
51d0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
51e0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
51f0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 72 6f 77  oop over all row
5200: 69 64 73 2f 70 72 69 6d 61 72 79 2d 6b 65 79 73  ids/primary-keys
5210: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e  . */.    if( eOn
5220: 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
5230: 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FF ){.      sqli
5240: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5250: 62 65 6c 28 76 2c 20 61 64 64 72 42 79 70 61 73  bel(v, addrBypas
5260: 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
5270: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
5280: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5290: 20 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 73 71   pPk ){.      sq
52a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
52b0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 45 70 68  v, OP_Next, iEph
52c0: 43 75 72 2c 20 61 64 64 72 4c 6f 6f 70 2b 31 29  Cur, addrLoop+1)
52d0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
52e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
52f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5300: 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  addrLoop);.    }
5310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5320: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
5330: 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  ddrLoop);.      
5340: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5350: 65 72 65 28 76 2c 20 61 64 64 72 4c 6f 6f 70 29  ere(v, addrLoop)
5360: 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20 20 7d  ;.    }     .  }
5370: 20 2f 2a 20 45 6e 64 20 6e 6f 6e 2d 74 72 75 6e   /* End non-trun
5380: 63 61 74 65 20 70 61 74 68 20 2a 2f 0a 0a 20 20  cate path */..  
5390: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 71  /* Update the sq
53a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
53b0: 62 6c 65 20 62 79 20 73 74 6f 72 69 6e 67 20 74  ble by storing t
53c0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
53d0: 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 72  e.  ** maximum r
53e0: 6f 77 69 64 20 63 6f 75 6e 74 65 72 20 76 61 6c  owid counter val
53f0: 75 65 73 20 72 65 63 6f 72 64 65 64 20 77 68 69  ues recorded whi
5400: 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  le inserting int
5410: 6f 0a 20 20 2a 2a 20 61 75 74 6f 69 6e 63 72 65  o.  ** autoincre
5420: 6d 65 6e 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a  ment tables..  *
5430: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
5440: 6e 65 73 74 65 64 3d 3d 30 20 26 26 20 70 50 61  nested==0 && pPa
5450: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
5460: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5470: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45  e3AutoincrementE
5480: 6e 64 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  nd(pParse);.  }.
5490: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
54a0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
54b0: 74 68 61 74 20 77 65 72 65 20 64 65 6c 65 74 65  that were delete
54c0: 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  d. If this routi
54d0: 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65  ne is .  ** gene
54e0: 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63 61  rating code beca
54f0: 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f  use of a call to
5500: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
5510: 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20  rse(), do not.  
5520: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  ** invoke the ca
5530: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
5540: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d 65 6d 43  .  */.  if( memC
5550: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
5560: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5570: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 6d 65 6d  P_ResultRow, mem
5580: 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Cnt, 1);.    sql
5590: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
55a0: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71  ls(v, 1);.    sq
55b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
55c0: 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d  ame(v, 0, COLNAM
55d0: 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 64 65  E_NAME, "rows de
55e0: 6c 65 74 65 64 22 2c 20 53 51 4c 49 54 45 5f 53  leted", SQLITE_S
55f0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 64 65 6c  TATIC);.  }..del
5600: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
5610: 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  :.  sqlite3AuthC
5620: 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74  ontextPop(&sCont
5630: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ext);.  sqlite3S
5640: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
5650: 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71   pTabList);.  sq
5660: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5670: 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 23 69 66  db, pWhere);.#if
5680: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5690: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
56a0: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 0a 20 20 73  LETE_LIMIT) .  s
56b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
56c0: 6c 65 74 65 28 64 62 2c 20 70 4f 72 64 65 72 42  lete(db, pOrderB
56d0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
56e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 6d  rDelete(db, pLim
56f0: 69 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  it);.#endif.  sq
5700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5710: 61 54 6f 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75  aToOpen);.  retu
5720: 72 6e 3b 0a 7d 0a 2f 2a 20 4d 61 6b 65 20 73 75  rn;.}./* Make su
5730: 72 65 20 22 69 73 56 69 65 77 22 20 61 6e 64 20  re "isView" and 
5740: 6f 74 68 65 72 20 6d 61 63 72 6f 73 20 64 65 66  other macros def
5750: 69 6e 65 64 20 61 62 6f 76 65 20 61 72 65 20 75  ined above are u
5760: 6e 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77  ndefined. Otherw
5770: 69 73 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  ise.** they may 
5780: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 63  interfere with c
5790: 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74  ompilation of ot
57a0: 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  her functions in
57b0: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f   this file.** (o
57c0: 72 20 69 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c  r in another fil
57d0: 65 2c 20 69 66 20 74 68 69 73 20 66 69 6c 65 20  e, if this file 
57e0: 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 20  becomes part of 
57f0: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
5800: 29 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 69 73  ).  */.#ifdef is
5810: 56 69 65 77 0a 20 23 75 6e 64 65 66 20 69 73 56  View. #undef isV
5820: 69 65 77 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  iew.#endif.#ifde
5830: 66 20 70 54 72 69 67 67 65 72 0a 20 23 75 6e 64  f pTrigger. #und
5840: 65 66 20 70 54 72 69 67 67 65 72 0a 23 65 6e 64  ef pTrigger.#end
5850: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
5860: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
5870: 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
5880: 63 61 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  causes a single 
5890: 72 6f 77 20 6f 66 20 61 0a 2a 2a 20 73 69 6e 67  row of a.** sing
58a0: 6c 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  le table to be d
58b0: 65 6c 65 74 65 64 2e 20 20 42 6f 74 68 20 74 68  eleted.  Both th
58c0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  e original table
58d0: 20 65 6e 74 72 79 20 61 6e 64 0a 2a 2a 20 61 6c   entry and.** al
58e0: 6c 20 69 6e 64 69 63 65 73 20 61 72 65 20 72 65  l indices are re
58f0: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 72 65  moved..**.** Pre
5900: 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  conditions:.**.*
5910: 2a 20 20 20 31 2e 20 20 69 44 61 74 61 43 75 72  *   1.  iDataCur
5920: 20 69 73 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   is an open curs
5930: 6f 72 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  or on the btree 
5940: 74 68 61 74 20 69 73 20 74 68 65 20 63 61 6e 6f  that is the cano
5950: 6e 69 63 61 6c 20 64 61 74 61 0a 2a 2a 20 20 20  nical data.**   
5960: 20 20 20 20 73 74 6f 72 65 20 66 6f 72 20 74 68      store for th
5970: 65 20 74 61 62 6c 65 2e 20 20 28 54 68 69 73 20  e table.  (This 
5980: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 74  will be either t
5990: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2c  he table itself,
59a0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
59b0: 20 63 61 73 65 20 6f 66 20 61 20 72 6f 77 69 64   case of a rowid
59c0: 20 74 61 62 6c 65 2c 20 6f 72 20 74 68 65 20 50   table, or the P
59d0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
59e0: 20 69 6e 20 74 68 65 20 63 61 73 65 0a 2a 2a 20   in the case.** 
59f0: 20 20 20 20 20 20 6f 66 20 61 20 57 49 54 48 4f        of a WITHO
5a00: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 29  UT ROWID table.)
5a10: 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 52 65 61  .**.**   2.  Rea
5a20: 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  d/write cursors 
5a30: 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  for all indices 
5a40: 6f 66 20 70 54 61 62 20 6d 75 73 74 20 62 65 20  of pTab must be 
5a50: 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20  open as.**      
5a60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
5a70: 49 64 78 43 75 72 2b 69 20 66 6f 72 20 74 68 65  IdxCur+i for the
5a80: 20 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a   i-th index..**.
5a90: 2a 2a 20 20 20 33 2e 20 20 54 68 65 20 70 72 69  **   3.  The pri
5aa0: 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 74 68 65  mary key for the
5ab0: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
5ac0: 65 64 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  ed must be store
5ad0: 64 20 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 20  d in a.**       
5ae0: 73 65 71 75 65 6e 63 65 20 6f 66 20 6e 50 6b 20  sequence of nPk 
5af0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 73 74 61  memory cells sta
5b00: 72 74 69 6e 67 20 61 74 20 69 50 6b 2e 20 20 49  rting at iPk.  I
5b10: 66 20 6e 50 6b 3d 3d 30 20 74 68 61 74 20 6d 65  f nPk==0 that me
5b20: 61 6e 73 0a 2a 2a 20 20 20 20 20 20 20 74 68 61  ans.**       tha
5b30: 74 20 61 20 73 65 61 72 63 68 20 72 65 63 6f 72  t a search recor
5b40: 64 20 66 6f 72 6d 65 64 20 66 72 6f 6d 20 4f 50  d formed from OP
5b50: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69 73 20 63  _MakeRecord is c
5b60: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 0a  ontained in the.
5b70: 2a 2a 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  **       single 
5b80: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
5b90: 69 50 6b 2e 0a 2a 2a 0a 2a 2a 20 65 4d 6f 64 65  iPk..**.** eMode
5ba0: 3a 0a 2a 2a 20 20 20 50 61 72 61 6d 65 74 65 72  :.**   Parameter
5bb0: 20 65 4d 6f 64 65 20 6d 61 79 20 62 65 20 70 61   eMode may be pa
5bc0: 73 73 65 64 20 65 69 74 68 65 72 20 4f 4e 45 50  ssed either ONEP
5bd0: 41 53 53 5f 4f 46 46 20 28 30 29 2c 20 4f 4e 45  ASS_OFF (0), ONE
5be0: 50 41 53 53 5f 53 49 4e 47 4c 45 2c 20 6f 72 0a  PASS_SINGLE, or.
5bf0: 2a 2a 20 20 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  **   ONEPASS_MUL
5c00: 54 49 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  TI.  If eMode is
5c10: 20 6e 6f 74 20 4f 4e 45 50 41 53 53 5f 4f 46 46   not ONEPASS_OFF
5c20: 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
5c30: 72 0a 2a 2a 20 20 20 69 44 61 74 61 43 75 72 20  r.**   iDataCur 
5c40: 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
5c50: 6f 20 74 68 65 20 72 6f 77 20 74 6f 20 64 65 6c  o the row to del
5c60: 65 74 65 2e 20 49 66 20 65 4d 6f 64 65 20 69 73  ete. If eMode is
5c70: 20 4f 4e 45 50 41 53 53 5f 4f 46 46 0a 2a 2a 20   ONEPASS_OFF.** 
5c80: 20 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63    then this func
5c90: 74 69 6f 6e 20 6d 75 73 74 20 73 65 65 6b 20 69  tion must seek i
5ca0: 44 61 74 61 43 75 72 20 74 6f 20 74 68 65 20 65  DataCur to the e
5cb0: 6e 74 72 79 20 69 64 65 6e 74 69 66 69 65 64 20  ntry identified 
5cc0: 62 79 20 69 50 6b 0a 2a 2a 20 20 20 61 6e 64 20  by iPk.**   and 
5cd0: 6e 50 6b 20 62 65 66 6f 72 65 20 72 65 61 64 69  nPk before readi
5ce0: 6e 67 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a  ng from it..**.*
5cf0: 2a 20 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20  *   If eMode is 
5d00: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 2c 20 74  ONEPASS_MULTI, t
5d10: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
5d20: 20 62 65 69 6e 67 20 6d 61 64 65 20 61 73 20 70   being made as p
5d30: 61 72 74 0a 2a 2a 20 20 20 6f 66 20 61 20 4f 4e  art.**   of a ON
5d40: 45 50 41 53 53 20 64 65 6c 65 74 65 20 74 68 61  EPASS delete tha
5d50: 74 20 61 66 66 65 63 74 73 20 6d 75 6c 74 69 70  t affects multip
5d60: 6c 65 20 72 6f 77 73 2e 20 49 6e 20 74 68 69 73  le rows. In this
5d70: 20 63 61 73 65 2c 20 69 66 20 0a 2a 2a 20 20 20   case, if .**   
5d80: 69 49 64 78 4e 6f 53 65 65 6b 20 69 73 20 61 20  iIdxNoSeek is a 
5d90: 76 61 6c 69 64 20 63 75 72 73 6f 72 20 6e 75 6d  valid cursor num
5da0: 62 65 72 20 28 3e 3d 30 29 20 61 6e 64 20 69 73  ber (>=0) and is
5db0: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
5dc0: 0a 2a 2a 20 20 20 69 44 61 74 61 43 75 72 2c 20  .**   iDataCur, 
5dd0: 74 68 65 6e 20 69 74 73 20 70 6f 73 69 74 69 6f  then its positio
5de0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73  n should be pres
5df0: 65 72 76 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  erved following 
5e00: 74 68 65 20 64 65 6c 65 74 65 0a 2a 2a 20 20 20  the delete.**   
5e10: 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 72 2c 20 69  operation. Or, i
5e20: 66 20 69 49 64 78 4e 6f 53 65 65 6b 20 69 73 20  f iIdxNoSeek is 
5e30: 6e 6f 74 20 61 20 76 61 6c 69 64 20 63 75 72 73  not a valid curs
5e40: 6f 72 20 6e 75 6d 62 65 72 2c 20 74 68 65 0a 2a  or number, the.*
5e50: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  *   position of 
5e60: 69 44 61 74 61 43 75 72 20 73 68 6f 75 6c 64 20  iDataCur should 
5e70: 62 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 73  be preserved ins
5e80: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 69 49 64 78  tead..**.** iIdx
5e90: 4e 6f 53 65 65 6b 3a 0a 2a 2a 20 20 20 49 66 20  NoSeek:.**   If 
5ea0: 69 49 64 78 4e 6f 53 65 65 6b 20 69 73 20 61 20  iIdxNoSeek is a 
5eb0: 76 61 6c 69 64 20 63 75 72 73 6f 72 20 6e 75 6d  valid cursor num
5ec0: 62 65 72 20 28 3e 3d 30 29 20 6e 6f 74 20 65 71  ber (>=0) not eq
5ed0: 75 61 6c 20 74 6f 20 69 44 61 74 61 43 75 72 2c  ual to iDataCur,
5ee0: 0a 2a 2a 20 20 20 74 68 65 6e 20 69 74 20 69 64  .**   then it id
5ef0: 65 6e 74 69 66 69 65 73 20 61 6e 20 69 6e 64 65  entifies an inde
5f00: 78 20 63 75 72 73 6f 72 20 28 66 72 6f 6d 20 77  x cursor (from w
5f10: 69 74 68 69 6e 20 61 72 72 61 79 20 6f 66 20 63  ithin array of c
5f20: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 73 74 61 72  ursors.**   star
5f30: 74 69 6e 67 20 61 74 20 69 49 64 78 43 75 72 29  ting at iIdxCur)
5f40: 20 74 68 61 74 20 61 6c 72 65 61 64 79 20 70 6f   that already po
5f50: 69 6e 74 73 20 74 6f 20 74 68 65 20 69 6e 64 65  ints to the inde
5f60: 78 20 65 6e 74 72 79 20 74 6f 20 62 65 20 64 65  x entry to be de
5f70: 6c 65 74 65 64 2e 0a 2a 2a 20 20 20 45 78 63 65  leted..**   Exce
5f80: 70 74 2c 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  pt, this optimiz
5f90: 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65  ation is disable
5fa0: 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 42  d if there are B
5fb0: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 73  EFORE triggers s
5fc0: 69 6e 63 65 0a 2a 2a 20 20 20 74 68 65 20 74 72  ince.**   the tr
5fd0: 69 67 67 65 72 20 62 6f 64 79 20 6d 69 67 68 74  igger body might
5fe0: 20 68 61 76 65 20 6d 6f 76 65 64 20 74 68 65 20   have moved the 
5ff0: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
6000: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
6010: 6f 77 44 65 6c 65 74 65 28 0a 20 20 50 61 72 73  owDelete(.  Pars
6020: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
6030: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6040: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
6050: 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ab,       /* Tab
6060: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
6070: 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  e row to be dele
6080: 74 65 64 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  ted */.  Trigger
6090: 20 2a 70 54 72 69 67 67 65 72 2c 20 2f 2a 20 4c   *pTrigger, /* L
60a0: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20  ist of triggers 
60b0: 74 6f 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79 29  to (potentially)
60c0: 20 66 69 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   fire */.  int i
60d0: 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 2f 2a  DataCur,      /*
60e0: 20 43 75 72 73 6f 72 20 66 72 6f 6d 20 77 68 69   Cursor from whi
60f0: 63 68 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 69  ch column data i
6100: 73 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20  s extracted */. 
6110: 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20   int iIdxCur,   
6120: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64      /* First ind
6130: 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69  ex cursor */.  i
6140: 6e 74 20 69 50 6b 2c 20 20 20 20 20 20 20 20 20  nt iPk,         
6150: 20 20 2f 2a 20 46 69 72 73 74 20 6d 65 6d 6f 72    /* First memor
6160: 79 20 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e  y cell containin
6170: 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
6180: 59 20 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 2c 20  Y */.  i16 nPk, 
6190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
61a0: 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b  ber of PRIMARY K
61b0: 45 59 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  EY memory cells 
61c0: 2a 2f 0a 20 20 75 38 20 63 6f 75 6e 74 2c 20 20  */.  u8 count,  
61d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
61e0: 6e 2d 7a 65 72 6f 2c 20 69 6e 63 72 65 6d 65 6e  n-zero, incremen
61f0: 74 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65  t the row change
6200: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
6210: 20 6f 6e 63 6f 6e 66 2c 20 20 20 20 20 20 20 20   onconf,        
6220: 20 2f 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20 43   /* Default ON C
6230: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 66  ONFLICT policy f
6240: 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  or triggers */. 
6250: 20 75 38 20 65 4d 6f 64 65 2c 20 20 20 20 20 20   u8 eMode,      
6260: 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53 53 5f 4f      /* ONEPASS_O
6270: 46 46 2c 20 5f 53 49 4e 47 4c 45 2c 20 6f 72 20  FF, _SINGLE, or 
6280: 5f 4d 55 4c 54 49 2e 20 20 53 65 65 20 61 62 6f  _MULTI.  See abo
6290: 76 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ve */.  int iIdx
62a0: 4e 6f 53 65 65 6b 20 20 20 20 20 2f 2a 20 43 75  NoSeek     /* Cu
62b0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  rsor number of c
62c0: 75 72 73 6f 72 20 74 68 61 74 20 64 6f 65 73 20  ursor that does 
62d0: 6e 6f 74 20 6e 65 65 64 20 73 65 65 6b 69 6e 67  not need seeking
62e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
62f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6300: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65  ;        /* Vdbe
6310: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c 64 20 3d   */.  int iOld =
6320: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6330: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
6340: 65 67 69 73 74 65 72 20 69 6e 20 4f 4c 44 2e 2a  egister in OLD.*
6350: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
6360: 69 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  iLabel;         
6370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6380: 61 62 65 6c 20 72 65 73 6f 6c 76 65 64 20 74 6f  abel resolved to
6390: 20 65 6e 64 20 6f 66 20 67 65 6e 65 72 61 74 65   end of generate
63a0: 64 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6f  d code */.  u8 o
63b0: 70 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20  pSeek;          
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
63d0: 65 65 6b 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20  eek opcode */.. 
63e0: 20 2f 2a 20 56 64 62 65 20 69 73 20 67 75 61 72   /* Vdbe is guar
63f0: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 62  anteed to have b
6400: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  een allocated by
6410: 20 74 68 69 73 20 73 74 61 67 65 2e 20 2a 2f 0a   this stage. */.
6420: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
6430: 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
6440: 6e 74 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47  nt((v, "BEGIN: G
6450: 65 6e 52 6f 77 44 65 6c 28 25 64 2c 25 64 2c 25  enRowDel(%d,%d,%
6460: 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  d,%d)",.        
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
6490: 75 72 2c 20 69 50 6b 2c 20 28 69 6e 74 29 6e 50  ur, iPk, (int)nP
64a0: 6b 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 6b 20  k));..  /* Seek 
64b0: 63 75 72 73 6f 72 20 69 43 75 72 20 74 6f 20 74  cursor iCur to t
64c0: 68 65 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65  he row to delete
64d0: 2e 20 49 66 20 74 68 69 73 20 72 6f 77 20 6e 6f  . If this row no
64e0: 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 0a   longer exists .
64f0: 20 20 2a 2a 20 28 74 68 69 73 20 63 61 6e 20 68    ** (this can h
6500: 61 70 70 65 6e 20 69 66 20 61 20 74 72 69 67 67  appen if a trigg
6510: 65 72 20 70 72 6f 67 72 61 6d 20 68 61 73 20 61  er program has a
6520: 6c 72 65 61 64 79 20 64 65 6c 65 74 65 64 20 69  lready deleted i
6530: 74 29 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20  t), do.  ** not 
6540: 61 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  attempt to delet
6550: 65 20 69 74 20 6f 72 20 66 69 72 65 20 61 6e 79  e it or fire any
6560: 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 73   DELETE triggers
6570: 2e 20 20 2a 2f 0a 20 20 69 4c 61 62 65 6c 20 3d  .  */.  iLabel =
6580: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6590: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6f 70 53 65  Label(v);.  opSe
65a0: 65 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54  ek = HasRowid(pT
65b0: 61 62 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73  ab) ? OP_NotExis
65c0: 74 73 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  ts : OP_NotFound
65d0: 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 4f  ;.  if( eMode==O
65e0: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
65f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6600: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 53 65 65 6b  Op4Int(v, opSeek
6610: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 4c 61 62  , iDataCur, iLab
6620: 65 6c 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20  el, iPk, nPk);. 
6630: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
6640: 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f  f(v, opSeek==OP_
6650: 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20 20 20 20  NotExists);.    
6660: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
6670: 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74  , opSeek==OP_Not
6680: 46 6f 75 6e 64 29 3b 0a 20 20 7d 0a 20 0a 20 20  Found);.  }. .  
6690: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
66a0: 61 6e 79 20 74 72 69 67 67 65 72 73 20 74 6f 20  any triggers to 
66b0: 66 69 72 65 2c 20 61 6c 6c 6f 63 61 74 65 20 61  fire, allocate a
66c0: 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
66d0: 65 72 73 20 74 6f 0a 20 20 2a 2a 20 75 73 65 20  ers to.  ** use 
66e0: 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65  for the old.* re
66f0: 66 65 72 65 6e 63 65 73 20 69 6e 20 74 68 65 20  ferences in the 
6700: 74 72 69 67 67 65 72 73 2e 20 20 2a 2f 0a 20 20  triggers.  */.  
6710: 69 66 28 20 73 71 6c 69 74 65 33 46 6b 52 65 71  if( sqlite3FkReq
6720: 75 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54  uired(pParse, pT
6730: 61 62 2c 20 30 2c 20 30 29 20 7c 7c 20 70 54 72  ab, 0, 0) || pTr
6740: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 75 33 32  igger ){.    u32
6750: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
6760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
6770: 73 6b 20 6f 66 20 4f 4c 44 2e 2a 20 63 6f 6c 75  sk of OLD.* colu
6780: 6d 6e 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  mns in use */.  
6790: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
67c0: 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
67d0: 67 20 4f 4c 44 2e 2a 20 2a 2f 0a 20 20 20 20 69  g OLD.* */.    i
67e0: 6e 74 20 61 64 64 72 53 74 61 72 74 3b 20 20 20  nt addrStart;   
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6800: 53 74 61 72 74 20 6f 66 20 42 45 46 4f 52 45 20  Start of BEFORE 
6810: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
6820: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f   */..    /* TODO
6830: 3a 20 43 6f 75 6c 64 20 75 73 65 20 74 65 6d 70  : Could use temp
6840: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
6850: 68 65 72 65 2e 20 41 6c 73 6f 20 63 6f 75 6c 64  here. Also could
6860: 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20   attempt to.    
6870: 2a 2a 20 61 76 6f 69 64 20 63 6f 70 79 69 6e 67  ** avoid copying
6880: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
6890: 20 74 68 65 20 72 6f 77 69 64 20 72 65 67 69 73   the rowid regis
68a0: 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 6d 61 73  ter.  */.    mas
68b0: 6b 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  k = sqlite3Trigg
68c0: 65 72 43 6f 6c 6d 61 73 6b 28 0a 20 20 20 20 20  erColmask(.     
68d0: 20 20 20 70 50 61 72 73 65 2c 20 70 54 72 69 67     pParse, pTrig
68e0: 67 65 72 2c 20 30 2c 20 30 2c 20 54 52 49 47 47  ger, 0, 0, TRIGG
68f0: 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45  ER_BEFORE|TRIGGE
6900: 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6f  R_AFTER, pTab, o
6910: 6e 63 6f 6e 66 0a 20 20 20 20 29 3b 0a 20 20 20  nconf.    );.   
6920: 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33   mask |= sqlite3
6930: 46 6b 4f 6c 64 6d 61 73 6b 28 70 50 61 72 73 65  FkOldmask(pParse
6940: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 69 4f 6c  , pTab);.    iOl
6950: 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  d = pParse->nMem
6960: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
6970: 6e 4d 65 6d 20 2b 3d 20 28 31 20 2b 20 70 54 61  nMem += (1 + pTa
6980: 62 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  b->nCol);..    /
6990: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 4f  * Populate the O
69a0: 4c 44 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  LD.* pseudo-tabl
69b0: 65 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79  e register array
69c0: 2e 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 77  . These values w
69d0: 69 6c 6c 20 62 65 20 0a 20 20 20 20 2a 2a 20 75  ill be .    ** u
69e0: 73 65 64 20 62 79 20 61 6e 79 20 42 45 46 4f 52  sed by any BEFOR
69f0: 45 20 61 6e 64 20 41 46 54 45 52 20 74 72 69 67  E and AFTER trig
6a00: 67 65 72 73 20 74 68 61 74 20 65 78 69 73 74 2e  gers that exist.
6a10: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6a30: 5f 43 6f 70 79 2c 20 69 50 6b 2c 20 69 4f 6c 64  _Copy, iPk, iOld
6a40: 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  );.    for(iCol=
6a50: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
6a60: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
6a70: 20 20 20 74 65 73 74 63 61 73 65 28 20 6d 61 73     testcase( mas
6a80: 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 26 26  k!=0xffffffff &&
6a90: 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20   iCol==31 );.   
6aa0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6d 61 73     testcase( mas
6ab0: 6b 21 3d 30 78 66 66 66 66 66 66 66 66 20 26 26  k!=0xffffffff &&
6ac0: 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20   iCol==32 );.   
6ad0: 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 30 78 66     if( mask==0xf
6ae0: 66 66 66 66 66 66 66 20 7c 7c 20 28 69 43 6f 6c  fffffff || (iCol
6af0: 3c 3d 33 31 20 26 26 20 28 6d 61 73 6b 20 26 20  <=31 && (mask & 
6b00: 4d 41 53 4b 42 49 54 33 32 28 69 43 6f 6c 29 29  MASKBIT32(iCol))
6b10: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
6b20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
6b30: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
6b40: 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  v, pTab, iDataCu
6b50: 72 2c 20 69 43 6f 6c 2c 20 69 4f 6c 64 2b 69 43  r, iCol, iOld+iC
6b60: 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ol+1);.      }. 
6b70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
6b80: 6f 6b 65 20 42 45 46 4f 52 45 20 44 45 4c 45 54  oke BEFORE DELET
6b90: 45 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  E trigger progra
6ba0: 6d 73 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 53  ms. */.    addrS
6bb0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
6bc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
6be0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
6bf0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 0a 20  se, pTrigger, . 
6c00: 20 20 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45         TK_DELETE
6c10: 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46  , 0, TRIGGER_BEF
6c20: 4f 52 45 2c 20 70 54 61 62 2c 20 69 4f 6c 64 2c  ORE, pTab, iOld,
6c30: 20 6f 6e 63 6f 6e 66 2c 20 69 4c 61 62 65 6c 0a   onconf, iLabel.
6c40: 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49      );..    /* I
6c50: 66 20 61 6e 79 20 42 45 46 4f 52 45 20 74 72 69  f any BEFORE tri
6c60: 67 67 65 72 73 20 77 65 72 65 20 63 6f 64 65 64  ggers were coded
6c70: 2c 20 74 68 65 6e 20 73 65 65 6b 20 74 68 65 20  , then seek the 
6c80: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 0a 20  cursor to the . 
6c90: 20 20 20 2a 2a 20 72 6f 77 20 74 6f 20 62 65 20     ** row to be 
6ca0: 64 65 6c 65 74 65 64 20 61 67 61 69 6e 2e 20 49  deleted again. I
6cb0: 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68  t may be that th
6cc0: 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
6cd0: 73 20 6d 6f 76 65 64 0a 20 20 20 20 2a 2a 20 74  s moved.    ** t
6ce0: 68 65 20 63 75 72 73 6f 72 20 6f 72 20 61 6c 72  he cursor or alr
6cf0: 65 61 64 79 20 64 65 6c 65 74 65 64 20 74 68 65  eady deleted the
6d00: 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 63 75   row that the cu
6d10: 72 73 6f 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  rsor was.    ** 
6d20: 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 20 20 20  pointing to..   
6d30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
6d40: 64 69 73 61 62 6c 65 20 74 68 65 20 69 49 64 78  disable the iIdx
6d50: 4e 6f 53 65 65 6b 20 6f 70 74 69 6d 69 7a 61 74  NoSeek optimizat
6d60: 69 6f 6e 20 73 69 6e 63 65 20 74 68 65 20 42 45  ion since the BE
6d70: 46 4f 52 45 20 74 72 69 67 67 65 72 0a 20 20 20  FORE trigger.   
6d80: 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 6d 6f 76   ** may have mov
6d90: 65 64 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a  ed that cursor..
6da0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
6db0: 64 64 72 53 74 61 72 74 3c 73 71 6c 69 74 65 33  ddrStart<sqlite3
6dc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6dd0: 76 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  v) ){.      sqli
6de0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6df0: 28 76 2c 20 6f 70 53 65 65 6b 2c 20 69 44 61 74  (v, opSeek, iDat
6e00: 61 43 75 72 2c 20 69 4c 61 62 65 6c 2c 20 69 50  aCur, iLabel, iP
6e10: 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 56  k, nPk);.      V
6e20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
6e30: 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 45   opSeek==OP_NotE
6e40: 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 56 64  xists);.      Vd
6e50: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
6e60: 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 46 6f  opSeek==OP_NotFo
6e70: 75 6e 64 29 3b 0a 20 20 20 20 20 20 74 65 73 74  und);.      test
6e80: 63 61 73 65 28 20 69 49 64 78 4e 6f 53 65 65 6b  case( iIdxNoSeek
6e90: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 49 64  >=0 );.      iId
6ea0: 78 4e 6f 53 65 65 6b 20 3d 20 2d 31 3b 0a 20 20  xNoSeek = -1;.  
6eb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 46    }..    /* Do F
6ec0: 4b 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 54 68  K processing. Th
6ed0: 69 73 20 63 61 6c 6c 20 63 68 65 63 6b 73 20 74  is call checks t
6ee0: 68 61 74 20 61 6e 79 20 46 4b 20 63 6f 6e 73 74  hat any FK const
6ef0: 72 61 69 6e 74 73 20 74 68 61 74 0a 20 20 20 20  raints that.    
6f00: 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 69 73  ** refer to this
6f10: 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 63 6f 6e   table (i.e. con
6f20: 73 74 72 61 69 6e 74 73 20 61 74 74 61 63 68 65  straints attache
6f30: 64 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  d to other table
6f40: 73 29 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e  s) .    ** are n
6f50: 6f 74 20 76 69 6f 6c 61 74 65 64 20 62 79 20 64  ot violated by d
6f60: 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72 6f 77  eleting this row
6f70: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
6f80: 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c  3FkCheck(pParse,
6f90: 20 70 54 61 62 2c 20 69 4f 6c 64 2c 20 30 2c 20   pTab, iOld, 0, 
6fa0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
6fb0: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 64 65   Delete the inde
6fc0: 78 20 61 6e 64 20 74 61 62 6c 65 20 65 6e 74 72  x and table entr
6fd0: 69 65 73 2e 20 53 6b 69 70 20 74 68 69 73 20 73  ies. Skip this s
6fe0: 74 65 70 20 69 66 20 70 54 61 62 20 69 73 20 72  tep if pTab is r
6ff0: 65 61 6c 6c 79 0a 20 20 2a 2a 20 61 20 76 69 65  eally.  ** a vie
7000: 77 20 28 69 6e 20 77 68 69 63 68 20 63 61 73 65  w (in which case
7010: 20 74 68 65 20 6f 6e 6c 79 20 65 66 66 65 63 74   the only effect
7020: 20 6f 66 20 74 68 65 20 44 45 4c 45 54 45 20 73   of the DELETE s
7030: 74 61 74 65 6d 65 6e 74 20 69 73 20 74 6f 0a 20  tatement is to. 
7040: 20 2a 2a 20 66 69 72 65 20 74 68 65 20 49 4e 53   ** fire the INS
7050: 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 73  TEAD OF triggers
7060: 29 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ).  .  **.  ** I
7070: 66 20 76 61 72 69 61 62 6c 65 20 27 63 6f 75 6e  f variable 'coun
7080: 74 27 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t' is non-zero, 
7090: 74 68 65 6e 20 74 68 69 73 20 4f 50 5f 44 65 6c  then this OP_Del
70a0: 65 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ete instruction 
70b0: 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 69 6e 76 6f  should.  ** invo
70c0: 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  ke the update-ho
70d0: 6f 6b 2e 20 54 68 65 20 70 72 65 2d 75 70 64 61  ok. The pre-upda
70e0: 74 65 2d 68 6f 6f 6b 2c 20 6f 6e 20 74 68 65 20  te-hook, on the 
70f0: 6f 74 68 65 72 20 68 61 6e 64 20 73 68 6f 75 6c  other hand shoul
7100: 64 0a 20 20 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  d.  ** be invoke
7110: 64 20 75 6e 6c 65 73 73 20 74 61 62 6c 65 20 70  d unless table p
7120: 54 61 62 20 69 73 20 61 20 73 79 73 74 65 6d 20  Tab is a system 
7130: 74 61 62 6c 65 2e 20 54 68 65 20 64 69 66 66 65  table. The diffe
7140: 72 65 6e 63 65 20 69 73 20 74 68 61 74 0a 20 20  rence is that.  
7150: 2a 2a 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  ** the update-ho
7160: 6f 6b 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65  ok is not invoke
7170: 64 20 66 6f 72 20 72 6f 77 73 20 72 65 6d 6f 76  d for rows remov
7180: 65 64 20 62 79 20 52 45 50 4c 41 43 45 2c 20 62  ed by REPLACE, b
7190: 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 70 72 65  ut the .  ** pre
71a0: 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 2e  -update-hook is.
71b0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 54 61  .  */ .  if( pTa
71c0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
71d0: 0a 20 20 20 20 75 38 20 70 35 20 3d 20 30 3b 0a  .    u8 p5 = 0;.
71e0: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
71f0: 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74  ateRowIndexDelet
7200: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
7210: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
7220: 72 2c 30 2c 69 49 64 78 4e 6f 53 65 65 6b 29 3b  r,0,iIdxNoSeek);
7230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c  AddOp2(v, OP_Del
7250: 65 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20 28  ete, iDataCur, (
7260: 63 6f 75 6e 74 3f 4f 50 46 4c 41 47 5f 4e 43 48  count?OPFLAG_NCH
7270: 41 4e 47 45 3a 30 29 29 3b 0a 20 20 20 20 69 66  ANGE:0));.    if
7280: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
7290: 3d 3d 30 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65  ==0 || 0==sqlite
72a0: 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d 3e  3_stricmp(pTab->
72b0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
72c0: 74 61 74 31 22 29 20 29 7b 0a 20 20 20 20 20 20  tat1") ){.      
72d0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
72e0: 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 70 54  dP4(v, (char*)pT
72f0: 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20  ab, P4_TABLE);. 
7300: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f     }.    if( eMo
7310: 64 65 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  de!=ONEPASS_OFF 
7320: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7340: 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
7350: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7360: 20 69 49 64 78 4e 6f 53 65 65 6b 3e 3d 30 20 26   iIdxNoSeek>=0 &
7370: 26 20 69 49 64 78 4e 6f 53 65 65 6b 21 3d 69 44  & iIdxNoSeek!=iD
7380: 61 74 61 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ataCur ){.      
7390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
73a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
73b0: 69 49 64 78 4e 6f 53 65 65 6b 29 3b 0a 20 20 20  iIdxNoSeek);.   
73c0: 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65   }.    if( eMode
73d0: 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  ==ONEPASS_MULTI 
73e0: 29 20 70 35 20 7c 3d 20 4f 50 46 4c 41 47 5f 53  ) p5 |= OPFLAG_S
73f0: 41 56 45 50 4f 53 49 54 49 4f 4e 3b 0a 20 20 20  AVEPOSITION;.   
7400: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7410: 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
7420: 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e  ..  /* Do any ON
7430: 20 43 41 53 43 41 44 45 2c 20 53 45 54 20 4e 55   CASCADE, SET NU
7440: 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41 55 4c  LL or SET DEFAUL
7450: 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  T operations req
7460: 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 68 61  uired to.  ** ha
7470: 6e 64 6c 65 20 72 6f 77 73 20 28 70 6f 73 73 69  ndle rows (possi
7480: 62 6c 79 20 69 6e 20 6f 74 68 65 72 20 74 61 62  bly in other tab
7490: 6c 65 73 29 20 74 68 61 74 20 72 65 66 65 72 20  les) that refer 
74a0: 76 69 61 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  via a foreign ke
74b0: 79 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f  y.  ** to the ro
74c0: 77 20 6a 75 73 74 20 64 65 6c 65 74 65 64 2e 20  w just deleted. 
74d0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 46 6b 41  */ .  sqlite3FkA
74e0: 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 70  ctions(pParse, p
74f0: 54 61 62 2c 20 30 2c 20 69 4f 6c 64 2c 20 30 2c  Tab, 0, iOld, 0,
7500: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b   0);..  /* Invok
7510: 65 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 74  e AFTER DELETE t
7520: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
7530: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
7540: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
7550: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 0a 20  se, pTrigger, . 
7560: 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45 2c 20       TK_DELETE, 
7570: 30 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  0, TRIGGER_AFTER
7580: 2c 20 70 54 61 62 2c 20 69 4f 6c 64 2c 20 6f 6e  , pTab, iOld, on
7590: 63 6f 6e 66 2c 20 69 4c 61 62 65 6c 0a 20 20 29  conf, iLabel.  )
75a0: 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
75b0: 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 64  e if the row had
75c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
75d0: 6c 65 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  leted before any
75e0: 20 42 45 46 4f 52 45 0a 20 20 2a 2a 20 74 72 69   BEFORE.  ** tri
75f0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 77 65  gger programs we
7600: 72 65 20 69 6e 76 6f 6b 65 64 2e 20 4f 72 20 69  re invoked. Or i
7610: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
7620: 72 61 6d 20 74 68 72 6f 77 73 20 61 20 0a 20 20  ram throws a .  
7630: 2a 2a 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  ** RAISE(IGNORE)
7640: 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a   exception.  */.
7650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
7660: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 61  olveLabel(v, iLa
7670: 62 65 6c 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75  bel);.  VdbeModu
7680: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
7690: 4e 44 3a 20 47 65 6e 52 6f 77 44 65 6c 28 29 22  ND: GenRowDel()"
76a0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
76b0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
76c0: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
76d0: 61 74 20 63 61 75 73 65 73 20 74 68 65 20 64 65  at causes the de
76e0: 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c 0a 2a 2a  letion of all.**
76f0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
7700: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
7710: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61   single row of a
7720: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2c 20 70   single table, p
7730: 54 61 62 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e  Tab.**.** Precon
7740: 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  ditions:.**.**  
7750: 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74   1.  A read/writ
7760: 65 20 63 75 72 73 6f 72 20 22 69 44 61 74 61 43  e cursor "iDataC
7770: 75 72 22 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ur" must be open
7780: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
7790: 6c 20 73 74 6f 72 61 67 65 0a 2a 2a 20 20 20 20  l storage.**    
77a0: 20 20 20 62 74 72 65 65 20 66 6f 72 20 74 68 65     btree for the
77b0: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 28 54   table pTab.  (T
77c0: 68 69 73 20 77 69 6c 6c 20 62 65 20 65 69 74 68  his will be eith
77d0: 65 72 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  er the table its
77e0: 65 6c 66 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72  elf.**       for
77f0: 20 72 6f 77 69 64 20 74 61 62 6c 65 73 20 6f 72   rowid tables or
7800: 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20   to the primary 
7810: 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20 57 49  key index for WI
7820: 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 20  THOUT ROWID.**  
7830: 20 20 20 20 20 74 61 62 6c 65 73 2e 29 0a 2a 2a       tables.).**
7840: 0a 2a 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77  .**   2.  Read/w
7850: 72 69 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  rite cursors for
7860: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
7870: 70 54 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65  pTab must be ope
7880: 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75  n as.**       cu
7890: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 49 64 78  rsor number iIdx
78a0: 43 75 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d  Cur+i for the i-
78b0: 74 68 20 69 6e 64 65 78 2e 20 20 28 54 68 65 20  th index.  (The 
78c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 0a 2a 2a 20  pTab->pIndex.** 
78d0: 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 74        index is t
78e0: 68 65 20 30 2d 74 68 20 69 6e 64 65 78 2e 29 0a  he 0-th index.).
78f0: 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20  **.**   3.  The 
7900: 22 69 44 61 74 61 43 75 72 22 20 63 75 72 73 6f  "iDataCur" curso
7910: 72 20 6d 75 73 74 20 62 65 20 61 6c 72 65 61 64  r must be alread
7920: 79 20 62 65 20 70 6f 73 69 74 69 6f 6e 65 64 20  y be positioned 
7930: 6f 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20  on the row.**   
7940: 20 20 20 20 74 68 61 74 20 69 73 20 74 6f 20 62      that is to b
7950: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f  e deleted..*/.vo
7960: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
7970: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
7980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7990: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
79a0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
79b0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
79c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
79d0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
79e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
79f0: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
7a00: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
7a10: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
7a20: 72 20 6f 66 20 74 61 62 6c 65 20 68 6f 6c 64 69  r of table holdi
7a30: 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 20 20 69 6e  ng data. */.  in
7a40: 74 20 69 49 64 78 43 75 72 2c 20 20 20 20 20 20  t iIdxCur,      
7a50: 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78 20   /* First index 
7a60: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
7a70: 2a 61 52 65 67 49 64 78 2c 20 20 20 20 20 20 2f  *aRegIdx,      /
7a80: 2a 20 4f 6e 6c 79 20 64 65 6c 65 74 65 20 69 66  * Only delete if
7a90: 20 61 52 65 67 49 64 78 21 3d 30 20 26 26 20 61   aRegIdx!=0 && a
7aa0: 52 65 67 49 64 78 5b 69 5d 3e 30 20 2a 2f 0a 20  RegIdx[i]>0 */. 
7ab0: 20 69 6e 74 20 69 49 64 78 4e 6f 53 65 65 6b 20   int iIdxNoSeek 
7ac0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65      /* Do not de
7ad0: 6c 65 74 65 20 66 72 6f 6d 20 74 68 69 73 20 63  lete from this c
7ae0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
7af0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7b00: 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20 63   /* Index loop c
7b10: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
7b20: 72 31 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f  r1 = -1;       /
7b30: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
7b40: 6e 67 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ng an index key 
7b50: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
7b60: 78 4c 61 62 65 6c 3b 20 2f 2a 20 4a 75 6d 70 20  xLabel; /* Jump 
7b70: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
7b80: 73 6b 69 70 70 69 6e 67 20 70 61 72 74 69 61 6c  skipping partial
7b90: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
7ba0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
7bb0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7bc0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 49 6e 64  t index */.  Ind
7bd0: 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 20  ex *pPrior = 0; 
7be0: 2f 2a 20 50 72 69 6f 72 20 69 6e 64 65 78 20 2a  /* Prior index *
7bf0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
7c00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
7c10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
7c20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7c30: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
7c40: 70 50 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  pPk;        /* P
7c50: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
7c60: 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 72 6f  , or NULL for ro
7c70: 77 69 64 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  wid tables */.. 
7c80: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
7c90: 62 65 3b 0a 20 20 70 50 6b 20 3d 20 48 61 73 52  be;.  pPk = HasR
7ca0: 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a  owid(pTab) ? 0 :
7cb0: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
7cc0: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
7cd0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70   for(i=0, pIdx=p
7ce0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
7cf0: 78 3b 20 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64  x; i++, pIdx=pId
7d00: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  x->pNext){.    a
7d10: 73 73 65 72 74 28 20 69 49 64 78 43 75 72 2b 69  ssert( iIdxCur+i
7d20: 21 3d 69 44 61 74 61 43 75 72 20 7c 7c 20 70 50  !=iDataCur || pP
7d30: 6b 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 69  k==pIdx );.    i
7d40: 66 28 20 61 52 65 67 49 64 78 21 3d 30 20 26 26  f( aRegIdx!=0 &&
7d50: 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 20 29   aRegIdx[i]==0 )
7d60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7d70: 66 28 20 70 49 64 78 3d 3d 70 50 6b 20 29 20 63  f( pIdx==pPk ) c
7d80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d90: 20 69 49 64 78 43 75 72 2b 69 3d 3d 69 49 64 78   iIdxCur+i==iIdx
7da0: 4e 6f 53 65 65 6b 20 29 20 63 6f 6e 74 69 6e 75  NoSeek ) continu
7db0: 65 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  e;.    VdbeModul
7dc0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 65  eComment((v, "Ge
7dd0: 6e 52 6f 77 49 64 78 44 65 6c 20 66 6f 72 20 25  nRowIdxDel for %
7de0: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
7df0: 29 3b 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  );.    r1 = sqli
7e00: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
7e10: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
7e20: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 31  , iDataCur, 0, 1
7e30: 2c 0a 20 20 20 20 20 20 20 20 26 69 50 61 72 74  ,.        &iPart
7e40: 49 64 78 4c 61 62 65 6c 2c 20 70 50 72 69 6f 72  IdxLabel, pPrior
7e50: 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
7e60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7e70: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 49  OP_IdxDelete, iI
7e80: 64 78 43 75 72 2b 69 2c 20 72 31 2c 0a 20 20 20  dxCur+i, r1,.   
7e90: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
7ea0: 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e  otNull ? pIdx->n
7eb0: 4b 65 79 43 6f 6c 20 3a 20 70 49 64 78 2d 3e 6e  KeyCol : pIdx->n
7ec0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
7ed0: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
7ee0: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
7ef0: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a  iPartIdxLabel);.
7f00: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
7f10: 78 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x;.  }.}../*.** 
7f20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
7f30: 61 74 20 77 69 6c 6c 20 61 73 73 65 6d 62 6c 65  at will assemble
7f40: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 61 6e   an index key an
7f50: 64 20 73 74 6f 72 65 73 20 69 74 20 69 6e 20 72  d stores it in r
7f60: 65 67 69 73 74 65 72 0a 2a 2a 20 72 65 67 4f 75  egister.** regOu
7f70: 74 2e 20 20 54 68 65 20 6b 65 79 20 77 69 74 68  t.  The key with
7f80: 20 62 65 20 66 6f 72 20 69 6e 64 65 78 20 70 49   be for index pI
7f90: 64 78 20 77 68 69 63 68 20 69 73 20 61 6e 20 69  dx which is an i
7fa0: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
7fb0: 20 69 43 75 72 20 69 73 20 74 68 65 20 69 6e 64   iCur is the ind
7fc0: 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f  ex of a cursor o
7fd0: 70 65 6e 20 6f 6e 20 74 68 65 20 70 54 61 62 20  pen on the pTab 
7fe0: 74 61 62 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69  table and pointi
7ff0: 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74  ng to.** the ent
8000: 72 79 20 74 68 61 74 20 6e 65 65 64 73 20 69 6e  ry that needs in
8010: 64 65 78 69 6e 67 2e 20 20 49 66 20 70 54 61 62  dexing.  If pTab
8020: 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f   is a WITHOUT RO
8030: 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  WID table, then.
8040: 2a 2a 20 69 43 75 72 20 6d 75 73 74 20 62 65 20  ** iCur must be 
8050: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
8060: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
8070: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  dex..**.** Retur
8080: 6e 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  n a register num
8090: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
80a0: 20 66 69 72 73 74 20 69 6e 20 61 20 62 6c 6f 63   first in a bloc
80b0: 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  k of.** register
80c0: 73 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  s that holds the
80d0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
80e0: 20 69 6e 64 65 78 20 6b 65 79 2e 20 20 54 68 65   index key.  The
80f0: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 72 65 67  .** block of reg
8100: 69 73 74 65 72 73 20 68 61 73 20 61 6c 72 65 61  isters has alrea
8110: 64 79 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  dy been dealloca
8120: 74 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 0a  ted by the time.
8130: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8140: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
8150: 66 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65  f *piPartIdxLabe
8160: 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 66  l is not NULL, f
8170: 69 6c 6c 20 69 74 20 69 6e 20 77 69 74 68 20 61  ill it in with a
8180: 20 6c 61 62 65 6c 20 61 6e 64 20 6a 75 6d 70 0a   label and jump.
8190: 2a 2a 20 74 6f 20 74 68 61 74 20 6c 61 62 65 6c  ** to that label
81a0: 20 69 66 20 70 49 64 78 20 69 73 20 61 20 70 61   if pIdx is a pa
81b0: 72 74 69 61 6c 20 69 6e 64 65 78 20 74 68 61 74  rtial index that
81c0: 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
81d0: 65 64 2e 0a 2a 2a 20 54 68 65 20 6c 61 62 65 6c  ed..** The label
81e0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c   should be resol
81f0: 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
8200: 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
8210: 61 62 65 6c 28 29 2e 0a 2a 2a 20 41 20 70 61 72  abel()..** A par
8220: 74 69 61 6c 20 69 6e 64 65 78 20 73 68 6f 75 6c  tial index shoul
8230: 64 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20  d be skipped if 
8240: 69 74 73 20 57 48 45 52 45 20 63 6c 61 75 73 65  its WHERE clause
8250: 20 65 76 61 6c 75 61 74 65 73 0a 2a 2a 20 74 6f   evaluates.** to
8260: 20 66 61 6c 73 65 20 6f 72 20 6e 75 6c 6c 2e 20   false or null. 
8270: 20 49 66 20 70 49 64 78 20 69 73 20 6e 6f 74 20   If pIdx is not 
8280: 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2c  a partial index,
8290: 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c   *piPartIdxLabel
82a0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
82b0: 74 6f 20 7a 65 72 6f 20 77 68 69 63 68 20 69 73  to zero which is
82c0: 20 61 6e 20 65 6d 70 74 79 20 6c 61 62 65 6c 20   an empty label 
82d0: 74 68 61 74 20 69 73 20 69 67 6e 6f 72 65 64 20  that is ignored 
82e0: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 52 65 73  by.** sqlite3Res
82f0: 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
8300: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  ()..**.** The pP
8310: 72 69 6f 72 20 61 6e 64 20 72 65 67 50 72 69 6f  rior and regPrio
8320: 72 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  r parameters are
8330: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
8340: 6e 74 20 61 20 63 61 63 68 65 20 74 6f 0a 2a 2a  nt a cache to.**
8350: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
8360: 72 79 20 72 65 67 69 73 74 65 72 20 6c 6f 61 64  ry register load
8370: 73 2e 20 20 49 66 20 70 50 72 69 6f 72 20 69 73  s.  If pPrior is
8380: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
8390: 69 74 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  it is.** a point
83a0: 65 72 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  er to a differen
83b0: 74 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63  t index for whic
83c0: 68 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 68  h an index key h
83d0: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
83e0: 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65  computed into re
83f0: 67 69 73 74 65 72 20 72 65 67 50 72 69 6f 72 2e  gister regPrior.
8400: 20 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74    If the current
8410: 20 70 49 64 78 20 69 6e 64 65 78 20 69 73 20 67   pIdx index is g
8420: 65 6e 65 72 61 74 69 6e 67 0a 2a 2a 20 69 74 73  enerating.** its
8430: 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 73 61   key into the sa
8440: 6d 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72  me sequence of r
8450: 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 66 20  egisters and if 
8460: 70 50 72 69 6f 72 20 61 6e 64 20 70 49 64 78 20  pPrior and pIdx 
8470: 73 68 61 72 65 0a 2a 2a 20 61 20 63 6f 6c 75 6d  share.** a colum
8480: 6e 20 69 6e 20 63 6f 6d 6d 6f 6e 2c 20 74 68 65  n in common, the
8490: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 63  n the register c
84a0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
84b0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6c 72 65  that column alre
84c0: 61 64 79 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65  ady.** holds the
84d0: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 61   correct value a
84e0: 6e 64 20 74 68 65 20 6c 6f 61 64 69 6e 67 20 6f  nd the loading o
84f0: 66 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  f that register 
8500: 69 73 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 20 54  is skipped..** T
8510: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
8520: 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 65 6e   is helpful when
8530: 20 64 6f 69 6e 67 20 61 20 44 45 4c 45 54 45 20   doing a DELETE 
8540: 6f 72 20 61 6e 20 49 4e 54 45 47 52 49 54 59 5f  or an INTEGRITY_
8550: 43 48 45 43 4b 20 0a 2a 2a 20 6f 6e 20 61 20 74  CHECK .** on a t
8560: 61 62 6c 65 20 77 69 74 68 20 6d 75 6c 74 69 70  able with multip
8570: 6c 65 20 69 6e 64 69 63 65 73 2c 20 61 6e 64 20  le indices, and 
8580: 65 73 70 65 63 69 61 6c 6c 79 20 77 69 74 68 20  especially with 
8590: 74 68 65 20 52 4f 57 49 44 20 6f 72 0a 2a 2a 20  the ROWID or.** 
85a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
85b0: 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
85c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
85d0: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
85e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
85f0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8600: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8610: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
8620: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
8630: 65 78 20 66 6f 72 20 77 68 69 63 68 20 74 6f 20  ex for which to 
8640: 67 65 6e 65 72 61 74 65 20 61 20 6b 65 79 20 2a  generate a key *
8650: 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
8660: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ,        /* Curs
8670: 6f 72 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 77  or number from w
8680: 68 69 63 68 20 74 6f 20 74 61 6b 65 20 63 6f 6c  hich to take col
8690: 75 6d 6e 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  umn data */.  in
86a0: 74 20 72 65 67 4f 75 74 2c 20 20 20 20 20 20 20  t regOut,       
86b0: 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 65     /* Put the ne
86c0: 77 20 6b 65 79 20 69 6e 74 6f 20 74 68 69 73 20  w key into this 
86d0: 72 65 67 69 73 74 65 72 20 69 66 20 6e 6f 74 20  register if not 
86e0: 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 66 69  0 */.  int prefi
86f0: 78 4f 6e 6c 79 2c 20 20 20 20 20 20 2f 2a 20 43  xOnly,      /* C
8700: 6f 6d 70 75 74 65 20 6f 6e 6c 79 20 61 20 75 6e  ompute only a un
8710: 69 71 75 65 20 70 72 65 66 69 78 20 6f 66 20 74  ique prefix of t
8720: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  he key */.  int 
8730: 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  *piPartIdxLabel,
8740: 20 2f 2a 20 4f 55 54 3a 20 4a 75 6d 70 20 74 6f   /* OUT: Jump to
8750: 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
8760: 6b 69 70 20 70 61 72 74 69 61 6c 20 69 6e 64 65  kip partial inde
8770: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  x */.  Index *pP
8780: 72 69 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 50  rior,       /* P
8790: 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61  reviously genera
87a0: 74 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ted index key */
87b0: 0a 20 20 69 6e 74 20 72 65 67 50 72 69 6f 72 20  .  int regPrior 
87c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
87d0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 70 72 65 76  ter holding prev
87e0: 69 6f 75 73 20 67 65 6e 65 72 61 74 65 64 20 6b  ious generated k
87f0: 65 79 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ey */.){.  Vdbe 
8800: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8810: 62 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  be;.  int j;.  i
8820: 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 69 6e  nt regBase;.  in
8830: 74 20 6e 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70  t nCol;..  if( p
8840: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 20 29 7b  iPartIdxLabel ){
8850: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70  .    if( pIdx->p
8860: 50 61 72 74 49 64 78 57 68 65 72 65 20 29 7b 0a  PartIdxWhere ){.
8870: 20 20 20 20 20 20 2a 70 69 50 61 72 74 49 64 78        *piPartIdx
8880: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
8890: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
88a0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69  .      pParse->i
88b0: 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43  SelfTab = iDataC
88c0: 75 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  ur + 1;.      sq
88d0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
88e0: 44 75 70 28 70 50 61 72 73 65 2c 20 70 49 64 78  Dup(pParse, pIdx
88f0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
8900: 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c   *piPartIdxLabel
8910: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8930: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
8940: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8950: 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
8960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8970: 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c 20  *piPartIdxLabel 
8980: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
8990: 20 6e 43 6f 6c 20 3d 20 28 70 72 65 66 69 78 4f   nCol = (prefixO
89a0: 6e 6c 79 20 26 26 20 70 49 64 78 2d 3e 75 6e 69  nly && pIdx->uni
89b0: 71 4e 6f 74 4e 75 6c 6c 29 20 3f 20 70 49 64 78  qNotNull) ? pIdx
89c0: 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 70 49 64 78  ->nKeyCol : pIdx
89d0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 72 65 67  ->nColumn;.  reg
89e0: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
89f0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
8a00: 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  e, nCol);.  if( 
8a10: 70 50 72 69 6f 72 20 26 26 20 28 72 65 67 42 61  pPrior && (regBa
8a20: 73 65 21 3d 72 65 67 50 72 69 6f 72 20 7c 7c 20  se!=regPrior || 
8a30: 70 50 72 69 6f 72 2d 3e 70 50 61 72 74 49 64 78  pPrior->pPartIdx
8a40: 57 68 65 72 65 29 20 29 20 70 50 72 69 6f 72 20  Where) ) pPrior 
8a50: 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  = 0;.  for(j=0; 
8a60: 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nCol; j++){.  
8a70: 20 20 69 66 28 20 70 50 72 69 6f 72 0a 20 20 20    if( pPrior.   
8a80: 20 20 26 26 20 70 50 72 69 6f 72 2d 3e 61 69 43    && pPrior->aiC
8a90: 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 49 64 78 2d 3e  olumn[j]==pIdx->
8aa0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20  aiColumn[j].    
8ab0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 61 69 43 6f   && pPrior->aiCo
8ac0: 6c 75 6d 6e 5b 6a 5d 21 3d 58 4e 5f 45 58 50 52  lumn[j]!=XN_EXPR
8ad0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
8ae0: 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20 77 61 73   This column was
8af0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 75 74 65   already compute
8b00: 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
8b10: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  s index */.     
8b20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
8b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8b40: 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
8b50: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 49 64 78  umn(pParse, pIdx
8b60: 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c 20 72  , iDataCur, j, r
8b70: 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 2f  egBase+j);.    /
8b80: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
8b90: 61 66 66 69 6e 69 74 79 20 69 73 20 52 45 41 4c  affinity is REAL
8ba0: 20 62 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   but the number 
8bb0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
8bc0: 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 69  hen it.    ** mi
8bd0: 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
8be0: 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 61 6e   the table as an
8bf0: 20 69 6e 74 65 67 65 72 20 28 75 73 69 6e 67 20   integer (using 
8c00: 61 20 63 6f 6d 70 61 63 74 0a 20 20 20 20 2a 2a  a compact.    **
8c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
8c20: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   then converted 
8c30: 74 6f 20 52 45 41 4c 20 62 79 20 61 6e 20 4f 50  to REAL by an OP
8c40: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 6f 70  _RealAffinity op
8c50: 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 20 42 75 74  code..    ** But
8c60: 20 77 65 20 61 72 65 20 67 65 74 74 69 6e 67 20   we are getting 
8c70: 72 65 61 64 79 20 74 6f 20 73 74 6f 72 65 20 74  ready to store t
8c80: 68 69 73 20 76 61 6c 75 65 20 62 61 63 6b 20 69  his value back i
8c90: 6e 74 6f 20 61 6e 20 69 6e 64 65 78 2c 20 77 68  nto an index, wh
8ca0: 65 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 73 68  ere.    ** it sh
8cb0: 6f 75 6c 64 20 62 65 20 63 6f 6e 76 65 72 74 65  ould be converte
8cc0: 64 20 62 79 20 74 6f 20 49 4e 54 45 47 45 52 20  d by to INTEGER 
8cd0: 61 67 61 69 6e 2e 20 20 53 6f 20 6f 6d 69 74 20  again.  So omit 
8ce0: 74 68 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  the OP_RealAffin
8cf0: 69 74 79 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64  ity.    ** opcod
8d00: 65 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  e if it is prese
8d10: 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
8d20: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
8d30: 4f 70 63 6f 64 65 28 76 2c 20 4f 50 5f 52 65 61  Opcode(v, OP_Rea
8d40: 6c 41 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  lAffinity);.  }.
8d50: 20 20 69 66 28 20 72 65 67 4f 75 74 20 29 7b 0a    if( regOut ){.
8d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8d70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8d80: 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
8d90: 20 6e 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   nCol, regOut);.
8da0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 54      if( pIdx->pT
8db0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
8dc0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8dd0: 72 20 2a 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  r *zAff = sqlite
8de0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
8df0: 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  r(pParse->db, pI
8e00: 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dx);.      sqlit
8e10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
8e20: 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 50 34 5f 54  , -1, zAff, P4_T
8e30: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
8e40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
8e50: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8e60: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
8e70: 6e 43 6f 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCol);.  return 
8e80: 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  regBase;.}../*.*
8e90: 2a 20 49 66 20 61 20 70 72 69 6f 72 20 63 61 6c  * If a prior cal
8ea0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65  l to sqlite3Gene
8eb0: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 20 67  rateIndexKey() g
8ec0: 65 6e 65 72 61 74 65 64 20 61 20 6a 75 6d 70 2d  enerated a jump-
8ed0: 6f 76 65 72 20 6c 61 62 65 6c 0a 2a 2a 20 62 65  over label.** be
8ee0: 63 61 75 73 65 20 69 74 20 77 61 73 20 61 20 70  cause it was a p
8ef0: 61 72 74 69 61 6c 20 69 6e 64 65 78 2c 20 74 68  artial index, th
8f00: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8f10: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
8f20: 20 74 6f 0a 2a 2a 20 72 65 73 6f 6c 76 65 20 74   to.** resolve t
8f30: 68 61 74 20 6c 61 62 65 6c 2e 0a 2a 2f 0a 76 6f  hat label..*/.vo
8f40: 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  id sqlite3Resolv
8f50: 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 50 61  ePartIdxLabel(Pa
8f60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8f70: 20 69 4c 61 62 65 6c 29 7b 0a 20 20 69 66 28 20   iLabel){.  if( 
8f80: 69 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 73 71  iLabel ){.    sq
8f90: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
8fa0: 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56  Label(pParse->pV
8fb0: 64 62 65 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20  dbe, iLabel);.  
8fc0: 7d 0a 7d 0a                                      }.}.