/ Hex Artifact Content
Login

Artifact 950d8f9097361419f1963875f9943344b469cf02:


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 32 37 20 32 30 30 32 2f  e.c,v 1.27 2002/
0200: 30 32 2f 32 33 20 30 32 3a 33 32 3a 31 30 20 64  02/23 02:32:10 d
0210: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
0220: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0230: 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  h".../*.** Given
0240: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 66   a table name, f
0250: 69 6e 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ind the correspo
0260: 6e 64 69 6e 67 20 74 61 62 6c 65 20 61 6e 64 20  nding table and 
0270: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a  make sure the.**
0280: 20 74 61 62 6c 65 20 69 73 20 77 72 69 74 65 61   table is writea
0290: 62 6c 65 2e 20 20 47 65 6e 65 72 61 74 65 20 61  ble.  Generate a
02a0: 6e 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  n error and retu
02b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 2e 20  rn NULL if not. 
02c0: 20 49 66 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e   If.** everythin
02d0: 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 72 65  g checks out, re
02e0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
02f0: 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
0300: 63 74 75 72 65 2e 0a 2a 2f 0a 54 61 62 6c 65 20  cture..*/.Table 
0310: 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65  *sqliteTableName
0320: 54 6f 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ToTable(Parse *p
0330: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
0340: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 54 61 62 6c  r *zTab){.  Tabl
0350: 65 20 2a 70 54 61 62 3b 0a 20 20 70 54 61 62 20  e *pTab;.  pTab 
0360: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
0370: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
0380: 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ab);.  if( pTab=
0390: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
03a0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
03b0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
03c0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a  such table: ", z
03d0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  Tab, 0);.    pPa
03e0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
03f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0400: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
0410: 6e 6c 79 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  nly || pTab->pSe
0420: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
0430: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
0440: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20  rse->zErrMsg, . 
0450: 20 20 20 20 20 70 54 61 62 2d 3e 70 53 65 6c 65       pTab->pSele
0460: 63 74 20 3f 20 22 76 69 65 77 20 22 20 3a 20 22  ct ? "view " : "
0470: 74 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 7a  table ",.      z
0480: 54 61 62 2c 0a 20 20 20 20 20 20 22 20 6d 61 79  Tab,.      " may
0490: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
04a0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
04b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
04c0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 0a 20  eturn 0;      . 
04d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
04e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
04f0: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 63   a table name, c
0500: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
0510: 65 20 74 68 65 20 74 61 62 6c 65 20 65 78 69 73  e the table exis
0520: 74 73 2c 20 69 73 20 77 72 69 74 61 62 6c 65 0a  ts, is writable.
0530: 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 20  ** and is not a 
0540: 76 69 65 77 2e 20 20 49 66 20 65 76 65 72 79 74  view.  If everyt
0550: 68 69 6e 67 20 69 73 20 4f 4b 2c 20 63 6f 6e 73  hing is OK, cons
0560: 74 72 75 63 74 20 61 6e 20 49 64 4c 69 73 74 20  truct an IdList 
0570: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 74 68 65 20 74  holding.** the t
0580: 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
0590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
05a0: 20 49 64 4c 69 73 74 2e 20 20 54 68 65 20 63 61   IdList.  The ca
05b0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
05c0: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
05d0: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
05e0: 20 49 64 4c 69 73 74 20 77 68 65 6e 20 69 74 20   IdList when it 
05f0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
0600: 68 20 69 74 2e 0a 2a 2a 20 49 66 20 74 68 65 72  h it..** If ther
0610: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2c 20 6c  e is an error, l
0620: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 6f  eave a message o
0630: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
0640: 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  g and return.** 
0650: 4e 55 4c 4c 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  NULL..*/.IdList 
0660: 2a 73 71 6c 69 74 65 54 61 62 6c 65 54 6f 6b 65  *sqliteTableToke
0670: 6e 54 6f 49 64 4c 69 73 74 28 50 61 72 73 65 20  nToIdList(Parse 
0680: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
0690: 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 54  pTableName){.  T
06a0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 64  able *pTab;.  Id
06b0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
06c0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 73 71  .  pTabList = sq
06d0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
06e0: 28 30 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  (0, pTableName);
06f0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 3d  .  if( pTabList=
0700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0710: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
0720: 74 2d 3e 6e 49 64 3d 3d 31 20 29 3b 0a 20 20 70  t->nId==1 );.  p
0730: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
0740: 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61  eNameToTable(pPa
0750: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
0760: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  [0].zName);.  if
0770: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
0780: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
0790: 65 74 65 28 70 54 61 62 4c 69 73 74 29 3b 0a 20  ete(pTabList);. 
07a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
07b0: 0a 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  .  pTabList->a[0
07c0: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ].pTab = pTab;. 
07d0: 20 72 65 74 75 72 6e 20 70 54 61 62 4c 69 73 74   return pTabList
07e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
07f0: 73 73 20 61 20 44 45 4c 45 54 45 20 46 52 4f 4d  ss a DELETE FROM
0800: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0810: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
0820: 46 72 6f 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  From(.  Parse *p
0830: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
0840: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
0850: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
0860: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *pTableName,    
0870: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
0880: 6f 6d 20 77 68 69 63 68 20 77 65 20 73 68 6f 75  om which we shou
0890: 6c 64 20 64 65 6c 65 74 65 20 74 68 69 6e 67 73  ld delete things
08a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
08b0: 72 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re           /* 
08c0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
08d0: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
08e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  /.){.  Vdbe *v; 
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0900: 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
0910: 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
0920: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
0930: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0940: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
0950: 20 72 65 63 6f 72 64 73 20 77 69 6c 6c 20 62 65   records will be
0960: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 49 64   deleted */.  Id
0970: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
0980: 20 20 20 20 20 2f 2a 20 41 6e 20 49 44 20 6c 69       /* An ID li
0990: 73 74 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20  st holding pTab 
09a0: 61 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65  and nothing else
09b0: 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 2c 20 61   */.  int end, a
09c0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ddr;         /* 
09d0: 41 20 63 6f 75 70 6c 65 20 61 64 64 72 65 73 73  A couple address
09e0: 65 73 20 6f 66 20 67 65 6e 65 72 61 74 65 64 20  es of generated 
09f0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
0a20: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
0a30: 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
0a40: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
0a50: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
0a60: 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
0a70: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
0a80: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
0a90: 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  er indices of th
0aa0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
0ab0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
0ac0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
0ad0: 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61  the first availa
0ae0: 62 6c 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ble table cursor
0af0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
0b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0b10: 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  Main database st
0b20: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
0b30: 20 6f 70 65 6e 4f 70 3b 20 20 20 20 20 20 20 20   openOp;        
0b40: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 75 73      /* Opcode us
0b50: 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 63 75 72  ed to open a cur
0b60: 73 6f 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  sor to the table
0b70: 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 50 61 72   */...  if( pPar
0b80: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
0b90: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
0ba0: 20 29 7b 0a 20 20 20 20 70 54 61 62 4c 69 73 74   ){.    pTabList
0bb0: 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 64   = 0;.    goto d
0bc0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
0bd0: 75 70 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70  up;.  }.  db = p
0be0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
0bf0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
0c00: 65 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20  e which we want 
0c10: 74 6f 20 64 65 6c 65 74 65 2e 20 20 54 68 69 73  to delete.  This
0c20: 20 74 61 62 6c 65 20 68 61 73 20 74 6f 20 62 65   table has to be
0c30: 0a 20 20 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20  .  ** put in an 
0c40: 49 64 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  IdList structure
0c50: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66   because some of
0c60: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
0c70: 20 77 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65   we.  ** will be
0c80: 20 63 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73   calling are des
0c90: 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69  igned to work wi
0ca0: 74 68 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  th multiple tabl
0cb0: 65 73 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20  es and expect.  
0cc0: 2a 2a 20 61 6e 20 49 64 4c 69 73 74 2a 20 70 61  ** an IdList* pa
0cd0: 72 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20  rameter instead 
0ce0: 6f 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a  of just a Table*
0cf0: 20 70 61 72 61 6d 65 67 65 72 2e 0a 20 20 2a 2f   parameger..  */
0d00: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 73 71  .  pTabList = sq
0d10: 6c 69 74 65 54 61 62 6c 65 54 6f 6b 65 6e 54 6f  liteTableTokenTo
0d20: 49 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  IdList(pParse, p
0d30: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66  TableName);.  if
0d40: 28 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20  ( pTabList==0 ) 
0d50: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
0d60: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62  _cleanup;.  pTab
0d70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
0d80: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 52 65  ].pTab;..  /* Re
0d90: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
0da0: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68   names in all th
0db0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
0dc0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
0dd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   ){.    sqliteEx
0de0: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
0df0: 74 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  t(pParse, pWhere
0e00: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
0e10: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
0e20: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
0e30: 2c 20 30 2c 20 70 57 68 65 72 65 29 20 29 7b 0a  , 0, pWhere) ){.
0e40: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74        goto delet
0e50: 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a  e_from_cleanup;.
0e60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
0e70: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
0e80: 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
0e90: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
0ea0: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
0eb0: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  eanup;.    }.  }
0ec0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
0ed0: 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
0ee0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
0ef0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
0f00: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
0f10: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
0f20: 65 61 6e 75 70 3b 0a 20 20 73 71 6c 69 74 65 42  eanup;.  sqliteB
0f30: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
0f40: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  on(pParse);..  /
0f50: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
0f60: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
0f70: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64  number of rows d
0f80: 65 6c 65 74 65 64 2c 20 69 66 0a 20 20 2a 2a 20  eleted, if.  ** 
0f90: 77 65 20 61 72 65 20 63 6f 75 6e 74 69 6e 67 20  we are counting 
0fa0: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
0fb0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
0fc0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
0fd0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
0fe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
0ff0: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  er, 0, 0);.  }..
1000: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1010: 65 3a 20 41 20 44 45 4c 45 54 45 20 77 69 74 68  e: A DELETE with
1020: 6f 75 74 20 61 20 57 48 45 52 45 20 63 6c 61 75  out a WHERE clau
1030: 73 65 20 64 65 6c 65 74 65 73 20 65 76 65 72 79  se deletes every
1040: 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 49 74 20 69  thing..  ** It i
1050: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
1060: 20 65 72 61 73 65 20 74 68 65 20 77 68 6f 6c 65   erase the whole
1070: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
1080: 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  f( pWhere==0 ){.
1090: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
10a0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
10b0: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Rows ){.      /*
10c0: 20 49 66 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77   If counting row
10d0: 73 20 64 65 6c 65 74 65 64 2c 20 6a 75 73 74 20  s deleted, just 
10e0: 63 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20  count the total 
10f0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1100: 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ** entries in th
1110: 65 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  e table. */.    
1120: 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 20    int endOfLoop 
1130: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
1140: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1150: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
1160: 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69  openOp = pTab->i
1170: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41  sTemp ? OP_OpenA
1180: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20  ux : OP_Open;.  
1190: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11a0: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30  dOp(v, openOp, 0
11b0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
11c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
11e0: 64 2c 20 30 2c 20 73 71 6c 69 74 65 56 64 62 65  d, 0, sqliteVdbe
11f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
1200: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
1210: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1220: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
1230: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1240: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1250: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 29 3b  _Next, 0, addr);
1260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
1270: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1280: 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20   endOfLoop);.   
1290: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12a0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12b0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
12c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12d0: 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 70 54  (v, OP_Clear, pT
12e0: 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e  ab->tnum, pTab->
12f0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 66 6f 72  isTemp);.    for
1300: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1310: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1320: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1330: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1340: 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
1350: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pIdx->tnum, pTab
1360: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ->isTemp);.    }
1370: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 75  .  }..  /* The u
1380: 73 75 61 6c 20 63 61 73 65 3a 20 54 68 65 72 65  sual case: There
1390: 20 69 73 20 61 20 57 48 45 52 45 20 63 6c 61 75   is a WHERE clau
13a0: 73 65 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  se so we have to
13b0: 20 73 63 61 6e 20 74 68 72 6f 75 67 68 0a 20 20   scan through.  
13c0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 6e 20  ** the table an 
13d0: 70 69 63 6b 20 77 68 69 63 68 20 72 65 63 6f 72  pick which recor
13e0: 64 73 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20  ds to delete..  
13f0: 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f  */.  else{.    /
1400: 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
1410: 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f  base scan.    */
1420: 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
1430: 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70  liteWhereBegin(p
1440: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1450: 20 70 57 68 65 72 65 2c 20 31 29 3b 0a 20 20 20   pWhere, 1);.   
1460: 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1470: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
1480: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20 20  m_cleanup;..    
1490: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
14a0: 6b 65 79 20 6f 66 20 65 76 65 72 79 20 69 74 65  key of every ite
14b0: 6d 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  m to be deleted.
14c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
14e0: 50 5f 4c 69 73 74 57 72 69 74 65 2c 20 30 2c 20  P_ListWrite, 0, 
14f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
1500: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
1510: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
1520: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1530: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
1540: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  1, 0);.    }..  
1550: 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1560: 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1570: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1580: 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  teWhereEnd(pWInf
1590: 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65  o);..    /* Dele
15a0: 74 65 20 65 76 65 72 79 20 69 74 65 6d 20 77 68  te every item wh
15b0: 6f 73 65 20 6b 65 79 20 77 61 73 20 77 72 69 74  ose key was writ
15c0: 74 65 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ten to the list 
15d0: 64 75 72 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  during the.    *
15e0: 2a 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  * database scan.
15f0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 65 6c    We have to del
1600: 65 74 65 20 69 74 65 6d 73 20 61 66 74 65 72 20  ete items after 
1610: 74 68 65 20 73 63 61 6e 20 69 73 20 63 6f 6d 70  the scan is comp
1620: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 62 65 63 61  lete.    ** beca
1630: 75 73 65 20 64 65 6c 65 74 69 6e 67 20 61 6e 20  use deleting an 
1640: 69 74 65 6d 20 63 61 6e 20 63 68 61 6e 67 65 20  item can change 
1650: 74 68 65 20 73 63 61 6e 20 6f 72 64 65 72 2e 0a  the scan order..
1660: 20 20 20 20 2a 2f 0a 20 20 20 20 62 61 73 65 20      */.    base 
1670: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
1680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1690: 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65  dOp(v, OP_ListRe
16a0: 77 69 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  wind, 0, 0);.   
16b0: 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e   openOp = pTab->
16c0: 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e  isTemp ? OP_Open
16d0: 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57  WrAux : OP_OpenW
16e0: 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  rite;.    sqlite
16f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
1700: 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d  nOp, base, pTab-
1710: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 66 6f 72 28  >tnum);.    for(
1720: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
1730: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 69 2b  pIndex; pIdx; i+
1740: 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  +, pIdx=pIdx->pN
1750: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ext){.      sqli
1760: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
1770: 70 65 6e 4f 70 2c 20 62 61 73 65 2b 69 2c 20 70  penOp, base+i, p
1780: 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Idx->tnum);.    
1790: 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c 69  }.    end = sqli
17a0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
17b0: 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  v);.    addr = s
17c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
17d0: 2c 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c 20 30  , OP_ListRead, 0
17e0: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  , end);.    sqli
17f0: 74 65 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  teGenerateRowDel
1800: 65 74 65 28 76 2c 20 70 54 61 62 2c 20 62 61 73  ete(v, pTab, bas
1810: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  e);.    sqliteVd
1820: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1830: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
1840: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
1850: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29  lveLabel(v, end)
1860: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
1870: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74  AddOp(v, OP_List
1880: 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20  Reset, 0, 0);.  
1890: 7d 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69  }.  sqliteEndWri
18a0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
18b0: 73 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  se);..  /*.  ** 
18c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18d0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
18e0: 65 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a  ere deleted..  *
18f0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  /.  if( db->flag
1900: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
1910: 52 6f 77 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  Rows ){.    sqli
1920: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1930: 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31  P_ColumnCount, 1
1940: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1960: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30  ColumnName, 0, 0
1970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
1980: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
1990: 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64 22 2c   "rows deleted",
19a0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
19b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
19c0: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
19d0: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 64 65 6c   1, 0);.  }..del
19e0: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
19f0: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
1a00: 44 65 6c 65 74 65 28 70 54 61 62 4c 69 73 74 29  Delete(pTabList)
1a10: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65  ;.  sqliteExprDe
1a20: 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20  lete(pWhere);.  
1a30: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
1a40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1a50: 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
1a60: 65 20 74 68 61 74 20 63 61 75 73 65 73 20 61 20  e that causes a 
1a70: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61 0a  single row of a.
1a80: 2a 2a 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20  ** single table 
1a90: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  to be deleted..*
1aa0: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6d 75  *.** The VDBE mu
1ab0: 73 74 20 62 65 20 69 6e 20 61 20 70 61 72 74 69  st be in a parti
1ac0: 63 75 6c 61 72 20 73 74 61 74 65 20 77 68 65 6e  cular state when
1ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ae0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54 68 65 73   called..** Thes
1af0: 65 20 61 72 65 20 74 68 65 20 72 65 71 75 69 72  e are the requir
1b00: 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ements:.**.**   
1b10: 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74 65  1.  A read/write
1b20: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1b30: 20 74 6f 20 70 54 61 62 2c 20 74 68 65 20 74 61   to pTab, the ta
1b40: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1b50: 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  he row.**       
1b60: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c 20 6d  to be deleted, m
1b70: 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ust be opened as
1b80: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 22   cursor number "
1b90: 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  base"..**.**   2
1ba0: 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20 63 75  .  Read/write cu
1bb0: 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
1bc0: 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75  dices of pTab mu
1bd0: 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a  st be open as.**
1be0: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75         cursor nu
1bf0: 6d 62 65 72 20 62 61 73 65 2b 69 20 66 6f 72 20  mber base+i for 
1c00: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e 0a  the i-th index..
1c10: 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20  **.**   3.  The 
1c20: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 6f 66  record number of
1c30: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
1c40: 65 6c 65 74 65 64 20 6d 75 73 74 20 62 65 20 6f  eleted must be o
1c50: 6e 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20 20 20  n the top.**    
1c60: 20 20 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e     of the stack.
1c70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c80: 69 6e 65 20 70 6f 70 73 20 74 68 65 20 74 6f 70  ine pops the top
1c90: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 74 6f   of the stack to
1ca0: 20 72 65 6d 6f 76 65 20 74 68 65 20 72 65 63 6f   remove the reco
1cb0: 72 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64  rd number.** and
1cc0: 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 73 20   then generates 
1cd0: 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 62  code to remove b
1ce0: 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 65  oth the table re
1cf0: 63 6f 72 64 20 61 6e 64 20 61 6c 6c 20 69 6e 64  cord and all ind
1d00: 65 78 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68  ex.** entries th
1d10: 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  at point to that
1d20: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
1d30: 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65 52   sqliteGenerateR
1d40: 6f 77 44 65 6c 65 74 65 28 0a 20 20 56 64 62 65  owDelete(.  Vdbe
1d50: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *v,           /
1d60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d70: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
1d80: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1d90: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1da0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
1db0: 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ow to be deleted
1dc0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 20 20   */.  int base  
1dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1de0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
1df0: 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
1e00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1e10: 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61  v, OP_MoveTo, ba
1e20: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
1e30: 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78  GenerateRowIndex
1e40: 44 65 6c 65 74 65 28 76 2c 20 70 54 61 62 2c 20  Delete(v, pTab, 
1e50: 62 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  base, 0);.  sqli
1e60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1e70: 50 5f 44 65 6c 65 74 65 2c 20 62 61 73 65 2c 20  P_Delete, base, 
1e80: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
1e90: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
1ea0: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
1eb0: 61 74 20 63 61 75 73 65 73 20 74 68 65 20 64 65  at causes the de
1ec0: 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c 0a 2a 2a  letion of all.**
1ed0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
1ee0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1ef0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 61   single row of a
1f00: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a   single table..*
1f10: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6d 75  *.** The VDBE mu
1f20: 73 74 20 62 65 20 69 6e 20 61 20 70 61 72 74 69  st be in a parti
1f30: 63 75 6c 61 72 20 73 74 61 74 65 20 77 68 65 6e  cular state when
1f40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f50: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54 68 65 73   called..** Thes
1f60: 65 20 61 72 65 20 74 68 65 20 72 65 71 75 69 72  e are the requir
1f70: 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ements:.**.**   
1f80: 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69 74 65  1.  A read/write
1f90: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1fa0: 20 74 6f 20 70 54 61 62 2c 20 74 68 65 20 74 61   to pTab, the ta
1fb0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1fc0: 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  he row.**       
1fd0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c 20 6d  to be deleted, m
1fe0: 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ust be opened as
1ff0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 22   cursor number "
2000: 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  base"..**.**   2
2010: 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20 63 75  .  Read/write cu
2020: 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
2030: 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75  dices of pTab mu
2040: 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a  st be open as.**
2050: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 6e 75         cursor nu
2060: 6d 62 65 72 20 62 61 73 65 2b 69 20 66 6f 72 20  mber base+i for 
2070: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 2e 0a  the i-th index..
2080: 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68 65 20  **.**   3.  The 
2090: 22 62 61 73 65 22 20 63 75 72 73 6f 72 20 6d 75  "base" cursor mu
20a0: 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  st be pointing t
20b0: 6f 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 69  o the row that i
20c0: 73 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20 20 20  s to be.**      
20d0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69   deleted..*/.voi
20e0: 64 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65  d sqliteGenerate
20f0: 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 0a  RowIndexDelete(.
2100: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
2110: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2120: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
2130: 56 44 42 45 20 2a 2f 0a 20 20 54 61 62 6c 65 20  VDBE */.  Table 
2140: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20  *pTab,       /* 
2150: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  Table containing
2160: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
2170: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
2180: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  base,          /
2190: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
21a0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
21b0: 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55 73 65  .  char *aIdxUse
21c0: 64 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65  d     /* Only de
21d0: 6c 65 74 65 20 69 66 20 61 49 64 78 55 73 65 64  lete if aIdxUsed
21e0: 21 3d 30 20 26 26 20 61 49 64 78 55 73 65 64 5b  !=0 && aIdxUsed[
21f0: 69 5d 21 3d 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e  i]!=0 */.){.  in
2200: 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  t i;.  Index *pI
2210: 64 78 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 2c 20  dx;..  for(i=1, 
2220: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
2230: 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49  x; pIdx; i++, pI
2240: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2250: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
2260: 69 66 28 20 61 49 64 78 55 73 65 64 21 3d 30 20  if( aIdxUsed!=0 
2270: 26 26 20 61 49 64 78 55 73 65 64 5b 69 2d 31 5d  && aIdxUsed[i-1]
2280: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2290: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
22a0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c  dOp(v, OP_Recno,
22b0: 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 66   base, 0);.    f
22c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
22d0: 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
22e0: 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
22f0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2300: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  ;.      if( idx=
2310: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
2320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
2330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
2340: 70 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, j, 0);.      
2350: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2360: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2370: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 62 61 73  , OP_Column, bas
2380: 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 7d  e, idx);.      }
2390: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
23b0: 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 64  _MakeIdxKey, pId
23c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  x->nColumn, 0);.
23d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
23e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  dOp(v, OP_IdxDel
23f0: 65 74 65 2c 20 62 61 73 65 2b 69 2c 20 30 29 3b  ete, base+i, 0);
2400: 0a 20 20 7d 0a 7d 0a                             .  }.}.