/ Hex Artifact Content
Login

Artifact 72f8febf6170cda830f509c8f9dffbed3df3596c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 44 45 4c 45 54 45 20 46   handle DELETE F
01d0: 52 4f 4d 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ROM statements..
01e0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 65 6c 65 74  **.** $Id: delet
01f0: 65 2e 63 2c 76 20 31 2e 37 31 20 32 30 30 34 2f  e.c,v 1.71 2004/
0200: 30 35 2f 32 38 20 31 36 3a 30 30 3a 32 32 20 64  05/28 16:00:22 d
0210: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
0220: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0230: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75  h"../*.** Look u
0240: 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 74 68  p every table th
0250: 61 74 20 69 73 20 6e 61 6d 65 64 20 69 6e 20 70  at is named in p
0260: 53 72 63 2e 20 20 49 66 20 61 6e 79 20 74 61 62  Src.  If any tab
0270: 6c 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  le is not found,
0280: 0a 2a 2a 20 61 64 64 20 61 6e 20 65 72 72 6f 72  .** add an error
0290: 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72   message to pPar
02a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20  se->zErrMsg and 
02b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 20 49 66  return NULL.  If
02c0: 20 61 6c 6c 20 74 61 62 6c 65 73 0a 2a 2a 20 61   all tables.** a
02d0: 72 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  re found, return
02e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
02f0: 65 20 6c 61 73 74 20 74 61 62 6c 65 2e 0a 2a 2f  e last table..*/
0300: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 53  .Table *sqlite3S
0310: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 50 61 72  rcListLookup(Par
0320: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
0330: 69 73 74 20 2a 70 53 72 63 29 7b 0a 20 20 54 61  ist *pSrc){.  Ta
0340: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
0350: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
0360: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
0370: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
0380: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 70 53   char *zTab = pS
0390: 72 63 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  rc->a[i].zName;.
03a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
03b0: 7a 44 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  zDb = pSrc->a[i]
03c0: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  .zDatabase;.    
03d0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
03e0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
03f0: 2c 20 7a 54 61 62 2c 20 7a 44 62 29 3b 0a 20 20  , zTab, zDb);.  
0400: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61    pSrc->a[i].pTa
0410: 62 20 3d 20 70 54 61 62 3b 0a 20 20 7d 0a 20 20  b = pTab;.  }.  
0420: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
0430: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  /*.** Check to m
0440: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 69 76  ake sure the giv
0450: 65 6e 20 74 61 62 6c 65 20 69 73 20 77 72 69 74  en table is writ
0460: 61 62 6c 65 2e 20 20 49 66 20 69 74 20 69 73 20  able.  If it is 
0470: 6e 6f 74 0a 2a 2a 20 77 72 69 74 61 62 6c 65 2c  not.** writable,
0480: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   generate an err
0490: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 72  or message and r
04a0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 69 74 20  eturn 1.  If it 
04b0: 69 73 0a 2a 2a 20 77 72 69 74 61 62 6c 65 20 72  is.** writable r
04c0: 65 74 75 72 6e 20 30 3b 0a 2a 2f 0a 69 6e 74 20  eturn 0;.*/.int 
04d0: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
04e0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
04f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
0500: 74 20 76 69 65 77 4f 6b 29 7b 0a 20 20 69 66 28  t viewOk){.  if(
0510: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
0520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
0530: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
0540: 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
0550: 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20 70   be modified", p
0560: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
0570: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0580: 20 69 66 28 20 21 76 69 65 77 4f 6b 20 26 26 20   if( !viewOk && 
0590: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
05a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
05b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
05c0: 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 25 73 20 62  nnot modify %s b
05d0: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 20 76  ecause it is a v
05e0: 69 65 77 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65  iew",pTab->zName
05f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
0600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
0610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
0620: 73 20 61 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  s a DELETE FROM 
0630: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0640: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
0650: 46 72 6f 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  From(.  Parse *p
0660: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
0670: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
0680: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
0690: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
06a0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
06b0: 6f 6d 20 77 68 69 63 68 20 77 65 20 73 68 6f 75  om which we shou
06c0: 6c 64 20 64 65 6c 65 74 65 20 74 68 69 6e 67 73  ld delete things
06d0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
06e0: 72 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re           /* 
06f0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
0700: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
0710: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  /.){.  Vdbe *v; 
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0730: 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
0740: 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
0750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
0760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0770: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
0780: 20 72 65 63 6f 72 64 73 20 77 69 6c 6c 20 62 65   records will be
0790: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 63 6f   deleted */.  co
07a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
07b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
07c0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
07d0: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 65   pTab */.  int e
07e0: 6e 64 2c 20 61 64 64 72 3b 20 20 20 20 20 20 20  nd, addr;       
07f0: 20 20 2f 2a 20 41 20 63 6f 75 70 6c 65 20 61 64    /* A couple ad
0800: 64 72 65 73 73 65 73 20 6f 66 20 67 65 6e 65 72  dresses of gener
0810: 61 74 65 64 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ated code */.  i
0820: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
0830: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
0840: 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  unter */.  Where
0850: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
0860: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
0870: 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
0880: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64   clause */.  Ind
0890: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
08a0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
08b0: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
08c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
08d0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
08e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
08f0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
0900: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 73 71 6c  or pTab */.  sql
0910: 69 74 65 20 2a 64 62 3b 20 20 20 20 20 20 20 20  ite *db;        
0920: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
0930: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
0940: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20  /.  int isView; 
0950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0960: 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67  ue if attempting
0970: 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
0980: 61 20 76 69 65 77 20 2a 2f 0a 20 20 41 75 74 68  a view */.  Auth
0990: 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74  Context sContext
09a0: 3b 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74  ;  /* Authorizat
09b0: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a  ion context */..
09c0: 20 20 69 6e 74 20 72 6f 77 5f 74 72 69 67 67 65    int row_trigge
09d0: 72 73 5f 65 78 69 73 74 20 3d 20 30 3b 20 20 2f  rs_exist = 0;  /
09e0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 74 72  * True if any tr
09f0: 69 67 67 65 72 73 20 65 78 69 73 74 20 2a 2f 0a  iggers exist */.
0a00: 20 20 69 6e 74 20 62 65 66 6f 72 65 5f 74 72 69    int before_tri
0a10: 67 67 65 72 73 3b 20 20 20 20 20 20 20 20 20 2f  ggers;         /
0a20: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
0a30: 61 72 65 20 42 45 46 4f 52 45 20 74 72 69 67 67  are BEFORE trigg
0a40: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61 66 74  ers */.  int aft
0a50: 65 72 5f 74 72 69 67 67 65 72 73 3b 20 20 20 20  er_triggers;    
0a60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0a70: 20 74 68 65 72 65 20 61 72 65 20 41 46 54 45 52   there are AFTER
0a80: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69   triggers */.  i
0a90: 6e 74 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 20  nt oldIdx = -1; 
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
0ab0: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 4f 4c  ursor for the OL
0ac0: 44 20 74 61 62 6c 65 20 6f 66 20 41 46 54 45 52  D table of AFTER
0ad0: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 0a 20 20   triggers */..  
0ae0: 73 43 6f 6e 74 65 78 74 2e 70 50 61 72 73 65 20  sContext.pParse 
0af0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73  = 0;.  if( pPars
0b00: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
0b10: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
0b20: 20 29 7b 0a 20 20 20 20 70 54 61 62 4c 69 73 74   ){.    pTabList
0b30: 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 64   = 0;.    goto d
0b40: 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e  elete_from_clean
0b50: 75 70 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70  up;.  }.  db = p
0b60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
0b70: 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ert( pTabList->n
0b80: 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  Src==1 );..  /* 
0b90: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
0ba0: 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20 74   which we want t
0bb0: 6f 20 64 65 6c 65 74 65 2e 20 20 54 68 69 73 20  o delete.  This 
0bc0: 74 61 62 6c 65 20 68 61 73 20 74 6f 20 62 65 0a  table has to be.
0bd0: 20 20 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20 53    ** put in an S
0be0: 72 63 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  rcList structure
0bf0: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66   because some of
0c00: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
0c10: 20 77 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65   we.  ** will be
0c20: 20 63 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73   calling are des
0c30: 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69  igned to work wi
0c40: 74 68 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  th multiple tabl
0c50: 65 73 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20  es and expect.  
0c60: 2a 2a 20 61 6e 20 53 72 63 4c 69 73 74 2a 20 70  ** an SrcList* p
0c70: 61 72 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64  arameter instead
0c80: 20 6f 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65   of just a Table
0c90: 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  * parameter..  *
0ca0: 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
0cb0: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
0cc0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
0cd0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
0ce0: 20 29 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f   )  goto delete_
0cf0: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
0d00: 62 65 66 6f 72 65 5f 74 72 69 67 67 65 72 73 20  before_triggers 
0d10: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
0d20: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
0d30: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2c 20 0a  Tab->pTrigger, .
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 20 20 20 20 54 4b 5f 44 45 4c 45           TK_DELE
0d60: 54 45 2c 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54  TE, TK_BEFORE, T
0d70: 4b 5f 52 4f 57 2c 20 30 29 3b 0a 20 20 61 66 74  K_ROW, 0);.  aft
0d80: 65 72 5f 74 72 69 67 67 65 72 73 20 3d 20 73 71  er_triggers = sq
0d90: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
0da0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  st(pParse, pTab-
0db0: 3e 70 54 72 69 67 67 65 72 2c 20 0a 20 20 20 20  >pTrigger, .    
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 20 20 54 4b 5f 44 45 4c 45 54 45 2c 20       TK_DELETE, 
0de0: 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 52 4f 57  TK_AFTER, TK_ROW
0df0: 2c 20 30 29 3b 0a 20 20 72 6f 77 5f 74 72 69 67  , 0);.  row_trig
0e00: 67 65 72 73 5f 65 78 69 73 74 20 3d 20 62 65 66  gers_exist = bef
0e10: 6f 72 65 5f 74 72 69 67 67 65 72 73 20 7c 7c 20  ore_triggers || 
0e20: 61 66 74 65 72 5f 74 72 69 67 67 65 72 73 3b 0a  after_triggers;.
0e30: 20 20 69 73 56 69 65 77 20 3d 20 70 54 61 62 2d    isView = pTab-
0e40: 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 20 20 69  >pSelect!=0;.  i
0e50: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
0e60: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
0e70: 62 2c 20 62 65 66 6f 72 65 5f 74 72 69 67 67 65  b, before_trigge
0e80: 72 73 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  rs) ){.    goto 
0e90: 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61  delete_from_clea
0ea0: 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  nup;.  }.  asser
0eb0: 74 28 20 70 54 61 62 2d 3e 69 44 62 3c 64 62 2d  t( pTab->iDb<db-
0ec0: 3e 6e 44 62 20 29 3b 0a 20 20 7a 44 62 20 3d 20  >nDb );.  zDb = 
0ed0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
0ee0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  b].zName;.  if( 
0ef0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
0f00: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
0f10: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
0f20: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
0f30: 20 20 20 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f      goto delete_
0f40: 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  from_cleanup;.  
0f50: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20  }..  /* If pTab 
0f60: 69 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77  is really a view
0f70: 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68  , make sure it h
0f80: 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
0f90: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
0fa0: 69 73 56 69 65 77 20 26 26 20 73 71 6c 69 74 65  isView && sqlite
0fb0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
0fc0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
0fd0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 65  ) ){.    goto de
0fe0: 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75  lete_from_cleanu
0ff0: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  p;.  }..  /* All
1000: 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 20 75  ocate a cursor u
1010: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1020: 20 6f 6c 64 2e 2a 20 64 61 74 61 20 66 6f 72 20   old.* data for 
1030: 61 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a  a trigger..  */.
1040: 20 20 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65    if( row_trigge
1050: 72 73 5f 65 78 69 73 74 20 29 7b 20 0a 20 20 20  rs_exist ){ .   
1060: 20 6f 6c 64 49 64 78 20 3d 20 70 50 61 72 73 65   oldIdx = pParse
1070: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nTab++;.  }.. 
1080: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
1090: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20  column names in 
10a0: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
10b0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
10c0: 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  rt( pTabList->nS
10d0: 72 63 3d 3d 31 20 29 3b 0a 20 20 69 43 75 72 20  rc==1 );.  iCur 
10e0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
10f0: 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
1100: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
1110: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69   pWhere ){.    i
1120: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
1130: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
1140: 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 57   pTabList, 0, pW
1150: 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
1160: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
1170: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
1180: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1190: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
11a0: 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b  pWhere, 0, 0) ){
11b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 65  .      goto dele
11c0: 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3b  te_from_cleanup;
11d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11e0: 20 53 74 61 72 74 20 74 68 65 20 76 69 65 77 20   Start the view 
11f0: 63 6f 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69  context.  */.  i
1200: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
1210: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
1220: 65 78 74 50 75 73 68 28 70 50 61 72 73 65 2c 20  extPush(pParse, 
1230: 26 73 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d  &sContext, pTab-
1240: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  >zName);.  }..  
1250: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
1260: 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
1270: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1280: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1290: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67  f( v==0 ){.    g
12a0: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
12b0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
12c0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
12d0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
12e0: 2c 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f 65  , row_triggers_e
12f0: 78 69 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29  xist, pTab->iDb)
1300: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
1310: 65 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65  e trying to dele
1320: 74 65 20 66 72 6f 6d 20 61 20 76 69 65 77 2c 20  te from a view, 
1330: 63 6f 6e 73 74 72 75 63 74 20 74 68 61 74 20 76  construct that v
1340: 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  iew into.  ** a 
1350: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1360: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
1370: 65 77 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ew ){.    Select
1380: 20 2a 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65   *pView = sqlite
1390: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
13a0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
13b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13c0: 72 73 65 2c 20 70 56 69 65 77 2c 20 53 52 54 5f  rse, pView, SRT_
13d0: 54 65 6d 70 54 61 62 6c 65 2c 20 69 43 75 72 2c  TempTable, iCur,
13e0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
13f0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1400: 65 6c 65 74 65 28 70 56 69 65 77 29 3b 0a 20 20  elete(pView);.  
1410: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1420: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 6f  ze the counter o
1430: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1440: 72 6f 77 73 20 64 65 6c 65 74 65 64 2c 20 69 66  rows deleted, if
1450: 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 63 6f 75  .  ** we are cou
1460: 6e 74 69 6e 67 20 72 6f 77 73 2e 0a 20 20 2a 2f  nting rows..  */
1470: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
1480: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
1490: 6f 77 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ows ){.    sqlit
14a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14b0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
14c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
14d0: 69 61 6c 20 63 61 73 65 3a 20 41 20 44 45 4c 45  ial case: A DELE
14e0: 54 45 20 77 69 74 68 6f 75 74 20 61 20 57 48 45  TE without a WHE
14f0: 52 45 20 63 6c 61 75 73 65 20 64 65 6c 65 74 65  RE clause delete
1500: 73 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  s everything..  
1510: 2a 2a 20 49 74 20 69 73 20 65 61 73 69 65 72 20  ** It is easier 
1520: 6a 75 73 74 20 74 6f 20 65 72 61 73 65 20 74 68  just to erase th
1530: 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 2e 20 20  e whole table.  
1540: 4e 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c 20 74  Note, however, t
1550: 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  hat.  ** this me
1560: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  ans that the row
1570: 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 77 69   change count wi
1580: 6c 6c 20 62 65 20 69 6e 63 6f 72 72 65 63 74 2e  ll be incorrect.
1590: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
15a0: 72 65 3d 3d 30 20 26 26 20 21 72 6f 77 5f 74 72  re==0 && !row_tr
15b0: 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a  iggers_exist ){.
15c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
15d0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
15e0: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Rows ){.      /*
15f0: 20 49 66 20 63 6f 75 6e 74 69 6e 67 20 72 6f 77   If counting row
1600: 73 20 64 65 6c 65 74 65 64 2c 20 6a 75 73 74 20  s deleted, just 
1610: 63 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20  count the total 
1620: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1630: 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ** entries in th
1640: 65 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  e table. */.    
1650: 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 20    int endOfLoop 
1660: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1670: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1680: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1690: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
16a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
16c0: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44  nteger, pTab->iD
16d0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  b, 0);.        s
16e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16f0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
1700: 69 43 75 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  iCur, pTab->tnum
1710: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1720: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1730: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
1740: 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f   iCur, pTab->nCo
1750: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1770: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
1780: 20 69 43 75 72 2c 20 73 71 6c 69 74 65 33 56 64   iCur, sqlite3Vd
1790: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17a0: 2b 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  +2);.      addr 
17b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17c0: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
17d0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
17e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17f0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 43 75 72 2c  , OP_Next, iCur,
1800: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71   addr);.      sq
1810: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1820: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f  Label(v, endOfLo
1830: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1850: 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30  P_Close, iCur, 0
1860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1870: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
1880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1890: 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
18a0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
18b0: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f  ->iDb);.      fo
18c0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
18d0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
18e0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
18f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
1910: 61 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ar, pIdx->tnum, 
1920: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pIdx->iDb);.    
1930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1940: 20 2f 2a 20 54 68 65 20 75 73 75 61 6c 20 63 61   /* The usual ca
1950: 73 65 3a 20 54 68 65 72 65 20 69 73 20 61 20 57  se: There is a W
1960: 48 45 52 45 20 63 6c 61 75 73 65 20 73 6f 20 77  HERE clause so w
1970: 65 20 68 61 76 65 20 74 6f 20 73 63 61 6e 20 74  e have to scan t
1980: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
1990: 74 61 62 6c 65 20 61 6e 64 20 70 69 63 6b 20 77  table and pick w
19a0: 68 69 63 68 20 72 65 63 6f 72 64 73 20 74 6f 20  hich records to 
19b0: 64 65 6c 65 74 65 2e 0a 20 20 2a 2f 0a 20 20 65  delete..  */.  e
19c0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 42 65 67 69  lse{.    /* Begi
19d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
19e0: 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
19f0: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1a00: 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1a10: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1a20: 72 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  re, 1, 0);.    i
1a30: 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1a40: 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f  oto delete_from_
1a50: 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 20 20 2f 2a  cleanup;..    /*
1a60: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6b 65   Remember the ke
1a70: 79 20 6f 66 20 65 76 65 72 79 20 69 74 65 6d 20  y of every item 
1a80: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20  to be deleted.. 
1a90: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1aa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1ab0: 5f 4c 69 73 74 57 72 69 74 65 2c 20 30 2c 20 30  _ListWrite, 0, 0
1ac0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66  );.    if( db->f
1ad0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
1ae0: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20  untRows ){.     
1af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b00: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
1b10: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  1, 0);.    }..  
1b20: 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1b30: 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1b40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1b50: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1b60: 66 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  fo);..    /* Ope
1b70: 6e 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  n the pseudo-tab
1b80: 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
1b90: 20 4f 4c 44 20 69 66 20 74 68 65 72 65 20 61 72   OLD if there ar
1ba0: 65 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20 20  e triggers..    
1bb0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 6f 77 5f 74  */.    if( row_t
1bc0: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b  riggers_exist ){
1bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1be0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
1bf0: 65 6e 50 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78  enPseudo, oldIdx
1c00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1c20: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
1c30: 2c 20 6f 6c 64 49 64 78 2c 20 70 54 61 62 2d 3e  , oldIdx, pTab->
1c40: 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nCol);.    }..  
1c50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72    /* Delete ever
1c60: 79 20 69 74 65 6d 20 77 68 6f 73 65 20 6b 65 79  y item whose key
1c70: 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
1c80: 74 68 65 20 6c 69 73 74 20 64 75 72 69 6e 67 20  the list during 
1c90: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
1ca0: 61 73 65 20 73 63 61 6e 2e 20 20 57 65 20 68 61  ase scan.  We ha
1cb0: 76 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 65  ve to delete ite
1cc0: 6d 73 20 61 66 74 65 72 20 74 68 65 20 73 63 61  ms after the sca
1cd0: 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 20  n is complete.  
1ce0: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 64 65 6c    ** because del
1cf0: 65 74 69 6e 67 20 61 6e 20 69 74 65 6d 20 63 61  eting an item ca
1d00: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 73 63 61  n change the sca
1d10: 6e 20 6f 72 64 65 72 2e 0a 20 20 20 20 2a 2f 0a  n order..    */.
1d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52  ddOp(v, OP_ListR
1d40: 65 77 69 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  ewind, 0, 0);.  
1d50: 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 33 56    end = sqlite3V
1d60: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d70: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  ..    /* This is
1d80: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1d90: 66 20 74 68 65 20 64 65 6c 65 74 65 20 6c 6f 6f  f the delete loo
1da0: 70 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  p when there are
1db0: 0a 20 20 20 20 2a 2a 20 72 6f 77 20 74 72 69 67  .    ** row trig
1dc0: 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gers..    */.   
1dd0: 20 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72   if( row_trigger
1de0: 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 20  s_exist ){.     
1df0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1e00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c  dbeAddOp(v, OP_L
1e10: 69 73 74 52 65 61 64 2c 20 30 2c 20 65 6e 64 29  istRead, 0, end)
1e20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
1e40: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
1e50: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
1e60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1e80: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44  nteger, pTab->iD
1e90: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  b, 0);.        s
1ea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1eb0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
1ec0: 69 43 75 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  iCur, pTab->tnum
1ed0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ee0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1ef0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
1f00: 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 6e 43 6f   iCur, pTab->nCo
1f10: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1f20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f30: 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
1f40: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
1f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f60: 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 69  p(v, OP_Recno, i
1f70: 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Cur, 0);.      s
1f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1f90: 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
1fa0: 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Cur, 0);.      s
1fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1fc0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
1fd0: 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20 20 20   oldIdx, 0);.   
1fe0: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
1ff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2000: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2010: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29  _Close, iCur, 0)
2020: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2030: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
2040: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 54  rigger(pParse, T
2050: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 54 4b 5f  K_DELETE, 0, TK_
2060: 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 2d 31  BEFORE, pTab, -1
2070: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6f 6c 64  , .          old
2080: 49 64 78 2c 20 28 70 50 61 72 73 65 2d 3e 74 72  Idx, (pParse->tr
2090: 69 67 53 74 61 63 6b 29 3f 70 50 61 72 73 65 2d  igStack)?pParse-
20a0: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f  >trigStack->orco
20b0: 6e 66 3a 4f 45 5f 44 65 66 61 75 6c 74 2c 0a 09  nf:OE_Default,..
20c0: 20 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 0a    addr);.    }..
20d0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
20e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
20f0: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
2100: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 64 65   table we are de
2110: 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20  leting from and 
2120: 61 6c 6c 20 69 74 73 0a 20 20 20 20 20 20 2a 2a  all its.      **
2130: 20 69 6e 64 69 63 65 73 2e 20 20 49 66 20 74 68   indices.  If th
2140: 65 72 65 20 61 72 65 20 72 6f 77 20 74 72 69 67  ere are row trig
2150: 67 65 72 73 2c 20 74 68 69 73 20 68 61 70 70 65  gers, this happe
2160: 6e 73 20 69 6e 73 69 64 65 20 74 68 65 0a 20 20  ns inside the.  
2170: 20 20 20 20 2a 2a 20 4f 50 5f 4c 69 73 74 52 65      ** OP_ListRe
2180: 61 64 20 6c 6f 6f 70 20 62 65 63 61 75 73 65 20  ad loop because 
2190: 74 68 65 20 63 75 72 73 6f 72 20 68 61 76 65 20  the cursor have 
21a0: 74 6f 20 61 6c 6c 20 62 65 20 63 6c 6f 73 65 64  to all be closed
21b0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
21c0: 20 74 68 65 20 74 72 69 67 67 65 72 20 66 69 72   the trigger fir
21d0: 65 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  es.  If there ar
21e0: 65 20 6e 6f 20 72 6f 77 20 74 72 69 67 67 65 72  e no row trigger
21f0: 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  s, the.      ** 
2200: 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
2210: 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 6f 6e 20  ed only once on 
2220: 74 68 65 20 6f 75 74 73 69 64 65 20 74 68 65 20  the outside the 
2230: 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
2240: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
2250: 62 20 3d 20 69 43 75 72 20 2b 20 31 3b 0a 20 20  b = iCur + 1;.  
2260: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2270: 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70  ableAndIndices(p
2280: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 75  Parse, pTab, iCu
2290: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  r);..      /* Th
22a0: 69 73 20 69 73 20 74 68 65 20 62 65 67 69 6e 6e  is is the beginn
22b0: 69 6e 67 20 6f 66 20 74 68 65 20 64 65 6c 65 74  ing of the delet
22c0: 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 72  e loop when ther
22d0: 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a  e are no.      *
22e0: 2a 20 72 6f 77 20 74 72 69 67 67 65 72 73 20 2a  * row triggers *
22f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 72 6f 77  /.      if( !row
2300: 5f 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  _triggers_exist 
2310: 29 7b 20 0a 20 20 20 20 20 20 20 20 61 64 64 72  ){ .        addr
2320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2330: 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65  dOp(v, OP_ListRe
2340: 61 64 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20  ad, 0, end);.   
2350: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 44     }..      /* D
2360: 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20 2a 2f  elete the row */
2370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
2380: 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28  nerateRowDelete(
2390: 64 62 2c 20 76 2c 20 70 54 61 62 2c 20 69 43 75  db, v, pTab, iCu
23a0: 72 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  r, pParse->trigS
23b0: 74 61 63 6b 3d 3d 30 29 3b 0a 20 20 20 20 7d 0a  tack==0);.    }.
23c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
23d0: 20 61 72 65 20 72 6f 77 20 74 72 69 67 67 65 72   are row trigger
23e0: 73 2c 20 63 6c 6f 73 65 20 61 6c 6c 20 63 75 72  s, close all cur
23f0: 73 6f 72 73 20 74 68 65 6e 20 69 6e 76 6f 6b 65  sors then invoke
2400: 0a 20 20 20 20 2a 2a 20 74 68 65 20 41 46 54 45  .    ** the AFTE
2410: 52 20 74 72 69 67 67 65 72 73 0a 20 20 20 20 2a  R triggers.    *
2420: 2f 0a 20 20 20 20 69 66 28 20 72 6f 77 5f 74 72  /.    if( row_tr
2430: 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a  iggers_exist ){.
2440: 20 20 20 20 20 20 69 66 28 20 21 69 73 56 69 65        if( !isVie
2450: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  w ){.        for
2460: 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=1, pIdx=pTab-
2470: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 69  >pIndex; pIdx; i
2480: 2b 2b 2c 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ++, pIdx=pIdx->p
2490: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
24a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24b0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
24c0: 43 75 72 20 2b 20 69 2c 20 70 49 64 78 2d 3e 74  Cur + i, pIdx->t
24d0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  num);.        }.
24e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
2500: 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a  lose, iCur, 0);.
2510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2520: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
2530: 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  ger(pParse, TK_D
2540: 45 4c 45 54 45 2c 20 30 2c 20 54 4b 5f 41 46 54  ELETE, 0, TK_AFT
2550: 45 52 2c 20 70 54 61 62 2c 20 2d 31 2c 20 0a 20  ER, pTab, -1, . 
2560: 20 20 20 20 20 20 20 20 20 6f 6c 64 49 64 78 2c           oldIdx,
2570: 20 28 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   (pParse->trigSt
2580: 61 63 6b 29 3f 70 50 61 72 73 65 2d 3e 74 72 69  ack)?pParse->tri
2590: 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 3a 4f  gStack->orconf:O
25a0: 45 5f 44 65 66 61 75 6c 74 2c 0a 09 20 20 61 64  E_Default,..  ad
25b0: 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
25c0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 65  /* End of the de
25d0: 6c 65 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  lete loop */.   
25e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25f0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2600: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
2610: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2620: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20  bel(v, end);.   
2630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2640: 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65 73 65  p(v, OP_ListRese
2650: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  t, 0, 0);..    /
2660: 2a 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 73  * Close the curs
2670: 6f 72 73 20 61 66 74 65 72 20 74 68 65 20 6c 6f  ors after the lo
2680: 6f 70 20 69 66 20 74 68 65 72 65 20 61 72 65 20  op if there are 
2690: 6e 6f 20 72 6f 77 20 74 72 69 67 67 65 72 73 20  no row triggers 
26a0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 72 6f 77 5f  */.    if( !row_
26b0: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
26c0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  {.      for(i=1,
26d0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
26e0: 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70  ex; pIdx; i++, p
26f0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2700: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2710: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2720: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 20 2b 20 69  _Close, iCur + i
2730: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
2740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2750: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2760: 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c   OP_Close, iCur,
2770: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
2780: 65 2d 3e 6e 54 61 62 20 3d 20 69 43 75 72 3b 0a  e->nTab = iCur;.
2790: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
27a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
27b0: 4f 50 5f 53 65 74 43 6f 75 6e 74 73 2c 20 30 2c  OP_SetCounts, 0,
27c0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e   0);.  sqlite3En
27d0: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
27e0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 0a 20  pParse);..  /*. 
27f0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
2800: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
2810: 61 74 20 77 65 72 65 20 64 65 6c 65 74 65 64 2e  at were deleted.
2820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
2830: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
2840: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
2850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2860: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
2870: 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
2880: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
2890: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  s(v, 1);.    sql
28a0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
28b0: 6d 65 28 76 2c 20 30 2c 20 22 72 6f 77 73 20 64  me(v, 0, "rows d
28c0: 65 6c 65 74 65 64 22 2c 20 50 33 5f 53 54 41 54  eleted", P3_STAT
28d0: 49 43 29 3b 0a 20 20 7d 0a 0a 64 65 6c 65 74 65  IC);.  }..delete
28e0: 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20  _from_cleanup:. 
28f0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
2900: 65 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74  extPop(&sContext
2910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
2920: 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 4c 69  istDelete(pTabLi
2930: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2940: 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65 29  prDelete(pWhere)
2950: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
2960: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2970: 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
2980: 20 63 6f 64 65 20 74 68 61 74 20 63 61 75 73 65   code that cause
2990: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
29a0: 66 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 61  f a.** single ta
29b0: 62 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ble to be delete
29c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  d..**.** The VDB
29d0: 45 20 6d 75 73 74 20 62 65 20 69 6e 20 61 20 70  E must be in a p
29e0: 61 72 74 69 63 75 6c 61 72 20 73 74 61 74 65 20  articular state 
29f0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2a00: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  e is called..** 
2a10: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 72 65  These are the re
2a20: 71 75 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  quirements:.**.*
2a30: 2a 20 20 20 31 2e 20 20 41 20 72 65 61 64 2f 77  *   1.  A read/w
2a40: 72 69 74 65 20 63 75 72 73 6f 72 20 70 6f 69 6e  rite cursor poin
2a50: 74 69 6e 67 20 74 6f 20 70 54 61 62 2c 20 74 68  ting to pTab, th
2a60: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
2a70: 6e 67 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20  ng the row.**   
2a80: 20 20 20 20 74 6f 20 62 65 20 64 65 6c 65 74 65      to be delete
2a90: 64 2c 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  d, must be opene
2aa0: 64 20 61 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  d as cursor numb
2ab0: 65 72 20 22 62 61 73 65 22 2e 0a 2a 2a 0a 2a 2a  er "base"..**.**
2ac0: 20 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74     2.  Read/writ
2ad0: 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  e cursors for al
2ae0: 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
2af0: 62 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61  b must be open a
2b00: 73 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f  s.**       curso
2b10: 72 20 6e 75 6d 62 65 72 20 62 61 73 65 2b 69 20  r number base+i 
2b20: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64  for the i-th ind
2b30: 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20  ex..**.**   3.  
2b40: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
2b50: 72 20 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20  r of the row to 
2b60: 62 65 20 64 65 6c 65 74 65 64 20 6d 75 73 74 20  be deleted must 
2b70: 62 65 20 6f 6e 20 74 68 65 20 74 6f 70 0a 2a 2a  be on the top.**
2b80: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 73 74         of the st
2b90: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
2ba0: 72 6f 75 74 69 6e 65 20 70 6f 70 73 20 74 68 65  routine pops the
2bb0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
2bc0: 6b 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  k to remove the 
2bd0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 2a 2a  record number.**
2be0: 20 61 6e 64 20 74 68 65 6e 20 67 65 6e 65 72 61   and then genera
2bf0: 74 65 73 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  tes code to remo
2c00: 76 65 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c  ve both the tabl
2c10: 65 20 72 65 63 6f 72 64 20 61 6e 64 20 61 6c 6c  e record and all
2c20: 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65   index.** entrie
2c30: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
2c40: 74 68 61 74 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  that record..*/.
2c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65  void sqlite3Gene
2c60: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20  rateRowDelete(. 
2c70: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
2c80: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2c90: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2ca0: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  he index */.  Vd
2cb0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
2cc0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2cd0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
2ce0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2cf0: 62 2c 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  b,       /* Tabl
2d00: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2d10: 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74   row to be delet
2d20: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2d30: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ,          /* Cu
2d40: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2d50: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
2d60: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
2d70: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2d80: 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f  he row change co
2d90: 75 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  unter */.){.  in
2da0: 74 20 61 64 64 72 3b 0a 20 20 61 64 64 72 20 3d  t addr;.  addr =
2db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dc0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  p(v, OP_NotExist
2dd0: 73 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 73  s, iCur, 0);.  s
2de0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
2df0: 77 49 6e 64 65 78 44 65 6c 65 74 65 28 64 62 2c  wIndexDelete(db,
2e00: 20 76 2c 20 70 54 61 62 2c 20 69 43 75 72 2c 20   v, pTab, iCur, 
2e10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
2e30: 65 74 65 2c 20 69 43 75 72 2c 0a 20 20 20 20 28  ete, iCur,.    (
2e40: 63 6f 75 6e 74 3f 4f 50 46 4c 41 47 5f 4e 43 48  count?OPFLAG_NCH
2e50: 41 4e 47 45 3a 30 29 20 7c 20 4f 50 46 4c 41 47  ANGE:0) | OPFLAG
2e60: 5f 43 53 43 48 41 4e 47 45 29 3b 0a 20 20 73 71  _CSCHANGE);.  sq
2e70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e80: 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74  2(v, addr, sqlit
2e90: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2ea0: 72 28 76 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(v));.}../*.** 
2eb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2ec0: 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
2ed0: 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
2ee0: 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 61 6c 6c   deletion of all
2ef0: 0a 2a 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65  .** index entrie
2f00: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2f10: 68 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  h a single row o
2f20: 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  f a single table
2f30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
2f40: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 20 70 61   must be in a pa
2f50: 72 74 69 63 75 6c 61 72 20 73 74 61 74 65 20 77  rticular state w
2f60: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2f70: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 54   is called..** T
2f80: 68 65 73 65 20 61 72 65 20 74 68 65 20 72 65 71  hese are the req
2f90: 75 69 72 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a  uirements:.**.**
2fa0: 20 20 20 31 2e 20 20 41 20 72 65 61 64 2f 77 72     1.  A read/wr
2fb0: 69 74 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ite cursor point
2fc0: 69 6e 67 20 74 6f 20 70 54 61 62 2c 20 74 68 65  ing to pTab, the
2fd0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
2fe0: 67 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20  g the row.**    
2ff0: 20 20 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64     to be deleted
3000: 2c 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  , must be opened
3010: 20 61 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65   as cursor numbe
3020: 72 20 22 69 43 75 72 22 2e 0a 2a 2a 0a 2a 2a 20  r "iCur"..**.** 
3030: 20 20 32 2e 20 20 52 65 61 64 2f 77 72 69 74 65    2.  Read/write
3040: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
3050: 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
3060: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 61 73   must be open as
3070: 0a 2a 2a 20 20 20 20 20 20 20 63 75 72 73 6f 72  .**       cursor
3080: 20 6e 75 6d 62 65 72 20 69 43 75 72 2b 69 20 66   number iCur+i f
3090: 6f 72 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  or the i-th inde
30a0: 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 20 54  x..**.**   3.  T
30b0: 68 65 20 22 69 43 75 72 22 20 63 75 72 73 6f 72  he "iCur" cursor
30c0: 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
30d0: 67 20 74 6f 20 74 68 65 20 72 6f 77 20 74 68 61  g to the row tha
30e0: 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 20 20  t is to be.**   
30f0: 20 20 20 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a      deleted..*/.
3100: 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65  void sqlite3Gene
3110: 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65  rateRowIndexDele
3120: 74 65 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  te(.  sqlite *db
3130: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3140: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
3150: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  ing the index */
3160: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3170: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3180: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3190: 20 56 44 42 45 20 2a 2f 0a 20 20 54 61 62 6c 65   VDBE */.  Table
31a0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a   *pTab,       /*
31b0: 20 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   Table containin
31c0: 67 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  g the row to be 
31d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
31e0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
31f0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
3200: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
3210: 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55 73  /.  char *aIdxUs
3220: 65 64 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 64  ed     /* Only d
3230: 65 6c 65 74 65 20 69 66 20 61 49 64 78 55 73 65  elete if aIdxUse
3240: 64 21 3d 30 20 26 26 20 61 49 64 78 55 73 65 64  d!=0 && aIdxUsed
3250: 5b 69 5d 21 3d 30 20 2a 2f 0a 29 7b 0a 20 20 69  [i]!=0 */.){.  i
3260: 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70  nt i;.  Index *p
3270: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 2c  Idx;..  for(i=1,
3280: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
3290: 65 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70  ex; pIdx; i++, p
32a0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
32b0: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
32c0: 20 69 66 28 20 61 49 64 78 55 73 65 64 21 3d 30   if( aIdxUsed!=0
32d0: 20 26 26 20 61 49 64 78 55 73 65 64 5b 69 2d 31   && aIdxUsed[i-1
32e0: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65  .    sqlite3Gene
3300: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
3310: 70 49 64 78 2c 20 69 43 75 72 29 3b 0a 20 20 20  pIdx, iCur);.   
3320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3330: 70 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  p(v, OP_IdxDelet
3340: 65 2c 20 69 43 75 72 2b 69 2c 20 30 29 3b 0a 20  e, iCur+i, 0);. 
3350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
3360: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
3370: 69 6c 6c 20 61 73 73 65 6d 62 6c 65 20 61 6e 20  ill assemble an 
3380: 69 6e 64 65 78 20 6b 65 79 20 61 6e 64 20 70 75  index key and pu
3390: 74 20 69 74 20 6f 6e 20 74 68 65 20 74 6f 70 0a  t it on the top.
33a0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 63 6b 2e 20  ** of the tack. 
33b0: 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 62 65   The key with be
33c0: 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 20   for index pIdx 
33d0: 77 68 69 63 68 20 69 73 20 61 6e 20 69 6e 64 65  which is an inde
33e0: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 20 69 43  x on pTab..** iC
33f0: 75 72 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  ur is the index 
3400: 6f 66 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  of a cursor open
3410: 20 6f 6e 20 74 68 65 20 70 54 61 62 20 74 61 62   on the pTab tab
3420: 6c 65 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67 20  le and pointing 
3430: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20  to.** the entry 
3440: 74 68 61 74 20 6e 65 65 64 73 20 69 6e 64 65 78  that needs index
3450: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
3460: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
3470: 78 4b 65 79 28 0a 20 20 56 64 62 65 20 2a 76 2c  xKey(.  Vdbe *v,
3480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
3490: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
34a0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
34b0: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
34c0: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
34d0: 66 6f 72 20 77 68 69 63 68 20 74 6f 20 67 65 6e  for which to gen
34e0: 65 72 61 74 65 20 61 20 6b 65 79 20 2a 2f 0a 20  erate a key */. 
34f0: 20 69 6e 74 20 69 43 75 72 20 20 20 20 20 20 20   int iCur       
3500: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3510: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 49 64  mber for the pId
3520: 78 2d 3e 70 54 61 62 6c 65 20 74 61 62 6c 65 20  x->pTable table 
3530: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  */.){.  int j;. 
3540: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
3550: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20  Idx->pTable;..  
3560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3570: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 69 43  (v, OP_Recno, iC
3580: 75 72 2c 20 30 29 3b 0a 20 20 66 6f 72 28 6a 3d  ur, 0);.  for(j=
3590: 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
35a0: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  mn; j++){.    in
35b0: 74 20 69 64 78 20 3d 20 70 49 64 78 2d 3e 61 69  t idx = pIdx->ai
35c0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
35d0: 66 28 20 69 64 78 3d 3d 70 54 61 62 2d 3e 69 50  f( idx==pTab->iP
35e0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Key ){.      sql
35f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3600: 20 4f 50 5f 44 75 70 2c 20 6a 2c 20 30 29 3b 0a   OP_Dup, j, 0);.
3610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3630: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
3640: 69 43 75 72 2c 20 69 64 78 29 3b 0a 20 20 20 20  iCur, idx);.    
3650: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
3660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3670: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 64 78 2d  akeIdxKey, pIdx-
3680: 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >nColumn, 0);.  
3690: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
36a0: 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
36b0: 3b 0a 7d 0a                                      ;.}.