/ Hex Artifact Content
Login

Artifact bae6684aa02e1f7cf6328023157c91d9cf94200b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 69 6e  the parser.** in
01c0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
01d0: 74 65 20 63 6f 64 65 20 66 6f 72 20 44 45 4c 45  te code for DELE
01e0: 54 45 20 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e  TE FROM statemen
01f0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64  ts..**.** $Id: d
0200: 65 6c 65 74 65 2e 63 2c 76 20 31 2e 31 37 35 20  elete.c,v 1.175 
0210: 32 30 30 38 2f 30 39 2f 30 31 20 32 31 3a 35 39  2008/09/01 21:59
0220: 3a 34 33 20 73 68 61 6e 65 20 45 78 70 20 24 0a  :43 shane Exp $.
0230: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0240: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0250: 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
0260: 61 62 6c 65 20 74 68 61 74 20 69 73 20 6e 61 6d  able that is nam
0270: 65 64 20 69 6e 20 70 53 72 63 2e 20 20 49 66 20  ed in pSrc.  If 
0280: 61 6e 79 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  any table is not
0290: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 61 64 64 20 61   found,.** add a
02a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
02b0: 74 6f 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  to pParse->zErrM
02c0: 73 67 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  sg and return NU
02d0: 4c 4c 2e 20 20 49 66 20 61 6c 6c 20 74 61 62 6c  LL.  If all tabl
02e0: 65 73 0a 2a 2a 20 61 72 65 20 66 6f 75 6e 64 2c  es.** are found,
02f0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
0300: 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 74 61  r to the last ta
0310: 62 6c 65 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ble..*/.Table *s
0320: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
0330: 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
0340: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  e, SrcList *pSrc
0350: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
0360: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
0370: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
0380: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
0390: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
03a0: 72 63 2d 3e 61 3b 20 69 3c 70 53 72 63 2d 3e 6e  rc->a; i<pSrc->n
03b0: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
03c0: 2b 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  +){.    pTab = s
03d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
03e0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74  e(pParse, 0, pIt
03f0: 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 49 74 65 6d  em->zName, pItem
0400: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
0410: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
0420: 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62  able(pItem->pTab
0430: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  );.    pItem->pT
0440: 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 69  ab = pTab;.    i
0450: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
0460: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
0470: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0480: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
0490: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
04a0: 75 72 65 20 74 68 65 20 67 69 76 65 6e 20 74 61  ure the given ta
04b0: 62 6c 65 20 69 73 20 77 72 69 74 61 62 6c 65 2e  ble is writable.
04c0: 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 0a 2a    If it is not.*
04d0: 2a 20 77 72 69 74 61 62 6c 65 2c 20 67 65 6e 65  * writable, gene
04e0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
04f0: 73 73 61 67 65 20 61 6e 64 20 72 65 74 75 72 6e  ssage and return
0500: 20 31 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a   1.  If it is.**
0510: 20 77 72 69 74 61 62 6c 65 20 72 65 74 75 72 6e   writable return
0520: 20 30 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0;.*/.int sqlit
0530: 65 33 49 73 52 65 61 64 4f 6e 6c 79 28 50 61 72  e3IsReadOnly(Par
0540: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
0550: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 76 69 65  e *pTab, int vie
0560: 77 4f 6b 29 7b 0a 20 20 69 66 28 20 28 28 70 54  wOk){.  if( ((pT
0570: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
0580: 46 5f 52 65 61 64 6f 6e 6c 79 29 21 3d 30 0a 20  F_Readonly)!=0. 
0590: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
05a0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
05b0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
05c0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  a)==0.        &&
05d0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
05e0: 3d 30 29 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  =0) .#ifndef SQL
05f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
0600: 54 41 42 4c 45 0a 20 20 20 20 20 20 7c 7c 20 28  TABLE.      || (
0610: 70 54 61 62 2d 3e 70 4d 6f 64 20 26 26 20 70 54  pTab->pMod && pT
0620: 61 62 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  ab->pMod->pModul
0630: 65 2d 3e 78 55 70 64 61 74 65 3d 3d 30 29 0a 23  e->xUpdate==0).#
0640: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 73  endif.  ){.    s
0650: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
0660: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
0670: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69   may not be modi
0680: 66 69 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  fied", pTab->zNa
0690: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
06a0: 31 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  1;.  }.#ifndef S
06b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
06c0: 20 20 69 66 28 20 21 76 69 65 77 4f 6b 20 26 26    if( !viewOk &&
06d0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
06e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
06f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 63 61  orMsg(pParse,"ca
0700: 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 25 73 20 62  nnot modify %s b
0710: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 20 76  ecause it is a v
0720: 69 65 77 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65  iew",pTab->zName
0730: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
0740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
0750: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0760: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
0770: 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20  hat will open a 
0780: 74 61 62 6c 65 20 66 6f 72 20 72 65 61 64 69 6e  table for readin
0790: 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
07a0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 0a 20 20 50  e3OpenTable(.  P
07b0: 61 72 73 65 20 2a 70 2c 20 20 20 20 20 20 20 2f  arse *p,       /
07c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
07d0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
07e0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
07f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
0800: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
0810: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
0820: 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Db,        /* Th
0830: 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
0840: 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   in sqlite3.aDb[
0850: 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  ] */.  Table *pT
0860: 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
0870: 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ble to be opened
0880: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
0890: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65 6e        /* OP_Open
08a0: 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
08b0: 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rite */.){.  Vdb
08c0: 65 20 2a 76 3b 0a 20 20 69 66 28 20 49 73 56 69  e *v;.  if( IsVi
08d0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
08e0: 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69  turn;.  v = sqli
08f0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
0900: 20 61 73 73 65 72 74 28 20 6f 70 63 6f 64 65 3d   assert( opcode=
0910: 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c 7c  =OP_OpenWrite ||
0920: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e   opcode==OP_Open
0930: 52 65 61 64 20 29 3b 0a 20 20 73 71 6c 69 74 65  Read );.  sqlite
0940: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
0950: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 28  b, pTab->tnum, (
0960: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57  opcode==OP_OpenW
0970: 72 69 74 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  rite), pTab->zNa
0980: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  me);.  sqlite3Vd
0990: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
09a0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
09b0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
09c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
09d0: 33 28 76 2c 20 6f 70 63 6f 64 65 2c 20 69 43 75  3(v, opcode, iCu
09e0: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  r, pTab->tnum, i
09f0: 44 62 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  Db);.  VdbeComme
0a00: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61  nt((v, "%s", pTa
0a10: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 7d 0a 0a 0a  b->zName));.}...
0a20: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26  ITE_OMIT_VIEW) &
0a40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
0a50: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
0a60: 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
0a70: 20 76 69 65 77 20 61 6e 64 20 73 74 6f 72 65 20   view and store 
0a80: 69 74 73 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  its result in an
0a90: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
0aa0: 2e 20 20 54 68 65 0a 2a 2a 20 70 57 68 65 72 65  .  The.** pWhere
0ab0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
0ac0: 6f 70 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63  optional WHERE c
0ad0: 6c 61 75 73 65 20 74 68 61 74 20 72 65 73 74 72  lause that restr
0ae0: 69 63 74 73 20 74 68 65 0a 2a 2a 20 73 65 74 20  icts the.** set 
0af0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 76  of rows in the v
0b00: 69 65 77 20 74 68 61 74 20 61 72 65 20 74 6f 20  iew that are to 
0b10: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
0b20: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
0b30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b40: 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28  MaterializeView(
0b50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0b60: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
0b70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0b80: 54 61 62 6c 65 20 2a 70 56 69 65 77 2c 20 20 20  Table *pView,   
0b90: 20 20 20 20 20 2f 2a 20 56 69 65 77 20 64 65 66       /* View def
0ba0: 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  inition */.  Exp
0bb0: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0bc0: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 57 48    /* Optional WH
0bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
0be0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
0bf0: 69 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  iCur            
0c00: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
0c10: 72 20 66 6f 72 20 65 70 68 65 6d 65 72 69 61 6c  r for ephemerial
0c20: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 53   table */.){.  S
0c30: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
0c40: 20 20 53 65 6c 65 63 74 20 2a 70 44 75 70 3b 0a    Select *pDup;.
0c50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
0c60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70  pParse->db;..  p
0c70: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Dup = sqlite3Sel
0c80: 65 63 74 44 75 70 28 64 62 2c 20 70 56 69 65 77  ectDup(db, pView
0c90: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  ->pSelect);.  if
0ca0: 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
0cb0: 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d 3b 0a  SrcList *pFrom;.
0cc0: 20 20 20 20 54 6f 6b 65 6e 20 76 69 65 77 4e 61      Token viewNa
0cd0: 6d 65 3b 0a 20 20 20 20 0a 20 20 20 20 70 57 68  me;.    .    pWh
0ce0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
0cf0: 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 29  rDup(db, pWhere)
0d00: 3b 0a 20 20 20 20 76 69 65 77 4e 61 6d 65 2e 7a  ;.    viewName.z
0d10: 20 3d 20 28 75 38 2a 29 70 56 69 65 77 2d 3e 7a   = (u8*)pView->z
0d20: 4e 61 6d 65 3b 0a 20 20 20 20 76 69 65 77 4e 61  Name;.    viewNa
0d30: 6d 65 2e 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64  me.n = (unsigned
0d40: 20 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e   int)strlen((con
0d50: 73 74 20 63 68 61 72 2a 29 76 69 65 77 4e 61 6d  st char*)viewNam
0d60: 65 2e 7a 29 3b 0a 20 20 20 20 70 46 72 6f 6d 20  e.z);.    pFrom 
0d70: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
0d80: 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
0d90: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
0da0: 26 76 69 65 77 4e 61 6d 65 2c 20 70 44 75 70 2c  &viewName, pDup,
0db0: 20 30 2c 30 29 3b 0a 20 20 20 20 70 44 75 70 20   0,0);.    pDup 
0dc0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
0dd0: 65 77 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  ew(pParse, 0, pF
0de0: 72 6f 6d 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  rom, pWhere, 0, 
0df0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  0, 0, 0, 0, 0);.
0e00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
0e10: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
0e20: 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
0e30: 20 69 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   iCur);.  sqlite
0e40: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
0e50: 70 44 75 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  pDup, &dest);.  
0e60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
0e70: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d  ete(db, pDup);.}
0e80: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
0e90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0ea0: 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e 65  VIEW) && !define
0eb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0ec0: 49 47 47 45 52 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  IGGER) */.../*.*
0ed0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
0ee0: 66 6f 72 20 61 20 44 45 4c 45 54 45 20 46 52 4f  for a DELETE FRO
0ef0: 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  M statement..**.
0f00: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  **     DELETE FR
0f10: 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a 20 57 48  OM table_wxyz WH
0f20: 45 52 45 20 61 3c 35 20 41 4e 44 20 62 20 4e 4f  ERE a<5 AND b NO
0f30: 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20  T NULL;.**      
0f40: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
0f50: 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f 5f 5f  ____/       \___
0f60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
0f70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0f80: 20 20 20 70 54 61 62 4c 69 73 74 20 20 20 20 20     pTabList     
0f90: 20 20 20 20 20 20 20 20 20 70 57 68 65 72 65 0a           pWhere.
0fa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
0fb0: 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20 50 61 72  eleteFrom(.  Par
0fc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0fd0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
0fe0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
0ff0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1000: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  ,     /* The tab
1010: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
1020: 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 74   should delete t
1030: 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78 70 72 20  hings */.  Expr 
1040: 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  *pWhere         
1050: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1060: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
1070: 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ull */.){.  Vdbe
1080: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1090: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
10a0: 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
10b0: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
10c0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
10d0: 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   The table from 
10e0: 77 68 69 63 68 20 72 65 63 6f 72 64 73 20 77 69  which records wi
10f0: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  ll be deleted */
1100: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1110: 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Db;       /* Nam
1120: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f  e of database ho
1130: 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20  lding pTab */.  
1140: 69 6e 74 20 65 6e 64 2c 20 61 64 64 72 20 3d 20  int end, addr = 
1150: 30 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 75 70  0;     /* A coup
1160: 6c 65 20 61 64 64 72 65 73 73 65 73 20 6f 66 20  le addresses of 
1170: 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 2a  generated code *
1180: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11b0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
11c0: 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o;     /* Inform
11d0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
11e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1200: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1210: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e 64  looping over ind
1220: 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
1230: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1250: 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
1260: 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  ber for pTab */.
1270: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
1290: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
12a0: 75 72 65 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e  ure */.  AuthCon
12b0: 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20  text sContext;  
12c0: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
12d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
12e0: 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 20 20  t oldIdx = -1;  
12f0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
1300: 6f 72 20 74 68 65 20 4f 4c 44 20 74 61 62 6c 65  or the OLD table
1310: 20 6f 66 20 41 46 54 45 52 20 74 72 69 67 67 65   of AFTER trigge
1320: 72 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  rs */.  NameCont
1330: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 2f  ext sNC;       /
1340: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 74  * Name context t
1350: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
1360: 73 69 6f 6e 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  sions in */.  in
1370: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1380: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1390: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
13a0: 20 6d 65 6d 43 6e 74 20 3d 20 30 3b 20 20 20 20   memCnt = 0;    
13b0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
13c0: 6c 6c 20 75 73 65 64 20 66 6f 72 20 63 68 61 6e  ll used for chan
13d0: 67 65 20 63 6f 75 6e 74 69 6e 67 20 2a 2f 0a 0a  ge counting */..
13e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13f0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e  MIT_TRIGGER.  in
1400: 74 20 69 73 56 69 65 77 3b 20 20 20 20 20 20 20  t isView;       
1410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1420: 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67  ue if attempting
1430: 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
1440: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  a view */.  int 
1450: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d  triggers_exist =
1460: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65   0;      /* True
1470: 20 69 66 20 61 6e 79 20 74 72 69 67 67 65 72 73   if any triggers
1480: 20 65 78 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66   exist */.#endif
1490: 0a 20 20 69 6e 74 20 69 42 65 67 69 6e 41 66 74  .  int iBeginAft
14a0: 65 72 54 72 69 67 67 65 72 3b 20 20 20 20 20 20  erTrigger;      
14b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 66  /* Address of af
14c0: 74 65 72 20 74 72 69 67 67 65 72 20 70 72 6f 67  ter trigger prog
14d0: 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ram */.  int iEn
14e0: 64 41 66 74 65 72 54 72 69 67 67 65 72 3b 20 20  dAfterTrigger;  
14f0: 20 20 20 20 20 20 2f 2a 20 45 78 69 74 20 6f 66        /* Exit of
1500: 20 61 66 74 65 72 20 74 72 69 67 67 65 72 20 70   after trigger p
1510: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20  rogram */.  int 
1520: 69 42 65 67 69 6e 42 65 66 6f 72 65 54 72 69 67  iBeginBeforeTrig
1530: 67 65 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ger;     /* Addr
1540: 65 73 73 20 6f 66 20 62 65 66 6f 72 65 20 74 72  ess of before tr
1550: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f  igger program */
1560: 0a 20 20 69 6e 74 20 69 45 6e 64 42 65 66 6f 72  .  int iEndBefor
1570: 65 54 72 69 67 67 65 72 3b 20 20 20 20 20 20 20  eTrigger;       
1580: 2f 2a 20 45 78 69 74 20 6f 66 20 62 65 66 6f 72  /* Exit of befor
1590: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
15a0: 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 6c 64 5f 63  m */.  u32 old_c
15b0: 6f 6c 5f 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20  ol_mask = 0;    
15c0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
15d0: 4c 44 2e 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  LD.* columns in 
15e0: 75 73 65 20 2a 2f 0a 0a 20 20 73 43 6f 6e 74 65  use */..  sConte
15f0: 78 74 2e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20  xt.pParse = 0;. 
1600: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1610: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1620: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1630: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1640: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
1650: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1660: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
1670: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20  ->nSrc==1 );..  
1680: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
1690: 62 6c 65 20 77 68 69 63 68 20 77 65 20 77 61 6e  ble which we wan
16a0: 74 20 74 6f 20 64 65 6c 65 74 65 2e 20 20 54 68  t to delete.  Th
16b0: 69 73 20 74 61 62 6c 65 20 68 61 73 20 74 6f 20  is table has to 
16c0: 62 65 0a 20 20 2a 2a 20 70 75 74 20 69 6e 20 61  be.  ** put in a
16d0: 6e 20 53 72 63 4c 69 73 74 20 73 74 72 75 63 74  n SrcList struct
16e0: 75 72 65 20 62 65 63 61 75 73 65 20 73 6f 6d 65  ure because some
16f0: 20 6f 66 20 74 68 65 20 73 75 62 72 6f 75 74 69   of the subrouti
1700: 6e 65 73 20 77 65 0a 20 20 2a 2a 20 77 69 6c 6c  nes we.  ** will
1710: 20 62 65 20 63 61 6c 6c 69 6e 67 20 61 72 65 20   be calling are 
1720: 64 65 73 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b  designed to work
1730: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 74   with multiple t
1740: 61 62 6c 65 73 20 61 6e 64 20 65 78 70 65 63 74  ables and expect
1750: 0a 20 20 2a 2a 20 61 6e 20 53 72 63 4c 69 73 74  .  ** an SrcList
1760: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 73 74  * parameter inst
1770: 65 61 64 20 6f 66 20 6a 75 73 74 20 61 20 54 61  ead of just a Ta
1780: 62 6c 65 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a  ble* parameter..
1790: 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71    */.  pTab = sq
17a0: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
17b0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  up(pParse, pTabL
17c0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ist);.  if( pTab
17d0: 3d 3d 30 20 29 20 20 67 6f 74 6f 20 64 65 6c 65  ==0 )  goto dele
17e0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
17f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1800: 74 20 69 66 20 77 65 20 68 61 76 65 20 61 6e 79  t if we have any
1810: 20 74 72 69 67 67 65 72 73 20 61 6e 64 20 69 66   triggers and if
1820: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1830: 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 66 72  .  ** deleted fr
1840: 6f 6d 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a  om is a view.  *
1850: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1860: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
1870: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d  triggers_exist =
1880: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
1890: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
18a0: 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30  ab, TK_DELETE, 0
18b0: 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54  );.  isView = pT
18c0: 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a  ab->pSelect!=0;.
18d0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 74  #else.# define t
18e0: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 30 0a  riggers_exist 0.
18f0: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
1900: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
1910: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1920: 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a  .# undef isView.
1930: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
1940: 30 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  0.#endif..  if( 
1950: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
1960: 79 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  y(pParse, pTab, 
1970: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 29 20  triggers_exist) 
1980: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  ){.    goto dele
1990: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
19a0: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
19b0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
19c0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
19d0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
19e0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
19f0: 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
1a00: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  Db].zName;.  if(
1a10: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a20: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a30: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
1a40: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
1a50: 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65  .    goto delete
1a60: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  _from_cleanup;. 
1a70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62   }..  /* If pTab
1a80: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65   is really a vie
1a90: 77 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  w, make sure it 
1aa0: 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  has been initial
1ab0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
1ac0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
1ad0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1ae0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
1af0: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
1b00: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
1b10: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 63   /* Allocate a c
1b20: 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 73 74  ursor used to st
1b30: 6f 72 65 20 74 68 65 20 6f 6c 64 2e 2a 20 64 61  ore the old.* da
1b40: 74 61 20 66 6f 72 20 61 20 74 72 69 67 67 65 72  ta for a trigger
1b50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 72 69  ..  */.  if( tri
1b60: 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 20 0a  ggers_exist ){ .
1b70: 20 20 20 20 6f 6c 64 49 64 78 20 3d 20 70 50 61      oldIdx = pPa
1b80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
1b90: 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 20 63  ..  /* Assign  c
1ba0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 74 6f 20  ursor number to 
1bb0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 61 6c  the table and al
1bc0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 2e 0a 20  l its indices.. 
1bd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
1be0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20  abList->nSrc==1 
1bf0: 29 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62  );.  iCur = pTab
1c00: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
1c10: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1c20: 62 2b 2b 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  b++;.  for(pIdx=
1c30: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1c40: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1c50: 4e 65 78 74 29 7b 0a 20 20 20 20 70 50 61 72 73  Next){.    pPars
1c60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a  e->nTab++;.  }..
1c70: 20 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 76    /* Start the v
1c80: 69 65 77 20 63 6f 6e 74 65 78 74 0a 20 20 2a 2f  iew context.  */
1c90: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b  .  if( isView ){
1ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
1cb0: 43 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72  ContextPush(pPar
1cc0: 73 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70  se, &sContext, p
1cd0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Tab->zName);.  }
1ce0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
1cf0: 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
1d00: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1d10: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1d20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1d30: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
1d40: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
1d50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1d60: 65 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  ested==0 ) sqlit
1d70: 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
1d80: 65 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  es(v);.  sqlite3
1d90: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1da0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 74 72 69 67  ion(pParse, trig
1db0: 67 65 72 73 5f 65 78 69 73 74 2c 20 69 44 62 29  gers_exist, iDb)
1dc0: 3b 0a 0a 20 20 69 66 28 20 74 72 69 67 67 65 72  ;..  if( trigger
1dd0: 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 69  s_exist ){.    i
1de0: 6e 74 20 6f 72 63 6f 6e 66 20 3d 20 28 28 70 50  nt orconf = ((pP
1df0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 29  arse->trigStack)
1e00: 3f 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  ?pParse->trigSta
1e10: 63 6b 2d 3e 6f 72 63 6f 6e 66 3a 4f 45 5f 44 65  ck->orconf:OE_De
1e20: 66 61 75 6c 74 29 3b 0a 20 20 20 20 69 6e 74 20  fault);.    int 
1e30: 69 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  iGoto = sqlite3V
1e40: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1e50: 47 6f 74 6f 29 3b 0a 20 20 20 20 61 64 64 72 20  Goto);.    addr 
1e60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1e70: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
1e80: 69 42 65 67 69 6e 42 65 66 6f 72 65 54 72 69 67  iBeginBeforeTrig
1e90: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ger = sqlite3Vdb
1ea0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1eb0: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
1ec0: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
1ed0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45  (pParse, TK_DELE
1ee0: 54 45 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42  TE, 0, TRIGGER_B
1ef0: 45 46 4f 52 45 2c 20 70 54 61 62 2c 0a 20 20 20  EFORE, pTab,.   
1f00: 20 20 20 20 20 2d 31 2c 20 6f 6c 64 49 64 78 2c       -1, oldIdx,
1f10: 20 6f 72 63 6f 6e 66 2c 20 61 64 64 72 2c 20 26   orconf, addr, &
1f20: 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b 2c 20 30 29  old_col_mask, 0)
1f30: 3b 0a 20 20 20 20 69 45 6e 64 42 65 66 6f 72 65  ;.    iEndBefore
1f40: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
1f50: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1f60: 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20 20 69 42  P_Goto);..    iB
1f70: 65 67 69 6e 41 66 74 65 72 54 72 69 67 67 65 72  eginAfterTrigger
1f80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1f90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1fa0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 43    (void)sqlite3C
1fb0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
1fc0: 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45 54 45 2c  arse, TK_DELETE,
1fd0: 20 30 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45   0, TRIGGER_AFTE
1fe0: 52 2c 20 70 54 61 62 2c 20 2d 31 2c 0a 20 20 20  R, pTab, -1,.   
1ff0: 20 20 20 20 20 6f 6c 64 49 64 78 2c 20 6f 72 63       oldIdx, orc
2000: 6f 6e 66 2c 20 61 64 64 72 2c 20 26 6f 6c 64 5f  onf, addr, &old_
2010: 63 6f 6c 5f 6d 61 73 6b 2c 20 30 29 3b 0a 20 20  col_mask, 0);.  
2020: 20 20 69 45 6e 64 41 66 74 65 72 54 72 69 67 67    iEndAfterTrigg
2030: 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  er = sqlite3Vdbe
2040: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
2050: 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  o);..    sqlite3
2060: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2070: 69 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iGoto);.  }..  /
2080: 2a 20 49 66 20 77 65 20 61 72 65 20 74 72 79 69  * If we are tryi
2090: 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f  ng to delete fro
20a0: 6d 20 61 20 76 69 65 77 2c 20 72 65 61 6c 69 7a  m a view, realiz
20b0: 65 20 74 68 61 74 20 76 69 65 77 20 69 6e 74 6f  e that view into
20c0: 0a 20 20 2a 2a 20 61 20 65 70 68 65 6d 65 72 61  .  ** a ephemera
20d0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 23 69  l table..  */.#i
20e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
20f0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26 26 20  E_OMIT_VIEW) && 
2100: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2110: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
2120: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
2130: 20 20 73 71 6c 69 74 65 33 4d 61 74 65 72 69 61    sqlite3Materia
2140: 6c 69 7a 65 56 69 65 77 28 70 50 61 72 73 65 2c  lizeView(pParse,
2150: 20 70 54 61 62 2c 20 70 57 68 65 72 65 2c 20 69   pTab, pWhere, i
2160: 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Cur);.  }.#endif
2170: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74  ..  /* Resolve t
2180: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
2190: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
21a0: 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  use..  */.  mems
21b0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
21c0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
21d0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
21e0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
21f0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 69 66  = pTabList;.  if
2200: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
2210: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
2220: 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 67  pWhere) ){.    g
2230: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
2240: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
2250: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2260: 65 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  e counter of the
2270: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2280: 64 65 6c 65 74 65 64 2c 20 69 66 0a 20 20 2a 2a  deleted, if.  **
2290: 20 77 65 20 61 72 65 20 63 6f 75 6e 74 69 6e 67   we are counting
22a0: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   rows..  */.  if
22b0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
22c0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
22d0: 7b 0a 20 20 20 20 6d 65 6d 43 6e 74 20 3d 20 2b  {.    memCnt = +
22e0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2300: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2310: 65 72 2c 20 30 2c 20 6d 65 6d 43 6e 74 29 3b 0a  er, 0, memCnt);.
2320: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
2330: 6c 20 63 61 73 65 3a 20 41 20 44 45 4c 45 54 45  l case: A DELETE
2340: 20 77 69 74 68 6f 75 74 20 61 20 57 48 45 52 45   without a WHERE
2350: 20 63 6c 61 75 73 65 20 64 65 6c 65 74 65 73 20   clause deletes 
2360: 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2a  everything..  **
2370: 20 49 74 20 69 73 20 65 61 73 69 65 72 20 6a 75   It is easier ju
2380: 73 74 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  st to erase the 
2390: 77 68 6f 6c 65 20 74 61 62 6c 65 2e 20 20 4e 6f  whole table.  No
23a0: 74 65 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 61  te, however, tha
23b0: 74 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e  t.  ** this mean
23c0: 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 63  s that the row c
23d0: 68 61 6e 67 65 20 63 6f 75 6e 74 20 77 69 6c 6c  hange count will
23e0: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 2e 0a 20   be incorrect.. 
23f0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
2400: 3d 3d 30 20 26 26 20 21 74 72 69 67 67 65 72 73  ==0 && !triggers
2410: 5f 65 78 69 73 74 20 26 26 20 21 49 73 56 69 72  _exist && !IsVir
2420: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
2430: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2440: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
2450: 77 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ws ){.      /* I
2460: 66 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77 73 20  f counting rows 
2470: 64 65 6c 65 74 65 64 2c 20 6a 75 73 74 20 63 6f  deleted, just co
2480: 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  unt the total nu
2490: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a  mber of.      **
24a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
24b0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
24c0: 69 6e 74 20 61 64 64 72 32 3b 0a 20 20 20 20 20  int addr2;.     
24d0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
24e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
24f0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
2500: 20 69 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62   iCur, iDb, pTab
2510: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
2520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2540: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
2550: 75 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ur, sqlite3VdbeC
2560: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
2570: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
2580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2590: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
25a0: 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20  memCnt, 1);.    
25b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
25d0: 69 43 75 72 2c 20 61 64 64 72 32 29 3b 0a 20 20  iCur, addr2);.  
25e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2600: 65 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 7d 0a  e, iCur);.    }.
2610: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
2620: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2640: 5f 43 6c 65 61 72 2c 20 70 54 61 62 2d 3e 74 6e  _Clear, pTab->tn
2650: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
2660: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
2670: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ted ){.        s
2680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2690: 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P4(v, -1, pTab->
26a0: 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43  zName, P4_STATIC
26b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26c0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
26d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
26e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
26f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2700: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
2710: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
2720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2740: 5f 43 6c 65 61 72 2c 20 70 49 64 78 2d 3e 74 6e  _Clear, pIdx->tn
2750: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
2760: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 2f  }.    }.  } .  /
2770: 2a 20 54 68 65 20 75 73 75 61 6c 20 63 61 73 65  * The usual case
2780: 3a 20 54 68 65 72 65 20 69 73 20 61 20 57 48 45  : There is a WHE
2790: 52 45 20 63 6c 61 75 73 65 20 73 6f 20 77 65 20  RE clause so we 
27a0: 68 61 76 65 20 74 6f 20 73 63 61 6e 20 74 68 72  have to scan thr
27b0: 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 74 61  ough.  ** the ta
27c0: 62 6c 65 20 61 6e 64 20 70 69 63 6b 20 77 68 69  ble and pick whi
27d0: 63 68 20 72 65 63 6f 72 64 73 20 74 6f 20 64 65  ch records to de
27e0: 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  lete..  */.  els
27f0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69  e{.    int iRowi
2800: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
2810: 65 6d 3b 20 20 20 20 2f 2a 20 55 73 65 64 20 66  em;    /* Used f
2820: 6f 72 20 73 74 6f 72 69 6e 67 20 72 6f 77 69 64  or storing rowid
2830: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 0a 20 20 20   values. */..   
2840: 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2850: 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
2860: 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2870: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2880: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2890: 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  st, pWhere, 0, 0
28a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
28b0: 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 6c 65  o==0 ) goto dele
28c0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
28d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
28e0: 72 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 65  r the rowid of e
28f0: 76 65 72 79 20 69 74 65 6d 20 74 6f 20 62 65 20  very item to be 
2900: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2920: 64 64 4f 70 32 28 76 2c 20 49 73 56 69 72 74 75  ddOp2(v, IsVirtu
2930: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 52  al(pTab) ? OP_VR
2940: 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 2c  owid : OP_Rowid,
2950: 20 69 43 75 72 2c 20 69 52 6f 77 69 64 29 3b 0a   iCur, iRowid);.
2960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2970: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 46 69 66 6f  ddOp1(v, OP_Fifo
2980: 57 72 69 74 65 2c 20 69 52 6f 77 69 64 29 3b 0a  Write, iRowid);.
2990: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
29a0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
29b0: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71  Rows ){.      sq
29c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29d0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 6d 65  v, OP_AddImm, me
29e0: 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  mCnt, 1);.    }.
29f0: 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2a00: 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2a10: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2a20: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2a30: 57 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20  WInfo);..    /* 
2a40: 4f 70 65 6e 20 74 68 65 20 70 73 65 75 64 6f 2d  Open the pseudo-
2a50: 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 73 74  table used to st
2a60: 6f 72 65 20 4f 4c 44 20 69 66 20 74 68 65 72 65  ore OLD if there
2a70: 20 61 72 65 20 74 72 69 67 67 65 72 73 2e 0a 20   are triggers.. 
2a80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 74 72     */.    if( tr
2a90: 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a  iggers_exist ){.
2aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
2ac0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
2ad0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20  pTab->nCol);.   
2ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2af0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp1(v, OP_OpenP
2b00: 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78 29 3b 0a  seudo, oldIdx);.
2b10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
2b20: 6c 65 74 65 20 65 76 65 72 79 20 69 74 65 6d 20  lete every item 
2b30: 77 68 6f 73 65 20 6b 65 79 20 77 61 73 20 77 72  whose key was wr
2b40: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 69 73  itten to the lis
2b50: 74 20 64 75 72 69 6e 67 20 74 68 65 0a 20 20 20  t during the.   
2b60: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 61   ** database sca
2b70: 6e 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  n.  We have to d
2b80: 65 6c 65 74 65 20 69 74 65 6d 73 20 61 66 74 65  elete items afte
2b90: 72 20 74 68 65 20 73 63 61 6e 20 69 73 20 63 6f  r the scan is co
2ba0: 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 62 65  mplete.    ** be
2bb0: 63 61 75 73 65 20 64 65 6c 65 74 69 6e 67 20 61  cause deleting a
2bc0: 6e 20 69 74 65 6d 20 63 61 6e 20 63 68 61 6e 67  n item can chang
2bd0: 65 20 74 68 65 20 73 63 61 6e 20 6f 72 64 65 72  e the scan order
2be0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6e 64  ..    */.    end
2bf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2c00: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
2c10: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
2c20: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 75        /* Open cu
2c30: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61  rsors for the ta
2c40: 62 6c 65 20 77 65 20 61 72 65 20 64 65 6c 65 74  ble we are delet
2c50: 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 0a 20 20  ing from and .  
2c60: 20 20 20 20 2a 2a 20 61 6c 6c 20 69 74 73 20 69      ** all its i
2c70: 6e 64 69 63 65 73 2e 0a 20 20 20 20 20 20 2a 2f  ndices..      */
2c80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
2c90: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
2ca0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
2cb0: 69 43 75 72 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  iCur, OP_OpenWri
2cc0: 74 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  te);.    }..    
2cd0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 62  /* This is the b
2ce0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2cf0: 64 65 6c 65 74 65 20 6c 6f 6f 70 2e 20 49 66 20  delete loop. If 
2d00: 61 20 74 72 69 67 67 65 72 20 65 6e 63 6f 75 6e  a trigger encoun
2d10: 74 65 72 73 0a 20 20 20 20 2a 2a 20 61 6e 20 49  ters.    ** an I
2d20: 47 4e 4f 52 45 20 63 6f 6e 73 74 72 61 69 6e 74  GNORE constraint
2d30: 2c 20 69 74 20 6a 75 6d 70 73 20 62 61 63 6b 20  , it jumps back 
2d40: 74 6f 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  to here..    */.
2d50: 20 20 20 20 69 66 28 20 74 72 69 67 67 65 72 73      if( triggers
2d60: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  _exist ){.      
2d70: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d80: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 29  veLabel(v, addr)
2d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
2da0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2db0: 64 4f 70 32 28 76 2c 20 4f 50 5f 46 69 66 6f 52  dOp2(v, OP_FifoR
2dc0: 65 61 64 2c 20 69 52 6f 77 69 64 2c 20 65 6e 64  ead, iRowid, end
2dd0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 74 72 69 67  );..    if( trig
2de0: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
2df0: 20 20 20 20 69 6e 74 20 69 44 61 74 61 20 3d 20      int iData = 
2e00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
2e10: 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67    /* For storing
2e20: 20 72 6f 77 20 64 61 74 61 20 6f 66 20 4f 4c 44   row data of OLD
2e30: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
2e40: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   /* If the recor
2e50: 64 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70  d is no longer p
2e60: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 74 61  resent in the ta
2e70: 62 6c 65 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65  ble, jump to the
2e80: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69  .      ** next i
2e90: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2ea0: 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  loop through the
2eb0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ec0: 20 66 69 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a   fifo..      */.
2ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
2ef0: 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
2f00: 64 64 72 2c 20 69 52 6f 77 69 64 29 3b 0a 0a 20  ddr, iRowid);.. 
2f10: 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
2f20: 20 74 68 65 20 4f 4c 44 2e 2a 20 70 73 65 75 64   the OLD.* pseud
2f30: 6f 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  o-table */.     
2f40: 20 69 66 28 20 6f 6c 64 5f 63 6f 6c 5f 6d 61 73   if( old_col_mas
2f50: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
2f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f70: 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 43  , OP_RowData, iC
2f80: 75 72 2c 20 69 44 61 74 61 29 3b 0a 20 20 20 20  ur, iData);.    
2f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
2fc0: 2c 20 69 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , iData);.      
2fd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
2fe0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2ff0: 49 6e 73 65 72 74 2c 20 6f 6c 64 49 64 78 2c 20  Insert, oldIdx, 
3000: 69 44 61 74 61 2c 20 69 52 6f 77 69 64 29 3b 0a  iData, iRowid);.
3010: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 62  .      /* Jump b
3020: 61 63 6b 20 61 6e 64 20 72 75 6e 20 74 68 65 20  ack and run the 
3030: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20  BEFORE triggers 
3040: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3050: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3060: 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 65 67 69 6e  _Goto, 0, iBegin
3070: 42 65 66 6f 72 65 54 72 69 67 67 65 72 29 3b 0a  BeforeTrigger);.
3080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3090: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 45 6e  eJumpHere(v, iEn
30a0: 64 42 65 66 6f 72 65 54 72 69 67 67 65 72 29 3b  dBeforeTrigger);
30b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
30c0: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
30d0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 72   /* Delete the r
30e0: 6f 77 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ow */.#ifndef SQ
30f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3100: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28  LTABLE.      if(
3110: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
3120: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
3130: 74 20 63 68 61 72 20 2a 70 56 74 61 62 20 3d 20  t char *pVtab = 
3140: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 54  (const char *)pT
3150: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
3160: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61     sqlite3VtabMa
3170: 6b 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73  keWritable(pPars
3180: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  e, pTab);.      
3190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31a0: 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74  Op4(v, OP_VUpdat
31b0: 65 2c 20 30 2c 20 31 2c 20 69 52 6f 77 69 64 2c  e, 0, 1, iRowid,
31c0: 20 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42 29   pVtab, P4_VTAB)
31d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
31e0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
31f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
3200: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50  rateRowDelete(pP
3210: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 75 72  arse, pTab, iCur
3220: 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 72 73 65  , iRowid, pParse
3230: 2d 3e 6e 65 73 74 65 64 3d 3d 30 29 3b 0a 20 20  ->nested==0);.  
3240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3250: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
3260: 20 72 6f 77 20 74 72 69 67 67 65 72 73 2c 20 63   row triggers, c
3270: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
3280: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 0a 20 20 20   then invoke.   
3290: 20 2a 2a 20 74 68 65 20 41 46 54 45 52 20 74 72   ** the AFTER tr
32a0: 69 67 67 65 72 73 0a 20 20 20 20 2a 2f 0a 20 20  iggers.    */.  
32b0: 20 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65    if( triggers_e
32c0: 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xist ){.      /*
32d0: 20 4a 75 6d 70 20 62 61 63 6b 20 61 6e 64 20 72   Jump back and r
32e0: 75 6e 20 74 68 65 20 41 46 54 45 52 20 74 72 69  un the AFTER tri
32f0: 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 73  ggers */.      s
3300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3310: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3320: 69 42 65 67 69 6e 41 66 74 65 72 54 72 69 67 67  iBeginAfterTrigg
3330: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
3340: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3350: 2c 20 69 45 6e 64 41 66 74 65 72 54 72 69 67 67  , iEndAfterTrigg
3360: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
3370: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 65  /* End of the de
3380: 6c 65 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  lete loop */.   
3390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
33b0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
33c0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
33d0: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 0a 20  abel(v, end);.. 
33e0: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20     /* Close the 
33f0: 63 75 72 73 6f 72 73 20 61 66 74 65 72 20 74 68  cursors after th
3400: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 72 65 20  e loop if there 
3410: 61 72 65 20 6e 6f 20 72 6f 77 20 74 72 69 67 67  are no row trigg
3420: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ers */.    if( !
3430: 69 73 56 69 65 77 20 20 26 26 20 21 49 73 56 69  isView  && !IsVi
3440: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
3450: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49       for(i=1, pI
3460: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
3470: 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64 78   pIdx; i++, pIdx
3480: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
3490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
34b0: 6c 6f 73 65 2c 20 69 43 75 72 20 2b 20 69 2c 20  lose, iCur + i, 
34c0: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
34d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
34e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34f0: 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 29 3b  OP_Close, iCur);
3500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3510: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
3520: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
3530: 74 68 61 74 20 77 65 72 65 20 64 65 6c 65 74 65  that were delete
3540: 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  d. If this routi
3550: 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65  ne is .  ** gene
3560: 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63 61  rating code beca
3570: 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f  use of a call to
3580: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
3590: 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20  rse(), do not.  
35a0: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  ** invoke the ca
35b0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
35c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
35d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
35e0: 6f 75 6e 74 52 6f 77 73 20 26 26 20 70 50 61 72  ountRows && pPar
35f0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26  se->nested==0 &&
3600: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
3610: 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
3620: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3630: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 6d 65  OP_ResultRow, me
3640: 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73 71  mCnt, 1);.    sq
3650: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
3660: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
3670: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
3680: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
3690: 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 64  ME_NAME, "rows d
36a0: 65 6c 65 74 65 64 22 2c 20 50 34 5f 53 54 41 54  eleted", P4_STAT
36b0: 49 43 29 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65  IC);.  }..delete
36c0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20  _from_cleanup:. 
36d0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
36e0: 65 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74  extPop(&sContext
36f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
3700: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
3710: 61 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  abList);.  sqlit
3720: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
3730: 20 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75   pWhere);.  retu
3740: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
3750: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
3760: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 68  tes VDBE code th
3770: 61 74 20 63 61 75 73 65 73 20 61 20 73 69 6e 67  at causes a sing
3780: 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a 2a 20 73  le row of a.** s
3790: 69 6e 67 6c 65 20 74 61 62 6c 65 20 74 6f 20 62  ingle table to b
37a0: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
37b0: 20 54 68 65 20 56 44 42 45 20 6d 75 73 74 20 62   The VDBE must b
37c0: 65 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  e in a particula
37d0: 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
37e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
37f0: 6c 65 64 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72  led..** These ar
3800: 65 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e  e the requiremen
3810: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  ts:.**.**   1.  
3820: 41 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  A read/write cur
3830: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
3840: 70 54 61 62 2c 20 74 68 65 20 74 61 62 6c 65 20  pTab, the table 
3850: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
3860: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 62  ow.**       to b
3870: 65 20 64 65 6c 65 74 65 64 2c 20 6d 75 73 74 20  e deleted, must 
3880: 62 65 20 6f 70 65 6e 65 64 20 61 73 20 63 75 72  be opened as cur
3890: 73 6f 72 20 6e 75 6d 62 65 72 20 22 62 61 73 65  sor number "base
38a0: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 52  "..**.**   2.  R
38b0: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
38c0: 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
38d0: 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74 20 62  s of pTab must b
38e0: 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20 20  e open as.**    
38f0: 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72     cursor number
3900: 20 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65 20   base+i for the 
3910: 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  i-th index..**.*
3920: 2a 20 20 20 33 2e 20 20 54 68 65 20 72 65 63 6f  *   3.  The reco
3930: 72 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  rd number of the
3940: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
3950: 65 64 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  ed must be store
3960: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 6d 65  d in.**       me
3970: 6d 6f 72 79 20 63 65 6c 6c 20 69 52 6f 77 69 64  mory cell iRowid
3980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3990: 74 69 6e 65 20 70 6f 70 73 20 74 68 65 20 74 6f  tine pops the to
39a0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 74  p of the stack t
39b0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 72 65 63  o remove the rec
39c0: 6f 72 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e  ord number.** an
39d0: 64 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 73  d then generates
39e0: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
39f0: 62 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  both the table r
3a00: 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c 20 69 6e  ecord and all in
3a10: 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74  dex.** entries t
3a20: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 61  hat point to tha
3a30: 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  t record..*/.voi
3a40: 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  d sqlite3Generat
3a50: 65 52 6f 77 44 65 6c 65 74 65 28 0a 20 20 50 61  eRowDelete(.  Pa
3a60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3a70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3a80: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
3a90: 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54  pTab,       /* T
3aa0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
3ab0: 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65  the row to be de
3ac0: 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  leted */.  int i
3ad0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
3ae0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
3af0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
3b00: 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 20 20    int iRowid,   
3b10: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
3b20: 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ell that contain
3b30: 73 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 64  s the rowid to d
3b40: 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 63  elete */.  int c
3b50: 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 2f 2a  ount          /*
3b60: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
3b70: 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ow change counte
3b80: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
3b90: 64 72 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  dr;.  Vdbe *v;..
3ba0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
3bb0: 64 62 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  dbe;.  addr = sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3bd0: 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
3be0: 20 69 43 75 72 2c 20 30 2c 20 69 52 6f 77 69 64   iCur, 0, iRowid
3bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
3c00: 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65  rateRowIndexDele
3c10: 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  te(pParse, pTab,
3c20: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 73 71 6c   iCur, 0);.  sql
3c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3c40: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 43 75  , OP_Delete, iCu
3c50: 72 2c 20 28 63 6f 75 6e 74 3f 4f 50 46 4c 41 47  r, (count?OPFLAG
3c60: 5f 4e 43 48 41 4e 47 45 3a 30 29 29 3b 0a 20 20  _NCHANGE:0));.  
3c70: 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20  if( count ){.   
3c80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3c90: 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP4(v, -1, pTab
3ca0: 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54  ->zName, P4_STAT
3cb0: 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  IC);.  }.  sqlit
3cc0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3cd0: 2c 20 61 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , addr);.}../*.*
3ce0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
3cf0: 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
3d00: 64 65 20 74 68 61 74 20 63 61 75 73 65 73 20 74  de that causes t
3d10: 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 61  he deletion of a
3d20: 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72  ll.** index entr
3d30: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
3d40: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ith a single row
3d50: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62   of a single tab
3d60: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  le..**.** The VD
3d70: 42 45 20 6d 75 73 74 20 62 65 20 69 6e 20 61 20  BE must be in a 
3d80: 70 61 72 74 69 63 75 6c 61 72 20 73 74 61 74 65  particular state
3d90: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
3da0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
3db0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 72   These are the r
3dc0: 65 71 75 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a 0a  equirements:.**.
3dd0: 2a 2a 20 20 20 31 2e 20 20 41 20 72 65 61 64 2f  **   1.  A read/
3de0: 77 72 69 74 65 20 63 75 72 73 6f 72 20 70 6f 69  write cursor poi
3df0: 6e 74 69 6e 67 20 74 6f 20 70 54 61 62 2c 20 74  nting to pTab, t
3e00: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
3e10: 69 6e 67 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20  ing the row.**  
3e20: 20 20 20 20 20 74 6f 20 62 65 20 64 65 6c 65 74       to be delet
3e30: 65 64 2c 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ed, must be open
3e40: 65 64 20 61 73 20 63 75 72 73 6f 72 20 6e 75 6d  ed as cursor num
3e50: 62 65 72 20 22 69 43 75 72 22 2e 0a 2a 2a 0a 2a  ber "iCur"..**.*
3e60: 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69  *   2.  Read/wri
3e70: 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  te cursors for a
3e80: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
3e90: 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  ab must be open 
3ea0: 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73  as.**       curs
3eb0: 6f 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2b 69  or number iCur+i
3ec0: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 69 6e   for the i-th in
3ed0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20  dex..**.**   3. 
3ee0: 20 54 68 65 20 22 69 43 75 72 22 20 63 75 72 73   The "iCur" curs
3ef0: 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74  or must be point
3f00: 69 6e 67 20 74 6f 20 74 68 65 20 72 6f 77 20 74  ing to the row t
3f10: 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20  hat is to be.** 
3f20: 20 20 20 20 20 20 64 65 6c 65 74 65 64 2e 0a 2a        deleted..*
3f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65  /.void sqlite3Ge
3f40: 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65  nerateRowIndexDe
3f50: 6c 65 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  lete(.  Parse *p
3f60: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
3f70: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
3f80: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
3f90: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
3fa0: 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ab,       /* Tab
3fb0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
3fc0: 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  e row to be dele
3fd0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ted */.  int iCu
3fe0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r,          /* C
3ff0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
4000: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
4010: 69 6e 74 20 2a 61 52 65 67 49 64 78 20 20 20 20  int *aRegIdx    
4020: 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65 6c 65 74     /* Only delet
4030: 65 20 69 66 20 61 52 65 67 49 64 78 21 3d 30 20  e if aRegIdx!=0 
4040: 26 26 20 61 52 65 67 49 64 78 5b 69 5d 3e 30 20  && aRegIdx[i]>0 
4050: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
4060: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
4070: 69 6e 74 20 72 31 3b 0a 0a 20 20 66 6f 72 28 69  int r1;..  for(i
4080: 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =1, pIdx=pTab->p
4090: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b  Index; pIdx; i++
40a0: 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  , pIdx=pIdx->pNe
40b0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65  xt){.    if( aRe
40c0: 67 49 64 78 21 3d 30 20 26 26 20 61 52 65 67 49  gIdx!=0 && aRegI
40d0: 64 78 5b 69 2d 31 5d 3d 3d 30 20 29 20 63 6f 6e  dx[i-1]==0 ) con
40e0: 74 69 6e 75 65 3b 0a 20 20 20 20 72 31 20 3d 20  tinue;.    r1 = 
40f0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
4100: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
4110: 70 49 64 78 2c 20 69 43 75 72 2c 20 30 2c 20 30  pIdx, iCur, 0, 0
4120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4130: 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
4140: 3e 70 56 64 62 65 2c 20 4f 50 5f 49 64 78 44 65  >pVdbe, OP_IdxDe
4150: 6c 65 74 65 2c 20 69 43 75 72 2b 69 2c 20 72 31  lete, iCur+i, r1
4160: 2c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ,pIdx->nColumn+1
4170: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4180: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4190: 61 74 20 77 69 6c 6c 20 61 73 73 65 6d 62 6c 65  at will assemble
41a0: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 61 6e   an index key an
41b0: 64 20 70 75 74 20 69 74 20 69 6e 20 72 65 67 69  d put it in regi
41c0: 73 74 65 72 0a 2a 2a 20 72 65 67 4f 75 74 2e 20  ster.** regOut. 
41d0: 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 62 65   The key with be
41e0: 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 20   for index pIdx 
41f0: 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 64 65  which is an inde
4200: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 20 69 43  x on pTab..** iC
4210: 75 72 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  ur is the index 
4220: 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  of a cursor open
4230: 20 6f 6e 20 74 68 65 20 70 54 61 62 20 74 61 62   on the pTab tab
4240: 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67 20  le and pointing 
4250: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20  to.** the entry 
4260: 74 68 61 74 20 6e 65 65 64 73 20 69 6e 64 65 78  that needs index
4270: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ing..**.** Retur
4280: 6e 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  n a register num
4290: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
42a0: 20 66 69 72 73 74 20 69 6e 20 61 20 62 6c 6f 63   first in a bloc
42b0: 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  k of.** register
42c0: 73 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  s that holds the
42d0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
42e0: 20 69 6e 64 65 78 20 6b 65 79 2e 20 20 54 68 65   index key.  The
42f0: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 72 65 67  .** block of reg
4300: 69 73 74 65 72 73 20 68 61 73 20 61 6c 72 65 61  isters has alrea
4310: 64 79 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  dy been dealloca
4320: 74 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 0a  ted by the time.
4330: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
4340: 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  returns..*/.int 
4350: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
4360: 6e 64 65 78 4b 65 79 28 0a 20 20 50 61 72 73 65  ndexKey(.  Parse
4370: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
4380: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
4390: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
43a0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x,       /* The 
43b0: 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63 68 20  index for which 
43c0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 6b 65  to generate a ke
43d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  y */.  int iCur,
43e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
43f0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
4400: 68 65 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  he pIdx->pTable 
4410: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
4420: 65 67 4f 75 74 2c 20 20 20 20 20 20 20 20 2f 2a  egOut,        /*
4430: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 69   Write the new i
4440: 6e 64 65 78 20 6b 65 79 20 74 6f 20 74 68 69 73  ndex key to this
4450: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
4460: 6e 74 20 64 6f 4d 61 6b 65 52 65 63 20 20 20 20  nt doMakeRec    
4470: 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 4f 50 5f    /* Run the OP_
4480: 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72  MakeRecord instr
4490: 75 63 74 69 6f 6e 20 69 66 20 74 72 75 65 20 2a  uction if true *
44a0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
44b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
44c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
44d0: 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
44e0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 67  Table;.  int reg
44f0: 42 61 73 65 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  Base;.  int nCol
4500: 3b 0a 0a 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78  ;..  nCol = pIdx
4510: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 72 65 67  ->nColumn;.  reg
4520: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
4530: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
4540: 65 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 20 20 73 71  e, nCol+1);.  sq
4550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4560: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
4570: 72 2c 20 72 65 67 42 61 73 65 2b 6e 43 6f 6c 29  r, regBase+nCol)
4580: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e  ;.  for(j=0; j<n
4590: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  Col; j++){.    i
45a0: 6e 74 20 69 64 78 20 3d 20 70 49 64 78 2d 3e 61  nt idx = pIdx->a
45b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
45c0: 69 66 28 20 69 64 78 3d 3d 70 54 61 62 2d 3e 69  if( idx==pTab->i
45d0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 73 71  PKey ){.      sq
45e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
45f0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67  v, OP_SCopy, reg
4600: 42 61 73 65 2b 6e 43 6f 6c 2c 20 72 65 67 42 61  Base+nCol, regBa
4610: 73 65 2b 6a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  se+j);.    }else
4620: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4630: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4640: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 69 64  Column, iCur, id
4650: 78 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  x, regBase+j);. 
4660: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
4670: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
4680: 62 2c 20 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  b, idx);.    }. 
4690: 20 7d 0a 20 20 69 66 28 20 64 6f 4d 61 6b 65 52   }.  if( doMakeR
46a0: 65 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ec ){.    sqlite
46b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
46c0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
46d0: 67 42 61 73 65 2c 20 6e 43 6f 6c 2b 31 2c 20 72  gBase, nCol+1, r
46e0: 65 67 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  egOut);.    sqli
46f0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
4700: 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20  Str(v, pIdx);.  
4710: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
4720: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
4730: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
4740: 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 20  , nCol+1);.  }. 
4750: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4760: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
4770: 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2b 31   regBase, nCol+1
4780: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  );.  return regB
4790: 61 73 65 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b 65 20  ase;.}../* Make 
47a0: 73 75 72 65 20 22 69 73 56 69 65 77 22 20 67 65  sure "isView" ge
47b0: 74 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  ts undefined in 
47c0: 63 61 73 65 20 74 68 69 73 20 66 69 6c 65 20 62  case this file b
47d0: 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 0a 2a  ecomes part of.*
47e0: 2a 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  * the amalgamati
47f0: 6f 6e 20 2d 20 73 6f 20 74 68 61 74 20 73 75 62  on - so that sub
4800: 73 65 71 75 65 6e 74 20 66 69 6c 65 73 20 64 6f  sequent files do
4810: 20 6e 6f 74 20 73 65 65 20 69 73 56 69 65 77 20   not see isView 
4820: 61 73 20 61 0a 2a 2a 20 6d 61 63 72 6f 2e 20 2a  as a.** macro. *
4830: 2f 0a 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a  /.#undef isView.