/ Hex Artifact Content
Login

Artifact 3dc7d7cc46c8675219a7776b7c67b626bba530df:


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 36 34 20  elete.c,v 1.164 
0210: 32 30 30 38 2f 30 33 2f 32 35 20 31 37 3a 32 33  2008/03/25 17:23
0220: 3a 33 33 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :33 drh Exp $.*/
0230: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0240: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4c  eInt.h"../*.** L
0250: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
0260: 6c 65 20 74 68 61 74 20 69 73 20 6e 61 6d 65 64  le that is named
0270: 20 69 6e 20 70 53 72 63 2e 20 20 49 66 20 61 6e   in pSrc.  If an
0280: 79 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 66  y table is not f
0290: 6f 75 6e 64 2c 0a 2a 2a 20 61 64 64 20 61 6e 20  ound,.** add an 
02a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
02b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
02c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
02d0: 2e 20 20 49 66 20 61 6c 6c 20 74 61 62 6c 65 73  .  If all tables
02e0: 0a 2a 2a 20 61 72 65 20 66 6f 75 6e 64 2c 20 72  .** are found, r
02f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
0300: 74 6f 20 74 68 65 20 6c 61 73 74 20 74 61 62 6c  to the last tabl
0310: 65 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  e..*/.Table *sql
0320: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
0330: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
0340: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 29 7b   SrcList *pSrc){
0350: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
0360: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   0;.  int i;.  s
0370: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
0380: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
0390: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
03a0: 2d 3e 61 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  ->a; i<pSrc->nSr
03b0: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
03c0: 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  {.    pTab = sql
03d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
03e0: 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74 65 6d  pParse, 0, pItem
03f0: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 74 65 6d 2d 3e  ->zName, pItem->
0400: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
0410: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
0420: 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
0430: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62  .    pItem->pTab
0440: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 69 66 28   = pTab;.    if(
0450: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
0460: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
0470: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
0480: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pTab;.}../*.** C
0490: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
04a0: 65 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  e the given tabl
04b0: 65 20 69 73 20 77 72 69 74 61 62 6c 65 2e 20 20  e is writable.  
04c0: 49 66 20 69 74 20 69 73 20 6e 6f 74 0a 2a 2a 20  If it is not.** 
04d0: 77 72 69 74 61 62 6c 65 2c 20 67 65 6e 65 72 61  writable, genera
04e0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
04f0: 61 67 65 20 61 6e 64 20 72 65 74 75 72 6e 20 31  age and return 1
0500: 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 77  .  If it is.** w
0510: 72 69 74 61 62 6c 65 20 72 65 74 75 72 6e 20 30  ritable return 0
0520: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
0530: 49 73 52 65 61 64 4f 6e 6c 79 28 50 61 72 73 65  IsReadOnly(Parse
0540: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
0550: 2a 70 54 61 62 2c 20 69 6e 74 20 76 69 65 77 4f  *pTab, int viewO
0560: 6b 29 7b 0a 20 20 69 66 28 20 28 70 54 61 62 2d  k){.  if( (pTab-
0570: 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 28 70 50  >readOnly && (pP
0580: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
0590: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
05a0: 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20  hema)==0.       
05b0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
05c0: 65 64 3d 3d 30 29 20 0a 23 69 66 6e 64 65 66 20  ed==0) .#ifndef 
05d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
05e0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7c  UALTABLE.      |
05f0: 7c 20 28 70 54 61 62 2d 3e 70 4d 6f 64 20 26 26  | (pTab->pMod &&
0600: 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f   pTab->pMod->pMo
0610: 64 75 6c 65 2d 3e 78 55 70 64 61 74 65 3d 3d 30  dule->xUpdate==0
0620: 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  ).#endif.  ){.  
0630: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0640: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
0650: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d   %s may not be m
0660: 6f 64 69 66 69 65 64 22 2c 20 70 54 61 62 2d 3e  odified", pTab->
0670: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
0680: 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  rn 1;.  }.#ifnde
0690: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
06a0: 45 57 0a 20 20 69 66 28 20 21 76 69 65 77 4f 6b  EW.  if( !viewOk
06b0: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
06c0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
06d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
06e0: 22 63 61 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 25  "cannot modify %
06f0: 73 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  s because it is 
0700: 61 20 76 69 65 77 22 2c 70 54 61 62 2d 3e 7a 4e  a view",pTab->zN
0710: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
0720: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
0730: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0740: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
0750: 65 20 74 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e  e that will open
0760: 20 61 20 74 61 62 6c 65 20 66 6f 72 20 72 65 61   a table for rea
0770: 64 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ding..*/.void sq
0780: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 0a  lite3OpenTable(.
0790: 20 20 50 61 72 73 65 20 2a 70 2c 20 20 20 20 20    Parse *p,     
07a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
07b0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
07c0: 45 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  E */.  int iCur,
07d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
07e0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
07f0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
0800: 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  t iDb,        /*
0810: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
0820: 64 65 78 20 69 6e 20 73 71 6c 69 74 65 33 2e 61  dex in sqlite3.a
0830: 44 62 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  Db[] */.  Table 
0840: 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
0850: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65   table to be ope
0860: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  ned */.  int opc
0870: 6f 64 65 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f  ode      /* OP_O
0880: 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70  penRead or OP_Op
0890: 65 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20  enWrite */.){.  
08a0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 49  Vdbe *v;.  if( I
08b0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
08c0: 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73   return;.  v = s
08d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
08e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 63 6f  ;.  assert( opco
08f0: 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
0900: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f   || opcode==OP_O
0910: 70 65 6e 52 65 61 64 20 29 3b 0a 20 20 73 71 6c  penRead );.  sql
0920: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
0930: 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
0940: 2c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  , (opcode==OP_Op
0950: 65 6e 57 72 69 74 65 29 2c 20 70 54 61 62 2d 3e  enWrite), pTab->
0960: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
0970: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
0980: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
0990: 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b   0, pTab->nCol);
09a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
09b0: 64 4f 70 33 28 76 2c 20 6f 70 63 6f 64 65 2c 20  dOp3(v, opcode, 
09c0: 69 43 75 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  iCur, pTab->tnum
09d0: 2c 20 69 44 62 29 3b 0a 20 20 56 64 62 65 43 6f  , iDb);.  VdbeCo
09e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
09f0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 7d  pTab->zName));.}
0a00: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
0a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
0a20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0a30: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
0a40: 52 29 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  R)./*.** Evaluat
0a50: 65 20 61 20 76 69 65 77 20 61 6e 64 20 73 74 6f  e a view and sto
0a60: 72 65 20 69 74 73 20 72 65 73 75 6c 74 20 69 6e  re its result in
0a70: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
0a80: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 70 57 68  ble.  The.** pWh
0a90: 65 72 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ere argument is 
0aa0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 57 48 45 52  an optional WHER
0ab0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
0ac0: 73 74 72 69 63 74 73 20 74 68 65 0a 2a 2a 20 73  stricts the.** s
0ad0: 65 74 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  et of rows in th
0ae0: 65 20 76 69 65 77 20 74 68 61 74 20 61 72 65 20  e view that are 
0af0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
0b00: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
0b10: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
0b20: 74 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69  te3MaterializeVi
0b30: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0b40: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
0b50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0b60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 56 69 65 77  .  Select *pView
0b70: 2c 20 20 20 20 20 20 20 2f 2a 20 56 69 65 77 20  ,       /* View 
0b80: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
0b90: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
0ba0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
0bb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
0bc0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 75   be added */.  u
0bd0: 33 32 20 63 6f 6c 5f 6d 61 73 6b 2c 20 20 20 20  32 col_mask,    
0be0: 20 20 20 20 2f 2a 20 52 65 6e 64 65 72 20 6f 6e      /* Render on
0bf0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  ly the columns i
0c00: 6e 20 74 68 69 73 20 6d 61 73 6b 2e 20 2a 2f 0a  n this mask. */.
0c10: 20 20 69 6e 74 20 69 43 75 72 20 20 20 20 20 20    int iCur      
0c20: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
0c30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 65 70 68 65   number for ephe
0c40: 6d 65 72 69 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  merial table */.
0c50: 29 7b 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  ){.  SelectDest 
0c60: 64 65 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  dest;.  Select *
0c70: 70 44 75 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  pDup;.  sqlite3 
0c80: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0c90: 3b 0a 0a 20 20 70 44 75 70 20 3d 20 73 71 6c 69  ;..  pDup = sqli
0ca0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
0cb0: 20 70 56 69 65 77 29 3b 0a 20 20 69 66 28 20 70   pView);.  if( p
0cc0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 53 72 63  Where ){.    Src
0cd0: 4c 69 73 74 20 2a 70 46 72 6f 6d 3b 0a 20 20 20  List *pFrom;.   
0ce0: 20 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73   .    pWhere = s
0cf0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
0d00: 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70  , pWhere);.    p
0d10: 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53 72  From = sqlite3Sr
0d20: 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
0d30: 65 72 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 30  erm(pParse, 0, 0
0d40: 2c 20 30 2c 20 30 2c 20 70 44 75 70 2c 20 30 2c  , 0, 0, pDup, 0,
0d50: 20 30 29 3b 0a 20 20 20 20 70 44 75 70 20 3d 20   0);.    pDup = 
0d60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
0d70: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
0d80: 6d 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c  m, pWhere, 0, 0,
0d90: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
0da0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
0db0: 74 4d 61 73 6b 28 70 50 61 72 73 65 2c 20 70 44  tMask(pParse, pD
0dc0: 75 70 2c 20 63 6f 6c 5f 6d 61 73 6b 29 3b 0a 20  up, col_mask);. 
0dd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
0de0: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
0df0: 54 5f 45 70 68 65 6d 54 61 62 2c 20 69 43 75 72  T_EphemTab, iCur
0e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
0e10: 63 74 28 70 50 61 72 73 65 2c 20 70 44 75 70 2c  ct(pParse, pDup,
0e20: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
0e30: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65   0);.  sqlite3Se
0e40: 6c 65 63 74 44 65 6c 65 74 65 28 70 44 75 70 29  lectDelete(pDup)
0e50: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
0e60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0e70: 49 54 5f 56 49 45 57 29 20 26 26 20 21 64 65 66  IT_VIEW) && !def
0e80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0e90: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 0a 2f  _TRIGGER) */.../
0ea0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
0eb0: 64 65 20 66 6f 72 20 61 20 44 45 4c 45 54 45 20  de for a DELETE 
0ec0: 46 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a  FROM statement..
0ed0: 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  **.**     DELETE
0ee0: 20 46 52 4f 4d 20 74 61 62 6c 65 5f 77 78 79 7a   FROM table_wxyz
0ef0: 20 57 48 45 52 45 20 61 3c 35 20 41 4e 44 20 62   WHERE a<5 AND b
0f00: 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20   NOT NULL;.**   
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
0f20: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c  _______/       \
0f30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0f40: 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
0f50: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 20 20        pTabList  
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65              pWhe
0f70: 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  re.*/.void sqlit
0f80: 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 0a 20 20  e3DeleteFrom(.  
0f90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0fa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
0fb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
0fc0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
0fd0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
0fe0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
0ff0: 20 77 65 20 73 68 6f 75 6c 64 20 64 65 6c 65 74   we should delet
1000: 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20 45 78  e things */.  Ex
1010: 70 72 20 2a 70 57 68 65 72 65 20 20 20 20 20 20  pr *pWhere      
1020: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1030: 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1040: 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 56  e null */.){.  V
1050: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1060: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1070: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
1080: 67 69 6e 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  gine */.  Table 
1090: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
10a0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
10b0: 6f 6d 20 77 68 69 63 68 20 72 65 63 6f 72 64 73  om which records
10c0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
10d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10e0: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *zDb;       /* 
10f0: 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65  Name of database
1100: 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f   holding pTab */
1110: 0a 20 20 69 6e 74 20 65 6e 64 2c 20 61 64 64 72  .  int end, addr
1120: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 20 63   = 0;     /* A c
1130: 6f 75 70 6c 65 20 61 64 64 72 65 73 73 65 73 20  ouple addresses 
1140: 6f 66 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  of generated cod
1150: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1170: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1180: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1190: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66  Info;     /* Inf
11a0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
11b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11c0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
11d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
11e0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
11f0: 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
1200: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  able */.  int iC
1210: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
1220: 20 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72 20   /* VDBE Cursor 
1230: 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20  number for pTab 
1240: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
1260: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
1270: 75 63 74 75 72 65 20 2a 2f 0a 20 20 41 75 74 68  ucture */.  Auth
1280: 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74  Context sContext
1290: 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74  ;  /* Authorizat
12a0: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
12b0: 20 69 6e 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31   int oldIdx = -1
12c0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ;       /* Curso
12d0: 72 20 66 6f 72 20 74 68 65 20 4f 4c 44 20 74 61  r for the OLD ta
12e0: 62 6c 65 20 6f 66 20 41 46 54 45 52 20 74 72 69  ble of AFTER tri
12f0: 67 67 65 72 73 20 2a 2f 0a 20 20 4e 61 6d 65 43  ggers */.  NameC
1300: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
1310: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1320: 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  t to resolve exp
1330: 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a 2f 0a 20  ressions in */. 
1340: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1350: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1360: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
1370: 69 6e 74 20 6d 65 6d 43 6e 74 20 3d 20 30 3b 20  int memCnt = 0; 
1380: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1390: 20 63 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 63   cell used for c
13a0: 68 61 6e 67 65 20 63 6f 75 6e 74 69 6e 67 20 2a  hange counting *
13b0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
13c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
13d0: 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20   int isView;    
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f0: 20 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74   True if attempt
1400: 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 66 72  ing to delete fr
1410: 6f 6d 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  om a view */.  i
1420: 6e 74 20 74 72 69 67 67 65 72 73 5f 65 78 69 73  nt triggers_exis
1430: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  t = 0;      /* T
1440: 72 75 65 20 69 66 20 61 6e 79 20 74 72 69 67 67  rue if any trigg
1450: 65 72 73 20 65 78 69 73 74 20 2a 2f 0a 23 65 6e  ers exist */.#en
1460: 64 69 66 0a 20 20 69 6e 74 20 69 42 65 67 69 6e  dif.  int iBegin
1470: 41 66 74 65 72 54 72 69 67 67 65 72 3b 20 20 20  AfterTrigger;   
1480: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1490: 20 61 66 74 65 72 20 74 72 69 67 67 65 72 20 70   after trigger p
14a0: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20  rogram */.  int 
14b0: 69 45 6e 64 41 66 74 65 72 54 72 69 67 67 65 72  iEndAfterTrigger
14c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 74  ;        /* Exit
14d0: 20 6f 66 20 61 66 74 65 72 20 74 72 69 67 67 65   of after trigge
14e0: 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69  r program */.  i
14f0: 6e 74 20 69 42 65 67 69 6e 42 65 66 6f 72 65 54  nt iBeginBeforeT
1500: 72 69 67 67 65 72 3b 20 20 20 20 20 2f 2a 20 41  rigger;     /* A
1510: 64 64 72 65 73 73 20 6f 66 20 62 65 66 6f 72 65  ddress of before
1520: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
1530: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 42 65   */.  int iEndBe
1540: 66 6f 72 65 54 72 69 67 67 65 72 3b 20 20 20 20  foreTrigger;    
1550: 20 20 20 2f 2a 20 45 78 69 74 20 6f 66 20 62 65     /* Exit of be
1560: 66 6f 72 65 20 74 72 69 67 67 65 72 20 70 72 6f  fore trigger pro
1570: 67 72 61 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 6c  gram */.  u32 ol
1580: 64 5f 63 6f 6c 5f 6d 61 73 6b 20 3d 20 30 3b 20  d_col_mask = 0; 
1590: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
15a0: 66 20 4f 4c 44 2e 2a 20 63 6f 6c 75 6d 6e 73 20  f OLD.* columns 
15b0: 69 6e 20 75 73 65 20 2a 2f 0a 0a 20 20 73 43 6f  in use */..  sCo
15c0: 6e 74 65 78 74 2e 70 50 61 72 73 65 20 3d 20 30  ntext.pParse = 0
15d0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
15e0: 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
15f0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1600: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1610: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
1620: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
1630: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
1640: 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ist->nSrc==1 );.
1650: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
1660: 20 74 61 62 6c 65 20 77 68 69 63 68 20 77 65 20   table which we 
1670: 77 61 6e 74 20 74 6f 20 64 65 6c 65 74 65 2e 20  want to delete. 
1680: 20 54 68 69 73 20 74 61 62 6c 65 20 68 61 73 20   This table has 
1690: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 75 74 20 69  to be.  ** put i
16a0: 6e 20 61 6e 20 53 72 63 4c 69 73 74 20 73 74 72  n an SrcList str
16b0: 75 63 74 75 72 65 20 62 65 63 61 75 73 65 20 73  ucture because s
16c0: 6f 6d 65 20 6f 66 20 74 68 65 20 73 75 62 72 6f  ome of the subro
16d0: 75 74 69 6e 65 73 20 77 65 0a 20 20 2a 2a 20 77  utines we.  ** w
16e0: 69 6c 6c 20 62 65 20 63 61 6c 6c 69 6e 67 20 61  ill be calling a
16f0: 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f 20 77  re designed to w
1700: 6f 72 6b 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ork with multipl
1710: 65 20 74 61 62 6c 65 73 20 61 6e 64 20 65 78 70  e tables and exp
1720: 65 63 74 0a 20 20 2a 2a 20 61 6e 20 53 72 63 4c  ect.  ** an SrcL
1730: 69 73 74 2a 20 70 61 72 61 6d 65 74 65 72 20 69  ist* parameter i
1740: 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20 61  nstead of just a
1750: 20 54 61 62 6c 65 2a 20 70 61 72 61 6d 65 74 65   Table* paramete
1760: 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d  r..  */.  pTab =
1770: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
1780: 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
1790: 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70  abList);.  if( p
17a0: 54 61 62 3d 3d 30 20 29 20 20 67 6f 74 6f 20 64  Tab==0 )  goto d
17b0: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
17c0: 75 70 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  up;..  /* Figure
17d0: 20 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20   out if we have 
17e0: 61 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64  any triggers and
17f0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   if the table be
1800: 69 6e 67 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64  ing.  ** deleted
1810: 20 66 72 6f 6d 20 69 73 20 61 20 76 69 65 77 0a   from is a view.
1820: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1830: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1840: 0a 20 20 74 72 69 67 67 65 72 73 5f 65 78 69 73  .  triggers_exis
1850: 74 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  t = sqlite3Trigg
1860: 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
1870: 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45   pTab, TK_DELETE
1880: 2c 20 30 29 3b 0a 20 20 69 73 56 69 65 77 20 3d  , 0);.  isView =
1890: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d   pTab->pSelect!=
18a0: 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  0;.#else.# defin
18b0: 65 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74  e triggers_exist
18c0: 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69   0.# define isVi
18d0: 65 77 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  ew 0.#endif.#ifd
18e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
18f0: 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69  IEW.# undef isVi
1900: 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69  ew.# define isVi
1910: 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ew 0.#endif..  i
1920: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
1930: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
1940: 62 2c 20 74 72 69 67 67 65 72 73 5f 65 78 69 73  b, triggers_exis
1950: 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64  t) ){.    goto d
1960: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
1970: 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  up;.  }.  iDb = 
1980: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1990: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
19a0: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
19b0: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
19c0: 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
19d0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
19e0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a00: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
1a10: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
1a20: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c   ){.    goto del
1a30: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
1a40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  ;.  }..  /* If p
1a50: 54 61 62 20 69 73 20 72 65 61 6c 6c 79 20 61 20  Tab is really a 
1a60: 76 69 65 77 2c 20 6d 61 6b 65 20 73 75 72 65 20  view, make sure 
1a70: 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74  it has been init
1a80: 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
1a90: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
1aa0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
1ab0: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
1ac0: 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66     goto delete_f
1ad0: 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  rom_cleanup;.  }
1ae0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1af0: 61 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  a cursor used to
1b00: 20 73 74 6f 72 65 20 74 68 65 20 6f 6c 64 2e 2a   store the old.*
1b10: 20 64 61 74 61 20 66 6f 72 20 61 20 74 72 69 67   data for a trig
1b20: 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
1b30: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
1b40: 7b 20 0a 20 20 20 20 6f 6c 64 49 64 78 20 3d 20  { .    oldIdx = 
1b50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1b60: 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
1b70: 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20    cursor number 
1b80: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  to the table and
1b90: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
1ba0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1bb0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
1bc0: 3d 31 20 29 3b 0a 20 20 69 43 75 72 20 3d 20 70  =1 );.  iCur = p
1bd0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
1be0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1bf0: 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f 72 28 70 49  nTab++;.  for(pI
1c00: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1c10: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
1c20: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 50  ->pNext){.    pP
1c30: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1c40: 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 74 68  }..  /* Start th
1c50: 65 20 76 69 65 77 20 63 6f 6e 74 65 78 74 0a 20  e view context. 
1c60: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
1c70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
1c80: 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28 70  uthContextPush(p
1c90: 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78 74  Parse, &sContext
1ca0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
1cb0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1cc0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1cd0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1ce0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1cf0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1d00: 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74  {.    goto delet
1d10: 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a  e_from_cleanup;.
1d20: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
1d30: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20 73 71  ->nested==0 ) sq
1d40: 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
1d50: 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71 6c 69  anges(v);.  sqli
1d60: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1d70: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 74  ration(pParse, t
1d80: 72 69 67 67 65 72 73 5f 65 78 69 73 74 2c 20 69  riggers_exist, i
1d90: 44 62 29 3b 0a 0a 20 20 69 66 28 20 74 72 69 67  Db);..  if( trig
1da0: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
1db0: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 3d 20 28    int orconf = (
1dc0: 28 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  (pParse->trigSta
1dd0: 63 6b 29 3f 70 50 61 72 73 65 2d 3e 74 72 69 67  ck)?pParse->trig
1de0: 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 3a 4f 45  Stack->orconf:OE
1df0: 5f 44 65 66 61 75 6c 74 29 3b 0a 20 20 20 20 69  _Default);.    i
1e00: 6e 74 20 69 47 6f 74 6f 20 3d 20 73 71 6c 69 74  nt iGoto = sqlit
1e10: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1e20: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 61 64  OP_Goto);.    ad
1e30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e40: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1e50: 20 20 20 69 42 65 67 69 6e 42 65 66 6f 72 65 54     iBeginBeforeT
1e60: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
1e70: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e80: 76 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  v);.    (void)sq
1e90: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
1ea0: 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  ger(pParse, TK_D
1eb0: 45 4c 45 54 45 2c 20 30 2c 20 54 52 49 47 47 45  ELETE, 0, TRIGGE
1ec0: 52 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 0a  R_BEFORE, pTab,.
1ed0: 20 20 20 20 20 20 20 20 2d 31 2c 20 6f 6c 64 49          -1, oldI
1ee0: 64 78 2c 20 6f 72 63 6f 6e 66 2c 20 61 64 64 72  dx, orconf, addr
1ef0: 2c 20 26 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b 2c  , &old_col_mask,
1f00: 20 30 29 3b 0a 20 20 20 20 69 45 6e 64 42 65 66   0);.    iEndBef
1f10: 6f 72 65 54 72 69 67 67 65 72 20 3d 20 73 71 6c  oreTrigger = sql
1f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1f30: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 20  , OP_Goto);..   
1f40: 20 69 42 65 67 69 6e 41 66 74 65 72 54 72 69 67   iBeginAfterTrig
1f50: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ger = sqlite3Vdb
1f60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1f70: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
1f80: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
1f90: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45 4c 45  (pParse, TK_DELE
1fa0: 54 45 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 41  TE, 0, TRIGGER_A
1fb0: 46 54 45 52 2c 20 70 54 61 62 2c 20 2d 31 2c 0a  FTER, pTab, -1,.
1fc0: 20 20 20 20 20 20 20 20 6f 6c 64 49 64 78 2c 20          oldIdx, 
1fd0: 6f 72 63 6f 6e 66 2c 20 61 64 64 72 2c 20 26 6f  orconf, addr, &o
1fe0: 6c 64 5f 63 6f 6c 5f 6d 61 73 6b 2c 20 30 29 3b  ld_col_mask, 0);
1ff0: 0a 20 20 20 20 69 45 6e 64 41 66 74 65 72 54 72  .    iEndAfterTr
2000: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56  igger = sqlite3V
2010: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
2020: 47 6f 74 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69  Goto);..    sqli
2030: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2040: 76 2c 20 69 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a  v, iGoto);.  }..
2050: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 74    /* If we are t
2060: 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  rying to delete 
2070: 66 72 6f 6d 20 61 20 76 69 65 77 2c 20 72 65 61  from a view, rea
2080: 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77 20 69  lize that view i
2090: 6e 74 6f 0a 20 20 2a 2a 20 61 20 65 70 68 65 6d  nto.  ** a ephem
20a0: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  eral table..  */
20b0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b  .  if( isView ){
20c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 74 65  .    sqlite3Mate
20d0: 72 69 61 6c 69 7a 65 56 69 65 77 28 70 50 61 72  rializeView(pPar
20e0: 73 65 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  se, pTab->pSelec
20f0: 74 2c 20 70 57 68 65 72 65 2c 20 6f 6c 64 5f 63  t, pWhere, old_c
2100: 6f 6c 5f 6d 61 73 6b 2c 20 69 43 75 72 29 3b 0a  ol_mask, iCur);.
2110: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
2120: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
2130: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
2140: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6d  clause..  */.  m
2150: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2160: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
2170: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
2180: 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  se;.  sNC.pSrcLi
2190: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
21a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21b0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
21c0: 43 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20  C, pWhere) ){.  
21d0: 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72    goto delete_fr
21e0: 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  om_cleanup;.  }.
21f0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2200: 20 74 68 65 20 63 6f 75 6e 74 65 72 20 6f 66 20   the counter of 
2210: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2220: 77 73 20 64 65 6c 65 74 65 64 2c 20 69 66 0a 20  ws deleted, if. 
2230: 20 2a 2a 20 77 65 20 61 72 65 20 63 6f 75 6e 74   ** we are count
2240: 69 6e 67 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20  ing rows..  */. 
2250: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
2260: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
2270: 73 20 29 7b 0a 20 20 20 20 6d 65 6d 43 6e 74 20  s ){.    memCnt 
2280: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22b0: 74 65 67 65 72 2c 20 30 2c 20 6d 65 6d 43 6e 74  teger, 0, memCnt
22c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
22d0: 63 69 61 6c 20 63 61 73 65 3a 20 41 20 44 45 4c  cial case: A DEL
22e0: 45 54 45 20 77 69 74 68 6f 75 74 20 61 20 57 48  ETE without a WH
22f0: 45 52 45 20 63 6c 61 75 73 65 20 64 65 6c 65 74  ERE clause delet
2300: 65 73 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  es everything.. 
2310: 20 2a 2a 20 49 74 20 69 73 20 65 61 73 69 65 72   ** It is easier
2320: 20 6a 75 73 74 20 74 6f 20 65 72 61 73 65 20 74   just to erase t
2330: 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e 20  he whole table. 
2340: 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c 20   Note, however, 
2350: 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 6d  that.  ** this m
2360: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 6f  eans that the ro
2370: 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 77  w change count w
2380: 69 6c 6c 20 62 65 20 69 6e 63 6f 72 72 65 63 74  ill be incorrect
2390: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
23a0: 65 72 65 3d 3d 30 20 26 26 20 21 74 72 69 67 67  ere==0 && !trigg
23b0: 65 72 73 5f 65 78 69 73 74 20 26 26 20 21 49 73  ers_exist && !Is
23c0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
23d0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
23e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
23f0: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 2f  tRows ){.      /
2400: 2a 20 49 66 20 63 6f 75 6e 74 69 6e 67 20 72 6f  * If counting ro
2410: 77 73 20 64 65 6c 65 74 65 64 2c 20 6a 75 73 74  ws deleted, just
2420: 20 63 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c   count the total
2430: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2440: 20 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74   ** entries in t
2450: 68 65 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  he table. */.   
2460: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 20 20     int addr2;.  
2470: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
2480: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2490: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
24a0: 73 65 2c 20 69 43 75 72 2c 20 69 44 62 2c 20 70  se, iCur, iDb, p
24b0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
24c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
24f0: 20 69 43 75 72 2c 20 73 71 6c 69 74 65 33 56 64   iCur, sqlite3Vd
2500: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2510: 2b 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32  +2);.      addr2
2520: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2530: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
2540: 6d 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20  m, memCnt, 1);. 
2550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2560: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
2570: 74 2c 20 69 43 75 72 2c 20 61 64 64 72 32 29 3b  t, iCur, addr2);
2580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2590: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
25a0: 6c 6f 73 65 2c 20 69 43 75 72 29 3b 0a 20 20 20  lose, iCur);.   
25b0: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
25c0: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
25d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25e0: 20 4f 50 5f 43 6c 65 61 72 2c 20 70 54 61 62 2d   OP_Clear, pTab-
25f0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
2600: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
2610: 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 20 20  nested ){.      
2620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2630: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP4(v, -1, pTa
2640: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41  b->zName, P4_STA
2650: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
2660: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
2670: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
2680: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2690: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
26a0: 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
26b0: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
26c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
26d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26e0: 20 4f 50 5f 43 6c 65 61 72 2c 20 70 49 64 78 2d   OP_Clear, pIdx-
26f0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
2700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a     }.    }.  } .
2710: 20 20 2f 2a 20 54 68 65 20 75 73 75 61 6c 20 63    /* The usual c
2720: 61 73 65 3a 20 54 68 65 72 65 20 69 73 20 61 20  ase: There is a 
2730: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 6f 20  WHERE clause so 
2740: 77 65 20 68 61 76 65 20 74 6f 20 73 63 61 6e 20  we have to scan 
2750: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65  through.  ** the
2760: 20 74 61 62 6c 65 20 61 6e 64 20 70 69 63 6b 20   table and pick 
2770: 77 68 69 63 68 20 72 65 63 6f 72 64 73 20 74 6f  which records to
2780: 20 64 65 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20   delete..  */.  
2790: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 52  else{.    int iR
27a0: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
27b0: 3e 6e 4d 65 6d 3b 20 20 20 20 2f 2a 20 55 73 65  >nMem;    /* Use
27c0: 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 72 6f  d for storing ro
27d0: 77 69 64 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 0a  wid values. */..
27e0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
27f0: 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
2800: 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f     */.    pWInfo
2810: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2820: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2830: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
2840: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2850: 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64  Info==0 ) goto d
2860: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
2870: 75 70 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65  up;..    /* Reme
2880: 6d 62 65 72 20 74 68 65 20 72 6f 77 69 64 20 6f  mber the rowid o
2890: 66 20 65 76 65 72 79 20 69 74 65 6d 20 74 6f 20  f every item to 
28a0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  be deleted..    
28b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
28c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 49 73 56 69  beAddOp2(v, IsVi
28d0: 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
28e0: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
28f0: 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
2900: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2910: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 46  beAddOp1(v, OP_F
2920: 69 66 6f 57 72 69 74 65 2c 20 69 52 6f 77 69 64  ifoWrite, iRowid
2930: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66  );.    if( db->f
2940: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
2950: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20  untRows ){.     
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2970: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
2980: 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20 20 20   memCnt, 1);.   
2990: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   }..    /* End t
29a0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
29b0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
29c0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
29d0: 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  d(pWInfo);..    
29e0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 73 65 75  /* Open the pseu
29f0: 64 6f 2d 74 61 62 6c 65 20 75 73 65 64 20 74 6f  do-table used to
2a00: 20 73 74 6f 72 65 20 4f 4c 44 20 69 66 20 74 68   store OLD if th
2a10: 65 72 65 20 61 72 65 20 74 72 69 67 67 65 72 73  ere are triggers
2a20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2a30: 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20   triggers_exist 
2a40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a60: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
2a70: 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  0, pTab->nCol);.
2a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a90: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70  eAddOp1(v, OP_Op
2aa0: 65 6e 50 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78  enPseudo, oldIdx
2ab0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2ac0: 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 69 74   Delete every it
2ad0: 65 6d 20 77 68 6f 73 65 20 6b 65 79 20 77 61 73  em whose key was
2ae0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2af0: 6c 69 73 74 20 64 75 72 69 6e 67 20 74 68 65 0a  list during the.
2b00: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2b10: 73 63 61 6e 2e 20 20 57 65 20 68 61 76 65 20 74  scan.  We have t
2b20: 6f 20 64 65 6c 65 74 65 20 69 74 65 6d 73 20 61  o delete items a
2b30: 66 74 65 72 20 74 68 65 20 73 63 61 6e 20 69 73  fter the scan is
2b40: 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
2b50: 20 62 65 63 61 75 73 65 20 64 65 6c 65 74 69 6e   because deletin
2b60: 67 20 61 6e 20 69 74 65 6d 20 63 61 6e 20 63 68  g an item can ch
2b70: 61 6e 67 65 20 74 68 65 20 73 63 61 6e 20 6f 72  ange the scan or
2b80: 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
2b90: 65 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  end = sqlite3Vdb
2ba0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2bb0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
2bc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
2bd0: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
2be0: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 64 65   table we are de
2bf0: 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20  leting from and 
2c00: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 69 74  .      ** all it
2c10: 73 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 20  s indices..     
2c20: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2c30: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
2c40: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
2c50: 62 2c 20 69 43 75 72 2c 20 4f 50 5f 4f 70 65 6e  b, iCur, OP_Open
2c60: 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  Write);.    }.. 
2c70: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
2c80: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2c90: 68 65 20 64 65 6c 65 74 65 20 6c 6f 6f 70 2e 20  he delete loop. 
2ca0: 49 66 20 61 20 74 72 69 67 67 65 72 20 65 6e 63  If a trigger enc
2cb0: 6f 75 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 61  ounters.    ** a
2cc0: 6e 20 49 47 4e 4f 52 45 20 63 6f 6e 73 74 72 61  n IGNORE constra
2cd0: 69 6e 74 2c 20 69 74 20 6a 75 6d 70 73 20 62 61  int, it jumps ba
2ce0: 63 6b 20 74 6f 20 68 65 72 65 2e 0a 20 20 20 20  ck to here..    
2cf0: 2a 2f 0a 20 20 20 20 69 66 28 20 74 72 69 67 67  */.    if( trigg
2d00: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
2d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2d20: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2d30: 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dr);.    }.    a
2d40: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2d50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46 69  eAddOp2(v, OP_Fi
2d60: 66 6f 52 65 61 64 2c 20 69 52 6f 77 69 64 2c 20  foRead, iRowid, 
2d70: 65 6e 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 74  end);..    if( t
2d80: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b  riggers_exist ){
2d90: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61  .      int iData
2da0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2db0: 6d 3b 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72  m;   /* For stor
2dc0: 69 6e 67 20 72 6f 77 20 64 61 74 61 20 6f 66 20  ing row data of 
2dd0: 4f 4c 44 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  OLD table */..  
2de0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
2df0: 63 6f 72 64 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  cord is no longe
2e00: 72 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  r present in the
2e10: 20 74 61 62 6c 65 2c 20 6a 75 6d 70 20 74 6f 20   table, jump to 
2e20: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78  the.      ** nex
2e30: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
2e40: 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
2e50: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e60: 74 68 65 20 66 69 66 6f 2e 0a 20 20 20 20 20 20  the fifo..      
2e70: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e90: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72  _NotExists, iCur
2ea0: 2c 20 61 64 64 72 2c 20 69 52 6f 77 69 64 29 3b  , addr, iRowid);
2eb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  ..      /* Popul
2ec0: 61 74 65 20 74 68 65 20 4f 4c 44 2e 2a 20 70 73  ate the OLD.* ps
2ed0: 65 75 64 6f 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  eudo-table */.  
2ee0: 20 20 20 20 69 66 28 20 6f 6c 64 5f 63 6f 6c 5f      if( old_col_
2ef0: 6d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  mask ){.        
2f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f10: 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
2f20: 20 69 43 75 72 2c 20 69 44 61 74 61 29 3b 0a 20   iCur, iData);. 
2f30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
2f60: 2c 20 30 2c 20 69 44 61 74 61 29 3b 0a 20 20 20  , 0, iData);.   
2f70: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2f80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f90: 4f 50 5f 49 6e 73 65 72 74 2c 20 6f 6c 64 49 64  OP_Insert, oldId
2fa0: 78 2c 20 69 44 61 74 61 2c 20 69 52 6f 77 69 64  x, iData, iRowid
2fb0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
2fc0: 70 20 62 61 63 6b 20 61 6e 64 20 72 75 6e 20 74  p back and run t
2fd0: 68 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  he BEFORE trigge
2fe0: 72 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  rs */.      sqli
2ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3000: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 65   OP_Goto, 0, iBe
3010: 67 69 6e 42 65 66 6f 72 65 54 72 69 67 67 65 72  ginBeforeTrigger
3020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3030: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3040: 69 45 6e 64 42 65 66 6f 72 65 54 72 69 67 67 65  iEndBeforeTrigge
3050: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
3060: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
3070: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
3080: 65 20 72 6f 77 20 2a 2f 0a 23 69 66 6e 64 65 66  e row */.#ifndef
3090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
30a0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
30b0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
30c0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ab) ){.        c
30d0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 74 61 62  onst char *pVtab
30e0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
30f0: 29 70 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  )pTab->pVtab;.  
3100: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
3110: 69 72 74 75 61 6c 4c 6f 63 6b 20 3d 20 70 54 61  irtualLock = pTa
3120: 62 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  b;.        sqlit
3130: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
3140: 4f 50 5f 56 55 70 64 61 74 65 2c 20 30 2c 20 31  OP_VUpdate, 0, 1
3150: 2c 20 69 52 6f 77 69 64 2c 20 70 56 74 61 62 2c  , iRowid, pVtab,
3160: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20   P4_VTAB);.     
3170: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
3180: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
3190: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77  lite3GenerateRow
31a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
31b0: 54 61 62 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  Tab, iCur, iRowi
31c0: 64 2c 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  d, pParse->neste
31d0: 64 3d 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d==0);.      }. 
31e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
31f0: 74 68 65 72 65 20 61 72 65 20 72 6f 77 20 74 72  there are row tr
3200: 69 67 67 65 72 73 2c 20 63 6c 6f 73 65 20 61 6c  iggers, close al
3210: 6c 20 63 75 72 73 6f 72 73 20 74 68 65 6e 20 69  l cursors then i
3220: 6e 76 6f 6b 65 0a 20 20 20 20 2a 2a 20 74 68 65  nvoke.    ** the
3230: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 0a   AFTER triggers.
3240: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 74      */.    if( t
3250: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b  riggers_exist ){
3260: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 62  .      /* Jump b
3270: 61 63 6b 20 61 6e 64 20 72 75 6e 20 74 68 65 20  ack and run the 
3280: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20 2a  AFTER triggers *
3290: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
32a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32b0: 47 6f 74 6f 2c 20 30 2c 20 69 42 65 67 69 6e 41  Goto, 0, iBeginA
32c0: 66 74 65 72 54 72 69 67 67 65 72 29 3b 0a 20 20  fterTrigger);.  
32d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
32e0: 75 6d 70 48 65 72 65 28 76 2c 20 69 45 6e 64 41  umpHere(v, iEndA
32f0: 66 74 65 72 54 72 69 67 67 65 72 29 3b 0a 20 20  fterTrigger);.  
3300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20    }..    /* End 
3310: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f  of the delete lo
3320: 6f 70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  op */.    sqlite
3330: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3340: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
3350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3360: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
3370: 20 65 6e 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   end);..    /* C
3380: 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 73  lose the cursors
3390: 20 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   after the loop 
33a0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
33b0: 72 6f 77 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  row triggers */.
33c0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
33d0: 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
33e0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  Tab) ){.      fo
33f0: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
3400: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
3410: 69 2b 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e  i++, pIdx=pIdx->
3420: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
3430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3440: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
3450: 43 75 72 20 2b 20 69 2c 20 70 49 64 78 2d 3e 74  Cur + i, pIdx->t
3460: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  num);.      }.  
3470: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3480: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
3490: 65 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 7d 0a  e, iCur);.    }.
34a0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
34b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
34c0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
34d0: 72 65 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  re deleted. If t
34e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a  his routine is .
34f0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20    ** generating 
3500: 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20  code because of 
3510: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
3520: 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20  3NestedParse(), 
3530: 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f  do not.  ** invo
3540: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
3550: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
3560: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
3570: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
3580: 73 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  s && pParse->nes
3590: 74 65 64 3d 3d 30 20 26 26 20 21 70 50 61 72 73  ted==0 && !pPars
35a0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
35b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
35d0: 6c 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20 31  ltRow, memCnt, 1
35e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
35f0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3600: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3610: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3620: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
3630: 2c 20 22 72 6f 77 73 20 64 65 6c 65 74 65 64 22  , "rows deleted"
3640: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
3650: 7d 0a 0a 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  }..delete_from_c
3660: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
3670: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70 28  3AuthContextPop(
3680: 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  &sContext);.  sq
3690: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
36a0: 74 65 28 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  te(pTabList);.  
36b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
36c0: 65 28 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(pWhere);.  ret
36d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
36e0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
36f0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
3700: 68 61 74 20 63 61 75 73 65 73 20 61 20 73 69 6e  hat causes a sin
3710: 67 6c 65 20 72 6f 77 20 6f 66 20 61 0a 2a 2a 20  gle row of a.** 
3720: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 74 6f 20  single table to 
3730: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  be deleted..**.*
3740: 2a 20 54 68 65 20 56 44 42 45 20 6d 75 73 74 20  * The VDBE must 
3750: 62 65 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  be in a particul
3760: 61 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  ar state when th
3770: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3780: 6c 6c 65 64 2e 0a 2a 2a 20 54 68 65 73 65 20 61  lled..** These a
3790: 72 65 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  re the requireme
37a0: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  nts:.**.**   1. 
37b0: 20 41 20 72 65 61 64 2f 77 72 69 74 65 20 63 75   A read/write cu
37c0: 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
37d0: 20 70 54 61 62 2c 20 74 68 65 20 74 61 62 6c 65   pTab, the table
37e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
37f0: 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  row.**       to 
3800: 62 65 20 64 65 6c 65 74 65 64 2c 20 6d 75 73 74  be deleted, must
3810: 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 63 75   be opened as cu
3820: 72 73 6f 72 20 6e 75 6d 62 65 72 20 22 62 61 73  rsor number "bas
3830: 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  e"..**.**   2.  
3840: 52 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  Read/write curso
3850: 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
3860: 65 73 20 6f 66 20 70 54 61 62 20 6d 75 73 74 20  es of pTab must 
3870: 62 65 20 6f 70 65 6e 20 61 73 0a 2a 2a 20 20 20  be open as.**   
3880: 20 20 20 20 63 75 72 73 6f 72 20 6e 75 6d 62 65      cursor numbe
3890: 72 20 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65  r base+i for the
38a0: 20 69 2d 74 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a   i-th index..**.
38b0: 2a 2a 20 20 20 33 2e 20 20 54 68 65 20 72 65 63  **   3.  The rec
38c0: 6f 72 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ord number of th
38d0: 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  e row to be dele
38e0: 74 65 64 20 6d 75 73 74 20 62 65 20 73 74 6f 72  ted must be stor
38f0: 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 6d  ed in.**       m
3900: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 52 6f 77 69  emory cell iRowi
3910: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
3920: 75 74 69 6e 65 20 70 6f 70 73 20 74 68 65 20 74  utine pops the t
3930: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
3940: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 72 65  to remove the re
3950: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  cord number.** a
3960: 6e 64 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  nd then generate
3970: 73 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  s code to remove
3980: 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20   both the table 
3990: 72 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c 20 69  record and all i
39a0: 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ndex.** entries 
39b0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
39c0: 61 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  at record..*/.vo
39d0: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
39e0: 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20 20 50  teRowDelete(.  P
39f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
3a10: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
3a20: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20  *pTab,       /* 
3a30: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  Table containing
3a40: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64   the row to be d
3a50: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
3a60: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  iCur,          /
3a70: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
3a80: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
3a90: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 20  .  int iRowid,  
3aa0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
3ab0: 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  cell that contai
3ac0: 6e 73 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  ns the rowid to 
3ad0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
3ae0: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 2f  count          /
3af0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
3b00: 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  row change count
3b10: 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  er */.){.  int a
3b20: 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ddr;.  Vdbe *v;.
3b30: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
3b40: 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d 20 73  Vdbe;.  addr = s
3b50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3b60: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
3b70: 2c 20 69 43 75 72 2c 20 30 2c 20 69 52 6f 77 69  , iCur, 0, iRowi
3b80: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  d);.  sqlite3Gen
3b90: 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c  erateRowIndexDel
3ba0: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
3bb0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 73 71  , iCur, 0);.  sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 43  v, OP_Delete, iC
3be0: 75 72 2c 20 28 63 6f 75 6e 74 3f 4f 50 46 4c 41  ur, (count?OPFLA
3bf0: 47 5f 4e 43 48 41 4e 47 45 3a 30 29 29 3b 0a 20  G_NCHANGE:0));. 
3c00: 20 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20   if( count ){.  
3c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3c20: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP4(v, -1, pTa
3c30: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41  b->zName, P4_STA
3c40: 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  TIC);.  }.  sqli
3c50: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c60: 76 2c 20 61 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a  v, addr);.}../*.
3c70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3c80: 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
3c90: 6f 64 65 20 74 68 61 74 20 63 61 75 73 65 73 20  ode that causes 
3ca0: 74 68 65 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  the deletion of 
3cb0: 61 6c 6c 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74  all.** index ent
3cc0: 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
3cd0: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72 6f  with a single ro
3ce0: 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61  w of a single ta
3cf0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ble..**.** The V
3d00: 44 42 45 20 6d 75 73 74 20 62 65 20 69 6e 20 61  DBE must be in a
3d10: 20 70 61 72 74 69 63 75 6c 61 72 20 73 74 61 74   particular stat
3d20: 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
3d30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
3d40: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
3d50: 72 65 71 75 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a  requirements:.**
3d60: 0a 2a 2a 20 20 20 31 2e 20 20 41 20 72 65 61 64  .**   1.  A read
3d70: 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 70 6f  /write cursor po
3d80: 69 6e 74 69 6e 67 20 74 6f 20 70 54 61 62 2c 20  inting to pTab, 
3d90: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
3da0: 6e 69 6e 67 20 74 68 65 20 72 6f 77 0a 2a 2a 20  ning the row.** 
3db0: 20 20 20 20 20 20 74 6f 20 62 65 20 64 65 6c 65        to be dele
3dc0: 74 65 64 2c 20 6d 75 73 74 20 62 65 20 6f 70 65  ted, must be ope
3dd0: 6e 65 64 20 61 73 20 63 75 72 73 6f 72 20 6e 75  ned as cursor nu
3de0: 6d 62 65 72 20 22 69 43 75 72 22 2e 0a 2a 2a 0a  mber "iCur"..**.
3df0: 2a 2a 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72  **   2.  Read/wr
3e00: 69 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ite cursors for 
3e10: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
3e20: 54 61 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  Tab must be open
3e30: 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72   as.**       cur
3e40: 73 6f 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2b  sor number iCur+
3e50: 69 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 69  i for the i-th i
3e60: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e  ndex..**.**   3.
3e70: 20 20 54 68 65 20 22 69 43 75 72 22 20 63 75 72    The "iCur" cur
3e80: 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e  sor must be poin
3e90: 74 69 6e 67 20 74 6f 20 74 68 65 20 72 6f 77 20  ting to the row 
3ea0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a  that is to be.**
3eb0: 20 20 20 20 20 20 20 64 65 6c 65 74 65 64 2e 0a         deleted..
3ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47  */.void sqlite3G
3ed0: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
3ee0: 65 6c 65 74 65 28 0a 20 20 50 61 72 73 65 20 2a  elete(.  Parse *
3ef0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
3f00: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
3f10: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
3f20: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
3f30: 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61  Tab,       /* Ta
3f40: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
3f50: 68 65 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  he row to be del
3f60: 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  eted */.  int iC
3f70: 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
3f80: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
3f90: 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
3fa0: 20 69 6e 74 20 2a 61 52 65 67 49 64 78 20 20 20   int *aRegIdx   
3fb0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64 65 6c 65      /* Only dele
3fc0: 74 65 20 69 66 20 61 52 65 67 49 64 78 21 3d 30  te if aRegIdx!=0
3fd0: 20 26 26 20 61 52 65 67 49 64 78 5b 69 5d 3e 30   && aRegIdx[i]>0
3fe0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
3ff0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
4000: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 66 6f 72 28   int r1;..  for(
4010: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
4020: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 69 2b  pIndex; pIdx; i+
4030: 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  +, pIdx=pIdx->pN
4040: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 61 52  ext){.    if( aR
4050: 65 67 49 64 78 21 3d 30 20 26 26 20 61 52 65 67  egIdx!=0 && aReg
4060: 49 64 78 5b 69 2d 31 5d 3d 3d 30 20 29 20 63 6f  Idx[i-1]==0 ) co
4070: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 31 20 3d  ntinue;.    r1 =
4080: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
4090: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
40a0: 20 70 49 64 78 2c 20 69 43 75 72 2c 20 72 31 2c   pIdx, iCur, r1,
40b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
40c0: 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
40d0: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 49 64 78  e->pVdbe, OP_Idx
40e0: 44 65 6c 65 74 65 2c 20 69 43 75 72 2b 69 2c 20  Delete, iCur+i, 
40f0: 72 31 2c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  r1,pIdx->nColumn
4100: 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  +1);.  }.}../*.*
4110: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4120: 74 68 61 74 20 77 69 6c 6c 20 61 73 73 65 6d 62  that will assemb
4130: 6c 65 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  le an index key 
4140: 61 6e 64 20 70 75 74 20 69 74 20 69 6e 20 72 65  and put it in re
4150: 67 69 73 74 65 72 0a 2a 2a 20 72 65 67 4f 75 74  gister.** regOut
4160: 2e 20 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  .  The key with 
4170: 62 65 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64  be for index pId
4180: 78 20 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e  x which is an in
4190: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 20  dex on pTab..** 
41a0: 69 43 75 72 20 69 73 20 74 68 65 20 69 6e 64 65  iCur is the inde
41b0: 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70  x of a cursor op
41c0: 65 6e 20 6f 6e 20 74 68 65 20 70 54 61 62 20 74  en on the pTab t
41d0: 61 62 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69 6e  able and pointin
41e0: 67 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74 72  g to.** the entr
41f0: 79 20 74 68 61 74 20 6e 65 65 64 73 20 69 6e 64  y that needs ind
4200: 65 78 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  exing..**.** Ret
4210: 75 72 6e 20 61 20 72 65 67 69 73 74 65 72 20 6e  urn a register n
4220: 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 74  umber which is t
4230: 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 62 6c  he first in a bl
4240: 6f 63 6b 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ock of.** regist
4250: 65 72 73 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ers that holds t
4260: 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
4270: 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 20 20 54  he index key.  T
4280: 68 65 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 72  he.** block of r
4290: 65 67 69 73 74 65 72 73 20 68 61 73 20 61 6c 72  egisters has alr
42a0: 65 61 64 79 20 62 65 65 6e 20 64 65 61 6c 6c 6f  eady been deallo
42b0: 63 61 74 65 64 20 62 79 20 74 68 65 20 74 69 6d  cated by the tim
42c0: 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
42d0: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 69 6e  e returns..*/.in
42e0: 74 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  t sqlite3Generat
42f0: 65 49 6e 64 65 78 4b 65 79 28 0a 20 20 50 61 72  eIndexKey(.  Par
4300: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4310: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
4320: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
4330: 49 64 78 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx,       /* Th
4340: 65 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63  e index for whic
4350: 68 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  h to generate a 
4360: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  key */.  int iCu
4370: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r,          /* C
4380: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
4390: 20 74 68 65 20 70 49 64 78 2d 3e 70 54 61 62 6c   the pIdx->pTabl
43a0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
43b0: 20 72 65 67 4f 75 74 2c 20 20 20 20 20 20 20 20   regOut,        
43c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
43d0: 20 69 6e 64 65 78 20 6b 65 79 20 74 6f 20 74 68   index key to th
43e0: 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
43f0: 20 69 6e 74 20 64 6f 4d 61 6b 65 52 65 63 20 20   int doMakeRec  
4400: 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 4f      /* Run the O
4410: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  P_MakeRecord ins
4420: 74 72 75 63 74 69 6f 6e 20 69 66 20 74 72 75 65  truction if true
4430: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4440: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4450: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
4460: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
4470: 3e 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72  >pTable;.  int r
4480: 65 67 42 61 73 65 3b 0a 20 20 69 6e 74 20 6e 43  egBase;.  int nC
4490: 6f 6c 3b 0a 0a 20 20 6e 43 6f 6c 20 3d 20 70 49  ol;..  nCol = pI
44a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 72  dx->nColumn;.  r
44b0: 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
44c0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
44d0: 72 73 65 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 20 20  rse, nCol+1);.  
44e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
44f0: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
4500: 43 75 72 2c 20 72 65 67 42 61 73 65 2b 6e 43 6f  Cur, regBase+nCo
4510: 6c 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  l);.  for(j=0; j
4520: 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nCol; j++){.   
4530: 20 69 6e 74 20 69 64 78 20 3d 20 70 49 64 78 2d   int idx = pIdx-
4540: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
4550: 20 20 69 66 28 20 69 64 78 3d 3d 70 54 61 62 2d    if( idx==pTab-
4560: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
4570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4580: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
4590: 65 67 42 61 73 65 2b 6e 43 6f 6c 2c 20 72 65 67  egBase+nCol, reg
45a0: 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 7d 65 6c  Base+j);.    }el
45b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
45c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
45d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
45e0: 69 64 78 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  idx, regBase+j);
45f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
4600: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
4610: 54 61 62 2c 20 69 64 78 29 3b 0a 20 20 20 20 7d  Tab, idx);.    }
4620: 0a 20 20 7d 0a 20 20 69 66 28 20 64 6f 4d 61 6b  .  }.  if( doMak
4630: 65 52 65 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  eRec ){.    sqli
4640: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4650: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4660: 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2b 31 2c  regBase, nCol+1,
4670: 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 73 71   regOut);.    sq
4680: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
4690: 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a  tyStr(v, pIdx);.
46a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
46b0: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
46c0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
46d0: 43 6f 6c 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  Col+1);.  return
46e0: 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 20   regBase;.}../* 
46f0: 4d 61 6b 65 20 73 75 72 65 20 22 69 73 56 69 65  Make sure "isVie
4700: 77 22 20 67 65 74 73 20 75 6e 64 65 66 69 6e 65  w" gets undefine
4710: 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 66  d in case this f
4720: 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74  ile becomes part
4730: 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6d 61 6c 67   of.** the amalg
4740: 61 6d 61 74 69 6f 6e 20 2d 20 73 6f 20 74 68 61  amation - so tha
4750: 74 20 73 75 62 73 65 71 75 65 6e 74 20 66 69 6c  t subsequent fil
4760: 65 73 20 64 6f 20 6e 6f 74 20 73 65 65 20 69 73  es do not see is
4770: 56 69 65 77 20 61 73 20 61 0a 2a 2a 20 6d 61 63  View as a.** mac
4780: 72 6f 2e 20 2a 2f 0a 23 75 6e 64 65 66 20 69 73  ro. */.#undef is
4790: 56 69 65 77 0a                                   View.