/ Hex Artifact Content
Login

Artifact 6792c80d7fb54c4df9f7680413952600e7439492:


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 30 2c 20 30 2c 20 30 29 3b   0, 0, 0, 0, 0);
0ea0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
0eb0: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
0ec0: 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 69 43  SRT_EphemTab, iC
0ed0: 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ur);.  sqlite3Se
0ee0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
0ef0: 6c 2c 20 26 64 65 73 74 29 3b 0a 20 20 73 71 6c  l, &dest);.  sql
0f00: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
0f10: 28 64 62 2c 20 70 53 65 6c 29 3b 0a 7d 0a 23 65  (db, pSel);.}.#e
0f20: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
0f30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
0f40: 57 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  W) && !defined(S
0f50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0f60: 45 52 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  ER) */..#if defi
0f70: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0f80: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
0f90: 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e  LIMIT) && !defin
0fa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
0fb0: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 47  UBQUERY)./*.** G
0fc0: 65 6e 65 72 61 74 65 20 61 6e 20 65 78 70 72 65  enerate an expre
0fd0: 73 73 69 6f 6e 20 74 72 65 65 20 74 6f 20 69 6d  ssion tree to im
0fe0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 57 48 45 52  plement the WHER
0ff0: 45 2c 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  E, ORDER BY,.** 
1000: 61 6e 64 20 4c 49 4d 49 54 2f 4f 46 46 53 45 54  and LIMIT/OFFSET
1010: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 44 45 4c 45   portion of DELE
1020: 54 45 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  TE and UPDATE st
1030: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
1040: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1050: 74 61 62 6c 65 5f 77 78 79 7a 20 57 48 45 52 45  table_wxyz WHERE
1060: 20 61 3c 35 20 4f 52 44 45 52 20 42 59 20 61 20   a<5 ORDER BY a 
1070: 4c 49 4d 49 54 20 31 3b 0a 2a 2a 20 20 20 20 20  LIMIT 1;.**     
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
10a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10b0: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 20 20 20 20 70 4c 69 6d 69 74 57 68 65 72 65       pLimitWhere
10e0: 20 28 70 49 6e 43 6c 61 75 73 65 29 0a 2a 2f 0a   (pInClause).*/.
10f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 4c 69 6d  Expr *sqlite3Lim
1100: 69 74 57 68 65 72 65 28 0a 20 20 50 61 72 73 65  itWhere(.  Parse
1110: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1120: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1130: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1140: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1160: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
1170: 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c  se -- which tabl
1180: 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  es to scan */.  
1190: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11c0: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
11d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
11e0: 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
11f0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
1200: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1210: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 20   null */.  Expr 
1220: 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20  *pLimit,        
1230: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
1240: 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 20 4d 61  IMIT clause.  Ma
1250: 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45  y be null */.  E
1260: 78 70 72 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  xpr *pOffset,   
1270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1280: 68 65 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  he OFFSET clause
1290: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
12a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 54  /.  char *zStmtT
12b0: 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ype             
12c0: 20 2f 2a 20 45 69 74 68 65 72 20 44 45 4c 45 54   /* Either DELET
12d0: 45 20 6f 72 20 55 50 44 41 54 45 2e 20 20 46 6f  E or UPDATE.  Fo
12e0: 72 20 65 72 72 20 6d 73 67 73 2e 20 2a 2f 0a 29  r err msgs. */.)
12f0: 7b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  {.  Expr *pWhere
1300: 52 6f 77 69 64 20 3d 20 4e 55 4c 4c 3b 20 20 20  Rowid = NULL;   
1310: 20 2f 2a 20 57 48 45 52 45 20 72 6f 77 69 64 20   /* WHERE rowid 
1320: 2e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 49  .. */.  Expr *pI
1330: 6e 43 6c 61 75 73 65 20 3d 20 4e 55 4c 4c 3b 20  nClause = NULL; 
1340: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 72 6f       /* WHERE ro
1350: 77 69 64 20 49 4e 20 28 20 73 65 6c 65 63 74 20  wid IN ( select 
1360: 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 65  ) */.  Expr *pSe
1370: 6c 65 63 74 52 6f 77 69 64 20 3d 20 4e 55 4c 4c  lectRowid = NULL
1380: 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 72 6f  ;   /* SELECT ro
1390: 77 69 64 20 2e 2e 2e 20 2a 2f 0a 20 20 45 78 70  wid ... */.  Exp
13a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
13b0: 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 45 78 70  NULL;     /* Exp
13c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
13d0: 74 61 6e 69 6e 67 20 6f 6e 6c 79 20 70 53 65 6c  taning only pSel
13e0: 65 63 74 52 6f 77 69 64 20 2a 2f 0a 20 20 53 72  ectRowid */.  Sr
13f0: 63 4c 69 73 74 20 2a 70 53 65 6c 65 63 74 53 72  cList *pSelectSr
1400: 63 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20 53 45  c = NULL;  /* SE
1410: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
1420: 78 20 2e 2e 2e 20 28 64 75 70 20 6f 66 20 70 53  x ... (dup of pS
1430: 72 63 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  rc) */.  Select 
1440: 2a 70 53 65 6c 65 63 74 20 3d 20 4e 55 4c 4c 3b  *pSelect = NULL;
1450: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
1460: 65 20 53 45 4c 45 43 54 20 74 72 65 65 20 2a 2f  e SELECT tree */
1470: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1480: 74 20 74 68 65 72 65 20 69 73 6e 27 74 20 61 6e  t there isn't an
1490: 20 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f 75   ORDER BY withou
14a0: 74 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  t a LIMIT clause
14b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
14c0: 64 65 72 42 79 20 26 26 20 28 70 4c 69 6d 69 74  derBy && (pLimit
14d0: 20 3d 3d 20 30 29 20 29 20 7b 0a 20 20 20 20 73   == 0) ) {.    s
14e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14f0: 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59  Parse, "ORDER BY
1500: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 20 6f   without LIMIT o
1510: 6e 20 25 73 22 2c 20 7a 53 74 6d 74 54 79 70 65  n %s", zStmtType
1520: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 69 6d 69  );.    goto limi
1530: 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e 75 70 5f  t_where_cleanup_
1540: 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  2;.  }..  /* We 
1550: 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 67 65 6e  only need to gen
1560: 65 72 61 74 65 20 61 20 73 65 6c 65 63 74 20 65  erate a select e
1570: 78 70 72 65 73 73 69 6f 6e 20 69 66 20 74 68 65  xpression if the
1580: 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 6c 69 6d  re.  ** is a lim
1590: 69 74 2f 6f 66 66 73 65 74 20 74 65 72 6d 20 74  it/offset term t
15a0: 6f 20 65 6e 66 6f 72 63 65 2e 0a 20 20 2a 2f 0a  o enforce..  */.
15b0: 20 20 69 66 28 20 70 4c 69 6d 69 74 20 3d 3d 20    if( pLimit == 
15c0: 30 20 29 20 7b 0a 20 20 20 20 2f 2a 20 69 66 20  0 ) {.    /* if 
15d0: 70 4c 69 6d 69 74 20 69 73 20 6e 75 6c 6c 2c 20  pLimit is null, 
15e0: 70 4f 66 66 73 65 74 20 77 69 6c 6c 20 61 6c 77  pOffset will alw
15f0: 61 79 73 20 62 65 20 6e 75 6c 6c 20 61 73 20 77  ays be null as w
1600: 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ell. */.    asse
1610: 72 74 28 20 70 4f 66 66 73 65 74 20 3d 3d 20 30  rt( pOffset == 0
1620: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
1630: 57 68 65 72 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Where;.  }..  /*
1640: 20 47 65 6e 65 72 61 74 65 20 61 20 73 65 6c 65   Generate a sele
1650: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ct expression tr
1660: 65 65 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ee to enforce th
1670: 65 20 6c 69 6d 69 74 2f 6f 66 66 73 65 74 20 0a  e limit/offset .
1680: 20 20 2a 2a 20 74 65 72 6d 20 66 6f 72 20 74 68    ** term for th
1690: 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
16a0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 46  TE statement.  F
16b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
16c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
16d0: 61 62 6c 65 5f 61 20 57 48 45 52 45 20 63 6f 6c  able_a WHERE col
16e0: 31 3d 31 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  1=1 ORDER BY col
16f0: 32 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45 54  2 LIMIT 1 OFFSET
1700: 20 31 0a 20 20 2a 2a 20 62 65 63 6f 6d 65 73 3a   1.  ** becomes:
1710: 0a 20 20 2a 2a 20 20 20 44 45 4c 45 54 45 20 46  .  **   DELETE F
1720: 52 4f 4d 20 74 61 62 6c 65 5f 61 20 57 48 45 52  ROM table_a WHER
1730: 45 20 72 6f 77 69 64 20 49 4e 20 28 20 0a 20 20  E rowid IN ( .  
1740: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f  **     SELECT ro
1750: 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 5f 61  wid FROM table_a
1760: 20 57 48 45 52 45 20 63 6f 6c 31 3d 31 20 4f 52   WHERE col1=1 OR
1770: 44 45 52 20 42 59 20 63 6f 6c 32 20 4c 49 4d 49  DER BY col2 LIMI
1780: 54 20 31 20 4f 46 46 53 45 54 20 31 0a 20 20 2a  T 1 OFFSET 1.  *
1790: 2a 20 20 20 29 3b 0a 20 20 2a 2f 0a 0a 20 20 70  *   );.  */..  p
17a0: 53 65 6c 65 63 74 52 6f 77 69 64 20 3d 20 73 71  SelectRowid = sq
17b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
17c0: 65 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 2c  e, TK_ROW, 0, 0,
17d0: 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65   0);.  if( pSele
17e0: 63 74 52 6f 77 69 64 20 3d 3d 20 30 20 29 20 67  ctRowid == 0 ) g
17f0: 6f 74 6f 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f  oto limit_where_
1800: 63 6c 65 61 6e 75 70 5f 32 3b 0a 20 20 70 45 4c  cleanup_2;.  pEL
1810: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
1820: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1830: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 52 6f  se, 0, pSelectRo
1840: 77 69 64 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  wid);.  if( pELi
1850: 73 74 20 3d 3d 20 30 20 29 20 67 6f 74 6f 20 6c  st == 0 ) goto l
1860: 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e  imit_where_clean
1870: 75 70 5f 32 3b 0a 0a 20 20 2f 2a 20 64 75 70 6c  up_2;..  /* dupl
1880: 69 63 61 74 65 20 74 68 65 20 46 52 4f 4d 20 63  icate the FROM c
1890: 6c 61 75 73 65 20 61 73 20 69 74 20 69 73 20 6e  lause as it is n
18a0: 65 65 64 65 64 20 62 79 20 62 6f 74 68 20 74 68  eeded by both th
18b0: 65 20 44 45 4c 45 54 45 2f 55 50 44 41 54 45 20  e DELETE/UPDATE 
18c0: 74 72 65 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  tree.  ** and th
18d0: 65 20 53 45 4c 45 43 54 20 73 75 62 74 72 65 65  e SELECT subtree
18e0: 2e 20 2a 2f 0a 20 20 70 53 65 6c 65 63 74 53 72  . */.  pSelectSr
18f0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1900: 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1910: 2c 20 70 53 72 63 2c 20 30 29 3b 0a 20 20 69 66  , pSrc, 0);.  if
1920: 28 20 70 53 65 6c 65 63 74 53 72 63 20 3d 3d 20  ( pSelectSrc == 
1930: 30 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  0 ) {.    sqlite
1940: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1950: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 4c 69  pParse->db, pELi
1960: 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 69  st);.    goto li
1970: 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65 61 6e 75  mit_where_cleanu
1980: 70 5f 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  p_2;.  }..  /* g
1990: 65 6e 65 72 61 74 65 20 74 68 65 20 53 45 4c 45  enerate the SELE
19a0: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  CT expression tr
19b0: 65 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65 63 74  ee. */.  pSelect
19c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
19d0: 4e 65 77 28 70 50 61 72 73 65 2c 70 45 4c 69 73  New(pParse,pELis
19e0: 74 2c 70 53 65 6c 65 63 74 53 72 63 2c 70 57 68  t,pSelectSrc,pWh
19f0: 65 72 65 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20  ere,0,0,.       
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 30        pOrderBy,0
1a20: 2c 70 4c 69 6d 69 74 2c 70 4f 66 66 73 65 74 29  ,pLimit,pOffset)
1a30: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  ;.  if( pSelect 
1a40: 3d 3d 20 30 20 29 20 72 65 74 75 72 6e 20 30 3b  == 0 ) return 0;
1a50: 0a 0a 20 20 2f 2a 20 6e 6f 77 20 67 65 6e 65 72  ..  /* now gener
1a60: 61 74 65 20 74 68 65 20 6e 65 77 20 57 48 45 52  ate the new WHER
1a70: 45 20 72 6f 77 69 64 20 49 4e 20 63 6c 61 75 73  E rowid IN claus
1a80: 65 20 66 6f 72 20 74 68 65 20 44 45 4c 45 54 45  e for the DELETE
1a90: 2f 55 44 50 41 54 45 20 2a 2f 0a 20 20 70 57 68  /UDPATE */.  pWh
1aa0: 65 72 65 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  ereRowid = sqlit
1ab0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1ac0: 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 2c 20 30 29  TK_ROW, 0, 0, 0)
1ad0: 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 52 6f  ;.  if( pWhereRo
1ae0: 77 69 64 20 3d 3d 20 30 20 29 20 67 6f 74 6f 20  wid == 0 ) goto 
1af0: 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65 61  limit_where_clea
1b00: 6e 75 70 5f 31 3b 0a 20 20 70 49 6e 43 6c 61 75  nup_1;.  pInClau
1b10: 73 65 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  se = sqlite3PExp
1b20: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
1b30: 20 70 57 68 65 72 65 52 6f 77 69 64 2c 20 30 2c   pWhereRowid, 0,
1b40: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 43 6c   0);.  if( pInCl
1b50: 61 75 73 65 20 3d 3d 20 30 20 29 20 67 6f 74 6f  ause == 0 ) goto
1b60: 20 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c 65   limit_where_cle
1b70: 61 6e 75 70 5f 31 3b 0a 0a 20 20 70 49 6e 43 6c  anup_1;..  pInCl
1b80: 61 75 73 65 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ause->x.pSelect 
1b90: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 70 49 6e  = pSelect;.  pIn
1ba0: 43 6c 61 75 73 65 2d 3e 66 6c 61 67 73 20 7c 3d  Clause->flags |=
1bb0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 3b 0a 20   EP_xIsSelect;. 
1bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
1bd0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
1be0: 61 72 73 65 2c 20 70 49 6e 43 6c 61 75 73 65 29  arse, pInClause)
1bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 43 6c  ;.  return pInCl
1c00: 61 75 73 65 3b 0a 0a 20 20 2f 2a 20 73 6f 6d 65  ause;..  /* some
1c10: 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67  thing went wrong
1c20: 2e 20 63 6c 65 61 6e 20 75 70 20 61 6e 79 74 68  . clean up anyth
1c30: 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ing allocated. *
1c40: 2f 0a 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c  /.limit_where_cl
1c50: 65 61 6e 75 70 5f 31 3a 0a 20 20 73 71 6c 69 74  eanup_1:.  sqlit
1c60: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
1c70: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
1c80: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ct);.  return 0;
1c90: 0a 0a 6c 69 6d 69 74 5f 77 68 65 72 65 5f 63 6c  ..limit_where_cl
1ca0: 65 61 6e 75 70 5f 32 3a 0a 20 20 73 71 6c 69 74  eanup_2:.  sqlit
1cb0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
1cc0: 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 29  rse->db, pWhere)
1cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1ce0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
1cf0: 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b  ->db, pOrderBy);
1d00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1d10: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
1d20: 20 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69   pLimit);.  sqli
1d30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
1d40: 61 72 73 65 2d 3e 64 62 2c 20 70 4f 66 66 73 65  arse->db, pOffse
1d50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
1d60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1d70: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d80: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
1d90: 4c 49 4d 49 54 29 20 2a 2f 0a 20 20 20 20 20 20  LIMIT) */.      
1da0: 20 2f 2a 20 20 20 20 20 20 26 26 20 21 64 65 66   /*      && !def
1db0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1dc0: 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f  _SUBQUERY) */../
1dd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1de0: 64 65 20 66 6f 72 20 61 20 44 45 4c 45 54 45 20  de for a DELETE 
1df0: 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a  FROM statement..
1e00: 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  **.**     DELETE
1e10: 20 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a   FROM table_wxyz
1e20: 20 57 48 45 52 45 20 61 3c 35 20 41 4e 44 20 62   WHERE a<5 AND b
1e30: 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20   NOT NULL;.**   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
1e50: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c  _______/       \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1e70: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
1e80: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 20 20        pTabList  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65              pWhe
1ea0: 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  re.*/.void sqlit
1eb0: 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20  e3DeleteFrom(.  
1ec0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ed0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1ee0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1ef0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1f00: 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
1f10: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
1f20: 20 77 65 20 73 68 6f 75 6c 64 20 64 65 6c 65 74   we should delet
1f30: 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78  e things */.  Ex
1f40: 70 72 20 2a 70 57 68 65 72 65 20 20 20 20 20 20  pr *pWhere      
1f50: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1f60: 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1f70: 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 56  e null */.){.  V
1f80: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1fa0: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
1fb0: 67 69 6e 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  gine */.  Table 
1fc0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1fd0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
1fe0: 6f 6d 20 77 68 69 63 68 20 72 65 63 6f 72 64 73  om which records
1ff0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2000: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2010: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *zDb;       /* 
2020: 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65  Name of database
2030: 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f   holding pTab */
2040: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2060: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
2070: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2080: 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ;     /* Informa
2090: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
20a0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
20b0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
20d0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69  ooping over indi
20e0: 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
20f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
2100: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2110: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2120: 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
2130: 20 69 6e 74 20 69 44 61 74 61 43 75 72 20 3d 20   int iDataCur = 
2140: 30 3b 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20  0;      /* VDBE 
2150: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 63  cursor for the c
2160: 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 73 6f  anonical data so
2170: 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  urce */.  int iI
2180: 64 78 43 75 72 20 3d 20 30 3b 20 20 20 20 20 20  dxCur = 0;      
2190: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
21a0: 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69  r of the first i
21b0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  ndex */.  int nI
21c0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
21d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
21e0: 64 69 63 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  dices */.  sqlit
21f0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2200: 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61    /* Main databa
2210: 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  se structure */.
2220: 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43    AuthContext sC
2230: 6f 6e 74 65 78 74 3b 20 20 2f 2a 20 41 75 74 68  ontext;  /* Auth
2240: 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e 74 65 78  orization contex
2250: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
2260: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 2f 2a  xt sNC;       /*
2270: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 74 6f   Name context to
2280: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
2290: 69 6f 6e 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ions in */.  int
22a0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
22b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
22d0: 6d 65 6d 43 6e 74 20 3d 20 2d 31 3b 20 20 20 20  memCnt = -1;    
22e0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
22f0: 6c 20 75 73 65 64 20 66 6f 72 20 63 68 61 6e 67  l used for chang
2300: 65 20 63 6f 75 6e 74 69 6e 67 20 2a 2f 0a 20 20  e counting */.  
2310: 69 6e 74 20 72 63 61 75 74 68 3b 20 20 20 20 20  int rcauth;     
2320: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2330: 72 65 74 75 72 6e 65 64 20 62 79 20 61 75 74 68  returned by auth
2340: 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
2350: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 4f 6e  ck */.  int okOn
2360: 65 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 2f  ePass;         /
2370: 2a 20 54 72 75 65 20 66 6f 72 20 6f 6e 65 2d 70  * True for one-p
2380: 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 77 69  ass algorithm wi
2390: 74 68 6f 75 74 20 74 68 65 20 46 49 46 4f 20 2a  thout the FIFO *
23a0: 2f 0a 20 20 69 6e 74 20 61 69 43 75 72 4f 6e 65  /.  int aiCurOne
23b0: 50 61 73 73 5b 32 5d 3b 20 20 20 2f 2a 20 54 68  Pass[2];   /* Th
23c0: 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  e write cursors 
23d0: 6f 70 65 6e 65 64 20 62 79 20 57 48 45 52 45 5f  opened by WHERE_
23e0: 4f 4e 45 50 41 53 53 20 2a 2f 0a 20 20 75 38 20  ONEPASS */.  u8 
23f0: 2a 61 54 6f 4f 70 65 6e 20 3d 20 30 3b 20 20 20  *aToOpen = 0;   
2400: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 75 72 73      /* Open curs
2410: 6f 72 20 69 54 61 62 43 75 72 2b 6a 20 69 66 20  or iTabCur+j if 
2420: 61 54 6f 4f 70 65 6e 5b 6a 5d 20 69 73 20 74 72  aToOpen[j] is tr
2430: 75 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ue */.  Index *p
2440: 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Pk;            /
2450: 2a 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45  * The PRIMARY KE
2460: 59 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74  Y index on the t
2470: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  able */.  int iP
2480: 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2490: 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 6e 50 6b   /* First of nPk
24a0: 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
24b0: 6e 67 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76  ng PRIMARY KEY v
24c0: 61 6c 75 65 20 2a 2f 0a 20 20 69 31 36 20 6e 50  alue */.  i16 nP
24d0: 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
24e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
24f0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 50 52 49  lumns in the PRI
2500: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e  MARY KEY */.  in
2510: 74 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t iKey;         
2520: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
2530: 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20  ell holding key 
2540: 6f 66 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  of row to be del
2550: 65 74 65 64 20 2a 2f 0a 20 20 69 31 36 20 6e 4b  eted */.  i16 nK
2560: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
2570: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65   /* Number of me
2580: 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
2590: 65 20 72 6f 77 20 6b 65 79 20 2a 2f 0a 20 20 69  e row key */.  i
25a0: 6e 74 20 69 45 70 68 43 75 72 20 3d 20 30 3b 20  nt iEphCur = 0; 
25b0: 20 20 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72        /* Ephemer
25c0: 61 6c 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  al table holding
25d0: 20 61 6c 6c 20 70 72 69 6d 61 72 79 20 6b 65 79   all primary key
25e0: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
25f0: 20 69 52 6f 77 53 65 74 20 3d 20 30 3b 20 20 20   iRowSet = 0;   
2600: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
2610: 66 6f 72 20 72 6f 77 73 65 74 20 6f 66 20 72 6f  for rowset of ro
2620: 77 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ws to delete */.
2630: 20 20 69 6e 74 20 61 64 64 72 42 79 70 61 73 73    int addrBypass
2640: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 64 64 72   = 0;    /* Addr
2650: 65 73 73 20 6f 66 20 6a 75 6d 70 20 6f 76 65 72  ess of jump over
2660: 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f 67 69   the delete logi
2670: 63 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  c */.  int addrL
2680: 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  oop = 0;      /*
2690: 20 54 6f 70 20 6f 66 20 74 68 65 20 64 65 6c 65   Top of the dele
26a0: 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  te loop */.  int
26b0: 20 61 64 64 72 44 65 6c 65 74 65 20 3d 20 30 3b   addrDelete = 0;
26c0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 69 72 65      /* Jump dire
26d0: 63 74 6c 79 20 74 6f 20 74 68 65 20 64 65 6c 65  ctly to the dele
26e0: 74 65 20 6c 6f 67 69 63 20 2a 2f 0a 20 20 69 6e  te logic */.  in
26f0: 74 20 61 64 64 72 45 70 68 4f 70 65 6e 20 3d 20  t addrEphOpen = 
2700: 30 3b 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74  0;   /* Instruct
2710: 69 6f 6e 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ion to open the 
2720: 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2730: 2a 2f 0a 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  */. .#ifndef SQL
2740: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
2750: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20  .  int isView;  
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d  /* True if attem
2780: 70 74 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  pting to delete 
2790: 66 72 6f 6d 20 61 20 76 69 65 77 20 2a 2f 0a 20  from a view */. 
27a0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
27b0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
27c0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 20 74   List of table t
27d0: 72 69 67 67 65 72 73 2c 20 69 66 20 72 65 71 75  riggers, if requ
27e0: 69 72 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ired */.#endif..
27f0: 20 20 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65    memset(&sConte
2800: 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43  xt, 0, sizeof(sC
2810: 6f 6e 74 65 78 74 29 29 3b 0a 20 20 64 62 20 3d  ontext));.  db =
2820: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
2830: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2840: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2850: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2860: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
2870: 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  nup;.  }.  asser
2880: 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  t( pTabList->nSr
2890: 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  c==1 );..  /* Lo
28a0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 77  cate the table w
28b0: 68 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20  hich we want to 
28c0: 64 65 6c 65 74 65 2e 20 20 54 68 69 73 20 74 61  delete.  This ta
28d0: 62 6c 65 20 68 61 73 20 74 6f 20 62 65 0a 20 20  ble has to be.  
28e0: 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20 53 72 63  ** put in an Src
28f0: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 62  List structure b
2900: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20 74  ecause some of t
2910: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  he subroutines w
2920: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63  e.  ** will be c
2930: 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73 69 67  alling are desig
2940: 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69 74 68  ned to work with
2950: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
2960: 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20 2a 2a   and expect.  **
2970: 20 61 6e 20 53 72 63 4c 69 73 74 2a 20 70 61 72   an SrcList* par
2980: 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20 6f  ameter instead o
2990: 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a 20  f just a Table* 
29a0: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2f 0a  parameter..  */.
29b0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
29c0: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
29d0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
29e0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
29f0: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
2a00: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f  om_cleanup;..  /
2a10: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
2a20: 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67  we have any trig
2a30: 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  gers and if the 
2a40: 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a  table being.  **
2a50: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 73   deleted from is
2a60: 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66   a view.  */.#if
2a70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a80: 5f 54 52 49 47 47 45 52 0a 20 20 70 54 72 69 67  _TRIGGER.  pTrig
2a90: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
2aa0: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
2ab0: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
2ac0: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 69 73 56  TE, 0, 0);.  isV
2ad0: 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c  iew = pTab->pSel
2ae0: 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20  ect!=0;.#else.# 
2af0: 64 65 66 69 6e 65 20 70 54 72 69 67 67 65 72 20  define pTrigger 
2b00: 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65  0.# define isVie
2b10: 77 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  w 0.#endif.#ifde
2b20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2b30: 45 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65  EW.# undef isVie
2b40: 77 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65  w.# define isVie
2b50: 77 20 30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  w 0.#endif..  /*
2b60: 20 49 66 20 70 54 61 62 20 69 73 20 72 65 61 6c   If pTab is real
2b70: 6c 79 20 61 20 76 69 65 77 2c 20 6d 61 6b 65 20  ly a view, make 
2b80: 73 75 72 65 20 69 74 20 68 61 73 20 62 65 65 6e  sure it has been
2b90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
2ba0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2bb0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
2bc0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
2bd0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c   ){.    goto del
2be0: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
2bf0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  ;.  }..  if( sql
2c00: 69 74 65 33 49 73 52 65 61 64 4f 6e 6c 79 28 70  ite3IsReadOnly(p
2c10: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 28 70 54  Parse, pTab, (pT
2c20: 72 69 67 67 65 72 3f 31 3a 30 29 29 20 29 7b 0a  rigger?1:0)) ){.
2c30: 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f      goto delete_
2c40: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
2c50: 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
2c60: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2c70: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2c80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
2c90: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 7a 44  <db->nDb );.  zD
2ca0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
2cb0: 2e 7a 4e 61 6d 65 3b 0a 20 20 72 63 61 75 74 68  .zName;.  rcauth
2cc0: 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68   = sqlite3AuthCh
2cd0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2ce0: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
2cf0: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 3b  >zName, 0, zDb);
2d00: 0a 20 20 61 73 73 65 72 74 28 20 72 63 61 75 74  .  assert( rcaut
2d10: 68 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  h==SQLITE_OK || 
2d20: 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  rcauth==SQLITE_D
2d30: 45 4e 59 20 7c 7c 20 72 63 61 75 74 68 3d 3d 53  ENY || rcauth==S
2d40: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 3b 0a  QLITE_IGNORE );.
2d50: 20 20 69 66 28 20 72 63 61 75 74 68 3d 3d 53 51    if( rcauth==SQ
2d60: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
2d70: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
2d80: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  m_cleanup;.  }. 
2d90: 20 61 73 73 65 72 74 28 21 69 73 56 69 65 77 20   assert(!isView 
2da0: 7c 7c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 20  || pTrigger);.. 
2db0: 20 2f 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f   /* Assign curso
2dc0: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 74 68 65  r numbers to the
2dd0: 20 74 61 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69   table and all i
2de0: 74 73 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2f  ts indices..  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
2e00: 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ist->nSrc==1 );.
2e10: 20 20 69 54 61 62 43 75 72 20 3d 20 70 54 61 62    iTabCur = pTab
2e20: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
2e30: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2e40: 62 2b 2b 3b 0a 20 20 66 6f 72 28 6e 49 64 78 3d  b++;.  for(nIdx=
2e50: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
2e60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
2e70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
2e80: 64 78 2b 2b 29 7b 0a 20 20 20 20 70 50 61 72 73  dx++){.    pPars
2e90: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a  e->nTab++;.  }..
2ea0: 20 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 76    /* Start the v
2eb0: 69 65 77 20 63 6f 6e 74 65 78 74 0a 20 20 2a 2f  iew context.  */
2ec0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b  .  if( isView ){
2ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
2ee0: 43 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72  ContextPush(pPar
2ef0: 73 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70  se, &sContext, p
2f00: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Tab->zName);.  }
2f10: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
2f20: 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
2f30: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
2f40: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2f50: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
2f60: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
2f70: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
2f80: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2f90: 65 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  ested==0 ) sqlit
2fa0: 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
2fb0: 65 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  es(v);.  sqlite3
2fc0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
2fd0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
2fe0: 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Db);..  /* If we
2ff0: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 64   are trying to d
3000: 65 6c 65 74 65 20 66 72 6f 6d 20 61 20 76 69 65  elete from a vie
3010: 77 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20  w, realize that 
3020: 76 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  view into.  ** a
3030: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
3040: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  e..  */.#if !def
3050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3060: 5f 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e  _VIEW) && !defin
3070: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
3080: 52 49 47 47 45 52 29 0a 20 20 69 66 28 20 69 73  RIGGER).  if( is
3090: 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  View ){.    sqli
30a0: 74 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69  te3MaterializeVi
30b0: 65 77 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ew(pParse, pTab,
30c0: 20 70 57 68 65 72 65 2c 20 69 54 61 62 43 75 72   pWhere, iTabCur
30d0: 29 3b 0a 20 20 20 20 69 44 61 74 61 43 75 72 20  );.    iDataCur 
30e0: 3d 20 69 49 64 78 43 75 72 20 3d 20 69 54 61 62  = iIdxCur = iTab
30f0: 43 75 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Cur;.  }.#endif.
3100: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
3110: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  e column names i
3120: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3130: 73 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  se..  */.  memse
3140: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
3150: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
3160: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
3170: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
3180: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 69 66 28   pTabList;.  if(
3190: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
31a0: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
31b0: 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 67 6f  Where) ){.    go
31c0: 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  to delete_from_c
31d0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
31e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
31f0: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
3200: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64  number of rows d
3210: 65 6c 65 74 65 64 2c 20 69 66 0a 20 20 2a 2a 20  eleted, if.  ** 
3220: 77 65 20 61 72 65 20 63 6f 75 6e 74 69 6e 67 20  we are counting 
3230: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
3240: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
3250: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
3260: 0a 20 20 20 20 6d 65 6d 43 6e 74 20 3d 20 2b 2b  .    memCnt = ++
3270: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
3280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3290: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
32a0: 72 2c 20 30 2c 20 6d 65 6d 43 6e 74 29 3b 0a 20  r, 0, memCnt);. 
32b0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
32c0: 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45  TE_OMIT_TRUNCATE
32d0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
32e0: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
32f0: 20 41 20 44 45 4c 45 54 45 20 77 69 74 68 6f 75   A DELETE withou
3300: 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
3310: 20 64 65 6c 65 74 65 73 20 65 76 65 72 79 74 68   deletes everyth
3320: 69 6e 67 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ing..  ** It is 
3330: 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 65  easier just to e
3340: 72 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74  rase the whole t
3350: 61 62 6c 65 2e 20 50 72 69 6f 72 20 74 6f 20 76  able. Prior to v
3360: 65 72 73 69 6f 6e 20 33 2e 36 2e 35 2c 0a 20 20  ersion 3.6.5,.  
3370: 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** this optimiza
3380: 74 69 6f 6e 20 63 61 75 73 65 64 20 74 68 65 20  tion caused the 
3390: 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
33a0: 20 28 74 68 65 20 76 61 6c 75 65 20 72 65 74 75   (the value retu
33b0: 72 6e 65 64 20 62 79 20 0a 20 20 2a 2a 20 41 50  rned by .  ** AP
33c0: 49 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  I function sqlit
33d0: 65 33 5f 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  e3_count_changes
33e0: 29 20 74 6f 20 62 65 20 73 65 74 20 69 6e 63 6f  ) to be set inco
33f0: 72 72 65 63 74 6c 79 2e 20 20 2a 2f 0a 20 20 69  rrectly.  */.  i
3400: 66 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54  f( rcauth==SQLIT
3410: 45 5f 4f 4b 20 26 26 20 70 57 68 65 72 65 3d 3d  E_OK && pWhere==
3420: 30 20 26 26 20 21 70 54 72 69 67 67 65 72 20 26  0 && !pTrigger &
3430: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
3440: 62 29 20 0a 20 20 20 26 26 20 30 3d 3d 73 71 6c  b) .   && 0==sql
3450: 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70  ite3FkRequired(p
3460: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
3470: 30 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  0).  ){.    asse
3480: 72 74 28 20 21 69 73 56 69 65 77 20 29 3b 0a 20  rt( !isView );. 
3490: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
34a0: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
34b0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
34c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
34d0: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
34e0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Tab) ){.      sq
34f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
3500: 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 70 54 61  v, OP_Clear, pTa
3510: 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 20 6d 65  b->tnum, iDb, me
3520: 6d 43 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  mCnt,.          
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
3540: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54  ab->zName, P4_ST
3550: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
3560: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
3570: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
3580: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
3590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
35a0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
35b0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
35c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
35e0: 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ar, pIdx->tnum, 
35f0: 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  iDb);.    }.  }e
3600: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
3610: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 55 4e 43 41  LITE_OMIT_TRUNCA
3620: 54 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  TE_OPTIMIZATION 
3630: 2a 2f 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 48  */.  {.    if( H
3640: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
3650: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  .      /* For a 
3660: 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 69 6e 69  rowid table, ini
3670: 74 69 61 6c 69 7a 65 20 74 68 65 20 52 6f 77 53  tialize the RowS
3680: 65 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  et to an empty s
3690: 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 50 6b 20  et */.      pPk 
36a0: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 50 6b 20 3d  = 0;.      nPk =
36b0: 20 31 3b 0a 20 20 20 20 20 20 69 52 6f 77 53 65   1;.      iRowSe
36c0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
36d0: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
36e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36f0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 6f 77 53  P_Null, 0, iRowS
3700: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
3710: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 57        /* For a W
3720: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
3730: 6c 65 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70  le, create an ep
3740: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
3750: 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 68  ed to.      ** h
3760: 6f 6c 64 20 61 6c 6c 20 70 72 69 6d 61 72 79 20  old all primary 
3770: 6b 65 79 73 20 66 6f 72 20 72 6f 77 73 20 74 6f  keys for rows to
3780: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a   be deleted. */.
3790: 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69        pPk = sqli
37a0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
37b0: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
37c0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
37d0: 3b 0a 20 20 20 20 20 20 6e 50 6b 20 3d 20 70 50  ;.      nPk = pP
37e0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
37f0: 20 20 69 50 6b 20 3d 20 70 50 61 72 73 65 2d 3e    iPk = pParse->
3800: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50  nMem+1;.      pP
3810: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
3820: 6b 3b 0a 20 20 20 20 20 20 69 45 70 68 43 75 72  k;.      iEphCur
3830: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
3840: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 45 70 68  +;.      addrEph
3850: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  Open = sqlite3Vd
3860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
3870: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 45  penEphemeral, iE
3880: 70 68 43 75 72 2c 20 6e 50 6b 29 3b 0a 20 20 20  phCur, nPk);.   
3890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
38a0: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
38b0: 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 7d 0a 20  e, pPk);.    }. 
38c0: 20 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75   .    /* Constru
38d0: 63 74 20 61 20 71 75 65 72 79 20 74 6f 20 66 69  ct a query to fi
38e0: 6e 64 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20  nd the rowid or 
38f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f 72 20  primary key for 
3900: 65 76 65 72 79 20 72 6f 77 0a 20 20 20 20 2a 2a  every row.    **
3910: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c 20   to be deleted, 
3920: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57 48 45  based on the WHE
3930: 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  RE clause..    *
3940: 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
3950: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
3960: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
3970: 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c  t, pWhere, 0, 0,
3980: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
39b0: 45 53 49 52 45 44 7c 57 48 45 52 45 5f 44 55 50  ESIRED|WHERE_DUP
39c0: 4c 49 43 41 54 45 53 5f 4f 4b 2c 0a 20 20 20 20  LICATES_OK,.    
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
39f0: 75 72 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  ur+1);.    if( p
3a00: 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
3a10: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
3a20: 6e 75 70 3b 0a 20 20 20 20 6f 6b 4f 6e 65 50 61  nup;.    okOnePa
3a30: 73 73 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ss = sqlite3Wher
3a40: 65 4f 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66  eOkOnePass(pWInf
3a50: 6f 2c 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29  o, aiCurOnePass)
3a60: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4b 65 65 70  ;.  .    /* Keep
3a70: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
3a80: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
3a90: 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
3aa0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
3ab0: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
3ac0: 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ws ){.      sqli
3ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3ae0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 6d 65 6d 43   OP_AddImm, memC
3af0: 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  nt, 1);.    }.  
3b00: 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
3b10: 74 68 65 20 72 6f 77 69 64 20 6f 72 20 70 72 69  the rowid or pri
3b20: 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 74 68 65  mary key for the
3b30: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
3b40: 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20      if( pPk ){. 
3b50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
3b60: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
3b70: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
3b80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 28 2d 31  aiColumn[i]>=(-1
3b90: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
3ba0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
3bb0: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
3bc0: 70 54 61 62 2c 20 69 54 61 62 43 75 72 2c 0a 20  pTab, iTabCur,. 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
3c00: 6c 75 6d 6e 5b 69 5d 2c 20 69 50 6b 2b 69 29 3b  lumn[i], iPk+i);
3c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3c20: 4b 65 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d  Key = iPk;.    }
3c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79  else{.      iKey
3c40: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
3c50: 2b 20 31 3b 0a 20 20 20 20 20 20 69 4b 65 79 20  + 1;.      iKey 
3c60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
3c70: 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
3c80: 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 54 61  e, pTab, -1, iTa
3c90: 62 43 75 72 2c 20 69 4b 65 79 2c 20 30 29 3b 0a  bCur, iKey, 0);.
3ca0: 20 20 20 20 20 20 69 66 28 20 69 4b 65 79 3e 70        if( iKey>p
3cb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50  Parse->nMem ) pP
3cc0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 69 4b 65  arse->nMem = iKe
3cd0: 79 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  y;.    }.  .    
3ce0: 69 66 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29 7b  if( okOnePass ){
3cf0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 4f 4e  .      /* For ON
3d00: 45 50 41 53 53 2c 20 6e 6f 20 6e 65 65 64 20 74  EPASS, no need t
3d10: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 6f 77 69  o store the rowi
3d20: 64 2f 70 72 69 6d 61 72 79 2d 6b 65 79 2e 20 20  d/primary-key.  
3d30: 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 0a 20 20  There is only.  
3d40: 20 20 20 20 2a 2a 20 6f 6e 65 2c 20 73 6f 20 6a      ** one, so j
3d50: 75 73 74 20 6b 65 65 70 20 69 74 20 69 6e 20 69  ust keep it in i
3d60: 74 73 20 72 65 67 69 73 74 65 72 28 73 29 20 61  ts register(s) a
3d70: 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  nd fall through 
3d80: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
3d90: 64 65 6c 65 74 65 20 63 6f 64 65 2e 0a 20 20 20  delete code..   
3da0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4b 65 79     */.      nKey
3db0: 20 3d 20 6e 50 6b 3b 20 2f 2a 20 4f 50 5f 46 6f   = nPk; /* OP_Fo
3dc0: 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61 6e 20  und will use an 
3dd0: 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a  unpacked key */.
3de0: 20 20 20 20 20 20 61 54 6f 4f 70 65 6e 20 3d 20        aToOpen = 
3df0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3e00: 61 77 28 64 62 2c 20 6e 49 64 78 2b 32 29 3b 0a  aw(db, nIdx+2);.
3e10: 20 20 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65        if( aToOpe
3e20: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
3e30: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
3e40: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
3e50: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
3e60: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  m_cleanup;.     
3e70: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
3e80: 61 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78  aToOpen, 1, nIdx
3e90: 2b 31 29 3b 0a 20 20 20 20 20 20 61 54 6f 4f 70  +1);.      aToOp
3ea0: 65 6e 5b 6e 49 64 78 2b 31 5d 20 3d 20 30 3b 0a  en[nIdx+1] = 0;.
3eb0: 20 20 20 20 20 20 69 66 28 20 61 69 43 75 72 4f        if( aiCurO
3ec0: 6e 65 50 61 73 73 5b 30 5d 3e 3d 30 20 29 20 61  nePass[0]>=0 ) a
3ed0: 54 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50  ToOpen[aiCurOneP
3ee0: 61 73 73 5b 30 5d 2d 69 54 61 62 43 75 72 5d 20  ass[0]-iTabCur] 
3ef0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 0;.      if( a
3f00: 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3e 3d  iCurOnePass[1]>=
3f10: 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75  0 ) aToOpen[aiCu
3f20: 72 4f 6e 65 50 61 73 73 5b 31 5d 2d 69 54 61 62  rOnePass[1]-iTab
3f30: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cur] = 0;.      
3f40: 69 66 28 20 61 64 64 72 45 70 68 4f 70 65 6e 20  if( addrEphOpen 
3f50: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
3f60: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
3f70: 72 45 70 68 4f 70 65 6e 29 3b 0a 20 20 20 20 20  rEphOpen);.     
3f80: 20 61 64 64 72 44 65 6c 65 74 65 20 3d 20 73 71   addrDelete = sq
3f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
3fa0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 2f 2a 20  v, OP_Goto); /* 
3fb0: 4a 75 6d 70 20 74 6f 20 44 45 4c 45 54 45 20 6c  Jump to DELETE l
3fc0: 6f 67 69 63 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  ogic */.    }els
3fd0: 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20  e if( pPk ){.   
3fe0: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3ff0: 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20  a composite key 
4000: 66 6f 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62  for the row to b
4010: 65 20 64 65 6c 65 74 65 64 20 61 6e 64 20 72 65  e deleted and re
4020: 6d 65 6d 62 65 72 20 69 74 20 2a 2f 0a 20 20 20  member it */.   
4030: 20 20 20 69 4b 65 79 20 3d 20 2b 2b 70 50 61 72     iKey = ++pPar
4040: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
4050: 6e 4b 65 79 20 3d 20 30 3b 20 20 20 2f 2a 20 5a  nKey = 0;   /* Z
4060: 65 72 6f 20 74 65 6c 6c 73 20 4f 50 5f 46 6f 75  ero tells OP_Fou
4070: 6e 64 20 74 6f 20 75 73 65 20 61 20 63 6f 6d 70  nd to use a comp
4080: 6f 73 69 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20  osite key */.   
4090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
40a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
40b0: 65 63 6f 72 64 2c 20 69 50 6b 2c 20 6e 50 6b 2c  ecord, iPk, nPk,
40c0: 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   iKey,.         
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
40e0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
40f0: 69 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e 64  ityStr(pParse->d
4100: 62 2c 20 70 50 6b 29 2c 20 6e 50 6b 29 3b 0a 20  b, pPk), nPk);. 
4110: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4120: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4130: 49 6e 73 65 72 74 2c 20 69 45 70 68 43 75 72 2c  Insert, iEphCur,
4140: 20 69 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73   iKey);.    }els
4150: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  e{.      /* Get 
4160: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
4170: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
4180: 65 64 20 61 6e 64 20 72 65 6d 65 6d 62 65 72 20  ed and remember 
4190: 69 74 20 69 6e 20 74 68 65 20 52 6f 77 53 65 74  it in the RowSet
41a0: 20 2a 2f 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d   */.      nKey =
41b0: 20 31 3b 20 20 2f 2a 20 4f 50 5f 53 65 65 6b 20   1;  /* OP_Seek 
41c0: 61 6c 77 61 79 73 20 75 73 65 73 20 61 20 73 69  always uses a si
41d0: 6e 67 6c 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ngle rowid */.  
41e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
41f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
4200: 65 74 41 64 64 2c 20 69 52 6f 77 53 65 74 2c 20  etAdd, iRowSet, 
4210: 69 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  iKey);.    }.  .
4220: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
4230: 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a  e WHERE loop */.
4240: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
4250: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
4260: 20 69 66 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29   if( okOnePass )
4270: 7b 0a 20 20 20 20 20 20 2f 2a 20 42 79 70 61 73  {.      /* Bypas
4280: 73 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f 67  s the delete log
4290: 69 63 20 62 65 6c 6f 77 20 69 66 20 74 68 65 20  ic below if the 
42a0: 57 48 45 52 45 20 6c 6f 6f 70 20 66 6f 75 6e 64  WHERE loop found
42b0: 20 7a 65 72 6f 20 72 6f 77 73 20 2a 2f 0a 20 20   zero rows */.  
42c0: 20 20 20 20 61 64 64 72 42 79 70 61 73 73 20 3d      addrBypass =
42d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
42e0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
42f0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
4300: 76 2c 20 61 64 64 72 42 79 70 61 73 73 29 3b 0a  v, addrBypass);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4320: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4330: 72 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a  rDelete);.    }.
4340: 20 20 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73    .    /* Unless
4350: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 2c   this is a view,
4360: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 66 6f   open cursors fo
4370: 72 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  r the table we a
4380: 72 65 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  re .    ** delet
4390: 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 61 6c 6c  ing from and all
43a0: 20 69 74 73 20 69 6e 64 69 63 65 73 2e 20 49 66   its indices. If
43b0: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 2c   this is a view,
43c0: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
43d0: 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 74 68 69   only effect thi
43e0: 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
43f0: 69 73 20 74 6f 20 66 69 72 65 20 74 68 65 20 49  is to fire the I
4400: 4e 53 54 45 41 44 20 4f 46 20 0a 20 20 20 20 2a  NSTEAD OF .    *
4410: 2a 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20 20  * triggers..    
4420: 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  */.    if( !isVi
4430: 65 77 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ew ){.      test
4440: 63 61 73 65 28 20 49 73 56 69 72 74 75 61 6c 28  case( IsVirtual(
4450: 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20 73  pTab) );.      s
4460: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41  qlite3OpenTableA
4470: 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65  ndIndices(pParse
4480: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57  , pTab, OP_OpenW
4490: 72 69 74 65 2c 20 69 54 61 62 43 75 72 2c 20 61  rite, iTabCur, a
44a0: 54 6f 4f 70 65 6e 2c 0a 20 20 20 20 20 20 20 20  ToOpen,.        
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 20 20 20 20 20 20 20 26 69 44 61 74 61 43           &iDataC
44d0: 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20  ur, &iIdxCur);. 
44e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
44f0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
4500: 61 62 29 20 7c 7c 20 69 44 61 74 61 43 75 72 3d  ab) || iDataCur=
4510: 3d 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  =iTabCur );.    
4520: 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 7c 7c    assert( pPk ||
4530: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
4540: 20 7c 7c 20 69 49 64 78 43 75 72 3d 3d 69 44 61   || iIdxCur==iDa
4550: 74 61 43 75 72 2b 31 20 29 3b 0a 20 20 20 20 7d  taCur+1 );.    }
4560: 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  .  .    /* Set u
4570: 70 20 61 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  p a loop over th
4580: 65 20 72 6f 77 69 64 73 2f 70 72 69 6d 61 72 79  e rowids/primary
4590: 2d 6b 65 79 73 20 74 68 61 74 20 77 65 72 65 20  -keys that were 
45a0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 0a 20 20 20  found in the.   
45b0: 20 2a 2a 20 77 68 65 72 65 2d 63 6c 61 75 73 65   ** where-clause
45c0: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 0a 20 20 20   loop above..   
45d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 4f 6e   */.    if( okOn
45e0: 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 2f  ePass ){.      /
45f0: 2a 20 4a 75 73 74 20 6f 6e 65 20 72 6f 77 2e 20  * Just one row. 
4600: 20 48 65 6e 63 65 20 74 68 65 20 74 6f 70 2d 6f   Hence the top-o
4610: 66 2d 6c 6f 6f 70 20 69 73 20 61 20 6e 6f 2d 6f  f-loop is a no-o
4620: 70 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  p */.      asser
4630: 74 28 20 6e 4b 65 79 3d 3d 6e 50 6b 20 29 3b 20  t( nKey==nPk ); 
4640: 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64 20 77 69 6c   /* OP_Found wil
4650: 6c 20 75 73 65 20 61 6e 20 75 6e 70 61 63 6b 65  l use an unpacke
4660: 64 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 61  d key */.      a
4670: 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
4680: 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20  l(pTab) );.     
4690: 20 69 66 28 20 61 54 6f 4f 70 65 6e 5b 69 44 61   if( aToOpen[iDa
46a0: 74 61 43 75 72 2d 69 54 61 62 43 75 72 5d 20 29  taCur-iTabCur] )
46b0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
46c0: 28 20 70 50 6b 21 3d 30 20 7c 7c 20 70 54 61 62  ( pPk!=0 || pTab
46d0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ->pSelect!=0 );.
46e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
46f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
4700: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61  OP_NotFound, iDa
4710: 74 61 43 75 72 2c 20 61 64 64 72 42 79 70 61 73  taCur, addrBypas
4720: 73 2c 20 69 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  s, iKey, nKey);.
4730: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4740: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
4750: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
4760: 50 6b 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  Pk ){.      addr
4770: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
4780: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
4790: 65 77 69 6e 64 2c 20 69 45 70 68 43 75 72 29 3b  ewind, iEphCur);
47a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
47b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
47c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
47d0: 52 6f 77 4b 65 79 2c 20 69 45 70 68 43 75 72 2c  RowKey, iEphCur,
47e0: 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 61 73   iKey);.      as
47f0: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 30 20 29 3b  sert( nKey==0 );
4800: 20 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64 20 77 69    /* OP_Found wi
4810: 6c 6c 20 75 73 65 20 61 20 63 6f 6d 70 6f 73 69  ll use a composi
4820: 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 7d 65  te key */.    }e
4830: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 4c  lse{.      addrL
4840: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
4850: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f  eAddOp3(v, OP_Ro
4860: 77 53 65 74 52 65 61 64 2c 20 69 52 6f 77 53 65  wSetRead, iRowSe
4870: 74 2c 20 30 2c 20 69 4b 65 79 29 3b 0a 20 20 20  t, 0, iKey);.   
4880: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4890: 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
48a0: 28 20 6e 4b 65 79 3d 3d 31 20 29 3b 0a 20 20 20  ( nKey==1 );.   
48b0: 20 7d 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 44   }  .  .    /* D
48c0: 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20 2a 2f  elete the row */
48d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
48e0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
48f0: 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
4900: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
4910: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
4920: 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
4930: 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
4940: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
4950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
4960: 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28 70  abMakeWritable(p
4970: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
4980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4990: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64  ddOp4(v, OP_VUpd
49a0: 61 74 65 2c 20 30 2c 20 31 2c 20 69 4b 65 79 2c  ate, 0, 1, iKey,
49b0: 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
49c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
49d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
49e0: 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  E_Abort);.      
49f0: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
4a00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
4a10: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
4a20: 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20        int count 
4a30: 3d 20 28 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  = (pParse->neste
4a40: 64 3d 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72 75  d==0);    /* Tru
4a50: 65 20 74 6f 20 63 6f 75 6e 74 20 63 68 61 6e 67  e to count chang
4a60: 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  es */.      sqli
4a70: 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65  te3GenerateRowDe
4a80: 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61  lete(pParse, pTa
4a90: 62 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61  b, pTrigger, iDa
4aa0: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a  taCur, iIdxCur,.
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4ad0: 4b 65 79 2c 20 6e 4b 65 79 2c 20 63 6f 75 6e 74  Key, nKey, count
4ae0: 2c 20 4f 45 5f 44 65 66 61 75 6c 74 2c 20 6f 6b  , OE_Default, ok
4af0: 4f 6e 65 50 61 73 73 29 3b 0a 20 20 20 20 7d 0a  OnePass);.    }.
4b00: 20 20 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66    .    /* End of
4b10: 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
4b20: 6c 6c 20 72 6f 77 69 64 73 2f 70 72 69 6d 61 72  ll rowids/primar
4b30: 79 2d 6b 65 79 73 2e 20 2a 2f 0a 20 20 20 20 69  y-keys. */.    i
4b40: 66 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a  f( okOnePass ){.
4b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4b60: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
4b70: 20 61 64 64 72 42 79 70 61 73 73 29 3b 0a 20 20   addrBypass);.  
4b80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20    }else if( pPk 
4b90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4ba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4bb0: 5f 4e 65 78 74 2c 20 69 45 70 68 43 75 72 2c 20  _Next, iEphCur, 
4bc0: 61 64 64 72 4c 6f 6f 70 2b 31 29 3b 20 56 64 62  addrLoop+1); Vdb
4bd0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
4bf0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4c  umpHere(v, addrL
4c00: 6f 6f 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oop);.    }else{
4c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4c20: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4c 6f  beGoto(v, addrLo
4c30: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
4c40: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4c50: 2c 20 61 64 64 72 4c 6f 6f 70 29 3b 0a 20 20 20  , addrLoop);.   
4c60: 20 7d 20 20 20 20 20 0a 20 20 0a 20 20 20 20 2f   }     .  .    /
4c70: 2a 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 73  * Close the curs
4c80: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
4c90: 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 69 6e  table and its in
4ca0: 64 65 78 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66  dexes. */.    if
4cb0: 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
4cc0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
4cd0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 6b 20  .      if( !pPk 
4ce0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
4cf0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
4d00: 20 69 44 61 74 61 43 75 72 29 3b 0a 20 20 20 20   iDataCur);.    
4d10: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d    for(i=0, pIdx=
4d20: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
4d30: 64 78 3b 20 69 2b 2b 2c 20 70 49 64 78 3d 70 49  dx; i++, pIdx=pI
4d40: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
4d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
4d70: 65 2c 20 69 49 64 78 43 75 72 20 2b 20 69 29 3b  e, iIdxCur + i);
4d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4d90: 20 7d 20 2f 2a 20 45 6e 64 20 6e 6f 6e 2d 74 72   } /* End non-tr
4da0: 75 6e 63 61 74 65 20 70 61 74 68 20 2a 2f 0a 0a  uncate path */..
4db0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
4dc0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
4dd0: 74 61 62 6c 65 20 62 79 20 73 74 6f 72 69 6e 67  table by storing
4de0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
4df0: 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  the.  ** maximum
4e00: 20 72 6f 77 69 64 20 63 6f 75 6e 74 65 72 20 76   rowid counter v
4e10: 61 6c 75 65 73 20 72 65 63 6f 72 64 65 64 20 77  alues recorded w
4e20: 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 69  hile inserting i
4e30: 6e 74 6f 0a 20 20 2a 2a 20 61 75 74 6f 69 6e 63  nto.  ** autoinc
4e40: 72 65 6d 65 6e 74 20 74 61 62 6c 65 73 2e 0a 20  rement tables.. 
4e50: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
4e60: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26 20 70  ->nested==0 && p
4e70: 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
4e80: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
4e90: 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e  ite3Autoincremen
4ea0: 74 45 6e 64 28 70 50 61 72 73 65 29 3b 0a 20 20  tEnd(pParse);.  
4eb0: 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  }..  /* Return t
4ec0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
4ed0: 73 20 74 68 61 74 20 77 65 72 65 20 64 65 6c 65  s that were dele
4ee0: 74 65 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75  ted. If this rou
4ef0: 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65  tine is .  ** ge
4f00: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65  nerating code be
4f10: 63 61 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20  cause of a call 
4f20: 74 6f 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  to sqlite3Nested
4f30: 50 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a  Parse(), do not.
4f40: 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20    ** invoke the 
4f50: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
4f60: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64  n..  */.  if( (d
4f70: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
4f80: 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20 21 70  CountRows) && !p
4f90: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
4fa0: 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
4fb0: 65 72 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  erTab ){.    sql
4fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4fd0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
4fe0: 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20  memCnt, 1);.    
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
5000: 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20  mCols(v, 1);.   
5010: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5020: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c  olName(v, 0, COL
5030: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73  NAME_NAME, "rows
5040: 20 64 65 6c 65 74 65 64 22 2c 20 53 51 4c 49 54   deleted", SQLIT
5050: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a  E_STATIC);.  }..
5060: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
5070: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 41 75  nup:.  sqlite3Au
5080: 74 68 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43  thContextPop(&sC
5090: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
50a0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
50b0: 64 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20  db, pTabList);. 
50c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
50d0: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
50e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
50f0: 64 62 2c 20 61 54 6f 4f 70 65 6e 29 3b 0a 20 20  db, aToOpen);.  
5100: 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 20 4d 61 6b  return;.}./* Mak
5110: 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22 20  e sure "isView" 
5120: 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f 73  and other macros
5130: 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20 61   defined above a
5140: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74  re undefined. Ot
5150: 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79 20  herwise.** they 
5160: 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77 69  may interfere wi
5170: 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f  th compilation o
5180: 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  f other function
5190: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a  s in this file.*
51a0: 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65 72  * (or in another
51b0: 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20 66   file, if this f
51c0: 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74  ile becomes part
51d0: 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   of the amalgama
51e0: 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64 65  tion).  */.#ifde
51f0: 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65 66  f isView. #undef
5200: 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a 23   isView.#endif.#
5210: 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a 20  ifdef pTrigger. 
5220: 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72 0a  #undef pTrigger.
5230: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
5240: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
5250: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
5260: 68 61 74 20 63 61 75 73 65 73 20 61 20 73 69 6e  hat causes a sin
5270: 67 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a 2a 20  gle row of a.** 
5280: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 74 6f 20  single table to 
5290: 62 65 20 64 65 6c 65 74 65 64 2e 20 20 42 6f 74  be deleted.  Bot
52a0: 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  h the original t
52b0: 61 62 6c 65 20 65 6e 74 72 79 20 61 6e 64 0a 2a  able entry and.*
52c0: 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 72  * all indices ar
52d0: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
52e0: 20 50 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   Preconditions:.
52f0: 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 69 44 61 74  **.**   1.  iDat
5300: 61 43 75 72 20 69 73 20 61 6e 20 6f 70 65 6e 20  aCur is an open 
5310: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 62 74  cursor on the bt
5320: 72 65 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ree that is the 
5330: 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 0a 2a  canonical data.*
5340: 2a 20 20 20 20 20 20 20 73 74 6f 72 65 20 66 6f  *       store fo
5350: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 28 54  r the table.  (T
5360: 68 69 73 20 77 69 6c 6c 20 62 65 20 65 69 74 68  his will be eith
5370: 65 72 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  er the table its
5380: 65 6c 66 2c 0a 2a 2a 20 20 20 20 20 20 20 69 6e  elf,.**       in
5390: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 72   the case of a r
53a0: 6f 77 69 64 20 74 61 62 6c 65 2c 20 6f 72 20 74  owid table, or t
53b0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
53c0: 6e 64 65 78 20 69 6e 20 74 68 65 20 63 61 73 65  ndex in the case
53d0: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 57  .**       of a W
53e0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
53f0: 6c 65 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  le.).**.**   2. 
5400: 20 52 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   Read/write curs
5410: 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69  ors for all indi
5420: 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74  ces of pTab must
5430: 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20   be open as.**  
5440: 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62       cursor numb
5450: 65 72 20 69 49 64 78 43 75 72 2b 69 20 66 6f 72  er iIdxCur+i for
5460: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e   the i-th index.
5470: 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65  .**.**   3.  The
5480: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f 72   primary key for
5490: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
54a0: 65 6c 65 74 65 64 20 6d 75 73 74 20 62 65 20 73  eleted must be s
54b0: 74 6f 72 65 64 20 69 6e 20 61 0a 2a 2a 20 20 20  tored in a.**   
54c0: 20 20 20 20 73 65 71 75 65 6e 63 65 20 6f 66 20      sequence of 
54d0: 6e 50 6b 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nPk memory cells
54e0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 50 6b   starting at iPk
54f0: 2e 20 20 49 66 20 6e 50 6b 3d 3d 30 20 74 68 61  .  If nPk==0 tha
5500: 74 20 6d 65 61 6e 73 0a 2a 2a 20 20 20 20 20 20  t means.**      
5510: 20 74 68 61 74 20 61 20 73 65 61 72 63 68 20 72   that a search r
5520: 65 63 6f 72 64 20 66 6f 72 6d 65 64 20 66 72 6f  ecord formed fro
5530: 6d 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  m OP_MakeRecord 
5540: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
5550: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 73 69 6e  the.**       sin
5560: 67 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  gle memory locat
5570: 69 6f 6e 20 69 50 6b 2e 0a 2a 2f 0a 76 6f 69 64  ion iPk..*/.void
5580: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
5590: 52 6f 77 44 65 6c 65 74 65 28 0a 20 20 50 61 72  RowDelete(.  Par
55a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
55b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
55c0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
55d0: 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61  Tab,       /* Ta
55e0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
55f0: 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  he row to be del
5600: 65 74 65 64 20 2a 2f 0a 20 20 54 72 69 67 67 65  eted */.  Trigge
5610: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 2f 2a 20  r *pTrigger, /* 
5620: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
5630: 20 74 6f 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79   to (potentially
5640: 29 20 66 69 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ) fire */.  int 
5650: 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 2f  iDataCur,      /
5660: 2a 20 43 75 72 73 6f 72 20 66 72 6f 6d 20 77 68  * Cursor from wh
5670: 69 63 68 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20  ich column data 
5680: 69 73 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  is extracted */.
5690: 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20    int iIdxCur,  
56a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
56b0: 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  dex cursor */.  
56c0: 69 6e 74 20 69 50 6b 2c 20 20 20 20 20 20 20 20  int iPk,        
56d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 6d 65 6d 6f     /* First memo
56e0: 72 79 20 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 69  ry cell containi
56f0: 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
5700: 45 59 20 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 2c  EY */.  i16 nPk,
5710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5720: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
5730: 4b 45 59 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  KEY memory cells
5740: 20 2a 2f 0a 20 20 75 38 20 63 6f 75 6e 74 2c 20   */.  u8 count, 
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
5760: 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 63 72 65 6d 65  on-zero, increme
5770: 6e 74 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  nt the row chang
5780: 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e counter */.  u
5790: 38 20 6f 6e 63 6f 6e 66 2c 20 20 20 20 20 20 20  8 onconf,       
57a0: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20    /* Default ON 
57b0: 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20  CONFLICT policy 
57c0: 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  for triggers */.
57d0: 20 20 75 38 20 62 4e 6f 53 65 65 6b 20 20 20 20    u8 bNoSeek    
57e0: 20 20 20 20 20 2f 2a 20 69 44 61 74 61 43 75 72       /* iDataCur
57f0: 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
5800: 74 69 6e 67 20 74 6f 20 74 68 65 20 72 6f 77 20  ting to the row 
5810: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a  to delete */.){.
5820: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5830: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
5840: 20 20 2f 2a 20 56 64 62 65 20 2a 2f 0a 20 20 69    /* Vdbe */.  i
5850: 6e 74 20 69 4f 6c 64 20 3d 20 30 3b 20 20 20 20  nt iOld = 0;    
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5870: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
5880: 20 69 6e 20 4f 4c 44 2e 2a 20 61 72 72 61 79 20   in OLD.* array 
5890: 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 62 65 6c 3b  */.  int iLabel;
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 72 65       /* Label re
58c0: 73 6f 6c 76 65 64 20 74 6f 20 65 6e 64 20 6f 66  solved to end of
58d0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
58e0: 2a 2f 0a 20 20 75 38 20 6f 70 53 65 65 6b 3b 20  */.  u8 opSeek; 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f 70 63       /* Seek opc
5910: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 56 64 62  ode */..  /* Vdb
5920: 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
5930: 74 6f 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  to have been all
5940: 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 73  ocated by this s
5950: 74 61 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tage. */.  asser
5960: 74 28 20 76 20 29 3b 0a 20 20 56 64 62 65 4d 6f  t( v );.  VdbeMo
5970: 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
5980: 22 42 45 47 49 4e 3a 20 47 65 6e 52 6f 77 44 65  "BEGIN: GenRowDe
5990: 6c 28 25 64 2c 25 64 2c 25 64 2c 25 64 29 22 2c  l(%d,%d,%d,%d)",
59a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
59b0: 20 20 20 20 20 20 20 20 20 20 69 44 61 74 61 43            iDataC
59c0: 75 72 2c 20 69 49 64 78 43 75 72 2c 20 69 50 6b  ur, iIdxCur, iPk
59d0: 2c 20 28 69 6e 74 29 6e 50 6b 29 29 3b 0a 0a 20  , (int)nPk));.. 
59e0: 20 2f 2a 20 53 65 65 6b 20 63 75 72 73 6f 72 20   /* Seek cursor 
59f0: 69 43 75 72 20 74 6f 20 74 68 65 20 72 6f 77 20  iCur to the row 
5a00: 74 6f 20 64 65 6c 65 74 65 2e 20 49 66 20 74 68  to delete. If th
5a10: 69 73 20 72 6f 77 20 6e 6f 20 6c 6f 6e 67 65 72  is row no longer
5a20: 20 65 78 69 73 74 73 20 0a 20 20 2a 2a 20 28 74   exists .  ** (t
5a30: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
5a40: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
5a50: 72 61 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  ram has already 
5a60: 64 65 6c 65 74 65 64 20 69 74 29 2c 20 64 6f 0a  deleted it), do.
5a70: 20 20 2a 2a 20 6e 6f 74 20 61 74 74 65 6d 70 74    ** not attempt
5a80: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 20 6f 72   to delete it or
5a90: 20 66 69 72 65 20 61 6e 79 20 44 45 4c 45 54 45   fire any DELETE
5aa0: 20 74 72 69 67 67 65 72 73 2e 20 20 2a 2f 0a 20   triggers.  */. 
5ab0: 20 69 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   iLabel = sqlite
5ac0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
5ad0: 29 3b 0a 20 20 6f 70 53 65 65 6b 20 3d 20 48 61  );.  opSeek = Ha
5ae0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 4f  sRowid(pTab) ? O
5af0: 50 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f 50  P_NotExists : OP
5b00: 5f 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 69 66 28  _NotFound;.  if(
5b10: 20 21 62 4e 6f 53 65 65 6b 20 29 7b 0a 20 20 20   !bNoSeek ){.   
5b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b30: 70 34 49 6e 74 28 76 2c 20 6f 70 53 65 65 6b 2c  p4Int(v, opSeek,
5b40: 20 69 44 61 74 61 43 75 72 2c 20 69 4c 61 62 65   iDataCur, iLabe
5b50: 6c 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20  l, iPk, nPk);.  
5b60: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5b70: 28 76 2c 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e  (v, opSeek==OP_N
5b80: 6f 74 45 78 69 73 74 73 29 3b 0a 20 20 20 20 56  otExists);.    V
5b90: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5ba0: 20 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 46   opSeek==OP_NotF
5bb0: 6f 75 6e 64 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  ound);.  }. .  /
5bc0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5bd0: 6e 79 20 74 72 69 67 67 65 72 73 20 74 6f 20 66  ny triggers to f
5be0: 69 72 65 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  ire, allocate a 
5bf0: 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
5c00: 72 73 20 74 6f 0a 20 20 2a 2a 20 75 73 65 20 66  rs to.  ** use f
5c10: 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 72 65 66  or the old.* ref
5c20: 65 72 65 6e 63 65 73 20 69 6e 20 74 68 65 20 74  erences in the t
5c30: 72 69 67 67 65 72 73 2e 20 20 2a 2f 0a 20 20 69  riggers.  */.  i
5c40: 66 28 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75  f( sqlite3FkRequ
5c50: 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61  ired(pParse, pTa
5c60: 62 2c 20 30 2c 20 30 29 20 7c 7c 20 70 54 72 69  b, 0, 0) || pTri
5c70: 67 67 65 72 20 29 7b 0a 20 20 20 20 75 33 32 20  gger ){.    u32 
5c80: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
5ca0: 6b 20 6f 66 20 4f 4c 44 2e 2a 20 63 6f 6c 75 6d  k of OLD.* colum
5cb0: 6e 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 20  ns in use */.   
5cc0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ce0: 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
5cf0: 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
5d00: 20 4f 4c 44 2e 2a 20 2a 2f 0a 20 20 20 20 69 6e   OLD.* */.    in
5d10: 74 20 61 64 64 72 53 74 61 72 74 3b 20 20 20 20  t addrStart;    
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5d30: 74 61 72 74 20 6f 66 20 42 45 46 4f 52 45 20 74  tart of BEFORE t
5d40: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20  rigger programs 
5d50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  */..    /* TODO:
5d60: 20 43 6f 75 6c 64 20 75 73 65 20 74 65 6d 70 6f   Could use tempo
5d70: 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 68  rary registers h
5d80: 65 72 65 2e 20 41 6c 73 6f 20 63 6f 75 6c 64 20  ere. Also could 
5d90: 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 20 20 2a  attempt to.    *
5da0: 2a 20 61 76 6f 69 64 20 63 6f 70 79 69 6e 67 20  * avoid copying 
5db0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5dc0: 74 68 65 20 72 6f 77 69 64 20 72 65 67 69 73 74  the rowid regist
5dd0: 65 72 2e 20 20 2a 2f 0a 20 20 20 20 6d 61 73 6b  er.  */.    mask
5de0: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
5df0: 72 43 6f 6c 6d 61 73 6b 28 0a 20 20 20 20 20 20  rColmask(.      
5e00: 20 20 70 50 61 72 73 65 2c 20 70 54 72 69 67 67    pParse, pTrigg
5e10: 65 72 2c 20 30 2c 20 30 2c 20 54 52 49 47 47 45  er, 0, 0, TRIGGE
5e20: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
5e30: 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6f 6e  _AFTER, pTab, on
5e40: 63 6f 6e 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  conf.    );.    
5e50: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 46  mask |= sqlite3F
5e60: 6b 4f 6c 64 6d 61 73 6b 28 70 50 61 72 73 65 2c  kOldmask(pParse,
5e70: 20 70 54 61 62 29 3b 0a 20 20 20 20 69 4f 6c 64   pTab);.    iOld
5e80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5e90: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5ea0: 4d 65 6d 20 2b 3d 20 28 31 20 2b 20 70 54 61 62  Mem += (1 + pTab
5eb0: 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  ->nCol);..    /*
5ec0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 4f 4c   Populate the OL
5ed0: 44 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  D.* pseudo-table
5ee0: 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 2e   register array.
5ef0: 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 77 69   These values wi
5f00: 6c 6c 20 62 65 20 0a 20 20 20 20 2a 2a 20 75 73  ll be .    ** us
5f10: 65 64 20 62 79 20 61 6e 79 20 42 45 46 4f 52 45  ed by any BEFORE
5f20: 20 61 6e 64 20 41 46 54 45 52 20 74 72 69 67 67   and AFTER trigg
5f30: 65 72 73 20 74 68 61 74 20 65 78 69 73 74 2e 20  ers that exist. 
5f40: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
5f50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5f60: 43 6f 70 79 2c 20 69 50 6b 2c 20 69 4f 6c 64 29  Copy, iPk, iOld)
5f70: 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  ;.    for(iCol=0
5f80: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
5f90: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
5fa0: 20 20 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b    testcase( mask
5fb0: 21 3d 30 78 66 66 66 66 66 66 66 66 20 26 26 20  !=0xffffffff && 
5fc0: 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20  iCol==31 );.    
5fd0: 20 20 74 65 73 74 63 61 73 65 28 20 6d 61 73 6b    testcase( mask
5fe0: 21 3d 30 78 66 66 66 66 66 66 66 66 20 26 26 20  !=0xffffffff && 
5ff0: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
6000: 20 20 69 66 28 20 6d 61 73 6b 3d 3d 30 78 66 66    if( mask==0xff
6010: 66 66 66 66 66 66 20 7c 7c 20 28 69 43 6f 6c 3c  ffffff || (iCol<
6020: 3d 33 31 20 26 26 20 28 6d 61 73 6b 20 26 20 4d  =31 && (mask & M
6030: 41 53 4b 42 49 54 33 32 28 69 43 6f 6c 29 29 21  ASKBIT32(iCol))!
6040: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
6050: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
6060: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
6070: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
6080: 2c 20 69 43 6f 6c 2c 20 69 4f 6c 64 2b 69 43 6f  , iCol, iOld+iCo
6090: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l+1);.      }.  
60a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
60b0: 6b 65 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45  ke BEFORE DELETE
60c0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
60d0: 73 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 53 74  s. */.    addrSt
60e0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
60f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
6100: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
6110: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
6120: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 0a 20 20  e, pTrigger, .  
6130: 20 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45 2c        TK_DELETE,
6140: 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f   0, TRIGGER_BEFO
6150: 52 45 2c 20 70 54 61 62 2c 20 69 4f 6c 64 2c 20  RE, pTab, iOld, 
6160: 6f 6e 63 6f 6e 66 2c 20 69 4c 61 62 65 6c 0a 20  onconf, iLabel. 
6170: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66     );..    /* If
6180: 20 61 6e 79 20 42 45 46 4f 52 45 20 74 72 69 67   any BEFORE trig
6190: 67 65 72 73 20 77 65 72 65 20 63 6f 64 65 64 2c  gers were coded,
61a0: 20 74 68 65 6e 20 73 65 65 6b 20 74 68 65 20 63   then seek the c
61b0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 0a 20 20  ursor to the .  
61c0: 20 20 2a 2a 20 72 6f 77 20 74 6f 20 62 65 20 64    ** row to be d
61d0: 65 6c 65 74 65 64 20 61 67 61 69 6e 2e 20 49 74  eleted again. It
61e0: 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65   may be that the
61f0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
6200: 20 6d 6f 76 65 64 0a 20 20 20 20 2a 2a 20 74 68   moved.    ** th
6210: 65 20 63 75 72 73 6f 72 20 6f 72 20 6f 66 20 61  e cursor or of a
6220: 6c 72 65 61 64 79 20 64 65 6c 65 74 65 64 20 74  lready deleted t
6230: 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20  he row that the 
6240: 63 75 72 73 6f 72 20 77 61 73 0a 20 20 20 20 2a  cursor was.    *
6250: 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 20  * pointing to.. 
6260: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
6270: 64 72 53 74 61 72 74 3c 73 71 6c 69 74 65 33 56  drStart<sqlite3V
6280: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6290: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
62a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
62b0: 76 2c 20 6f 70 53 65 65 6b 2c 20 69 44 61 74 61  v, opSeek, iData
62c0: 43 75 72 2c 20 69 4c 61 62 65 6c 2c 20 69 50 6b  Cur, iLabel, iPk
62d0: 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 56 64  , nPk);.      Vd
62e0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
62f0: 6f 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 45 78  opSeek==OP_NotEx
6300: 69 73 74 73 29 3b 0a 20 20 20 20 20 20 56 64 62  ists);.      Vdb
6310: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
6320: 70 53 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 46 6f 75  pSeek==OP_NotFou
6330: 6e 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nd);.    }..    
6340: 2f 2a 20 44 6f 20 46 4b 20 70 72 6f 63 65 73 73  /* Do FK process
6350: 69 6e 67 2e 20 54 68 69 73 20 63 61 6c 6c 20 63  ing. This call c
6360: 68 65 63 6b 73 20 74 68 61 74 20 61 6e 79 20 46  hecks that any F
6370: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  K constraints th
6380: 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 20  at.    ** refer 
6390: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 28 69  to this table (i
63a0: 2e 65 2e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .e. constraints 
63b0: 61 74 74 61 63 68 65 64 20 74 6f 20 6f 74 68 65  attached to othe
63c0: 72 20 74 61 62 6c 65 73 29 20 0a 20 20 20 20 2a  r tables) .    *
63d0: 2a 20 61 72 65 20 6e 6f 74 20 76 69 6f 6c 61 74  * are not violat
63e0: 65 64 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74  ed by deleting t
63f0: 68 69 73 20 72 6f 77 2e 20 20 2a 2f 0a 20 20 20  his row.  */.   
6400: 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28   sqlite3FkCheck(
6410: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 4f  pParse, pTab, iO
6420: 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ld, 0, 0, 0);.  
6430: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
6440: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
6450: 6c 65 20 65 6e 74 72 69 65 73 2e 20 53 6b 69 70  le entries. Skip
6460: 20 74 68 69 73 20 73 74 65 70 20 69 66 20 70 54   this step if pT
6470: 61 62 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 2a  ab is really.  *
6480: 2a 20 61 20 76 69 65 77 20 28 69 6e 20 77 68 69  * a view (in whi
6490: 63 68 20 63 61 73 65 20 74 68 65 20 6f 6e 6c 79  ch case the only
64a0: 20 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 44   effect of the D
64b0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
64c0: 69 73 20 74 6f 0a 20 20 2a 2a 20 66 69 72 65 20  is to.  ** fire 
64d0: 74 68 65 20 49 4e 53 54 45 41 44 20 4f 46 20 74  the INSTEAD OF t
64e0: 72 69 67 67 65 72 73 29 2e 20 20 2a 2f 20 0a 20  riggers).  */ . 
64f0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
6500: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
6510: 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49  ite3GenerateRowI
6520: 6e 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73  ndexDelete(pPars
6530: 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  e, pTab, iDataCu
6540: 72 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  r, iIdxCur, 0);.
6550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6560: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp2(v, OP_Dele
6570: 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20 28 63  te, iDataCur, (c
6580: 6f 75 6e 74 3f 4f 50 46 4c 41 47 5f 4e 43 48 41  ount?OPFLAG_NCHA
6590: 4e 47 45 3a 30 29 29 3b 0a 20 20 20 20 69 66 28  NGE:0));.    if(
65a0: 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20   count ){.      
65b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
65c0: 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP4(v, -1, pTab-
65d0: 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53  >zName, P4_TRANS
65e0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
65f0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e  ..  /* Do any ON
6600: 20 43 41 53 43 41 44 45 2c 20 53 45 54 20 4e 55   CASCADE, SET NU
6610: 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41 55 4c  LL or SET DEFAUL
6620: 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  T operations req
6630: 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 68 61  uired to.  ** ha
6640: 6e 64 6c 65 20 72 6f 77 73 20 28 70 6f 73 73 69  ndle rows (possi
6650: 62 6c 79 20 69 6e 20 6f 74 68 65 72 20 74 61 62  bly in other tab
6660: 6c 65 73 29 20 74 68 61 74 20 72 65 66 65 72 20  les) that refer 
6670: 76 69 61 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  via a foreign ke
6680: 79 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f  y.  ** to the ro
6690: 77 20 6a 75 73 74 20 64 65 6c 65 74 65 64 2e 20  w just deleted. 
66a0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 46 6b 41  */ .  sqlite3FkA
66b0: 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 70  ctions(pParse, p
66c0: 54 61 62 2c 20 30 2c 20 69 4f 6c 64 2c 20 30 2c  Tab, 0, iOld, 0,
66d0: 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b   0);..  /* Invok
66e0: 65 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 74  e AFTER DELETE t
66f0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
6700: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
6710: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
6720: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 0a 20  se, pTrigger, . 
6730: 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45 2c 20       TK_DELETE, 
6740: 30 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  0, TRIGGER_AFTER
6750: 2c 20 70 54 61 62 2c 20 69 4f 6c 64 2c 20 6f 6e  , pTab, iOld, on
6760: 63 6f 6e 66 2c 20 69 4c 61 62 65 6c 0a 20 20 29  conf, iLabel.  )
6770: 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
6780: 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 64  e if the row had
6790: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
67a0: 6c 65 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  leted before any
67b0: 20 42 45 46 4f 52 45 0a 20 20 2a 2a 20 74 72 69   BEFORE.  ** tri
67c0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 77 65  gger programs we
67d0: 72 65 20 69 6e 76 6f 6b 65 64 2e 20 4f 72 20 69  re invoked. Or i
67e0: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
67f0: 72 61 6d 20 74 68 72 6f 77 73 20 61 20 0a 20 20  ram throws a .  
6800: 2a 2a 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  ** RAISE(IGNORE)
6810: 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a   exception.  */.
6820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6830: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 61  olveLabel(v, iLa
6840: 62 65 6c 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75  bel);.  VdbeModu
6850: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
6860: 4e 44 3a 20 47 65 6e 52 6f 77 44 65 6c 28 29 22  ND: GenRowDel()"
6870: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
6880: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
6890: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
68a0: 61 74 20 63 61 75 73 65 73 20 74 68 65 20 64 65  at causes the de
68b0: 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c 0a 2a 2a  letion of all.**
68c0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
68d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
68e0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61   single row of a
68f0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2c 20 70   single table, p
6900: 54 61 62 0a 2a 2a 0a 2a 2a 20 50 72 65 63 6f 6e  Tab.**.** Precon
6910: 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  ditions:.**.**  
6920: 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74   1.  A read/writ
6930: 65 20 63 75 72 73 6f 72 20 22 69 44 61 74 61 43  e cursor "iDataC
6940: 75 72 22 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ur" must be open
6950: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
6960: 6c 20 73 74 6f 72 61 67 65 0a 2a 2a 20 20 20 20  l storage.**    
6970: 20 20 20 62 74 72 65 65 20 66 6f 72 20 74 68 65     btree for the
6980: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 28 54   table pTab.  (T
6990: 68 69 73 20 77 69 6c 6c 20 62 65 20 65 69 74 68  his will be eith
69a0: 65 72 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  er the table its
69b0: 65 6c 66 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72  elf.**       for
69c0: 20 72 6f 77 69 64 20 74 61 62 6c 65 73 20 6f 72   rowid tables or
69d0: 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20   to the primary 
69e0: 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20 57 49  key index for WI
69f0: 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 20  THOUT ROWID.**  
6a00: 20 20 20 20 20 74 61 62 6c 65 73 2e 29 0a 2a 2a       tables.).**
6a10: 0a 2a 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77  .**   2.  Read/w
6a20: 72 69 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  rite cursors for
6a30: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
6a40: 70 54 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65  pTab must be ope
6a50: 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75  n as.**       cu
6a60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 49 64 78  rsor number iIdx
6a70: 43 75 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d  Cur+i for the i-
6a80: 74 68 20 69 6e 64 65 78 2e 20 20 28 54 68 65 20  th index.  (The 
6a90: 70 54 61 62 2d 3e 70 49 6e 64 65 78 0a 2a 2a 20  pTab->pIndex.** 
6aa0: 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 74        index is t
6ab0: 68 65 20 30 2d 74 68 20 69 6e 64 65 78 2e 29 0a  he 0-th index.).
6ac0: 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20  **.**   3.  The 
6ad0: 22 69 44 61 74 61 43 75 72 22 20 63 75 72 73 6f  "iDataCur" curso
6ae0: 72 20 6d 75 73 74 20 62 65 20 61 6c 72 65 61 64  r must be alread
6af0: 79 20 62 65 20 70 6f 73 69 74 69 6f 6e 65 64 20  y be positioned 
6b00: 6f 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20  on the row.**   
6b10: 20 20 20 20 74 68 61 74 20 69 73 20 74 6f 20 62      that is to b
6b20: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f  e deleted..*/.vo
6b30: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
6b40: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
6b50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6b60: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
6b70: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
6b80: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
6b90: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
6ba0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
6bb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
6bc0: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
6bd0: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
6be0: 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
6bf0: 72 20 6f 66 20 74 61 62 6c 65 20 68 6f 6c 64 69  r of table holdi
6c00: 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 20 20 69 6e  ng data. */.  in
6c10: 74 20 69 49 64 78 43 75 72 2c 20 20 20 20 20 20  t iIdxCur,      
6c20: 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78 20   /* First index 
6c30: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
6c40: 2a 61 52 65 67 49 64 78 20 20 20 20 20 20 20 2f  *aRegIdx       /
6c50: 2a 20 4f 6e 6c 79 20 64 65 6c 65 74 65 20 69 66  * Only delete if
6c60: 20 61 52 65 67 49 64 78 21 3d 30 20 26 26 20 61   aRegIdx!=0 && a
6c70: 52 65 67 49 64 78 5b 69 5d 3e 30 20 2a 2f 0a 29  RegIdx[i]>0 */.)
6c80: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
6c90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
6ca0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
6cb0: 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 20 20    int r1 = -1;  
6cc0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
6cd0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
6ce0: 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69  x key */.  int i
6cf0: 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 2f 2a  PartIdxLabel; /*
6d00: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
6d10: 6e 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20 70  n for skipping p
6d20: 61 72 74 69 61 6c 20 69 6e 64 65 78 20 65 6e 74  artial index ent
6d30: 72 69 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ries */.  Index 
6d40: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  *pIdx;       /* 
6d50: 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 2a 2f  Current index */
6d60: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72  .  Index *pPrior
6d70: 20 3d 20 30 3b 20 2f 2a 20 50 72 69 6f 72 20 69   = 0; /* Prior i
6d80: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
6d90: 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v;           /* 
6da0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
6db0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
6dc0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
6dd0: 6e 64 65 78 20 2a 70 50 6b 3b 20 20 20 20 20 20  ndex *pPk;      
6de0: 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
6df0: 20 69 6e 64 65 78 2c 20 6f 72 20 4e 55 4c 4c 20   index, or NULL 
6e00: 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73  for rowid tables
6e10: 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73   */..  v = pPars
6e20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 50 6b 20  e->pVdbe;.  pPk 
6e30: 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  = HasRowid(pTab)
6e40: 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72   ? 0 : sqlite3Pr
6e50: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
6e60: 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ab);.  for(i=0, 
6e70: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
6e80: 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49  x; pIdx; i++, pI
6e90: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
6ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64  .    assert( iId
6eb0: 78 43 75 72 2b 69 21 3d 69 44 61 74 61 43 75 72  xCur+i!=iDataCur
6ec0: 20 7c 7c 20 70 50 6b 3d 3d 70 49 64 78 20 29 3b   || pPk==pIdx );
6ed0: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
6ee0: 21 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b 69  !=0 && aRegIdx[i
6ef0: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
6f00: 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 70  .    if( pIdx==p
6f10: 50 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Pk ) continue;. 
6f20: 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
6f30: 6d 65 6e 74 28 28 76 2c 20 22 47 65 6e 52 6f 77  ment((v, "GenRow
6f40: 49 64 78 44 65 6c 20 66 6f 72 20 25 73 22 2c 20  IdxDel for %s", 
6f50: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
6f60: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
6f70: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
6f80: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44  pParse, pIdx, iD
6f90: 61 74 61 43 75 72 2c 20 30 2c 20 31 2c 0a 20 20  ataCur, 0, 1,.  
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6fc0: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 20 70  iPartIdxLabel, p
6fd0: 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20  Prior, r1);.    
6fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ff0: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
7000: 65 2c 20 69 49 64 78 43 75 72 2b 69 2c 20 72 31  e, iIdxCur+i, r1
7010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7020: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
7030: 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78  iqNotNull ? pIdx
7040: 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 70 49 64 78  ->nKeyCol : pIdx
7050: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->nColumn);.    
7060: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
7070: 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
7080: 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
7090: 29 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  );.    pPrior = 
70a0: 70 49 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pIdx;.  }.}../*.
70b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
70c0: 20 74 68 61 74 20 77 69 6c 6c 20 61 73 73 65 6d   that will assem
70d0: 62 6c 65 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ble an index key
70e0: 20 61 6e 64 20 73 74 6f 72 65 73 20 69 74 20 69   and stores it i
70f0: 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 72 65  n register.** re
7100: 67 4f 75 74 2e 20 20 54 68 65 20 6b 65 79 20 77  gOut.  The key w
7110: 69 74 68 20 62 65 20 66 6f 72 20 69 6e 64 65 78  ith be for index
7120: 20 70 49 64 78 20 77 68 69 63 68 20 69 73 20 61   pIdx which is a
7130: 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e  n index on pTab.
7140: 0a 2a 2a 20 69 43 75 72 20 69 73 20 74 68 65 20  .** iCur is the 
7150: 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f  index of a curso
7160: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 70 54  r open on the pT
7170: 61 62 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 69  ab table and poi
7180: 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20  nting to.** the 
7190: 65 6e 74 72 79 20 74 68 61 74 20 6e 65 65 64 73  entry that needs
71a0: 20 69 6e 64 65 78 69 6e 67 2e 20 20 49 66 20 70   indexing.  If p
71b0: 54 61 62 20 69 73 20 61 20 57 49 54 48 4f 55 54  Tab is a WITHOUT
71c0: 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68   ROWID table, th
71d0: 65 6e 0a 2a 2a 20 69 43 75 72 20 6d 75 73 74 20  en.** iCur must 
71e0: 62 65 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  be the cursor of
71f0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
7200: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65   index..**.** Re
7210: 74 75 72 6e 20 61 20 72 65 67 69 73 74 65 72 20  turn a register 
7220: 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
7230: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 62  the first in a b
7240: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73  lock of.** regis
7250: 74 65 72 73 20 74 68 61 74 20 68 6f 6c 64 73 20  ters that holds 
7260: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
7270: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 20 20  the index key.  
7280: 54 68 65 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  The.** block of 
7290: 72 65 67 69 73 74 65 72 73 20 68 61 73 20 61 6c  registers has al
72a0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 61 6c 6c  ready been deall
72b0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 74 69  ocated by the ti
72c0: 6d 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  me.** this routi
72d0: 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ne returns..**.*
72e0: 2a 20 49 66 20 2a 70 69 50 61 72 74 49 64 78 4c  * If *piPartIdxL
72f0: 61 62 65 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  abel is not NULL
7300: 2c 20 66 69 6c 6c 20 69 74 20 69 6e 20 77 69 74  , fill it in wit
7310: 68 20 61 20 6c 61 62 65 6c 20 61 6e 64 20 6a 75  h a label and ju
7320: 6d 70 0a 2a 2a 20 74 6f 20 74 68 61 74 20 6c 61  mp.** to that la
7330: 62 65 6c 20 69 66 20 70 49 64 78 20 69 73 20 61  bel if pIdx is a
7340: 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 74   partial index t
7350: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 6b  hat should be sk
7360: 69 70 70 65 64 2e 0a 2a 2a 20 54 68 65 20 6c 61  ipped..** The la
7370: 62 65 6c 20 73 68 6f 75 6c 64 20 62 65 20 72 65  bel should be re
7380: 73 6f 6c 76 65 64 20 75 73 69 6e 67 20 73 71 6c  solved using sql
7390: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
73a0: 64 78 4c 61 62 65 6c 28 29 2e 0a 2a 2a 20 41 20  dxLabel()..** A 
73b0: 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 73 68  partial index sh
73c0: 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64 20  ould be skipped 
73d0: 69 66 20 69 74 73 20 57 48 45 52 45 20 63 6c 61  if its WHERE cla
73e0: 75 73 65 20 65 76 61 6c 75 61 74 65 73 0a 2a 2a  use evaluates.**
73f0: 20 74 6f 20 66 61 6c 73 65 20 6f 72 20 6e 75 6c   to false or nul
7400: 6c 2e 20 20 49 66 20 70 49 64 78 20 69 73 20 6e  l.  If pIdx is n
7410: 6f 74 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  ot a partial ind
7420: 65 78 2c 20 2a 70 69 50 61 72 74 49 64 78 4c 61  ex, *piPartIdxLa
7430: 62 65 6c 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73  bel.** will be s
7440: 65 74 20 74 6f 20 7a 65 72 6f 20 77 68 69 63 68  et to zero which
7450: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 6c 61 62   is an empty lab
7460: 65 6c 20 74 68 61 74 20 69 73 20 69 67 6e 6f 72  el that is ignor
7470: 65 64 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ed by.** sqlite3
7480: 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61  ResolvePartIdxLa
7490: 62 65 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bel()..**.** The
74a0: 20 70 50 72 69 6f 72 20 61 6e 64 20 72 65 67 50   pPrior and regP
74b0: 72 69 6f 72 20 70 61 72 61 6d 65 74 65 72 73 20  rior parameters 
74c0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
74d0: 65 6d 65 6e 74 20 61 20 63 61 63 68 65 20 74 6f  ement a cache to
74e0: 0a 2a 2a 20 61 76 6f 69 64 20 75 6e 6e 65 63 65  .** avoid unnece
74f0: 73 73 61 72 79 20 72 65 67 69 73 74 65 72 20 6c  ssary register l
7500: 6f 61 64 73 2e 20 20 49 66 20 70 50 72 69 6f 72  oads.  If pPrior
7510: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
7520: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 61 20 70 6f  en it is.** a po
7530: 69 6e 74 65 72 20 74 6f 20 61 20 64 69 66 66 65  inter to a diffe
7540: 72 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 77  rent index for w
7550: 68 69 63 68 20 61 6e 20 69 6e 64 65 78 20 6b 65  hich an index ke
7560: 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a  y has just been.
7570: 2a 2a 20 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f  ** computed into
7580: 20 72 65 67 69 73 74 65 72 20 72 65 67 50 72 69   register regPri
7590: 6f 72 2e 20 20 49 66 20 74 68 65 20 63 75 72 72  or.  If the curr
75a0: 65 6e 74 20 70 49 64 78 20 69 6e 64 65 78 20 69  ent pIdx index i
75b0: 73 20 67 65 6e 65 72 61 74 69 6e 67 0a 2a 2a 20  s generating.** 
75c0: 69 74 73 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  its key into the
75d0: 20 73 61 6d 65 20 73 65 71 75 65 6e 63 65 20 6f   same sequence o
75e0: 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
75f0: 69 66 20 70 50 72 69 6f 72 20 61 6e 64 20 70 49  if pPrior and pI
7600: 64 78 20 73 68 61 72 65 0a 2a 2a 20 61 20 63 6f  dx share.** a co
7610: 6c 75 6d 6e 20 69 6e 20 63 6f 6d 6d 6f 6e 2c 20  lumn in common, 
7620: 74 68 65 6e 20 74 68 65 20 72 65 67 69 73 74 65  then the registe
7630: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
7640: 74 6f 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  to that column a
7650: 6c 72 65 61 64 79 0a 2a 2a 20 68 6f 6c 64 73 20  lready.** holds 
7660: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
7670: 65 20 61 6e 64 20 74 68 65 20 6c 6f 61 64 69 6e  e and the loadin
7680: 67 20 6f 66 20 74 68 61 74 20 72 65 67 69 73 74  g of that regist
7690: 65 72 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 2a  er is skipped..*
76a0: 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
76b0: 69 6f 6e 20 69 73 20 68 65 6c 70 66 75 6c 20 77  ion is helpful w
76c0: 68 65 6e 20 64 6f 69 6e 67 20 61 20 44 45 4c 45  hen doing a DELE
76d0: 54 45 20 6f 72 20 61 6e 20 49 4e 54 45 47 52 49  TE or an INTEGRI
76e0: 54 59 5f 43 48 45 43 4b 20 0a 2a 2a 20 6f 6e 20  TY_CHECK .** on 
76f0: 61 20 74 61 62 6c 65 20 77 69 74 68 20 6d 75 6c  a table with mul
7700: 74 69 70 6c 65 20 69 6e 64 69 63 65 73 2c 20 61  tiple indices, a
7710: 6e 64 20 65 73 70 65 63 69 61 6c 6c 79 20 77 69  nd especially wi
7720: 74 68 20 74 68 65 20 52 4f 57 49 44 20 6f 72 0a  th the ROWID or.
7730: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ** PRIMARY KEY c
7740: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
7750: 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dex..*/.int sqli
7760: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
7770: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
7780: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
7790: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
77a0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
77b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
77c0: 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63 68 20  index for which 
77d0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 6b 65  to generate a ke
77e0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  y */.  int iData
77f0: 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur,        /* C
7800: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 72 6f  ursor number fro
7810: 6d 20 77 68 69 63 68 20 74 6f 20 74 61 6b 65 20  m which to take 
7820: 63 6f 6c 75 6d 6e 20 64 61 74 61 20 2a 2f 0a 20  column data */. 
7830: 20 69 6e 74 20 72 65 67 4f 75 74 2c 20 20 20 20   int regOut,    
7840: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65        /* Put the
7850: 20 6e 65 77 20 6b 65 79 20 69 6e 74 6f 20 74 68   new key into th
7860: 69 73 20 72 65 67 69 73 74 65 72 20 69 66 20 6e  is register if n
7870: 6f 74 20 30 20 2a 2f 0a 20 20 69 6e 74 20 70 72  ot 0 */.  int pr
7880: 65 66 69 78 4f 6e 6c 79 2c 20 20 20 20 20 20 2f  efixOnly,      /
7890: 2a 20 43 6f 6d 70 75 74 65 20 6f 6e 6c 79 20 61  * Compute only a
78a0: 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 20 6f   unique prefix o
78b0: 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69  f the key */.  i
78c0: 6e 74 20 2a 70 69 50 61 72 74 49 64 78 4c 61 62  nt *piPartIdxLab
78d0: 65 6c 2c 20 2f 2a 20 4f 55 54 3a 20 4a 75 6d 70  el, /* OUT: Jump
78e0: 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
78f0: 6f 20 73 6b 69 70 20 70 61 72 74 69 61 6c 20 69  o skip partial i
7900: 6e 64 65 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ndex */.  Index 
7910: 2a 70 50 72 69 6f 72 2c 20 20 20 20 20 20 20 2f  *pPrior,       /
7920: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 67 65 6e  * Previously gen
7930: 65 72 61 74 65 64 20 69 6e 64 65 78 20 6b 65 79  erated index key
7940: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 69   */.  int regPri
7950: 6f 72 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  or         /* Re
7960: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 70  gister holding p
7970: 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 65  revious generate
7980: 64 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 56 64  d key */.){.  Vd
7990: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
79a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  pVdbe;.  int j;.
79b0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
79c0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20 20 69 66   int nCol;..  if
79d0: 28 20 70 69 50 61 72 74 49 64 78 4c 61 62 65 6c  ( piPartIdxLabel
79e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78   ){.    if( pIdx
79f0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
7a00: 29 7b 0a 20 20 20 20 20 20 2a 70 69 50 61 72 74  ){.      *piPart
7a10: 49 64 78 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  IdxLabel = sqlit
7a20: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
7a30: 76 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  v);.      pParse
7a40: 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61  ->iSelfTab = iDa
7a50: 74 61 43 75 72 3b 0a 20 20 20 20 20 20 73 71 6c  taCur;.      sql
7a60: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
7a70: 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
7a80: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
7a90: 6c 73 65 44 75 70 28 70 50 61 72 73 65 2c 20 70  lseDup(pParse, p
7aa0: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
7ab0: 72 65 2c 20 2a 70 69 50 61 72 74 49 64 78 4c 61  re, *piPartIdxLa
7ac0: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e    SQLITE_JUMPIFN
7af0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ULL);.    }else{
7b00: 0a 20 20 20 20 20 20 2a 70 69 50 61 72 74 49 64  .      *piPartId
7b10: 78 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20  xLabel = 0;.    
7b20: 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 28  }.  }.  nCol = (
7b30: 70 72 65 66 69 78 4f 6e 6c 79 20 26 26 20 70 49  prefixOnly && pI
7b40: 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 29  dx->uniqNotNull)
7b50: 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   ? pIdx->nKeyCol
7b60: 20 3a 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   : pIdx->nColumn
7b70: 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71  ;.  regBase = sq
7b80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
7b90: 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
7ba0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 26 26  .  if( pPrior &&
7bb0: 20 28 72 65 67 42 61 73 65 21 3d 72 65 67 50 72   (regBase!=regPr
7bc0: 69 6f 72 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70  ior || pPrior->p
7bd0: 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 20  PartIdxWhere) ) 
7be0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 66 6f  pPrior = 0;.  fo
7bf0: 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a  r(j=0; j<nCol; j
7c00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
7c10: 69 6f 72 0a 20 20 20 20 20 26 26 20 70 50 72 69  ior.     && pPri
7c20: 6f 72 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d  or->aiColumn[j]=
7c30: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
7c40: 6a 5d 0a 20 20 20 20 20 26 26 20 70 50 72 69 6f  j].     && pPrio
7c50: 72 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  r->aiColumn[j]>=
7c60: 28 2d 31 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  (-1).    ){.    
7c70: 20 20 2f 2a 20 54 68 69 73 20 63 6f 6c 75 6d 6e    /* This column
7c80: 20 77 61 73 20 61 6c 72 65 61 64 79 20 63 6f 6d   was already com
7c90: 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
7ca0: 76 69 6f 75 73 20 69 6e 64 65 78 20 2a 2f 0a 20  vious index */. 
7cb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7cc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7cd0: 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
7ce0: 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  xColumn(pParse, 
7cf0: 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20  pIdx, iDataCur, 
7d00: 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  j, regBase+j);. 
7d10: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
7d20: 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 69 73 20  umn affinity is 
7d30: 52 45 41 4c 20 62 75 74 20 74 68 65 20 6e 75 6d  REAL but the num
7d40: 62 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ber is an intege
7d50: 72 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  r, then it.    *
7d60: 2a 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  * might be store
7d70: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61  d in the table a
7d80: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 28 75 73  s an integer (us
7d90: 69 6e 67 20 61 20 63 6f 6d 70 61 63 74 0a 20 20  ing a compact.  
7da0: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
7db0: 69 6f 6e 29 20 74 68 65 6e 20 63 6f 6e 76 65 72  ion) then conver
7dc0: 74 65 64 20 74 6f 20 52 45 41 4c 20 62 79 20 61  ted to REAL by a
7dd0: 6e 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  n OP_RealAffinit
7de0: 79 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  y opcode..    **
7df0: 20 42 75 74 20 77 65 20 61 72 65 20 67 65 74 74   But we are gett
7e00: 69 6e 67 20 72 65 61 64 79 20 74 6f 20 73 74 6f  ing ready to sto
7e10: 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 62 61  re this value ba
7e20: 63 6b 20 69 6e 74 6f 20 61 6e 20 69 6e 64 65 78  ck into an index
7e30: 2c 20 77 68 65 72 65 0a 20 20 20 20 2a 2a 20 69  , where.    ** i
7e40: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 76  t should be conv
7e50: 65 72 74 65 64 20 62 79 20 74 6f 20 49 4e 54 45  erted by to INTE
7e60: 47 45 52 20 61 67 61 69 6e 2e 20 20 53 6f 20 6f  GER again.  So o
7e70: 6d 69 74 20 74 68 65 20 4f 50 5f 52 65 61 6c 41  mit the OP_RealA
7e80: 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 6f  ffinity.    ** o
7e90: 70 63 6f 64 65 20 69 66 20 69 74 20 69 73 20 70  pcode if it is p
7ea0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  resent */.    sq
7eb0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
7ec0: 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20 4f 50  riorOpcode(v, OP
7ed0: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 29 3b 0a  _RealAffinity);.
7ee0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 4f 75 74    }.  if( regOut
7ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
7f00: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7f10: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
7f20: 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 4f 75  ase, nCol, regOu
7f30: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7f40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
7f50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
7f60: 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 72 65 74 75  e, nCol);.  retu
7f70: 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f  rn regBase;.}../
7f80: 2a 0a 2a 2a 20 49 66 20 61 20 70 72 69 6f 72 20  *.** If a prior 
7f90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47  call to sqlite3G
7fa0: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
7fb0: 29 20 67 65 6e 65 72 61 74 65 64 20 61 20 6a 75  ) generated a ju
7fc0: 6d 70 2d 6f 76 65 72 20 6c 61 62 65 6c 0a 2a 2a  mp-over label.**
7fd0: 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
7fe0: 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2c  a partial index,
7ff0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
8000: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
8010: 6c 65 64 20 74 6f 0a 2a 2a 20 72 65 73 6f 6c 76  led to.** resolv
8020: 65 20 74 68 61 74 20 6c 61 62 65 6c 2e 0a 2a 2f  e that label..*/
8030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
8040: 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
8050: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8060: 69 6e 74 20 69 4c 61 62 65 6c 29 7b 0a 20 20 69  int iLabel){.  i
8070: 66 28 20 69 4c 61 62 65 6c 20 29 7b 0a 20 20 20  f( iLabel ){.   
8080: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
8090: 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d  lveLabel(pParse-
80a0: 3e 70 56 64 62 65 2c 20 69 4c 61 62 65 6c 29 3b  >pVdbe, iLabel);
80b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
80c0: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
80d0: 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.