/ Hex Artifact Content
Login

Artifact 3f16e7ceb9e5084b127e0a4e10a9b06ca66c0b2e:


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 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
05b0: 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
05c0: 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
05d0: 65 2c 20 70 49 74 65 6d 29 20 29 7b 0a 20 20 20  e, pItem) ){.   
05e0: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20   pTab = 0;.  }. 
05f0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
0600: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
0610: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 69  make sure the gi
0620: 76 65 6e 20 74 61 62 6c 65 20 69 73 20 77 72 69  ven table is wri
0630: 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20 69 73  table.  If it is
0640: 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61 62 6c 65   not.** writable
0650: 2c 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  , generate an er
0660: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
0670: 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 69 74  return 1.  If it
0680: 20 69 73 0a 2a 2a 20 77 72 69 74 61 62 6c 65 20   is.** writable 
0690: 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a 69 6e 74  return 0;.*/.int
06a0: 20 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e   sqlite3IsReadOn
06b0: 6c 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ly(Parse *pParse
06c0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
06d0: 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20 20 2f 2a  nt viewOk){.  /*
06e0: 20 41 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20   A table is not 
06f0: 77 72 69 74 61 62 6c 65 20 75 6e 64 65 72 20 74  writable under t
0700: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 69 72  he following cir
0710: 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
0720: 0a 20 20 2a 2a 20 20 20 31 29 20 49 74 20 69 73  .  **   1) It is
0730: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
0740: 20 61 6e 64 20 6e 6f 20 69 6d 70 6c 65 6d 65 6e   and no implemen
0750: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 55  tation of the xU
0760: 70 64 61 74 65 20 6d 65 74 68 6f 64 0a 20 20 2a  pdate method.  *
0770: 2a 20 20 20 20 20 20 68 61 73 20 62 65 65 6e 20  *      has been 
0780: 70 72 6f 76 69 64 65 64 2c 20 6f 72 0a 20 20 2a  provided, or.  *
0790: 2a 20 20 20 32 29 20 49 74 20 69 73 20 61 20 73  *   2) It is a s
07a0: 79 73 74 65 6d 20 74 61 62 6c 65 20 28 69 2e 65  ystem table (i.e
07b0: 2e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 29  . sqlite_master)
07c0: 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 6e  , this call is n
07d0: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 70 61 72  ot.  **      par
07e0: 74 20 6f 66 20 61 20 6e 65 73 74 65 64 20 70 61  t of a nested pa
07f0: 72 73 65 20 61 6e 64 20 77 72 69 74 61 62 6c 65  rse and writable
0800: 5f 73 63 68 65 6d 61 20 70 72 61 67 6d 61 20 68  _schema pragma h
0810: 61 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 20 20 20  as not .  **    
0820: 20 20 62 65 65 6e 20 73 70 65 63 69 66 69 65 64    been specified
0830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 65  ..  **.  ** In e
0840: 69 74 68 65 72 20 63 61 73 65 20 6c 65 61 76 65  ither case leave
0850: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
0860: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
0870: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
0880: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 20 49 73  .  */.  if( ( Is
0890: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 0a 20  Virtual(pTab) . 
08a0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 65      && sqlite3Ge
08b0: 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
08c0: 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
08d0: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74  >pModule->xUpdat
08e0: 65 3d 3d 30 20 29 0a 20 20 20 7c 7c 20 28 20 28  e==0 ).   || ( (
08f0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
0900: 20 54 46 5f 52 65 61 64 6f 6e 6c 79 29 21 3d 30   TF_Readonly)!=0
0910: 0a 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65  .     && (pParse
0920: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
0930: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
0940: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 50 61  )==0.     && pPa
0950: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
0960: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
0970: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
0980: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
0990: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22  not be modified"
09a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
09b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
09c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
09d0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
09e0: 28 20 21 76 69 65 77 4f 6b 20 26 26 20 70 54 61  ( !viewOk && pTa
09f0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
0a00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0a10: 67 28 70 50 61 72 73 65 2c 22 63 61 6e 6e 6f 74  g(pParse,"cannot
0a20: 20 6d 6f 64 69 66 79 20 25 73 20 62 65 63 61 75   modify %s becau
0a30: 73 65 20 69 74 20 69 73 20 61 20 76 69 65 77 22  se it is a view"
0a40: 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ,pTab->zName);. 
0a50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0a60: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0a70: 20 30 3b 0a 7d 0a 0a 0a 23 69 66 20 21 64 65 66   0;.}...#if !def
0a80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0a90: 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e  _VIEW) && !defin
0aa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
0ab0: 52 49 47 47 45 52 29 0a 2f 2a 0a 2a 2a 20 45 76  RIGGER)./*.** Ev
0ac0: 61 6c 75 61 74 65 20 61 20 76 69 65 77 20 61 6e  aluate a view an
0ad0: 64 20 73 74 6f 72 65 20 69 74 73 20 72 65 73 75  d store its resu
0ae0: 6c 74 20 69 6e 20 61 6e 20 65 70 68 65 6d 65 72  lt in an ephemer
0af0: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a  al table.  The.*
0b00: 2a 20 70 57 68 65 72 65 20 61 72 67 75 6d 65 6e  * pWhere argumen
0b10: 74 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  t is an optional
0b20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
0b30: 61 74 20 72 65 73 74 72 69 63 74 73 20 74 68 65  at restricts the
0b40: 0a 2a 2a 20 73 65 74 20 6f 66 20 72 6f 77 73 20  .** set of rows 
0b50: 69 6e 20 74 68 65 20 76 69 65 77 20 74 68 61 74  in the view that
0b60: 20 61 72 65 20 74 6f 20 62 65 20 61 64 64 65 64   are to be added
0b70: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
0b80: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  l table..*/.void
0b90: 20 73 71 6c 69 74 65 33 4d 61 74 65 72 69 61 6c   sqlite3Material
0ba0: 69 7a 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  izeView(.  Parse
0bb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0bc0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0bd0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
0be0: 56 69 65 77 2c 20 20 20 20 20 20 20 20 2f 2a 20  View,        /* 
0bf0: 56 69 65 77 20 64 65 66 69 6e 69 74 69 6f 6e 20  View definition 
0c00: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0c10: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  e,        /* Opt
0c20: 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ional WHERE clau
0c30: 73 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  se to be added *
0c40: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 20 20 20  /.  int iCur    
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0c60: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 65 70  or number for ep
0c70: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f  hemeral table */
0c80: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 44 65 73 74  .){.  SelectDest
0c90: 20 64 65 73 74 3b 0a 20 20 53 65 6c 65 63 74 20   dest;.  Select 
0ca0: 2a 70 53 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  *pSel;.  SrcList
0cb0: 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
0cc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0cd0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  >db;.  int iDb =
0ce0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
0cf0: 49 6e 64 65 78 28 64 62 2c 20 70 56 69 65 77 2d  Index(db, pView-
0d00: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 57 68  >pSchema);.  pWh
0d10: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
0d20: 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
0d30: 20 30 29 3b 0a 20 20 70 46 72 6f 6d 20 3d 20 73   0);.  pFrom = s
0d40: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
0d50: 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
0d60: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 20 29 7b  ;.  if( pFrom ){
0d70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
0d80: 6f 6d 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  om->nSrc==1 );. 
0d90: 20 20 20 70 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 7a     pFrom->a[0].z
0da0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
0db0: 53 74 72 44 75 70 28 64 62 2c 20 70 56 69 65 77  StrDup(db, pView
0dc0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 46  ->zName);.    pF
0dd0: 72 6f 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  rom->a[0].zDatab
0de0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
0df0: 74 72 44 75 70 28 64 62 2c 20 64 62 2d 3e 61 44  trDup(db, db->aD
0e00: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  b[iDb].zName);. 
0e10: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
0e20: 2d 3e 61 5b 30 5d 2e 70 4f 6e 3d 3d 30 20 29 3b  ->a[0].pOn==0 );
0e30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
0e40: 6f 6d 2d 3e 61 5b 30 5d 2e 70 55 73 69 6e 67 3d  om->a[0].pUsing=
0e50: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c  =0 );.  }.  pSel
0e60: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
0e70: 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c 20 70  New(pParse, 0, p
0e80: 46 72 6f 6d 2c 20 70 57 68 65 72 65 2c 20 30 2c  From, pWhere, 0,
0e90: 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64    SF_IncludeHidd
0ec0: 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c  en, 0, 0);.  sql
0ed0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0ee0: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
0ef0: 68 65 6d 54 61 62 2c 20 69 43 75 72 29 3b 0a 20  hemTab, iCur);. 
0f00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
0f10: 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
0f20: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
0f30: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
0f40: 53 65 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Sel);.}.#endif /
0f50: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
0f60: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20  E_OMIT_VIEW) && 
0f70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0f80: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
0f90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
0fa0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
0fb0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
0fc0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0fd0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
0fe0: 59 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  Y)./*.** Generat
0ff0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1000: 74 72 65 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tree to implemen
1010: 74 20 74 68 65 20 57 48 45 52 45 2c 20 4f 52 44  t the WHERE, ORD
1020: 45 52 20 42 59 2c 0a 2a 2a 20 61 6e 64 20 4c 49  ER BY,.** and LI
1030: 4d 49 54 2f 4f 46 46 53 45 54 20 70 6f 72 74 69  MIT/OFFSET porti
1040: 6f 6e 20 6f 66 20 44 45 4c 45 54 45 20 61 6e 64  on of DELETE and
1050: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
1060: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45  ts..**.**     DE
1070: 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f  LETE FROM table_
1080: 77 78 79 7a 20 57 48 45 52 45 20 61 3c 35 20 4f  wxyz WHERE a<5 O
1090: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
10a0: 31 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1;.**           
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1100: 4c 69 6d 69 74 57 68 65 72 65 20 28 70 49 6e 43  LimitWhere (pInC
1110: 6c 61 75 73 65 29 0a 2a 2f 0a 45 78 70 72 20 2a  lause).*/.Expr *
1120: 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72  sqlite3LimitWher
1130: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1140: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1150: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1160: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1170: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
1190: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
11a0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
11b0: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
11c0: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
11d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
11f0: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78   be null */.  Ex
1200: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1210: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1220: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1230: 65 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20  e.  May be null 
1240: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
1250: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1260: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT 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 20 2a 70  ull */.  Expr *p
1290: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
12a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 46 46        /* The OFF
12b0: 53 45 54 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  SET clause.  May
12c0: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 63 68   be null */.  ch
12d0: 61 72 20 2a 7a 53 74 6d 74 54 79 70 65 20 20 20  ar *zStmtType   
12e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69             /* Ei
12f0: 74 68 65 72 20 44 45 4c 45 54 45 20 6f 72 20 55  ther DELETE or U
1300: 50 44 41 54 45 2e 20 20 46 6f 72 20 65 72 72 20  PDATE.  For err 
1310: 6d 73 67 73 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78  msgs. */.){.  Ex
1320: 70 72 20 2a 70 57 68 65 72 65 52 6f 77 69 64 20  pr *pWhereRowid 
1330: 3d 20 4e 55 4c 4c 3b 20 20 20 20 2f 2a 20 57 48  = NULL;    /* WH
1340: 45 52 45 20 72 6f 77 69 64 20 2e 2e 20 2a 2f 0a  ERE rowid .. */.
1350: 20 20 45 78 70 72 20 2a 70 49 6e 43 6c 61 75 73    Expr *pInClaus
1360: 65 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 2f  e = NULL;      /
1370: 2a 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e  * WHERE rowid IN
1380: 20 28 20 73 65 6c 65 63 74 20 29 20 2a 2f 0a 20   ( select ) */. 
1390: 20 45 78 70 72 20 2a 70 53 65 6c 65 63 74 52 6f   Expr *pSelectRo
13a0: 77 69 64 20 3d 20 4e 55 4c 4c 3b 20 20 20 2f 2a  wid = NULL;   /*
13b0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 2e 2e   SELECT rowid ..
13c0: 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
13d0: 2a 70 45 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 20  *pEList = NULL; 
13e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
13f0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 6e 69 6e 67  n list contaning
1400: 20 6f 6e 6c 79 20 70 53 65 6c 65 63 74 52 6f 77   only pSelectRow
1410: 69 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  id */.  SrcList 
1420: 2a 70 53 65 6c 65 63 74 53 72 63 20 3d 20 4e 55  *pSelectSrc = NU
1430: 4c 4c 3b 20 20 2f 2a 20 53 45 4c 45 43 54 20 72  LL;  /* SELECT r
1440: 6f 77 69 64 20 46 52 4f 4d 20 78 20 2e 2e 2e 20  owid FROM x ... 
1450: 28 64 75 70 20 6f 66 20 70 53 72 63 29 20 2a 2f  (dup of pSrc) */
1460: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
1470: 63 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ct = NULL;      
1480: 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53 45 4c 45  /* Complete SELE
1490: 43 54 20 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a  CT tree */..  /*
14a0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   Check that ther
14b0: 65 20 69 73 6e 27 74 20 61 6e 20 4f 52 44 45 52  e isn't an ORDER
14c0: 20 42 59 20 77 69 74 68 6f 75 74 20 61 20 4c 49   BY without a LI
14d0: 4d 49 54 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  MIT clause..  */
14e0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14f0: 26 26 20 28 70 4c 69 6d 69 74 20 3d 3d 20 30 29  && (pLimit == 0)
1500: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
1510: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1520: 20 22 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f   "ORDER BY witho
1530: 75 74 20 4c 49 4d 49 54 20 6f 6e 20 25 73 22 2c  ut LIMIT on %s",
1540: 20 7a 53 74 6d 74 54 79 70 65 29 3b 0a 20 20 20   zStmtType);.   
1550: 20 67 6f 74 6f 20 6c 69 6d 69 74 5f 77 68 65 72   goto limit_wher
1560: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  e_cleanup;.  }..
1570: 20 20 2f 2a 20 57 65 20 6f 6e 6c 79 20 6e 65 65    /* We only nee
1580: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
1590: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
15a0: 6e 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  n if there.  ** 
15b0: 69 73 20 61 20 6c 69 6d 69 74 2f 6f 66 66 73 65  is a limit/offse
15c0: 74 20 74 65 72 6d 20 74 6f 20 65 6e 66 6f 72 63  t term to enforc
15d0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
15e0: 69 6d 69 74 20 3d 3d 20 30 20 29 20 7b 0a 20 20  imit == 0 ) {.  
15f0: 20 20 2f 2a 20 69 66 20 70 4c 69 6d 69 74 20 69    /* if pLimit i
1600: 73 20 6e 75 6c 6c 2c 20 70 4f 66 66 73 65 74 20  s null, pOffset 
1610: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e  will always be n
1620: 75 6c 6c 20 61 73 20 77 65 6c 6c 2e 20 2a 2f 0a  ull as well. */.
1630: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 66 66      assert( pOff
1640: 73 65 74 20 3d 3d 20 30 20 29 3b 0a 20 20 20 20  set == 0 );.    
1650: 72 65 74 75 72 6e 20 70 57 68 65 72 65 3b 0a 20  return pWhere;. 
1660: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1670: 65 20 61 20 73 65 6c 65 63 74 20 65 78 70 72 65  e a select expre
1680: 73 73 69 6f 6e 20 74 72 65 65 20 74 6f 20 65 6e  ssion tree to en
1690: 66 6f 72 63 65 20 74 68 65 20 6c 69 6d 69 74 2f  force the limit/
16a0: 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 74 65 72  offset .  ** ter
16b0: 6d 20 66 6f 72 20 74 68 65 20 44 45 4c 45 54 45  m for the DELETE
16c0: 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
16d0: 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78 61 6d 70  ment.  For examp
16e0: 6c 65 3a 0a 20 20 2a 2a 20 20 20 44 45 4c 45 54  le:.  **   DELET
16f0: 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57  E FROM table_a W
1700: 48 45 52 45 20 63 6f 6c 31 3d 31 20 4f 52 44 45  HERE col1=1 ORDE
1710: 52 20 42 59 20 63 6f 6c 32 20 4c 49 4d 49 54 20  R BY col2 LIMIT 
1720: 31 20 4f 46 46 53 45 54 20 31 0a 20 20 2a 2a 20  1 OFFSET 1.  ** 
1730: 62 65 63 6f 6d 65 73 3a 0a 20 20 2a 2a 20 20 20  becomes:.  **   
1740: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 62 6c  DELETE FROM tabl
1750: 65 5f 61 20 57 48 45 52 45 20 72 6f 77 69 64 20  e_a WHERE rowid 
1760: 49 4e 20 28 20 0a 20 20 2a 2a 20 20 20 20 20 53  IN ( .  **     S
1770: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
1780: 20 74 61 62 6c 65 5f 61 20 57 48 45 52 45 20 63   table_a WHERE c
1790: 6f 6c 31 3d 31 20 4f 52 44 45 52 20 42 59 20 63  ol1=1 ORDER BY c
17a0: 6f 6c 32 20 4c 49 4d 49 54 20 31 20 4f 46 46 53  ol2 LIMIT 1 OFFS
17b0: 45 54 20 31 0a 20 20 2a 2a 20 20 20 29 3b 0a 20  ET 1.  **   );. 
17c0: 20 2a 2f 0a 0a 20 20 70 53 65 6c 65 63 74 52 6f   */..  pSelectRo
17d0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 50 45 78  wid = sqlite3PEx
17e0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 4f  pr(pParse, TK_RO
17f0: 57 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  W, 0, 0, 0);.  i
1800: 66 28 20 70 53 65 6c 65 63 74 52 6f 77 69 64 20  f( pSelectRowid 
1810: 3d 3d 20 30 20 29 20 67 6f 74 6f 20 6c 69 6d 69  == 0 ) goto limi
1820: 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e 75 70 3b  t_where_cleanup;
1830: 0a 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  .  pEList = sqli
1840: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1850: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  d(pParse, 0, pSe
1860: 6c 65 63 74 52 6f 77 69 64 29 3b 0a 20 20 69 66  lectRowid);.  if
1870: 28 20 70 45 4c 69 73 74 20 3d 3d 20 30 20 29 20  ( pEList == 0 ) 
1880: 67 6f 74 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65  goto limit_where
1890: 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20  _cleanup;..  /* 
18a0: 64 75 70 6c 69 63 61 74 65 20 74 68 65 20 46 52  duplicate the FR
18b0: 4f 4d 20 63 6c 61 75 73 65 20 61 73 20 69 74 20  OM clause as it 
18c0: 69 73 20 6e 65 65 64 65 64 20 62 79 20 62 6f 74  is needed by bot
18d0: 68 20 74 68 65 20 44 45 4c 45 54 45 2f 55 50 44  h the DELETE/UPD
18e0: 41 54 45 20 74 72 65 65 0a 20 20 2a 2a 20 61 6e  ATE tree.  ** an
18f0: 64 20 74 68 65 20 53 45 4c 45 43 54 20 73 75 62  d the SELECT sub
1900: 74 72 65 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65  tree. */.  pSele
1910: 63 74 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ctSrc = sqlite3S
1920: 72 63 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  rcListDup(pParse
1930: 2d 3e 64 62 2c 20 70 53 72 63 2c 20 30 29 3b 0a  ->db, pSrc, 0);.
1940: 20 20 69 66 28 20 70 53 65 6c 65 63 74 53 72 63    if( pSelectSrc
1950: 20 3d 3d 20 30 20 29 20 7b 0a 20 20 20 20 73 71   == 0 ) {.    sq
1960: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1970: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1980: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 67 6f 74  pEList);.    got
1990: 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c  o limit_where_cl
19a0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
19b0: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 53 45   generate the SE
19c0: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 20  LECT expression 
19d0: 74 72 65 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65  tree. */.  pSele
19e0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
19f0: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 70 45 4c  ctNew(pParse,pEL
1a00: 69 73 74 2c 70 53 65 6c 65 63 74 53 72 63 2c 70  ist,pSelectSrc,p
1a10: 57 68 65 72 65 2c 30 2c 30 2c 0a 20 20 20 20 20  Where,0,0,.     
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
1a40: 2c 30 2c 70 4c 69 6d 69 74 2c 70 4f 66 66 73 65  ,0,pLimit,pOffse
1a50: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t);.  if( pSelec
1a60: 74 20 3d 3d 20 30 20 29 20 72 65 74 75 72 6e 20  t == 0 ) return 
1a70: 30 3b 0a 0a 20 20 2f 2a 20 6e 6f 77 20 67 65 6e  0;..  /* now gen
1a80: 65 72 61 74 65 20 74 68 65 20 6e 65 77 20 57 48  erate the new WH
1a90: 45 52 45 20 72 6f 77 69 64 20 49 4e 20 63 6c 61  ERE rowid IN cla
1aa0: 75 73 65 20 66 6f 72 20 74 68 65 20 44 45 4c 45  use for the DELE
1ab0: 54 45 2f 55 44 50 41 54 45 20 2a 2f 0a 20 20 70  TE/UDPATE */.  p
1ac0: 57 68 65 72 65 52 6f 77 69 64 20 3d 20 73 71 6c  WhereRowid = sql
1ad0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1ae0: 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 2c 20  , TK_ROW, 0, 0, 
1af0: 30 29 3b 0a 20 20 70 49 6e 43 6c 61 75 73 65 20  0);.  pInClause 
1b00: 3d 20 70 57 68 65 72 65 52 6f 77 69 64 20 3f 20  = pWhereRowid ? 
1b10: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1b20: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 57 68 65  rse, TK_IN, pWhe
1b30: 72 65 52 6f 77 69 64 2c 20 30 2c 20 30 29 20 3a  reRowid, 0, 0) :
1b40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 45 78   0;.  sqlite3PEx
1b50: 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
1b60: 73 65 2c 20 70 49 6e 43 6c 61 75 73 65 2c 20 70  se, pInClause, p
1b70: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
1b80: 6e 20 70 49 6e 43 6c 61 75 73 65 3b 0a 0a 6c 69  n pInClause;..li
1b90: 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e 75  mit_where_cleanu
1ba0: 70 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  p:.  sqlite3Expr
1bb0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
1bc0: 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 73 71  b, pWhere);.  sq
1bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1be0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1bf0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
1c00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1c10: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 6d 69  Parse->db, pLimi
1c20: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1c30: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
1c40: 64 62 2c 20 70 4f 66 66 73 65 74 29 3b 0a 20 20  db, pOffset);.  
1c50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1c60: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1c70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
1c80: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
1c90: 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 20 20   */.       /*   
1ca0: 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
1cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1cc0: 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  ERY) */../*.** G
1cd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ce0: 20 61 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73   a DELETE FROM s
1cf0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1d00: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1d10: 74 61 62 6c 65 5f 77 78 79 7a 20 57 48 45 52 45  table_wxyz WHERE
1d20: 20 61 3c 35 20 41 4e 44 20 62 20 4e 4f 54 20 4e   a<5 AND b NOT N
1d30: 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ULL;.**         
1d40: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1d50: 5f 2f 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  _/       \______
1d60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 70 54 61 62 4c 69 73 74 20 20 20 20 20 20 20 20  pTabList        
1d90: 20 20 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a        pWhere.*/.
1da0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
1db0: 74 65 46 72 6f 6d 28 0a 20 20 50 61 72 73 65 20  teFrom(.  Parse 
1dc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1dd0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1de0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1df0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
1e00: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1e10: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 73 68  from which we sh
1e20: 6f 75 6c 64 20 64 65 6c 65 74 65 20 74 68 69 6e  ould delete thin
1e30: 67 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  gs */.  Expr *pW
1e40: 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 2f  here           /
1e50: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1e60: 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c  se.  May be null
1e70: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
1e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e90: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
1ea0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
1eb0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
1ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ed0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
1ee0: 63 68 20 72 65 63 6f 72 64 73 20 77 69 6c 6c 20  ch records will 
1ef0: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
1f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1f10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f20: 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  f database holdi
1f30: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  ng pTab */.  int
1f40: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1f50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f60: 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
1f70: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1f80: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1f90: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
1fa0: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
1fb0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1fc0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1fd0: 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20 6f 66   over indices of
1fe0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1ff0: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
2000: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2010: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2020: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2030: 44 61 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20  DataCur = 0;    
2040: 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
2050: 20 66 6f 72 20 74 68 65 20 63 61 6e 6f 6e 69 63   for the canonic
2060: 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a  al data source *
2070: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
2080: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 43 75  = 0;       /* Cu
2090: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
20a0: 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 20 2a  he first index *
20b0: 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20  /.  int nIdx;   
20c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20d0: 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20  mber of indices 
20e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
20f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
2100: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
2110: 75 63 74 75 72 65 20 2a 2f 0a 20 20 41 75 74 68  ucture */.  Auth
2120: 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74  Context sContext
2130: 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74  ;  /* Authorizat
2140: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
2150: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
2160: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
2170: 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 6f 6c  context to resol
2180: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
2190: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
21c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74   */.  int memCnt
21d0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20   = -1;       /* 
21e0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64  Memory cell used
21f0: 20 66 6f 72 20 63 68 61 6e 67 65 20 63 6f 75 6e   for change coun
2200: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ting */.  int rc
2210: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
2220: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
2230: 65 64 20 62 79 20 61 75 74 68 6f 72 69 7a 61 74  ed by authorizat
2240: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ion callback */.
2250: 20 20 69 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20    int eOnePass; 
2260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50           /* ONEP
2270: 41 53 53 5f 4f 46 46 20 6f 72 20 5f 53 49 4e 47  ASS_OFF or _SING
2280: 4c 45 20 6f 72 20 5f 4d 55 4c 54 49 20 2a 2f 0a  LE or _MULTI */.
2290: 20 20 69 6e 74 20 61 69 43 75 72 4f 6e 65 50 61    int aiCurOnePa
22a0: 73 73 5b 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20  ss[2];   /* The 
22b0: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 6f 70  write cursors op
22c0: 65 6e 65 64 20 62 79 20 57 48 45 52 45 5f 4f 4e  ened by WHERE_ON
22d0: 45 50 41 53 53 20 2a 2f 0a 20 20 75 38 20 2a 61  EPASS */.  u8 *a
22e0: 54 6f 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  ToOpen = 0;     
22f0: 20 20 2f 2a 20 4f 70 65 6e 20 63 75 72 73 6f 72    /* Open cursor
2300: 20 69 54 61 62 43 75 72 2b 6a 20 69 66 20 61 54   iTabCur+j if aT
2310: 6f 4f 70 65 6e 5b 6a 5d 20 69 73 20 74 72 75 65  oOpen[j] is true
2320: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
2330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2340: 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  The PRIMARY KEY 
2350: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
2360: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 20  le */.  int iPk 
2370: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2380: 2a 20 46 69 72 73 74 20 6f 66 20 6e 50 6b 20 72  * First of nPk r
2390: 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
23a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61 6c   PRIMARY KEY val
23b0: 75 65 20 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 20  ue */.  i16 nPk 
23c0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
23d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
23e0: 6d 6e 73 20 69 6e 20 74 68 65 20 50 52 49 4d 41  mns in the PRIMA
23f0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20  RY KEY */.  int 
2400: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
2410: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
2420: 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 6f 66  l holding key of
2430: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
2440: 65 64 20 2a 2f 0a 20 20 69 31 36 20 6e 4b 65 79  ed */.  i16 nKey
2450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2460: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
2470: 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ry cells in the 
2480: 72 6f 77 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  row key */.  int
2490: 20 69 45 70 68 43 75 72 20 3d 20 30 3b 20 20 20   iEphCur = 0;   
24a0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
24b0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61   table holding a
24c0: 6c 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ll primary key v
24d0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
24e0: 52 6f 77 53 65 74 20 3d 20 30 3b 20 20 20 20 20  RowSet = 0;     
24f0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
2500: 72 20 72 6f 77 73 65 74 20 6f 66 20 72 6f 77 73  r rowset of rows
2510: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
2520: 69 6e 74 20 61 64 64 72 42 79 70 61 73 73 20 3d  int addrBypass =
2530: 20 30 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73   0;    /* Addres
2540: 73 20 6f 66 20 6a 75 6d 70 20 6f 76 65 72 20 74  s of jump over t
2550: 68 65 20 64 65 6c 65 74 65 20 6c 6f 67 69 63 20  he delete logic 
2560: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
2570: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  p = 0;      /* T
2580: 6f 70 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  op of the delete
2590: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
25a0: 64 64 72 45 70 68 4f 70 65 6e 20 3d 20 30 3b 20  ddrEphOpen = 0; 
25b0: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
25c0: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 45 70 68   to open the Eph
25d0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  emeral table */.
25e0: 20 20 69 6e 74 20 62 43 6f 6d 70 6c 65 78 3b 20    int bComplex; 
25f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2600: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74 72   if there are tr
2610: 69 67 67 65 72 73 20 6f 72 20 46 4b 73 20 6f 72  iggers or FKs or
2620: 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2640: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
2650: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2660: 2f 0a 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /. .#ifndef SQLI
2670: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
2680: 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20    int isView;   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d 70  * True if attemp
26b0: 74 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 66  ting to delete f
26c0: 72 6f 6d 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  rom a view */.  
26d0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
26e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
26f0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 20 74 72  List of table tr
2700: 69 67 67 65 72 73 2c 20 69 66 20 72 65 71 75 69  iggers, if requi
2710: 72 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  red */.#endif.. 
2720: 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78   memset(&sContex
2730: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f  t, 0, sizeof(sCo
2740: 6e 74 65 78 74 29 29 3b 0a 20 20 64 62 20 3d 20  ntext));.  db = 
2750: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2760: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2770: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2780: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  ed ){.    goto d
2790: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
27a0: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
27b0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
27c0: 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  ==1 );..  /* Loc
27d0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 77 68  ate the table wh
27e0: 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20 64  ich we want to d
27f0: 65 6c 65 74 65 2e 20 20 54 68 69 73 20 74 61 62  elete.  This tab
2800: 6c 65 20 68 61 73 20 74 6f 20 62 65 0a 20 20 2a  le has to be.  *
2810: 2a 20 70 75 74 20 69 6e 20 61 6e 20 53 72 63 4c  * put in an SrcL
2820: 69 73 74 20 73 74 72 75 63 74 75 72 65 20 62 65  ist structure be
2830: 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20 74 68  cause some of th
2840: 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77 65  e subroutines we
2850: 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 61  .  ** will be ca
2860: 6c 6c 69 6e 67 20 61 72 65 20 64 65 73 69 67 6e  lling are design
2870: 65 64 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20  ed to work with 
2880: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
2890: 61 6e 64 20 65 78 70 65 63 74 0a 20 20 2a 2a 20  and expect.  ** 
28a0: 61 6e 20 53 72 63 4c 69 73 74 2a 20 70 61 72 61  an SrcList* para
28b0: 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20 6f 66  meter instead of
28c0: 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a 20 70   just a Table* p
28d0: 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2f 0a 20  arameter..  */. 
28e0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
28f0: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
2900: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
2910: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2920: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
2930: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a  m_cleanup;..  /*
2940: 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 77   Figure out if w
2950: 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67 67  e have any trigg
2960: 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 74  ers and if the t
2970: 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20  able being.  ** 
2980: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 73 20  deleted from is 
2990: 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66 6e  a view.  */.#ifn
29a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29b0: 54 52 49 47 47 45 52 0a 20 20 70 54 72 69 67 67  TRIGGER.  pTrigg
29c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
29d0: 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65  gersExist(pParse
29e0: 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54  , pTab, TK_DELET
29f0: 45 2c 20 30 2c 20 30 29 3b 0a 20 20 69 73 56 69  E, 0, 0);.  isVi
2a00: 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65  ew = pTab->pSele
2a10: 63 74 21 3d 30 3b 0a 20 20 62 43 6f 6d 70 6c 65  ct!=0;.  bComple
2a20: 78 20 3d 20 70 54 72 69 67 67 65 72 20 7c 7c 20  x = pTrigger || 
2a30: 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65  sqlite3FkRequire
2a40: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  d(pParse, pTab, 
2a50: 30 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 23 20 64  0, 0);.#else.# d
2a60: 65 66 69 6e 65 20 70 54 72 69 67 67 65 72 20 30  efine pTrigger 0
2a70: 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77  .# define isView
2a80: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
2a90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
2aa0: 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77  W.# undef isView
2ab0: 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77  .# define isView
2ac0: 20 30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   0.#endif..  /* 
2ad0: 49 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c  If pTab is reall
2ae0: 79 20 61 20 76 69 65 77 2c 20 6d 61 6b 65 20 73  y a view, make s
2af0: 75 72 65 20 69 74 20 68 61 73 20 62 65 65 6e 20  ure it has been 
2b00: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2b10: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  /.  if( sqlite3V
2b20: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
2b30: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
2b40: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  ){.    goto dele
2b50: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
2b60: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
2b70: 74 65 33 49 73 52 65 61 64 4f 6e 6c 79 28 70 50  te3IsReadOnly(pP
2b80: 61 72 73 65 2c 20 70 54 61 62 2c 20 28 70 54 72  arse, pTab, (pTr
2b90: 69 67 67 65 72 3f 31 3a 30 29 29 20 29 7b 0a 20  igger?1:0)) ){. 
2ba0: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
2bb0: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
2bc0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
2bd0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2be0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2bf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
2c00: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7a 44 62  db->nDb );.  zDb
2c10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
2c20: 7a 4e 61 6d 65 3b 0a 20 20 72 63 61 75 74 68 20  zName;.  rcauth 
2c30: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
2c40: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2c50: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
2c60: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 3b 0a  zName, 0, zDb);.
2c70: 20 20 61 73 73 65 72 74 28 20 72 63 61 75 74 68    assert( rcauth
2c80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
2c90: 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45  cauth==SQLITE_DE
2ca0: 4e 59 20 7c 7c 20 72 63 61 75 74 68 3d 3d 53 51  NY || rcauth==SQ
2cb0: 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 3b 0a 20  LITE_IGNORE );. 
2cc0: 20 69 66 28 20 72 63 61 75 74 68 3d 3d 53 51 4c   if( rcauth==SQL
2cd0: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
2ce0: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
2cf0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2d00: 61 73 73 65 72 74 28 21 69 73 56 69 65 77 20 7c  assert(!isView |
2d10: 7c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 20 20  | pTrigger);..  
2d20: 2f 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  /* Assign cursor
2d30: 20 6e 75 6d 62 65 72 73 20 74 6f 20 74 68 65 20   numbers to the 
2d40: 74 61 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74  table and all it
2d50: 73 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2f 0a  s indices..  */.
2d60: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
2d70: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
2d80: 20 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 4c   iTabCur = pTabL
2d90: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2da0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2db0: 2b 2b 3b 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30  ++;.  for(nIdx=0
2dc0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
2dd0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
2de0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64  pIdx->pNext, nId
2df0: 78 2b 2b 29 7b 0a 20 20 20 20 70 50 61 72 73 65  x++){.    pParse
2e00: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nTab++;.  }.. 
2e10: 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 76 69   /* Start the vi
2e20: 65 77 20 63 6f 6e 74 65 78 74 0a 20 20 2a 2f 0a  ew context.  */.
2e30: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
2e40: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
2e50: 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72 73  ontextPush(pPars
2e60: 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 54  e, &sContext, pT
2e70: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ab->zName);.  }.
2e80: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
2e90: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
2ea0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
2eb0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2ec0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
2ed0: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
2ee0: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  om_cleanup;.  }.
2ef0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
2f00: 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  sted==0 ) sqlite
2f10: 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
2f20: 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  s(v);.  sqlite3B
2f30: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
2f40: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
2f50: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  b);..  /* If we 
2f60: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 64 65  are trying to de
2f70: 6c 65 74 65 20 66 72 6f 6d 20 61 20 76 69 65 77  lete from a view
2f80: 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20 76  , realize that v
2f90: 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e  iew into.  ** an
2fa0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2fb0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
2fc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2fd0: 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e 65  VIEW) && !define
2fe0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
2ff0: 49 47 47 45 52 29 0a 20 20 69 66 28 20 69 73 56  IGGER).  if( isV
3000: 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  iew ){.    sqlit
3010: 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65  e3MaterializeVie
3020: 77 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  w(pParse, pTab, 
3030: 70 57 68 65 72 65 2c 20 69 54 61 62 43 75 72 29  pWhere, iTabCur)
3040: 3b 0a 20 20 20 20 69 44 61 74 61 43 75 72 20 3d  ;.    iDataCur =
3050: 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62 43   iIdxCur = iTabC
3060: 75 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ur;.  }.#endif..
3070: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
3080: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
3090: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
30a0: 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
30b0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
30c0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50  (sNC));.  sNC.pP
30d0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
30e0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
30f0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 69 66 28 20  pTabList;.  if( 
3100: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
3110: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57  prNames(&sNC, pW
3120: 68 65 72 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  here) ){.    got
3130: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
3140: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
3150: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3160: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
3170: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
3180: 6c 65 74 65 64 2c 20 69 66 0a 20 20 2a 2a 20 77  leted, if.  ** w
3190: 65 20 61 72 65 20 63 6f 75 6e 74 69 6e 67 20 72  e are counting r
31a0: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
31b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
31c0: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a  TE_CountRows ){.
31d0: 20 20 20 20 6d 65 6d 43 6e 74 20 3d 20 2b 2b 70      memCnt = ++p
31e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
31f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3200: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
3210: 2c 20 30 2c 20 6d 65 6d 43 6e 74 29 3b 0a 20 20  , 0, memCnt);.  
3220: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3230: 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45 5f  E_OMIT_TRUNCATE_
3240: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
3250: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
3260: 41 20 44 45 4c 45 54 45 20 77 69 74 68 6f 75 74  A DELETE without
3270: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
3280: 64 65 6c 65 74 65 73 20 65 76 65 72 79 74 68 69  deletes everythi
3290: 6e 67 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 65  ng..  ** It is e
32a0: 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 65 72  asier just to er
32b0: 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74 61  ase the whole ta
32c0: 62 6c 65 2e 20 50 72 69 6f 72 20 74 6f 20 76 65  ble. Prior to ve
32d0: 72 73 69 6f 6e 20 33 2e 36 2e 35 2c 0a 20 20 2a  rsion 3.6.5,.  *
32e0: 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
32f0: 69 6f 6e 20 63 61 75 73 65 64 20 74 68 65 20 72  ion caused the r
3300: 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ow change count 
3310: 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72  (the value retur
3320: 6e 65 64 20 62 79 20 0a 20 20 2a 2a 20 41 50 49  ned by .  ** API
3330: 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
3340: 33 5f 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  3_count_changes)
3350: 20 74 6f 20 62 65 20 73 65 74 20 69 6e 63 6f 72   to be set incor
3360: 72 65 63 74 6c 79 2e 20 20 2a 2f 0a 20 20 69 66  rectly.  */.  if
3370: 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45  ( rcauth==SQLITE
3380: 5f 4f 4b 0a 20 20 20 26 26 20 70 57 68 65 72 65  _OK.   && pWhere
3390: 3d 3d 30 0a 20 20 20 26 26 20 21 62 43 6f 6d 70  ==0.   && !bComp
33a0: 6c 65 78 0a 20 20 20 26 26 20 21 49 73 56 69 72  lex.   && !IsVir
33b0: 74 75 61 6c 28 70 54 61 62 29 0a 23 69 66 64 65  tual(pTab).#ifde
33c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
33d0: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
33e0: 20 20 26 26 20 64 62 2d 3e 78 50 72 65 55 70 64    && db->xPreUpd
33f0: 61 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 0a 23  ateCallback==0.#
3400: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 61  endif.  ){.    a
3410: 73 73 65 72 74 28 20 21 69 73 56 69 65 77 20 29  ssert( !isView )
3420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
3430: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
3440: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
3450: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
3460: 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69  .    if( HasRowi
3470: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
3480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3490: 70 34 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p4(v, OP_Clear, 
34a0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pTab->tnum, iDb,
34b0: 20 6d 65 6d 43 6e 74 2c 0a 20 20 20 20 20 20 20   memCnt,.       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34   pTab->zName, P4
34e0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
34f0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
3500: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
3510: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
3520: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3530: 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
3540: 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
3550: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3560: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3570: 43 6c 65 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75  Clear, pIdx->tnu
3580: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20  m, iDb);.    }. 
3590: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
35a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 55   SQLITE_OMIT_TRU
35b0: 4e 43 41 54 45 5f 4f 50 54 49 4d 49 5a 41 54 49  NCATE_OPTIMIZATI
35c0: 4f 4e 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 31  ON */.  {.    u1
35d0: 36 20 77 63 66 20 3d 20 57 48 45 52 45 5f 4f 4e  6 wcf = WHERE_ON
35e0: 45 50 41 53 53 5f 44 45 53 49 52 45 44 7c 57 48  EPASS_DESIRED|WH
35f0: 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
3600: 4b 3b 0a 20 20 20 20 69 66 28 20 73 4e 43 2e 6e  K;.    if( sNC.n
3610: 63 46 6c 61 67 73 20 26 20 4e 43 5f 56 61 72 53  cFlags & NC_VarS
3620: 65 6c 65 63 74 20 29 20 62 43 6f 6d 70 6c 65 78  elect ) bComplex
3630: 20 3d 20 31 3b 0a 20 20 20 20 77 63 66 20 7c 3d   = 1;.    wcf |=
3640: 20 28 62 43 6f 6d 70 6c 65 78 20 3f 20 30 20 3a   (bComplex ? 0 :
3650: 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
3660: 55 4c 54 49 52 4f 57 29 3b 0a 20 20 20 20 69 66  ULTIROW);.    if
3670: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
3680: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
3690: 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20   a rowid table, 
36a0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52  initialize the R
36b0: 6f 77 53 65 74 20 74 6f 20 61 6e 20 65 6d 70 74  owSet to an empt
36c0: 79 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70  y set */.      p
36d0: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 50  Pk = 0;.      nP
36e0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 52 6f  k = 1;.      iRo
36f0: 77 53 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wSet = ++pParse-
3700: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
3710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3720: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
3730: 6f 77 53 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  owSet);.    }els
3740: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  e{.      /* For 
3750: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
3760: 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 6e  table, create an
3770: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
3780: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
3790: 2a 20 68 6f 6c 64 20 61 6c 6c 20 70 72 69 6d 61  * hold all prima
37a0: 72 79 20 6b 65 79 73 20 66 6f 72 20 72 6f 77 73  ry keys for rows
37b0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
37c0: 2a 2f 0a 20 20 20 20 20 20 70 50 6b 20 3d 20 73  */.      pPk = s
37d0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
37e0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
37f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d     assert( pPk!=
3800: 30 20 29 3b 0a 20 20 20 20 20 20 6e 50 6b 20 3d  0 );.      nPk =
3810: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20   pPk->nKeyCol;. 
3820: 20 20 20 20 20 69 50 6b 20 3d 20 70 50 61 72 73       iPk = pPars
3830: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
3840: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
3850: 20 6e 50 6b 3b 0a 20 20 20 20 20 20 69 45 70 68   nPk;.      iEph
3860: 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
3870: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
3880: 45 70 68 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  EphOpen = sqlite
3890: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
38a0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
38b0: 20 69 45 70 68 43 75 72 2c 20 6e 50 6b 29 3b 0a   iEphCur, nPk);.
38c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38d0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
38e0: 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20  arse, pPk);.    
38f0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  }.  .    /* Cons
3900: 74 72 75 63 74 20 61 20 71 75 65 72 79 20 74 6f  truct a query to
3910: 20 66 69 6e 64 20 74 68 65 20 72 6f 77 69 64 20   find the rowid 
3920: 6f 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66  or primary key f
3930: 6f 72 20 65 76 65 72 79 20 72 6f 77 0a 20 20 20  or every row.   
3940: 20 2a 2a 20 74 6f 20 62 65 20 64 65 6c 65 74 65   ** to be delete
3950: 64 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  d, based on the 
3960: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 53 65  WHERE clause. Se
3970: 74 20 76 61 72 69 61 62 6c 65 20 65 4f 6e 65 50  t variable eOneP
3980: 61 73 73 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ass.    ** to in
3990: 64 69 63 61 74 65 20 74 68 65 20 73 74 72 61 74  dicate the strat
39a0: 65 67 79 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  egy used to impl
39b0: 65 6d 65 6e 74 20 74 68 69 73 20 64 65 6c 65 74  ement this delet
39c0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
39d0: 20 20 4f 4e 45 50 41 53 53 5f 4f 46 46 3a 20 20    ONEPASS_OFF:  
39e0: 20 20 54 77 6f 2d 70 61 73 73 20 61 70 70 72 6f    Two-pass appro
39f0: 61 63 68 20 2d 20 75 73 65 20 61 20 46 49 46 4f  ach - use a FIFO
3a00: 20 66 6f 72 20 72 6f 77 69 64 73 2f 50 4b 20 76   for rowids/PK v
3a10: 61 6c 75 65 73 2e 0a 20 20 20 20 2a 2a 20 20 4f  alues..    **  O
3a20: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 3a 20 4f  NEPASS_SINGLE: O
3a30: 6e 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  ne-pass approach
3a40: 20 2d 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72   - at most one r
3a50: 6f 77 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  ow deleted..    
3a60: 2a 2a 20 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  **  ONEPASS_MULT
3a70: 49 3a 20 20 4f 6e 65 2d 70 61 73 73 20 61 70 70  I:  One-pass app
3a80: 72 6f 61 63 68 20 2d 20 61 6e 79 20 6e 75 6d 62  roach - any numb
3a90: 65 72 20 6f 66 20 72 6f 77 73 20 6d 61 79 20 62  er of rows may b
3aa0: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
3ab0: 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
3ac0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
3ad0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
3ae0: 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c  t, pWhere, 0, 0,
3af0: 20 77 63 66 2c 20 69 54 61 62 43 75 72 2b 31 29   wcf, iTabCur+1)
3b00: 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
3b10: 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 6c 65 74  ==0 ) goto delet
3b20: 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a  e_from_cleanup;.
3b30: 20 20 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 73      eOnePass = s
3b40: 71 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65  qlite3WhereOkOne
3b50: 50 61 73 73 28 70 57 49 6e 66 6f 2c 20 61 69 43  Pass(pWInfo, aiC
3b60: 75 72 4f 6e 65 50 61 73 73 29 3b 0a 20 20 20 20  urOnePass);.    
3b70: 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
3b80: 6c 28 70 54 61 62 29 3d 3d 30 20 7c 7c 20 65 4f  l(pTab)==0 || eO
3b90: 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
3ba0: 4d 55 4c 54 49 20 29 3b 0a 20 20 20 20 61 73 73  MULTI );.    ass
3bb0: 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
3bc0: 54 61 62 29 20 7c 7c 20 62 43 6f 6d 70 6c 65 78  Tab) || bComplex
3bd0: 20 7c 7c 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e   || eOnePass!=ON
3be0: 45 50 41 53 53 5f 4f 46 46 20 29 3b 0a 20 20 0a  EPASS_OFF );.  .
3bf0: 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63      /* Keep trac
3c00: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
3c10: 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 64 65  of rows to be de
3c20: 6c 65 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  leted */.    if(
3c30: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
3c40: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
3c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3c70: 64 64 49 6d 6d 2c 20 6d 65 6d 43 6e 74 2c 20 31  ddImm, memCnt, 1
3c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
3c90: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 72  /* Extract the r
3ca0: 6f 77 69 64 20 6f 72 20 70 72 69 6d 61 72 79 20  owid or primary 
3cb0: 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
3cc0: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ent row */.    i
3cd0: 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  f( pPk ){.      
3ce0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20  for(i=0; i<nPk; 
3cf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
3d00: 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f 6c  sert( pPk->aiCol
3d10: 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[i]>=0 );.   
3d20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3d30: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
3d40: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
3d50: 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3d80: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c  Pk->aiColumn[i],
3d90: 20 69 50 6b 2b 69 29 3b 0a 20 20 20 20 20 20 7d   iPk+i);.      }
3da0: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 69 50  .      iKey = iP
3db0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
3dc0: 20 20 20 20 69 4b 65 79 20 3d 20 70 50 61 72 73      iKey = pPars
3dd0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
3de0: 20 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65     iKey = sqlite
3df0: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
3e00: 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
3e10: 20 2d 31 2c 20 69 54 61 62 43 75 72 2c 20 69 4b   -1, iTabCur, iK
3e20: 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ey, 0);.      if
3e30: 28 20 69 4b 65 79 3e 70 50 61 72 73 65 2d 3e 6e  ( iKey>pParse->n
3e40: 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem ) pParse->nM
3e50: 65 6d 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20 7d  em = iKey;.    }
3e60: 0a 20 20 0a 20 20 20 20 69 66 28 20 65 4f 6e 65  .  .    if( eOne
3e70: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
3e80: 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  F ){.      /* Fo
3e90: 72 20 4f 4e 45 50 41 53 53 2c 20 6e 6f 20 6e 65  r ONEPASS, no ne
3ea0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
3eb0: 72 6f 77 69 64 2f 70 72 69 6d 61 72 79 2d 6b 65  rowid/primary-ke
3ec0: 79 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  y. There is only
3ed0: 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 65 2c 20 73  .      ** one, s
3ee0: 6f 20 6a 75 73 74 20 6b 65 65 70 20 69 74 20 69  o just keep it i
3ef0: 6e 20 69 74 73 20 72 65 67 69 73 74 65 72 28 73  n its register(s
3f00: 29 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  ) and fall throu
3f10: 67 68 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  gh to the.      
3f20: 2a 2a 20 64 65 6c 65 74 65 20 63 6f 64 65 2e 20  ** delete code. 
3f30: 20 2a 2f 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d   */.      nKey =
3f40: 20 6e 50 6b 3b 20 2f 2a 20 4f 50 5f 46 6f 75 6e   nPk; /* OP_Foun
3f50: 64 20 77 69 6c 6c 20 75 73 65 20 61 6e 20 75 6e  d will use an un
3f60: 70 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a 20 20  packed key */.  
3f70: 20 20 20 20 61 54 6f 4f 70 65 6e 20 3d 20 73 71      aToOpen = sq
3f80: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3f90: 4e 4e 28 64 62 2c 20 6e 49 64 78 2b 32 29 3b 0a  NN(db, nIdx+2);.
3fa0: 20 20 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65        if( aToOpe
3fb0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
3fc0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
3fd0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
3fe0: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
3ff0: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  m_cleanup;.     
4000: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
4010: 61 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78  aToOpen, 1, nIdx
4020: 2b 31 29 3b 0a 20 20 20 20 20 20 61 54 6f 4f 70  +1);.      aToOp
4030: 65 6e 5b 6e 49 64 78 2b 31 5d 20 3d 20 30 3b 0a  en[nIdx+1] = 0;.
4040: 20 20 20 20 20 20 69 66 28 20 61 69 43 75 72 4f        if( aiCurO
4050: 6e 65 50 61 73 73 5b 30 5d 3e 3d 30 20 29 20 61  nePass[0]>=0 ) a
4060: 54 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50  ToOpen[aiCurOneP
4070: 61 73 73 5b 30 5d 2d 69 54 61 62 43 75 72 5d 20  ass[0]-iTabCur] 
4080: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 0;.      if( a
4090: 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3e 3d  iCurOnePass[1]>=
40a0: 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75  0 ) aToOpen[aiCu
40b0: 72 4f 6e 65 50 61 73 73 5b 31 5d 2d 69 54 61 62  rOnePass[1]-iTab
40c0: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cur] = 0;.      
40d0: 69 66 28 20 61 64 64 72 45 70 68 4f 70 65 6e 20  if( addrEphOpen 
40e0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
40f0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
4100: 72 45 70 68 4f 70 65 6e 29 3b 0a 20 20 20 20 7d  rEphOpen);.    }
4110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
4120: 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pPk ){.        /
4130: 2a 20 41 64 64 20 74 68 65 20 50 4b 20 6b 65 79  * Add the PK key
4140: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 74 6f   for this row to
4150: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
4160: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
4170: 69 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iKey = ++pParse-
4180: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 6e  >nMem;.        n
4190: 4b 65 79 20 3d 20 30 3b 20 20 20 2f 2a 20 5a 65  Key = 0;   /* Ze
41a0: 72 6f 20 74 65 6c 6c 73 20 4f 50 5f 46 6f 75 6e  ro tells OP_Foun
41b0: 64 20 74 6f 20 75 73 65 20 61 20 63 6f 6d 70 6f  d to use a compo
41c0: 73 69 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20  site key */.    
41d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
41e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
41f0: 52 65 63 6f 72 64 2c 20 69 50 6b 2c 20 6e 50 6b  Record, iPk, nPk
4200: 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , iKey,.        
4210: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
4220: 41 66 66 69 6e 69 74 79 53 74 72 28 70 50 61 72  AffinityStr(pPar
4230: 73 65 2d 3e 64 62 2c 20 70 50 6b 29 2c 20 6e 50  se->db, pPk), nP
4240: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
4250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4260: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4270: 45 70 68 43 75 72 2c 20 69 4b 65 79 29 3b 0a 20  EphCur, iKey);. 
4280: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4290: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 72      /* Add the r
42a0: 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  owid of the row 
42b0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74 6f  to be deleted to
42c0: 20 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a 20   the RowSet */. 
42d0: 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 31 3b         nKey = 1;
42e0: 20 20 2f 2a 20 4f 50 5f 53 65 65 6b 20 61 6c 77    /* OP_Seek alw
42f0: 61 79 73 20 75 73 65 73 20 61 20 73 69 6e 67 6c  ays uses a singl
4300: 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20  e rowid */.     
4310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4320: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65  dOp2(v, OP_RowSe
4330: 74 41 64 64 2c 20 69 52 6f 77 53 65 74 2c 20 69  tAdd, iRowSet, i
4340: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4350: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
4360: 20 74 68 69 73 20 44 45 4c 45 54 45 20 63 61 6e   this DELETE can
4370: 6e 6f 74 20 75 73 65 20 74 68 65 20 4f 4e 45 50  not use the ONEP
4380: 41 53 53 20 73 74 72 61 74 65 67 79 2c 20 74 68  ASS strategy, th
4390: 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a  is is the .    *
43a0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  * end of the WHE
43b0: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  RE loop */.    i
43c0: 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  f( eOnePass!=ONE
43d0: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
43e0: 20 20 61 64 64 72 42 79 70 61 73 73 20 3d 20 73    addrBypass = s
43f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4400: 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  bel(v);.    }els
4410: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4420: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
4430: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
4440: 2a 20 55 6e 6c 65 73 73 20 74 68 69 73 20 69 73  * Unless this is
4450: 20 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 63 75   a view, open cu
4460: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61  rsors for the ta
4470: 62 6c 65 20 77 65 20 61 72 65 20 0a 20 20 20 20  ble we are .    
4480: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 66 72 6f 6d  ** deleting from
4490: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64   and all its ind
44a0: 69 63 65 73 2e 20 49 66 20 74 68 69 73 20 69 73  ices. If this is
44b0: 20 61 20 76 69 65 77 2c 20 74 68 65 6e 20 74 68   a view, then th
44c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 65 66  e.    ** only ef
44d0: 66 65 63 74 20 74 68 69 73 20 73 74 61 74 65 6d  fect this statem
44e0: 65 6e 74 20 68 61 73 20 69 73 20 74 6f 20 66 69  ent has is to fi
44f0: 72 65 20 74 68 65 20 49 4e 53 54 45 41 44 20 4f  re the INSTEAD O
4500: 46 20 0a 20 20 20 20 2a 2a 20 74 72 69 67 67 65  F .    ** trigge
4510: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
4520: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
4530: 20 20 20 20 69 6e 74 20 69 41 64 64 72 4f 6e 63      int iAddrOnc
4540: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
4550: 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41   eOnePass==ONEPA
4560: 53 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20  SS_MULTI ){.    
4570: 20 20 20 20 69 41 64 64 72 4f 6e 63 65 20 3d 20      iAddrOnce = 
4580: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
4590: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
45a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
45b0: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
45c0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
45d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
45e0: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
45f0: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
4600: 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  ab, OP_OpenWrite
4610: 2c 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  , OPFLAG_FORDELE
4620: 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 69 54 61 62 43 75 72 2c 20 61 54       iTabCur, aT
4650: 6f 4f 70 65 6e 2c 20 26 69 44 61 74 61 43 75 72  oOpen, &iDataCur
4660: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
4670: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 7c     assert( pPk |
4680: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
4690: 29 20 7c 7c 20 69 44 61 74 61 43 75 72 3d 3d 69  ) || iDataCur==i
46a0: 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
46b0: 61 73 73 65 72 74 28 20 70 50 6b 20 7c 7c 20 49  assert( pPk || I
46c0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
46d0: 7c 20 69 49 64 78 43 75 72 3d 3d 69 44 61 74 61  | iIdxCur==iData
46e0: 43 75 72 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  Cur+1 );.      i
46f0: 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  f( eOnePass==ONE
4700: 50 41 53 53 5f 4d 55 4c 54 49 20 29 20 73 71 6c  PASS_MULTI ) sql
4710: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4720: 28 76 2c 20 69 41 64 64 72 4f 6e 63 65 29 3b 0a  (v, iAddrOnce);.
4730: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
4740: 53 65 74 20 75 70 20 61 20 6c 6f 6f 70 20 6f 76  Set up a loop ov
4750: 65 72 20 74 68 65 20 72 6f 77 69 64 73 2f 70 72  er the rowids/pr
4760: 69 6d 61 72 79 2d 6b 65 79 73 20 74 68 61 74 20  imary-keys that 
4770: 77 65 72 65 20 66 6f 75 6e 64 20 69 6e 20 74 68  were found in th
4780: 65 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 2d 63  e.    ** where-c
4790: 6c 61 75 73 65 20 6c 6f 6f 70 20 61 62 6f 76 65  lause loop above
47a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
47b0: 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41   eOnePass!=ONEPA
47c0: 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
47d0: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 6e 50  assert( nKey==nP
47e0: 6b 20 29 3b 20 20 2f 2a 20 4f 50 5f 46 6f 75 6e  k );  /* OP_Foun
47f0: 64 20 77 69 6c 6c 20 75 73 65 20 61 6e 20 75 6e  d will use an un
4800: 70 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a 20 20  packed key */.  
4810: 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
4820: 61 6c 28 70 54 61 62 29 20 26 26 20 61 54 6f 4f  al(pTab) && aToO
4830: 70 65 6e 5b 69 44 61 74 61 43 75 72 2d 69 54 61  pen[iDataCur-iTa
4840: 62 43 75 72 5d 20 29 7b 0a 20 20 20 20 20 20 20  bCur] ){.       
4850: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
4860: 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
4870: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
4890: 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
48a0: 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 61 64  nd, iDataCur, ad
48b0: 64 72 42 79 70 61 73 73 2c 20 69 4b 65 79 2c 20  drBypass, iKey, 
48c0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 56  nKey);.        V
48d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
48e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
48f0: 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20  e if( pPk ){.   
4900: 20 20 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71     addrLoop = sq
4910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4920: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 45  v, OP_Rewind, iE
4930: 70 68 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65  phCur); VdbeCove
4940: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
4950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4960: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69  (v, OP_RowKey, i
4970: 45 70 68 43 75 72 2c 20 69 4b 65 79 29 3b 0a 20  EphCur, iKey);. 
4980: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65       assert( nKe
4990: 79 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 50 5f 46  y==0 );  /* OP_F
49a0: 6f 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61 20  ound will use a 
49b0: 63 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20 2a 2f  composite key */
49c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
49d0: 20 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71 6c    addrLoop = sql
49e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49f0: 2c 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c  , OP_RowSetRead,
4a00: 20 69 52 6f 77 53 65 74 2c 20 30 2c 20 69 4b 65   iRowSet, 0, iKe
4a10: 79 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  y);.      VdbeCo
4a20: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
4a30: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 31   assert( nKey==1
4a40: 20 29 3b 0a 20 20 20 20 7d 20 20 0a 20 20 0a 20   );.    }  .  . 
4a50: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
4a60: 20 72 6f 77 20 2a 2f 0a 23 69 66 6e 64 65 66 20   row */.#ifndef 
4a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4a80: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
4a90: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
4aa0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
4ab0: 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
4ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
4ad0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
4ae0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71   pTab);.      sq
4af0: 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69  lite3VtabMakeWri
4b00: 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  table(pParse, pT
4b10: 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
4b20: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
4b30: 4f 50 5f 56 55 70 64 61 74 65 2c 20 30 2c 20 31  OP_VUpdate, 0, 1
4b40: 2c 20 69 4b 65 79 2c 20 70 56 54 61 62 2c 20 50  , iKey, pVTab, P
4b50: 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 73  4_VTAB);.      s
4b60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4b70: 50 35 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  P5(v, OE_Abort);
4b80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
4b90: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
4ba0: 5f 4f 46 46 20 7c 7c 20 65 4f 6e 65 50 61 73 73  _OFF || eOnePass
4bb0: 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  ==ONEPASS_SINGLE
4bc0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4bd0: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
4be0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6e  );.      if( eOn
4bf0: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53  ePass==ONEPASS_S
4c00: 49 4e 47 4c 45 20 26 26 20 73 71 6c 69 74 65 33  INGLE && sqlite3
4c10: 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  IsToplevel(pPars
4c20: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  e) ){.        pP
4c30: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
4c40: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  te = 0;.      }.
4c50: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
4c60: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
4c70: 20 63 6f 75 6e 74 20 3d 20 28 70 50 61 72 73 65   count = (pParse
4c80: 2d 3e 6e 65 73 74 65 64 3d 3d 30 29 3b 20 20 20  ->nested==0);   
4c90: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 75 6e   /* True to coun
4ca0: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  t changes */.   
4cb0: 20 20 20 69 6e 74 20 69 49 64 78 4e 6f 53 65 65     int iIdxNoSee
4cc0: 6b 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  k = -1;.      if
4cd0: 28 20 62 43 6f 6d 70 6c 65 78 3d 3d 30 20 26 26  ( bComplex==0 &&
4ce0: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d   aiCurOnePass[1]
4cf0: 21 3d 69 44 61 74 61 43 75 72 20 29 7b 0a 20 20  !=iDataCur ){.  
4d00: 20 20 20 20 20 20 69 49 64 78 4e 6f 53 65 65 6b        iIdxNoSeek
4d10: 20 3d 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b   = aiCurOnePass[
4d20: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1];.      }.    
4d30: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
4d40: 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73  eRowDelete(pPars
4d50: 65 2c 20 70 54 61 62 2c 20 70 54 72 69 67 67 65  e, pTab, pTrigge
4d60: 72 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  r, iDataCur, iId
4d70: 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xCur,.          
4d80: 69 4b 65 79 2c 20 6e 4b 65 79 2c 20 63 6f 75 6e  iKey, nKey, coun
4d90: 74 2c 20 4f 45 5f 44 65 66 61 75 6c 74 2c 20 65  t, OE_Default, e
4da0: 4f 6e 65 50 61 73 73 2c 20 69 49 64 78 4e 6f 53  OnePass, iIdxNoS
4db0: 65 65 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  eek);.    }.  . 
4dc0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
4dd0: 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 72   loop over all r
4de0: 6f 77 69 64 73 2f 70 72 69 6d 61 72 79 2d 6b 65  owids/primary-ke
4df0: 79 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  ys. */.    if( e
4e00: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
4e10: 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71  _OFF ){.      sq
4e20: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4e30: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 79 70  Label(v, addrByp
4e40: 61 73 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ass);.      sqli
4e50: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
4e60: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
4e70: 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  f( pPk ){.      
4e80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e90: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 45  2(v, OP_Next, iE
4ea0: 70 68 43 75 72 2c 20 61 64 64 72 4c 6f 6f 70 2b  phCur, addrLoop+
4eb0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4ec0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
4ed0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4ee0: 2c 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20  , addrLoop);.   
4ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
4f00: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
4f10: 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20 20   addrLoop);.    
4f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4f30: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4c 6f 6f  pHere(v, addrLoo
4f40: 70 29 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a 20  p);.    }     . 
4f50: 20 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74   .    /* Close t
4f60: 68 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  he cursors open 
4f70: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  on the table and
4f80: 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 2a 2f   its indexes. */
4f90: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
4fa0: 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
4fb0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Tab) ){.      if
4fc0: 28 20 21 70 50 6b 20 29 20 73 71 6c 69 74 65 33  ( !pPk ) sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4fe0: 5f 43 6c 6f 73 65 2c 20 69 44 61 74 61 43 75 72  _Close, iDataCur
4ff0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
5000: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
5010: 64 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20  dex; pIdx; i++, 
5020: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
5030: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5040: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5050: 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 43 75  OP_Close, iIdxCu
5060: 72 20 2b 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  r + i);.      }.
5070: 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
5080: 20 6e 6f 6e 2d 74 72 75 6e 63 61 74 65 20 70 61   non-truncate pa
5090: 74 68 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64 61  th */..  /* Upda
50a0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  te the sqlite_se
50b0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20  quence table by 
50c0: 73 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74  storing the cont
50d0: 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ent of the.  ** 
50e0: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f  maximum rowid co
50f0: 75 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65 63  unter values rec
5100: 6f 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65  orded while inse
5110: 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20  rting into.  ** 
5120: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61  autoincrement ta
5130: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
5140: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
5150: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54  =0 && pParse->pT
5160: 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a  riggerTab==0 ){.
5170: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69      sqlite3Autoi
5180: 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72  ncrementEnd(pPar
5190: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  se);.  }..  /* R
51a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
51b0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
51c0: 72 65 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  re deleted. If t
51d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a  his routine is .
51e0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20    ** generating 
51f0: 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20  code because of 
5200: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
5210: 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20  3NestedParse(), 
5220: 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f  do not.  ** invo
5230: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
5240: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
5250: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26   if( (db->flags&
5260: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
5270: 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65  ) && !pParse->ne
5280: 73 74 65 64 20 26 26 20 21 70 50 61 72 73 65 2d  sted && !pParse-
5290: 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
52a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
52b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
52c0: 6c 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20 31  ltRow, memCnt, 1
52d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
52e0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
52f0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5300: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5310: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
5320: 2c 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64 22  , "rows deleted"
5330: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
5340: 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65 5f 66 72  ;.  }..delete_fr
5350: 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  om_cleanup:.  sq
5360: 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74  lite3AuthContext
5370: 50 6f 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a  Pop(&sContext);.
5380: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
5390: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 4c  Delete(db, pTabL
53a0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
53b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
53c0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
53d0: 44 62 46 72 65 65 28 64 62 2c 20 61 54 6f 4f 70  DbFree(db, aToOp
53e0: 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  en);.  return;.}
53f0: 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69  ./* Make sure "i
5400: 73 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72  sView" and other
5410: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20   macros defined 
5420: 61 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69  above are undefi
5430: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ned. Otherwise.*
5440: 2a 20 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72  * they may inter
5450: 66 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c  fere with compil
5460: 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66  ation of other f
5470: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  unctions in this
5480: 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20   file.** (or in 
5490: 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66  another file, if
54a0: 20 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d   this file becom
54b0: 65 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61  es part of the a
54c0: 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a  malgamation).  *
54d0: 2f 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a  /.#ifdef isView.
54e0: 20 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23   #undef isView.#
54f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72  endif.#ifdef pTr
5500: 69 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54  igger. #undef pT
5510: 72 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 0a 2f  rigger.#endif../
5520: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5530: 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
5540: 20 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65   code that cause
5550: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
5560: 66 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61  f a.** single ta
5570: 62 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ble to be delete
5580: 64 2e 20 20 42 6f 74 68 20 74 68 65 20 6f 72 69  d.  Both the ori
5590: 67 69 6e 61 6c 20 74 61 62 6c 65 20 65 6e 74 72  ginal table entr
55a0: 79 20 61 6e 64 0a 2a 2a 20 61 6c 6c 20 69 6e 64  y and.** all ind
55b0: 69 63 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64  ices are removed
55c0: 2e 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e 64 69  ..**.** Precondi
55d0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tions:.**.**   1
55e0: 2e 20 20 69 44 61 74 61 43 75 72 20 69 73 20 61  .  iDataCur is a
55f0: 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 6f 6e  n open cursor on
5600: 20 74 68 65 20 62 74 72 65 65 20 74 68 61 74 20   the btree that 
5610: 69 73 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  is the canonical
5620: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 73   data.**       s
5630: 74 6f 72 65 20 66 6f 72 20 74 68 65 20 74 61 62  tore for the tab
5640: 6c 65 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20  le.  (This will 
5650: 62 65 20 65 69 74 68 65 72 20 74 68 65 20 74 61  be either the ta
5660: 62 6c 65 20 69 74 73 65 6c 66 2c 0a 2a 2a 20 20  ble itself,.**  
5670: 20 20 20 20 20 69 6e 20 74 68 65 20 63 61 73 65       in the case
5680: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
5690: 65 2c 20 6f 72 20 74 68 65 20 50 52 49 4d 41 52  e, or the PRIMAR
56a0: 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20 74  Y KEY index in t
56b0: 68 65 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20  he case.**      
56c0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
56d0: 57 49 44 20 74 61 62 6c 65 2e 29 0a 2a 2a 0a 2a  WID table.).**.*
56e0: 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69  *   2.  Read/wri
56f0: 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  te cursors for a
5700: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
5710: 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  ab must be open 
5720: 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73  as.**       curs
5730: 6f 72 20 6e 75 6d 62 65 72 20 69 49 64 78 43 75  or number iIdxCu
5740: 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d 74 68  r+i for the i-th
5750: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20   index..**.**   
5760: 33 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79 20  3.  The primary 
5770: 6b 65 79 20 66 6f 72 20 74 68 65 20 72 6f 77 20  key for the row 
5780: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6d 75  to be deleted mu
5790: 73 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  st be stored in 
57a0: 61 0a 2a 2a 20 20 20 20 20 20 20 73 65 71 75 65  a.**       seque
57b0: 6e 63 65 20 6f 66 20 6e 50 6b 20 6d 65 6d 6f 72  nce of nPk memor
57c0: 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  y cells starting
57d0: 20 61 74 20 69 50 6b 2e 20 20 49 66 20 6e 50 6b   at iPk.  If nPk
57e0: 3d 3d 30 20 74 68 61 74 20 6d 65 61 6e 73 0a 2a  ==0 that means.*
57f0: 2a 20 20 20 20 20 20 20 74 68 61 74 20 61 20 73  *       that a s
5800: 65 61 72 63 68 20 72 65 63 6f 72 64 20 66 6f 72  earch record for
5810: 6d 65 64 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65  med from OP_Make
5820: 52 65 63 6f 72 64 20 69 73 20 63 6f 6e 74 61 69  Record is contai
5830: 6e 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ned in the.**   
5840: 20 20 20 20 73 69 6e 67 6c 65 20 6d 65 6d 6f 72      single memor
5850: 79 20 6c 6f 63 61 74 69 6f 6e 20 69 50 6b 2e 0a  y location iPk..
5860: 2a 2a 0a 2a 2a 20 65 4d 6f 64 65 3a 0a 2a 2a 20  **.** eMode:.** 
5870: 20 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64    Parameter eMod
5880: 65 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  e may be passed 
5890: 65 69 74 68 65 72 20 4f 4e 45 50 41 53 53 5f 4f  either ONEPASS_O
58a0: 46 46 20 28 30 29 2c 20 4f 4e 45 50 41 53 53 5f  FF (0), ONEPASS_
58b0: 53 49 4e 47 4c 45 2c 20 6f 72 0a 2a 2a 20 20 20  SINGLE, or.**   
58c0: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 2e 20 20  ONEPASS_MULTI.  
58d0: 49 66 20 65 4d 6f 64 65 20 69 73 20 6e 6f 74 20  If eMode is not 
58e0: 4f 4e 45 50 41 53 53 5f 4f 46 46 2c 20 74 68 65  ONEPASS_OFF, the
58f0: 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
5900: 20 20 69 44 61 74 61 43 75 72 20 61 6c 72 65 61    iDataCur alrea
5910: 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
5920: 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 20   row to delete. 
5930: 49 66 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50  If eMode is ONEP
5940: 41 53 53 5f 4f 46 46 0a 2a 2a 20 20 20 74 68 65  ASS_OFF.**   the
5950: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
5960: 6d 75 73 74 20 73 65 65 6b 20 69 44 61 74 61 43  must seek iDataC
5970: 75 72 20 74 6f 20 74 68 65 20 65 6e 74 72 79 20  ur to the entry 
5980: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 50  identified by iP
5990: 6b 0a 2a 2a 20 20 20 61 6e 64 20 6e 50 6b 20 62  k.**   and nPk b
59a0: 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 66 72  efore reading fr
59b0: 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  om it..**.**   I
59c0: 66 20 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41  f eMode is ONEPA
59d0: 53 53 5f 4d 55 4c 54 49 2c 20 74 68 65 6e 20 74  SS_MULTI, then t
59e0: 68 69 73 20 63 61 6c 6c 20 69 73 20 62 65 69 6e  his call is bein
59f0: 67 20 6d 61 64 65 20 61 73 20 70 61 72 74 0a 2a  g made as part.*
5a00: 2a 20 20 20 6f 66 20 61 20 4f 4e 45 50 41 53 53  *   of a ONEPASS
5a10: 20 64 65 6c 65 74 65 20 74 68 61 74 20 61 66 66   delete that aff
5a20: 65 63 74 73 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ects multiple ro
5a30: 77 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ws. In this case
5a40: 2c 20 69 66 20 0a 2a 2a 20 20 20 69 49 64 78 4e  , if .**   iIdxN
5a50: 6f 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64  oSeek is a valid
5a60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28   cursor number (
5a70: 3e 3d 30 29 2c 20 74 68 65 6e 20 69 74 73 20 70  >=0), then its p
5a80: 6f 73 69 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 2a  osition should.*
5a90: 2a 20 20 20 62 65 20 70 72 65 73 65 72 76 65 64  *   be preserved
5aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
5ab0: 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e  elete operation.
5ac0: 20 4f 72 2c 20 69 66 20 69 49 64 78 4e 6f 53 65   Or, if iIdxNoSe
5ad0: 65 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 61  ek is not.**   a
5ae0: 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 6e 75   valid cursor nu
5af0: 6d 62 65 72 2c 20 74 68 65 20 70 6f 73 69 74 69  mber, the positi
5b00: 6f 6e 20 6f 66 20 69 44 61 74 61 43 75 72 20 73  on of iDataCur s
5b10: 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 72 76  hould be preserv
5b20: 65 64 0a 2a 2a 20 20 20 69 6e 73 74 65 61 64 2e  ed.**   instead.
5b30: 0a 2a 2a 0a 2a 2a 20 69 49 64 78 4e 6f 53 65 65  .**.** iIdxNoSee
5b40: 6b 3a 0a 2a 2a 20 20 20 49 66 20 69 49 64 78 4e  k:.**   If iIdxN
5b50: 6f 53 65 65 6b 20 69 73 20 61 20 76 61 6c 69 64  oSeek is a valid
5b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 28   cursor number (
5b70: 3e 3d 30 29 2c 20 74 68 65 6e 20 69 74 20 69 64  >=0), then it id
5b80: 65 6e 74 69 66 69 65 73 20 61 6e 0a 2a 2a 20 20  entifies an.**  
5b90: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 28 66   index cursor (f
5ba0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 72 72 61 79  rom within array
5bb0: 20 6f 66 20 63 75 72 73 6f 72 73 20 73 74 61 72   of cursors star
5bc0: 74 69 6e 67 20 61 74 20 69 49 64 78 43 75 72 29  ting at iIdxCur)
5bd0: 20 74 68 61 74 0a 2a 2a 20 20 20 61 6c 72 65 61   that.**   alrea
5be0: 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
5bf0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 6f 20   index entry to 
5c00: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76  be deleted..*/.v
5c10: 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72  oid sqlite3Gener
5c20: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20 20  ateRowDelete(.  
5c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5c40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5c50: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
5c60: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a   *pTab,       /*
5c70: 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   Table containin
5c80: 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  g the row to be 
5c90: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 54 72 69  deleted */.  Tri
5ca0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20  gger *pTrigger, 
5cb0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67  /* List of trigg
5cc0: 65 72 73 20 74 6f 20 28 70 6f 74 65 6e 74 69 61  ers to (potentia
5cd0: 6c 6c 79 29 20 66 69 72 65 20 2a 2f 0a 20 20 69  lly) fire */.  i
5ce0: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20 20 20  nt iDataCur,    
5cf0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 72 6f 6d    /* Cursor from
5d00: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 20 64 61   which column da
5d10: 74 61 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ta is extracted 
5d20: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
5d30: 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
5d40: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
5d50: 0a 20 20 69 6e 74 20 69 50 6b 2c 20 20 20 20 20  .  int iPk,     
5d60: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6d        /* First m
5d70: 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 6e 74 61  emory cell conta
5d80: 69 6e 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52  ining the PRIMAR
5d90: 59 20 4b 45 59 20 2a 2f 0a 20 20 69 31 36 20 6e  Y KEY */.  i16 n
5da0: 50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Pk,           /*
5db0: 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
5dc0: 52 59 20 4b 45 59 20 6d 65 6d 6f 72 79 20 63 65  RY KEY memory ce
5dd0: 6c 6c 73 20 2a 2f 0a 20 20 75 38 20 63 6f 75 6e  lls */.  u8 coun
5de0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  t,          /* I
5df0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 63 72  f non-zero, incr
5e00: 65 6d 65 6e 74 20 74 68 65 20 72 6f 77 20 63 68  ement the row ch
5e10: 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange counter */.
5e20: 20 20 75 38 20 6f 6e 63 6f 6e 66 2c 20 20 20 20    u8 onconf,    
5e30: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
5e40: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
5e50: 63 79 20 66 6f 72 20 74 72 69 67 67 65 72 73 20  cy for triggers 
5e60: 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 2c 20 20  */.  u8 eMode,  
5e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41          /* ONEPA
5e80: 53 53 5f 4f 46 46 2c 20 5f 53 49 4e 47 4c 45 2c  SS_OFF, _SINGLE,
5e90: 20 6f 72 20 5f 4d 55 4c 54 49 2e 20 20 53 65 65   or _MULTI.  See
5ea0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e 74 20   above */.  int 
5eb0: 69 49 64 78 4e 6f 53 65 65 6b 20 20 20 20 20 2f  iIdxNoSeek     /
5ec0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
5ed0: 6f 66 20 63 75 72 73 6f 72 20 74 68 61 74 20 64  of cursor that d
5ee0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 73 65 65  oes not need see
5ef0: 6b 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  king */.){.  Vdb
5f00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5f10: 56 64 62 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Vdbe;        /* 
5f20: 56 64 62 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  Vdbe */.  int iO
5f30: 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
5f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5f50: 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 4f  st register in O
5f60: 4c 44 2e 2a 20 61 72 72 61 79 20 2a 2f 0a 20 20  LD.* array */.  
5f70: 69 6e 74 20 69 4c 61 62 65 6c 3b 20 20 20 20 20  int iLabel;     
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 2f 2a 20 4c 61 62 65 6c 20 72 65 73 6f 6c 76 65  /* Label resolve
5fa0: 64 20 74 6f 20 65 6e 64 20 6f 66 20 67 65 6e 65  d to end of gene
5fb0: 72 61 74 65 64 20 63 6f 64 65 20 2a 2f 0a 20 20  rated code */.  
5fc0: 75 38 20 6f 70 53 65 65 6b 3b 20 20 20 20 20 20  u8 opSeek;      
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 2f 2a 20 53 65 65 6b 20 6f 70 63 6f 64 65 20 2a  /* Seek opcode *
5ff0: 2f 0a 0a 20 20 2f 2a 20 56 64 62 65 20 69 73 20  /..  /* Vdbe is 
6000: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
6010: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
6020: 64 20 62 79 20 74 68 69 73 20 73 74 61 67 65 2e  d by this stage.
6030: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 76 20   */.  assert( v 
6040: 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  );.  VdbeModuleC
6050: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 45 47 49  omment((v, "BEGI
6060: 4e 3a 20 47 65 6e 52 6f 77 44 65 6c 28 25 64 2c  N: GenRowDel(%d,
6070: 25 64 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20 20  %d,%d,%d)",.    
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 69 44 61 74 61 43 75 72 2c 20 69       iDataCur, i
60a0: 49 64 78 43 75 72 2c 20 69 50 6b 2c 20 28 69 6e  IdxCur, iPk, (in
60b0: 74 29 6e 50 6b 29 29 3b 0a 0a 20 20 2f 2a 20 53  t)nPk));..  /* S
60c0: 65 65 6b 20 63 75 72 73 6f 72 20 69 43 75 72 20  eek cursor iCur 
60d0: 74 6f 20 74 68 65 20 72 6f 77 20 74 6f 20 64 65  to the row to de
60e0: 6c 65 74 65 2e 20 49 66 20 74 68 69 73 20 72 6f  lete. If this ro
60f0: 77 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73  w no longer exis
6100: 74 73 20 0a 20 20 2a 2a 20 28 74 68 69 73 20 63  ts .  ** (this c
6110: 61 6e 20 68 61 70 70 65 6e 20 69 66 20 61 20 74  an happen if a t
6120: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 68  rigger program h
6130: 61 73 20 61 6c 72 65 61 64 79 20 64 65 6c 65 74  as already delet
6140: 65 64 20 69 74 29 2c 20 64 6f 0a 20 20 2a 2a 20  ed it), do.  ** 
6150: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64  not attempt to d
6160: 65 6c 65 74 65 20 69 74 20 6f 72 20 66 69 72 65  elete it or fire
6170: 20 61 6e 79 20 44 45 4c 45 54 45 20 74 72 69 67   any DELETE trig
6180: 67 65 72 73 2e 20 20 2a 2f 0a 20 20 69 4c 61 62  gers.  */.  iLab
6190: 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
61a0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
61b0: 6f 70 53 65 65 6b 20 3d 20 48 61 73 52 6f 77 69  opSeek = HasRowi
61c0: 64 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e 6f 74  d(pTab) ? OP_Not
61d0: 45 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f 74 46  Exists : OP_NotF
61e0: 6f 75 6e 64 3b 0a 20 20 69 66 28 20 65 4d 6f 64  ound;.  if( eMod
61f0: 65 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  e==ONEPASS_OFF )
6200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6210: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
6220: 53 65 65 6b 2c 20 69 44 61 74 61 43 75 72 2c 20  Seek, iDataCur, 
6230: 69 4c 61 62 65 6c 2c 20 69 50 6b 2c 20 6e 50 6b  iLabel, iPk, nPk
6240: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6250: 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d  ageIf(v, opSeek=
6260: 3d 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 3b 0a  =OP_NotExists);.
6270: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6280: 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50  If(v, opSeek==OP
6290: 5f 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 7d 0a  _NotFound);.  }.
62a0: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
62b0: 61 72 65 20 61 6e 79 20 74 72 69 67 67 65 72 73  are any triggers
62c0: 20 74 6f 20 66 69 72 65 2c 20 61 6c 6c 6f 63 61   to fire, alloca
62d0: 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 72 65  te a range of re
62e0: 67 69 73 74 65 72 73 20 74 6f 0a 20 20 2a 2a 20  gisters to.  ** 
62f0: 75 73 65 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  use for the old.
6300: 2a 20 72 65 66 65 72 65 6e 63 65 73 20 69 6e 20  * references in 
6310: 74 68 65 20 74 72 69 67 67 65 72 73 2e 20 20 2a  the triggers.  *
6320: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  /.  if( sqlite3F
6330: 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73 65  kRequired(pParse
6340: 2c 20 70 54 61 62 2c 20 30 2c 20 30 29 20 7c 7c  , pTab, 0, 0) ||
6350: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
6360: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 20 20   u32 mask;      
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6380: 2a 20 4d 61 73 6b 20 6f 66 20 4f 4c 44 2e 2a 20  * Mask of OLD.* 
6390: 63 6f 6c 75 6d 6e 73 20 69 6e 20 75 73 65 20 2a  columns in use *
63a0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20  /.    int iCol; 
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
63d0: 75 73 65 64 20 77 68 69 6c 65 20 70 6f 70 75 6c  used while popul
63e0: 61 74 69 6e 67 20 4f 4c 44 2e 2a 20 2a 2f 0a 20  ating OLD.* */. 
63f0: 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74     int addrStart
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 42 45 46   /* Start of BEF
6420: 4f 52 45 20 74 72 69 67 67 65 72 20 70 72 6f 67  ORE trigger prog
6430: 72 61 6d 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rams */..    /* 
6440: 54 4f 44 4f 3a 20 43 6f 75 6c 64 20 75 73 65 20  TODO: Could use 
6450: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
6460: 65 72 73 20 68 65 72 65 2e 20 41 6c 73 6f 20 63  ers here. Also c
6470: 6f 75 6c 64 20 61 74 74 65 6d 70 74 20 74 6f 0a  ould attempt to.
6480: 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 63 6f 70      ** avoid cop
6490: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
64a0: 73 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 72  s of the rowid r
64b0: 65 67 69 73 74 65 72 2e 20 20 2a 2f 0a 20 20 20  egister.  */.   
64c0: 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 54   mask = sqlite3T
64d0: 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b 28 0a 20  riggerColmask(. 
64e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
64f0: 54 72 69 67 67 65 72 2c 20 30 2c 20 30 2c 20 54  Trigger, 0, 0, T
6500: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52  RIGGER_BEFORE|TR
6510: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
6520: 62 2c 20 6f 6e 63 6f 6e 66 0a 20 20 20 20 29 3b  b, onconf.    );
6530: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c  .    mask |= sql
6540: 69 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 70 50  ite3FkOldmask(pP
6550: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
6560: 20 69 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e   iOld = pParse->
6570: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
6580: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 31 20 2b  se->nMem += (1 +
6590: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20   pTab->nCol);.. 
65a0: 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
65b0: 68 65 20 4f 4c 44 2e 2a 20 70 73 65 75 64 6f 2d  he OLD.* pseudo-
65c0: 74 61 62 6c 65 20 72 65 67 69 73 74 65 72 20 61  table register a
65d0: 72 72 61 79 2e 20 54 68 65 73 65 20 76 61 6c 75  rray. These valu
65e0: 65 73 20 77 69 6c 6c 20 62 65 20 0a 20 20 20 20  es will be .    
65f0: 2a 2a 20 75 73 65 64 20 62 79 20 61 6e 79 20 42  ** used by any B
6600: 45 46 4f 52 45 20 61 6e 64 20 41 46 54 45 52 20  EFORE and AFTER 
6610: 74 72 69 67 67 65 72 73 20 74 68 61 74 20 65 78  triggers that ex
6620: 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ist.  */.    sql
6630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6640: 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 50 6b 2c 20  , OP_Copy, iPk, 
6650: 69 4f 6c 64 29 3b 0a 20 20 20 20 66 6f 72 28 69  iOld);.    for(i
6660: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
6670: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
6680: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6690: 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66   mask!=0xfffffff
66a0: 66 20 26 26 20 69 43 6f 6c 3d 3d 33 31 20 29 3b  f && iCol==31 );
66b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
66c0: 20 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66   mask!=0xfffffff
66d0: 66 20 26 26 20 69 43 6f 6c 3d 3d 33 32 20 29 3b  f && iCol==32 );
66e0: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 73 6b 3d  .      if( mask=
66f0: 3d 30 78 66 66 66 66 66 66 66 66 20 7c 7c 20 28  =0xffffffff || (
6700: 69 43 6f 6c 3c 3d 33 31 20 26 26 20 28 6d 61 73  iCol<=31 && (mas
6710: 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 69 43  k & MASKBIT32(iC
6720: 6f 6c 29 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  ol))!=0) ){.    
6730: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6740: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
6750: 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61  ble(v, pTab, iDa
6760: 74 61 43 75 72 2c 20 69 43 6f 6c 2c 20 69 4f 6c  taCur, iCol, iOl
6770: 64 2b 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  d+iCol+1);.     
6780: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
6790: 20 49 6e 76 6f 6b 65 20 42 45 46 4f 52 45 20 44   Invoke BEFORE D
67a0: 45 4c 45 54 45 20 74 72 69 67 67 65 72 20 70 72  ELETE trigger pr
67b0: 6f 67 72 61 6d 73 2e 20 2a 2f 0a 20 20 20 20 61  ograms. */.    a
67c0: 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
67d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
67e0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
67f0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
6800: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
6810: 2c 20 0a 20 20 20 20 20 20 20 20 54 4b 5f 44 45  , .        TK_DE
6820: 4c 45 54 45 2c 20 30 2c 20 54 52 49 47 47 45 52  LETE, 0, TRIGGER
6830: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 69  _BEFORE, pTab, i
6840: 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c 20 69 4c 61  Old, onconf, iLa
6850: 62 65 6c 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  bel.    );..    
6860: 2f 2a 20 49 66 20 61 6e 79 20 42 45 46 4f 52 45  /* If any BEFORE
6870: 20 74 72 69 67 67 65 72 73 20 77 65 72 65 20 63   triggers were c
6880: 6f 64 65 64 2c 20 74 68 65 6e 20 73 65 65 6b 20  oded, then seek 
6890: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
68a0: 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 20 74 6f  e .    ** row to
68b0: 20 62 65 20 64 65 6c 65 74 65 64 20 61 67 61 69   be deleted agai
68c0: 6e 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  n. It may be tha
68d0: 74 20 74 68 65 20 42 45 46 4f 52 45 20 74 72 69  t the BEFORE tri
68e0: 67 67 65 72 73 20 6d 6f 76 65 64 0a 20 20 20 20  ggers moved.    
68f0: 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6f 72  ** the cursor or
6900: 20 6f 66 20 61 6c 72 65 61 64 79 20 64 65 6c 65   of already dele
6910: 74 65 64 20 74 68 65 20 72 6f 77 20 74 68 61 74  ted the row that
6920: 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
6930: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 69 6e 67 20      ** pointing 
6940: 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
6950: 66 28 20 61 64 64 72 53 74 61 72 74 3c 73 71 6c  f( addrStart<sql
6960: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6970: 64 64 72 28 76 29 20 29 7b 0a 20 20 20 20 20 20  ddr(v) ){.      
6980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6990: 34 49 6e 74 28 76 2c 20 6f 70 53 65 65 6b 2c 20  4Int(v, opSeek, 
69a0: 69 44 61 74 61 43 75 72 2c 20 69 4c 61 62 65 6c  iDataCur, iLabel
69b0: 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20  , iPk, nPk);.   
69c0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
69d0: 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f  f(v, opSeek==OP_
69e0: 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20 20 20 20  NotExists);.    
69f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
6a00: 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e  (v, opSeek==OP_N
6a10: 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 0a  otFound);.    }.
6a20: 0a 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 70 72  .    /* Do FK pr
6a30: 6f 63 65 73 73 69 6e 67 2e 20 54 68 69 73 20 63  ocessing. This c
6a40: 61 6c 6c 20 63 68 65 63 6b 73 20 74 68 61 74 20  all checks that 
6a50: 61 6e 79 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  any FK constrain
6a60: 74 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  ts that.    ** r
6a70: 65 66 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  efer to this tab
6a80: 6c 65 20 28 69 2e 65 2e 20 63 6f 6e 73 74 72 61  le (i.e. constra
6a90: 69 6e 74 73 20 61 74 74 61 63 68 65 64 20 74 6f  ints attached to
6aa0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 29 20 0a   other tables) .
6ab0: 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 76      ** are not v
6ac0: 69 6f 6c 61 74 65 64 20 62 79 20 64 65 6c 65 74  iolated by delet
6ad0: 69 6e 67 20 74 68 69 73 20 72 6f 77 2e 20 20 2a  ing this row.  *
6ae0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43  /.    sqlite3FkC
6af0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61  heck(pParse, pTa
6b00: 62 2c 20 69 4f 6c 64 2c 20 30 2c 20 30 2c 20 30  b, iOld, 0, 0, 0
6b10: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
6b20: 65 74 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ete the index an
6b30: 64 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e  d table entries.
6b40: 20 53 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   Skip this step 
6b50: 69 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c  if pTab is reall
6b60: 79 0a 20 20 2a 2a 20 61 20 76 69 65 77 20 28 69  y.  ** a view (i
6b70: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
6b80: 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 6f 66 20   only effect of 
6b90: 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  the DELETE state
6ba0: 6d 65 6e 74 20 69 73 20 74 6f 0a 20 20 2a 2a 20  ment is to.  ** 
6bb0: 66 69 72 65 20 74 68 65 20 49 4e 53 54 45 41 44  fire the INSTEAD
6bc0: 20 4f 46 20 74 72 69 67 67 65 72 73 29 2e 20 20   OF triggers).  
6bd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 76 61  .  **.  ** If va
6be0: 72 69 61 62 6c 65 20 27 63 6f 75 6e 74 27 20 69  riable 'count' i
6bf0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
6c00: 20 74 68 69 73 20 4f 50 5f 44 65 6c 65 74 65 20   this OP_Delete 
6c10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 68 6f 75  instruction shou
6c20: 6c 64 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74  ld.  ** invoke t
6c30: 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 2e 20  he update-hook. 
6c40: 54 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68  The pre-update-h
6c50: 6f 6f 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65  ook, on the othe
6c60: 72 20 68 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  r hand should.  
6c70: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 75 6e  ** be invoked un
6c80: 6c 65 73 73 20 74 61 62 6c 65 20 70 54 61 62 20  less table pTab 
6c90: 69 73 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c  is a system tabl
6ca0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
6cb0: 65 20 69 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  e is that.  ** t
6cc0: 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  he update-hook i
6cd0: 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 66 6f  s not invoked fo
6ce0: 72 20 72 6f 77 73 20 72 65 6d 6f 76 65 64 20 62  r rows removed b
6cf0: 79 20 52 45 50 4c 41 43 45 2c 20 62 75 74 20 74  y REPLACE, but t
6d00: 68 65 20 0a 20 20 2a 2a 20 70 72 65 2d 75 70 64  he .  ** pre-upd
6d10: 61 74 65 2d 68 6f 6f 6b 20 69 73 2e 0a 20 20 2a  ate-hook is..  *
6d20: 2f 20 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  / .  if( pTab->p
6d30: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
6d40: 20 75 38 20 70 35 20 3d 20 30 3b 0a 20 20 20 20   u8 p5 = 0;.    
6d50: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
6d60: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50  owIndexDelete(pP
6d70: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74  arse, pTab, iDat
6d80: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 30 2c  aCur, iIdxCur,0,
6d90: 69 49 64 78 4e 6f 53 65 65 6b 29 3b 0a 20 20 20  iIdxNoSeek);.   
6da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6db0: 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p2(v, OP_Delete,
6dc0: 20 69 44 61 74 61 43 75 72 2c 20 28 63 6f 75 6e   iDataCur, (coun
6dd0: 74 3f 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  t?OPFLAG_NCHANGE
6de0: 3a 30 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  :0));.    sqlite
6df0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
6e00: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 54 61 62   -1, (char*)pTab
6e10: 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20  , P4_TABLE);.   
6e20: 20 69 66 28 20 65 4d 6f 64 65 21 3d 4f 4e 45 50   if( eMode!=ONEP
6e30: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
6e40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6e50: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
6e60: 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 7d  UXDELETE);.    }
6e70: 0a 20 20 20 20 69 66 28 20 69 49 64 78 4e 6f 53  .    if( iIdxNoS
6e80: 65 65 6b 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  eek>=0 ){.      
6e90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ea0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6eb0: 69 49 64 78 4e 6f 53 65 65 6b 29 3b 0a 20 20 20  iIdxNoSeek);.   
6ec0: 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65   }.    if( eMode
6ed0: 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  ==ONEPASS_MULTI 
6ee0: 29 20 70 35 20 7c 3d 20 4f 50 46 4c 41 47 5f 53  ) p5 |= OPFLAG_S
6ef0: 41 56 45 50 4f 53 49 54 49 4f 4e 3b 0a 20 20 20  AVEPOSITION;.   
6f00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f10: 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
6f20: 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e  ..  /* Do any ON
6f30: 20 43 41 53 43 41 44 45 2c 20 53 45 54 20 4e 55   CASCADE, SET NU
6f40: 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41 55 4c  LL or SET DEFAUL
6f50: 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  T operations req
6f60: 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 68 61  uired to.  ** ha
6f70: 6e 64 6c 65 20 72 6f 77 73 20 28 70 6f 73 73 69  ndle rows (possi
6f80: 62 6c 79 20 69 6e 20 6f 74 68 65 72 20 74 61 62  bly in other tab
6f90: 6c 65 73 29 20 74 68 61 74 20 72 65 66 65 72 20  les) that refer 
6fa0: 76 69 61 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  via a foreign ke
6fb0: 79 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f  y.  ** to the ro
6fc0: 77 20 6a 75 73 74 20 64 65 6c 65 74 65 64 2e 20  w just deleted. 
6fd0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 46 6b 41  */ .  sqlite3FkA
6fe0: 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 70  ctions(pParse, p
6ff0: 54 61 62 2c 20 30 2c 20 69 4f 6c 64 2c 20 30 2c  Tab, 0, iOld, 0,
7000: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b   0);..  /* Invok
7010: 65 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 74  e AFTER DELETE t
7020: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
7030: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
7040: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
7050: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 0a 20  se, pTrigger, . 
7060: 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45 2c 20       TK_DELETE, 
7070: 30 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  0, TRIGGER_AFTER
7080: 2c 20 70 54 61 62 2c 20 69 4f 6c 64 2c 20 6f 6e  , pTab, iOld, on
7090: 63 6f 6e 66 2c 20 69 4c 61 62 65 6c 0a 20 20 29  conf, iLabel.  )
70a0: 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
70b0: 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 64  e if the row had
70c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
70d0: 6c 65 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  leted before any
70e0: 20 42 45 46 4f 52 45 0a 20 20 2a 2a 20 74 72 69   BEFORE.  ** tri
70f0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 77 65  gger programs we
7100: 72 65 20 69 6e 76 6f 6b 65 64 2e 20 4f 72 20 69  re invoked. Or i
7110: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
7120: 72 61 6d 20 74 68 72 6f 77 73 20 61 20 0a 20 20  ram throws a .  
7130: 2a 2a 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  ** RAISE(IGNORE)
7140: 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a   exception.  */.
7150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
7160: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 61  olveLabel(v, iLa
7170: 62 65 6c 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75  bel);.  VdbeModu
7180: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
7190: 4e 44 3a 20 47 65 6e 52 6f 77 44 65 6c 28 29 22  ND: GenRowDel()"
71a0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
71b0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
71c0: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
71d0: 61 74 20 63 61 75 73 65 73 20 74 68 65 20 64 65  at causes the de
71e0: 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c 0a 2a 2a  letion of all.**
71f0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
7200: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
7210: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61   single row of a
7220: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2c 20 70   single table, p
7230: 54 61 62 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e  Tab.**.** Precon
7240: 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  ditions:.**.**  
7250: 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74   1.  A read/writ
7260: 65 20 63 75 72 73 6f 72 20 22 69 44 61 74 61 43  e cursor "iDataC
7270: 75 72 22 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ur" must be open
7280: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
7290: 6c 20 73 74 6f 72 61 67 65 0a 2a 2a 20 20 20 20  l storage.**    
72a0: 20 20 20 62 74 72 65 65 20 66 6f 72 20 74 68 65     btree for the
72b0: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 28 54   table pTab.  (T
72c0: 68 69 73 20 77 69 6c 6c 20 62 65 20 65 69 74 68  his will be eith
72d0: 65 72 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  er the table its
72e0: 65 6c 66 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72  elf.**       for
72f0: 20 72 6f 77 69 64 20 74 61 62 6c 65 73 20 6f 72   rowid tables or
7300: 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20   to the primary 
7310: 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20 57 49  key index for WI
7320: 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 20  THOUT ROWID.**  
7330: 20 20 20 20 20 74 61 62 6c 65 73 2e 29 0a 2a 2a       tables.).**
7340: 0a 2a 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77  .**   2.  Read/w
7350: 72 69 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  rite cursors for
7360: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
7370: 70 54 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65  pTab must be ope
7380: 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75  n as.**       cu
7390: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 49 64 78  rsor number iIdx
73a0: 43 75 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d  Cur+i for the i-
73b0: 74 68 20 69 6e 64 65 78 2e 20 20 28 54 68 65 20  th index.  (The 
73c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 0a 2a 2a 20  pTab->pIndex.** 
73d0: 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 74        index is t
73e0: 68 65 20 30 2d 74 68 20 69 6e 64 65 78 2e 29 0a  he 0-th index.).
73f0: 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20  **.**   3.  The 
7400: 22 69 44 61 74 61 43 75 72 22 20 63 75 72 73 6f  "iDataCur" curso
7410: 72 20 6d 75 73 74 20 62 65 20 61 6c 72 65 61 64  r must be alread
7420: 79 20 62 65 20 70 6f 73 69 74 69 6f 6e 65 64 20  y be positioned 
7430: 6f 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20  on the row.**   
7440: 20 20 20 20 74 68 61 74 20 69 73 20 74 6f 20 62      that is to b
7450: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f  e deleted..*/.vo
7460: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
7470: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
7480: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7490: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
74a0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
74b0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
74c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
74d0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
74e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
74f0: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
7500: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
7510: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
7520: 72 20 6f 66 20 74 61 62 6c 65 20 68 6f 6c 64 69  r of table holdi
7530: 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 20 20 69 6e  ng data. */.  in
7540: 74 20 69 49 64 78 43 75 72 2c 20 20 20 20 20 20  t iIdxCur,      
7550: 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78 20   /* First index 
7560: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
7570: 2a 61 52 65 67 49 64 78 2c 20 20 20 20 20 20 2f  *aRegIdx,      /
7580: 2a 20 4f 6e 6c 79 20 64 65 6c 65 74 65 20 69 66  * Only delete if
7590: 20 61 52 65 67 49 64 78 21 3d 30 20 26 26 20 61   aRegIdx!=0 && a
75a0: 52 65 67 49 64 78 5b 69 5d 3e 30 20 2a 2f 0a 20  RegIdx[i]>0 */. 
75b0: 20 69 6e 74 20 69 49 64 78 4e 6f 53 65 65 6b 20   int iIdxNoSeek 
75c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65      /* Do not de
75d0: 6c 65 74 65 20 66 72 6f 6d 20 74 68 69 73 20 63  lete from this c
75e0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
75f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7600: 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20 63   /* Index loop c
7610: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
7620: 72 31 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f  r1 = -1;       /
7630: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
7640: 6e 67 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ng an index key 
7650: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
7660: 78 4c 61 62 65 6c 3b 20 2f 2a 20 4a 75 6d 70 20  xLabel; /* Jump 
7670: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
7680: 73 6b 69 70 70 69 6e 67 20 70 61 72 74 69 61 6c  skipping partial
7690: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
76a0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
76b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
76c0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 49 6e 64  t index */.  Ind
76d0: 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 20  ex *pPrior = 0; 
76e0: 2f 2a 20 50 72 69 6f 72 20 69 6e 64 65 78 20 2a  /* Prior index *
76f0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
7700: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
7710: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
7720: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7730: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
7740: 70 50 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  pPk;        /* P
7750: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
7760: 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 72 6f  , or NULL for ro
7770: 77 69 64 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  wid tables */.. 
7780: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
7790: 62 65 3b 0a 20 20 70 50 6b 20 3d 20 48 61 73 52  be;.  pPk = HasR
77a0: 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a  owid(pTab) ? 0 :
77b0: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
77c0: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
77d0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70   for(i=0, pIdx=p
77e0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
77f0: 78 3b 20 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64  x; i++, pIdx=pId
7800: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  x->pNext){.    a
7810: 73 73 65 72 74 28 20 69 49 64 78 43 75 72 2b 69  ssert( iIdxCur+i
7820: 21 3d 69 44 61 74 61 43 75 72 20 7c 7c 20 70 50  !=iDataCur || pP
7830: 6b 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 69  k==pIdx );.    i
7840: 66 28 20 61 52 65 67 49 64 78 21 3d 30 20 26 26  f( aRegIdx!=0 &&
7850: 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 20 29   aRegIdx[i]==0 )
7860: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7870: 66 28 20 70 49 64 78 3d 3d 70 50 6b 20 29 20 63  f( pIdx==pPk ) c
7880: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7890: 20 69 49 64 78 43 75 72 2b 69 3d 3d 69 49 64 78   iIdxCur+i==iIdx
78a0: 4e 6f 53 65 65 6b 20 29 20 63 6f 6e 74 69 6e 75  NoSeek ) continu
78b0: 65 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  e;.    VdbeModul
78c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 65  eComment((v, "Ge
78d0: 6e 52 6f 77 49 64 78 44 65 6c 20 66 6f 72 20 25  nRowIdxDel for %
78e0: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
78f0: 29 3b 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  );.    r1 = sqli
7900: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
7910: 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
7920: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 31  , iDataCur, 0, 1
7930: 2c 0a 20 20 20 20 20 20 20 20 26 69 50 61 72 74  ,.        &iPart
7940: 49 64 78 4c 61 62 65 6c 2c 20 70 50 72 69 6f 72  IdxLabel, pPrior
7950: 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
7960: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7970: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 49  OP_IdxDelete, iI
7980: 64 78 43 75 72 2b 69 2c 20 72 31 2c 0a 20 20 20  dxCur+i, r1,.   
7990: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
79a0: 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e  otNull ? pIdx->n
79b0: 4b 65 79 43 6f 6c 20 3a 20 70 49 64 78 2d 3e 6e  KeyCol : pIdx->n
79c0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
79d0: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
79e0: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
79f0: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a  iPartIdxLabel);.
7a00: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
7a10: 78 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x;.  }.}../*.** 
7a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
7a30: 61 74 20 77 69 6c 6c 20 61 73 73 65 6d 62 6c 65  at will assemble
7a40: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 61 6e   an index key an
7a50: 64 20 73 74 6f 72 65 73 20 69 74 20 69 6e 20 72  d stores it in r
7a60: 65 67 69 73 74 65 72 0a 2a 2a 20 72 65 67 4f 75  egister.** regOu
7a70: 74 2e 20 20 54 68 65 20 6b 65 79 20 77 69 74 68  t.  The key with
7a80: 20 62 65 20 66 6f 72 20 69 6e 64 65 78 20 70 49   be for index pI
7a90: 64 78 20 77 68 69 63 68 20 69 73 20 61 6e 20 69  dx which is an i
7aa0: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
7ab0: 20 69 43 75 72 20 69 73 20 74 68 65 20 69 6e 64   iCur is the ind
7ac0: 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f  ex of a cursor o
7ad0: 70 65 6e 20 6f 6e 20 74 68 65 20 70 54 61 62 20  pen on the pTab 
7ae0: 74 61 62 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69  table and pointi
7af0: 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74  ng to.** the ent
7b00: 72 79 20 74 68 61 74 20 6e 65 65 64 73 20 69 6e  ry that needs in
7b10: 64 65 78 69 6e 67 2e 20 20 49 66 20 70 54 61 62  dexing.  If pTab
7b20: 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f   is a WITHOUT RO
7b30: 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  WID table, then.
7b40: 2a 2a 20 69 43 75 72 20 6d 75 73 74 20 62 65 20  ** iCur must be 
7b50: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
7b60: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
7b70: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  dex..**.** Retur
7b80: 6e 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  n a register num
7b90: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
7ba0: 20 66 69 72 73 74 20 69 6e 20 61 20 62 6c 6f 63   first in a bloc
7bb0: 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  k of.** register
7bc0: 73 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  s that holds the
7bd0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
7be0: 20 69 6e 64 65 78 20 6b 65 79 2e 20 20 54 68 65   index key.  The
7bf0: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 72 65 67  .** block of reg
7c00: 69 73 74 65 72 73 20 68 61 73 20 61 6c 72 65 61  isters has alrea
7c10: 64 79 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  dy been dealloca
7c20: 74 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 0a  ted by the time.
7c30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7c40: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
7c50: 66 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65  f *piPartIdxLabe
7c60: 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 66  l is not NULL, f
7c70: 69 6c 6c 20 69 74 20 69 6e 20 77 69 74 68 20 61  ill it in with a
7c80: 20 6c 61 62 65 6c 20 61 6e 64 20 6a 75 6d 70 0a   label and jump.
7c90: 2a 2a 20 74 6f 20 74 68 61 74 20 6c 61 62 65 6c  ** to that label
7ca0: 20 69 66 20 70 49 64 78 20 69 73 20 61 20 70 61   if pIdx is a pa
7cb0: 72 74 69 61 6c 20 69 6e 64 65 78 20 74 68 61 74  rtial index that
7cc0: 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
7cd0: 65 64 2e 0a 2a 2a 20 54 68 65 20 6c 61 62 65 6c  ed..** The label
7ce0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c   should be resol
7cf0: 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
7d00: 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
7d10: 61 62 65 6c 28 29 2e 0a 2a 2a 20 41 20 70 61 72  abel()..** A par
7d20: 74 69 61 6c 20 69 6e 64 65 78 20 73 68 6f 75 6c  tial index shoul
7d30: 64 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20  d be skipped if 
7d40: 69 74 73 20 57 48 45 52 45 20 63 6c 61 75 73 65  its WHERE clause
7d50: 20 65 76 61 6c 75 61 74 65 73 0a 2a 2a 20 74 6f   evaluates.** to
7d60: 20 66 61 6c 73 65 20 6f 72 20 6e 75 6c 6c 2e 20   false or null. 
7d70: 20 49 66 20 70 49 64 78 20 69 73 20 6e 6f 74 20   If pIdx is not 
7d80: 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2c  a partial index,
7d90: 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c   *piPartIdxLabel
7da0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20  .** will be set 
7db0: 74 6f 20 7a 65 72 6f 20 77 68 69 63 68 20 69 73  to zero which is
7dc0: 20 61 6e 20 65 6d 70 74 79 20 6c 61 62 65 6c 20   an empty label 
7dd0: 74 68 61 74 20 69 73 20 69 67 6e 6f 72 65 64 20  that is ignored 
7de0: 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 52 65 73  by.** sqlite3Res
7df0: 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
7e00: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  ()..**.** The pP
7e10: 72 69 6f 72 20 61 6e 64 20 72 65 67 50 72 69 6f  rior and regPrio
7e20: 72 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  r parameters are
7e30: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
7e40: 6e 74 20 61 20 63 61 63 68 65 20 74 6f 0a 2a 2a  nt a cache to.**
7e50: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
7e60: 72 79 20 72 65 67 69 73 74 65 72 20 6c 6f 61 64  ry register load
7e70: 73 2e 20 20 49 66 20 70 50 72 69 6f 72 20 69 73  s.  If pPrior is
7e80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
7e90: 69 74 20 69 73 0a 2a 2a 20 61 20 70 6f 69 6e 74  it is.** a point
7ea0: 65 72 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  er to a differen
7eb0: 74 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63  t index for whic
7ec0: 68 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 68  h an index key h
7ed0: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
7ee0: 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65  computed into re
7ef0: 67 69 73 74 65 72 20 72 65 67 50 72 69 6f 72 2e  gister regPrior.
7f00: 20 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74    If the current
7f10: 20 70 49 64 78 20 69 6e 64 65 78 20 69 73 20 67   pIdx index is g
7f20: 65 6e 65 72 61 74 69 6e 67 0a 2a 2a 20 69 74 73  enerating.** its
7f30: 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 73 61   key into the sa
7f40: 6d 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72  me sequence of r
7f50: 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 66 20  egisters and if 
7f60: 70 50 72 69 6f 72 20 61 6e 64 20 70 49 64 78 20  pPrior and pIdx 
7f70: 73 68 61 72 65 0a 2a 2a 20 61 20 63 6f 6c 75 6d  share.** a colum
7f80: 6e 20 69 6e 20 63 6f 6d 6d 6f 6e 2c 20 74 68 65  n in common, the
7f90: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 63  n the register c
7fa0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
7fb0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6c 72 65  that column alre
7fc0: 61 64 79 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65  ady.** holds the
7fd0: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 61   correct value a
7fe0: 6e 64 20 74 68 65 20 6c 6f 61 64 69 6e 67 20 6f  nd the loading o
7ff0: 66 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  f that register 
8000: 69 73 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 20 54  is skipped..** T
8010: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
8020: 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 65 6e   is helpful when
8030: 20 64 6f 69 6e 67 20 61 20 44 45 4c 45 54 45 20   doing a DELETE 
8040: 6f 72 20 61 6e 20 49 4e 54 45 47 52 49 54 59 5f  or an INTEGRITY_
8050: 43 48 45 43 4b 20 0a 2a 2a 20 6f 6e 20 61 20 74  CHECK .** on a t
8060: 61 62 6c 65 20 77 69 74 68 20 6d 75 6c 74 69 70  able with multip
8070: 6c 65 20 69 6e 64 69 63 65 73 2c 20 61 6e 64 20  le indices, and 
8080: 65 73 70 65 63 69 61 6c 6c 79 20 77 69 74 68 20  especially with 
8090: 74 68 65 20 52 4f 57 49 44 20 6f 72 0a 2a 2a 20  the ROWID or.** 
80a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
80b0: 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
80c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
80d0: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
80e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
80f0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8100: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8110: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
8120: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
8130: 65 78 20 66 6f 72 20 77 68 69 63 68 20 74 6f 20  ex for which to 
8140: 67 65 6e 65 72 61 74 65 20 61 20 6b 65 79 20 2a  generate a key *
8150: 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
8160: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ,        /* Curs
8170: 6f 72 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 77  or number from w
8180: 68 69 63 68 20 74 6f 20 74 61 6b 65 20 63 6f 6c  hich to take col
8190: 75 6d 6e 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  umn data */.  in
81a0: 74 20 72 65 67 4f 75 74 2c 20 20 20 20 20 20 20  t regOut,       
81b0: 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 65     /* Put the ne
81c0: 77 20 6b 65 79 20 69 6e 74 6f 20 74 68 69 73 20  w key into this 
81d0: 72 65 67 69 73 74 65 72 20 69 66 20 6e 6f 74 20  register if not 
81e0: 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 66 69  0 */.  int prefi
81f0: 78 4f 6e 6c 79 2c 20 20 20 20 20 20 2f 2a 20 43  xOnly,      /* C
8200: 6f 6d 70 75 74 65 20 6f 6e 6c 79 20 61 20 75 6e  ompute only a un
8210: 69 71 75 65 20 70 72 65 66 69 78 20 6f 66 20 74  ique prefix of t
8220: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  he key */.  int 
8230: 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  *piPartIdxLabel,
8240: 20 2f 2a 20 4f 55 54 3a 20 4a 75 6d 70 20 74 6f   /* OUT: Jump to
8250: 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
8260: 6b 69 70 20 70 61 72 74 69 61 6c 20 69 6e 64 65  kip partial inde
8270: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  x */.  Index *pP
8280: 72 69 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 50  rior,       /* P
8290: 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61  reviously genera
82a0: 74 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ted index key */
82b0: 0a 20 20 69 6e 74 20 72 65 67 50 72 69 6f 72 20  .  int regPrior 
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
82d0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 70 72 65 76  ter holding prev
82e0: 69 6f 75 73 20 67 65 6e 65 72 61 74 65 64 20 6b  ious generated k
82f0: 65 79 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ey */.){.  Vdbe 
8300: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8310: 62 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  be;.  int j;.  i
8320: 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 69 6e  nt regBase;.  in
8330: 74 20 6e 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70  t nCol;..  if( p
8340: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 20 29 7b  iPartIdxLabel ){
8350: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70  .    if( pIdx->p
8360: 50 61 72 74 49 64 78 57 68 65 72 65 20 29 7b 0a  PartIdxWhere ){.
8370: 20 20 20 20 20 20 2a 70 69 50 61 72 74 49 64 78        *piPartIdx
8380: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
8390: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
83a0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69  .      pParse->i
83b0: 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61 43  SelfTab = iDataC
83c0: 75 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ur;.      sqlite
83d0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
83e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
83f0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
8400: 44 75 70 28 70 50 61 72 73 65 2c 20 70 49 64 78  Dup(pParse, pIdx
8410: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
8420: 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c   *piPartIdxLabel
8430: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
8450: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
8460: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8470: 20 20 20 20 2a 70 69 50 61 72 74 49 64 78 4c 61      *piPartIdxLa
8480: 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  bel = 0;.    }. 
8490: 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 28 70 72 65   }.  nCol = (pre
84a0: 66 69 78 4f 6e 6c 79 20 26 26 20 70 49 64 78 2d  fixOnly && pIdx-
84b0: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 29 20 3f 20  >uniqNotNull) ? 
84c0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20  pIdx->nKeyCol : 
84d0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
84e0: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
84f0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
8500: 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
8510: 69 66 28 20 70 50 72 69 6f 72 20 26 26 20 28 72  if( pPrior && (r
8520: 65 67 42 61 73 65 21 3d 72 65 67 50 72 69 6f 72  egBase!=regPrior
8530: 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 50 61 72   || pPrior->pPar
8540: 74 49 64 78 57 68 65 72 65 29 20 29 20 70 50 72  tIdxWhere) ) pPr
8550: 69 6f 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  ior = 0;.  for(j
8560: 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29  =0; j<nCol; j++)
8570: 7b 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f 72  {.    if( pPrior
8580: 0a 20 20 20 20 20 26 26 20 70 50 72 69 6f 72 2d  .     && pPrior-
8590: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 49  >aiColumn[j]==pI
85a0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 0a  dx->aiColumn[j].
85b0: 20 20 20 20 20 26 26 20 70 50 72 69 6f 72 2d 3e       && pPrior->
85c0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 58 4e 5f  aiColumn[j]!=XN_
85d0: 45 58 50 52 0a 20 20 20 20 29 7b 0a 20 20 20 20  EXPR.    ){.    
85e0: 20 20 2f 2a 20 54 68 69 73 20 63 6f 6c 75 6d 6e    /* This column
85f0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 63 6f 6d   was already com
8600: 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
8610: 76 69 6f 75 73 20 69 6e 64 65 78 20 2a 2f 0a 20  vious index */. 
8620: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8630: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8640: 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
8650: 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  xColumn(pParse, 
8660: 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20  pIdx, iDataCur, 
8670: 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
8680: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
8690: 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 69 73 20  umn affinity is 
86a0: 52 45 41 4c 20 62 75 74 20 74 68 65 20 6e 75 6d  REAL but the num
86b0: 62 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ber is an intege
86c0: 72 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  r, then it.    *
86d0: 2a 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  * might be store
86e0: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  d in the table a
86f0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 28 75 73  s an integer (us
8700: 69 6e 67 20 61 20 63 6f 6d 70 61 63 74 0a 20 20  ing a compact.  
8710: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
8720: 69 6f 6e 29 20 74 68 65 6e 20 63 6f 6e 76 65 72  ion) then conver
8730: 74 65 64 20 74 6f 20 52 45 41 4c 20 62 79 20 61  ted to REAL by a
8740: 6e 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  n OP_RealAffinit
8750: 79 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  y opcode..    **
8760: 20 42 75 74 20 77 65 20 61 72 65 20 67 65 74 74   But we are gett
8770: 69 6e 67 20 72 65 61 64 79 20 74 6f 20 73 74 6f  ing ready to sto
8780: 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 62 61  re this value ba
8790: 63 6b 20 69 6e 74 6f 20 61 6e 20 69 6e 64 65 78  ck into an index
87a0: 2c 20 77 68 65 72 65 0a 20 20 20 20 2a 2a 20 69  , where.    ** i
87b0: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 76  t should be conv
87c0: 65 72 74 65 64 20 62 79 20 74 6f 20 49 4e 54 45  erted by to INTE
87d0: 47 45 52 20 61 67 61 69 6e 2e 20 20 53 6f 20 6f  GER again.  So o
87e0: 6d 69 74 20 74 68 65 20 4f 50 5f 52 65 61 6c 41  mit the OP_RealA
87f0: 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 6f  ffinity.    ** o
8800: 70 63 6f 64 65 20 69 66 20 69 74 20 69 73 20 70  pcode if it is p
8810: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  resent */.    sq
8820: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
8830: 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20 4f 50  riorOpcode(v, OP
8840: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 29 3b 0a  _RealAffinity);.
8850: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 4f 75 74    }.  if( regOut
8860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8870: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8880: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
8890: 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 4f 75  ase, nCol, regOu
88a0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
88b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
88c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
88d0: 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 72 65 74 75  e, nCol);.  retu
88e0: 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f  rn regBase;.}../
88f0: 2a 0a 2a 2a 20 49 66 20 61 20 70 72 69 6f 72 20  *.** If a prior 
8900: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47  call to sqlite3G
8910: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
8920: 29 20 67 65 6e 65 72 61 74 65 64 20 61 20 6a 75  ) generated a ju
8930: 6d 70 2d 6f 76 65 72 20 6c 61 62 65 6c 0a 2a 2a  mp-over label.**
8940: 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
8950: 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2c  a partial index,
8960: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
8970: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
8980: 6c 65 64 20 74 6f 0a 2a 2a 20 72 65 73 6f 6c 76  led to.** resolv
8990: 65 20 74 68 61 74 20 6c 61 62 65 6c 2e 0a 2a 2f  e that label..*/
89a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
89b0: 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
89c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
89d0: 69 6e 74 20 69 4c 61 62 65 6c 29 7b 0a 20 20 69  int iLabel){.  i
89e0: 66 28 20 69 4c 61 62 65 6c 20 29 7b 0a 20 20 20  f( iLabel ){.   
89f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
8a00: 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d  lveLabel(pParse-
8a10: 3e 70 56 64 62 65 2c 20 69 4c 61 62 65 6c 29 3b  >pVdbe, iLabel);
8a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8a30: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
8a40: 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.