/ Hex Artifact Content
Login

Artifact f9ab9738c5a6fed434ec9e7721a178f58f65f57a:


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 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 44 45 4c 45 54 45 20 46   handle DELETE F
01d0: 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ROM statements..
01e0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 65 6c 65 74  **.** $Id: delet
01f0: 65 2e 63 2c 76 20 31 2e 33 33 20 32 30 30 32 2f  e.c,v 1.33 2002/
0200: 30 35 2f 31 39 20 32 33 3a 34 33 3a 31 34 20 64  05/19 23:43:14 d
0210: 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24  anielk1977 Exp $
0220: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0230: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a  liteInt.h".../*.
0240: 2a 2a 20 47 69 76 65 6e 20 61 20 74 61 62 6c 65  ** Given a table
0250: 20 6e 61 6d 65 2c 20 66 69 6e 64 20 74 68 65 20   name, find the 
0260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
0270: 62 6c 65 20 61 6e 64 20 6d 61 6b 65 20 73 75 72  ble and make sur
0280: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  e the.** table i
0290: 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 47 65  s writeable.  Ge
02a0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
02b0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  and return NULL 
02c0: 69 66 20 6e 6f 74 2e 20 20 49 66 0a 2a 2a 20 65  if not.  If.** e
02d0: 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
02e0: 20 6f 75 74 2c 20 72 65 74 75 72 6e 20 61 20 70   out, return a p
02f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
0300: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ble structure..*
0310: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54  /.Table *sqliteT
0320: 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28  ableNameToTable(
0330: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
0340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
0350: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
0360: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
0370: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
0380: 2d 3e 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 69  ->db, zTab);.  i
0390: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
03a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
03b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
03c0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
03d0: 6c 65 3a 20 22 2c 20 7a 54 61 62 2c 20 30 29 3b  le: ", zTab, 0);
03e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
03f0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
0400: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  0;.  }.  if( pTa
0410: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70  b->readOnly || p
0420: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
0430: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
0440: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
0450: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 70 54 61  rMsg, .      pTa
0460: 62 2d 3e 70 53 65 6c 65 63 74 20 3f 20 22 76 69  b->pSelect ? "vi
0470: 65 77 20 22 20 3a 20 22 74 61 62 6c 65 20 22 2c  ew " : "table ",
0480: 0a 20 20 20 20 20 20 7a 54 61 62 2c 0a 20 20 20  .      zTab,.   
0490: 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20     " may not be 
04a0: 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  modified", 0);. 
04b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
04c0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
04d0: 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 72 65 74        .  }.  ret
04e0: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
04f0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 61 62 6c 65  ** Given a table
0500: 20 6e 61 6d 65 2c 20 63 68 65 63 6b 20 74 6f 20   name, check to 
0510: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 61  make sure the ta
0520: 62 6c 65 20 65 78 69 73 74 73 2c 20 69 73 20 77  ble exists, is w
0530: 72 69 74 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 69  ritable.** and i
0540: 73 20 6e 6f 74 20 61 20 76 69 65 77 2e 20 20 49  s not a view.  I
0550: 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
0560: 4f 4b 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  OK, construct an
0570: 20 49 64 4c 69 73 74 20 68 6f 6c 64 69 6e 67 0a   IdList holding.
0580: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ** the table and
0590: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
05a0: 72 20 74 6f 20 74 68 65 20 49 64 4c 69 73 74 2e  r to the IdList.
05b0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
05c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
05d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
05e0: 65 69 6e 67 20 74 68 65 20 49 64 4c 69 73 74 20  eing the IdList 
05f0: 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
0600: 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2a  shed with it..**
0610: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
0620: 65 72 72 6f 72 2c 20 6c 65 61 76 65 20 61 20 6d  error, leave a m
0630: 65 73 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65  essage on pParse
0640: 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  ->zErrMsg and re
0650: 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 2e 0a 2a 2f  turn.** NULL..*/
0660: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 54  .IdList *sqliteT
0670: 61 62 6c 65 54 6f 6b 65 6e 54 6f 49 64 4c 69 73  ableTokenToIdLis
0680: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
0690: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
06a0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  me){.  Table *pT
06b0: 61 62 3b 0a 20 20 49 64 4c 69 73 74 20 2a 70 54  ab;.  IdList *pT
06c0: 61 62 4c 69 73 74 3b 0a 0a 20 20 70 54 61 62 4c  abList;..  pTabL
06d0: 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69  ist = sqliteIdLi
06e0: 73 74 41 70 70 65 6e 64 28 30 2c 20 70 54 61 62  stAppend(0, pTab
06f0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
0700: 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  TabList==0 ) ret
0710: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
0720: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3d 3d   pTabList->nId==
0730: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
0740: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54  liteTableNameToT
0750: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
0760: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  bList->a[0].zNam
0770: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
0780: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 49  0 ){.    sqliteI
0790: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62  dListDelete(pTab
07a0: 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
07b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  n 0;.  }.  pTabL
07c0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d  ist->a[0].pTab =
07d0: 20 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20   pTab;.  return 
07e0: 70 54 61 62 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  pTabList;.}../*.
07f0: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 44 45 4c  ** Process a DEL
0800: 45 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65  ETE FROM stateme
0810: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
0820: 74 65 44 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20  teDeleteFrom(.  
0830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
0850: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
0860: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
0870: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ame,     /* The 
0880: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
0890: 20 77 65 20 73 68 6f 75 6c 64 20 64 65 6c 65 74   we should delet
08a0: 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78  e things */.  Ex
08b0: 70 72 20 2a 70 57 68 65 72 65 20 20 20 20 20 20  pr *pWhere      
08c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
08d0: 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
08e0: 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 56  e null */.){.  V
08f0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
0900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
0910: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0920: 67 69 6e 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  gine */.  Table 
0930: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
0940: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
0950: 6f 6d 20 77 68 69 63 68 20 72 65 63 6f 72 64 73  om which records
0960: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
0970: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54   */.  IdList *pT
0980: 61 62 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  abList;      /* 
0990: 41 6e 20 49 44 20 6c 69 73 74 20 68 6f 6c 64 69  An ID list holdi
09a0: 6e 67 20 70 54 61 62 20 61 6e 64 20 6e 6f 74 68  ng pTab and noth
09b0: 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20 20 69 6e  ing else */.  in
09c0: 74 20 65 6e 64 2c 20 61 64 64 72 3b 20 20 20 20  t end, addr;    
09d0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 75 70 6c 65       /* A couple
09e0: 20 61 64 64 72 65 73 73 65 73 20 6f 66 20 67 65   addresses of ge
09f0: 6e 65 72 61 74 65 64 20 63 6f 64 65 20 2a 2f 0a  nerated code */.
0a00: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
0a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
0a20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68   counter */.  Wh
0a30: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
0a40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0a50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
0a60: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
0a70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
0a80: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
0a90: 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63  oping over indic
0aa0: 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
0ab0: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20 20  */.  int base;  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
0ad0: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
0ae0: 74 20 61 76 61 69 6c 61 62 6c 65 20 74 61 62 6c  t available tabl
0af0: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
0b00: 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20 20 20  lite *db;       
0b10: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74       /* Main dat
0b20: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20  abase structure 
0b30: 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b  */.  int openOp;
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0b50: 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20 6f 70  pcode used to op
0b60: 65 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74  en a cursor to t
0b70: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
0b80: 6e 74 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f  nt row_triggers_
0b90: 65 78 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  exist = 0;.  int
0ba0: 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 0a 0a 20   oldIdx = -1;.. 
0bb0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
0bc0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
0bd0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
0be0: 20 70 54 61 62 4c 69 73 74 20 3d 20 30 3b 0a 20   pTabList = 0;. 
0bf0: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
0c00: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
0c10: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
0c20: 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
0c30: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
0c40: 63 61 73 65 20 6f 66 20 61 20 56 49 45 57 20 77  case of a VIEW w
0c50: 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ith one or more 
0c60: 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  ON DELETE trigge
0c70: 72 73 20 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64  rs .  ** defined
0c80: 20 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 54   .  */.  {.    T
0c90: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
0ca0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 73 71 6c  char *zTab = sql
0cb0: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
0cc0: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
0cd0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 61 62  );..    if( zTab
0ce0: 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70   != 0 ){.      p
0cf0: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
0d00: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
0d10: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
0d20: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
0d30: 20 20 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f     row_triggers_
0d40: 65 78 69 73 74 20 3d 20 0a 20 20 20 20 20 20 20  exist = .       
0d50: 20 20 20 73 71 6c 69 74 65 54 72 69 67 67 65 72     sqliteTrigger
0d60: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
0d70: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2c 20 0a  Tab->pTrigger, .
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 4b                TK
0d90: 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 42 45 46 4f  _DELETE, TK_BEFO
0da0: 52 45 2c 20 54 4b 5f 52 4f 57 2c 20 30 29 20 7c  RE, TK_ROW, 0) |
0db0: 7c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  |.          sqli
0dc0: 74 65 54 72 69 67 67 65 72 73 45 78 69 73 74 28  teTriggersExist(
0dd0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 54  pParse, pTab->pT
0de0: 72 69 67 67 65 72 2c 20 0a 20 20 20 20 20 20 20  rigger, .       
0df0: 20 20 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45         TK_DELETE
0e00: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 52  , TK_AFTER, TK_R
0e10: 4f 57 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  OW, 0);.      }.
0e20: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
0e30: 28 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66  (zTab);.      if
0e40: 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f 65  ( row_triggers_e
0e50: 78 69 73 74 20 26 26 20 20 70 54 61 62 2d 3e 70  xist &&  pTab->p
0e60: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
0e70: 20 20 2f 2a 20 4a 75 73 74 20 66 69 72 65 20 56    /* Just fire V
0e80: 49 45 57 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  IEW triggers */.
0e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 69          sqliteVi
0ea0: 65 77 54 72 69 67 67 65 72 73 28 70 50 61 72 73  ewTriggers(pPars
0eb0: 65 2c 20 70 54 61 62 2c 20 70 57 68 65 72 65 2c  e, pTab, pWhere,
0ec0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 30 29 3b   OE_Replace, 0);
0ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
0ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0ef0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
0f00: 74 68 65 20 74 61 62 6c 65 20 77 68 69 63 68 20  the table which 
0f10: 77 65 20 77 61 6e 74 20 74 6f 20 64 65 6c 65 74  we want to delet
0f20: 65 2e 20 20 54 68 69 73 20 74 61 62 6c 65 20 68  e.  This table h
0f30: 61 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 75  as to be.  ** pu
0f40: 74 20 69 6e 20 61 6e 20 49 64 4c 69 73 74 20 73  t in an IdList s
0f50: 74 72 75 63 74 75 72 65 20 62 65 63 61 75 73 65  tructure because
0f60: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 75 62   some of the sub
0f70: 72 6f 75 74 69 6e 65 73 20 77 65 0a 20 20 2a 2a  routines we.  **
0f80: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 69 6e 67   will be calling
0f90: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
0fa0: 20 77 6f 72 6b 20 77 69 74 68 20 6d 75 6c 74 69   work with multi
0fb0: 70 6c 65 20 74 61 62 6c 65 73 20 61 6e 64 20 65  ple tables and e
0fc0: 78 70 65 63 74 0a 20 20 2a 2a 20 61 6e 20 49 64  xpect.  ** an Id
0fd0: 4c 69 73 74 2a 20 70 61 72 61 6d 65 74 65 72 20  List* parameter 
0fe0: 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20  instead of just 
0ff0: 61 20 54 61 62 6c 65 2a 20 70 61 72 61 6d 65 67  a Table* parameg
1000: 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  er..  */.  pTabL
1010: 69 73 74 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ist = sqliteTabl
1020: 65 54 6f 6b 65 6e 54 6f 49 64 4c 69 73 74 28 70  eTokenToIdList(p
1030: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
1040: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69  e);.  if( pTabLi
1050: 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 6c  st==0 ) goto del
1060: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
1070: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
1080: 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 3b 0a  List->nId==1 );.
1090: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
10a0: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  t->a[0].pTab;.  
10b0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
10c0: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  elect==0 );  /* 
10d0: 54 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e 6f  This table is no
10e0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 0a 20 20 69  t a view */..  i
10f0: 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f  f( row_triggers_
1100: 65 78 69 73 74 20 29 7b 20 0a 20 20 20 20 6f 6c  exist ){ .    ol
1110: 64 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  dIdx = pParse->n
1120: 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Tab++;.  }..  /*
1130: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
1140: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  umn names in all
1150: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1160: 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20  ..  */.  base = 
1170: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1180: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a    if( pWhere ){.
1190: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11a0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
11b0: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
11c0: 69 73 74 2c 20 30 2c 20 70 57 68 65 72 65 29 20  ist, 0, pWhere) 
11d0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
11e0: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
11f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
1200: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
1210: 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
1220: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
1230: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
1240: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
1250: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1270: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1280: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
1290: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
12a0: 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  .    goto delete
12b0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
12c0: 20 7d 0a 20 20 69 66 28 20 72 6f 77 5f 74 72 69   }.  if( row_tri
12d0: 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 20 0a  ggers_exist ){ .
12e0: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 4d      sqliteBeginM
12f0: 75 6c 74 69 57 72 69 74 65 4f 70 65 72 61 74 69  ultiWriteOperati
1300: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 20  on(pParse);.  } 
1310: 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c 69 74  else {.    sqlit
1320: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
1330: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
1340: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1350: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 6f  ze the counter o
1360: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1370: 72 6f 77 73 20 64 65 6c 65 74 65 64 2c 20 69 66  rows deleted, if
1380: 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 63 6f 75  .  ** we are cou
1390: 6e 74 69 6e 67 20 72 6f 77 73 2e 0a 20 20 2a 2f  nting rows..  */
13a0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
13b0: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
13c0: 6f 77 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ows ){.    sqlit
13d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13e0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
13f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
1400: 61 6c 20 63 61 73 65 3a 20 41 20 44 45 4c 45 54  al case: A DELET
1410: 45 20 77 69 74 68 6f 75 74 20 61 20 57 48 45 52  E without a WHER
1420: 45 20 63 6c 61 75 73 65 20 64 65 6c 65 74 65 73  E clause deletes
1430: 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
1440: 2a 20 49 74 20 69 73 20 65 61 73 69 65 72 20 6a  * It is easier j
1450: 75 73 74 20 74 6f 20 65 72 61 73 65 20 74 68 65  ust to erase the
1460: 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e 0a 20 20   whole table..  
1470: 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d  */.  if( pWhere=
1480: 3d 30 20 26 26 20 21 72 6f 77 5f 74 72 69 67 67  =0 && !row_trigg
1490: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
14a0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
14b0: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
14c0: 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  s ){.      /* If
14d0: 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77 73 20 64   counting rows d
14e0: 65 6c 65 74 65 64 2c 20 6a 75 73 74 20 63 6f 75  eleted, just cou
14f0: 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  nt the total num
1500: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
1510: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74  entries in the t
1520: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  able. */.      i
1530: 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73  nt endOfLoop = s
1540: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
1550: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1560: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 6f 70 65   addr;.      ope
1570: 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  nOp = pTab->isTe
1580: 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78 20  mp ? OP_OpenAux 
1590: 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 20 20 20  : OP_Open;.     
15a0: 20 61 73 73 65 72 74 28 20 62 61 73 65 3d 3d 30   assert( base==0
15b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
15c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
15d0: 6e 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e  nOp, 0, pTab->tn
15e0: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
15f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1600: 5f 52 65 77 69 6e 64 2c 20 30 2c 20 73 71 6c 69  _Rewind, 0, sqli
1610: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
1620: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 61  r(v)+2);.      a
1630: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
1640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
1650: 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  mm, 1, 0);.     
1660: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1670: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20  (v, OP_Next, 0, 
1680: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  addr);.      sql
1690: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
16a0: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
16b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
16c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
16d0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
16e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
16f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
1700: 61 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  ar, pTab->tnum, 
1710: 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  pTab->isTemp);. 
1720: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1730: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1740: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1750: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
1760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
1770: 6c 65 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  lear, pIdx->tnum
1780: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
1790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17a0: 20 54 68 65 20 75 73 75 61 6c 20 63 61 73 65 3a   The usual case:
17b0: 20 54 68 65 72 65 20 69 73 20 61 20 57 48 45 52   There is a WHER
17c0: 45 20 63 6c 61 75 73 65 20 73 6f 20 77 65 20 68  E clause so we h
17d0: 61 76 65 20 74 6f 20 73 63 61 6e 20 74 68 72 6f  ave to scan thro
17e0: 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ugh.  ** the tab
17f0: 6c 65 20 61 6e 20 70 69 63 6b 20 77 68 69 63 68  le an pick which
1800: 20 72 65 63 6f 72 64 73 20 74 6f 20 64 65 6c 65   records to dele
1810: 74 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  te..  */.  else{
1820: 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
1830: 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
1840: 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
1850: 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42  o = sqliteWhereB
1860: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 62 61 73  egin(pParse, bas
1870: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
1880: 65 72 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ere, 1);.    if(
1890: 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
18a0: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
18b0: 65 61 6e 75 70 3b 0a 0a 20 20 20 20 2f 2a 20 52  eanup;..    /* R
18c0: 65 6d 65 6d 62 65 72 20 74 68 65 20 6b 65 79 20  emember the key 
18d0: 6f 66 20 65 76 65 72 79 20 69 74 65 6d 20 74 6f  of every item to
18e0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   be deleted..   
18f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 56 64   */.    sqliteVd
1900: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
1910: 73 74 57 72 69 74 65 2c 20 30 2c 20 30 29 3b 0a  stWrite, 0, 0);.
1920: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
1930: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
1940: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71  Rows ){.      sq
1950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1960: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30   OP_AddImm, 1, 0
1970: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1980: 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
1990: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
19a0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 57 68   */.    sqliteWh
19b0: 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
19c0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65  .    /* Delete e
19d0: 76 65 72 79 20 69 74 65 6d 20 77 68 6f 73 65 20  very item whose 
19e0: 6b 65 79 20 77 61 73 20 77 72 69 74 74 65 6e 20  key was written 
19f0: 74 6f 20 74 68 65 20 6c 69 73 74 20 64 75 72 69  to the list duri
1a00: 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ng the.    ** da
1a10: 74 61 62 61 73 65 20 73 63 61 6e 2e 20 20 57 65  tabase scan.  We
1a20: 20 68 61 76 65 20 74 6f 20 64 65 6c 65 74 65 20   have to delete 
1a30: 69 74 65 6d 73 20 61 66 74 65 72 20 74 68 65 20  items after the 
1a40: 73 63 61 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65  scan is complete
1a50: 0a 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20  .    ** because 
1a60: 64 65 6c 65 74 69 6e 67 20 61 6e 20 69 74 65 6d  deleting an item
1a70: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20   can change the 
1a80: 73 63 61 6e 20 6f 72 64 65 72 2e 0a 20 20 20 20  scan order..    
1a90: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  */.    sqliteVdb
1aa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73  eAddOp(v, OP_Lis
1ab0: 74 52 65 77 69 6e 64 2c 20 30 2c 20 30 29 3b 0a  tRewind, 0, 0);.
1ac0: 20 20 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65      end = sqlite
1ad0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ae0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 6f 77 5f 74  ;..    if( row_t
1af0: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b  riggers_exist ){
1b00: 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1b10: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
1b20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1b30: 50 5f 4c 69 73 74 52 65 61 64 2c 20 30 2c 20 65  P_ListRead, 0, e
1b40: 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
1b50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1b60: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  _Dup, 0, 0);..  
1b70: 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61      openOp = pTa
1b80: 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f  b->isTemp ? OP_O
1b90: 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e  penAux : OP_Open
1ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
1bb0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
1bc0: 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  p, base, pTab->t
1bd0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  num);.      sqli
1be0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1bf0: 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20  P_MoveTo, base, 
1c00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1c10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c20: 4f 70 65 6e 54 65 6d 70 2c 20 6f 6c 64 49 64 78  OpenTemp, oldIdx
1c30: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  , 0);..      sql
1c40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1c50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 33 2c 20  OP_Integer, 13, 
1c60: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  0);.      for(ii
1c70: 20 3d 20 30 3b 20 69 69 3c 70 54 61 62 2d 3e 6e   = 0; ii<pTab->n
1c80: 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Col; ii++){.    
1c90: 20 20 20 20 69 66 28 20 69 69 3d 3d 70 54 61 62      if( ii==pTab
1ca0: 2d 3e 69 50 4b 65 79 20 29 7b 20 0a 20 20 20 20  ->iPKey ){ .    
1cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
1cc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
1cd0: 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 09 7d 20  o, base, 0);..} 
1ce0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
1cf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1d00: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 62  (v, OP_Column, b
1d10: 61 73 65 2c 20 69 69 29 3b 0a 09 7d 0a 20 20 20  ase, ii);..}.   
1d20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1d40: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61  _MakeRecord, pTa
1d50: 62 2d 3e 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  b->nCol, 0);.   
1d60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1d70: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
1d80: 65 79 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a  ey, oldIdx, 0);.
1d90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
1da0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
1db0: 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20  e, base, 0);.   
1dc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1dd0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
1de0: 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 0a 20 20   oldIdx, 0);..  
1df0: 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52 6f      sqliteCodeRo
1e00: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
1e10: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54   TK_DELETE, 0, T
1e20: 4b 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20  K_BEFORE, pTab, 
1e30: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6f  -1, .          o
1e40: 6c 64 49 64 78 2c 20 28 70 50 61 72 73 65 2d 3e  ldIdx, (pParse->
1e50: 74 72 69 67 53 74 61 63 6b 29 3f 70 50 61 72 73  trigStack)?pPars
1e60: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72  e->trigStack->or
1e70: 63 6f 6e 66 3a 4f 45 5f 44 65 66 61 75 6c 74 29  conf:OE_Default)
1e80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1e90: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65  rse->nTab = base
1ea0: 20 2b 20 31 3b 0a 20 20 20 20 6f 70 65 6e 4f 70   + 1;.    openOp
1eb0: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20   = pTab->isTemp 
1ec0: 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a  ? OP_OpenWrAux :
1ed0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
1ee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1ef0: 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61  Op(v, openOp, ba
1f00: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  se, pTab->tnum);
1f10: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
1f20: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1f30: 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64 78   pIdx; i++, pIdx
1f40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
1f50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
1f60: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
1f70: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 2c 20  pParse->nTab++, 
1f80: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
1f90: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 72 6f 77   }..    if( !row
1fa0: 5f 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  _triggers_exist 
1fb0: 29 7b 20 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ){ .      addr =
1fc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1fd0: 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c  (v, OP_ListRead,
1fe0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 7d 0a   0, end);.    }.
1ff0: 0a 20 20 20 20 73 71 6c 69 74 65 47 65 6e 65 72  .    sqliteGener
2000: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 76 2c 20  ateRowDelete(v, 
2010: 70 54 61 62 2c 20 62 61 73 65 2c 20 70 50 61 72  pTab, base, pPar
2020: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3f 30 3a  se->trigStack?0:
2030: 31 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 6f 77  1);..    if( row
2040: 5f 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  _triggers_exist 
2050: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ){.      for(i=1
2060: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
2070: 64 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20  dex; pIdx; i++, 
2080: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
20b0: 5f 43 6c 6f 73 65 2c 20 62 61 73 65 20 2b 20 69  _Close, base + i
20c0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
20d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
20f0: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
2100: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2110: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  CodeRowTrigger(p
2120: 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45  Parse, TK_DELETE
2130: 2c 20 30 2c 20 54 4b 5f 41 46 54 45 52 2c 20 70  , 0, TK_AFTER, p
2140: 54 61 62 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  Tab, -1, .      
2150: 20 20 20 20 6f 6c 64 49 64 78 2c 20 28 70 50 61      oldIdx, (pPa
2160: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 29 3f  rse->trigStack)?
2170: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
2180: 6b 2d 3e 6f 72 63 6f 6e 66 3a 4f 45 5f 44 65 66  k->orconf:OE_Def
2190: 61 75 6c 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ault);.    }..  
21a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
21b0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
21c0: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
21d0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
21e0: 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20 20  el(v, end);.    
21f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2200: 76 2c 20 4f 50 5f 4c 69 73 74 52 65 73 65 74 2c  v, OP_ListReset,
2210: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
2220: 20 21 72 6f 77 5f 74 72 69 67 67 65 72 73 5f 65   !row_triggers_e
2230: 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  xist ){.      fo
2240: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
2250: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2260: 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e  i++, pIdx=pIdx->
2270: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
2280: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2290: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
22a0: 65 20 2b 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  e + i, pIdx->tnu
22b0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
22c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
22d0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
22e0: 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ase, 0);.      p
22f0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61  Parse->nTab = ba
2300: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  se;.    }.  }.  
2310: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
2320: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
2330: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 74 75  ..  /*.  ** Retu
2340: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2350: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
2360: 64 65 6c 65 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  deleted..  */.  
2370: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2380: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
2390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
23a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
23b0: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 29  lumnCount, 1, 0)
23c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
23d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
23e0: 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20  mnName, 0, 0);. 
23f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
2400: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f  ngeP3(v, -1, "ro
2410: 77 73 20 64 65 6c 65 74 65 64 22 2c 20 50 33 5f  ws deleted", P3_
2420: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
2430: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2440: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20  OP_Callback, 1, 
2450: 30 29 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65 5f  0);.  }..delete_
2460: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  from_cleanup:.  
2470: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
2480: 74 65 28 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  te(pTabList);.  
2490: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
24a0: 28 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75  (pWhere);.  retu
24b0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
24c0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
24d0: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
24e0: 61 74 20 63 61 75 73 65 73 20 61 20 73 69 6e 67  at causes a sing
24f0: 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a 2a 20 73  le row of a.** s
2500: 69 6e 67 6c 65 20 74 61 62 6c 65 20 74 6f 20 62  ingle table to b
2510: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
2520: 20 54 68 65 20 56 44 42 45 20 6d 75 73 74 20 62   The VDBE must b
2530: 65 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  e in a particula
2540: 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
2550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2560: 6c 65 64 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72  led..** These ar
2570: 65 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e  e the requiremen
2580: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  ts:.**.**   1.  
2590: 41 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  A read/write cur
25a0: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
25b0: 70 54 61 62 2c 20 74 68 65 20 74 61 62 6c 65 20  pTab, the table 
25c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
25d0: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 62  ow.**       to b
25e0: 65 20 64 65 6c 65 74 65 64 2c 20 6d 75 73 74 20  e deleted, must 
25f0: 62 65 20 6f 70 65 6e 65 64 20 61 73 20 63 75 72  be opened as cur
2600: 73 6f 72 20 6e 75 6d 62 65 72 20 22 62 61 73 65  sor number "base
2610: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 52  "..**.**   2.  R
2620: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
2630: 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
2640: 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74 20 62  s of pTab must b
2650: 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20 20  e open as.**    
2660: 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72     cursor number
2670: 20 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65 20   base+i for the 
2680: 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  i-th index..**.*
2690: 2a 20 20 20 33 2e 20 20 54 68 65 20 72 65 63 6f  *   3.  The reco
26a0: 72 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  rd number of the
26b0: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
26c0: 65 64 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ed must be on th
26d0: 65 20 74 6f 70 0a 2a 2a 20 20 20 20 20 20 20 6f  e top.**       o
26e0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
26f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2700: 70 6f 70 73 20 74 68 65 20 74 6f 70 20 6f 66 20  pops the top of 
2710: 74 68 65 20 73 74 61 63 6b 20 74 6f 20 72 65 6d  the stack to rem
2720: 6f 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ove the record n
2730: 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65  umber.** and the
2740: 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  n generates code
2750: 20 74 6f 20 72 65 6d 6f 76 65 20 62 6f 74 68 20   to remove both 
2760: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
2770: 20 61 6e 64 20 61 6c 6c 20 69 6e 64 65 78 0a 2a   and all index.*
2780: 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 70  * entries that p
2790: 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 72 65 63  oint to that rec
27a0: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
27b0: 69 74 65 47 65 6e 65 72 61 74 65 52 6f 77 44 65  iteGenerateRowDe
27c0: 6c 65 74 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  lete(.  Vdbe *v,
27d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
27e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
27f0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
2800: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2810: 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 6f 6e 74     /* Table cont
2820: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 20 74  aining the row t
2830: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2840: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
2850: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2860: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
2870: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  ble */.  int cou
2880: 6e 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nt          /* I
2890: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 6f 77  ncrement the row
28a0: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
28b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 56 64  */.){.  sqliteVd
28c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
28d0: 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veTo, base, 0);.
28e0: 20 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65    sqliteGenerate
28f0: 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 76  RowIndexDelete(v
2900: 2c 20 70 54 61 62 2c 20 62 61 73 65 2c 20 30 29  , pTab, base, 0)
2910: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
2920: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  dOp(v, OP_Delete
2930: 2c 20 62 61 73 65 2c 20 63 6f 75 6e 74 29 3b 0a  , base, count);.
2940: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2950: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
2960: 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 63  VDBE code that c
2970: 61 75 73 65 73 20 74 68 65 20 64 65 6c 65 74 69  auses the deleti
2980: 6f 6e 20 6f 66 20 61 6c 6c 0a 2a 2a 20 69 6e 64  on of all.** ind
2990: 65 78 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ex entries assoc
29a0: 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69 6e  iated with a sin
29b0: 67 6c 65 20 72 6f 77 20 6f 66 20 61 20 73 69 6e  gle row of a sin
29c0: 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  gle table..**.**
29d0: 20 54 68 65 20 56 44 42 45 20 6d 75 73 74 20 62   The VDBE must b
29e0: 65 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  e in a particula
29f0: 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
2a00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2a10: 6c 65 64 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72  led..** These ar
2a20: 65 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e  e the requiremen
2a30: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  ts:.**.**   1.  
2a40: 41 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  A read/write cur
2a50: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
2a60: 70 54 61 62 2c 20 74 68 65 20 74 61 62 6c 65 20  pTab, the table 
2a70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
2a80: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 62  ow.**       to b
2a90: 65 20 64 65 6c 65 74 65 64 2c 20 6d 75 73 74 20  e deleted, must 
2aa0: 62 65 20 6f 70 65 6e 65 64 20 61 73 20 63 75 72  be opened as cur
2ab0: 73 6f 72 20 6e 75 6d 62 65 72 20 22 62 61 73 65  sor number "base
2ac0: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 52  "..**.**   2.  R
2ad0: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
2ae0: 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
2af0: 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74 20 62  s of pTab must b
2b00: 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20 20  e open as.**    
2b10: 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72     cursor number
2b20: 20 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65 20   base+i for the 
2b30: 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  i-th index..**.*
2b40: 2a 20 20 20 33 2e 20 20 54 68 65 20 22 62 61 73  *   3.  The "bas
2b50: 65 22 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  e" cursor must b
2b60: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  e pointing to th
2b70: 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f  e row that is to
2b80: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 64 65 6c   be.**       del
2b90: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
2ba0: 6c 69 74 65 47 65 6e 65 72 61 74 65 52 6f 77 49  liteGenerateRowI
2bb0: 6e 64 65 78 44 65 6c 65 74 65 28 0a 20 20 56 64  ndexDelete(.  Vd
2bc0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
2bd0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2be0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
2bf0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2c00: 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  b,       /* Tabl
2c10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2c20: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
2c30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ed */.  int base
2c40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ,          /* Cu
2c50: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2c60: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  the table */.  c
2c70: 68 61 72 20 2a 61 49 64 78 55 73 65 64 20 20 20  har *aIdxUsed   
2c80: 20 20 2f 2a 20 4f 6e 6c 79 20 64 65 6c 65 74 65    /* Only delete
2c90: 20 69 66 20 61 49 64 78 55 73 65 64 21 3d 30 20   if aIdxUsed!=0 
2ca0: 26 26 20 61 49 64 78 55 73 65 64 5b 69 5d 21 3d  && aIdxUsed[i]!=
2cb0: 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  0 */.){.  int i;
2cc0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
2cd0: 0a 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78  .  for(i=1, pIdx
2ce0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2cf0: 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64 78 3d 70  Idx; i++, pIdx=p
2d00: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
2d10: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 66 28 20   int j;.    if( 
2d20: 61 49 64 78 55 73 65 64 21 3d 30 20 26 26 20 61  aIdxUsed!=0 && a
2d30: 49 64 78 55 73 65 64 5b 69 2d 31 5d 3d 3d 30 20  IdxUsed[i-1]==0 
2d40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2d60: 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 62 61 73  v, OP_Recno, bas
2d70: 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6a  e, 0);.    for(j
2d80: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
2d90: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
2da0: 20 69 6e 74 20 69 64 78 20 3d 20 70 49 64 78 2d   int idx = pIdx-
2db0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
2dc0: 20 20 20 20 69 66 28 20 69 64 78 3d 3d 70 54 61      if( idx==pTa
2dd0: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
2de0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2df0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6a  dOp(v, OP_Dup, j
2e00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
2e10: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2e20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2e30: 5f 43 6f 6c 75 6d 6e 2c 20 62 61 73 65 2c 20 69  _Column, base, i
2e40: 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dx);.      }.   
2e50: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
2e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2e70: 65 49 64 78 4b 65 79 2c 20 70 49 64 78 2d 3e 6e  eIdxKey, pIdx->n
2e80: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
2e90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2ea0: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
2eb0: 20 62 61 73 65 2b 69 2c 20 30 29 3b 0a 20 20 7d   base+i, 0);.  }
2ec0: 0a 7d 0a                                         .}.