/ Hex Artifact Content
Login

Artifact 2ddd40f4b04647e85e4e8665e552b96971cd0026f7e6431ac9c1ce249d1d9161:


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 28 70 50 61  !=0.     && (pPa
0920: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
0930: 20 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63   (SQLITE_WriteSc
0940: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
0950: 6e 73 69 76 65 29 29 3d 3d 30 0a 20 20 20 20 20  nsive))==0.     
0960: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
0970: 64 3d 3d 30 20 29 0a 20 20 29 7b 0a 20 20 20 20  d==0 ).  ){.    
0980: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
0990: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
09a0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64  s may not be mod
09b0: 69 66 69 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  ified", pTab->zN
09c0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
09d0: 20 31 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66   1;.  }..#ifndef
09e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
09f0: 57 0a 20 20 69 66 28 20 21 76 69 65 77 4f 6b 20  W.  if( !viewOk 
0a00: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
0a10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0a20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
0a30: 63 61 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 25 73  cannot modify %s
0a40: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
0a50: 20 76 69 65 77 22 2c 70 54 61 62 2d 3e 7a 4e 61   view",pTab->zNa
0a60: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
0a70: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
0a80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 23 69  return 0;.}...#i
0a90: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
0aa0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20  E_OMIT_VIEW) && 
0ab0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0ac0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 2f 2a  OMIT_TRIGGER)./*
0ad0: 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 20 76  .** Evaluate a v
0ae0: 69 65 77 20 61 6e 64 20 73 74 6f 72 65 20 69 74  iew and store it
0af0: 73 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  s result in an e
0b00: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
0b10: 20 54 68 65 0a 2a 2a 20 70 57 68 65 72 65 20 61   The.** pWhere a
0b20: 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 6f 70  rgument is an op
0b30: 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  tional WHERE cla
0b40: 75 73 65 20 74 68 61 74 20 72 65 73 74 72 69 63  use that restric
0b50: 74 73 20 74 68 65 0a 2a 2a 20 73 65 74 20 6f 66  ts the.** set of
0b60: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76 69 65   rows in the vie
0b70: 77 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65  w that are to be
0b80: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 70   added to the ep
0b90: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
0ba0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
0bb0: 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 0a 20  terializeView(. 
0bc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0be0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
0bf0: 62 6c 65 20 2a 70 56 69 65 77 2c 20 20 20 20 20  ble *pView,     
0c00: 20 20 20 2f 2a 20 56 69 65 77 20 64 65 66 69 6e     /* View defin
0c10: 69 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ition */.  Expr 
0c20: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0c30: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 57 48 45 52  /* Optional WHER
0c40: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
0c50: 64 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  dded */.  ExprLi
0c60: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 2f  st *pOrderBy,  /
0c70: 2a 20 4f 70 74 69 6f 6e 61 6c 20 4f 52 44 45 52  * Optional ORDER
0c80: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0c90: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0ca0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
0cb0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
0cc0: 0a 20 20 69 6e 74 20 69 43 75 72 20 20 20 20 20  .  int iCur     
0cd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0ce0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 65 70 68  r number for eph
0cf0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  emeral table */.
0d00: 29 7b 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  ){.  SelectDest 
0d10: 64 65 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  dest;.  Select *
0d20: 70 53 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  pSel;.  SrcList 
0d30: 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
0d40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0d50: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  db;.  int iDb = 
0d60: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
0d70: 6e 64 65 78 28 64 62 2c 20 70 56 69 65 77 2d 3e  ndex(db, pView->
0d80: 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 57 68 65  pSchema);.  pWhe
0d90: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
0da0: 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20  Dup(db, pWhere, 
0db0: 30 29 3b 0a 20 20 70 46 72 6f 6d 20 3d 20 73 71  0);.  pFrom = sq
0dc0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
0dd0: 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
0de0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 20 29 7b 0a  .  if( pFrom ){.
0df0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
0e00: 6d 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  m->nSrc==1 );.  
0e10: 20 20 70 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 7a 4e    pFrom->a[0].zN
0e20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
0e30: 74 72 44 75 70 28 64 62 2c 20 70 56 69 65 77 2d  trDup(db, pView-
0e40: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 46 72  >zName);.    pFr
0e50: 6f 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  om->a[0].zDataba
0e60: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
0e70: 72 44 75 70 28 64 62 2c 20 64 62 2d 3e 61 44 62  rDup(db, db->aDb
0e80: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b  [iDb].zDbSName);
0e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
0ea0: 6f 6d 2d 3e 61 5b 30 5d 2e 70 4f 6e 3d 3d 30 20  om->a[0].pOn==0 
0eb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
0ec0: 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 70 55 73 69 6e  From->a[0].pUsin
0ed0: 67 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 53  g==0 );.  }.  pS
0ee0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
0ef0: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c  ctNew(pParse, 0,
0f00: 20 70 46 72 6f 6d 2c 20 70 57 68 65 72 65 2c 20   pFrom, pWhere, 
0f10: 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
0f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f30: 20 20 20 20 20 20 20 20 20 20 20 53 46 5f 49 6e             SF_In
0f40: 63 6c 75 64 65 48 69 64 64 65 6e 2c 20 70 4c 69  cludeHidden, pLi
0f50: 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  mit);.  sqlite3S
0f60: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
0f70: 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
0f80: 62 2c 20 69 43 75 72 29 3b 0a 20 20 73 71 6c 69  b, iCur);.  sqli
0f90: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
0fa0: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 3b 0a  , pSel, &dest);.
0fb0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
0fc0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
0fd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
0fe0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0ff0: 54 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69  T_VIEW) && !defi
1000: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1010: 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 23 69 66  TRIGGER) */..#if
1020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1030: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
1040: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21  LETE_LIMIT) && !
1050: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1060: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
1070: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1080: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
1090: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
10a0: 20 57 48 45 52 45 2c 20 4f 52 44 45 52 20 42 59   WHERE, ORDER BY
10b0: 2c 0a 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 2f 4f  ,.** and LIMIT/O
10c0: 46 46 53 45 54 20 70 6f 72 74 69 6f 6e 20 6f 66  FFSET portion of
10d0: 20 44 45 4c 45 54 45 20 61 6e 64 20 55 50 44 41   DELETE and UPDA
10e0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  TE statements..*
10f0: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
1100: 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a 20  FROM table_wxyz 
1110: 57 48 45 52 45 20 61 3c 35 20 4f 52 44 45 52 20  WHERE a<5 ORDER 
1120: 42 59 20 61 20 4c 49 4d 49 54 20 31 3b 0a 2a 2a  BY a LIMIT 1;.**
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1150: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1160: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74            pLimit
1190: 57 68 65 72 65 20 28 70 49 6e 43 6c 61 75 73 65  Where (pInClause
11a0: 29 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ).*/.Expr *sqlit
11b0: 65 33 4c 69 6d 69 74 57 68 65 72 65 28 0a 20 20  e3LimitWhere(.  
11c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
11f0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1200: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
1210: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
1220: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
1230: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
1240: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1250: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1260: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1270: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
1280: 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ull */.  ExprLis
1290: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
12a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
12b0: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
12c0: 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20  ay be null */.  
12d0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
1300: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
1310: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 54  /.  char *zStmtT
1320: 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ype             
1330: 20 2f 2a 20 45 69 74 68 65 72 20 44 45 4c 45 54   /* Either DELET
1340: 45 20 6f 72 20 55 50 44 41 54 45 2e 20 20 46 6f  E or UPDATE.  Fo
1350: 72 20 65 72 72 20 6d 73 67 73 2e 20 2a 2f 0a 29  r err msgs. */.)
1360: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1370: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1380: 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 4e 55 4c  Expr *pLhs = NUL
1390: 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  L;           /* 
13a0: 4c 48 53 20 6f 66 20 49 4e 28 53 45 4c 45 43 54  LHS of IN(SELECT
13b0: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ...) operator */
13c0: 0a 20 20 45 78 70 72 20 2a 70 49 6e 43 6c 61 75  .  Expr *pInClau
13d0: 73 65 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  se = NULL;      
13e0: 2f 2a 20 57 48 45 52 45 20 72 6f 77 69 64 20 49  /* WHERE rowid I
13f0: 4e 20 28 20 73 65 6c 65 63 74 20 29 20 2a 2f 0a  N ( select ) */.
1400: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1410: 73 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f  st = NULL;     /
1420: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
1430: 74 20 63 6f 6e 74 61 6e 69 6e 67 20 6f 6e 6c 79  t contaning only
1440: 20 70 53 65 6c 65 63 74 52 6f 77 69 64 20 2a 2f   pSelectRowid */
1450: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 65 6c  .  SrcList *pSel
1460: 65 63 74 53 72 63 20 3d 20 4e 55 4c 4c 3b 20 20  ectSrc = NULL;  
1470: 2f 2a 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20  /* SELECT rowid 
1480: 46 52 4f 4d 20 78 20 2e 2e 2e 20 28 64 75 70 20  FROM x ... (dup 
1490: 6f 66 20 70 53 72 63 29 20 2a 2f 0a 20 20 53 65  of pSrc) */.  Se
14a0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
14b0: 4e 55 4c 4c 3b 20 20 20 20 20 20 2f 2a 20 43 6f  NULL;      /* Co
14c0: 6d 70 6c 65 74 65 20 53 45 4c 45 43 54 20 74 72  mplete SELECT tr
14d0: 65 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ee */.  Table *p
14e0: 54 61 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  Tab;..  /* Check
14f0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 6e 27   that there isn'
1500: 74 20 61 6e 20 4f 52 44 45 52 20 42 59 20 77 69  t an ORDER BY wi
1510: 74 68 6f 75 74 20 61 20 4c 49 4d 49 54 20 63 6c  thout a LIMIT cl
1520: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
1530: 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4c 69   pOrderBy && pLi
1540: 6d 69 74 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73  mit==0 ) {.    s
1550: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1560: 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59  Parse, "ORDER BY
1570: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 20 6f   without LIMIT o
1580: 6e 20 25 73 22 2c 20 7a 53 74 6d 74 54 79 70 65  n %s", zStmtType
1590: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
15a0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
15b0: 3e 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  >db, pWhere);.  
15c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15d0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
15e0: 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  db, pOrderBy);. 
15f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1600: 0a 0a 20 20 2f 2a 20 57 65 20 6f 6e 6c 79 20 6e  ..  /* We only n
1610: 65 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  eed to generate 
1620: 61 20 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  a select express
1630: 69 6f 6e 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ion if there.  *
1640: 2a 20 69 73 20 61 20 6c 69 6d 69 74 2f 6f 66 66  * is a limit/off
1650: 73 65 74 20 74 65 72 6d 20 74 6f 20 65 6e 66 6f  set term to enfo
1660: 72 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rce..  */.  if( 
1670: 70 4c 69 6d 69 74 20 3d 3d 20 30 20 29 20 7b 0a  pLimit == 0 ) {.
1680: 20 20 20 20 72 65 74 75 72 6e 20 70 57 68 65 72      return pWher
1690: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
16a0: 65 72 61 74 65 20 61 20 73 65 6c 65 63 74 20 65  erate a select e
16b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 74  xpression tree t
16c0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 6c 69  o enforce the li
16d0: 6d 69 74 2f 6f 66 66 73 65 74 20 0a 20 20 2a 2a  mit/offset .  **
16e0: 20 74 65 72 6d 20 66 6f 72 20 74 68 65 20 44 45   term for the DE
16f0: 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
1700: 74 61 74 65 6d 65 6e 74 2e 20 20 46 6f 72 20 65  tatement.  For e
1710: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 20 20 20 44  xample:.  **   D
1720: 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65  ELETE FROM table
1730: 5f 61 20 57 48 45 52 45 20 63 6f 6c 31 3d 31 20  _a WHERE col1=1 
1740: 4f 52 44 45 52 20 42 59 20 63 6f 6c 32 20 4c 49  ORDER BY col2 LI
1750: 4d 49 54 20 31 20 4f 46 46 53 45 54 20 31 0a 20  MIT 1 OFFSET 1. 
1760: 20 2a 2a 20 62 65 63 6f 6d 65 73 3a 0a 20 20 2a   ** becomes:.  *
1770: 2a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  *   DELETE FROM 
1780: 74 61 62 6c 65 5f 61 20 57 48 45 52 45 20 72 6f  table_a WHERE ro
1790: 77 69 64 20 49 4e 20 28 20 0a 20 20 2a 2a 20 20  wid IN ( .  **  
17a0: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20     SELECT rowid 
17b0: 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45  FROM table_a WHE
17c0: 52 45 20 63 6f 6c 31 3d 31 20 4f 52 44 45 52 20  RE col1=1 ORDER 
17d0: 42 59 20 63 6f 6c 32 20 4c 49 4d 49 54 20 31 20  BY col2 LIMIT 1 
17e0: 4f 46 46 53 45 54 20 31 0a 20 20 2a 2a 20 20 20  OFFSET 1.  **   
17f0: 29 3b 0a 20 20 2a 2f 0a 0a 20 20 70 54 61 62 20  );.  */..  pTab 
1800: 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
1810: 62 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  b;.  if( HasRowi
1820: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
1830: 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 50 45 78  Lhs = sqlite3PEx
1840: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 4f  pr(pParse, TK_RO
1850: 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 45  W, 0, 0);.    pE
1860: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1870: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
1880: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 30 2c        pParse, 0,
1890: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
18a0: 61 72 73 65 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c  arse, TK_ROW, 0,
18b0: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c   0).    );.  }el
18c0: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
18d0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
18e0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
18f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 2d 3e  );.    if( pPk->
1900: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20  nKeyCol==1 ){.  
1910: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1920: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
1930: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
1940: 5b 30 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [0]].zName;.    
1950: 20 20 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    pLhs = sqlite3
1960: 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1970: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 45  zName);.      pE
1980: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1990: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
19a0: 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
19b0: 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
19c0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Name));.    }els
19d0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
19e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19f0: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
1a00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
1a10: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
1a20: 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 70 54  pr(db, TK_ID, pT
1a30: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
1a40: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
1a50: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
1a60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1a70: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1a80: 2c 20 70 45 4c 69 73 74 2c 20 70 29 3b 0a 20 20  , pEList, p);.  
1a90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 68 73      }.      pLhs
1aa0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ab0: 70 50 61 72 73 65 2c 20 54 4b 5f 56 45 43 54 4f  pParse, TK_VECTO
1ac0: 52 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  R, 0, 0);.      
1ad0: 69 66 28 20 70 4c 68 73 20 29 7b 0a 20 20 20 20  if( pLhs ){.    
1ae0: 20 20 20 20 70 4c 68 73 2d 3e 78 2e 70 4c 69 73      pLhs->x.pLis
1af0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1b00: 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
1b10: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
1b20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 64     }.  }..  /* d
1b30: 75 70 6c 69 63 61 74 65 20 74 68 65 20 46 52 4f  uplicate the FRO
1b40: 4d 20 63 6c 61 75 73 65 20 61 73 20 69 74 20 69  M clause as it i
1b50: 73 20 6e 65 65 64 65 64 20 62 79 20 62 6f 74 68  s needed by both
1b60: 20 74 68 65 20 44 45 4c 45 54 45 2f 55 50 44 41   the DELETE/UPDA
1b70: 54 45 20 74 72 65 65 0a 20 20 2a 2a 20 61 6e 64  TE tree.  ** and
1b80: 20 74 68 65 20 53 45 4c 45 43 54 20 73 75 62 74   the SELECT subt
1b90: 72 65 65 2e 20 2a 2f 0a 20 20 70 53 72 63 2d 3e  ree. */.  pSrc->
1ba0: 61 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20  a[0].pTab = 0;. 
1bb0: 20 70 53 65 6c 65 63 74 53 72 63 20 3d 20 73 71   pSelectSrc = sq
1bc0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
1bd0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 72 63  pParse->db, pSrc
1be0: 2c 20 30 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b  , 0);.  pSrc->a[
1bf0: 30 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  0].pTab = pTab;.
1c00: 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 49 42    pSrc->a[0].pIB
1c10: 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Index = 0;..  /*
1c20: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 53 45   generate the SE
1c30: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 20  LECT expression 
1c40: 74 72 65 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65  tree. */.  pSele
1c50: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
1c60: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20 70 45  ctNew(pParse, pE
1c70: 4c 69 73 74 2c 20 70 53 65 6c 65 63 74 53 72 63  List, pSelectSrc
1c80: 2c 20 70 57 68 65 72 65 2c 20 30 20 2c 30 2c 20  , pWhere, 0 ,0, 
1c90: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c  .      pOrderBy,
1ca0: 30 2c 70 4c 69 6d 69 74 0a 20 20 29 3b 0a 0a 20  0,pLimit.  );.. 
1cb0: 20 2f 2a 20 6e 6f 77 20 67 65 6e 65 72 61 74 65   /* now generate
1cc0: 20 74 68 65 20 6e 65 77 20 57 48 45 52 45 20 72   the new WHERE r
1cd0: 6f 77 69 64 20 49 4e 20 63 6c 61 75 73 65 20 66  owid IN clause f
1ce0: 6f 72 20 74 68 65 20 44 45 4c 45 54 45 2f 55 44  or the DELETE/UD
1cf0: 50 41 54 45 20 2a 2f 0a 20 20 70 49 6e 43 6c 61  PATE */.  pInCla
1d00: 75 73 65 20 3d 20 73 71 6c 69 74 65 33 50 45 78  use = sqlite3PEx
1d10: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
1d20: 2c 20 70 4c 68 73 2c 20 30 29 3b 0a 20 20 73 71  , pLhs, 0);.  sq
1d30: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
1d40: 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 6e 43  ect(pParse, pInC
1d50: 6c 61 75 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  lause, pSelect);
1d60: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 43 6c 61  .  return pInCla
1d70: 75 73 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  use;.}.#endif /*
1d80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d90: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
1da0: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 2a 2f 0a 20  LETE_LIMIT) */. 
1db0: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 26 26        /*      &&
1dc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1dd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1de0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
1df0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 44 45  te code for a DE
1e00: 4c 45 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d  LETE FROM statem
1e10: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  ent..**.**     D
1e20: 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65  ELETE FROM table
1e30: 5f 77 78 79 7a 20 57 48 45 52 45 20 61 3c 35 20  _wxyz WHERE a<5 
1e40: 41 4e 44 20 62 20 4e 4f 54 20 4e 55 4c 4c 3b 0a  AND b NOT NULL;.
1e50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e60: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
1e70: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1e80: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
1e90: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
1ea0: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1eb0: 20 70 57 68 65 72 65 0a 2a 2f 0a 76 6f 69 64 20   pWhere.*/.void 
1ec0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f  sqlite3DeleteFro
1ed0: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1ee0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1ef0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1f00: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1f10: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 2f 2a  pTabList,     /*
1f20: 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   The table from 
1f30: 77 68 69 63 68 20 77 65 20 73 68 6f 75 6c 64 20  which we should 
1f40: 64 65 6c 65 74 65 20 74 68 69 6e 67 73 20 2a 2f  delete things */
1f50: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1f80: 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20  May be null */. 
1f90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1fa0: 72 42 79 2c 20 20 20 20 2f 2a 20 4f 52 44 45 52  rBy,    /* ORDER
1fb0: 20 42 59 20 63 6c 61 75 73 65 2e 20 4d 61 79 20   BY clause. May 
1fc0: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70  be null */.  Exp
1fd0: 72 20 2a 70 4c 69 6d 69 74 20 20 20 20 20 20 20  r *pLimit       
1fe0: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6c 61      /* LIMIT cla
1ff0: 75 73 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c  use. May be null
2000: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
2010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2020: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
2030: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
2040: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2060: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
2070: 63 68 20 72 65 63 6f 72 64 73 20 77 69 6c 6c 20  ch records will 
2080: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
2090: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
20a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20b0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72  ounter */.  Wher
20c0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
20d0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
20e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
20f0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  E clause */.  In
2100: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
2110: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2120: 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73  ing over indices
2130: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
2140: 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20  .  int iTabCur; 
2150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2160: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2170: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
2180: 74 20 69 44 61 74 61 43 75 72 20 3d 20 30 3b 20  t iDataCur = 0; 
2190: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
21a0: 73 6f 72 20 66 6f 72 20 74 68 65 20 63 61 6e 6f  sor for the cano
21b0: 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75 72 63  nical data sourc
21c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
21d0: 75 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ur = 0;       /*
21e0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
21f0: 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65  f the first inde
2200: 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b  x */.  int nIdx;
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2220: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63   Number of indic
2230: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
2240: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
2250: 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * Main database 
2260: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 41  structure */.  A
2270: 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74  uthContext sCont
2280: 65 78 74 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69  ext;  /* Authori
2290: 7a 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  zation context *
22a0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
22b0: 73 4e 43 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  sNC;       /* Na
22c0: 6d 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  me context to re
22d0: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
22e0: 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  s in */.  int iD
22f0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2300: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
2310: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  ber */.  int mem
2320: 43 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Cnt = 0;        
2330: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75  /* Memory cell u
2340: 73 65 64 20 66 6f 72 20 63 68 61 6e 67 65 20 63  sed for change c
2350: 6f 75 6e 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ounting */.  int
2360: 20 72 63 61 75 74 68 3b 20 20 20 20 20 20 20 20   rcauth;        
2370: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
2380: 75 72 6e 65 64 20 62 79 20 61 75 74 68 6f 72 69  urned by authori
2390: 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  zation callback 
23a0: 2a 2f 0a 20 20 69 6e 74 20 65 4f 6e 65 50 61 73  */.  int eOnePas
23b0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s;          /* O
23c0: 4e 45 50 41 53 53 5f 4f 46 46 20 6f 72 20 5f 53  NEPASS_OFF or _S
23d0: 49 4e 47 4c 45 20 6f 72 20 5f 4d 55 4c 54 49 20  INGLE or _MULTI 
23e0: 2a 2f 0a 20 20 69 6e 74 20 61 69 43 75 72 4f 6e  */.  int aiCurOn
23f0: 65 50 61 73 73 5b 32 5d 3b 20 20 20 2f 2a 20 54  ePass[2];   /* T
2400: 68 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  he write cursors
2410: 20 6f 70 65 6e 65 64 20 62 79 20 57 48 45 52 45   opened by WHERE
2420: 5f 4f 4e 45 50 41 53 53 20 2a 2f 0a 20 20 75 38  _ONEPASS */.  u8
2430: 20 2a 61 54 6f 4f 70 65 6e 20 3d 20 30 3b 20 20   *aToOpen = 0;  
2440: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 75 72       /* Open cur
2450: 73 6f 72 20 69 54 61 62 43 75 72 2b 6a 20 69 66  sor iTabCur+j if
2460: 20 61 54 6f 4f 70 65 6e 5b 6a 5d 20 69 73 20 74   aToOpen[j] is t
2470: 72 75 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  rue */.  Index *
2480: 70 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPk;            
2490: 2f 2a 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b  /* The PRIMARY K
24a0: 45 59 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  EY index on the 
24b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
24c0: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
24d0: 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 6e 50    /* First of nP
24e0: 6b 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64  k registers hold
24f0: 69 6e 67 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ing PRIMARY KEY 
2500: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 31 36 20 6e  value */.  i16 n
2510: 50 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  Pk = 1;         
2520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2530: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 50 52  olumns in the PR
2540: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69  IMARY KEY */.  i
2550: 6e 74 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  nt iKey;        
2560: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
2570: 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79  cell holding key
2580: 20 6f 66 20 72 6f 77 20 74 6f 20 62 65 20 64 65   of row to be de
2590: 6c 65 74 65 64 20 2a 2f 0a 20 20 69 31 36 20 6e  leted */.  i16 n
25a0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
25b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
25c0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74  emory cells in t
25d0: 68 65 20 72 6f 77 20 6b 65 79 20 2a 2f 0a 20 20  he row key */.  
25e0: 69 6e 74 20 69 45 70 68 43 75 72 20 3d 20 30 3b  int iEphCur = 0;
25f0: 20 20 20 20 20 20 20 2f 2a 20 45 70 68 65 6d 65         /* Epheme
2600: 72 61 6c 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ral table holdin
2610: 67 20 61 6c 6c 20 70 72 69 6d 61 72 79 20 6b 65  g all primary ke
2620: 79 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  y values */.  in
2630: 74 20 69 52 6f 77 53 65 74 20 3d 20 30 3b 20 20  t iRowSet = 0;  
2640: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
2650: 20 66 6f 72 20 72 6f 77 73 65 74 20 6f 66 20 72   for rowset of r
2660: 6f 77 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ows to delete */
2670: 0a 20 20 69 6e 74 20 61 64 64 72 42 79 70 61 73  .  int addrBypas
2680: 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 64 64  s = 0;    /* Add
2690: 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 76 65  ress of jump ove
26a0: 72 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f 67  r the delete log
26b0: 69 63 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ic */.  int addr
26c0: 4c 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  Loop = 0;      /
26d0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 64 65 6c  * Top of the del
26e0: 65 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ete loop */.  in
26f0: 74 20 61 64 64 72 45 70 68 4f 70 65 6e 20 3d 20  t addrEphOpen = 
2700: 30 3b 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74  0;   /* Instruct
2710: 69 6f 6e 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ion to open the 
2720: 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2730: 2a 2f 0a 20 20 69 6e 74 20 62 43 6f 6d 70 6c 65  */.  int bComple
2740: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
2750: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
2760: 20 74 72 69 67 67 65 72 73 20 6f 72 20 46 4b 73   triggers or FKs
2770: 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2790: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
27a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
27b0: 2f 0a 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /. .#ifndef SQLI
27c0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
27d0: 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20    int isView;   
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f0: 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d 70  * True if attemp
2800: 74 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 66  ting to delete f
2810: 72 6f 6d 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  rom a view */.  
2820: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
2830: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2840: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 20 74 72  List of table tr
2850: 69 67 67 65 72 73 2c 20 69 66 20 72 65 71 75 69  iggers, if requi
2860: 72 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  red */.#endif.. 
2870: 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78   memset(&sContex
2880: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f  t, 0, sizeof(sCo
2890: 6e 74 65 78 74 29 29 3b 0a 20 20 64 62 20 3d 20  ntext));.  db = 
28a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
28b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28c0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28d0: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  ed ){.    goto d
28e0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
28f0: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
2900: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2910: 3d 3d 31 20 29 3b 0a 0a 0a 20 20 2f 2a 20 4c 6f  ==1 );...  /* Lo
2920: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 77  cate the table w
2930: 68 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20  hich we want to 
2940: 64 65 6c 65 74 65 2e 20 20 54 68 69 73 20 74 61  delete.  This ta
2950: 62 6c 65 20 68 61 73 20 74 6f 20 62 65 0a 20 20  ble has to be.  
2960: 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20 53 72 63  ** put in an Src
2970: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 62  List structure b
2980: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20 74  ecause some of t
2990: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  he subroutines w
29a0: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63  e.  ** will be c
29b0: 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73 69 67  alling are desig
29c0: 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69 74 68  ned to work with
29d0: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
29e0: 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20 2a 2a   and expect.  **
29f0: 20 61 6e 20 53 72 63 4c 69 73 74 2a 20 70 61 72   an SrcList* par
2a00: 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20 6f  ameter instead o
2a10: 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a 20  f just a Table* 
2a20: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2f 0a  parameter..  */.
2a30: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
2a40: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
2a50: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
2a60: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
2a70: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
2a80: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f  om_cleanup;..  /
2a90: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
2aa0: 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67  we have any trig
2ab0: 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  gers and if the 
2ac0: 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a  table being.  **
2ad0: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 73   deleted from is
2ae0: 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66   a view.  */.#if
2af0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b00: 5f 54 52 49 47 47 45 52 0a 20 20 70 54 72 69 67  _TRIGGER.  pTrig
2b10: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
2b20: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
2b30: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
2b40: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 69 73 56  TE, 0, 0);.  isV
2b50: 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c  iew = pTab->pSel
2b60: 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20  ect!=0;.#else.# 
2b70: 64 65 66 69 6e 65 20 70 54 72 69 67 67 65 72 20  define pTrigger 
2b80: 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65  0.# define isVie
2b90: 77 20 30 0a 23 65 6e 64 69 66 0a 20 20 62 43 6f  w 0.#endif.  bCo
2ba0: 6d 70 6c 65 78 20 3d 20 70 54 72 69 67 67 65 72  mplex = pTrigger
2bb0: 20 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 71   || sqlite3FkReq
2bc0: 75 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54  uired(pParse, pT
2bd0: 61 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64 65  ab, 0, 0);.#ifde
2be0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2bf0: 45 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65  EW.# undef isVie
2c00: 77 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65  w.# define isVie
2c10: 77 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  w 0.#endif..#ifd
2c20: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c30: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
2c40: 49 4d 49 54 0a 20 20 69 66 28 20 21 69 73 56 69  IMIT.  if( !isVi
2c50: 65 77 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  ew ){.    pWhere
2c60: 20 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69 74 57   = sqlite3LimitW
2c70: 68 65 72 65 28 0a 20 20 20 20 20 20 20 20 70 50  here(.        pP
2c80: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2c90: 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
2ca0: 2c 20 70 4c 69 6d 69 74 2c 20 22 44 45 4c 45 54  , pLimit, "DELET
2cb0: 45 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4f  E".    );.    pO
2cc0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2cd0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  pLimit = 0;.  }.
2ce0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2cf0: 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79 20 61  pTab is really a
2d00: 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75 72 65   view, make sure
2d10: 20 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 69   it has been ini
2d20: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2d30: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
2d40: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
2d50: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
2d60: 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f      goto delete_
2d70: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
2d80: 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
2d90: 49 73 52 65 61 64 4f 6e 6c 79 28 70 50 61 72 73  IsReadOnly(pPars
2da0: 65 2c 20 70 54 61 62 2c 20 28 70 54 72 69 67 67  e, pTab, (pTrigg
2db0: 65 72 3f 31 3a 30 29 29 20 29 7b 0a 20 20 20 20  er?1:0)) ){.    
2dc0: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
2dd0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2de0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2df0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2e00: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2e10: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
2e20: 3e 6e 44 62 20 29 3b 0a 20 20 72 63 61 75 74 68  >nDb );.  rcauth
2e30: 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68   = sqlite3AuthCh
2e40: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2e50: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
2e60: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 0a 20 20 20 20  >zName, 0, .    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
2e90: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a  iDb].zDbSName);.
2ea0: 20 20 61 73 73 65 72 74 28 20 72 63 61 75 74 68    assert( rcauth
2eb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
2ec0: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45  cauth==SQLITE_DE
2ed0: 4e 59 20 7c 7c 20 72 63 61 75 74 68 3d 3d 53 51  NY || rcauth==SQ
2ee0: 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 3b 0a 20  LITE_IGNORE );. 
2ef0: 20 69 66 28 20 72 63 61 75 74 68 3d 3d 53 51 4c   if( rcauth==SQL
2f00: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
2f10: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
2f20: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2f30: 61 73 73 65 72 74 28 21 69 73 56 69 65 77 20 7c  assert(!isView |
2f40: 7c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 20 20  | pTrigger);..  
2f50: 2f 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  /* Assign cursor
2f60: 20 6e 75 6d 62 65 72 73 20 74 6f 20 74 68 65 20   numbers to the 
2f70: 74 61 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74  table and all it
2f80: 73 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2f 0a  s indices..  */.
2f90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
2fa0: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
2fb0: 20 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 4c   iTabCur = pTabL
2fc0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2fd0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2fe0: 2b 2b 3b 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30  ++;.  for(nIdx=0
2ff0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
3000: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3010: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64  pIdx->pNext, nId
3020: 78 2b 2b 29 7b 0a 20 20 20 20 70 50 61 72 73 65  x++){.    pParse
3030: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nTab++;.  }.. 
3040: 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 76 69   /* Start the vi
3050: 65 77 20 63 6f 6e 74 65 78 74 0a 20 20 2a 2f 0a  ew context.  */.
3060: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
3070: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
3080: 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72 73  ontextPush(pPars
3090: 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 54  e, &sContext, pT
30a0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ab->zName);.  }.
30b0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
30c0: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
30d0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
30e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
30f0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
3100: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
3110: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  om_cleanup;.  }.
3120: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
3130: 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  sted==0 ) sqlite
3140: 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
3150: 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  s(v);.  sqlite3B
3160: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3170: 6f 6e 28 70 50 61 72 73 65 2c 20 62 43 6f 6d 70  on(pParse, bComp
3180: 6c 65 78 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a  lex, iDb);..  /*
3190: 20 49 66 20 77 65 20 61 72 65 20 74 72 79 69 6e   If we are tryin
31a0: 67 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  g to delete from
31b0: 20 61 20 76 69 65 77 2c 20 72 65 61 6c 69 7a 65   a view, realize
31c0: 20 74 68 61 74 20 76 69 65 77 20 69 6e 74 6f 0a   that view into.
31d0: 20 20 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61    ** an ephemera
31e0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 23 69  l table..  */.#i
31f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3200: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20  E_OMIT_VIEW) && 
3210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3220: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
3230: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
3240: 20 20 73 71 6c 69 74 65 33 4d 61 74 65 72 69 61    sqlite3Materia
3250: 6c 69 7a 65 56 69 65 77 28 70 50 61 72 73 65 2c  lizeView(pParse,
3260: 20 70 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20   pTab, .        
3270: 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
3280: 2c 20 70 4c 69 6d 69 74 2c 20 69 54 61 62 43 75  , pLimit, iTabCu
3290: 72 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 44 61  r.    );.    iDa
32a0: 74 61 43 75 72 20 3d 20 69 49 64 78 43 75 72 20  taCur = iIdxCur 
32b0: 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 70  = iTabCur;.    p
32c0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
32d0: 20 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d   pLimit = 0;.  }
32e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
32f0: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
3300: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48   names in the WH
3310: 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  ERE clause..  */
3320: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
3330: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
3340: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
3350: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53  pParse;.  sNC.pS
3360: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
3370: 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
3380: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
3390: 28 26 73 4e 43 2c 20 70 57 68 65 72 65 29 20 29  (&sNC, pWhere) )
33a0: 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74  {.    goto delet
33b0: 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a  e_from_cleanup;.
33c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
33d0: 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72  lize the counter
33e0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
33f0: 66 20 72 6f 77 73 20 64 65 6c 65 74 65 64 2c 20  f rows deleted, 
3400: 69 66 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 63  if.  ** we are c
3410: 6f 75 6e 74 69 6e 67 20 72 6f 77 73 2e 0a 20 20  ounting rows..  
3420: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
3430: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
3440: 6e 74 52 6f 77 73 29 21 3d 30 0a 20 20 20 26 26  ntRows)!=0.   &&
3450: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
3460: 0a 20 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e  .   && !pParse->
3470: 70 54 72 69 67 67 65 72 54 61 62 0a 20 20 29 7b  pTriggerTab.  ){
3480: 0a 20 20 20 20 6d 65 6d 43 6e 74 20 3d 20 2b 2b  .    memCnt = ++
3490: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
34c0: 72 2c 20 30 2c 20 6d 65 6d 43 6e 74 29 3b 0a 20  r, 0, memCnt);. 
34d0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
34e0: 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45  TE_OMIT_TRUNCATE
34f0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
3500: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
3510: 20 41 20 44 45 4c 45 54 45 20 77 69 74 68 6f 75   A DELETE withou
3520: 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
3530: 20 64 65 6c 65 74 65 73 20 65 76 65 72 79 74 68   deletes everyth
3540: 69 6e 67 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ing..  ** It is 
3550: 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 65  easier just to e
3560: 72 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74  rase the whole t
3570: 61 62 6c 65 2e 20 50 72 69 6f 72 20 74 6f 20 76  able. Prior to v
3580: 65 72 73 69 6f 6e 20 33 2e 36 2e 35 2c 0a 20 20  ersion 3.6.5,.  
3590: 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
35a0: 74 69 6f 6e 20 63 61 75 73 65 64 20 74 68 65 20  tion caused the 
35b0: 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
35c0: 20 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75   (the value retu
35d0: 72 6e 65 64 20 62 79 20 0a 20 20 2a 2a 20 41 50  rned by .  ** AP
35e0: 49 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  I function sqlit
35f0: 65 33 5f 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  e3_count_changes
3600: 29 20 74 6f 20 62 65 20 73 65 74 20 69 6e 63 6f  ) to be set inco
3610: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rrectly..  **.  
3620: 2a 2a 20 54 68 65 20 22 72 63 61 75 74 68 3d 3d  ** The "rcauth==
3630: 53 51 4c 49 54 45 5f 4f 4b 22 20 74 65 72 6d 73  SQLITE_OK" terms
3640: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 49 4d 50   is the.  ** IMP
3650: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
3660: 52 2d 31 37 32 32 38 2d 33 37 31 32 34 20 49 66  R-17228-37124 If
3670: 20 74 68 65 20 61 63 74 69 6f 6e 20 63 6f 64 65   the action code
3680: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 4c 45 54   is SQLITE_DELET
3690: 45 20 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 63  E and.  ** the c
36a0: 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
36b0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 74 68  SQLITE_IGNORE th
36c0: 65 6e 20 74 68 65 20 44 45 4c 45 54 45 20 6f 70  en the DELETE op
36d0: 65 72 61 74 69 6f 6e 20 70 72 6f 63 65 65 64 73  eration proceeds
36e0: 20 62 75 74 0a 20 20 2a 2a 20 74 68 65 20 74 72   but.  ** the tr
36f0: 75 6e 63 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  uncate optimizat
3700: 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20  ion is disabled 
3710: 61 6e 64 20 61 6c 6c 20 72 6f 77 73 20 61 72 65  and all rows are
3720: 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 69 6e   deleted.  ** in
3730: 64 69 76 69 64 75 61 6c 6c 79 2e 0a 20 20 2a 2f  dividually..  */
3740: 0a 20 20 69 66 28 20 72 63 61 75 74 68 3d 3d 53  .  if( rcauth==S
3750: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
3760: 57 68 65 72 65 3d 3d 30 0a 20 20 20 26 26 20 21  Where==0.   && !
3770: 62 43 6f 6d 70 6c 65 78 0a 20 20 20 26 26 20 21  bComplex.   && !
3780: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a  IsVirtual(pTab).
3790: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
37a0: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
37b0: 4f 4f 4b 0a 20 20 20 26 26 20 64 62 2d 3e 78 50  OOK.   && db->xP
37c0: 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
37d0: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
37e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 56      assert( !isV
37f0: 69 65 77 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  iew );.    sqlit
3800: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
3810: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
3820: 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
3830: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 48 61  ame);.    if( Ha
3840: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
3850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3860: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6c  eAddOp4(v, OP_Cl
3870: 65 61 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  ear, pTab->tnum,
3880: 20 69 44 62 2c 20 6d 65 6d 43 6e 74 20 3f 20 6d   iDb, memCnt ? m
3890: 65 6d 43 6e 74 20 3a 20 2d 31 2c 0a 20 20 20 20  emCnt : -1,.    
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
38c0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
38d0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
38e0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
38f0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
3900: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
3910: 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
3920: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
3930: 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a );.      sqlit
3940: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3950: 4f 50 5f 43 6c 65 61 72 2c 20 70 49 64 78 2d 3e  OP_Clear, pIdx->
3960: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
3970: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
3980: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3990: 54 52 55 4e 43 41 54 45 5f 4f 50 54 49 4d 49 5a  TRUNCATE_OPTIMIZ
39a0: 41 54 49 4f 4e 20 2a 2f 0a 20 20 7b 0a 20 20 20  ATION */.  {.   
39b0: 20 75 31 36 20 77 63 66 20 3d 20 57 48 45 52 45   u16 wcf = WHERE
39c0: 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
39d0: 7c 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45  |WHERE_DUPLICATE
39e0: 53 5f 4f 4b 7c 57 48 45 52 45 5f 53 45 45 4b 5f  S_OK|WHERE_SEEK_
39f0: 54 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 73  TABLE;.    if( s
3a00: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  NC.ncFlags & NC_
3a10: 56 61 72 53 65 6c 65 63 74 20 29 20 62 43 6f 6d  VarSelect ) bCom
3a20: 70 6c 65 78 20 3d 20 31 3b 0a 20 20 20 20 77 63  plex = 1;.    wc
3a30: 66 20 7c 3d 20 28 62 43 6f 6d 70 6c 65 78 20 3f  f |= (bComplex ?
3a40: 20 30 20 3a 20 57 48 45 52 45 5f 4f 4e 45 50 41   0 : WHERE_ONEPA
3a50: 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3b 0a 20 20  SS_MULTIROW);.  
3a60: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
3a70: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
3a80: 20 46 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62   For a rowid tab
3a90: 6c 65 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  le, initialize t
3aa0: 68 65 20 52 6f 77 53 65 74 20 74 6f 20 61 6e 20  he RowSet to an 
3ab0: 65 6d 70 74 79 20 73 65 74 20 2a 2f 0a 20 20 20  empty set */.   
3ac0: 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20     pPk = 0;.    
3ad0: 20 20 6e 50 6b 20 3d 20 31 3b 0a 20 20 20 20 20    nPk = 1;.     
3ae0: 20 69 52 6f 77 53 65 74 20 3d 20 2b 2b 70 50 61   iRowSet = ++pPa
3af0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
3b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3b10: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
3b20: 2c 20 69 52 6f 77 53 65 74 29 3b 0a 20 20 20 20  , iRowSet);.    
3b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
3b40: 46 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  For a WITHOUT RO
3b50: 57 49 44 20 74 61 62 6c 65 2c 20 63 72 65 61 74  WID table, creat
3b60: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
3b70: 61 62 6c 65 20 75 73 65 64 20 74 6f 0a 20 20 20  able used to.   
3b80: 20 20 20 2a 2a 20 68 6f 6c 64 20 61 6c 6c 20 70     ** hold all p
3b90: 72 69 6d 61 72 79 20 6b 65 79 73 20 66 6f 72 20  rimary keys for 
3ba0: 72 6f 77 73 20 74 6f 20 62 65 20 64 65 6c 65 74  rows to be delet
3bb0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 6b  ed. */.      pPk
3bc0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
3bd0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
3be0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3bf0: 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  Pk!=0 );.      n
3c00: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
3c10: 6c 3b 0a 20 20 20 20 20 20 69 50 6b 20 3d 20 70  l;.      iPk = p
3c20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
3c30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
3c40: 6d 20 2b 3d 20 6e 50 6b 3b 0a 20 20 20 20 20 20  m += nPk;.      
3c50: 69 45 70 68 43 75 72 20 3d 20 70 50 61 72 73 65  iEphCur = pParse
3c60: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
3c70: 61 64 64 72 45 70 68 4f 70 65 6e 20 3d 20 73 71  addrEphOpen = sq
3c80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3c90: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
3ca0: 72 61 6c 2c 20 69 45 70 68 43 75 72 2c 20 6e 50  ral, iEphCur, nP
3cb0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
3cc0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
3cd0: 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a  o(pParse, pPk);.
3ce0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
3cf0: 43 6f 6e 73 74 72 75 63 74 20 61 20 71 75 65 72  Construct a quer
3d00: 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 6f  y to find the ro
3d10: 77 69 64 20 6f 72 20 70 72 69 6d 61 72 79 20 6b  wid or primary k
3d20: 65 79 20 66 6f 72 20 65 76 65 72 79 20 72 6f 77  ey for every row
3d30: 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  .    ** to be de
3d40: 6c 65 74 65 64 2c 20 62 61 73 65 64 20 6f 6e 20  leted, based on 
3d50: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d60: 2e 20 53 65 74 20 76 61 72 69 61 62 6c 65 20 65  . Set variable e
3d70: 4f 6e 65 50 61 73 73 0a 20 20 20 20 2a 2a 20 74  OnePass.    ** t
3d80: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 73  o indicate the s
3d90: 74 72 61 74 65 67 79 20 75 73 65 64 20 74 6f 20  trategy used to 
3da0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 64  implement this d
3db0: 65 6c 65 74 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  elete:.    **.  
3dc0: 20 20 2a 2a 20 20 4f 4e 45 50 41 53 53 5f 4f 46    **  ONEPASS_OF
3dd0: 46 3a 20 20 20 20 54 77 6f 2d 70 61 73 73 20 61  F:    Two-pass a
3de0: 70 70 72 6f 61 63 68 20 2d 20 75 73 65 20 61 20  pproach - use a 
3df0: 46 49 46 4f 20 66 6f 72 20 72 6f 77 69 64 73 2f  FIFO for rowids/
3e00: 50 4b 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 2a  PK values..    *
3e10: 2a 20 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  *  ONEPASS_SINGL
3e20: 45 3a 20 4f 6e 65 2d 70 61 73 73 20 61 70 70 72  E: One-pass appr
3e30: 6f 61 63 68 20 2d 20 61 74 20 6d 6f 73 74 20 6f  oach - at most o
3e40: 6e 65 20 72 6f 77 20 64 65 6c 65 74 65 64 2e 0a  ne row deleted..
3e50: 20 20 20 20 2a 2a 20 20 4f 4e 45 50 41 53 53 5f      **  ONEPASS_
3e60: 4d 55 4c 54 49 3a 20 20 4f 6e 65 2d 70 61 73 73  MULTI:  One-pass
3e70: 20 61 70 70 72 6f 61 63 68 20 2d 20 61 6e 79 20   approach - any 
3e80: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
3e90: 61 79 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20  ay be deleted.. 
3ea0: 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
3eb0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
3ec0: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
3ed0: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
3ee0: 2c 20 30 2c 20 77 63 66 2c 20 69 54 61 62 43 75  , 0, wcf, iTabCu
3ef0: 72 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 57  r+1);.    if( pW
3f00: 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64  Info==0 ) goto d
3f10: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
3f20: 75 70 3b 0a 20 20 20 20 65 4f 6e 65 50 61 73 73  up;.    eOnePass
3f30: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
3f40: 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f 2c  kOnePass(pWInfo,
3f50: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29 3b 0a   aiCurOnePass);.
3f60: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 56 69      assert( IsVi
3f70: 72 74 75 61 6c 28 70 54 61 62 29 3d 3d 30 20 7c  rtual(pTab)==0 |
3f80: 7c 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  | eOnePass!=ONEP
3f90: 41 53 53 5f 4d 55 4c 54 49 20 29 3b 0a 20 20 20  ASS_MULTI );.   
3fa0: 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
3fb0: 61 6c 28 70 54 61 62 29 20 7c 7c 20 62 43 6f 6d  al(pTab) || bCom
3fc0: 70 6c 65 78 20 7c 7c 20 65 4f 6e 65 50 61 73 73  plex || eOnePass
3fd0: 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b  !=ONEPASS_OFF );
3fe0: 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73  .    if( eOnePas
3ff0: 73 21 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  s!=ONEPASS_SINGL
4000: 45 20 29 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  E ) sqlite3Multi
4010: 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20  Write(pParse);. 
4020: 20 0a 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72   .    /* Keep tr
4030: 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ack of the numbe
4040: 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20  r of rows to be 
4050: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 20 20 69  deleted */.    i
4060: 66 28 20 6d 65 6d 43 6e 74 20 29 7b 0a 20 20 20  f( memCnt ){.   
4070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4080: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
4090: 6d 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20  m, memCnt, 1);. 
40a0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 45     }.  .    /* E
40b0: 78 74 72 61 63 74 20 74 68 65 20 72 6f 77 69 64  xtract the rowid
40c0: 20 6f 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20   or primary key 
40d0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
40e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  row */.    if( p
40f0: 50 6b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  Pk ){.      for(
4100: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
4110: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4120: 28 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  ( pPk->aiColumn[
4130: 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  i]>=0 );.       
4140: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4150: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
4160: 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 43 75  (v, pTab, iTabCu
4170: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 20 20 20 20 20 20 20 20 20 70 50 6b 2d 3e             pPk->
41a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 69 50 6b  aiColumn[i], iPk
41b0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
41c0: 20 20 20 69 4b 65 79 20 3d 20 69 50 6b 3b 0a 20     iKey = iPk;. 
41d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
41e0: 69 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iKey = ++pParse-
41f0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
4200: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
4210: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
4220: 70 54 61 62 2c 20 69 54 61 62 43 75 72 2c 20 2d  pTab, iTabCur, -
4230: 31 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  1, iKey);.    }.
4240: 20 20 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50    .    if( eOneP
4250: 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
4260: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
4270: 20 4f 4e 45 50 41 53 53 2c 20 6e 6f 20 6e 65 65   ONEPASS, no nee
4280: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
4290: 6f 77 69 64 2f 70 72 69 6d 61 72 79 2d 6b 65 79  owid/primary-key
42a0: 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 0a  . There is only.
42b0: 20 20 20 20 20 20 2a 2a 20 6f 6e 65 2c 20 73 6f        ** one, so
42c0: 20 6a 75 73 74 20 6b 65 65 70 20 69 74 20 69 6e   just keep it in
42d0: 20 69 74 73 20 72 65 67 69 73 74 65 72 28 73 29   its register(s)
42e0: 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67   and fall throug
42f0: 68 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  h to the.      *
4300: 2a 20 64 65 6c 65 74 65 20 63 6f 64 65 2e 20 20  * delete code.  
4310: 2a 2f 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  */.      nKey = 
4320: 6e 50 6b 3b 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64  nPk; /* OP_Found
4330: 20 77 69 6c 6c 20 75 73 65 20 61 6e 20 75 6e 70   will use an unp
4340: 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a 20 20 20  acked key */.   
4350: 20 20 20 61 54 6f 4f 70 65 6e 20 3d 20 73 71 6c     aToOpen = sql
4360: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
4370: 4e 28 64 62 2c 20 6e 49 64 78 2b 32 29 3b 0a 20  N(db, nIdx+2);. 
4380: 20 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e       if( aToOpen
4390: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
43a0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
43b0: 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
43c0: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
43d0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
43e0: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  }.      memset(a
43f0: 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b  ToOpen, 1, nIdx+
4400: 31 29 3b 0a 20 20 20 20 20 20 61 54 6f 4f 70 65  1);.      aToOpe
4410: 6e 5b 6e 49 64 78 2b 31 5d 20 3d 20 30 3b 0a 20  n[nIdx+1] = 0;. 
4420: 20 20 20 20 20 69 66 28 20 61 69 43 75 72 4f 6e       if( aiCurOn
4430: 65 50 61 73 73 5b 30 5d 3e 3d 30 20 29 20 61 54  ePass[0]>=0 ) aT
4440: 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61  oOpen[aiCurOnePa
4450: 73 73 5b 30 5d 2d 69 54 61 62 43 75 72 5d 20 3d  ss[0]-iTabCur] =
4460: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69   0;.      if( ai
4470: 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3e 3d 30  CurOnePass[1]>=0
4480: 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72   ) aToOpen[aiCur
4490: 4f 6e 65 50 61 73 73 5b 31 5d 2d 69 54 61 62 43  OnePass[1]-iTabC
44a0: 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ur] = 0;.      i
44b0: 66 28 20 61 64 64 72 45 70 68 4f 70 65 6e 20 29  f( addrEphOpen )
44c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
44d0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
44e0: 45 70 68 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 65  EphOpen);.    }e
44f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
4500: 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pk ){.        /*
4510: 20 41 64 64 20 74 68 65 20 50 4b 20 6b 65 79 20   Add the PK key 
4520: 66 6f 72 20 74 68 69 73 20 72 6f 77 20 74 6f 20  for this row to 
4530: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4540: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
4550: 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Key = ++pParse->
4560: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 6e 4b  nMem;.        nK
4570: 65 79 20 3d 20 30 3b 20 20 20 2f 2a 20 5a 65 72  ey = 0;   /* Zer
4580: 6f 20 74 65 6c 6c 73 20 4f 50 5f 46 6f 75 6e 64  o tells OP_Found
4590: 20 74 6f 20 75 73 65 20 61 20 63 6f 6d 70 6f 73   to use a compos
45a0: 69 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ite key */.     
45b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
45c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
45d0: 65 63 6f 72 64 2c 20 69 50 6b 2c 20 6e 50 6b 2c  ecord, iPk, nPk,
45e0: 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   iKey,.         
45f0: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
4600: 66 66 69 6e 69 74 79 53 74 72 28 70 50 61 72 73  ffinityStr(pPars
4610: 65 2d 3e 64 62 2c 20 70 50 6b 29 2c 20 6e 50 6b  e->db, pPk), nPk
4620: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4630: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
4640: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4650: 20 69 45 70 68 43 75 72 2c 20 69 4b 65 79 2c 20   iEphCur, iKey, 
4660: 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20  iPk, nPk);.     
4670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4680: 2f 2a 20 41 64 64 20 74 68 65 20 72 6f 77 69 64  /* Add the rowid
4690: 20 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20 62   of the row to b
46a0: 65 20 64 65 6c 65 74 65 64 20 74 6f 20 74 68 65  e deleted to the
46b0: 20 52 6f 77 53 65 74 20 2a 2f 0a 20 20 20 20 20   RowSet */.     
46c0: 20 20 20 6e 4b 65 79 20 3d 20 31 3b 20 20 2f 2a     nKey = 1;  /*
46d0: 20 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b   OP_DeferredSeek
46e0: 20 61 6c 77 61 79 73 20 75 73 65 73 20 61 20 73   always uses a s
46f0: 69 6e 67 6c 65 20 72 6f 77 69 64 20 2a 2f 0a 20  ingle rowid */. 
4700: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4710: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4720: 6f 77 53 65 74 41 64 64 2c 20 69 52 6f 77 53 65  owSetAdd, iRowSe
4730: 74 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  t, iKey);.      
4740: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
4750: 2a 20 49 66 20 74 68 69 73 20 44 45 4c 45 54 45  * If this DELETE
4760: 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
4770: 4f 4e 45 50 41 53 53 20 73 74 72 61 74 65 67 79  ONEPASS strategy
4780: 2c 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20  , this is the . 
4790: 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
47a0: 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20   WHERE loop */. 
47b0: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21     if( eOnePass!
47c0: 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
47d0: 20 20 20 20 20 20 61 64 64 72 42 79 70 61 73 73        addrBypass
47e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
47f0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4800: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4810: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
4820: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  nfo);.    }.  . 
4830: 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 69     /* Unless thi
4840: 73 20 69 73 20 61 20 76 69 65 77 2c 20 6f 70 65  s is a view, ope
4850: 6e 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68  n cursors for th
4860: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 0a  e table we are .
4870: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
4880: 66 72 6f 6d 20 61 6e 64 20 61 6c 6c 20 69 74 73  from and all its
4890: 20 69 6e 64 69 63 65 73 2e 20 49 66 20 74 68 69   indices. If thi
48a0: 73 20 69 73 20 61 20 76 69 65 77 2c 20 74 68 65  s is a view, the
48b0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 6e 6c  n the.    ** onl
48c0: 79 20 65 66 66 65 63 74 20 74 68 69 73 20 73 74  y effect this st
48d0: 61 74 65 6d 65 6e 74 20 68 61 73 20 69 73 20 74  atement has is t
48e0: 6f 20 66 69 72 65 20 74 68 65 20 49 4e 53 54 45  o fire the INSTE
48f0: 41 44 20 4f 46 20 0a 20 20 20 20 2a 2a 20 74 72  AD OF .    ** tr
4900: 69 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  iggers..    */. 
4910: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
4920: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
4930: 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  rOnce = 0;.     
4940: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
4950: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 7b 0a  NEPASS_MULTI ){.
4960: 20 20 20 20 20 20 20 20 69 41 64 64 72 4f 6e 63          iAddrOnc
4970: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
4980: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
4990: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
49a0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
49b0: 20 20 74 65 73 74 63 61 73 65 28 20 49 73 56 69    testcase( IsVi
49c0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20  rtual(pTab) );. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
49e0: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
49f0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
4a00: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 4f 50 46 4c  _OpenWrite, OPFL
4a10: 41 47 5f 46 4f 52 44 45 4c 45 54 45 2c 0a 20 20  AG_FORDELETE,.  
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4a40: 54 61 62 43 75 72 2c 20 61 54 6f 4f 70 65 6e 2c  TabCur, aToOpen,
4a50: 20 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64   &iDataCur, &iId
4a60: 78 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73  xCur);.      ass
4a70: 65 72 74 28 20 70 50 6b 20 7c 7c 20 49 73 56 69  ert( pPk || IsVi
4a80: 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 69  rtual(pTab) || i
4a90: 44 61 74 61 43 75 72 3d 3d 69 54 61 62 43 75 72  DataCur==iTabCur
4aa0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4ab0: 28 20 70 50 6b 20 7c 7c 20 49 73 56 69 72 74 75  ( pPk || IsVirtu
4ac0: 61 6c 28 70 54 61 62 29 20 7c 7c 20 69 49 64 78  al(pTab) || iIdx
4ad0: 43 75 72 3d 3d 69 44 61 74 61 43 75 72 2b 31 20  Cur==iDataCur+1 
4ae0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6e  );.      if( eOn
4af0: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d  ePass==ONEPASS_M
4b00: 55 4c 54 49 20 29 20 73 71 6c 69 74 65 33 56 64  ULTI ) sqlite3Vd
4b10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
4b20: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 7d 0a  ddrOnce);.    }.
4b30: 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70    .    /* Set up
4b40: 20 61 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65   a loop over the
4b50: 20 72 6f 77 69 64 73 2f 70 72 69 6d 61 72 79 2d   rowids/primary-
4b60: 6b 65 79 73 20 74 68 61 74 20 77 65 72 65 20 66  keys that were f
4b70: 6f 75 6e 64 20 69 6e 20 74 68 65 0a 20 20 20 20  ound in the.    
4b80: 2a 2a 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20  ** where-clause 
4b90: 6c 6f 6f 70 20 61 62 6f 76 65 2e 0a 20 20 20 20  loop above..    
4ba0: 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50  */.    if( eOneP
4bb0: 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
4bc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
4bd0: 28 20 6e 4b 65 79 3d 3d 6e 50 6b 20 29 3b 20 20  ( nKey==nPk );  
4be0: 2f 2a 20 4f 50 5f 46 6f 75 6e 64 20 77 69 6c 6c  /* OP_Found will
4bf0: 20 75 73 65 20 61 6e 20 75 6e 70 61 63 6b 65 64   use an unpacked
4c00: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 69 66   key */.      if
4c10: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
4c20: 62 29 20 26 26 20 61 54 6f 4f 70 65 6e 5b 69 44  b) && aToOpen[iD
4c30: 61 74 61 43 75 72 2d 69 54 61 62 43 75 72 5d 20  ataCur-iTabCur] 
4c40: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4c50: 74 28 20 70 50 6b 21 3d 30 20 7c 7c 20 70 54 61  t( pPk!=0 || pTa
4c60: 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  b->pSelect!=0 );
4c70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4c80: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
4c90: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44   OP_NotFound, iD
4ca0: 61 74 61 43 75 72 2c 20 61 64 64 72 42 79 70 61  ataCur, addrBypa
4cb0: 73 73 2c 20 69 4b 65 79 2c 20 6e 4b 65 79 29 3b  ss, iKey, nKey);
4cc0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
4cd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4ce0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
4cf0: 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 61 64 64  pPk ){.      add
4d00: 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  rLoop = sqlite3V
4d10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4d20: 52 65 77 69 6e 64 2c 20 69 45 70 68 43 75 72 29  Rewind, iEphCur)
4d30: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  );.      if( IsV
4d50: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
4d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4d70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4d80: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 43 75 72 2c  Column, iEphCur,
4d90: 20 30 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20   0, iKey);.     
4da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4db0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4dc0: 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
4dd0: 20 69 45 70 68 43 75 72 2c 20 69 4b 65 79 29 3b   iEphCur, iKey);
4de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
4df0: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 30 20 29  ssert( nKey==0 )
4e00: 3b 20 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64 20 77  ;  /* OP_Found w
4e10: 69 6c 6c 20 75 73 65 20 61 20 63 6f 6d 70 6f 73  ill use a compos
4e20: 69 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 7d  ite key */.    }
4e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
4e40: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
4e50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
4e60: 6f 77 53 65 74 52 65 61 64 2c 20 69 52 6f 77 53  owSetRead, iRowS
4e70: 65 74 2c 20 30 2c 20 69 4b 65 79 29 3b 0a 20 20  et, 0, iKey);.  
4e80: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e90: 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
4ea0: 74 28 20 6e 4b 65 79 3d 3d 31 20 29 3b 0a 20 20  t( nKey==1 );.  
4eb0: 20 20 7d 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20    }  .  .    /* 
4ec0: 44 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20 2a  Delete the row *
4ed0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
4ee0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4ef0: 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
4f00: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
4f10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4f20: 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
4f30: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
4f40: 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
4f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4f60: 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28  tabMakeWritable(
4f70: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
4f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6e       assert( eOn
4f90: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
4fa0: 46 46 20 7c 7c 20 65 4f 6e 65 50 61 73 73 3d 3d  FF || eOnePass==
4fb0: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29  ONEPASS_SINGLE )
4fc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
4fd0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
4fe0: 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50  .      if( eOneP
4ff0: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
5000: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  GLE ){.        s
5010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5020: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
5030: 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  abCur);.        
5040: 69 66 28 20 73 71 6c 69 74 65 33 49 73 54 6f 70  if( sqlite3IsTop
5050: 6c 65 76 65 6c 28 70 50 61 72 73 65 29 20 29 7b  level(pParse) ){
5060: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
5070: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
5080: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
5090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
50a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
50b0: 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 30 2c  , OP_VUpdate, 0,
50c0: 20 31 2c 20 69 4b 65 79 2c 20 70 56 54 61 62 2c   1, iKey, pVTab,
50d0: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20   P4_VTAB);.     
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
50f0: 67 65 50 35 28 76 2c 20 4f 45 5f 41 62 6f 72 74  geP5(v, OE_Abort
5100: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
5110: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
5120: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 28 70 50 61  int count = (pPa
5130: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 29 3b  rse->nested==0);
5140: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
5150: 6f 75 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  ount changes */.
5160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e        sqlite3Gen
5170: 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70  erateRowDelete(p
5180: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72  Parse, pTab, pTr
5190: 69 67 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c  igger, iDataCur,
51a0: 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20   iIdxCur,.      
51b0: 20 20 20 20 69 4b 65 79 2c 20 6e 4b 65 79 2c 20      iKey, nKey, 
51c0: 63 6f 75 6e 74 2c 20 4f 45 5f 44 65 66 61 75 6c  count, OE_Defaul
51d0: 74 2c 20 65 4f 6e 65 50 61 73 73 2c 20 61 69 43  t, eOnePass, aiC
51e0: 75 72 4f 6e 65 50 61 73 73 5b 31 5d 29 3b 0a 20  urOnePass[1]);. 
51f0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 45     }.  .    /* E
5200: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6f  nd of the loop o
5210: 76 65 72 20 61 6c 6c 20 72 6f 77 69 64 73 2f 70  ver all rowids/p
5220: 72 69 6d 61 72 79 2d 6b 65 79 73 2e 20 2a 2f 0a  rimary-keys. */.
5230: 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73      if( eOnePass
5240: 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
5250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5260: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5270: 2c 20 61 64 64 72 42 79 70 61 73 73 29 3b 0a 20  , addrBypass);. 
5280: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
5290: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
52a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20    }else if( pPk 
52b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
52c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
52d0: 5f 4e 65 78 74 2c 20 69 45 70 68 43 75 72 2c 20  _Next, iEphCur, 
52e0: 61 64 64 72 4c 6f 6f 70 2b 31 29 3b 20 56 64 62  addrLoop+1); Vdb
52f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5310: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4c  umpHere(v, addrL
5320: 6f 6f 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oop);.    }else{
5330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5340: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4c 6f  beGoto(v, addrLo
5350: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
5360: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5370: 2c 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20  , addrLoop);.   
5380: 20 7d 20 20 20 20 20 0a 20 20 7d 20 2f 2a 20 45   }     .  } /* E
5390: 6e 64 20 6e 6f 6e 2d 74 72 75 6e 63 61 74 65 20  nd non-truncate 
53a0: 70 61 74 68 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70  path */..  /* Up
53b0: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
53c0: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 62  sequence table b
53d0: 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63 6f  y storing the co
53e0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a  ntent of the.  *
53f0: 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20  * maximum rowid 
5400: 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20 72  counter values r
5410: 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69 6e  ecorded while in
5420: 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a  serting into.  *
5430: 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  * autoincrement 
5440: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  tables..  */.  i
5450: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
5460: 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  d==0 && pParse->
5470: 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29  pTriggerTab==0 )
5480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
5490: 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50  oincrementEnd(pP
54a0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
54b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
54c0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
54d0: 77 65 72 65 20 64 65 6c 65 74 65 64 2e 20 49 66  were deleted. If
54e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
54f0: 20 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e   .  ** generatin
5500: 67 20 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f  g code because o
5510: 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
5520: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29  te3NestedParse()
5530: 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e  , do not.  ** in
5540: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
5550: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  k function..  */
5560: 0a 20 20 69 66 28 20 6d 65 6d 43 6e 74 20 29 7b  .  if( memCnt ){
5570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5580: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5590: 75 6c 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20  ultRow, memCnt, 
55a0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
55b0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
55c0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
55d0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
55e0: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
55f0: 45 2c 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64  E, "rows deleted
5600: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
5610: 29 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65 5f 66  );.  }..delete_f
5620: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  rom_cleanup:.  s
5630: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
5640: 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74 29 3b  tPop(&sContext);
5650: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
5660: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
5670: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
5680: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5690: 57 68 65 72 65 29 3b 0a 23 69 66 20 64 65 66 69  Where);.#if defi
56a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
56b0: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
56c0: 4c 49 4d 49 54 29 20 0a 20 20 73 71 6c 69 74 65  LIMIT) .  sqlite
56d0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
56e0: 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  db, pOrderBy);. 
56f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
5700: 74 65 28 64 62 2c 20 70 4c 69 6d 69 74 29 3b 0a  te(db, pLimit);.
5710: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
5720: 44 62 46 72 65 65 28 64 62 2c 20 61 54 6f 4f 70  DbFree(db, aToOp
5730: 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  en);.  return;.}
5740: 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69  ./* Make sure "i
5750: 73 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72  sView" and other
5760: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20   macros defined 
5770: 61 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69  above are undefi
5780: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ned. Otherwise.*
5790: 2a 20 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72  * they may inter
57a0: 66 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c  fere with compil
57b0: 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66  ation of other f
57c0: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  unctions in this
57d0: 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20   file.** (or in 
57e0: 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66  another file, if
57f0: 20 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d   this file becom
5800: 65 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61  es part of the a
5810: 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a  malgamation).  *
5820: 2f 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a  /.#ifdef isView.
5830: 20 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23   #undef isView.#
5840: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72  endif.#ifdef pTr
5850: 69 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54  igger. #undef pT
5860: 72 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 0a 2f  rigger.#endif../
5870: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5880: 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
5890: 20 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65   code that cause
58a0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
58b0: 66 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61  f a.** single ta
58c0: 62 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ble to be delete
58d0: 64 2e 20 20 42 6f 74 68 20 74 68 65 20 6f 72 69  d.  Both the ori
58e0: 67 69 6e 61 6c 20 74 61 62 6c 65 20 65 6e 74 72  ginal table entr
58f0: 79 20 61 6e 64 0a 2a 2a 20 61 6c 6c 20 69 6e 64  y and.** all ind
5900: 69 63 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64  ices are removed
5910: 2e 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e 64 69  ..**.** Precondi
5920: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tions:.**.**   1
5930: 2e 20 20 69 44 61 74 61 43 75 72 20 69 73 20 61  .  iDataCur is a
5940: 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 6f 6e  n open cursor on
5950: 20 74 68 65 20 62 74 72 65 65 20 74 68 61 74 20   the btree that 
5960: 69 73 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  is the canonical
5970: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 73   data.**       s
5980: 74 6f 72 65 20 66 6f 72 20 74 68 65 20 74 61 62  tore for the tab
5990: 6c 65 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20  le.  (This will 
59a0: 62 65 20 65 69 74 68 65 72 20 74 68 65 20 74 61  be either the ta
59b0: 62 6c 65 20 69 74 73 65 6c 66 2c 0a 2a 2a 20 20  ble itself,.**  
59c0: 20 20 20 20 20 69 6e 20 74 68 65 20 63 61 73 65       in the case
59d0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
59e0: 65 2c 20 6f 72 20 74 68 65 20 50 52 49 4d 41 52  e, or the PRIMAR
59f0: 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20 74  Y KEY index in t
5a00: 68 65 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20  he case.**      
5a10: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
5a20: 57 49 44 20 74 61 62 6c 65 2e 29 0a 2a 2a 0a 2a  WID table.).**.*
5a30: 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69  *   2.  Read/wri
5a40: 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  te cursors for a
5a50: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
5a60: 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  ab must be open 
5a70: 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73  as.**       curs
5a80: 6f 72 20 6e 75 6d 62 65 72 20 69 49 64 78 43 75  or number iIdxCu
5a90: 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d 74 68  r+i for the i-th
5aa0: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20   index..**.**   
5ab0: 33 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20  3.  The primary 
5ac0: 6b 65 79 20 66 6f 72 20 74 68 65 20 72 6f 77 20  key for the row 
5ad0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6d 75  to be deleted mu
5ae0: 73 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  st be stored in 
5af0: 61 0a 2a 2a 20 20 20 20 20 20 20 73 65 71 75 65  a.**       seque
5b00: 6e 63 65 20 6f 66 20 6e 50 6b 20 6d 65 6d 6f 72  nce of nPk memor
5b10: 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  y cells starting
5b20: 20 61 74 20 69 50 6b 2e 20 20 49 66 20 6e 50 6b   at iPk.  If nPk
5b30: 3d 3d 30 20 74 68 61 74 20 6d 65 61 6e 73 0a 2a  ==0 that means.*
5b40: 2a 20 20 20 20 20 20 20 74 68 61 74 20 61 20 73  *       that a s
5b50: 65 61 72 63 68 20 72 65 63 6f 72 64 20 66 6f 72  earch record for
5b60: 6d 65 64 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65  med from OP_Make
5b70: 52 65 63 6f 72 64 20 69 73 20 63 6f 6e 74 61 69  Record is contai
5b80: 6e 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ned in the.**   
5b90: 20 20 20 20 73 69 6e 67 6c 65 20 6d 65 6d 6f 72      single memor
5ba0: 79 20 6c 6f 63 61 74 69 6f 6e 20 69 50 6b 2e 0a  y location iPk..
5bb0: 2a 2a 0a 2a 2a 20 65 4d 6f 64 65 3a 0a 2a 2a 20  **.** eMode:.** 
5bc0: 20 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64    Parameter eMod
5bd0: 65 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  e may be passed 
5be0: 65 69 74 68 65 72 20 4f 4e 45 50 41 53 53 5f 4f  either ONEPASS_O
5bf0: 46 46 20 28 30 29 2c 20 4f 4e 45 50 41 53 53 5f  FF (0), ONEPASS_
5c00: 53 49 4e 47 4c 45 2c 20 6f 72 0a 2a 2a 20 20 20  SINGLE, or.**   
5c10: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 2e 20 20  ONEPASS_MULTI.  
5c20: 49 66 20 65 4d 6f 64 65 20 69 73 20 6e 6f 74 20  If eMode is not 
5c30: 4f 4e 45 50 41 53 53 5f 4f 46 46 2c 20 74 68 65  ONEPASS_OFF, the
5c40: 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
5c50: 20 20 69 44 61 74 61 43 75 72 20 61 6c 72 65 61    iDataCur alrea
5c60: 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
5c70: 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20   row to delete. 
5c80: 49 66 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50  If eMode is ONEP
5c90: 41 53 53 5f 4f 46 46 0a 2a 2a 20 20 20 74 68 65  ASS_OFF.**   the
5ca0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
5cb0: 6d 75 73 74 20 73 65 65 6b 20 69 44 61 74 61 43  must seek iDataC
5cc0: 75 72 20 74 6f 20 74 68 65 20 65 6e 74 72 79 20  ur to the entry 
5cd0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 50  identified by iP
5ce0: 6b 0a 2a 2a 20 20 20 61 6e 64 20 6e 50 6b 20 62  k.**   and nPk b
5cf0: 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 66 72  efore reading fr
5d00: 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  om it..**.**   I
5d10: 66 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41  f eMode is ONEPA
5d20: 53 53 5f 4d 55 4c 54 49 2c 20 74 68 65 6e 20 74  SS_MULTI, then t
5d30: 68 69 73 20 63 61 6c 6c 20 69 73 20 62 65 69 6e  his call is bein
5d40: 67 20 6d 61 64 65 20 61 73 20 70 61 72 74 0a 2a  g made as part.*
5d50: 2a 20 20 20 6f 66 20 61 20 4f 4e 45 50 41 53 53  *   of a ONEPASS
5d60: 20 64 65 6c 65 74 65 20 74 68 61 74 20 61 66 66   delete that aff
5d70: 65 63 74 73 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ects multiple ro
5d80: 77 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ws. In this case
5d90: 2c 20 69 66 20 0a 2a 2a 20 20 20 69 49 64 78 4e  , if .**   iIdxN
5da0: 6f 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64  oSeek is a valid
5db0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28   cursor number (
5dc0: 3e 3d 30 29 20 61 6e 64 20 69 73 20 6e 6f 74 20  >=0) and is not 
5dd0: 74 68 65 20 73 61 6d 65 20 61 73 0a 2a 2a 20 20  the same as.**  
5de0: 20 69 44 61 74 61 43 75 72 2c 20 74 68 65 6e 20   iDataCur, then 
5df0: 69 74 73 20 70 6f 73 69 74 69 6f 6e 20 73 68 6f  its position sho
5e00: 75 6c 64 20 62 65 20 70 72 65 73 65 72 76 65 64  uld be preserved
5e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
5e20: 65 6c 65 74 65 0a 2a 2a 20 20 20 6f 70 65 72 61  elete.**   opera
5e30: 74 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 69 49 64  tion. Or, if iId
5e40: 78 4e 6f 53 65 65 6b 20 69 73 20 6e 6f 74 20 61  xNoSeek is not a
5e50: 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 6e 75   valid cursor nu
5e60: 6d 62 65 72 2c 20 74 68 65 0a 2a 2a 20 20 20 70  mber, the.**   p
5e70: 6f 73 69 74 69 6f 6e 20 6f 66 20 69 44 61 74 61  osition of iData
5e80: 43 75 72 20 73 68 6f 75 6c 64 20 62 65 20 70 72  Cur should be pr
5e90: 65 73 65 72 76 65 64 20 69 6e 73 74 65 61 64 2e  eserved instead.
5ea0: 0a 2a 2a 0a 2a 2a 20 69 49 64 78 4e 6f 53 65 65  .**.** iIdxNoSee
5eb0: 6b 3a 0a 2a 2a 20 20 20 49 66 20 69 49 64 78 4e  k:.**   If iIdxN
5ec0: 6f 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64  oSeek is a valid
5ed0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28   cursor number (
5ee0: 3e 3d 30 29 20 6e 6f 74 20 65 71 75 61 6c 20 74  >=0) not equal t
5ef0: 6f 20 69 44 61 74 61 43 75 72 2c 0a 2a 2a 20 20  o iDataCur,.**  
5f00: 20 74 68 65 6e 20 69 74 20 69 64 65 6e 74 69 66   then it identif
5f10: 69 65 73 20 61 6e 20 69 6e 64 65 78 20 63 75 72  ies an index cur
5f20: 73 6f 72 20 28 66 72 6f 6d 20 77 69 74 68 69 6e  sor (from within
5f30: 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
5f40: 73 0a 2a 2a 20 20 20 73 74 61 72 74 69 6e 67 20  s.**   starting 
5f50: 61 74 20 69 49 64 78 43 75 72 29 20 74 68 61 74  at iIdxCur) that
5f60: 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
5f70: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  to the index ent
5f80: 72 79 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ry to be deleted
5f90: 2e 0a 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 74  ..**   Except, t
5fa0: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
5fb0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
5fc0: 74 68 65 72 65 20 61 72 65 20 42 45 46 4f 52 45  there are BEFORE
5fd0: 20 74 72 69 67 67 65 72 73 20 73 69 6e 63 65 0a   triggers since.
5fe0: 2a 2a 20 20 20 74 68 65 20 74 72 69 67 67 65 72  **   the trigger
5ff0: 20 62 6f 64 79 20 6d 69 67 68 74 20 68 61 76 65   body might have
6000: 20 6d 6f 76 65 64 20 74 68 65 20 63 75 72 73 6f   moved the curso
6010: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
6020: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
6030: 65 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ete(.  Parse *pP
6040: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6050: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6060: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
6070: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 6f       /* Table co
6080: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
6090: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
60a0: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
60b0: 69 67 67 65 72 2c 20 2f 2a 20 4c 69 73 74 20 6f  igger, /* List o
60c0: 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 28 70  f triggers to (p
60d0: 6f 74 65 6e 74 69 61 6c 6c 79 29 20 66 69 72 65  otentially) fire
60e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43   */.  int iDataC
60f0: 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
6100: 6f 72 20 66 72 6f 6d 20 77 68 69 63 68 20 63 6f  or from which co
6110: 6c 75 6d 6e 20 64 61 74 61 20 69 73 20 65 78 74  lumn data is ext
6120: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
6130: 69 49 64 78 43 75 72 2c 20 20 20 20 20 20 20 2f  iIdxCur,       /
6140: 2a 20 46 69 72 73 74 20 69 6e 64 65 78 20 63 75  * First index cu
6150: 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 50  rsor */.  int iP
6160: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
6170: 46 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c  First memory cel
6180: 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  l containing the
6190: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
61a0: 20 20 69 31 36 20 6e 50 6b 2c 20 20 20 20 20 20    i16 nPk,      
61b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
61c0: 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 65  f PRIMARY KEY me
61d0: 6d 6f 72 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  mory cells */.  
61e0: 75 38 20 63 6f 75 6e 74 2c 20 20 20 20 20 20 20  u8 count,       
61f0: 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
6200: 6f 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  o, increment the
6210: 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
6220: 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 6e 63 6f  ter */.  u8 onco
6230: 6e 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  nf,         /* D
6240: 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49  efault ON CONFLI
6250: 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72  CT policy for tr
6260: 69 67 67 65 72 73 20 2a 2f 0a 20 20 75 38 20 65  iggers */.  u8 e
6270: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Mode,          /
6280: 2a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 2c 20 5f  * ONEPASS_OFF, _
6290: 53 49 4e 47 4c 45 2c 20 6f 72 20 5f 4d 55 4c 54  SINGLE, or _MULT
62a0: 49 2e 20 20 53 65 65 20 61 62 6f 76 65 20 2a 2f  I.  See above */
62b0: 0a 20 20 69 6e 74 20 69 49 64 78 4e 6f 53 65 65  .  int iIdxNoSee
62c0: 6b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  k     /* Cursor 
62d0: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
62e0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
62f0: 65 65 64 20 73 65 65 6b 69 6e 67 20 2a 2f 0a 29  eed seeking */.)
6300: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6310: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
6320: 20 20 20 20 2f 2a 20 56 64 62 65 20 2a 2f 0a 20      /* Vdbe */. 
6330: 20 69 6e 74 20 69 4f 6c 64 20 3d 20 30 3b 20 20   int iOld = 0;  
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
6360: 65 72 20 69 6e 20 4f 4c 44 2e 2a 20 61 72 72 61  er in OLD.* arra
6370: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 62 65  y */.  int iLabe
6380: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
6390: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
63a0: 72 65 73 6f 6c 76 65 64 20 74 6f 20 65 6e 64 20  resolved to end 
63b0: 6f 66 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  of generated cod
63c0: 65 20 2a 2f 0a 20 20 75 38 20 6f 70 53 65 65 6b  e */.  u8 opSeek
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f         /* Seek o
63f0: 70 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 56  pcode */..  /* V
6400: 64 62 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  dbe is guarantee
6410: 64 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 61  d to have been a
6420: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
6430: 20 73 74 61 67 65 2e 20 2a 2f 0a 20 20 61 73 73   stage. */.  ass
6440: 65 72 74 28 20 76 20 29 3b 0a 20 20 56 64 62 65  ert( v );.  Vdbe
6450: 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
6460: 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e 52 6f 77  , "BEGIN: GenRow
6470: 44 65 6c 28 25 64 2c 25 64 2c 25 64 2c 25 64 29  Del(%d,%d,%d,%d)
6480: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6490: 20 20 20 20 20 20 20 20 20 20 20 20 69 44 61 74              iDat
64a0: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 69  aCur, iIdxCur, i
64b0: 50 6b 2c 20 28 69 6e 74 29 6e 50 6b 29 29 3b 0a  Pk, (int)nPk));.
64c0: 0a 20 20 2f 2a 20 53 65 65 6b 20 63 75 72 73 6f  .  /* Seek curso
64d0: 72 20 69 43 75 72 20 74 6f 20 74 68 65 20 72 6f  r iCur to the ro
64e0: 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 49 66 20  w to delete. If 
64f0: 74 68 69 73 20 72 6f 77 20 6e 6f 20 6c 6f 6e 67  this row no long
6500: 65 72 20 65 78 69 73 74 73 20 0a 20 20 2a 2a 20  er exists .  ** 
6510: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
6520: 20 69 66 20 61 20 74 72 69 67 67 65 72 20 70 72   if a trigger pr
6530: 6f 67 72 61 6d 20 68 61 73 20 61 6c 72 65 61 64  ogram has alread
6540: 79 20 64 65 6c 65 74 65 64 20 69 74 29 2c 20 64  y deleted it), d
6550: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 61 74 74 65 6d  o.  ** not attem
6560: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 69 74 20  pt to delete it 
6570: 6f 72 20 66 69 72 65 20 61 6e 79 20 44 45 4c 45  or fire any DELE
6580: 54 45 20 74 72 69 67 67 65 72 73 2e 20 20 2a 2f  TE triggers.  */
6590: 0a 20 20 69 4c 61 62 65 6c 20 3d 20 73 71 6c 69  .  iLabel = sqli
65a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
65b0: 28 76 29 3b 0a 20 20 6f 70 53 65 65 6b 20 3d 20  (v);.  opSeek = 
65c0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f  HasRowid(pTab) ?
65d0: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20   OP_NotExists : 
65e0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 69  OP_NotFound;.  i
65f0: 66 28 20 65 4d 6f 64 65 3d 3d 4f 4e 45 50 41 53  f( eMode==ONEPAS
6600: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c  S_OFF ){.    sql
6610: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6620: 74 28 76 2c 20 6f 70 53 65 65 6b 2c 20 69 44 61  t(v, opSeek, iDa
6630: 74 61 43 75 72 2c 20 69 4c 61 62 65 6c 2c 20 69  taCur, iLabel, i
6640: 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 56 64  Pk, nPk);.    Vd
6650: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
6660: 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 45 78  opSeek==OP_NotEx
6670: 69 73 74 73 29 3b 0a 20 20 20 20 56 64 62 65 43  ists);.    VdbeC
6680: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 53  overageIf(v, opS
6690: 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 46 6f 75 6e 64  eek==OP_NotFound
66a0: 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 49 66  );.  }. .  /* If
66b0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 74   there are any t
66c0: 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65 2c  riggers to fire,
66d0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   allocate a rang
66e0: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
66f0: 6f 0a 20 20 2a 2a 20 75 73 65 20 66 6f 72 20 74  o.  ** use for t
6700: 68 65 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e  he old.* referen
6710: 63 65 73 20 69 6e 20 74 68 65 20 74 72 69 67 67  ces in the trigg
6720: 65 72 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  ers.  */.  if( s
6730: 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64  qlite3FkRequired
6740: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
6750: 2c 20 30 29 20 7c 7c 20 70 54 72 69 67 67 65 72  , 0) || pTrigger
6760: 20 29 7b 0a 20 20 20 20 75 33 32 20 6d 61 73 6b   ){.    u32 mask
6770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6780: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
6790: 20 4f 4c 44 2e 2a 20 63 6f 6c 75 6d 6e 73 20 69   OLD.* columns i
67a0: 6e 20 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74  n use */.    int
67b0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
67c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
67d0: 65 72 61 74 6f 72 20 75 73 65 64 20 77 68 69 6c  erator used whil
67e0: 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 4f 4c 44  e populating OLD
67f0: 2e 2a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  .* */.    int ad
6800: 64 72 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  drStart;        
6810: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
6820: 20 6f 66 20 42 45 46 4f 52 45 20 74 72 69 67 67   of BEFORE trigg
6830: 65 72 20 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 0a  er programs */..
6840: 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 6f 75      /* TODO: Cou
6850: 6c 64 20 75 73 65 20 74 65 6d 70 6f 72 61 72 79  ld use temporary
6860: 20 72 65 67 69 73 74 65 72 73 20 68 65 72 65 2e   registers here.
6870: 20 41 6c 73 6f 20 63 6f 75 6c 64 20 61 74 74 65   Also could atte
6880: 6d 70 74 20 74 6f 0a 20 20 20 20 2a 2a 20 61 76  mpt to.    ** av
6890: 6f 69 64 20 63 6f 70 79 69 6e 67 20 74 68 65 20  oid copying the 
68a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
68b0: 72 6f 77 69 64 20 72 65 67 69 73 74 65 72 2e 20  rowid register. 
68c0: 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 73   */.    mask = s
68d0: 71 6c 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c  qlite3TriggerCol
68e0: 6d 61 73 6b 28 0a 20 20 20 20 20 20 20 20 70 50  mask(.        pP
68f0: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20  arse, pTrigger, 
6900: 30 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45  0, 0, TRIGGER_BE
6910: 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 46 54  FORE|TRIGGER_AFT
6920: 45 52 2c 20 70 54 61 62 2c 20 6f 6e 63 6f 6e 66  ER, pTab, onconf
6930: 0a 20 20 20 20 29 3b 0a 20 20 20 20 6d 61 73 6b  .    );.    mask
6940: 20 7c 3d 20 73 71 6c 69 74 65 33 46 6b 4f 6c 64   |= sqlite3FkOld
6950: 6d 61 73 6b 28 70 50 61 72 73 65 2c 20 70 54 61  mask(pParse, pTa
6960: 62 29 3b 0a 20 20 20 20 69 4f 6c 64 20 3d 20 70  b);.    iOld = p
6970: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6980: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6990: 2b 3d 20 28 31 20 2b 20 70 54 61 62 2d 3e 6e 43  += (1 + pTab->nC
69a0: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70  ol);..    /* Pop
69b0: 75 6c 61 74 65 20 74 68 65 20 4f 4c 44 2e 2a 20  ulate the OLD.* 
69c0: 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 72 65 67  pseudo-table reg
69d0: 69 73 74 65 72 20 61 72 72 61 79 2e 20 54 68 65  ister array. The
69e0: 73 65 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62  se values will b
69f0: 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
6a00: 79 20 61 6e 79 20 42 45 46 4f 52 45 20 61 6e 64  y any BEFORE and
6a10: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
6a20: 74 68 61 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a  that exist.  */.
6a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
6a50: 2c 20 69 50 6b 2c 20 69 4f 6c 64 29 3b 0a 20 20  , iPk, iOld);.  
6a60: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
6a70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
6a80: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  Col++){.      te
6a90: 73 74 63 61 73 65 28 20 6d 61 73 6b 21 3d 30 78  stcase( mask!=0x
6aa0: 66 66 66 66 66 66 66 66 20 26 26 20 69 43 6f 6c  ffffffff && iCol
6ab0: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 74 65  ==31 );.      te
6ac0: 73 74 63 61 73 65 28 20 6d 61 73 6b 21 3d 30 78  stcase( mask!=0x
6ad0: 66 66 66 66 66 66 66 66 20 26 26 20 69 43 6f 6c  ffffffff && iCol
6ae0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==32 );.      if
6af0: 28 20 6d 61 73 6b 3d 3d 30 78 66 66 66 66 66 66  ( mask==0xffffff
6b00: 66 66 20 7c 7c 20 28 69 43 6f 6c 3c 3d 33 31 20  ff || (iCol<=31 
6b10: 26 26 20 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  && (mask & MASKB
6b20: 49 54 33 32 28 69 43 6f 6c 29 29 21 3d 30 29 20  IT32(iCol))!=0) 
6b30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6b40: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
6b50: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
6b60: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 43  ab, iDataCur, iC
6b70: 6f 6c 2c 20 69 4f 6c 64 2b 69 43 6f 6c 2b 31 29  ol, iOld+iCol+1)
6b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6b90: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 42  .    /* Invoke B
6ba0: 45 46 4f 52 45 20 44 45 4c 45 54 45 20 74 72 69  EFORE DELETE tri
6bb0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 2a  gger programs. *
6bc0: 2f 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20  /.    addrStart 
6bd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
6be0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
6bf0: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
6c00: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
6c10: 54 72 69 67 67 65 72 2c 20 0a 20 20 20 20 20 20  Trigger, .      
6c20: 20 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20    TK_DELETE, 0, 
6c30: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20  TRIGGER_BEFORE, 
6c40: 70 54 61 62 2c 20 69 4f 6c 64 2c 20 6f 6e 63 6f  pTab, iOld, onco
6c50: 6e 66 2c 20 69 4c 61 62 65 6c 0a 20 20 20 20 29  nf, iLabel.    )
6c60: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  ;..    /* If any
6c70: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
6c80: 20 77 65 72 65 20 63 6f 64 65 64 2c 20 74 68 65   were coded, the
6c90: 6e 20 73 65 65 6b 20 74 68 65 20 63 75 72 73 6f  n seek the curso
6ca0: 72 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  r to the .    **
6cb0: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
6cc0: 65 64 20 61 67 61 69 6e 2e 20 49 74 20 6d 61 79  ed again. It may
6cd0: 20 62 65 20 74 68 61 74 20 74 68 65 20 42 45 46   be that the BEF
6ce0: 4f 52 45 20 74 72 69 67 67 65 72 73 20 6d 6f 76  ORE triggers mov
6cf0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ed.    ** the cu
6d00: 72 73 6f 72 20 6f 72 20 61 6c 72 65 61 64 79 20  rsor or already 
6d10: 64 65 6c 65 74 65 64 20 74 68 65 20 72 6f 77 20  deleted the row 
6d20: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
6d30: 77 61 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  was.    ** point
6d40: 69 6e 67 20 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  ing to..    **. 
6d50: 20 20 20 2a 2a 20 41 6c 73 6f 20 64 69 73 61 62     ** Also disab
6d60: 6c 65 20 74 68 65 20 69 49 64 78 4e 6f 53 65 65  le the iIdxNoSee
6d70: 6b 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  k optimization s
6d80: 69 6e 63 65 20 74 68 65 20 42 45 46 4f 52 45 20  ince the BEFORE 
6d90: 74 72 69 67 67 65 72 0a 20 20 20 20 2a 2a 20 6d  trigger.    ** m
6da0: 61 79 20 68 61 76 65 20 6d 6f 76 65 64 20 74 68  ay have moved th
6db0: 61 74 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  at cursor..    *
6dc0: 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 74  /.    if( addrSt
6dd0: 61 72 74 3c 73 71 6c 69 74 65 33 56 64 62 65 43  art<sqlite3VdbeC
6de0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 7b  urrentAddr(v) ){
6df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e00: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
6e10: 70 53 65 65 6b 2c 20 69 44 61 74 61 43 75 72 2c  pSeek, iDataCur,
6e20: 20 69 4c 61 62 65 6c 2c 20 69 50 6b 2c 20 6e 50   iLabel, iPk, nP
6e30: 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  k);.      VdbeCo
6e40: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 53 65  verageIf(v, opSe
6e50: 65 6b 3d 3d 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ek==OP_NotExists
6e60: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
6e70: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65  erageIf(v, opSee
6e80: 6b 3d 3d 4f 50 5f 4e 6f 74 46 6f 75 6e 64 29 3b  k==OP_NotFound);
6e90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6ea0: 20 69 49 64 78 4e 6f 53 65 65 6b 3e 3d 30 20 29   iIdxNoSeek>=0 )
6eb0: 3b 0a 20 20 20 20 20 20 69 49 64 78 4e 6f 53 65  ;.      iIdxNoSe
6ec0: 65 6b 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  ek = -1;.    }..
6ed0: 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 70 72 6f      /* Do FK pro
6ee0: 63 65 73 73 69 6e 67 2e 20 54 68 69 73 20 63 61  cessing. This ca
6ef0: 6c 6c 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ll checks that a
6f00: 6e 79 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  ny FK constraint
6f10: 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
6f20: 66 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  fer to this tabl
6f30: 65 20 28 69 2e 65 2e 20 63 6f 6e 73 74 72 61 69  e (i.e. constrai
6f40: 6e 74 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  nts attached to 
6f50: 6f 74 68 65 72 20 74 61 62 6c 65 73 29 20 0a 20  other tables) . 
6f60: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 76 69     ** are not vi
6f70: 6f 6c 61 74 65 64 20 62 79 20 64 65 6c 65 74 69  olated by deleti
6f80: 6e 67 20 74 68 69 73 20 72 6f 77 2e 20 20 2a 2f  ng this row.  */
6f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43 68  .    sqlite3FkCh
6fa0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62  eck(pParse, pTab
6fb0: 2c 20 69 4f 6c 64 2c 20 30 2c 20 30 2c 20 30 29  , iOld, 0, 0, 0)
6fc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
6fd0: 74 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  te the index and
6fe0: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
6ff0: 53 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 69  Skip this step i
7000: 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79  f pTab is really
7010: 0a 20 20 2a 2a 20 61 20 76 69 65 77 20 28 69 6e  .  ** a view (in
7020: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
7030: 6f 6e 6c 79 20 65 66 66 65 63 74 20 6f 66 20 74  only effect of t
7040: 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  he DELETE statem
7050: 65 6e 74 20 69 73 20 74 6f 0a 20 20 2a 2a 20 66  ent is to.  ** f
7060: 69 72 65 20 74 68 65 20 49 4e 53 54 45 41 44 20  ire the INSTEAD 
7070: 4f 46 20 74 72 69 67 67 65 72 73 29 2e 20 20 0a  OF triggers).  .
7080: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 76 61 72    **.  ** If var
7090: 69 61 62 6c 65 20 27 63 6f 75 6e 74 27 20 69 73  iable 'count' is
70a0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
70b0: 74 68 69 73 20 4f 50 5f 44 65 6c 65 74 65 20 69  this OP_Delete i
70c0: 6e 73 74 72 75 63 74 69 6f 6e 20 73 68 6f 75 6c  nstruction shoul
70d0: 64 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  d.  ** invoke th
70e0: 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 2e 20 54  e update-hook. T
70f0: 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f  he pre-update-ho
7100: 6f 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ok, on the other
7110: 20 68 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 2a   hand should.  *
7120: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 75 6e 6c  * be invoked unl
7130: 65 73 73 20 74 61 62 6c 65 20 70 54 61 62 20 69  ess table pTab i
7140: 73 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65  s a system table
7150: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
7160: 20 69 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68   is that.  ** th
7170: 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73  e update-hook is
7180: 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 66 6f 72   not invoked for
7190: 20 72 6f 77 73 20 72 65 6d 6f 76 65 64 20 62 79   rows removed by
71a0: 20 52 45 50 4c 41 43 45 2c 20 62 75 74 20 74 68   REPLACE, but th
71b0: 65 20 0a 20 20 2a 2a 20 70 72 65 2d 75 70 64 61  e .  ** pre-upda
71c0: 74 65 2d 68 6f 6f 6b 20 69 73 2e 0a 20 20 2a 2f  te-hook is..  */
71d0: 20 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53   .  if( pTab->pS
71e0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
71f0: 75 38 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 73  u8 p5 = 0;.    s
7200: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
7210: 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50 61  wIndexDelete(pPa
7220: 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61  rse, pTab, iData
7230: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 30 2c 69  Cur, iIdxCur,0,i
7240: 49 64 78 4e 6f 53 65 65 6b 29 3b 0a 20 20 20 20  IdxNoSeek);.    
7250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7260: 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  2(v, OP_Delete, 
7270: 69 44 61 74 61 43 75 72 2c 20 28 63 6f 75 6e 74  iDataCur, (count
7280: 3f 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3a  ?OPFLAG_NCHANGE:
7290: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0));.    if( pPa
72a0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 7c  rse->nested==0 |
72b0: 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
72c0: 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  icmp(pTab->zName
72d0: 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
72e0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
72f0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
7300: 2c 20 28 63 68 61 72 2a 29 70 54 61 62 2c 20 50  , (char*)pTab, P
7310: 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a  4_TABLE);.    }.
7320: 20 20 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 4f      if( eMode!=O
7330: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
7340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7350: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7360: 47 5f 41 55 58 44 45 4c 45 54 45 29 3b 0a 20 20  G_AUXDELETE);.  
7370: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49 64 78    }.    if( iIdx
7380: 4e 6f 53 65 65 6b 3e 3d 30 20 26 26 20 69 49 64  NoSeek>=0 && iId
7390: 78 4e 6f 53 65 65 6b 21 3d 69 44 61 74 61 43 75  xNoSeek!=iDataCu
73a0: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
73b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
73c0: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 49 64 78 4e  OP_Delete, iIdxN
73d0: 6f 53 65 65 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  oSeek);.    }.  
73e0: 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 4f 4e 45    if( eMode==ONE
73f0: 50 41 53 53 5f 4d 55 4c 54 49 20 29 20 70 35 20  PASS_MULTI ) p5 
7400: 7c 3d 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  |= OPFLAG_SAVEPO
7410: 53 49 54 49 4f 4e 3b 0a 20 20 20 20 73 71 6c 69  SITION;.    sqli
7420: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7430: 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 0a 20 20 2f  v, p5);.  }..  /
7440: 2a 20 44 6f 20 61 6e 79 20 4f 4e 20 43 41 53 43  * Do any ON CASC
7450: 41 44 45 2c 20 53 45 54 20 4e 55 4c 4c 20 6f 72  ADE, SET NULL or
7460: 20 53 45 54 20 44 45 46 41 55 4c 54 20 6f 70 65   SET DEFAULT ope
7470: 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
7480: 20 74 6f 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20   to.  ** handle 
7490: 72 6f 77 73 20 28 70 6f 73 73 69 62 6c 79 20 69  rows (possibly i
74a0: 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 29 20  n other tables) 
74b0: 74 68 61 74 20 72 65 66 65 72 20 76 69 61 20 61  that refer via a
74c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 20 20 2a   foreign key.  *
74d0: 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 6a 75 73  * to the row jus
74e0: 74 20 64 65 6c 65 74 65 64 2e 20 2a 2f 20 0a 20  t deleted. */ . 
74f0: 20 73 71 6c 69 74 65 33 46 6b 41 63 74 69 6f 6e   sqlite3FkAction
7500: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
7510: 30 2c 20 69 4f 6c 64 2c 20 30 2c 20 30 29 3b 0a  0, iOld, 0, 0);.
7520: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 46 54  .  /* Invoke AFT
7530: 45 52 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  ER DELETE trigge
7540: 72 20 70 72 6f 67 72 61 6d 73 2e 20 2a 2f 0a 20  r programs. */. 
7550: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
7560: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
7570: 54 72 69 67 67 65 72 2c 20 0a 20 20 20 20 20 20  Trigger, .      
7580: 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54 52  TK_DELETE, 0, TR
7590: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
75a0: 62 2c 20 69 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c  b, iOld, onconf,
75b0: 20 69 4c 61 62 65 6c 0a 20 20 29 3b 0a 0a 20 20   iLabel.  );..  
75c0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
75d0: 74 68 65 20 72 6f 77 20 68 61 64 20 61 6c 72 65  the row had alre
75e0: 61 64 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ady been deleted
75f0: 20 62 65 66 6f 72 65 20 61 6e 79 20 42 45 46 4f   before any BEFO
7600: 52 45 0a 20 20 2a 2a 20 74 72 69 67 67 65 72 20  RE.  ** trigger 
7610: 70 72 6f 67 72 61 6d 73 20 77 65 72 65 20 69 6e  programs were in
7620: 76 6f 6b 65 64 2e 20 4f 72 20 69 66 20 61 20 74  voked. Or if a t
7630: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 74  rigger program t
7640: 68 72 6f 77 73 20 61 20 0a 20 20 2a 2a 20 52 41  hrows a .  ** RA
7650: 49 53 45 28 49 47 4e 4f 52 45 29 20 65 78 63 65  ISE(IGNORE) exce
7660: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 73 71 6c  ption.  */.  sql
7670: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7680: 61 62 65 6c 28 76 2c 20 69 4c 61 62 65 6c 29 3b  abel(v, iLabel);
7690: 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
76a0: 6d 65 6e 74 28 28 76 2c 20 22 45 4e 44 3a 20 47  ment((v, "END: G
76b0: 65 6e 52 6f 77 44 65 6c 28 29 22 29 29 3b 0a 7d  enRowDel()"));.}
76c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
76d0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
76e0: 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 63 61  DBE code that ca
76f0: 75 73 65 73 20 74 68 65 20 64 65 6c 65 74 69 6f  uses the deletio
7700: 6e 20 6f 66 20 61 6c 6c 0a 2a 2a 20 69 6e 64 65  n of all.** inde
7710: 78 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  x entries associ
7720: 61 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67  ated with a sing
7730: 6c 65 20 72 6f 77 20 6f 66 20 61 20 73 69 6e 67  le row of a sing
7740: 6c 65 20 74 61 62 6c 65 2c 20 70 54 61 62 0a 2a  le table, pTab.*
7750: 2a 0a 2a 2a 20 50 72 65 63 6f 6e 64 69 74 69 6f  *.** Preconditio
7760: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  ns:.**.**   1.  
7770: 41 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  A read/write cur
7780: 73 6f 72 20 22 69 44 61 74 61 43 75 72 22 20 6d  sor "iDataCur" m
7790: 75 73 74 20 62 65 20 6f 70 65 6e 20 6f 6e 20 74  ust be open on t
77a0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 73 74 6f  he canonical sto
77b0: 72 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 62 74  rage.**       bt
77c0: 72 65 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ree for the tabl
77d0: 65 20 70 54 61 62 2e 20 20 28 54 68 69 73 20 77  e pTab.  (This w
77e0: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 74 68  ill be either th
77f0: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 2a  e table itself.*
7800: 2a 20 20 20 20 20 20 20 66 6f 72 20 72 6f 77 69  *       for rowi
7810: 64 20 74 61 62 6c 65 73 20 6f 72 20 74 6f 20 74  d tables or to t
7820: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
7830: 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
7840: 20 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 20 20   ROWID.**       
7850: 74 61 62 6c 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 20  tables.).**.**  
7860: 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20   2.  Read/write 
7870: 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
7880: 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
7890: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a  must be open as.
78a0: 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  **       cursor 
78b0: 6e 75 6d 62 65 72 20 69 49 64 78 43 75 72 2b 69  number iIdxCur+i
78c0: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 69 6e   for the i-th in
78d0: 64 65 78 2e 20 20 28 54 68 65 20 70 54 61 62 2d  dex.  (The pTab-
78e0: 3e 70 49 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20  >pIndex.**      
78f0: 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 30 2d   index is the 0-
7900: 74 68 20 69 6e 64 65 78 2e 29 0a 2a 2a 0a 2a 2a  th index.).**.**
7910: 20 20 20 33 2e 20 20 54 68 65 20 22 69 44 61 74     3.  The "iDat
7920: 61 43 75 72 22 20 63 75 72 73 6f 72 20 6d 75 73  aCur" cursor mus
7930: 74 20 62 65 20 61 6c 72 65 61 64 79 20 62 65 20  t be already be 
7940: 70 6f 73 69 74 69 6f 6e 65 64 20 6f 6e 20 74 68  positioned on th
7950: 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74  e row.**       t
7960: 68 61 74 20 69 73 20 74 6f 20 62 65 20 64 65 6c  hat is to be del
7970: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
7980: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77  lite3GenerateRow
7990: 49 6e 64 65 78 44 65 6c 65 74 65 28 0a 20 20 50  IndexDelete(.  P
79a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
79b0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
79c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
79d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
79e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
79f0: 20 2f 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61 69   /* Table contai
7a00: 6e 69 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20  ning the row to 
7a10: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
7a20: 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20 20  int iDataCur,   
7a30: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
7a40: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 64 61  table holding da
7a50: 74 61 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ta. */.  int iId
7a60: 78 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 46  xCur,       /* F
7a70: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
7a80: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67  r */.  int *aReg
7a90: 49 64 78 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 6c  Idx,      /* Onl
7aa0: 79 20 64 65 6c 65 74 65 20 69 66 20 61 52 65 67  y delete if aReg
7ab0: 49 64 78 21 3d 30 20 26 26 20 61 52 65 67 49 64  Idx!=0 && aRegId
7ac0: 78 5b 69 5d 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  x[i]>0 */.  int 
7ad0: 69 49 64 78 4e 6f 53 65 65 6b 20 20 20 20 20 2f  iIdxNoSeek     /
7ae0: 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  * Do not delete 
7af0: 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72  from this cursor
7b00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7b20: 6e 64 65 78 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  ndex loop counte
7b30: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 20 3d 20  r */.  int r1 = 
7b40: 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  -1;       /* Reg
7b50: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
7b60: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
7b70: 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
7b80: 6c 3b 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69  l; /* Jump desti
7b90: 6e 61 74 69 6f 6e 20 66 6f 72 20 73 6b 69 70 70  nation for skipp
7ba0: 69 6e 67 20 70 61 72 74 69 61 6c 20 69 6e 64 65  ing partial inde
7bb0: 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 49  x entries */.  I
7bc0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
7bd0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 64    /* Current ind
7be0: 65 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ex */.  Index *p
7bf0: 50 72 69 6f 72 20 3d 20 30 3b 20 2f 2a 20 50 72  Prior = 0; /* Pr
7c00: 69 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ior index */.  V
7c10: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
7c20: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
7c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
7c40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
7c50: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20  /.  Index *pPk; 
7c60: 20 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52         /* PRIMAR
7c70: 59 20 4b 45 59 20 69 6e 64 65 78 2c 20 6f 72 20  Y KEY index, or 
7c80: 4e 55 4c 4c 20 66 6f 72 20 72 6f 77 69 64 20 74  NULL for rowid t
7c90: 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 76 20 3d 20  ables */..  v = 
7ca0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7cb0: 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28   pPk = HasRowid(
7cc0: 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69  pTab) ? 0 : sqli
7cd0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
7ce0: 65 78 28 70 54 61 62 29 3b 0a 20 20 66 6f 72 28  ex(pTab);.  for(
7cf0: 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=0, pIdx=pTab->
7d00: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 69 2b  pIndex; pIdx; i+
7d10: 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  +, pIdx=pIdx->pN
7d20: 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ext){.    assert
7d30: 28 20 69 49 64 78 43 75 72 2b 69 21 3d 69 44 61  ( iIdxCur+i!=iDa
7d40: 74 61 43 75 72 20 7c 7c 20 70 50 6b 3d 3d 70 49  taCur || pPk==pI
7d50: 64 78 20 29 3b 0a 20 20 20 20 69 66 28 20 61 52  dx );.    if( aR
7d60: 65 67 49 64 78 21 3d 30 20 26 26 20 61 52 65 67  egIdx!=0 && aReg
7d70: 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Idx[i]==0 ) cont
7d80: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
7d90: 64 78 3d 3d 70 50 6b 20 29 20 63 6f 6e 74 69 6e  dx==pPk ) contin
7da0: 75 65 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78  ue;.    if( iIdx
7db0: 43 75 72 2b 69 3d 3d 69 49 64 78 4e 6f 53 65 65  Cur+i==iIdxNoSee
7dc0: 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  k ) continue;.  
7dd0: 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
7de0: 65 6e 74 28 28 76 2c 20 22 47 65 6e 52 6f 77 49  ent((v, "GenRowI
7df0: 64 78 44 65 6c 20 66 6f 72 20 25 73 22 2c 20 70  dxDel for %s", p
7e00: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
7e10: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7e20: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
7e30: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61  Parse, pIdx, iDa
7e40: 74 61 43 75 72 2c 20 30 2c 20 31 2c 0a 20 20 20  taCur, 0, 1,.   
7e50: 20 20 20 20 20 26 69 50 61 72 74 49 64 78 4c 61       &iPartIdxLa
7e60: 62 65 6c 2c 20 70 50 72 69 6f 72 2c 20 72 31 29  bel, pPrior, r1)
7e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7e80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
7e90: 78 44 65 6c 65 74 65 2c 20 69 49 64 78 43 75 72  xDelete, iIdxCur
7ea0: 2b 69 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  +i, r1,.        
7eb0: 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
7ec0: 6c 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l ? pIdx->nKeyCo
7ed0: 6c 20 3a 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l : pIdx->nColum
7ee0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  n);.    sqlite3R
7ef0: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
7f00: 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
7f10: 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 20 20 70  IdxLabel);.    p
7f20: 50 72 69 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20  Prior = pIdx;.  
7f30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
7f40: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
7f50: 6c 6c 20 61 73 73 65 6d 62 6c 65 20 61 6e 20 69  ll assemble an i
7f60: 6e 64 65 78 20 6b 65 79 20 61 6e 64 20 73 74 6f  ndex key and sto
7f70: 72 65 73 20 69 74 20 69 6e 20 72 65 67 69 73 74  res it in regist
7f80: 65 72 0a 2a 2a 20 72 65 67 4f 75 74 2e 20 20 54  er.** regOut.  T
7f90: 68 65 20 6b 65 79 20 77 69 74 68 20 62 65 20 66  he key with be f
7fa0: 6f 72 20 69 6e 64 65 78 20 70 49 64 78 20 77 68  or index pIdx wh
7fb0: 69 63 68 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ich is an index 
7fc0: 6f 6e 20 70 54 61 62 2e 0a 2a 2a 20 69 43 75 72  on pTab..** iCur
7fd0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
7fe0: 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f   a cursor open o
7ff0: 6e 20 74 68 65 20 70 54 61 62 20 74 61 62 6c 65  n the pTab table
8000: 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f   and pointing to
8010: 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 74 68  .** the entry th
8020: 61 74 20 6e 65 65 64 73 20 69 6e 64 65 78 69 6e  at needs indexin
8030: 67 2e 20 20 49 66 20 70 54 61 62 20 69 73 20 61  g.  If pTab is a
8040: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
8050: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 69 43  able, then.** iC
8060: 75 72 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  ur must be the c
8070: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 50 52 49  ursor of the PRI
8080: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a  MARY KEY index..
8090: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 72  **.** Return a r
80a0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
80b0: 68 69 63 68 20 69 73 20 74 68 65 20 66 69 72 73  hich is the firs
80c0: 74 20 69 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 0a  t in a block of.
80d0: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 68 61  ** registers tha
80e0: 74 20 68 6f 6c 64 73 20 74 68 65 20 65 6c 65 6d  t holds the elem
80f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 64 65  ents of the inde
8100: 78 20 6b 65 79 2e 20 20 54 68 65 0a 2a 2a 20 62  x key.  The.** b
8110: 6c 6f 63 6b 20 6f 66 20 72 65 67 69 73 74 65 72  lock of register
8120: 73 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  s has already be
8130: 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 62  en deallocated b
8140: 79 20 74 68 65 20 74 69 6d 65 0a 2a 2a 20 74 68  y the time.** th
8150: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
8160: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 69  ns..**.** If *pi
8170: 50 61 72 74 49 64 78 4c 61 62 65 6c 20 69 73 20  PartIdxLabel is 
8180: 6e 6f 74 20 4e 55 4c 4c 2c 20 66 69 6c 6c 20 69  not NULL, fill i
8190: 74 20 69 6e 20 77 69 74 68 20 61 20 6c 61 62 65  t in with a labe
81a0: 6c 20 61 6e 64 20 6a 75 6d 70 0a 2a 2a 20 74 6f  l and jump.** to
81b0: 20 74 68 61 74 20 6c 61 62 65 6c 20 69 66 20 70   that label if p
81c0: 49 64 78 20 69 73 20 61 20 70 61 72 74 69 61 6c  Idx is a partial
81d0: 20 69 6e 64 65 78 20 74 68 61 74 20 73 68 6f 75   index that shou
81e0: 6c 64 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 2a  ld be skipped..*
81f0: 2a 20 54 68 65 20 6c 61 62 65 6c 20 73 68 6f 75  * The label shou
8200: 6c 64 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ld be resolved u
8210: 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 73 6f  sing sqlite3Reso
8220: 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
8230: 29 2e 0a 2a 2a 20 41 20 70 61 72 74 69 61 6c 20  )..** A partial 
8240: 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
8250: 73 6b 69 70 70 65 64 20 69 66 20 69 74 73 20 57  skipped if its W
8260: 48 45 52 45 20 63 6c 61 75 73 65 20 65 76 61 6c  HERE clause eval
8270: 75 61 74 65 73 0a 2a 2a 20 74 6f 20 66 61 6c 73  uates.** to fals
8280: 65 20 6f 72 20 6e 75 6c 6c 2e 20 20 49 66 20 70  e or null.  If p
8290: 49 64 78 20 69 73 20 6e 6f 74 20 61 20 70 61 72  Idx is not a par
82a0: 74 69 61 6c 20 69 6e 64 65 78 2c 20 2a 70 69 50  tial index, *piP
82b0: 61 72 74 49 64 78 4c 61 62 65 6c 0a 2a 2a 20 77  artIdxLabel.** w
82c0: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 7a 65  ill be set to ze
82d0: 72 6f 20 77 68 69 63 68 20 69 73 20 61 6e 20 65  ro which is an e
82e0: 6d 70 74 79 20 6c 61 62 65 6c 20 74 68 61 74 20  mpty label that 
82f0: 69 73 20 69 67 6e 6f 72 65 64 20 62 79 0a 2a 2a  is ignored by.**
8300: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
8310: 61 72 74 49 64 78 4c 61 62 65 6c 28 29 2e 0a 2a  artIdxLabel()..*
8320: 2a 0a 2a 2a 20 54 68 65 20 70 50 72 69 6f 72 20  *.** The pPrior 
8330: 61 6e 64 20 72 65 67 50 72 69 6f 72 20 70 61 72  and regPrior par
8340: 61 6d 65 74 65 72 73 20 61 72 65 20 75 73 65 64  ameters are used
8350: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
8360: 63 61 63 68 65 20 74 6f 0a 2a 2a 20 61 76 6f 69  cache to.** avoi
8370: 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 72 65  d unnecessary re
8380: 67 69 73 74 65 72 20 6c 6f 61 64 73 2e 20 20 49  gister loads.  I
8390: 66 20 70 50 72 69 6f 72 20 69 73 20 6e 6f 74 20  f pPrior is not 
83a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
83b0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
83c0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 69 6e 64   a different ind
83d0: 65 78 20 66 6f 72 20 77 68 69 63 68 20 61 6e 20  ex for which an 
83e0: 69 6e 64 65 78 20 6b 65 79 20 68 61 73 20 6a 75  index key has ju
83f0: 73 74 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  st been.** compu
8400: 74 65 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ted into registe
8410: 72 20 72 65 67 50 72 69 6f 72 2e 20 20 49 66 20  r regPrior.  If 
8420: 74 68 65 20 63 75 72 72 65 6e 74 20 70 49 64 78  the current pIdx
8430: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
8440: 74 69 6e 67 0a 2a 2a 20 69 74 73 20 6b 65 79 20  ting.** its key 
8450: 69 6e 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  into the same se
8460: 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
8470: 65 72 73 20 61 6e 64 20 69 66 20 70 50 72 69 6f  ers and if pPrio
8480: 72 20 61 6e 64 20 70 49 64 78 20 73 68 61 72 65  r and pIdx share
8490: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
84a0: 63 6f 6d 6d 6f 6e 2c 20 74 68 65 6e 20 74 68 65  common, then the
84b0: 20 72 65 67 69 73 74 65 72 20 63 6f 72 72 65 73   register corres
84c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 61 74 20  ponding to that 
84d0: 63 6f 6c 75 6d 6e 20 61 6c 72 65 61 64 79 0a 2a  column already.*
84e0: 2a 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 72 72  * holds the corr
84f0: 65 63 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ect value and th
8500: 65 20 6c 6f 61 64 69 6e 67 20 6f 66 20 74 68 61  e loading of tha
8510: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 73 6b  t register is sk
8520: 69 70 70 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6f  ipped..** This o
8530: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 68  ptimization is h
8540: 65 6c 70 66 75 6c 20 77 68 65 6e 20 64 6f 69 6e  elpful when doin
8550: 67 20 61 20 44 45 4c 45 54 45 20 6f 72 20 61 6e  g a DELETE or an
8560: 20 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b   INTEGRITY_CHECK
8570: 20 0a 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 20   .** on a table 
8580: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 69 6e  with multiple in
8590: 64 69 63 65 73 2c 20 61 6e 64 20 65 73 70 65 63  dices, and espec
85a0: 69 61 6c 6c 79 20 77 69 74 68 20 74 68 65 20 52  ially with the R
85b0: 4f 57 49 44 20 6f 72 0a 2a 2a 20 50 52 49 4d 41  OWID or.** PRIMA
85c0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 6f  RY KEY columns o
85d0: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  f the index..*/.
85e0: 69 6e 74 20 73 71 6c 69 74 65 33 47 65 6e 65 72  int sqlite3Gener
85f0: 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 50  ateIndexKey(.  P
8600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8610: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
8630: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
8640: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 66 6f   /* The index fo
8650: 72 20 77 68 69 63 68 20 74 6f 20 67 65 6e 65 72  r which to gener
8660: 61 74 65 20 61 20 6b 65 79 20 2a 2f 0a 20 20 69  ate a key */.  i
8670: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20 20 20  nt iDataCur,    
8680: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
8690: 6d 62 65 72 20 66 72 6f 6d 20 77 68 69 63 68 20  mber from which 
86a0: 74 6f 20 74 61 6b 65 20 63 6f 6c 75 6d 6e 20 64  to take column d
86b0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
86c0: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Out,          /*
86d0: 20 50 75 74 20 74 68 65 20 6e 65 77 20 6b 65 79   Put the new key
86e0: 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
86f0: 74 65 72 20 69 66 20 6e 6f 74 20 30 20 2a 2f 0a  ter if not 0 */.
8700: 20 20 69 6e 74 20 70 72 65 66 69 78 4f 6e 6c 79    int prefixOnly
8710: 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ,      /* Comput
8720: 65 20 6f 6e 6c 79 20 61 20 75 6e 69 71 75 65 20  e only a unique 
8730: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65  prefix of the ke
8740: 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 61  y */.  int *piPa
8750: 72 74 49 64 78 4c 61 62 65 6c 2c 20 2f 2a 20 4f  rtIdxLabel, /* O
8760: 55 54 3a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73  UT: Jump to this
8770: 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 70   label to skip p
8780: 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
8790: 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 2c    Index *pPrior,
87a0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
87b0: 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 69  usly generated i
87c0: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ndex key */.  in
87d0: 74 20 72 65 67 50 72 69 6f 72 20 20 20 20 20 20  t regPrior      
87e0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
87f0: 6f 6c 64 69 6e 67 20 70 72 65 76 69 6f 75 73 20  olding previous 
8800: 67 65 6e 65 72 61 74 65 64 20 6b 65 79 20 2a 2f  generated key */
8810: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
8820: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8830: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 72 65   int j;.  int re
8840: 67 42 61 73 65 3b 0a 20 20 69 6e 74 20 6e 43 6f  gBase;.  int nCo
8850: 6c 3b 0a 0a 20 20 69 66 28 20 70 69 50 61 72 74  l;..  if( piPart
8860: 49 64 78 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  IdxLabel ){.    
8870: 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
8880: 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  dxWhere ){.     
8890: 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c   *piPartIdxLabel
88a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
88b0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
88c0: 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
88d0: 61 62 20 3d 20 69 44 61 74 61 43 75 72 20 2b 20  ab = iDataCur + 
88e0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
88f0: 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 70  ExprIfFalseDup(p
8900: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 50 61  Parse, pIdx->pPa
8910: 72 74 49 64 78 57 68 65 72 65 2c 20 2a 70 69 50  rtIdxWhere, *piP
8920: 61 72 74 49 64 78 4c 61 62 65 6c 2c 20 0a 20 20  artIdxLabel, .  
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8950: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
8960: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
8970: 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65  fTab = 0;.    }e
8980: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 50 61  lse{.      *piPa
8990: 72 74 49 64 78 4c 61 62 65 6c 20 3d 20 30 3b 0a  rtIdxLabel = 0;.
89a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c      }.  }.  nCol
89b0: 20 3d 20 28 70 72 65 66 69 78 4f 6e 6c 79 20 26   = (prefixOnly &
89c0: 26 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  & pIdx->uniqNotN
89d0: 75 6c 6c 29 20 3f 20 70 49 64 78 2d 3e 6e 4b 65  ull) ? pIdx->nKe
89e0: 79 43 6f 6c 20 3a 20 70 49 64 78 2d 3e 6e 43 6f  yCol : pIdx->nCo
89f0: 6c 75 6d 6e 3b 0a 20 20 72 65 67 42 61 73 65 20  lumn;.  regBase 
8a00: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8a10: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
8a20: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ol);.  if( pPrio
8a30: 72 20 26 26 20 28 72 65 67 42 61 73 65 21 3d 72  r && (regBase!=r
8a40: 65 67 50 72 69 6f 72 20 7c 7c 20 70 50 72 69 6f  egPrior || pPrio
8a50: 72 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  r->pPartIdxWhere
8a60: 29 20 29 20 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ) ) pPrior = 0;.
8a70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
8a80: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
8a90: 20 70 50 72 69 6f 72 0a 20 20 20 20 20 26 26 20   pPrior.     && 
8aa0: 70 50 72 69 6f 72 2d 3e 61 69 43 6f 6c 75 6d 6e  pPrior->aiColumn
8ab0: 5b 6a 5d 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  [j]==pIdx->aiCol
8ac0: 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 26 26 20 70  umn[j].     && p
8ad0: 50 72 69 6f 72 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Prior->aiColumn[
8ae0: 6a 5d 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20 20  j]!=XN_EXPR.    
8af0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
8b00: 20 63 6f 6c 75 6d 6e 20 77 61 73 20 61 6c 72 65   column was alre
8b10: 61 64 79 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ady computed by 
8b20: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 64  the previous ind
8b30: 65 78 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  ex */.      cont
8b40: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
8b50: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
8b60: 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70  oadIndexColumn(p
8b70: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61  Parse, pIdx, iDa
8b80: 74 61 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  taCur, j, regBas
8b90: 65 2b 6a 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  e+j);.    /* If 
8ba0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
8bb0: 69 74 79 20 69 73 20 52 45 41 4c 20 62 75 74 20  ity is REAL but 
8bc0: 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6e  the number is an
8bd0: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 69   integer, then i
8be0: 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  t.    ** might b
8bf0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
8c00: 74 61 62 6c 65 20 61 73 20 61 6e 20 69 6e 74 65  table as an inte
8c10: 67 65 72 20 28 75 73 69 6e 67 20 61 20 63 6f 6d  ger (using a com
8c20: 70 61 63 74 0a 20 20 20 20 2a 2a 20 72 65 70 72  pact.    ** repr
8c30: 65 73 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 6e  esentation) then
8c40: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 52 45   converted to RE
8c50: 41 4c 20 62 79 20 61 6e 20 4f 50 5f 52 65 61 6c  AL by an OP_Real
8c60: 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 2e  Affinity opcode.
8c70: 0a 20 20 20 20 2a 2a 20 42 75 74 20 77 65 20 61  .    ** But we a
8c80: 72 65 20 67 65 74 74 69 6e 67 20 72 65 61 64 79  re getting ready
8c90: 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73 20 76   to store this v
8ca0: 61 6c 75 65 20 62 61 63 6b 20 69 6e 74 6f 20 61  alue back into a
8cb0: 6e 20 69 6e 64 65 78 2c 20 77 68 65 72 65 0a 20  n index, where. 
8cc0: 20 20 20 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20     ** it should 
8cd0: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 62 79 20  be converted by 
8ce0: 74 6f 20 49 4e 54 45 47 45 52 20 61 67 61 69 6e  to INTEGER again
8cf0: 2e 20 20 53 6f 20 6f 6d 69 74 20 74 68 65 20 4f  .  So omit the O
8d00: 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 0a 20  P_RealAffinity. 
8d10: 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 66 20     ** opcode if 
8d20: 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  it is present */
8d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8d40: 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64  DeletePriorOpcod
8d50: 65 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  e(v, OP_RealAffi
8d60: 6e 69 74 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  nity);.  }.  if(
8d70: 20 72 65 67 4f 75 74 20 29 7b 0a 20 20 20 20 73   regOut ){.    s
8d80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8d90: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8da0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
8db0: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 69  , regOut);.    i
8dc0: 66 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  f( pIdx->pTable-
8dd0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
8de0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
8df0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
8e00: 78 41 66 66 69 6e 69 74 79 53 74 72 28 70 50 61  xAffinityStr(pPa
8e10: 72 73 65 2d 3e 64 62 2c 20 70 49 64 78 29 3b 0a  rse->db, pIdx);.
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
8e40: 20 7a 41 66 66 2c 20 50 34 5f 54 52 41 4e 53 49   zAff, P4_TRANSI
8e50: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
8e60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8e70: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
8e80: 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
8e90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  ;.  return regBa
8ea0: 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  se;.}../*.** If 
8eb0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
8ec0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
8ed0: 6e 64 65 78 4b 65 79 28 29 20 67 65 6e 65 72 61  ndexKey() genera
8ee0: 74 65 64 20 61 20 6a 75 6d 70 2d 6f 76 65 72 20  ted a jump-over 
8ef0: 6c 61 62 65 6c 0a 2a 2a 20 62 65 63 61 75 73 65  label.** because
8f00: 20 69 74 20 77 61 73 20 61 20 70 61 72 74 69 61   it was a partia
8f10: 6c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68  l index, then th
8f20: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
8f30: 64 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 0a 2a  d be called to.*
8f40: 2a 20 72 65 73 6f 6c 76 65 20 74 68 61 74 20 6c  * resolve that l
8f50: 61 62 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  abel..*/.void sq
8f60: 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
8f70: 49 64 78 4c 61 62 65 6c 28 50 61 72 73 65 20 2a  IdxLabel(Parse *
8f80: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 4c 61 62  pParse, int iLab
8f90: 65 6c 29 7b 0a 20 20 69 66 28 20 69 4c 61 62 65  el){.  if( iLabe
8fa0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
8fb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
8fc0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
8fd0: 69 4c 61 62 65 6c 29 3b 0a 20 20 7d 0a 7d 0a     iLabel);.  }.}.