/ Hex Artifact Content
Login

Artifact 20c8788451dc737a967c87ea53ad43544d617f5b57d32ccce8bd52a0daf9e89b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 69 6e  the parser.** in
01c0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
01d0: 74 65 20 63 6f 64 65 20 66 6f 72 20 44 45 4c 45  te code for DELE
01e0: 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e  TE FROM statemen
01f0: 74 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ts..*/.#include 
0200: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0210: 2a 0a 2a 2a 20 57 68 69 6c 65 20 61 20 53 72 63  *.** While a Src
0220: 4c 69 73 74 20 63 61 6e 20 69 6e 20 67 65 6e 65  List can in gene
0230: 72 61 6c 20 72 65 70 72 65 73 65 6e 74 20 6d 75  ral represent mu
0240: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 6e  ltiple tables an
0250: 64 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  d subqueries.** 
0260: 28 61 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  (as in the FROM 
0270: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
0280: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 69 6e  CT statement) in
0290: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 63 6f   this case it co
02a0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e 61  ntains.** the na
02b0: 6d 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  me of a single t
02c0: 61 62 6c 65 2c 20 61 73 20 6f 6e 65 20 6d 69 67  able, as one mig
02d0: 68 74 20 66 69 6e 64 20 69 6e 20 61 6e 20 49 4e  ht find in an IN
02e0: 53 45 52 54 2c 20 44 45 4c 45 54 45 2c 0a 2a 2a  SERT, DELETE,.**
02f0: 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
0300: 6d 65 6e 74 2e 20 20 4c 6f 6f 6b 20 75 70 20 74  ment.  Look up t
0310: 68 61 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  hat table in the
0320: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 61 6e   symbol table an
0330: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
0340: 69 6e 74 65 72 2e 20 20 53 65 74 20 61 6e 20 65  inter.  Set an e
0350: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
0360: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
0370: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 6e 61  the table .** na
0380: 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  me is not found 
0390: 6f 72 20 69 66 20 61 6e 79 20 6f 74 68 65 72 20  or if any other 
03a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
03b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
03c0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
03d0: 74 69 61 6c 69 7a 65 64 20 61 70 70 72 6f 70 72  tialized appropr
03e0: 69 61 74 65 20 69 6e 20 70 53 72 63 3a 0a 2a 2a  iate in pSrc:.**
03f0: 0a 2a 2a 20 20 20 20 70 53 72 63 2d 3e 61 5b 30  .**    pSrc->a[0
0400: 5d 2e 70 54 61 62 20 20 20 20 20 20 20 50 6f 69  ].pTab       Poi
0410: 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
0420: 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 70  e object.**    p
0430: 53 72 63 2d 3e 61 5b 30 5d 2e 70 49 6e 64 65 78  Src->a[0].pIndex
0440: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
0450: 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 69  the INDEXED BY i
0460: 6e 64 65 78 2c 20 69 66 20 74 68 65 72 65 20 69  ndex, if there i
0470: 73 20 6f 6e 65 0a 2a 2a 0a 2a 2f 0a 54 61 62 6c  s one.**.*/.Tabl
0480: 65 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  e *sqlite3SrcLis
0490: 74 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  tLookup(Parse *p
04a0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
04b0: 70 53 72 63 29 7b 0a 20 20 73 74 72 75 63 74 20  pSrc){.  struct 
04c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
04d0: 74 65 6d 20 3d 20 70 53 72 63 2d 3e 61 3b 0a 20  tem = pSrc->a;. 
04e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
04f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 20 26 26  assert( pItem &&
0500: 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29   pSrc->nSrc==1 )
0510: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
0520: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
0530: 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74  m(pParse, 0, pIt
0540: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  em);.  sqlite3De
0550: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
0560: 2d 3e 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  ->db, pItem->pTa
0570: 62 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 54 61  b);.  pItem->pTa
0580: 62 20 3d 20 70 54 61 62 3b 0a 20 20 69 66 28 20  b = pTab;.  if( 
0590: 70 54 61 62 20 29 7b 0a 20 20 20 20 70 54 61 62  pTab ){.    pTab
05a0: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 7d  ->nTabRef++;.  }
05b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e  .  if( sqlite3In
05c0: 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
05d0: 61 72 73 65 2c 20 70 49 74 65 6d 29 20 29 7b 0a  arse, pItem) ){.
05e0: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
05f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
0600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0610: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
0620: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 69 73 20   given table is 
0630: 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 74  writable.  If it
0640: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 61   is not.** writa
0650: 62 6c 65 2c 20 67 65 6e 65 72 61 74 65 20 61 6e  ble, generate an
0660: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
0670: 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
0680: 20 69 74 20 69 73 0a 2a 2a 20 77 72 69 74 61 62   it is.** writab
0690: 6c 65 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a  le return 0;.*/.
06a0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 65 61  int sqlite3IsRea
06b0: 64 4f 6e 6c 79 28 50 61 72 73 65 20 2a 70 50 61  dOnly(Parse *pPa
06c0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
06d0: 2c 20 69 6e 74 20 76 69 65 77 4f 6b 29 7b 0a 20  , int viewOk){. 
06e0: 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 73 20 6e   /* A table is n
06f0: 6f 74 20 77 72 69 74 61 62 6c 65 20 75 6e 64 65  ot writable unde
0700: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
0710: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
0720: 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 49 74   **.  **   1) It
0730: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
0740: 62 6c 65 20 61 6e 64 20 6e 6f 20 69 6d 70 6c 65  ble and no imple
0750: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0760: 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 0a   xUpdate method.
0770: 20 20 2a 2a 20 20 20 20 20 20 68 61 73 20 62 65    **      has be
0780: 65 6e 20 70 72 6f 76 69 64 65 64 2c 20 6f 72 0a  en provided, or.
0790: 20 20 2a 2a 20 20 20 32 29 20 49 74 20 69 73 20    **   2) It is 
07a0: 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 28  a system table (
07b0: 69 2e 65 2e 20 73 71 6c 69 74 65 5f 6d 61 73 74  i.e. sqlite_mast
07c0: 65 72 29 2c 20 74 68 69 73 20 63 61 6c 6c 20 69  er), this call i
07d0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20  s not.  **      
07e0: 70 61 72 74 20 6f 66 20 61 20 6e 65 73 74 65 64  part of a nested
07f0: 20 70 61 72 73 65 20 61 6e 64 20 77 72 69 74 61   parse and writa
0800: 62 6c 65 5f 73 63 68 65 6d 61 20 70 72 61 67 6d  ble_schema pragm
0810: 61 20 68 61 73 20 6e 6f 74 20 0a 20 20 2a 2a 20  a has not .  ** 
0820: 20 20 20 20 20 62 65 65 6e 20 73 70 65 63 69 66       been specif
0830: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ied..  **.  ** I
0840: 6e 20 65 69 74 68 65 72 20 63 61 73 65 20 6c 65  n either case le
0850: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
0860: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20 61  sage in pParse a
0870: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
0880: 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ro..  */.  if( (
0890: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
08a0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
08b0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
08c0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  e->db, pTab)->pM
08d0: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 55 70  od->pModule->xUp
08e0: 64 61 74 65 3d 3d 30 20 29 0a 20 20 20 7c 7c 20  date==0 ).   || 
08f0: 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
0900: 73 20 26 20 54 46 5f 52 65 61 64 6f 6e 6c 79 29  s & TF_Readonly)
0910: 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 50 61  !=0.     && (pPa
0920: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
0930: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
0940: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ema)==0.     && 
0950: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
0960: 30 20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  0 ).  ){.    sql
0970: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0980: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
0990: 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  ay not be modifi
09a0: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
09b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
09c0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
09d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
09e0: 20 69 66 28 20 21 76 69 65 77 4f 6b 20 26 26 20   if( !viewOk && 
09f0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
0a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
0a10: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 63 61 6e  rMsg(pParse,"can
0a20: 6e 6f 74 20 6d 6f 64 69 66 79 20 25 73 20 62 65  not modify %s be
0a30: 63 61 75 73 65 20 69 74 20 69 73 20 61 20 76 69  cause it is a vi
0a40: 65 77 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ew",pTab->zName)
0a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
0a60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
0a70: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 23 69 66 20 21  urn 0;.}...#if !
0a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0a90: 4d 49 54 5f 56 49 45 57 29 20 26 26 20 21 64 65  MIT_VIEW) && !de
0aa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0ab0: 54 5f 54 52 49 47 47 45 52 29 0a 2f 2a 0a 2a 2a  T_TRIGGER)./*.**
0ac0: 20 45 76 61 6c 75 61 74 65 20 61 20 76 69 65 77   Evaluate a view
0ad0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 72   and store its r
0ae0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 70 68 65  esult in an ephe
0af0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  meral table.  Th
0b00: 65 0a 2a 2a 20 70 57 68 65 72 65 20 61 72 67 75  e.** pWhere argu
0b10: 6d 65 6e 74 20 69 73 20 61 6e 20 6f 70 74 69 6f  ment is an optio
0b20: 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
0b30: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 73 20   that restricts 
0b40: 74 68 65 0a 2a 2a 20 73 65 74 20 6f 66 20 72 6f  the.** set of ro
0b50: 77 73 20 69 6e 20 74 68 65 20 76 69 65 77 20 74  ws in the view t
0b60: 68 61 74 20 61 72 65 20 74 6f 20 62 65 20 61 64  hat are to be ad
0b70: 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
0b80: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  eral table..*/.v
0b90: 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 74 65 72  oid sqlite3Mater
0ba0: 69 61 6c 69 7a 65 56 69 65 77 28 0a 20 20 50 61  ializeView(.  Pa
0bb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0bc0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0bd0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
0be0: 20 2a 70 56 69 65 77 2c 20 20 20 20 20 20 20 20   *pView,        
0bf0: 2f 2a 20 56 69 65 77 20 64 65 66 69 6e 69 74 69  /* View definiti
0c00: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  on */.  Expr *pW
0c10: 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  here,        /* 
0c20: 4f 70 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63  Optional WHERE c
0c30: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 64 64 65  lause to be adde
0c40: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
0c50: 2a 70 4f 72 64 65 72 42 79 2c 20 20 2f 2a 20 4f  *pOrderBy,  /* O
0c60: 70 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20 42 59  ptional ORDER BY
0c70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0c80: 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20  r *pLimit,      
0c90: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 4c 49    /* Optional LI
0ca0: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
0cb0: 69 6e 74 20 69 43 75 72 20 20 20 20 20 20 20 20  int iCur        
0cc0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0cd0: 75 6d 62 65 72 20 66 6f 72 20 65 70 68 65 6d 65  umber for epheme
0ce0: 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ral table */.){.
0cf0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
0d00: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
0d10: 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 46  l;.  SrcList *pF
0d20: 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
0d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0d40: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
0d50: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
0d60: 78 28 64 62 2c 20 70 56 69 65 77 2d 3e 70 53 63  x(db, pView->pSc
0d70: 68 65 6d 61 29 3b 0a 20 20 70 57 68 65 72 65 20  hema);.  pWhere 
0d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
0d90: 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  (db, pWhere, 0);
0da0: 0a 20 20 70 46 72 6f 6d 20 3d 20 73 71 6c 69 74  .  pFrom = sqlit
0db0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
0dc0: 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
0dd0: 69 66 28 20 70 46 72 6f 6d 20 29 7b 0a 20 20 20  if( pFrom ){.   
0de0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
0df0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  nSrc==1 );.    p
0e00: 46 72 6f 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  From->a[0].zName
0e10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
0e20: 75 70 28 64 62 2c 20 70 56 69 65 77 2d 3e 7a 4e  up(db, pView->zN
0e30: 61 6d 65 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  ame);.    pFrom-
0e40: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 20  >a[0].zDatabase 
0e50: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
0e60: 70 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44  p(db, db->aDb[iD
0e70: 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b].zDbSName);.  
0e80: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
0e90: 3e 61 5b 30 5d 2e 70 4f 6e 3d 3d 30 20 29 3b 0a  >a[0].pOn==0 );.
0ea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
0eb0: 6d 2d 3e 61 5b 30 5d 2e 70 55 73 69 6e 67 3d 3d  m->a[0].pUsing==
0ec0: 30 20 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 20  0 );.  }.  pSel 
0ed0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
0ee0: 65 77 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  ew(pParse, 0, pF
0ef0: 72 6f 6d 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rom, pWhere, 0, 
0f00: 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  0, pOrderBy, .  
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 20 20 20 20 20 53 46 5f 49 6e 63 6c 75          SF_Inclu
0f30: 64 65 48 69 64 64 65 6e 2c 20 70 4c 69 6d 69 74  deHidden, pLimit
0f40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
0f50: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
0f60: 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
0f70: 69 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  iCur);.  sqlite3
0f80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
0f90: 53 65 6c 2c 20 26 64 65 73 74 29 3b 0a 20 20 73  Sel, &dest);.  s
0fa0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
0fb0: 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 7d 0a  te(db, pSel);.}.
0fc0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
0fd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
0fe0: 49 45 57 29 20 26 26 20 21 64 65 66 69 6e 65 64  IEW) && !defined
0ff0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
1000: 47 47 45 52 29 20 2a 2f 0a 0a 23 69 66 20 64 65  GGER) */..#if de
1010: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1020: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
1030: 45 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66  E_LIMIT) && !def
1040: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1050: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
1060: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 78 70   Generate an exp
1070: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 74 6f 20  ression tree to 
1080: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 57 48  implement the WH
1090: 45 52 45 2c 20 4f 52 44 45 52 20 42 59 2c 0a 2a  ERE, ORDER BY,.*
10a0: 2a 20 61 6e 64 20 4c 49 4d 49 54 2f 4f 46 46 53  * and LIMIT/OFFS
10b0: 45 54 20 70 6f 72 74 69 6f 6e 20 6f 66 20 44 45  ET portion of DE
10c0: 4c 45 54 45 20 61 6e 64 20 55 50 44 41 54 45 20  LETE and UPDATE 
10d0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
10e0: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  *     DELETE FRO
10f0: 4d 20 74 61 62 6c 65 5f 77 78 79 7a 20 57 48 45  M table_wxyz WHE
1100: 52 45 20 61 3c 35 20 4f 52 44 45 52 20 42 59 20  RE a<5 ORDER BY 
1110: 61 20 4c 49 4d 49 54 20 31 3b 0a 2a 2a 20 20 20  a LIMIT 1;.**   
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1140: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1150: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 20 20 20 20 20 20 70 4c 69 6d 69 74 57 68 65         pLimitWhe
1180: 72 65 20 28 70 49 6e 43 6c 61 75 73 65 29 0a 2a  re (pInClause).*
1190: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 4c  /.Expr *sqlite3L
11a0: 69 6d 69 74 57 68 65 72 65 28 0a 20 20 50 61 72  imitWhere(.  Par
11b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
11e0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
11f0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
1200: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
1210: 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61  ause -- which ta
1220: 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  bles to scan */.
1230: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1250: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1260: 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c  se.  May be null
1270: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1280: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
1290: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
12a0: 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
12b0: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70  be null */.  Exp
12c0: 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20  r *pLimit,      
12d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12e0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 20   LIMIT clause.  
12f0: 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20  May be null */. 
1300: 20 63 68 61 72 20 2a 7a 53 74 6d 74 54 79 70 65   char *zStmtType
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1320: 20 45 69 74 68 65 72 20 44 45 4c 45 54 45 20 6f   Either DELETE o
1330: 72 20 55 50 44 41 54 45 2e 20 20 46 6f 72 20 65  r UPDATE.  For e
1340: 72 72 20 6d 73 67 73 2e 20 2a 2f 0a 29 7b 0a 20  rr msgs. */.){. 
1350: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1360: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
1370: 72 20 2a 70 4c 68 73 20 3d 20 4e 55 4c 4c 3b 20  r *pLhs = NULL; 
1380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53            /* LHS
1390: 20 6f 66 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   of IN(SELECT...
13a0: 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  ) operator */.  
13b0: 45 78 70 72 20 2a 70 49 6e 43 6c 61 75 73 65 20  Expr *pInClause 
13c0: 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 2f 2a 20  = NULL;      /* 
13d0: 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28  WHERE rowid IN (
13e0: 20 73 65 6c 65 63 74 20 29 20 2a 2f 0a 20 20 45   select ) */.  E
13f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1400: 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 45  = NULL;     /* E
1410: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
1420: 6f 6e 74 61 6e 69 6e 67 20 6f 6e 6c 79 20 70 53  ontaning only pS
1430: 65 6c 65 63 74 52 6f 77 69 64 20 2a 2f 0a 20 20  electRowid */.  
1440: 53 72 63 4c 69 73 74 20 2a 70 53 65 6c 65 63 74  SrcList *pSelect
1450: 53 72 63 20 3d 20 4e 55 4c 4c 3b 20 20 2f 2a 20  Src = NULL;  /* 
1460: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
1470: 4d 20 78 20 2e 2e 2e 20 28 64 75 70 20 6f 66 20  M x ... (dup of 
1480: 70 53 72 63 29 20 2a 2f 0a 20 20 53 65 6c 65 63  pSrc) */.  Selec
1490: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 4e 55 4c  t *pSelect = NUL
14a0: 4c 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c  L;      /* Compl
14b0: 65 74 65 20 53 45 4c 45 43 54 20 74 72 65 65 20  ete SELECT tree 
14c0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
14d0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
14e0: 61 74 20 74 68 65 72 65 20 69 73 6e 27 74 20 61  at there isn't a
14f0: 6e 20 4f 52 44 45 52 20 42 59 20 77 69 74 68 6f  n ORDER BY witho
1500: 75 74 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ut a LIMIT claus
1510: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1520: 72 64 65 72 42 79 20 26 26 20 70 4c 69 6d 69 74  rderBy && pLimit
1530: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ==0 ) {.    sqli
1540: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1550: 73 65 2c 20 22 4f 52 44 45 52 20 42 59 20 77 69  se, "ORDER BY wi
1560: 74 68 6f 75 74 20 4c 49 4d 49 54 20 6f 6e 20 25  thout LIMIT on %
1570: 73 22 2c 20 7a 53 74 6d 74 54 79 70 65 29 3b 0a  s", zStmtType);.
1580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1590: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
15a0: 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  , pWhere);.    s
15b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
15c0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
15d0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
15e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
15f0: 20 2f 2a 20 57 65 20 6f 6e 6c 79 20 6e 65 65 64   /* We only need
1600: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 73   to generate a s
1610: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
1620: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
1630: 73 20 61 20 6c 69 6d 69 74 2f 6f 66 66 73 65 74  s a limit/offset
1640: 20 74 65 72 6d 20 74 6f 20 65 6e 66 6f 72 63 65   term to enforce
1650: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
1660: 6d 69 74 20 3d 3d 20 30 20 29 20 7b 0a 20 20 20  mit == 0 ) {.   
1670: 20 72 65 74 75 72 6e 20 70 57 68 65 72 65 3b 0a   return pWhere;.
1680: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1690: 74 65 20 61 20 73 65 6c 65 63 74 20 65 78 70 72  te a select expr
16a0: 65 73 73 69 6f 6e 20 74 72 65 65 20 74 6f 20 65  ession tree to e
16b0: 6e 66 6f 72 63 65 20 74 68 65 20 6c 69 6d 69 74  nforce the limit
16c0: 2f 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 74 65  /offset .  ** te
16d0: 72 6d 20 66 6f 72 20 74 68 65 20 44 45 4c 45 54  rm for the DELET
16e0: 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
16f0: 65 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78 61 6d  ement.  For exam
1700: 70 6c 65 3a 0a 20 20 2a 2a 20 20 20 44 45 4c 45  ple:.  **   DELE
1710: 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f 61 20  TE FROM table_a 
1720: 57 48 45 52 45 20 63 6f 6c 31 3d 31 20 4f 52 44  WHERE col1=1 ORD
1730: 45 52 20 42 59 20 63 6f 6c 32 20 4c 49 4d 49 54  ER BY col2 LIMIT
1740: 20 31 20 4f 46 46 53 45 54 20 31 0a 20 20 2a 2a   1 OFFSET 1.  **
1750: 20 62 65 63 6f 6d 65 73 3a 0a 20 20 2a 2a 20 20   becomes:.  **  
1760: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 61 62   DELETE FROM tab
1770: 6c 65 5f 61 20 57 48 45 52 45 20 72 6f 77 69 64  le_a WHERE rowid
1780: 20 49 4e 20 28 20 0a 20 20 2a 2a 20 20 20 20 20   IN ( .  **     
1790: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
17a0: 4d 20 74 61 62 6c 65 5f 61 20 57 48 45 52 45 20  M table_a WHERE 
17b0: 63 6f 6c 31 3d 31 20 4f 52 44 45 52 20 42 59 20  col1=1 ORDER BY 
17c0: 63 6f 6c 32 20 4c 49 4d 49 54 20 31 20 4f 46 46  col2 LIMIT 1 OFF
17d0: 53 45 54 20 31 0a 20 20 2a 2a 20 20 20 29 3b 0a  SET 1.  **   );.
17e0: 20 20 2a 2f 0a 0a 20 20 70 54 61 62 20 3d 20 70    */..  pTab = p
17f0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
1800: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1810: 54 61 62 29 20 29 7b 0a 20 20 20 20 70 4c 68 73  Tab) ){.    pLhs
1820: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1830: 70 50 61 72 73 65 2c 20 54 4b 5f 52 4f 57 2c 20  pParse, TK_ROW, 
1840: 30 2c 20 30 29 3b 0a 20 20 20 20 70 45 4c 69 73  0, 0);.    pELis
1850: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1860: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 20 20 20  istAppend(.     
1870: 20 20 20 70 50 61 72 73 65 2c 20 30 2c 20 73 71     pParse, 0, sq
1880: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1890: 65 2c 20 54 4b 5f 52 4f 57 2c 20 30 2c 20 30 29  e, TK_ROW, 0, 0)
18a0: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
18b0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20  .    Index *pPk 
18c0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
18d0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
18e0: 20 20 20 20 69 66 28 20 70 50 6b 2d 3e 6e 4b 65      if( pPk->nKe
18f0: 79 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  yCol==1 ){.     
1900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1910: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1920: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  pPk->aiColumn[0]
1930: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ].zName;.      p
1940: 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Lhs = sqlite3Exp
1950: 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
1960: 6d 65 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73  me);.      pELis
1970: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1980: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1990: 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
19a0: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
19b0: 65 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e));.    }else{.
19c0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
19d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
19e0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  k->nKeyCol; i++)
19f0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1a00: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  p = sqlite3Expr(
1a10: 64 62 2c 20 54 4b 5f 49 44 2c 20 70 54 61 62 2d  db, TK_ID, pTab-
1a20: 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c  >aCol[pPk->aiCol
1a30: 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 3b 0a  umn[i]].zName);.
1a40: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
1a50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a60: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1a70: 45 4c 69 73 74 2c 20 70 29 3b 0a 20 20 20 20 20  EList, p);.     
1a80: 20 7d 0a 20 20 20 20 20 20 70 4c 68 73 20 3d 20   }.      pLhs = 
1a90: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1aa0: 72 73 65 2c 20 54 4b 5f 56 45 43 54 4f 52 2c 20  rse, TK_VECTOR, 
1ab0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1ac0: 20 70 4c 68 73 20 29 7b 0a 20 20 20 20 20 20 20   pLhs ){.       
1ad0: 20 70 4c 68 73 2d 3e 78 2e 70 4c 69 73 74 20 3d   pLhs->x.pList =
1ae0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1af0: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
1b00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1b10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 64 75 70 6c  }.  }..  /* dupl
1b20: 69 63 61 74 65 20 74 68 65 20 46 52 4f 4d 20 63  icate the FROM c
1b30: 6c 61 75 73 65 20 61 73 20 69 74 20 69 73 20 6e  lause as it is n
1b40: 65 65 64 65 64 20 62 79 20 62 6f 74 68 20 74 68  eeded by both th
1b50: 65 20 44 45 4c 45 54 45 2f 55 50 44 41 54 45 20  e DELETE/UPDATE 
1b60: 74 72 65 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  tree.  ** and th
1b70: 65 20 53 45 4c 45 43 54 20 73 75 62 74 72 65 65  e SELECT subtree
1b80: 2e 20 2a 2f 0a 20 20 70 53 72 63 2d 3e 61 5b 30  . */.  pSrc->a[0
1b90: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 70 53  ].pTab = 0;.  pS
1ba0: 65 6c 65 63 74 53 72 63 20 3d 20 73 71 6c 69 74  electSrc = sqlit
1bb0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 50 61  e3SrcListDup(pPa
1bc0: 72 73 65 2d 3e 64 62 2c 20 70 53 72 63 2c 20 30  rse->db, pSrc, 0
1bd0: 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  );.  pSrc->a[0].
1be0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70  pTab = pTab;.  p
1bf0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 49 42 49 6e 64  Src->a[0].pIBInd
1c00: 65 78 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 67 65  ex = 0;..  /* ge
1c10: 6e 65 72 61 74 65 20 74 68 65 20 53 45 4c 45 43  nerate the SELEC
1c20: 54 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  T expression tre
1c30: 65 2e 20 2a 2f 0a 20 20 70 53 65 6c 65 63 74 20  e. */.  pSelect 
1c40: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
1c50: 65 77 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ew(pParse, pELis
1c60: 74 2c 20 70 53 65 6c 65 63 74 53 72 63 2c 20 70  t, pSelectSrc, p
1c70: 57 68 65 72 65 2c 20 30 20 2c 30 2c 20 0a 20 20  Where, 0 ,0, .  
1c80: 20 20 20 20 70 4f 72 64 65 72 42 79 2c 30 2c 70      pOrderBy,0,p
1c90: 4c 69 6d 69 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a  Limit.  );..  /*
1ca0: 20 6e 6f 77 20 67 65 6e 65 72 61 74 65 20 74 68   now generate th
1cb0: 65 20 6e 65 77 20 57 48 45 52 45 20 72 6f 77 69  e new WHERE rowi
1cc0: 64 20 49 4e 20 63 6c 61 75 73 65 20 66 6f 72 20  d IN clause for 
1cd0: 74 68 65 20 44 45 4c 45 54 45 2f 55 44 50 41 54  the DELETE/UDPAT
1ce0: 45 20 2a 2f 0a 20 20 70 49 6e 43 6c 61 75 73 65  E */.  pInClause
1cf0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1d00: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
1d10: 4c 68 73 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Lhs, 0);.  sqlit
1d20: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
1d30: 28 70 50 61 72 73 65 2c 20 70 49 6e 43 6c 61 75  (pParse, pInClau
1d40: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
1d50: 72 65 74 75 72 6e 20 70 49 6e 43 6c 61 75 73 65  return pInClause
1d60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1d70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d80: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
1d90: 45 5f 4c 49 4d 49 54 29 20 2a 2f 0a 20 20 20 20  E_LIMIT) */.    
1da0: 20 20 20 2f 2a 20 20 20 20 20 20 26 26 20 21 64     /*      && !d
1db0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1dc0: 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a  IT_SUBQUERY) */.
1dd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1de0: 63 6f 64 65 20 66 6f 72 20 61 20 44 45 4c 45 54  code for a DELET
1df0: 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74  E FROM statement
1e00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  ..**.**     DELE
1e10: 54 45 20 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78  TE FROM table_wx
1e20: 79 7a 20 57 48 45 52 45 20 61 3c 35 20 41 4e 44  yz WHERE a<5 AND
1e30: 20 62 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20   b NOT NULL;.** 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  \________/      
1e60: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1e70: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
1e80: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
1ea0: 68 65 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  here.*/.void sql
1eb0: 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 0a  ite3DeleteFrom(.
1ec0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ee0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1ef0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1f00: 62 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  bList,     /* Th
1f10: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
1f20: 63 68 20 77 65 20 73 68 6f 75 6c 64 20 64 65 6c  ch we should del
1f30: 65 74 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20  ete things */.  
1f40: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
1f50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1f60: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
1f70: 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78   be null */.  Ex
1f80: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1f90: 2c 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  ,    /* ORDER BY
1fa0: 20 63 6c 61 75 73 65 2e 20 4d 61 79 20 62 65 20   clause. May be 
1fb0: 6e 75 6c 6c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  null */.  Expr *
1fc0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
1fd0: 20 2f 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   /* LIMIT clause
1fe0: 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f  . May be null */
1ff0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  .){.  Vdbe *v;  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2010: 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
2020: 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
2030: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
2040: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2050: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
2060: 72 65 63 6f 72 64 73 20 77 69 6c 6c 20 62 65 20  records will be 
2070: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
2080: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2090: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20a0: 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
20b0: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
20c0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
20d0: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
20e0: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
20f0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2100: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2110: 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20 6f 66   over indices of
2120: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2130: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
2140: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2150: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2160: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2170: 44 61 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20  DataCur = 0;    
2180: 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
2190: 20 66 6f 72 20 74 68 65 20 63 61 6e 6f 6e 69 63   for the canonic
21a0: 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a  al data source *
21b0: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
21c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 43 75  = 0;       /* Cu
21d0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
21e0: 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 20 2a  he first index *
21f0: 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20  /.  int nIdx;   
2200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2210: 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20  mber of indices 
2220: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2230: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
2240: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
2250: 75 63 74 75 72 65 20 2a 2f 0a 20 20 41 75 74 68  ucture */.  Auth
2260: 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74  Context sContext
2270: 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74  ;  /* Authorizat
2280: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
2290: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
22a0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
22b0: 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 6f 6c  context to resol
22c0: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
22d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
2300: 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74   */.  int memCnt
2310: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20   = -1;       /* 
2320: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64  Memory cell used
2330: 20 66 6f 72 20 63 68 61 6e 67 65 20 63 6f 75 6e   for change coun
2340: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ting */.  int rc
2350: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
2360: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
2370: 65 64 20 62 79 20 61 75 74 68 6f 72 69 7a 61 74  ed by authorizat
2380: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ion callback */.
2390: 20 20 69 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20    int eOnePass; 
23a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50           /* ONEP
23b0: 41 53 53 5f 4f 46 46 20 6f 72 20 5f 53 49 4e 47  ASS_OFF or _SING
23c0: 4c 45 20 6f 72 20 5f 4d 55 4c 54 49 20 2a 2f 0a  LE or _MULTI */.
23d0: 20 20 69 6e 74 20 61 69 43 75 72 4f 6e 65 50 61    int aiCurOnePa
23e0: 73 73 5b 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20  ss[2];   /* The 
23f0: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 6f 70  write cursors op
2400: 65 6e 65 64 20 62 79 20 57 48 45 52 45 5f 4f 4e  ened by WHERE_ON
2410: 45 50 41 53 53 20 2a 2f 0a 20 20 75 38 20 2a 61  EPASS */.  u8 *a
2420: 54 6f 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  ToOpen = 0;     
2430: 20 20 2f 2a 20 4f 70 65 6e 20 63 75 72 73 6f 72    /* Open cursor
2440: 20 69 54 61 62 43 75 72 2b 6a 20 69 66 20 61 54   iTabCur+j if aT
2450: 6f 4f 70 65 6e 5b 6a 5d 20 69 73 20 74 72 75 65  oOpen[j] is true
2460: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
2470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2480: 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  The PRIMARY KEY 
2490: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
24a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 20  le */.  int iPk 
24b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
24c0: 2a 20 46 69 72 73 74 20 6f 66 20 6e 50 6b 20 72  * First of nPk r
24d0: 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
24e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61 6c   PRIMARY KEY val
24f0: 75 65 20 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 20  ue */.  i16 nPk 
2500: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
2510: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2520: 6d 6e 73 20 69 6e 20 74 68 65 20 50 52 49 4d 41  mns in the PRIMA
2530: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20  RY KEY */.  int 
2540: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
2550: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
2560: 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 6f 66  l holding key of
2570: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
2580: 65 64 20 2a 2f 0a 20 20 69 31 36 20 6e 4b 65 79  ed */.  i16 nKey
2590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
25b0: 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ry cells in the 
25c0: 72 6f 77 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  row key */.  int
25d0: 20 69 45 70 68 43 75 72 20 3d 20 30 3b 20 20 20   iEphCur = 0;   
25e0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
25f0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61   table holding a
2600: 6c 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  ll primary key v
2610: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2620: 52 6f 77 53 65 74 20 3d 20 30 3b 20 20 20 20 20  RowSet = 0;     
2630: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
2640: 72 20 72 6f 77 73 65 74 20 6f 66 20 72 6f 77 73  r rowset of rows
2650: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
2660: 69 6e 74 20 61 64 64 72 42 79 70 61 73 73 20 3d  int addrBypass =
2670: 20 30 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73   0;    /* Addres
2680: 73 20 6f 66 20 6a 75 6d 70 20 6f 76 65 72 20 74  s of jump over t
2690: 68 65 20 64 65 6c 65 74 65 20 6c 6f 67 69 63 20  he delete logic 
26a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
26b0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  p = 0;      /* T
26c0: 6f 70 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  op of the delete
26d0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
26e0: 64 64 72 45 70 68 4f 70 65 6e 20 3d 20 30 3b 20  ddrEphOpen = 0; 
26f0: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
2700: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 45 70 68   to open the Eph
2710: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  emeral table */.
2720: 20 20 69 6e 74 20 62 43 6f 6d 70 6c 65 78 3b 20    int bComplex; 
2730: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2740: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74 72   if there are tr
2750: 69 67 67 65 72 73 20 6f 72 20 46 4b 73 20 6f 72  iggers or FKs or
2760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2770: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62            ** sub
2780: 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 57  queries in the W
2790: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
27a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27b0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69  OMIT_TRIGGER.  i
27c0: 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20 20 20  nt isView;      
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 72 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e  rue if attemptin
27f0: 67 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  g to delete from
2800: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 54 72 69   a view */.  Tri
2810: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 20  gger *pTrigger; 
2820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
2830: 74 20 6f 66 20 74 61 62 6c 65 20 74 72 69 67 67  t of table trigg
2840: 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2850: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65   */.#endif..  me
2860: 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20  mset(&sContext, 
2870: 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65  0, sizeof(sConte
2880: 78 74 29 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  xt));.  db = pPa
2890: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
28a0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
28b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28c0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  ){.    goto dele
28d0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
28e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2900: 20 29 3b 0a 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74   );...  /* Locat
2910: 65 20 74 68 65 20 74 61 62 6c 65 20 77 68 69 63  e the table whic
2920: 68 20 77 65 20 77 61 6e 74 20 74 6f 20 64 65 6c  h we want to del
2930: 65 74 65 2e 20 20 54 68 69 73 20 74 61 62 6c 65  ete.  This table
2940: 20 68 61 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20   has to be.  ** 
2950: 70 75 74 20 69 6e 20 61 6e 20 53 72 63 4c 69 73  put in an SrcLis
2960: 74 20 73 74 72 75 63 74 75 72 65 20 62 65 63 61  t structure beca
2970: 75 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  use some of the 
2980: 73 75 62 72 6f 75 74 69 6e 65 73 20 77 65 0a 20  subroutines we. 
2990: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c   ** will be call
29a0: 69 6e 67 20 61 72 65 20 64 65 73 69 67 6e 65 64  ing are designed
29b0: 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20 6d 75   to work with mu
29c0: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 6e  ltiple tables an
29d0: 64 20 65 78 70 65 63 74 0a 20 20 2a 2a 20 61 6e  d expect.  ** an
29e0: 20 53 72 63 4c 69 73 74 2a 20 70 61 72 61 6d 65   SrcList* parame
29f0: 74 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 6a  ter instead of j
2a00: 75 73 74 20 61 20 54 61 62 6c 65 2a 20 70 61 72  ust a Table* par
2a10: 61 6d 65 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ameter..  */.  p
2a20: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
2a30: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
2a40: 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  e, pTabList);.  
2a50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 20 67  if( pTab==0 )  g
2a60: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
2a70: 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 46  cleanup;..  /* F
2a80: 69 67 75 72 65 20 6f 75 74 20 69 66 20 77 65 20  igure out if we 
2a90: 68 61 76 65 20 61 6e 79 20 74 72 69 67 67 65 72  have any trigger
2aa0: 73 20 61 6e 64 20 69 66 20 74 68 65 20 74 61 62  s and if the tab
2ab0: 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 65  le being.  ** de
2ac0: 6c 65 74 65 64 20 66 72 6f 6d 20 69 73 20 61 20  leted from is a 
2ad0: 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  view.  */.#ifnde
2ae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
2af0: 49 47 47 45 52 0a 20 20 70 54 72 69 67 67 65 72  IGGER.  pTrigger
2b00: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
2b10: 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20  rsExist(pParse, 
2b20: 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c  pTab, TK_DELETE,
2b30: 20 30 2c 20 30 29 3b 0a 20 20 69 73 56 69 65 77   0, 0);.  isView
2b40: 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74   = pTab->pSelect
2b50: 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0;.#else.# def
2b60: 69 6e 65 20 70 54 72 69 67 67 65 72 20 30 0a 23  ine pTrigger 0.#
2b70: 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20 30   define isView 0
2b80: 0a 23 65 6e 64 69 66 0a 20 20 62 43 6f 6d 70 6c  .#endif.  bCompl
2b90: 65 78 20 3d 20 70 54 72 69 67 67 65 72 20 7c 7c  ex = pTrigger ||
2ba0: 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72   sqlite3FkRequir
2bb0: 65 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ed(pParse, pTab,
2bc0: 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
2bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
2be0: 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23  # undef isView.#
2bf0: 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20 30   define isView 0
2c00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2c10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
2c20: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
2c30: 54 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  T.  if( !isView 
2c40: 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
2c50: 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72  sqlite3LimitWher
2c60: 65 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  e(.        pPars
2c70: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2c80: 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  ere, pOrderBy, p
2c90: 4c 69 6d 69 74 2c 20 22 44 45 4c 45 54 45 22 0a  Limit, "DELETE".
2ca0: 20 20 20 20 29 3b 0a 20 20 20 20 70 4f 72 64 65      );.    pOrde
2cb0: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69  rBy = 0;.    pLi
2cc0: 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  mit = 0;.  }.#en
2cd0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61  dif..  /* If pTa
2ce0: 62 20 69 73 20 72 65 61 6c 6c 79 20 61 20 76 69  b is really a vi
2cf0: 65 77 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  ew, make sure it
2d00: 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61   has been initia
2d10: 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
2d20: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
2d30: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2d40: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
2d50: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
2d60: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  m_cleanup;.  }..
2d70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
2d80: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
2d90: 70 54 61 62 2c 20 28 70 54 72 69 67 67 65 72 3f  pTab, (pTrigger?
2da0: 31 3a 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  1:0)) ){.    got
2db0: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
2dc0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62  eanup;.  }.  iDb
2dd0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2de0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2df0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
2e00: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
2e10: 62 20 29 3b 0a 20 20 72 63 61 75 74 68 20 3d 20  b );.  rcauth = 
2e20: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2e30: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2e40: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
2e50: 61 6d 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ame, 0, .       
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
2e80: 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 61  ].zDbSName);.  a
2e90: 73 73 65 72 74 28 20 72 63 61 75 74 68 3d 3d 53  ssert( rcauth==S
2ea0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 61 75  QLITE_OK || rcau
2eb0: 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20  th==SQLITE_DENY 
2ec0: 7c 7c 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54  || rcauth==SQLIT
2ed0: 45 5f 49 47 4e 4f 52 45 20 29 3b 0a 20 20 69 66  E_IGNORE );.  if
2ee0: 28 20 72 63 61 75 74 68 3d 3d 53 51 4c 49 54 45  ( rcauth==SQLITE
2ef0: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 67 6f 74  _DENY ){.    got
2f00: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
2f10: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73  eanup;.  }.  ass
2f20: 65 72 74 28 21 69 73 56 69 65 77 20 7c 7c 20 70  ert(!isView || p
2f30: 54 72 69 67 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  Trigger);..  /* 
2f40: 41 73 73 69 67 6e 20 63 75 72 73 6f 72 20 6e 75  Assign cursor nu
2f50: 6d 62 65 72 73 20 74 6f 20 74 68 65 20 74 61 62  mbers to the tab
2f60: 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 69  le and all its i
2f70: 6e 64 69 63 65 73 2e 0a 20 20 2a 2f 0a 20 20 61  ndices..  */.  a
2f80: 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d  ssert( pTabList-
2f90: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 54  >nSrc==1 );.  iT
2fa0: 61 62 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74  abCur = pTabList
2fb0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
2fc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2fd0: 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70  .  for(nIdx=0, p
2fe0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2ff0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
3000: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
3010: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
3020: 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Tab++;.  }..  /*
3030: 20 53 74 61 72 74 20 74 68 65 20 76 69 65 77 20   Start the view 
3040: 63 6f 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69  context.  */.  i
3050: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
3060: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
3070: 65 78 74 50 75 73 68 28 70 50 61 72 73 65 2c 20  extPush(pParse, 
3080: 26 73 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d  &sContext, pTab-
3090: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  >zName);.  }..  
30a0: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
30b0: 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
30c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
30d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
30e0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( v==0 ){.    g
30f0: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
3100: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
3110: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
3120: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
3130: 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76  beCountChanges(v
3140: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
3150: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
3160: 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
3170: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
3180: 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
3190: 65 20 66 72 6f 6d 20 61 20 76 69 65 77 2c 20 72  e from a view, r
31a0: 65 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77  ealize that view
31b0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20 65 70   into.  ** an ep
31c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
31d0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
31e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
31f0: 57 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  W) && !defined(S
3200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3210: 45 52 29 0a 20 20 69 66 28 20 69 73 56 69 65 77  ER).  if( isView
3220: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
3230: 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70  aterializeView(p
3240: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 0a 20 20  Parse, pTab, .  
3250: 20 20 20 20 20 20 70 57 68 65 72 65 2c 20 70 4f        pWhere, pO
3260: 72 64 65 72 42 79 2c 20 70 4c 69 6d 69 74 2c 20  rderBy, pLimit, 
3270: 69 54 61 62 43 75 72 0a 20 20 20 20 29 3b 0a 20  iTabCur.    );. 
3280: 20 20 20 69 44 61 74 61 43 75 72 20 3d 20 69 49     iDataCur = iI
3290: 64 78 43 75 72 20 3d 20 69 54 61 62 43 75 72 3b  dxCur = iTabCur;
32a0: 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
32b0: 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  0;.    pLimit = 
32c0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
32d0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
32e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20  column names in 
32f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3300: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
3310: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
3320: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
3330: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
3340: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
3350: 54 61 62 4c 69 73 74 3b 0a 20 20 69 66 28 20 73  TabList;.  if( s
3360: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
3370: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68  rNames(&sNC, pWh
3380: 65 72 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ere) ){.    goto
3390: 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65   delete_from_cle
33a0: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
33b0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
33c0: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
33d0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c  mber of rows del
33e0: 65 74 65 64 2c 20 69 66 0a 20 20 2a 2a 20 77 65  eted, if.  ** we
33f0: 20 61 72 65 20 63 6f 75 6e 74 69 6e 67 20 72 6f   are counting ro
3400: 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ws..  */.  if( d
3410: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
3420: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20  E_CountRows ){. 
3430: 20 20 20 6d 65 6d 43 6e 74 20 3d 20 2b 2b 70 50     memCnt = ++pP
3440: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3460: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
3470: 20 30 2c 20 6d 65 6d 43 6e 74 29 3b 0a 20 20 7d   0, memCnt);.  }
3480: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3490: 5f 4f 4d 49 54 5f 54 52 55 4e 43 41 54 45 5f 4f  _OMIT_TRUNCATE_O
34a0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
34b0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 41   Special case: A
34c0: 20 44 45 4c 45 54 45 20 77 69 74 68 6f 75 74 20   DELETE without 
34d0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  a WHERE clause d
34e0: 65 6c 65 74 65 73 20 65 76 65 72 79 74 68 69 6e  eletes everythin
34f0: 67 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 65 61  g..  ** It is ea
3500: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 65 72 61  sier just to era
3510: 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  se the whole tab
3520: 6c 65 2e 20 50 72 69 6f 72 20 74 6f 20 76 65 72  le. Prior to ver
3530: 73 69 6f 6e 20 33 2e 36 2e 35 2c 0a 20 20 2a 2a  sion 3.6.5,.  **
3540: 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
3550: 6f 6e 20 63 61 75 73 65 64 20 74 68 65 20 72 6f  on caused the ro
3560: 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 28  w change count (
3570: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3580: 65 64 20 62 79 20 0a 20 20 2a 2a 20 41 50 49 20  ed by .  ** API 
3590: 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
35a0: 5f 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 20  _count_changes) 
35b0: 74 6f 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  to be set incorr
35c0: 65 63 74 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ectly..  **.  **
35d0: 20 54 68 65 20 22 72 63 61 75 74 68 3d 3d 53 51   The "rcauth==SQ
35e0: 4c 49 54 45 5f 4f 4b 22 20 74 65 72 6d 73 20 69  LITE_OK" terms i
35f0: 73 20 74 68 65 0a 20 20 2a 2a 20 49 4d 50 4c 45  s the.  ** IMPLE
3600: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
3610: 31 37 32 32 38 2d 33 37 31 32 34 20 49 66 20 74  17228-37124 If t
3620: 68 65 20 61 63 74 69 6f 6e 20 63 6f 64 65 20 69  he action code i
3630: 73 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  s SQLITE_DELETE 
3640: 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c  and.  ** the cal
3650: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 53 51  lback returns SQ
3660: 4c 49 54 45 5f 49 47 4e 4f 52 45 20 74 68 65 6e  LITE_IGNORE then
3670: 20 74 68 65 20 44 45 4c 45 54 45 20 6f 70 65 72   the DELETE oper
3680: 61 74 69 6f 6e 20 70 72 6f 63 65 65 64 73 20 62  ation proceeds b
3690: 75 74 0a 20 20 2a 2a 20 74 68 65 20 74 72 75 6e  ut.  ** the trun
36a0: 63 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  cate optimizatio
36b0: 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  n is disabled an
36c0: 64 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 64  d all rows are d
36d0: 65 6c 65 74 65 64 0a 20 20 2a 2a 20 69 6e 64 69  eleted.  ** indi
36e0: 76 69 64 75 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  vidually..  */. 
36f0: 20 69 66 28 20 72 63 61 75 74 68 3d 3d 53 51 4c   if( rcauth==SQL
3700: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 57 68  ITE_OK.   && pWh
3710: 65 72 65 3d 3d 30 0a 20 20 20 26 26 20 21 62 43  ere==0.   && !bC
3720: 6f 6d 70 6c 65 78 0a 20 20 20 26 26 20 21 49 73  omplex.   && !Is
3730: 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 23 69  Virtual(pTab).#i
3740: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3750: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
3760: 4b 0a 20 20 20 26 26 20 64 62 2d 3e 78 50 72 65  K.   && db->xPre
3770: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 3d 3d  UpdateCallback==
3780: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
3790: 20 20 61 73 73 65 72 74 28 20 21 69 73 56 69 65    assert( !isVie
37a0: 77 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  w );.    sqlite3
37b0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
37c0: 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
37d0: 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
37e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52  e);.    if( HasR
37f0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
3800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3810: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp4(v, OP_Clea
3820: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  r, pTab->tnum, i
3830: 44 62 2c 20 6d 65 6d 43 6e 74 2c 0a 20 20 20 20  Db, memCnt,.    
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
3860: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
3870: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
3880: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
3890: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
38a0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
38b0: 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
38c0: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
38d0: 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a );.      sqlit
38e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
38f0: 4f 50 5f 43 6c 65 61 72 2c 20 70 49 64 78 2d 3e  OP_Clear, pIdx->
3900: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
3910: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
3920: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3930: 54 52 55 4e 43 41 54 45 5f 4f 50 54 49 4d 49 5a  TRUNCATE_OPTIMIZ
3940: 41 54 49 4f 4e 20 2a 2f 0a 20 20 7b 0a 20 20 20  ATION */.  {.   
3950: 20 75 31 36 20 77 63 66 20 3d 20 57 48 45 52 45   u16 wcf = WHERE
3960: 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
3970: 7c 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45  |WHERE_DUPLICATE
3980: 53 5f 4f 4b 7c 57 48 45 52 45 5f 53 45 45 4b 5f  S_OK|WHERE_SEEK_
3990: 54 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 73  TABLE;.    if( s
39a0: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  NC.ncFlags & NC_
39b0: 56 61 72 53 65 6c 65 63 74 20 29 20 62 43 6f 6d  VarSelect ) bCom
39c0: 70 6c 65 78 20 3d 20 31 3b 0a 20 20 20 20 77 63  plex = 1;.    wc
39d0: 66 20 7c 3d 20 28 62 43 6f 6d 70 6c 65 78 20 3f  f |= (bComplex ?
39e0: 20 30 20 3a 20 57 48 45 52 45 5f 4f 4e 45 50 41   0 : WHERE_ONEPA
39f0: 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3b 0a 20 20  SS_MULTIROW);.  
3a00: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
3a10: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
3a20: 20 46 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62   For a rowid tab
3a30: 6c 65 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  le, initialize t
3a40: 68 65 20 52 6f 77 53 65 74 20 74 6f 20 61 6e 20  he RowSet to an 
3a50: 65 6d 70 74 79 20 73 65 74 20 2a 2f 0a 20 20 20  empty set */.   
3a60: 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20     pPk = 0;.    
3a70: 20 20 6e 50 6b 20 3d 20 31 3b 0a 20 20 20 20 20    nPk = 1;.     
3a80: 20 69 52 6f 77 53 65 74 20 3d 20 2b 2b 70 50 61   iRowSet = ++pPa
3a90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
3aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ab0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
3ac0: 2c 20 69 52 6f 77 53 65 74 29 3b 0a 20 20 20 20  , iRowSet);.    
3ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
3ae0: 46 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  For a WITHOUT RO
3af0: 57 49 44 20 74 61 62 6c 65 2c 20 63 72 65 61 74  WID table, creat
3b00: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
3b10: 61 62 6c 65 20 75 73 65 64 20 74 6f 0a 20 20 20  able used to.   
3b20: 20 20 20 2a 2a 20 68 6f 6c 64 20 61 6c 6c 20 70     ** hold all p
3b30: 72 69 6d 61 72 79 20 6b 65 79 73 20 66 6f 72 20  rimary keys for 
3b40: 72 6f 77 73 20 74 6f 20 62 65 20 64 65 6c 65 74  rows to be delet
3b50: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 6b  ed. */.      pPk
3b60: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
3b70: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
3b80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3b90: 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  Pk!=0 );.      n
3ba0: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
3bb0: 6c 3b 0a 20 20 20 20 20 20 69 50 6b 20 3d 20 70  l;.      iPk = p
3bc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
3bd0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
3be0: 6d 20 2b 3d 20 6e 50 6b 3b 0a 20 20 20 20 20 20  m += nPk;.      
3bf0: 69 45 70 68 43 75 72 20 3d 20 70 50 61 72 73 65  iEphCur = pParse
3c00: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
3c10: 61 64 64 72 45 70 68 4f 70 65 6e 20 3d 20 73 71  addrEphOpen = sq
3c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3c30: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
3c40: 72 61 6c 2c 20 69 45 70 68 43 75 72 2c 20 6e 50  ral, iEphCur, nP
3c50: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
3c60: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
3c70: 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a  o(pParse, pPk);.
3c80: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
3c90: 43 6f 6e 73 74 72 75 63 74 20 61 20 71 75 65 72  Construct a quer
3ca0: 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 6f  y to find the ro
3cb0: 77 69 64 20 6f 72 20 70 72 69 6d 61 72 79 20 6b  wid or primary k
3cc0: 65 79 20 66 6f 72 20 65 76 65 72 79 20 72 6f 77  ey for every row
3cd0: 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  .    ** to be de
3ce0: 6c 65 74 65 64 2c 20 62 61 73 65 64 20 6f 6e 20  leted, based on 
3cf0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d00: 2e 20 53 65 74 20 76 61 72 69 61 62 6c 65 20 65  . Set variable e
3d10: 4f 6e 65 50 61 73 73 0a 20 20 20 20 2a 2a 20 74  OnePass.    ** t
3d20: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 73  o indicate the s
3d30: 74 72 61 74 65 67 79 20 75 73 65 64 20 74 6f 20  trategy used to 
3d40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 64  implement this d
3d50: 65 6c 65 74 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  elete:.    **.  
3d60: 20 20 2a 2a 20 20 4f 4e 45 50 41 53 53 5f 4f 46    **  ONEPASS_OF
3d70: 46 3a 20 20 20 20 54 77 6f 2d 70 61 73 73 20 61  F:    Two-pass a
3d80: 70 70 72 6f 61 63 68 20 2d 20 75 73 65 20 61 20  pproach - use a 
3d90: 46 49 46 4f 20 66 6f 72 20 72 6f 77 69 64 73 2f  FIFO for rowids/
3da0: 50 4b 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 2a  PK values..    *
3db0: 2a 20 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  *  ONEPASS_SINGL
3dc0: 45 3a 20 4f 6e 65 2d 70 61 73 73 20 61 70 70 72  E: One-pass appr
3dd0: 6f 61 63 68 20 2d 20 61 74 20 6d 6f 73 74 20 6f  oach - at most o
3de0: 6e 65 20 72 6f 77 20 64 65 6c 65 74 65 64 2e 0a  ne row deleted..
3df0: 20 20 20 20 2a 2a 20 20 4f 4e 45 50 41 53 53 5f      **  ONEPASS_
3e00: 4d 55 4c 54 49 3a 20 20 4f 6e 65 2d 70 61 73 73  MULTI:  One-pass
3e10: 20 61 70 70 72 6f 61 63 68 20 2d 20 61 6e 79 20   approach - any 
3e20: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
3e30: 61 79 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20  ay be deleted.. 
3e40: 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
3e50: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
3e60: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
3e70: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
3e80: 2c 20 30 2c 20 77 63 66 2c 20 69 54 61 62 43 75  , 0, wcf, iTabCu
3e90: 72 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 57  r+1);.    if( pW
3ea0: 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64  Info==0 ) goto d
3eb0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
3ec0: 75 70 3b 0a 20 20 20 20 65 4f 6e 65 50 61 73 73  up;.    eOnePass
3ed0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
3ee0: 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f 2c  kOnePass(pWInfo,
3ef0: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29 3b 0a   aiCurOnePass);.
3f00: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 56 69      assert( IsVi
3f10: 72 74 75 61 6c 28 70 54 61 62 29 3d 3d 30 20 7c  rtual(pTab)==0 |
3f20: 7c 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  | eOnePass!=ONEP
3f30: 41 53 53 5f 4d 55 4c 54 49 20 29 3b 0a 20 20 20  ASS_MULTI );.   
3f40: 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
3f50: 61 6c 28 70 54 61 62 29 20 7c 7c 20 62 43 6f 6d  al(pTab) || bCom
3f60: 70 6c 65 78 20 7c 7c 20 65 4f 6e 65 50 61 73 73  plex || eOnePass
3f70: 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b  !=ONEPASS_OFF );
3f80: 0a 20 20 0a 20 20 20 20 2f 2a 20 4b 65 65 70 20  .  .    /* Keep 
3f90: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d  track of the num
3fa0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62  ber of rows to b
3fb0: 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 20  e deleted */.   
3fc0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
3fd0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
3fe0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
3ff0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4000: 4f 50 5f 41 64 64 49 6d 6d 2c 20 6d 65 6d 43 6e  OP_AddImm, memCn
4010: 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  t, 1);.    }.  .
4020: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
4030: 68 65 20 72 6f 77 69 64 20 6f 72 20 70 72 69 6d  he rowid or prim
4040: 61 72 79 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ary key for the 
4050: 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
4060: 20 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20     if( pPk ){.  
4070: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4080: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
4090: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 61    assert( pPk->a
40a0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b  iColumn[i]>=0 );
40b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
40c0: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
40d0: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
40e0: 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
4120: 5b 69 5d 2c 20 69 50 6b 2b 69 29 3b 0a 20 20 20  [i], iPk+i);.   
4130: 20 20 20 7d 0a 20 20 20 20 20 20 69 4b 65 79 20     }.      iKey 
4140: 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  = iPk;.    }else
4150: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70  {.      iKey = p
4160: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
4170: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 73 71  .      iKey = sq
4180: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
4190: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
41a0: 54 61 62 2c 20 2d 31 2c 20 69 54 61 62 43 75 72  Tab, -1, iTabCur
41b0: 2c 20 69 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  , iKey, 0);.    
41c0: 20 20 69 66 28 20 69 4b 65 79 3e 70 50 61 72 73    if( iKey>pPars
41d0: 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65  e->nMem ) pParse
41e0: 2d 3e 6e 4d 65 6d 20 3d 20 69 4b 65 79 3b 0a 20  ->nMem = iKey;. 
41f0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
4200: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
4210: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 2f  S_OFF ){.      /
4220: 2a 20 46 6f 72 20 4f 4e 45 50 41 53 53 2c 20 6e  * For ONEPASS, n
4230: 6f 20 6e 65 65 64 20 74 6f 20 73 74 6f 72 65 20  o need to store 
4240: 74 68 65 20 72 6f 77 69 64 2f 70 72 69 6d 61 72  the rowid/primar
4250: 79 2d 6b 65 79 2e 20 54 68 65 72 65 20 69 73 20  y-key. There is 
4260: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  only.      ** on
4270: 65 2c 20 73 6f 20 6a 75 73 74 20 6b 65 65 70 20  e, so just keep 
4280: 69 74 20 69 6e 20 69 74 73 20 72 65 67 69 73 74  it in its regist
4290: 65 72 28 73 29 20 61 6e 64 20 66 61 6c 6c 20 74  er(s) and fall t
42a0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 20 20  hrough to the.  
42b0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 63 6f      ** delete co
42c0: 64 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4b  de.  */.      nK
42d0: 65 79 20 3d 20 6e 50 6b 3b 20 2f 2a 20 4f 50 5f  ey = nPk; /* OP_
42e0: 46 6f 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61  Found will use a
42f0: 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 2a  n unpacked key *
4300: 2f 0a 20 20 20 20 20 20 61 54 6f 4f 70 65 6e 20  /.      aToOpen 
4310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4320: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 49 64 78 2b  cRawNN(db, nIdx+
4330: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 54  2);.      if( aT
4340: 6f 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  oOpen==0 ){.    
4350: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
4360: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
4370: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65       goto delete
4380: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
4390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
43a0: 73 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31 2c 20  set(aToOpen, 1, 
43b0: 6e 49 64 78 2b 31 29 3b 0a 20 20 20 20 20 20 61  nIdx+1);.      a
43c0: 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b 31 5d 20 3d  ToOpen[nIdx+1] =
43d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69   0;.      if( ai
43e0: 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d 30  CurOnePass[0]>=0
43f0: 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72   ) aToOpen[aiCur
4400: 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 54 61 62 43  OnePass[0]-iTabC
4410: 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ur] = 0;.      i
4420: 66 28 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  f( aiCurOnePass[
4430: 31 5d 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e 5b  1]>=0 ) aToOpen[
4440: 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 2d  aiCurOnePass[1]-
4450: 69 54 61 62 43 75 72 5d 20 3d 20 30 3b 0a 20 20  iTabCur] = 0;.  
4460: 20 20 20 20 69 66 28 20 61 64 64 72 45 70 68 4f      if( addrEphO
4470: 70 65 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  pen ) sqlite3Vdb
4480: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
4490: 20 61 64 64 72 45 70 68 4f 70 65 6e 29 3b 0a 20   addrEphOpen);. 
44a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
44b0: 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20  if( pPk ){.     
44c0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 50 4b     /* Add the PK
44d0: 20 6b 65 79 20 66 6f 72 20 74 68 69 73 20 72 6f   key for this ro
44e0: 77 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  w to the tempora
44f0: 72 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ry table */.    
4500: 20 20 20 20 69 4b 65 79 20 3d 20 2b 2b 70 50 61      iKey = ++pPa
4510: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
4520: 20 20 20 6e 4b 65 79 20 3d 20 30 3b 20 20 20 2f     nKey = 0;   /
4530: 2a 20 5a 65 72 6f 20 74 65 6c 6c 73 20 4f 50 5f  * Zero tells OP_
4540: 46 6f 75 6e 64 20 74 6f 20 75 73 65 20 61 20 63  Found to use a c
4550: 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20 2a 2f 0a  omposite key */.
4560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4570: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
4580: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 50 6b 2c  MakeRecord, iPk,
4590: 20 6e 50 6b 2c 20 69 4b 65 79 2c 0a 20 20 20 20   nPk, iKey,.    
45a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
45b0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
45c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 6b 29  pParse->db, pPk)
45d0: 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
45e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45f0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
4600: 73 65 72 74 2c 20 69 45 70 68 43 75 72 2c 20 69  sert, iEphCur, i
4610: 4b 65 79 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a  Key, iPk, nPk);.
4620: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4630: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
4640: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
4650: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 74   to be deleted t
4660: 6f 20 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a  o the RowSet */.
4670: 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 31          nKey = 1
4680: 3b 20 20 2f 2a 20 4f 50 5f 44 65 66 65 72 72 65  ;  /* OP_Deferre
4690: 64 53 65 65 6b 20 61 6c 77 61 79 73 20 75 73 65  dSeek always use
46a0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 69 64  s a single rowid
46b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
46c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
46d0: 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 69   OP_RowSetAdd, i
46e0: 52 6f 77 53 65 74 2c 20 69 4b 65 79 29 3b 0a 20  RowSet, iKey);. 
46f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
4700: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 44      /* If this D
4710: 45 4c 45 54 45 20 63 61 6e 6e 6f 74 20 75 73 65  ELETE cannot use
4720: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 73 74 72   the ONEPASS str
4730: 61 74 65 67 79 2c 20 74 68 69 73 20 69 73 20 74  ategy, this is t
4740: 68 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  he .    ** end o
4750: 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
4760: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e 65   */.    if( eOne
4770: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
4780: 46 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 42  F ){.      addrB
4790: 79 70 61 73 73 20 3d 20 73 71 6c 69 74 65 33 56  ypass = sqlite3V
47a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
47b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
47c0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
47d0: 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  d(pWInfo);.    }
47e0: 0a 20 20 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73  .  .    /* Unles
47f0: 73 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  s this is a view
4800: 2c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 66  , open cursors f
4810: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  or the table we 
4820: 61 72 65 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65  are .    ** dele
4830: 74 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 61 6c  ting from and al
4840: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 20 49  l its indices. I
4850: 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  f this is a view
4860: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
4870: 2a 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 74 68  * only effect th
4880: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
4890: 20 69 73 20 74 6f 20 66 69 72 65 20 74 68 65 20   is to fire the 
48a0: 49 4e 53 54 45 41 44 20 4f 46 20 0a 20 20 20 20  INSTEAD OF .    
48b0: 2a 2a 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20  ** triggers..   
48c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56   */.    if( !isV
48d0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  iew ){.      int
48e0: 20 69 41 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a   iAddrOnce = 0;.
48f0: 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61        if( eOnePa
4900: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ss==ONEPASS_MULT
4910: 49 20 29 7b 0a 20 20 20 20 20 20 20 20 69 41 64  I ){.        iAd
4920: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
4930: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
4940: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
4950: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
4960: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4970: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
4980: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4990: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
49a0: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
49b0: 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  b, OP_OpenWrite,
49c0: 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
49d0: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 20 20 20 20 69 54 61 62 43 75 72 2c 20 61 54 6f      iTabCur, aTo
4a00: 4f 70 65 6e 2c 20 26 69 44 61 74 61 43 75 72 2c  Open, &iDataCur,
4a10: 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20   &iIdxCur);.    
4a20: 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 7c 7c    assert( pPk ||
4a30: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
4a40: 20 7c 7c 20 69 44 61 74 61 43 75 72 3d 3d 69 54   || iDataCur==iT
4a50: 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  abCur );.      a
4a60: 73 73 65 72 74 28 20 70 50 6b 20 7c 7c 20 49 73  ssert( pPk || Is
4a70: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
4a80: 20 69 49 64 78 43 75 72 3d 3d 69 44 61 74 61 43   iIdxCur==iDataC
4a90: 75 72 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ur+1 );.      if
4aa0: 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ( eOnePass==ONEP
4ab0: 41 53 53 5f 4d 55 4c 54 49 20 29 20 73 71 6c 69  ASS_MULTI ) sqli
4ac0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4ad0: 76 2c 20 69 41 64 64 72 4f 6e 63 65 29 3b 0a 20  v, iAddrOnce);. 
4ae0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
4af0: 65 74 20 75 70 20 61 20 6c 6f 6f 70 20 6f 76 65  et up a loop ove
4b00: 72 20 74 68 65 20 72 6f 77 69 64 73 2f 70 72 69  r the rowids/pri
4b10: 6d 61 72 79 2d 6b 65 79 73 20 74 68 61 74 20 77  mary-keys that w
4b20: 65 72 65 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  ere found in the
4b30: 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 2d 63 6c  .    ** where-cl
4b40: 61 75 73 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e  ause loop above.
4b50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4b60: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
4b70: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61  S_OFF ){.      a
4b80: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 6e 50 6b  ssert( nKey==nPk
4b90: 20 29 3b 20 20 2f 2a 20 4f 50 5f 46 6f 75 6e 64   );  /* OP_Found
4ba0: 20 77 69 6c 6c 20 75 73 65 20 61 6e 20 75 6e 70   will use an unp
4bb0: 61 63 6b 65 64 20 6b 65 79 20 2a 2f 0a 20 20 20  acked key */.   
4bc0: 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
4bd0: 6c 28 70 54 61 62 29 20 26 26 20 61 54 6f 4f 70  l(pTab) && aToOp
4be0: 65 6e 5b 69 44 61 74 61 43 75 72 2d 69 54 61 62  en[iDataCur-iTab
4bf0: 43 75 72 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  Cur] ){.        
4c00: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 7c  assert( pPk!=0 |
4c10: 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21  | pTab->pSelect!
4c20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
4c30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
4c40: 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
4c50: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 61 64 64  d, iDataCur, add
4c60: 72 42 79 70 61 73 73 2c 20 69 4b 65 79 2c 20 6e  rBypass, iKey, n
4c70: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Key);.        Vd
4c80: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4c90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4ca0: 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
4cb0: 20 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71 6c    addrLoop = sql
4cc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
4cd0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 45 70  , OP_Rewind, iEp
4ce0: 68 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  hCur); VdbeCover
4cf0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
4d00: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
4d10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
4d20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4d30: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70  , OP_Column, iEp
4d40: 68 43 75 72 2c 20 30 2c 20 69 4b 65 79 29 3b 0a  hCur, 0, iKey);.
4d50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4d60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
4d80: 44 61 74 61 2c 20 69 45 70 68 43 75 72 2c 20 69  Data, iEphCur, i
4d90: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
4da0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
4db0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 50 5f 46 6f  ==0 );  /* OP_Fo
4dc0: 75 6e 64 20 77 69 6c 6c 20 75 73 65 20 61 20 63  und will use a c
4dd0: 6f 6d 70 6f 73 69 74 65 20 6b 65 79 20 2a 2f 0a  omposite key */.
4de0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4df0: 20 61 64 64 72 4c 6f 6f 70 20 3d 20 73 71 6c 69   addrLoop = sqli
4e00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4e10: 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c 20   OP_RowSetRead, 
4e20: 69 52 6f 77 53 65 74 2c 20 30 2c 20 69 4b 65 79  iRowSet, 0, iKey
4e30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4e40: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4e50: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 31 20  assert( nKey==1 
4e60: 29 3b 0a 20 20 20 20 7d 20 20 0a 20 20 0a 20 20  );.    }  .  .  
4e70: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4e80: 72 6f 77 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  row */.#ifndef S
4e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4ea0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
4eb0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
4ec0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
4ed0: 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
4ee0: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
4ef0: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
4f00: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  pTab);.      sql
4f10: 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69 74  ite3VtabMakeWrit
4f20: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
4f30: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
4f40: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4f50: 50 5f 56 55 70 64 61 74 65 2c 20 30 2c 20 31 2c  P_VUpdate, 0, 1,
4f60: 20 69 4b 65 79 2c 20 70 56 54 61 62 2c 20 50 34   iKey, pVTab, P4
4f70: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71  _VTAB);.      sq
4f80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4f90: 35 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  5(v, OE_Abort);.
4fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
4fb0: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
4fc0: 4f 46 46 20 7c 7c 20 65 4f 6e 65 50 61 73 73 3d  OFF || eOnePass=
4fd0: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
4fe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4ff0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
5000: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65  ;.      if( eOne
5010: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49  Pass==ONEPASS_SI
5020: 4e 47 4c 45 20 26 26 20 73 71 6c 69 74 65 33 49  NGLE && sqlite3I
5030: 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  sToplevel(pParse
5040: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
5050: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
5060: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
5070: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
5080: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
5090: 63 6f 75 6e 74 20 3d 20 28 70 50 61 72 73 65 2d  count = (pParse-
50a0: 3e 6e 65 73 74 65 64 3d 3d 30 29 3b 20 20 20 20  >nested==0);    
50b0: 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74  /* True to count
50c0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
50d0: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
50e0: 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73  eRowDelete(pPars
50f0: 65 2c 20 70 54 61 62 2c 20 70 54 72 69 67 67 65  e, pTab, pTrigge
5100: 72 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  r, iDataCur, iId
5110: 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xCur,.          
5120: 69 4b 65 79 2c 20 6e 4b 65 79 2c 20 63 6f 75 6e  iKey, nKey, coun
5130: 74 2c 20 4f 45 5f 44 65 66 61 75 6c 74 2c 20 65  t, OE_Default, e
5140: 4f 6e 65 50 61 73 73 2c 20 61 69 43 75 72 4f 6e  OnePass, aiCurOn
5150: 65 50 61 73 73 5b 31 5d 29 3b 0a 20 20 20 20 7d  ePass[1]);.    }
5160: 0a 20 20 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f  .  .    /* End o
5170: 66 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  f the loop over 
5180: 61 6c 6c 20 72 6f 77 69 64 73 2f 70 72 69 6d 61  all rowids/prima
5190: 72 79 2d 6b 65 79 73 2e 20 2a 2f 0a 20 20 20 20  ry-keys. */.    
51a0: 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  if( eOnePass!=ON
51b0: 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
51c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
51d0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
51e0: 64 72 42 79 70 61 73 73 29 3b 0a 20 20 20 20 20  drBypass);.     
51f0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
5200: 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  (pWInfo);.    }e
5210: 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  lse if( pPk ){. 
5220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5230: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
5240: 74 2c 20 69 45 70 68 43 75 72 2c 20 61 64 64 72  t, iEphCur, addr
5250: 4c 6f 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  Loop+1); VdbeCov
5260: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
5270: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5280: 65 72 65 28 76 2c 20 61 64 64 72 4c 6f 6f 70 29  ere(v, addrLoop)
5290: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
52a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
52b0: 74 6f 28 76 2c 20 61 64 64 72 4c 6f 6f 70 29 3b  to(v, addrLoop);
52c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
52d0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
52e0: 64 72 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 20 20  drLoop);.    }  
52f0: 20 20 20 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6e     .  } /* End n
5300: 6f 6e 2d 74 72 75 6e 63 61 74 65 20 70 61 74 68  on-truncate path
5310: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65   */..  /* Update
5320: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
5330: 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73 74  ence table by st
5340: 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  oring the conten
5350: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61  t of the.  ** ma
5360: 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e  ximum rowid coun
5370: 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72  ter values recor
5380: 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  ded while insert
5390: 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75  ing into.  ** au
53a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c  toincrement tabl
53b0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
53c0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
53d0: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
53e0: 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20  ggerTab==0 ){.  
53f0: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
5400: 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65  rementEnd(pParse
5410: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  );.  }..  /* Ret
5420: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5430: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
5440: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
5450: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20 20  s routine is .  
5460: 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ** generating co
5470: 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  de because of a 
5480: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e  call to sqlite3N
5490: 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64 6f  estedParse(), do
54a0: 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65   not.  ** invoke
54b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
54c0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nction..  */.  i
54d0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  f( (db->flags&SQ
54e0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 20  LITE_CountRows) 
54f0: 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  && !pParse->nest
5500: 65 64 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70  ed && !pParse->p
5510: 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
5520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5530: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
5540: 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b  Row, memCnt, 1);
5550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5560: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29  SetNumCols(v, 1)
5570: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5580: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
5590: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
55a0: 22 72 6f 77 73 20 64 65 6c 65 74 65 64 22 2c 20  "rows deleted", 
55b0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
55c0: 20 20 7d 0a 0a 64 65 6c 65 74 65 5f 66 72 6f 6d    }..delete_from
55d0: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
55e0: 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f  te3AuthContextPo
55f0: 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20  p(&sContext);.  
5600: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
5610: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73  lete(db, pTabLis
5620: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5630: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65  rDelete(db, pWhe
5640: 72 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  re);.#if defined
5650: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
5660: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
5670: 49 54 29 20 0a 20 20 73 71 6c 69 74 65 33 45 78  IT) .  sqlite3Ex
5680: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
5690: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71   pOrderBy);.  sq
56a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
56b0: 64 62 2c 20 70 4c 69 6d 69 74 29 3b 0a 23 65 6e  db, pLimit);.#en
56c0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
56d0: 72 65 65 28 64 62 2c 20 61 54 6f 4f 70 65 6e 29  ree(db, aToOpen)
56e0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  ;.  return;.}./*
56f0: 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73 56 69   Make sure "isVi
5700: 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 61  ew" and other ma
5710: 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61 62 6f  cros defined abo
5720: 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ve are undefined
5730: 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 74  . Otherwise.** t
5740: 68 65 79 20 6d 61 79 20 69 6e 74 65 72 66 65 72  hey may interfer
5750: 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61 74 69  e with compilati
5760: 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75 6e 63  on of other func
5770: 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69  tions in this fi
5780: 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f  le.** (or in ano
5790: 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20 74 68  ther file, if th
57a0: 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65 73 20  is file becomes 
57b0: 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d 61 6c  part of the amal
57c0: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23  gamation).  */.#
57d0: 69 66 64 65 66 20 69 73 56 69 65 77 0a 20 23 75  ifdef isView. #u
57e0: 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65 6e 64  ndef isView.#end
57f0: 69 66 0a 23 69 66 64 65 66 20 70 54 72 69 67 67  if.#ifdef pTrigg
5800: 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72 69 67  er. #undef pTrig
5810: 67 65 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ger.#endif../*.*
5820: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
5830: 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
5840: 64 65 20 74 68 61 74 20 63 61 75 73 65 73 20 61  de that causes a
5850: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61   single row of a
5860: 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  .** single table
5870: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
5880: 20 42 6f 74 68 20 74 68 65 20 6f 72 69 67 69 6e   Both the origin
5890: 61 6c 20 74 61 62 6c 65 20 65 6e 74 72 79 20 61  al table entry a
58a0: 6e 64 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  nd.** all indice
58b0: 73 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  s are removed..*
58c0: 2a 0a 2a 2a 20 50 72 65 63 6f 6e 64 69 74 69 6f  *.** Preconditio
58d0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  ns:.**.**   1.  
58e0: 69 44 61 74 61 43 75 72 20 69 73 20 61 6e 20 6f  iDataCur is an o
58f0: 70 65 6e 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  pen cursor on th
5900: 65 20 62 74 72 65 65 20 74 68 61 74 20 69 73 20  e btree that is 
5910: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61  the canonical da
5920: 74 61 0a 2a 2a 20 20 20 20 20 20 20 73 74 6f 72  ta.**       stor
5930: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  e for the table.
5940: 20 20 28 54 68 69 73 20 77 69 6c 6c 20 62 65 20    (This will be 
5950: 65 69 74 68 65 72 20 74 68 65 20 74 61 62 6c 65  either the table
5960: 20 69 74 73 65 6c 66 2c 0a 2a 2a 20 20 20 20 20   itself,.**     
5970: 20 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66    in the case of
5980: 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20   a rowid table, 
5990: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
59a0: 45 59 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  EY index in the 
59b0: 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  case.**       of
59c0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
59d0: 20 74 61 62 6c 65 2e 29 0a 2a 2a 0a 2a 2a 20 20   table.).**.**  
59e0: 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20   2.  Read/write 
59f0: 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
5a00: 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
5a10: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a  must be open as.
5a20: 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  **       cursor 
5a30: 6e 75 6d 62 65 72 20 69 49 64 78 43 75 72 2b 69  number iIdxCur+i
5a40: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 69 6e   for the i-th in
5a50: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20  dex..**.**   3. 
5a60: 20 54 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   The primary key
5a70: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 74 6f 20   for the row to 
5a80: 62 65 20 64 65 6c 65 74 65 64 20 6d 75 73 74 20  be deleted must 
5a90: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 0a 2a  be stored in a.*
5aa0: 2a 20 20 20 20 20 20 20 73 65 71 75 65 6e 63 65  *       sequence
5ab0: 20 6f 66 20 6e 50 6b 20 6d 65 6d 6f 72 79 20 63   of nPk memory c
5ac0: 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74  ells starting at
5ad0: 20 69 50 6b 2e 20 20 49 66 20 6e 50 6b 3d 3d 30   iPk.  If nPk==0
5ae0: 20 74 68 61 74 20 6d 65 61 6e 73 0a 2a 2a 20 20   that means.**  
5af0: 20 20 20 20 20 74 68 61 74 20 61 20 73 65 61 72       that a sear
5b00: 63 68 20 72 65 63 6f 72 64 20 66 6f 72 6d 65 64  ch record formed
5b10: 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63   from OP_MakeRec
5b20: 6f 72 64 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  ord is contained
5b30: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
5b40: 20 73 69 6e 67 6c 65 20 6d 65 6d 6f 72 79 20 6c   single memory l
5b50: 6f 63 61 74 69 6f 6e 20 69 50 6b 2e 0a 2a 2a 0a  ocation iPk..**.
5b60: 2a 2a 20 65 4d 6f 64 65 3a 0a 2a 2a 20 20 20 50  ** eMode:.**   P
5b70: 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
5b80: 61 79 20 62 65 20 70 61 73 73 65 64 20 65 69 74  ay be passed eit
5b90: 68 65 72 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20  her ONEPASS_OFF 
5ba0: 28 30 29 2c 20 4f 4e 45 50 41 53 53 5f 53 49 4e  (0), ONEPASS_SIN
5bb0: 47 4c 45 2c 20 6f 72 0a 2a 2a 20 20 20 4f 4e 45  GLE, or.**   ONE
5bc0: 50 41 53 53 5f 4d 55 4c 54 49 2e 20 20 49 66 20  PASS_MULTI.  If 
5bd0: 65 4d 6f 64 65 20 69 73 20 6e 6f 74 20 4f 4e 45  eMode is not ONE
5be0: 50 41 53 53 5f 4f 46 46 2c 20 74 68 65 6e 20 74  PASS_OFF, then t
5bf0: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 20 20 69  he cursor.**   i
5c00: 44 61 74 61 43 75 72 20 61 6c 72 65 61 64 79 20  DataCur already 
5c10: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 6f  points to the ro
5c20: 77 20 74 6f 20 64 65 6c 65 74 65 2e 20 49 66 20  w to delete. If 
5c30: 65 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41 53 53  eMode is ONEPASS
5c40: 5f 4f 46 46 0a 2a 2a 20 20 20 74 68 65 6e 20 74  _OFF.**   then t
5c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
5c60: 74 20 73 65 65 6b 20 69 44 61 74 61 43 75 72 20  t seek iDataCur 
5c70: 74 6f 20 74 68 65 20 65 6e 74 72 79 20 69 64 65  to the entry ide
5c80: 6e 74 69 66 69 65 64 20 62 79 20 69 50 6b 0a 2a  ntified by iPk.*
5c90: 2a 20 20 20 61 6e 64 20 6e 50 6b 20 62 65 66 6f  *   and nPk befo
5ca0: 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
5cb0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 65  it..**.**   If e
5cc0: 4d 6f 64 65 20 69 73 20 4f 4e 45 50 41 53 53 5f  Mode is ONEPASS_
5cd0: 4d 55 4c 54 49 2c 20 74 68 65 6e 20 74 68 69 73  MULTI, then this
5ce0: 20 63 61 6c 6c 20 69 73 20 62 65 69 6e 67 20 6d   call is being m
5cf0: 61 64 65 20 61 73 20 70 61 72 74 0a 2a 2a 20 20  ade as part.**  
5d00: 20 6f 66 20 61 20 4f 4e 45 50 41 53 53 20 64 65   of a ONEPASS de
5d10: 6c 65 74 65 20 74 68 61 74 20 61 66 66 65 63 74  lete that affect
5d20: 73 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 2e  s multiple rows.
5d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
5d40: 66 20 0a 2a 2a 20 20 20 69 49 64 78 4e 6f 53 65  f .**   iIdxNoSe
5d50: 65 6b 20 69 73 20 61 20 76 61 6c 69 64 20 63 75  ek is a valid cu
5d60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 28 3e 3d 30  rsor number (>=0
5d70: 29 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 68 65  ) and is not the
5d80: 20 73 61 6d 65 20 61 73 0a 2a 2a 20 20 20 69 44   same as.**   iD
5d90: 61 74 61 43 75 72 2c 20 74 68 65 6e 20 69 74 73  ataCur, then its
5da0: 20 70 6f 73 69 74 69 6f 6e 20 73 68 6f 75 6c 64   position should
5db0: 20 62 65 20 70 72 65 73 65 72 76 65 64 20 66 6f   be preserved fo
5dc0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65  llowing the dele
5dd0: 74 65 0a 2a 2a 20 20 20 6f 70 65 72 61 74 69 6f  te.**   operatio
5de0: 6e 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 4e 6f  n. Or, if iIdxNo
5df0: 53 65 65 6b 20 69 73 20 6e 6f 74 20 61 20 76 61  Seek is not a va
5e00: 6c 69 64 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  lid cursor numbe
5e10: 72 2c 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69  r, the.**   posi
5e20: 74 69 6f 6e 20 6f 66 20 69 44 61 74 61 43 75 72  tion of iDataCur
5e30: 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65   should be prese
5e40: 72 76 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rved instead..**
5e50: 0a 2a 2a 20 69 49 64 78 4e 6f 53 65 65 6b 3a 0a  .** iIdxNoSeek:.
5e60: 2a 2a 20 20 20 49 66 20 69 49 64 78 4e 6f 53 65  **   If iIdxNoSe
5e70: 65 6b 20 69 73 20 61 20 76 61 6c 69 64 20 63 75  ek is a valid cu
5e80: 72 73 6f 72 20 6e 75 6d 62 65 72 20 28 3e 3d 30  rsor number (>=0
5e90: 29 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 69  ) not equal to i
5ea0: 44 61 74 61 43 75 72 2c 0a 2a 2a 20 20 20 74 68  DataCur,.**   th
5eb0: 65 6e 20 69 74 20 69 64 65 6e 74 69 66 69 65 73  en it identifies
5ec0: 20 61 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72   an index cursor
5ed0: 20 28 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 72   (from within ar
5ee0: 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 0a 2a  ray of cursors.*
5ef0: 2a 20 20 20 73 74 61 72 74 69 6e 67 20 61 74 20  *   starting at 
5f00: 69 49 64 78 43 75 72 29 20 74 68 61 74 20 61 6c  iIdxCur) that al
5f10: 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
5f20: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
5f30: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  to be deleted..*
5f40: 2a 20 20 20 45 78 63 65 70 74 2c 20 74 68 69 73  *   Except, this
5f50: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
5f60: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
5f70: 72 65 20 61 72 65 20 42 45 46 4f 52 45 20 74 72  re are BEFORE tr
5f80: 69 67 67 65 72 73 20 73 69 6e 63 65 0a 2a 2a 20  iggers since.** 
5f90: 20 20 74 68 65 20 74 72 69 67 67 65 72 20 62 6f    the trigger bo
5fa0: 64 79 20 6d 69 67 68 74 20 68 61 76 65 20 6d 6f  dy might have mo
5fb0: 76 65 64 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ved the cursor..
5fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47  */.void sqlite3G
5fd0: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
5fe0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5ff0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
6000: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
6010: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
6020: 20 20 2f 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61    /* Table conta
6030: 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 20 74 6f  ining the row to
6040: 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20   be deleted */. 
6050: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
6060: 65 72 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  er, /* List of t
6070: 72 69 67 67 65 72 73 20 74 6f 20 28 70 6f 74 65  riggers to (pote
6080: 6e 74 69 61 6c 6c 79 29 20 66 69 72 65 20 2a 2f  ntially) fire */
6090: 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c  .  int iDataCur,
60a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
60b0: 66 72 6f 6d 20 77 68 69 63 68 20 63 6f 6c 75 6d  from which colum
60c0: 6e 20 64 61 74 61 20 69 73 20 65 78 74 72 61 63  n data is extrac
60d0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ted */.  int iId
60e0: 78 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 46  xCur,       /* F
60f0: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
6100: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 2c 20  r */.  int iPk, 
6110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
6120: 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63  st memory cell c
6130: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 50 52  ontaining the PR
6140: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69  IMARY KEY */.  i
6150: 31 36 20 6e 50 6b 2c 20 20 20 20 20 20 20 20 20  16 nPk,         
6160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
6170: 52 49 4d 41 52 59 20 4b 45 59 20 6d 65 6d 6f 72  RIMARY KEY memor
6180: 79 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 38 20  y cells */.  u8 
6190: 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  count,          
61a0: 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
61b0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 6f  increment the ro
61c0: 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  w change counter
61d0: 20 2a 2f 0a 20 20 75 38 20 6f 6e 63 6f 6e 66 2c   */.  u8 onconf,
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
61f0: 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ult ON CONFLICT 
6200: 70 6f 6c 69 63 79 20 66 6f 72 20 74 72 69 67 67  policy for trigg
6210: 65 72 73 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  ers */.  u8 eMod
6220: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  e,          /* O
6230: 4e 45 50 41 53 53 5f 4f 46 46 2c 20 5f 53 49 4e  NEPASS_OFF, _SIN
6240: 47 4c 45 2c 20 6f 72 20 5f 4d 55 4c 54 49 2e 20  GLE, or _MULTI. 
6250: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
6260: 69 6e 74 20 69 49 64 78 4e 6f 53 65 65 6b 20 20  int iIdxNoSeek  
6270: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
6280: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 20 74 68  ber of cursor th
6290: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
62a0: 20 73 65 65 6b 69 6e 67 20 2a 2f 0a 29 7b 0a 20   seeking */.){. 
62b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
62c0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
62d0: 20 2f 2a 20 56 64 62 65 20 2a 2f 0a 20 20 69 6e   /* Vdbe */.  in
62e0: 74 20 69 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  t iOld = 0;     
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6300: 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20   First register 
6310: 69 6e 20 4f 4c 44 2e 2a 20 61 72 72 61 79 20 2a  in OLD.* array *
6320: 2f 0a 20 20 69 6e 74 20 69 4c 61 62 65 6c 3b 20  /.  int iLabel; 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 72 65 73      /* Label res
6350: 6f 6c 76 65 64 20 74 6f 20 65 6e 64 20 6f 66 20  olved to end of 
6360: 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 2a  generated code *
6370: 2f 0a 20 20 75 38 20 6f 70 53 65 65 6b 3b 20 20  /.  u8 opSeek;  
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f 70 63 6f      /* Seek opco
63a0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 56 64 62 65  de */..  /* Vdbe
63b0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
63c0: 6f 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  o have been allo
63d0: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 73 74  cated by this st
63e0: 61 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  age. */.  assert
63f0: 28 20 76 20 29 3b 0a 20 20 56 64 62 65 4d 6f 64  ( v );.  VdbeMod
6400: 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
6410: 42 45 47 49 4e 3a 20 47 65 6e 52 6f 77 44 65 6c  BEGIN: GenRowDel
6420: 28 25 64 2c 25 64 2c 25 64 2c 25 64 29 22 2c 0a  (%d,%d,%d,%d)",.
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 20 20 69 44 61 74 61 43 75           iDataCu
6450: 72 2c 20 69 49 64 78 43 75 72 2c 20 69 50 6b 2c  r, iIdxCur, iPk,
6460: 20 28 69 6e 74 29 6e 50 6b 29 29 3b 0a 0a 20 20   (int)nPk));..  
6470: 2f 2a 20 53 65 65 6b 20 63 75 72 73 6f 72 20 69  /* Seek cursor i
6480: 43 75 72 20 74 6f 20 74 68 65 20 72 6f 77 20 74  Cur to the row t
6490: 6f 20 64 65 6c 65 74 65 2e 20 49 66 20 74 68 69  o delete. If thi
64a0: 73 20 72 6f 77 20 6e 6f 20 6c 6f 6e 67 65 72 20  s row no longer 
64b0: 65 78 69 73 74 73 20 0a 20 20 2a 2a 20 28 74 68  exists .  ** (th
64c0: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 66  is can happen if
64d0: 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67 72   a trigger progr
64e0: 61 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  am has already d
64f0: 65 6c 65 74 65 64 20 69 74 29 2c 20 64 6f 0a 20  eleted it), do. 
6500: 20 2a 2a 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   ** not attempt 
6510: 74 6f 20 64 65 6c 65 74 65 20 69 74 20 6f 72 20  to delete it or 
6520: 66 69 72 65 20 61 6e 79 20 44 45 4c 45 54 45 20  fire any DELETE 
6530: 74 72 69 67 67 65 72 73 2e 20 20 2a 2f 0a 20 20  triggers.  */.  
6540: 69 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  iLabel = sqlite3
6550: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6560: 3b 0a 20 20 6f 70 53 65 65 6b 20 3d 20 48 61 73  ;.  opSeek = Has
6570: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 4f 50  Rowid(pTab) ? OP
6580: 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f 50 5f  _NotExists : OP_
6590: 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 69 66 28 20  NotFound;.  if( 
65a0: 65 4d 6f 64 65 3d 3d 4f 4e 45 50 41 53 53 5f 4f  eMode==ONEPASS_O
65b0: 46 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FF ){.    sqlite
65c0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
65d0: 2c 20 6f 70 53 65 65 6b 2c 20 69 44 61 74 61 43  , opSeek, iDataC
65e0: 75 72 2c 20 69 4c 61 62 65 6c 2c 20 69 50 6b 2c  ur, iLabel, iPk,
65f0: 20 6e 50 6b 29 3b 0a 20 20 20 20 56 64 62 65 43   nPk);.    VdbeC
6600: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 53  overageIf(v, opS
6610: 65 65 6b 3d 3d 4f 50 5f 4e 6f 74 45 78 69 73 74  eek==OP_NotExist
6620: 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  s);.    VdbeCove
6630: 72 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b  rageIf(v, opSeek
6640: 3d 3d 4f 50 5f 4e 6f 74 46 6f 75 6e 64 29 3b 0a  ==OP_NotFound);.
6650: 20 20 7d 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68    }. .  /* If th
6660: 65 72 65 20 61 72 65 20 61 6e 79 20 74 72 69 67  ere are any trig
6670: 67 65 72 73 20 74 6f 20 66 69 72 65 2c 20 61 6c  gers to fire, al
6680: 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
6690: 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 0a 20  f registers to. 
66a0: 20 2a 2a 20 75 73 65 20 66 6f 72 20 74 68 65 20   ** use for the 
66b0: 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63 65 73  old.* references
66c0: 20 69 6e 20 74 68 65 20 74 72 69 67 67 65 72 73   in the triggers
66d0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
66e0: 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70 50  te3FkRequired(pP
66f0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
6700: 29 20 7c 7c 20 70 54 72 69 67 67 65 72 20 29 7b  ) || pTrigger ){
6710: 0a 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20  .    u32 mask;  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 4c     /* Mask of OL
6740: 44 2e 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 75  D.* columns in u
6750: 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  se */.    int iC
6760: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
6770: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
6780: 74 6f 72 20 75 73 65 64 20 77 68 69 6c 65 20 70  tor used while p
6790: 6f 70 75 6c 61 74 69 6e 67 20 4f 4c 44 2e 2a 20  opulating OLD.* 
67a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  */.    int addrS
67b0: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
67c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
67d0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20   BEFORE trigger 
67e0: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 0a 20 20 20  programs */..   
67f0: 20 2f 2a 20 54 4f 44 4f 3a 20 43 6f 75 6c 64 20   /* TODO: Could 
6800: 75 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  use temporary re
6810: 67 69 73 74 65 72 73 20 68 65 72 65 2e 20 41 6c  gisters here. Al
6820: 73 6f 20 63 6f 75 6c 64 20 61 74 74 65 6d 70 74  so could attempt
6830: 20 74 6f 0a 20 20 20 20 2a 2a 20 61 76 6f 69 64   to.    ** avoid
6840: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
6850: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 77  tents of the row
6860: 69 64 20 72 65 67 69 73 74 65 72 2e 20 20 2a 2f  id register.  */
6870: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69  .    mask = sqli
6880: 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73  te3TriggerColmas
6890: 6b 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  k(.        pPars
68a0: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 30 2c 20  e, pTrigger, 0, 
68b0: 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  0, TRIGGER_BEFOR
68c0: 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c  E|TRIGGER_AFTER,
68d0: 20 70 54 61 62 2c 20 6f 6e 63 6f 6e 66 0a 20 20   pTab, onconf.  
68e0: 20 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d    );.    mask |=
68f0: 20 73 71 6c 69 74 65 33 46 6b 4f 6c 64 6d 61 73   sqlite3FkOldmas
6900: 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  k(pParse, pTab);
6910: 0a 20 20 20 20 69 4f 6c 64 20 3d 20 70 50 61 72  .    iOld = pPar
6920: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6930: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6940: 28 31 20 2b 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  (1 + pTab->nCol)
6950: 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  ;..    /* Popula
6960: 74 65 20 74 68 65 20 4f 4c 44 2e 2a 20 70 73 65  te the OLD.* pse
6970: 75 64 6f 2d 74 61 62 6c 65 20 72 65 67 69 73 74  udo-table regist
6980: 65 72 20 61 72 72 61 79 2e 20 54 68 65 73 65 20  er array. These 
6990: 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20 0a  values will be .
69a0: 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 61      ** used by a
69b0: 6e 79 20 42 45 46 4f 52 45 20 61 6e 64 20 41 46  ny BEFORE and AF
69c0: 54 45 52 20 74 72 69 67 67 65 72 73 20 74 68 61  TER triggers tha
69d0: 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20  t exist.  */.   
69e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69f0: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
6a00: 50 6b 2c 20 69 4f 6c 64 29 3b 0a 20 20 20 20 66  Pk, iOld);.    f
6a10: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
6a20: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
6a30: 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
6a40: 61 73 65 28 20 6d 61 73 6b 21 3d 30 78 66 66 66  ase( mask!=0xfff
6a50: 66 66 66 66 66 20 26 26 20 69 43 6f 6c 3d 3d 33  fffff && iCol==3
6a60: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
6a70: 61 73 65 28 20 6d 61 73 6b 21 3d 30 78 66 66 66  ase( mask!=0xfff
6a80: 66 66 66 66 66 20 26 26 20 69 43 6f 6c 3d 3d 33  fffff && iCol==3
6a90: 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  2 );.      if( m
6aa0: 61 73 6b 3d 3d 30 78 66 66 66 66 66 66 66 66 20  ask==0xffffffff 
6ab0: 7c 7c 20 28 69 43 6f 6c 3c 3d 33 31 20 26 26 20  || (iCol<=31 && 
6ac0: 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
6ad0: 32 28 69 43 6f 6c 29 29 21 3d 30 29 20 29 7b 0a  2(iCol))!=0) ){.
6ae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6af0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
6b00: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
6b10: 20 69 44 61 74 61 43 75 72 2c 20 69 43 6f 6c 2c   iDataCur, iCol,
6b20: 20 69 4f 6c 64 2b 69 43 6f 6c 2b 31 29 3b 0a 20   iOld+iCol+1);. 
6b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6b40: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 42 45 46 4f    /* Invoke BEFO
6b50: 52 45 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  RE DELETE trigge
6b60: 72 20 70 72 6f 67 72 61 6d 73 2e 20 2a 2f 0a 20  r programs. */. 
6b70: 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
6b80: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6b90: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
6ba0: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
6bb0: 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  ger(pParse, pTri
6bc0: 67 67 65 72 2c 20 0a 20 20 20 20 20 20 20 20 54  gger, .        T
6bd0: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54 52 49  K_DELETE, 0, TRI
6be0: 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 70 54 61  GGER_BEFORE, pTa
6bf0: 62 2c 20 69 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c  b, iOld, onconf,
6c00: 20 69 4c 61 62 65 6c 0a 20 20 20 20 29 3b 0a 0a   iLabel.    );..
6c10: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 42 45      /* If any BE
6c20: 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 77 65  FORE triggers we
6c30: 72 65 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 73  re coded, then s
6c40: 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 74  eek the cursor t
6c50: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f  o the .    ** ro
6c60: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
6c70: 61 67 61 69 6e 2e 20 49 74 20 6d 61 79 20 62 65  again. It may be
6c80: 20 74 68 61 74 20 74 68 65 20 42 45 46 4f 52 45   that the BEFORE
6c90: 20 74 72 69 67 67 65 72 73 20 6d 6f 76 65 64 0a   triggers moved.
6ca0: 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
6cb0: 72 20 6f 72 20 61 6c 72 65 61 64 79 20 64 65 6c  r or already del
6cc0: 65 74 65 64 20 74 68 65 20 72 6f 77 20 74 68 61  eted the row tha
6cd0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  t the cursor was
6ce0: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 69 6e 67  .    ** pointing
6cf0: 20 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   to..    **.    
6d00: 2a 2a 20 41 6c 73 6f 20 64 69 73 61 62 6c 65 20  ** Also disable 
6d10: 74 68 65 20 69 49 64 78 4e 6f 53 65 65 6b 20 6f  the iIdxNoSeek o
6d20: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 69 6e 63  ptimization sinc
6d30: 65 20 74 68 65 20 42 45 46 4f 52 45 20 74 72 69  e the BEFORE tri
6d40: 67 67 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  gger.    ** may 
6d50: 68 61 76 65 20 6d 6f 76 65 64 20 74 68 61 74 20  have moved that 
6d60: 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
6d70: 20 20 20 69 66 28 20 61 64 64 72 53 74 61 72 74     if( addrStart
6d80: 3c 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72  <sqlite3VdbeCurr
6d90: 65 6e 74 41 64 64 72 28 76 29 20 29 7b 0a 20 20  entAddr(v) ){.  
6da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6db0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 53 65  ddOp4Int(v, opSe
6dc0: 65 6b 2c 20 69 44 61 74 61 43 75 72 2c 20 69 4c  ek, iDataCur, iL
6dd0: 61 62 65 6c 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b  abel, iPk, nPk);
6de0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
6df0: 61 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d  ageIf(v, opSeek=
6e00: 3d 4f 50 5f 4e 6f 74 45 78 69 73 74 73 29 3b 0a  =OP_NotExists);.
6e10: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
6e20: 67 65 49 66 28 76 2c 20 6f 70 53 65 65 6b 3d 3d  geIf(v, opSeek==
6e30: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  OP_NotFound);.  
6e40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 49      testcase( iI
6e50: 64 78 4e 6f 53 65 65 6b 3e 3d 30 20 29 3b 0a 20  dxNoSeek>=0 );. 
6e60: 20 20 20 20 20 69 49 64 78 4e 6f 53 65 65 6b 20       iIdxNoSeek 
6e70: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
6e80: 20 2f 2a 20 44 6f 20 46 4b 20 70 72 6f 63 65 73   /* Do FK proces
6e90: 73 69 6e 67 2e 20 54 68 69 73 20 63 61 6c 6c 20  sing. This call 
6ea0: 63 68 65 63 6b 73 20 74 68 61 74 20 61 6e 79 20  checks that any 
6eb0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  FK constraints t
6ec0: 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
6ed0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 28   to this table (
6ee0: 69 2e 65 2e 20 63 6f 6e 73 74 72 61 69 6e 74 73  i.e. constraints
6ef0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 6f 74 68   attached to oth
6f00: 65 72 20 74 61 62 6c 65 73 29 20 0a 20 20 20 20  er tables) .    
6f10: 2a 2a 20 61 72 65 20 6e 6f 74 20 76 69 6f 6c 61  ** are not viola
6f20: 74 65 64 20 62 79 20 64 65 6c 65 74 69 6e 67 20  ted by deleting 
6f30: 74 68 69 73 20 72 6f 77 2e 20 20 2a 2f 0a 20 20  this row.  */.  
6f40: 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b    sqlite3FkCheck
6f50: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
6f60: 4f 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Old, 0, 0, 0);. 
6f70: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
6f80: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
6f90: 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 53 6b 69  ble entries. Ski
6fa0: 70 20 74 68 69 73 20 73 74 65 70 20 69 66 20 70  p this step if p
6fb0: 54 61 62 20 69 73 20 72 65 61 6c 6c 79 0a 20 20  Tab is really.  
6fc0: 2a 2a 20 61 20 76 69 65 77 20 28 69 6e 20 77 68  ** a view (in wh
6fd0: 69 63 68 20 63 61 73 65 20 74 68 65 20 6f 6e 6c  ich case the onl
6fe0: 79 20 65 66 66 65 63 74 20 6f 66 20 74 68 65 20  y effect of the 
6ff0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
7000: 20 69 73 20 74 6f 0a 20 20 2a 2a 20 66 69 72 65   is to.  ** fire
7010: 20 74 68 65 20 49 4e 53 54 45 41 44 20 4f 46 20   the INSTEAD OF 
7020: 74 72 69 67 67 65 72 73 29 2e 20 20 0a 20 20 2a  triggers).  .  *
7030: 2a 0a 20 20 2a 2a 20 49 66 20 76 61 72 69 61 62  *.  ** If variab
7040: 6c 65 20 27 63 6f 75 6e 74 27 20 69 73 20 6e 6f  le 'count' is no
7050: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
7060: 73 20 4f 50 5f 44 65 6c 65 74 65 20 69 6e 73 74  s OP_Delete inst
7070: 72 75 63 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 20  ruction should. 
7080: 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 75   ** invoke the u
7090: 70 64 61 74 65 2d 68 6f 6f 6b 2e 20 54 68 65 20  pdate-hook. The 
70a0: 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 2c  pre-update-hook,
70b0: 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
70c0: 6e 64 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 62  nd should.  ** b
70d0: 65 20 69 6e 76 6f 6b 65 64 20 75 6e 6c 65 73 73  e invoked unless
70e0: 20 74 61 62 6c 65 20 70 54 61 62 20 69 73 20 61   table pTab is a
70f0: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 2e 20 54   system table. T
7100: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
7110: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 75   that.  ** the u
7120: 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 6e 6f  pdate-hook is no
7130: 74 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 72 6f  t invoked for ro
7140: 77 73 20 72 65 6d 6f 76 65 64 20 62 79 20 52 45  ws removed by RE
7150: 50 4c 41 43 45 2c 20 62 75 74 20 74 68 65 20 0a  PLACE, but the .
7160: 20 20 2a 2a 20 70 72 65 2d 75 70 64 61 74 65 2d    ** pre-update-
7170: 68 6f 6f 6b 20 69 73 2e 0a 20 20 2a 2f 20 0a 20  hook is..  */ . 
7180: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
7190: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  ct==0 ){.    u8 
71a0: 70 35 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  p5 = 0;.    sqli
71b0: 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e  te3GenerateRowIn
71c0: 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65  dexDelete(pParse
71d0: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
71e0: 2c 20 69 49 64 78 43 75 72 2c 30 2c 69 49 64 78  , iIdxCur,0,iIdx
71f0: 4e 6f 53 65 65 6b 29 3b 0a 20 20 20 20 73 71 6c  NoSeek);.    sql
7200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7210: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 44 61  , OP_Delete, iDa
7220: 74 61 43 75 72 2c 20 28 63 6f 75 6e 74 3f 4f 50  taCur, (count?OP
7230: 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3a 30 29 29  FLAG_NCHANGE:0))
7240: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
7250: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 7c 7c 20 30  ->nested==0 || 0
7260: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
7270: 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
7280: 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29 20 29  sqlite_stat1") )
7290: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
72a0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
72b0: 63 68 61 72 2a 29 70 54 61 62 2c 20 50 34 5f 54  char*)pTab, P4_T
72c0: 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ABLE);.    }.   
72d0: 20 69 66 28 20 65 4d 6f 64 65 21 3d 4f 4e 45 50   if( eMode!=ONEP
72e0: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
72f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7300: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7310: 55 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 7d  UXDELETE);.    }
7320: 0a 20 20 20 20 69 66 28 20 69 49 64 78 4e 6f 53  .    if( iIdxNoS
7330: 65 65 6b 3e 3d 30 20 26 26 20 69 49 64 78 4e 6f  eek>=0 && iIdxNo
7340: 53 65 65 6b 21 3d 69 44 61 74 61 43 75 72 20 29  Seek!=iDataCur )
7350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7360: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7370: 44 65 6c 65 74 65 2c 20 69 49 64 78 4e 6f 53 65  Delete, iIdxNoSe
7380: 65 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ek);.    }.    i
7390: 66 28 20 65 4d 6f 64 65 3d 3d 4f 4e 45 50 41 53  f( eMode==ONEPAS
73a0: 53 5f 4d 55 4c 54 49 20 29 20 70 35 20 7c 3d 20  S_MULTI ) p5 |= 
73b0: 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
73c0: 49 4f 4e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ION;.    sqlite3
73d0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
73e0: 70 35 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  p5);.  }..  /* D
73f0: 6f 20 61 6e 79 20 4f 4e 20 43 41 53 43 41 44 45  o any ON CASCADE
7400: 2c 20 53 45 54 20 4e 55 4c 4c 20 6f 72 20 53 45  , SET NULL or SE
7410: 54 20 44 45 46 41 55 4c 54 20 6f 70 65 72 61 74  T DEFAULT operat
7420: 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
7430: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 72 6f 77  .  ** handle row
7440: 73 20 28 70 6f 73 73 69 62 6c 79 20 69 6e 20 6f  s (possibly in o
7450: 74 68 65 72 20 74 61 62 6c 65 73 29 20 74 68 61  ther tables) tha
7460: 74 20 72 65 66 65 72 20 76 69 61 20 61 20 66 6f  t refer via a fo
7470: 72 65 69 67 6e 20 6b 65 79 0a 20 20 2a 2a 20 74  reign key.  ** t
7480: 6f 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 64  o the row just d
7490: 65 6c 65 74 65 64 2e 20 2a 2f 20 0a 20 20 73 71  eleted. */ .  sq
74a0: 6c 69 74 65 33 46 6b 41 63 74 69 6f 6e 73 28 70  lite3FkActions(p
74b0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
74c0: 69 4f 6c 64 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  iOld, 0, 0);..  
74d0: 2f 2a 20 49 6e 76 6f 6b 65 20 41 46 54 45 52 20  /* Invoke AFTER 
74e0: 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 20 70  DELETE trigger p
74f0: 72 6f 67 72 61 6d 73 2e 20 2a 2f 0a 20 20 73 71  rograms. */.  sq
7500: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
7510: 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  ger(pParse, pTri
7520: 67 67 65 72 2c 20 0a 20 20 20 20 20 20 54 4b 5f  gger, .      TK_
7530: 44 45 4c 45 54 45 2c 20 30 2c 20 54 52 49 47 47  DELETE, 0, TRIGG
7540: 45 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20  ER_AFTER, pTab, 
7550: 69 4f 6c 64 2c 20 6f 6e 63 6f 6e 66 2c 20 69 4c  iOld, onconf, iL
7560: 61 62 65 6c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  abel.  );..  /* 
7570: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
7580: 20 72 6f 77 20 68 61 64 20 61 6c 72 65 61 64 79   row had already
7590: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 62 65   been deleted be
75a0: 66 6f 72 65 20 61 6e 79 20 42 45 46 4f 52 45 0a  fore any BEFORE.
75b0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
75c0: 67 72 61 6d 73 20 77 65 72 65 20 69 6e 76 6f 6b  grams were invok
75d0: 65 64 2e 20 4f 72 20 69 66 20 61 20 74 72 69 67  ed. Or if a trig
75e0: 67 65 72 20 70 72 6f 67 72 61 6d 20 74 68 72 6f  ger program thro
75f0: 77 73 20 61 20 0a 20 20 2a 2a 20 52 41 49 53 45  ws a .  ** RAISE
7600: 28 49 47 4e 4f 52 45 29 20 65 78 63 65 70 74 69  (IGNORE) excepti
7610: 6f 6e 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on.  */.  sqlite
7620: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
7630: 6c 28 76 2c 20 69 4c 61 62 65 6c 29 3b 0a 20 20  l(v, iLabel);.  
7640: 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
7650: 74 28 28 76 2c 20 22 45 4e 44 3a 20 47 65 6e 52  t((v, "END: GenR
7660: 6f 77 44 65 6c 28 29 22 29 29 3b 0a 7d 0a 0a 2f  owDel()"));.}../
7670: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7680: 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
7690: 20 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65   code that cause
76a0: 73 20 74 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f  s the deletion o
76b0: 66 20 61 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65  f all.** index e
76c0: 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
76d0: 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  d with a single 
76e0: 72 6f 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  row of a single 
76f0: 74 61 62 6c 65 2c 20 70 54 61 62 0a 2a 2a 0a 2a  table, pTab.**.*
7700: 2a 20 50 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  * Preconditions:
7710: 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 41 20 72  .**.**   1.  A r
7720: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
7730: 20 22 69 44 61 74 61 43 75 72 22 20 6d 75 73 74   "iDataCur" must
7740: 20 62 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   be open on the 
7750: 63 61 6e 6f 6e 69 63 61 6c 20 73 74 6f 72 61 67  canonical storag
7760: 65 0a 2a 2a 20 20 20 20 20 20 20 62 74 72 65 65  e.**       btree
7770: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70   for the table p
7780: 54 61 62 2e 20 20 28 54 68 69 73 20 77 69 6c 6c  Tab.  (This will
7790: 20 62 65 20 65 69 74 68 65 72 20 74 68 65 20 74   be either the t
77a0: 61 62 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 20  able itself.**  
77b0: 20 20 20 20 20 66 6f 72 20 72 6f 77 69 64 20 74       for rowid t
77c0: 61 62 6c 65 73 20 6f 72 20 74 6f 20 74 68 65 20  ables or to the 
77d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
77e0: 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
77f0: 57 49 44 0a 2a 2a 20 20 20 20 20 20 20 74 61 62  WID.**       tab
7800: 6c 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  les.).**.**   2.
7810: 20 20 52 65 61 64 2f 77 72 69 74 65 20 63 75 72    Read/write cur
7820: 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
7830: 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73  ices of pTab mus
7840: 74 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20  t be open as.** 
7850: 20 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d        cursor num
7860: 62 65 72 20 69 49 64 78 43 75 72 2b 69 20 66 6f  ber iIdxCur+i fo
7870: 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  r the i-th index
7880: 2e 20 20 28 54 68 65 20 70 54 61 62 2d 3e 70 49  .  (The pTab->pI
7890: 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ndex.**       in
78a0: 64 65 78 20 69 73 20 74 68 65 20 30 2d 74 68 20  dex is the 0-th 
78b0: 69 6e 64 65 78 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  index.).**.**   
78c0: 33 2e 20 20 54 68 65 20 22 69 44 61 74 61 43 75  3.  The "iDataCu
78d0: 72 22 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  r" cursor must b
78e0: 65 20 61 6c 72 65 61 64 79 20 62 65 20 70 6f 73  e already be pos
78f0: 69 74 69 6f 6e 65 64 20 6f 6e 20 74 68 65 20 72  itioned on the r
7900: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74 68 61 74  ow.**       that
7910: 20 69 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65   is to be delete
7920: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7930: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  e3GenerateRowInd
7940: 65 78 44 65 6c 65 74 65 28 0a 20 20 50 61 72 73  exDelete(.  Pars
7950: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
7960: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
7970: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
7980: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
7990: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a   *pTab,       /*
79a0: 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   Table containin
79b0: 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  g the row to be 
79c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
79d0: 20 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20   iDataCur,      
79e0: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61 62  /* Cursor of tab
79f0: 6c 65 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 2e  le holding data.
7a00: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
7a10: 72 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  r,       /* Firs
7a20: 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a  t index cursor *
7a30: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
7a40: 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64  ,      /* Only d
7a50: 65 6c 65 74 65 20 69 66 20 61 52 65 67 49 64 78  elete if aRegIdx
7a60: 21 3d 30 20 26 26 20 61 52 65 67 49 64 78 5b 69  !=0 && aRegIdx[i
7a70: 5d 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ]>0 */.  int iId
7a80: 78 4e 6f 53 65 65 6b 20 20 20 20 20 2f 2a 20 44  xNoSeek     /* D
7a90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 66 72 6f  o not delete fro
7aa0: 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  m this cursor */
7ab0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
7ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7ad0: 78 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  x loop counter *
7ae0: 2f 0a 20 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b  /.  int r1 = -1;
7af0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
7b00: 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
7b10: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  dex key */.  int
7b20: 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
7b30: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
7b40: 69 6f 6e 20 66 6f 72 20 73 6b 69 70 70 69 6e 67  ion for skipping
7b50: 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 65   partial index e
7b60: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 49 6e 64 65  ntries */.  Inde
7b70: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 2f  x *pIdx;       /
7b80: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
7b90: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 69  */.  Index *pPri
7ba0: 6f 72 20 3d 20 30 3b 20 2f 2a 20 50 72 69 6f 72  or = 0; /* Prior
7bb0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
7bc0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *v;           /
7bd0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
7be0: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
7bf0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
7c00: 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20 20 20   Index *pPk;    
7c10: 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
7c20: 45 59 20 69 6e 64 65 78 2c 20 6f 72 20 4e 55 4c  EY index, or NUL
7c30: 4c 20 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c  L for rowid tabl
7c40: 65 73 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61  es */..  v = pPa
7c50: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 50  rse->pVdbe;.  pP
7c60: 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61  k = HasRowid(pTa
7c70: 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  b) ? 0 : sqlite3
7c80: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
7c90: 70 54 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  pTab);.  for(i=0
7ca0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
7cb0: 64 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20  dex; pIdx; i++, 
7cc0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
7cd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
7ce0: 49 64 78 43 75 72 2b 69 21 3d 69 44 61 74 61 43  IdxCur+i!=iDataC
7cf0: 75 72 20 7c 7c 20 70 50 6b 3d 3d 70 49 64 78 20  ur || pPk==pIdx 
7d00: 29 3b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49  );.    if( aRegI
7d10: 64 78 21 3d 30 20 26 26 20 61 52 65 67 49 64 78  dx!=0 && aRegIdx
7d20: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
7d30: 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d  e;.    if( pIdx=
7d40: 3d 70 50 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b  =pPk ) continue;
7d50: 0a 20 20 20 20 69 66 28 20 69 49 64 78 43 75 72  .    if( iIdxCur
7d60: 2b 69 3d 3d 69 49 64 78 4e 6f 53 65 65 6b 20 29  +i==iIdxNoSeek )
7d70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 56   continue;.    V
7d80: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
7d90: 28 28 76 2c 20 22 47 65 6e 52 6f 77 49 64 78 44  ((v, "GenRowIdxD
7da0: 65 6c 20 66 6f 72 20 25 73 22 2c 20 70 49 64 78  el for %s", pIdx
7db0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ->zName));.    r
7dc0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72  1 = sqlite3Gener
7dd0: 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
7de0: 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61 43  se, pIdx, iDataC
7df0: 75 72 2c 20 30 2c 20 31 2c 0a 20 20 20 20 20 20  ur, 0, 1,.      
7e00: 20 20 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c    &iPartIdxLabel
7e10: 2c 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20  , pPrior, r1);. 
7e20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7e30: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7e40: 6c 65 74 65 2c 20 69 49 64 78 43 75 72 2b 69 2c  lete, iIdxCur+i,
7e50: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 70 49 64   r1,.        pId
7e60: 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f  x->uniqNotNull ?
7e70: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3a   pIdx->nKeyCol :
7e80: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
7e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
7ea0: 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
7eb0: 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78  pParse, iPartIdx
7ec0: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 70 50 72 69  Label);.    pPri
7ed0: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 7d  or = pIdx;.  }.}
7ee0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7ef0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7f00: 61 73 73 65 6d 62 6c 65 20 61 6e 20 69 6e 64 65  assemble an inde
7f10: 78 20 6b 65 79 20 61 6e 64 20 73 74 6f 72 65 73  x key and stores
7f20: 20 69 74 20 69 6e 20 72 65 67 69 73 74 65 72 0a   it in register.
7f30: 2a 2a 20 72 65 67 4f 75 74 2e 20 20 54 68 65 20  ** regOut.  The 
7f40: 6b 65 79 20 77 69 74 68 20 62 65 20 66 6f 72 20  key with be for 
7f50: 69 6e 64 65 78 20 70 49 64 78 20 77 68 69 63 68  index pIdx which
7f60: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
7f70: 70 54 61 62 2e 0a 2a 2a 20 69 43 75 72 20 69 73  pTab..** iCur is
7f80: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
7f90: 63 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  cursor open on t
7fa0: 68 65 20 70 54 61 62 20 74 61 62 6c 65 20 61 6e  he pTab table an
7fb0: 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  d pointing to.**
7fc0: 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
7fd0: 6e 65 65 64 73 20 69 6e 64 65 78 69 6e 67 2e 20  needs indexing. 
7fe0: 20 49 66 20 70 54 61 62 20 69 73 20 61 20 57 49   If pTab is a WI
7ff0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
8000: 65 2c 20 74 68 65 6e 0a 2a 2a 20 69 43 75 72 20  e, then.** iCur 
8010: 6d 75 73 74 20 62 65 20 74 68 65 20 63 75 72 73  must be the curs
8020: 6f 72 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  or of the PRIMAR
8030: 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 2a 2a 0a  Y KEY index..**.
8040: 2a 2a 20 52 65 74 75 72 6e 20 61 20 72 65 67 69  ** Return a regi
8050: 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 69 63  ster number whic
8060: 68 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  h is the first i
8070: 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20  n a block of.** 
8080: 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20 68  registers that h
8090: 6f 6c 64 73 20 74 68 65 20 65 6c 65 6d 65 6e 74  olds the element
80a0: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  s of the index k
80b0: 65 79 2e 20 20 54 68 65 0a 2a 2a 20 62 6c 6f 63  ey.  The.** bloc
80c0: 6b 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  k of registers h
80d0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
80e0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  deallocated by t
80f0: 68 65 20 74 69 6d 65 0a 2a 2a 20 74 68 69 73 20  he time.** this 
8100: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
8110: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 69 50 61 72  .**.** If *piPar
8120: 74 49 64 78 4c 61 62 65 6c 20 69 73 20 6e 6f 74  tIdxLabel is not
8130: 20 4e 55 4c 4c 2c 20 66 69 6c 6c 20 69 74 20 69   NULL, fill it i
8140: 6e 20 77 69 74 68 20 61 20 6c 61 62 65 6c 20 61  n with a label a
8150: 6e 64 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 74 68  nd jump.** to th
8160: 61 74 20 6c 61 62 65 6c 20 69 66 20 70 49 64 78  at label if pIdx
8170: 20 69 73 20 61 20 70 61 72 74 69 61 6c 20 69 6e   is a partial in
8180: 64 65 78 20 74 68 61 74 20 73 68 6f 75 6c 64 20  dex that should 
8190: 62 65 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 20 54  be skipped..** T
81a0: 68 65 20 6c 61 62 65 6c 20 73 68 6f 75 6c 64 20  he label should 
81b0: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 73 69 6e  be resolved usin
81c0: 67 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  g sqlite3Resolve
81d0: 50 61 72 74 49 64 78 4c 61 62 65 6c 28 29 2e 0a  PartIdxLabel()..
81e0: 2a 2a 20 41 20 70 61 72 74 69 61 6c 20 69 6e 64  ** A partial ind
81f0: 65 78 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  ex should be ski
8200: 70 70 65 64 20 69 66 20 69 74 73 20 57 48 45 52  pped if its WHER
8210: 45 20 63 6c 61 75 73 65 20 65 76 61 6c 75 61 74  E clause evaluat
8220: 65 73 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 6f  es.** to false o
8230: 72 20 6e 75 6c 6c 2e 20 20 49 66 20 70 49 64 78  r null.  If pIdx
8240: 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 69 61   is not a partia
8250: 6c 20 69 6e 64 65 78 2c 20 2a 70 69 50 61 72 74  l index, *piPart
8260: 49 64 78 4c 61 62 65 6c 0a 2a 2a 20 77 69 6c 6c  IdxLabel.** will
8270: 20 62 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   be set to zero 
8280: 77 68 69 63 68 20 69 73 20 61 6e 20 65 6d 70 74  which is an empt
8290: 79 20 6c 61 62 65 6c 20 74 68 61 74 20 69 73 20  y label that is 
82a0: 69 67 6e 6f 72 65 64 20 62 79 0a 2a 2a 20 73 71  ignored by.** sq
82b0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
82c0: 49 64 78 4c 61 62 65 6c 28 29 2e 0a 2a 2a 0a 2a  IdxLabel()..**.*
82d0: 2a 20 54 68 65 20 70 50 72 69 6f 72 20 61 6e 64  * The pPrior and
82e0: 20 72 65 67 50 72 69 6f 72 20 70 61 72 61 6d 65   regPrior parame
82f0: 74 65 72 73 20 61 72 65 20 75 73 65 64 20 74 6f  ters are used to
8300: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 63 61 63   implement a cac
8310: 68 65 20 74 6f 0a 2a 2a 20 61 76 6f 69 64 20 75  he to.** avoid u
8320: 6e 6e 65 63 65 73 73 61 72 79 20 72 65 67 69 73  nnecessary regis
8330: 74 65 72 20 6c 6f 61 64 73 2e 20 20 49 66 20 70  ter loads.  If p
8340: 50 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c  Prior is not NUL
8350: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  L, then it is.**
8360: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8370: 64 69 66 66 65 72 65 6e 74 20 69 6e 64 65 78 20  different index 
8380: 66 6f 72 20 77 68 69 63 68 20 61 6e 20 69 6e 64  for which an ind
8390: 65 78 20 6b 65 79 20 68 61 73 20 6a 75 73 74 20  ex key has just 
83a0: 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64  been.** computed
83b0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
83c0: 65 67 50 72 69 6f 72 2e 20 20 49 66 20 74 68 65  egPrior.  If the
83d0: 20 63 75 72 72 65 6e 74 20 70 49 64 78 20 69 6e   current pIdx in
83e0: 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 69 6e  dex is generatin
83f0: 67 0a 2a 2a 20 69 74 73 20 6b 65 79 20 69 6e 74  g.** its key int
8400: 6f 20 74 68 65 20 73 61 6d 65 20 73 65 71 75 65  o the same seque
8410: 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
8420: 20 61 6e 64 20 69 66 20 70 50 72 69 6f 72 20 61   and if pPrior a
8430: 6e 64 20 70 49 64 78 20 73 68 61 72 65 0a 2a 2a  nd pIdx share.**
8440: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 63 6f 6d   a column in com
8450: 6d 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65  mon, then the re
8460: 67 69 73 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  gister correspon
8470: 64 69 6e 67 20 74 6f 20 74 68 61 74 20 63 6f 6c  ding to that col
8480: 75 6d 6e 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68  umn already.** h
8490: 6f 6c 64 73 20 74 68 65 20 63 6f 72 72 65 63 74  olds the correct
84a0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6c   value and the l
84b0: 6f 61 64 69 6e 67 20 6f 66 20 74 68 61 74 20 72  oading of that r
84c0: 65 67 69 73 74 65 72 20 69 73 20 73 6b 69 70 70  egister is skipp
84d0: 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69  ed..** This opti
84e0: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 68 65 6c 70  mization is help
84f0: 66 75 6c 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  ful when doing a
8500: 20 44 45 4c 45 54 45 20 6f 72 20 61 6e 20 49 4e   DELETE or an IN
8510: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 0a 2a  TEGRITY_CHECK .*
8520: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 20 77 69 74  * on a table wit
8530: 68 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63  h multiple indic
8540: 65 73 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c  es, and especial
8550: 6c 79 20 77 69 74 68 20 74 68 65 20 52 4f 57 49  ly with the ROWI
8560: 44 20 6f 72 0a 2a 2a 20 50 52 49 4d 41 52 59 20  D or.** PRIMARY 
8570: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  KEY columns of t
8580: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74  he index..*/.int
8590: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
85a0: 49 6e 64 65 78 4b 65 79 28 0a 20 20 50 61 72 73  IndexKey(.  Pars
85b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
85c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
85d0: 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
85e0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  pIdx,         /*
85f0: 20 54 68 65 20 69 6e 64 65 78 20 66 6f 72 20 77   The index for w
8600: 68 69 63 68 20 74 6f 20 67 65 6e 65 72 61 74 65  hich to generate
8610: 20 61 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20   a key */.  int 
8620: 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 20  iDataCur,       
8630: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
8640: 72 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  r from which to 
8650: 74 61 6b 65 20 63 6f 6c 75 6d 6e 20 64 61 74 61  take column data
8660: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
8670: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75  ,          /* Pu
8680: 74 20 74 68 65 20 6e 65 77 20 6b 65 79 20 69 6e  t the new key in
8690: 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
86a0: 20 69 66 20 6e 6f 74 20 30 20 2a 2f 0a 20 20 69   if not 0 */.  i
86b0: 6e 74 20 70 72 65 66 69 78 4f 6e 6c 79 2c 20 20  nt prefixOnly,  
86c0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6f      /* Compute o
86d0: 6e 6c 79 20 61 20 75 6e 69 71 75 65 20 70 72 65  nly a unique pre
86e0: 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 2a  fix of the key *
86f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 50 61 72 74 49  /.  int *piPartI
8700: 64 78 4c 61 62 65 6c 2c 20 2f 2a 20 4f 55 54 3a  dxLabel, /* OUT:
8710: 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
8720: 62 65 6c 20 74 6f 20 73 6b 69 70 20 70 61 72 74  bel to skip part
8730: 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 49  ial index */.  I
8740: 6e 64 65 78 20 2a 70 50 72 69 6f 72 2c 20 20 20  ndex *pPrior,   
8750: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c      /* Previousl
8760: 79 20 67 65 6e 65 72 61 74 65 64 20 69 6e 64 65  y generated inde
8770: 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
8780: 65 67 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  egPrior         
8790: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
87a0: 69 6e 67 20 70 72 65 76 69 6f 75 73 20 67 65 6e  ing previous gen
87b0: 65 72 61 74 65 64 20 6b 65 79 20 2a 2f 0a 29 7b  erated key */.){
87c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
87d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
87e0: 74 20 6a 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  t j;.  int regBa
87f0: 73 65 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  se;.  int nCol;.
8800: 0a 20 20 69 66 28 20 70 69 50 61 72 74 49 64 78  .  if( piPartIdx
8810: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 69 66 28  Label ){.    if(
8820: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
8830: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  here ){.      *p
8840: 69 50 61 72 74 49 64 78 4c 61 62 65 6c 20 3d 20  iPartIdxLabel = 
8850: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
8860: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 70  abel(v);.      p
8870: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
8880: 3d 20 69 44 61 74 61 43 75 72 20 2b 20 31 3b 0a  = iDataCur + 1;.
8890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
88a0: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
88b0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
88c0: 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28  3ExprIfFalseDup(
88d0: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 50  pParse, pIdx->pP
88e0: 61 72 74 49 64 78 57 68 65 72 65 2c 20 2a 70 69  artIdxWhere, *pi
88f0: 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 20 0a 20  PartIdxLabel, . 
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
8920: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
8930: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65       pParse->iSe
8940: 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d  lfTab = 0;.    }
8950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 50  else{.      *piP
8960: 61 72 74 49 64 78 4c 61 62 65 6c 20 3d 20 30 3b  artIdxLabel = 0;
8970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f  .    }.  }.  nCo
8980: 6c 20 3d 20 28 70 72 65 66 69 78 4f 6e 6c 79 20  l = (prefixOnly 
8990: 26 26 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74  && pIdx->uniqNot
89a0: 4e 75 6c 6c 29 20 3f 20 70 49 64 78 2d 3e 6e 4b  Null) ? pIdx->nK
89b0: 65 79 43 6f 6c 20 3a 20 70 49 64 78 2d 3e 6e 43  eyCol : pIdx->nC
89c0: 6f 6c 75 6d 6e 3b 0a 20 20 72 65 67 42 61 73 65  olumn;.  regBase
89d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
89e0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
89f0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 50 72 69  Col);.  if( pPri
8a00: 6f 72 20 26 26 20 28 72 65 67 42 61 73 65 21 3d  or && (regBase!=
8a10: 72 65 67 50 72 69 6f 72 20 7c 7c 20 70 50 72 69  regPrior || pPri
8a20: 6f 72 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  or->pPartIdxWher
8a30: 65 29 20 29 20 70 50 72 69 6f 72 20 3d 20 30 3b  e) ) pPrior = 0;
8a40: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43  .  for(j=0; j<nC
8a50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; j++){.    if
8a60: 28 20 70 50 72 69 6f 72 0a 20 20 20 20 20 26 26  ( pPrior.     &&
8a70: 20 70 50 72 69 6f 72 2d 3e 61 69 43 6f 6c 75 6d   pPrior->aiColum
8a80: 6e 5b 6a 5d 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  n[j]==pIdx->aiCo
8a90: 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 26 26 20  lumn[j].     && 
8aa0: 70 50 72 69 6f 72 2d 3e 61 69 43 6f 6c 75 6d 6e  pPrior->aiColumn
8ab0: 5b 6a 5d 21 3d 58 4e 5f 45 58 50 52 0a 20 20 20  [j]!=XN_EXPR.   
8ac0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
8ad0: 73 20 63 6f 6c 75 6d 6e 20 77 61 73 20 61 6c 72  s column was alr
8ae0: 65 61 64 79 20 63 6f 6d 70 75 74 65 64 20 62 79  eady computed by
8af0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
8b00: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  dex */.      con
8b10: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
8b20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8b30: 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28  LoadIndexColumn(
8b40: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44  pParse, pIdx, iD
8b50: 61 74 61 43 75 72 2c 20 6a 2c 20 72 65 67 42 61  ataCur, j, regBa
8b60: 73 65 2b 6a 29 3b 0a 20 20 20 20 2f 2a 20 49 66  se+j);.    /* If
8b70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
8b80: 6e 69 74 79 20 69 73 20 52 45 41 4c 20 62 75 74  nity is REAL but
8b90: 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 61   the number is a
8ba0: 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  n integer, then 
8bb0: 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  it.    ** might 
8bc0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
8bd0: 20 74 61 62 6c 65 20 61 73 20 61 6e 20 69 6e 74   table as an int
8be0: 65 67 65 72 20 28 75 73 69 6e 67 20 61 20 63 6f  eger (using a co
8bf0: 6d 70 61 63 74 0a 20 20 20 20 2a 2a 20 72 65 70  mpact.    ** rep
8c00: 72 65 73 65 6e 74 61 74 69 6f 6e 29 20 74 68 65  resentation) the
8c10: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 52  n converted to R
8c20: 45 41 4c 20 62 79 20 61 6e 20 4f 50 5f 52 65 61  EAL by an OP_Rea
8c30: 6c 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  lAffinity opcode
8c40: 2e 0a 20 20 20 20 2a 2a 20 42 75 74 20 77 65 20  ..    ** But we 
8c50: 61 72 65 20 67 65 74 74 69 6e 67 20 72 65 61 64  are getting read
8c60: 79 20 74 6f 20 73 74 6f 72 65 20 74 68 69 73 20  y to store this 
8c70: 76 61 6c 75 65 20 62 61 63 6b 20 69 6e 74 6f 20  value back into 
8c80: 61 6e 20 69 6e 64 65 78 2c 20 77 68 65 72 65 0a  an index, where.
8c90: 20 20 20 20 2a 2a 20 69 74 20 73 68 6f 75 6c 64      ** it should
8ca0: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 62 79   be converted by
8cb0: 20 74 6f 20 49 4e 54 45 47 45 52 20 61 67 61 69   to INTEGER agai
8cc0: 6e 2e 20 20 53 6f 20 6f 6d 69 74 20 74 68 65 20  n.  So omit the 
8cd0: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 0a  OP_RealAffinity.
8ce0: 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 66      ** opcode if
8cf0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a   it is present *
8d00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
8d10: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
8d20: 64 65 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  de(v, OP_RealAff
8d30: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 20 20 69 66  inity);.  }.  if
8d40: 28 20 72 65 67 4f 75 74 20 29 7b 0a 20 20 20 20  ( regOut ){.    
8d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8d60: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8d70: 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
8d80: 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  l, regOut);.    
8d90: 69 66 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  if( pIdx->pTable
8da0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
8db0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8dc0: 41 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Aff = sqlite3Ind
8dd0: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 70 50  exAffinityStr(pP
8de0: 61 72 73 65 2d 3e 64 62 2c 20 70 49 64 78 29 3b  arse->db, pIdx);
8df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
8e10: 2c 20 7a 41 66 66 2c 20 50 34 5f 54 52 41 4e 53  , zAff, P4_TRANS
8e20: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
8e30: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
8e40: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8e50: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
8e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  );.  return regB
8e70: 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ase;.}../*.** If
8e80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
8e90: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
8ea0: 49 6e 64 65 78 4b 65 79 28 29 20 67 65 6e 65 72  IndexKey() gener
8eb0: 61 74 65 64 20 61 20 6a 75 6d 70 2d 6f 76 65 72  ated a jump-over
8ec0: 20 6c 61 62 65 6c 0a 2a 2a 20 62 65 63 61 75 73   label.** becaus
8ed0: 65 20 69 74 20 77 61 73 20 61 20 70 61 72 74 69  e it was a parti
8ee0: 61 6c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74  al index, then t
8ef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
8f00: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 0a  ld be called to.
8f10: 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 61 74 20  ** resolve that 
8f20: 6c 61 62 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  label..*/.void s
8f30: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
8f40: 74 49 64 78 4c 61 62 65 6c 28 50 61 72 73 65 20  tIdxLabel(Parse 
8f50: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 4c 61  *pParse, int iLa
8f60: 62 65 6c 29 7b 0a 20 20 69 66 28 20 69 4c 61 62  bel){.  if( iLab
8f70: 65 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  el ){.    sqlite
8f80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
8f90: 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  l(pParse->pVdbe,
8fa0: 20 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20 73 71   iLabel);.    sq
8fb0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
8fc0: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d  p(pParse);.  }.}
8fd0: 0a                                               .