/ Hex Artifact Content
Login

Artifact 577da499162291c1855f0b304b211bffcf9da945:


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 39 20 32 30 30 32 2f  e.c,v 1.29 2002/
0200: 30 33 2f 30 33 20 31 38 3a 35 39 3a 34 30 20 64  03/03 18:59:40 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 61 73 73 65  _cleanup;.  asse
0d70: 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49  rt( pTabList->nI
0d80: 64 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  d==1 );.  pTab =
0d90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
0da0: 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
0db0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
0dc0: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62   );  /* This tab
0dd0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
0de0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76   */..  /* Resolv
0df0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
0e00: 65 73 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78  es in all the ex
0e10: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
0e20: 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d    base = pParse-
0e30: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
0e40: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28  Where ){.    if(
0e50: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
0e60: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
0e70: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c  se, pTabList, 0,
0e80: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
0e90: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
0ea0: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  om_cleanup;.    
0eb0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
0ec0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
0ed0: 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20  , pWhere, 0, 0) 
0ee0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
0ef0: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
0f00: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
0f10: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
0f20: 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
0f30: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
0f40: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
0f50: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65  ( v==0 ) goto de
0f60: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
0f70: 70 3b 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e  p;.  sqliteBegin
0f80: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
0f90: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  Parse);..  /* In
0fa0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75  itialize the cou
0fb0: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
0fc0: 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 65 74  er of rows delet
0fd0: 65 64 2c 20 69 66 0a 20 20 2a 2a 20 77 65 20 61  ed, if.  ** we a
0fe0: 72 65 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77 73  re counting rows
0ff0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1000: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1010: 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20  CountRows ){.   
1020: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1030: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1040: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
1050: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 41   Special case: A
1060: 20 44 45 4c 45 54 45 20 77 69 74 68 6f 75 74 20   DELETE without 
1070: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  a WHERE clause d
1080: 65 6c 65 74 65 73 20 65 76 65 72 79 74 68 69 6e  eletes everythin
1090: 67 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 65 61  g..  ** It is ea
10a0: 73 69 65 72 20 6a 75 73 74 20 74 6f 20 65 72 61  sier just to era
10b0: 73 65 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  se the whole tab
10c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
10d0: 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
10e0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
10f0: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
1100: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1110: 63 6f 75 6e 74 69 6e 67 20 72 6f 77 73 20 64 65  counting rows de
1120: 6c 65 74 65 64 2c 20 6a 75 73 74 20 63 6f 75 6e  leted, just coun
1130: 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
1140: 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 65  er of.      ** e
1150: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
1160: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ble. */.      in
1170: 74 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71  t endOfLoop = sq
1180: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
1190: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
11a0: 61 64 64 72 3b 0a 20 20 20 20 20 20 6f 70 65 6e  addr;.      open
11b0: 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d  Op = pTab->isTem
11c0: 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a  p ? OP_OpenAux :
11d0: 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 20 20 20 20   OP_Open;.      
11e0: 61 73 73 65 72 74 28 20 62 61 73 65 3d 3d 30 20  assert( base==0 
11f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
1200: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
1210: 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75  Op, 0, pTab->tnu
1220: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1230: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1240: 52 65 77 69 6e 64 2c 20 30 2c 20 73 71 6c 69 74  Rewind, 0, sqlit
1250: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
1260: 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 61 64  (v)+2);.      ad
1270: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
1280: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
1290: 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  m, 1, 0);.      
12a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12b0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61  v, OP_Next, 0, a
12c0: 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
12d0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
12e0: 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  el(v, endOfLoop)
12f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
1300: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
1310: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
1320: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
1330: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61  AddOp(v, OP_Clea
1340: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  r, pTab->tnum, p
1350: 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  Tab->isTemp);.  
1360: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1370: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1380: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1390: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
13a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
13b0: 65 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  ear, pIdx->tnum,
13c0: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a   pTab->isTemp);.
13d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13e0: 54 68 65 20 75 73 75 61 6c 20 63 61 73 65 3a 20  The usual case: 
13f0: 54 68 65 72 65 20 69 73 20 61 20 57 48 45 52 45  There is a WHERE
1400: 20 63 6c 61 75 73 65 20 73 6f 20 77 65 20 68 61   clause so we ha
1410: 76 65 20 74 6f 20 73 63 61 6e 20 74 68 72 6f 75  ve to scan throu
1420: 67 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  gh.  ** the tabl
1430: 65 20 61 6e 20 70 69 63 6b 20 77 68 69 63 68 20  e an pick which 
1440: 72 65 63 6f 72 64 73 20 74 6f 20 64 65 6c 65 74  records to delet
1450: 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
1460: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
1470: 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
1480: 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
1490: 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65   = sqliteWhereBe
14a0: 67 69 6e 28 70 50 61 72 73 65 2c 20 62 61 73 65  gin(pParse, base
14b0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
14c0: 72 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  re, 1);.    if( 
14d0: 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
14e0: 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65   delete_from_cle
14f0: 61 6e 75 70 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  anup;..    /* Re
1500: 6d 65 6d 62 65 72 20 74 68 65 20 6b 65 79 20 6f  member the key o
1510: 66 20 65 76 65 72 79 20 69 74 65 6d 20 74 6f 20  f every item to 
1520: 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  be deleted..    
1530: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  */.    sqliteVdb
1540: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73  eAddOp(v, OP_Lis
1550: 74 57 72 69 74 65 2c 20 30 2c 20 30 29 3b 0a 20  tWrite, 0, 0);. 
1560: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
1570: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
1580: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
1590: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
15a0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
15b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
15c0: 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
15d0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
15e0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 57 68 65  */.    sqliteWhe
15f0: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
1600: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76      /* Delete ev
1610: 65 72 79 20 69 74 65 6d 20 77 68 6f 73 65 20 6b  ery item whose k
1620: 65 79 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  ey was written t
1630: 6f 20 74 68 65 20 6c 69 73 74 20 64 75 72 69 6e  o the list durin
1640: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  g the.    ** dat
1650: 61 62 61 73 65 20 73 63 61 6e 2e 20 20 57 65 20  abase scan.  We 
1660: 68 61 76 65 20 74 6f 20 64 65 6c 65 74 65 20 69  have to delete i
1670: 74 65 6d 73 20 61 66 74 65 72 20 74 68 65 20 73  tems after the s
1680: 63 61 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a  can is complete.
1690: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 64      ** because d
16a0: 65 6c 65 74 69 6e 67 20 61 6e 20 69 74 65 6d 20  eleting an item 
16b0: 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20 73  can change the s
16c0: 63 61 6e 20 6f 72 64 65 72 2e 0a 20 20 20 20 2a  can order..    *
16d0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  /.    sqliteVdbe
16e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74  AddOp(v, OP_List
16f0: 52 65 77 69 6e 64 2c 20 30 2c 20 30 29 3b 0a 20  Rewind, 0, 0);. 
1700: 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62     openOp = pTab
1710: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
1720: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
1730: 6e 57 72 69 74 65 3b 0a 20 20 20 20 73 71 6c 69  nWrite;.    sqli
1740: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
1750: 70 65 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54 61  penOp, base, pTa
1760: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 66 6f  b->tnum);.    fo
1770: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
1780: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1790: 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e  i++, pIdx=pIdx->
17a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 71  pNext){.      sq
17b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
17c0: 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2b 69 2c   openOp, base+i,
17d0: 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pIdx->tnum);.  
17e0: 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71    }.    end = sq
17f0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
1800: 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  l(v);.    addr =
1810: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1820: 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c  (v, OP_ListRead,
1830: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71   0, end);.    sq
1840: 6c 69 74 65 47 65 6e 65 72 61 74 65 52 6f 77 44  liteGenerateRowD
1850: 65 6c 65 74 65 28 76 2c 20 70 54 61 62 2c 20 62  elete(v, pTab, b
1860: 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1870: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1880: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
1890: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
18a0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
18b0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  d);.    sqliteVd
18c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
18d0: 73 74 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a  stReset, 0, 0);.
18e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 45 6e 64 57    }.  sqliteEndW
18f0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1900: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  arse);..  /*.  *
1910: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1920: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1930: 20 77 65 72 65 20 64 65 6c 65 74 65 64 2e 0a 20   were deleted.. 
1940: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
1950: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
1960: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 73 71  ntRows ){.    sq
1970: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1980: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
1990: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
19a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
19b0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c  P_ColumnName, 0,
19c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
19d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
19e0: 31 2c 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64  1, "rows deleted
19f0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
1a00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1a10: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
1a20: 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 64  k, 1, 0);.  }..d
1a30: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
1a40: 75 70 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  up:.  sqliteIdLi
1a50: 73 74 44 65 6c 65 74 65 28 70 54 61 62 4c 69 73  stDelete(pTabLis
1a60: 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  t);.  sqliteExpr
1a70: 44 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a  Delete(pWhere);.
1a80: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
1a90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1aa0: 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
1ab0: 6f 64 65 20 74 68 61 74 20 63 61 75 73 65 73 20  ode that causes 
1ac0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
1ad0: 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61 62 6c  a.** single tabl
1ae0: 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  e to be deleted.
1af0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
1b00: 6d 75 73 74 20 62 65 20 69 6e 20 61 20 70 61 72  must be in a par
1b10: 74 69 63 75 6c 61 72 20 73 74 61 74 65 20 77 68  ticular state wh
1b20: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b30: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54 68  is called..** Th
1b40: 65 73 65 20 61 72 65 20 74 68 65 20 72 65 71 75  ese are the requ
1b50: 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  irements:.**.** 
1b60: 20 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69    1.  A read/wri
1b70: 74 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  te cursor pointi
1b80: 6e 67 20 74 6f 20 70 54 61 62 2c 20 74 68 65 20  ng to pTab, the 
1b90: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ba0: 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20   the row.**     
1bb0: 20 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c    to be deleted,
1bc0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1bd0: 61 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  as cursor number
1be0: 20 22 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a 20 20   "base"..**.**  
1bf0: 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20   2.  Read/write 
1c00: 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
1c10: 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
1c20: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a  must be open as.
1c30: 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  **       cursor 
1c40: 6e 75 6d 62 65 72 20 62 61 73 65 2b 69 20 66 6f  number base+i fo
1c50: 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  r the i-th index
1c60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68  ..**.**   3.  Th
1c70: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
1c80: 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  of the row to be
1c90: 20 64 65 6c 65 74 65 64 20 6d 75 73 74 20 62 65   deleted must be
1ca0: 20 6f 6e 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   on the top.**  
1cb0: 20 20 20 20 20 6f 66 20 74 68 65 20 73 74 61 63       of the stac
1cc0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
1cd0: 75 74 69 6e 65 20 70 6f 70 73 20 74 68 65 20 74  utine pops the t
1ce0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
1cf0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 72 65  to remove the re
1d00: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  cord number.** a
1d10: 6e 64 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  nd then generate
1d20: 73 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  s code to remove
1d30: 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20   both the table 
1d40: 72 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c 20 69  record and all i
1d50: 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ndex.** entries 
1d60: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
1d70: 61 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  at record..*/.vo
1d80: 69 64 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74  id sqliteGenerat
1d90: 65 52 6f 77 44 65 6c 65 74 65 28 0a 20 20 56 64  eRowDelete(.  Vd
1da0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
1db0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1dc0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
1dd0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1de0: 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  b,       /* Tabl
1df0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1e00: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
1e10: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ed */.  int base
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1e30: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1e40: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1e50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1e60: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
1e70: 62 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  base, 0);.  sqli
1e80: 74 65 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  teGenerateRowInd
1e90: 65 78 44 65 6c 65 74 65 28 76 2c 20 70 54 61 62  exDelete(v, pTab
1ea0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 73 71  , base, 0);.  sq
1eb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1ec0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 62 61 73 65   OP_Delete, base
1ed0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
1ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1ef0: 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
1f00: 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
1f10: 64 65 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c 0a  deletion of all.
1f20: 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ** index entries
1f30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f40: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
1f50: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
1f60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
1f70: 6d 75 73 74 20 62 65 20 69 6e 20 61 20 70 61 72  must be in a par
1f80: 74 69 63 75 6c 61 72 20 73 74 61 74 65 20 77 68  ticular state wh
1f90: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1fa0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54 68  is called..** Th
1fb0: 65 73 65 20 61 72 65 20 74 68 65 20 72 65 71 75  ese are the requ
1fc0: 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  irements:.**.** 
1fd0: 20 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72 69    1.  A read/wri
1fe0: 74 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  te cursor pointi
1ff0: 6e 67 20 74 6f 20 70 54 61 62 2c 20 74 68 65 20  ng to pTab, the 
2000: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
2010: 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20   the row.**     
2020: 20 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2c    to be deleted,
2030: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
2040: 61 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  as cursor number
2050: 20 22 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a 20 20   "base"..**.**  
2060: 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74 65 20   2.  Read/write 
2070: 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
2080: 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
2090: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 73 0a  must be open as.
20a0: 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  **       cursor 
20b0: 6e 75 6d 62 65 72 20 62 61 73 65 2b 69 20 66 6f  number base+i fo
20c0: 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  r the i-th index
20d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54 68  ..**.**   3.  Th
20e0: 65 20 22 62 61 73 65 22 20 63 75 72 73 6f 72 20  e "base" cursor 
20f0: 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
2100: 20 74 6f 20 74 68 65 20 72 6f 77 20 74 68 61 74   to the row that
2110: 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20   is to be.**    
2120: 20 20 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76     deleted..*/.v
2130: 6f 69 64 20 73 71 6c 69 74 65 47 65 6e 65 72 61  oid sqliteGenera
2140: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
2150: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
2160: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
2170: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
2180: 73 20 56 44 42 45 20 2a 2f 0a 20 20 54 61 62 6c  s VDBE */.  Tabl
2190: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f  e *pTab,       /
21a0: 2a 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  * Table containi
21b0: 6e 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65  ng the row to be
21c0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e   deleted */.  in
21d0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
21e0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
21f0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2200: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55  */.  char *aIdxU
2210: 73 65 64 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  sed     /* Only 
2220: 64 65 6c 65 74 65 20 69 66 20 61 49 64 78 55 73  delete if aIdxUs
2230: 65 64 21 3d 30 20 26 26 20 61 49 64 78 55 73 65  ed!=0 && aIdxUse
2240: 64 5b 69 5d 21 3d 30 20 2a 2f 0a 29 7b 0a 20 20  d[i]!=0 */.){.  
2250: 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a  int i;.  Index *
2260: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  pIdx;..  for(i=1
2270: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
2280: 64 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20  dex; pIdx; i++, 
2290: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
22a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
22b0: 20 20 69 66 28 20 61 49 64 78 55 73 65 64 21 3d    if( aIdxUsed!=
22c0: 30 20 26 26 20 61 49 64 78 55 73 65 64 5b 69 2d  0 && aIdxUsed[i-
22d0: 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  1]==0 ) continue
22e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
22f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
2300: 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20  o, base, 0);.   
2310: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
2320: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
2330: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
2340: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2350: 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64  j];.      if( id
2360: 78 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  x==pTab->iPKey )
2370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2380: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2390: 44 75 70 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20  Dup, j, 0);.    
23a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
23c0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 62  (v, OP_Column, b
23d0: 61 73 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  ase, idx);.     
23e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
23f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2400: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70  OP_MakeIdxKey, p
2410: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Idx->nColumn, 0)
2420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
2430: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 44  AddOp(v, OP_IdxD
2440: 65 6c 65 74 65 2c 20 62 61 73 65 2b 69 2c 20 30  elete, base+i, 0
2450: 29 3b 0a 20 20 7d 0a 7d 0a                       );.  }.}.