/ Hex Artifact Content
Login

Artifact 578e9d07c5b0d07374f85d7f311126cf9c9d6bcf:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0180: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
0190: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01a0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
01b0: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
01c0: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
01d0: 54 72 69 67 67 65 72 53 74 65 70 28 54 72 69 67  TriggerStep(Trig
01e0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
01f0: 72 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65 28  rStep){.  while(
0200: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
0210: 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70  .    TriggerStep
0220: 20 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67 67   * pTmp = pTrigg
0230: 65 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72 69  erStep;.    pTri
0240: 67 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67  ggerStep = pTrig
0250: 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a  gerStep->pNext;.
0260: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 74  .    if( pTmp->t
0270: 61 72 67 65 74 2e 64 79 6e 20 29 20 73 71 6c 69  arget.dyn ) sqli
0280: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
0290: 6d 70 2d 3e 74 61 72 67 65 74 2e 7a 29 3b 0a 20  mp->target.z);. 
02a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
02b0: 65 74 65 28 70 54 6d 70 2d 3e 70 57 68 65 72 65  ete(pTmp->pWhere
02c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
02d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  rListDelete(pTmp
02e0: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
02f0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
0300: 6c 65 74 65 28 70 54 6d 70 2d 3e 70 53 65 6c 65  lete(pTmp->pSele
0310: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  ct);.    sqliteI
0320: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6d 70  dListDelete(pTmp
0330: 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20  ->pIdList);..   
0340: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 6d 70   sqliteFree(pTmp
0350: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0360: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62  This is called b
0370: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
0380: 6e 20 69 74 20 73 65 65 73 20 61 20 43 52 45 41  n it sees a CREA
0390: 54 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65  TE TRIGGER state
03a0: 6d 65 6e 74 2e 20 53 65 65 0a 2a 2a 20 63 6f 6d  ment. See.** com
03b0: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
03c0: 67 20 73 74 72 75 63 74 20 54 72 69 67 67 65 72  g struct Trigger
03d0: 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
03e0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
03f0: 6e 20 6f 66 20 0a 2a 2a 20 68 6f 77 20 74 72 69  n of .** how tri
0400: 67 67 65 72 73 20 61 72 65 20 73 74 6f 72 65 64  ggers are stored
0410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0420: 43 72 65 61 74 65 54 72 69 67 67 65 72 28 0a 20  CreateTrigger(. 
0430: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0440: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
0450: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
0460: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0470: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
0480: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
0490: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f     /* The name o
04a0: 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f  f the trigger */
04b0: 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20 20  .  int tr_tm,   
04c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
04d0: 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f 41   TK_BEFORE, TK_A
04e0: 46 54 45 52 20 2c 20 54 4b 5f 49 4e 53 54 45 41  FTER , TK_INSTEA
04f0: 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  D */.  int op,  
0500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
0510: 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54 2c 20  e of TK_INSERT, 
0520: 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 44 45  TK_UPDATE, TK_DE
0530: 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74  LETE */.  IdList
0540: 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 2f 2a   *pColumns,   /*
0550: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69 66 20   column list if 
0560: 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
0570: 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a 2f 0a  E OF trigger */.
0580: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c    SrcList *pTabl
0590: 65 4e 61 6d 65 2c 2f 2a 20 54 68 65 20 6e 61 6d  eName,/* The nam
05a0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2f 76  e of the table/v
05b0: 69 65 77 20 74 68 65 20 74 72 69 67 67 65 72 20  iew the trigger 
05c0: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
05d0: 69 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20  int foreach,    
05e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
05f0: 5f 52 4f 57 20 6f 72 20 54 4b 5f 53 54 41 54 45  _ROW or TK_STATE
0600: 4d 45 4e 54 20 2a 2f 0a 20 20 45 78 70 72 20 2a  MENT */.  Expr *
0610: 70 57 68 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  pWhen,        /*
0620: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
0630: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
0640: 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54 68 65  StepList, /* The
0650: 20 74 72 69 67 67 65 72 65 64 20 70 72 6f 67 72   triggered progr
0660: 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  am */.  Token *p
0670: 41 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  All             
0680: 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 64 65  /* Token that de
0690: 73 63 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70  scribes the comp
06a0: 6c 65 74 65 20 43 52 45 41 54 45 20 54 52 49 47  lete CREATE TRIG
06b0: 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  GER */.){.  Trig
06c0: 67 65 72 20 2a 6e 74 3b 0a 20 20 54 61 62 6c 65  ger *nt;.  Table
06d0: 20 20 20 2a 74 61 62 3b 0a 20 20 63 68 61 72 20     *tab;.  char 
06e0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *zName = 0;    /
06f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 72  * Name of the tr
0700: 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  igger */.  sqlit
0710: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
0720: 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
0730: 74 68 61 74 3a 20 0a 20 20 2a 2a 20 31 2e 20 74  that: .  ** 1. t
0740: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  he trigger name 
0750: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
0760: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 32 2e 20   exist..  ** 2. 
0770: 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 76 69  the table (or vi
0780: 65 77 29 20 64 6f 65 73 20 65 78 69 73 74 2e 0a  ew) does exist..
0790: 20 20 2a 2a 20 33 2e 20 74 68 61 74 20 77 65 20    ** 3. that we 
07a0: 61 72 65 20 6e 6f 74 20 74 72 79 69 6e 67 20 74  are not trying t
07b0: 6f 20 63 72 65 61 74 65 20 61 20 74 72 69 67 67  o create a trigg
07c0: 65 72 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  er on the sqlite
07d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20  _master table.  
07e0: 2a 2a 20 34 2e 20 54 68 61 74 20 77 65 20 61 72  ** 4. That we ar
07f0: 65 20 6e 6f 74 20 74 72 79 69 6e 67 20 74 6f 20  e not trying to 
0800: 63 72 65 61 74 65 20 61 6e 20 49 4e 53 54 45 41  create an INSTEA
0810: 44 20 4f 46 20 74 72 69 67 67 65 72 20 6f 6e 20  D OF trigger on 
0820: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20 35 2e  a table..  ** 5.
0830: 20 54 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74   That we are not
0840: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74   trying to creat
0850: 65 20 61 20 42 45 46 4f 52 45 20 6f 72 20 41 46  e a BEFORE or AF
0860: 54 45 52 20 74 72 69 67 67 65 72 20 6f 6e 20 61  TER trigger on a
0870: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 69 66   view..  */.  if
0880: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
0890: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 74 72  failed ) goto tr
08a0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
08b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 4e   assert( pTableN
08c0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
08d0: 20 20 74 61 62 20 3d 20 73 71 6c 69 74 65 54 61    tab = sqliteTa
08e0: 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70  bleNameToTable(p
08f0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
0900: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 0a 20  e->a[0].zName,. 
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0930: 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  TableName->a[0].
0940: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
0950: 28 20 21 74 61 62 20 29 7b 0a 20 20 20 20 67 6f  ( !tab ){.    go
0960: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
0970: 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 61  up;.  }.  if( ta
0980: 62 2d 3e 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20  b->iDb>=2 ){.   
0990: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
09a0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
09b0: 67 2c 20 22 74 72 69 67 67 65 72 73 20 6d 61 79  g, "triggers may
09c0: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 74 6f   not be added to
09d0: 20 22 0a 20 20 20 20 20 20 20 22 61 75 78 69 6c   ".       "auxil
09e0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 5c 22  iary database \"
09f0: 22 2c 20 64 62 2d 3e 61 44 62 5b 74 61 62 2d 3e  ", db->aDb[tab->
0a00: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 22  iDb].zName, "\""
0a10: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
0a20: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
0a30: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
0a40: 75 70 3b 0a 20 20 7d 0a 0a 20 20 7a 4e 61 6d 65  up;.  }..  zName
0a50: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
0a60: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
0a70: 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ->n);.  if( sqli
0a80: 74 65 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d  teHashFind(&(db-
0a90: 3e 61 44 62 5b 74 61 62 2d 3e 69 44 62 5d 2e 74  >aDb[tab->iDb].t
0aa0: 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c  rigHash), zName,
0ab0: 70 4e 61 6d 65 2d 3e 6e 2b 31 29 20 29 7b 0a 20  pName->n+1) ){. 
0ac0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
0ad0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
0ae0: 72 4d 73 67 2c 20 22 74 72 69 67 67 65 72 20 22  rMsg, "trigger "
0af0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 70 4e  , -1,.        pN
0b00: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
0b10: 2c 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73  , " already exis
0b20: 74 73 22 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  ts", -1, 0);.   
0b30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
0b40: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
0b50: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
0b60: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
0b70: 43 6d 70 28 74 61 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(tab->zName, 
0b80: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
0b90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
0ba0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
0bb0: 3e 7a 45 72 72 4d 73 67 2c 22 63 61 6e 6e 6f 74  >zErrMsg,"cannot
0bc0: 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72 20   create trigger 
0bd0: 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65 22  on system table"
0be0: 2c 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ,0);.    pParse-
0bf0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
0c00: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
0c10: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 61 62  p;.  }.  if( tab
0c20: 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f  ->pSelect && tr_
0c30: 74 6d 20 21 3d 20 54 4b 5f 49 4e 53 54 45 41 44  tm != TK_INSTEAD
0c40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
0c50: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
0c60: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e  ->zErrMsg, "cann
0c70: 6f 74 20 63 72 65 61 74 65 20 22 2c 20 0a 20 20  ot create ", .  
0c80: 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d 3d 20        (tr_tm == 
0c90: 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45 46 4f  TK_BEFORE)?"BEFO
0ca0: 52 45 22 3a 22 41 46 54 45 52 22 2c 20 22 20 74  RE":"AFTER", " t
0cb0: 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a 20  rigger on view: 
0cc0: 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  ",.        pTabl
0cd0: 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  eName->a[0].zNam
0ce0: 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  e, 0);.    goto 
0cf0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0d00: 0a 20 20 7d 0a 20 20 69 66 28 20 21 74 61 62 2d  .  }.  if( !tab-
0d10: 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74  >pSelect && tr_t
0d20: 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 20  m == TK_INSTEAD 
0d30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
0d40: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
0d50: 3e 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f  >zErrMsg, "canno
0d60: 74 20 63 72 65 61 74 65 20 49 4e 53 54 45 41 44  t create INSTEAD
0d70: 20 4f 46 22 2c 20 0a 20 20 20 20 20 20 20 20 22   OF", .        "
0d80: 20 74 72 69 67 67 65 72 20 6f 6e 20 74 61 62 6c   trigger on tabl
0d90: 65 3a 20 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65  e: ", pTableName
0da0: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[0].zName);. 
0db0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
0dc0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 69 66  cleanup;.  }.#if
0dd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0de0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
0df0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
0e00: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
0e10: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28  TRIGGER;.    if(
0e20: 20 74 61 62 2d 3e 69 44 62 3d 3d 31 20 29 20 63   tab->iDb==1 ) c
0e30: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
0e40: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
0e50: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
0e60: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
0e70: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 74  , code, zName, t
0e80: 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  ab->zName) ){.  
0e90: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
0ea0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
0eb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
0ec0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
0ed0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
0ee0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 74 61 62 2d  CHEMA_TABLE(tab-
0ef0: 3e 69 44 62 29 2c 20 30 29 29 7b 0a 20 20 20 20  >iDb), 0)){.    
0f00: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
0f10: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
0f20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 20 28  }.#endif..  if (
0f30: 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54  tr_tm == TK_INST
0f40: 45 41 44 29 7b 0a 20 20 20 20 74 72 5f 74 6d 20  EAD){.    tr_tm 
0f50: 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 0a 20 20 7d  = TK_BEFORE;.  }
0f60: 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65  ..  /* Build the
0f70: 20 54 72 69 67 67 65 72 20 6f 62 6a 65 63 74 20   Trigger object 
0f80: 2a 2f 0a 20 20 6e 74 20 3d 20 28 54 72 69 67 67  */.  nt = (Trigg
0f90: 65 72 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  er*)sqliteMalloc
0fa0: 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 29  (sizeof(Trigger)
0fb0: 29 3b 0a 20 20 69 66 28 20 6e 74 3d 3d 30 20 29  );.  if( nt==0 )
0fc0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
0fd0: 65 61 6e 75 70 3b 0a 20 20 6e 74 2d 3e 6e 61 6d  eanup;.  nt->nam
0fe0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61  e = zName;.  zNa
0ff0: 6d 65 20 3d 20 30 3b 0a 20 20 6e 74 2d 3e 74 61  me = 0;.  nt->ta
1000: 62 6c 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ble = sqliteStrD
1010: 75 70 28 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  up(pTableName->a
1020: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  [0].zName);.  if
1030: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
1040: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 74 72  failed ) goto tr
1050: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1060: 20 6e 74 2d 3e 69 44 62 20 3d 20 74 61 62 2d 3e   nt->iDb = tab->
1070: 69 44 62 3b 0a 20 20 6e 74 2d 3e 6f 70 20 3d 20  iDb;.  nt->op = 
1080: 6f 70 3b 0a 20 20 6e 74 2d 3e 74 72 5f 74 6d 20  op;.  nt->tr_tm 
1090: 3d 20 74 72 5f 74 6d 3b 0a 20 20 6e 74 2d 3e 70  = tr_tm;.  nt->p
10a0: 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 45 78 70  When = sqliteExp
10b0: 72 44 75 70 28 70 57 68 65 6e 29 3b 0a 20 20 73  rDup(pWhen);.  s
10c0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
10d0: 70 57 68 65 6e 29 3b 0a 20 20 6e 74 2d 3e 70 43  pWhen);.  nt->pC
10e0: 6f 6c 75 6d 6e 73 20 3d 20 73 71 6c 69 74 65 49  olumns = sqliteI
10f0: 64 4c 69 73 74 44 75 70 28 70 43 6f 6c 75 6d 6e  dListDup(pColumn
1100: 73 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69  s);.  sqliteIdLi
1110: 73 74 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d 6e  stDelete(pColumn
1120: 73 29 3b 0a 20 20 6e 74 2d 3e 66 6f 72 65 61 63  s);.  nt->foreac
1130: 68 20 3d 20 66 6f 72 65 61 63 68 3b 0a 20 20 6e  h = foreach;.  n
1140: 74 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 70  t->step_list = p
1150: 53 74 65 70 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  StepList;..  /* 
1160: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
1170: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 61 6e 64 20  itializing, and 
1180: 74 68 69 73 20 74 72 69 67 67 65 72 20 69 73 20  this trigger is 
1190: 6e 6f 74 20 6f 6e 20 61 20 54 45 4d 50 20 74 61  not on a TEMP ta
11a0: 62 6c 65 2c 20 0a 20 20 2a 2a 20 62 75 69 6c 64  ble, .  ** build
11b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
11c0: 65 72 20 65 6e 74 72 79 0a 20 20 2a 2f 0a 20 20  er entry.  */.  
11d0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69  if( !pParse->ini
11e0: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74 61  tFlag ){.    sta
11f0: 74 69 63 20 56 64 62 65 4f 70 20 69 6e 73 65 72  tic VdbeOp inser
1200: 74 54 72 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  tTrig[] = {.    
1210: 20 20 7b 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c    { OP_NewRecno,
1220: 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20     0, 0,  0     
1230: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
1240: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
1250: 2c 20 30 2c 20 20 22 74 72 69 67 67 65 72 22 20  , 0,  "trigger" 
1260: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   },.      { OP_S
1270: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
1280: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20    0          }, 
1290: 20 2f 2a 20 32 3a 20 74 72 69 67 67 65 72 20 6e   /* 2: trigger n
12a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  ame */.      { O
12b0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
12c0: 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20   0,  0          
12d0: 7d 2c 20 20 2f 2a 20 33 3a 20 74 61 62 6c 65 20  },  /* 3: table 
12e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  name */.      { 
12f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 30  OP_Integer,    0
1300: 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20  , 0,  0         
1310: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   },.      { OP_S
1320: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
1330: 20 20 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20    0          }, 
1340: 20 2f 2a 20 35 3a 20 53 51 4c 20 2a 2f 0a 20 20   /* 5: SQL */.  
1350: 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63      { OP_MakeRec
1360: 6f 72 64 2c 20 35 2c 20 30 2c 20 20 30 20 20 20  ord, 5, 0,  0   
1370: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
1380: 7b 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  { OP_PutIntKey, 
1390: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
13a0: 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
13b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 56   int addr;.    V
13c0: 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20  dbe *v;..    /* 
13d0: 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  Make an entry in
13e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
13f0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
1400: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
1410: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1420: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74  f( v==0 ) goto t
1430: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1440: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
1450: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1460: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
1470: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
1480: 72 54 61 62 6c 65 28 76 2c 20 74 61 62 2d 3e 69  rTable(v, tab->i
1490: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  Db);.    addr = 
14a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
14b0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
14c0: 28 69 6e 73 65 72 74 54 72 69 67 29 2c 20 69 6e  (insertTrig), in
14d0: 73 65 72 74 54 72 69 67 29 3b 0a 20 20 20 20 73  sertTrig);.    s
14e0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
14f0: 33 28 76 2c 20 61 64 64 72 2c 20 74 61 62 2d 3e  3(v, addr, tab->
1500: 69 44 62 20 3f 20 54 45 4d 50 5f 4d 41 53 54 45  iDb ? TEMP_MASTE
1510: 52 5f 4e 41 4d 45 20 3a 20 4d 41 53 54 45 52 5f  R_NAME : MASTER_
1520: 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20  NAME,.          
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 33 5f               P3_
1540: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
1550: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
1560: 76 2c 20 61 64 64 72 2b 32 2c 20 6e 74 2d 3e 6e  v, addr+2, nt->n
1570: 61 6d 65 2c 20 30 29 3b 20 0a 20 20 20 20 73 71  ame, 0); .    sq
1580: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
1590: 28 76 2c 20 61 64 64 72 2b 33 2c 20 6e 74 2d 3e  (v, addr+3, nt->
15a0: 74 61 62 6c 65 2c 20 30 29 3b 20 0a 20 20 20 20  table, 0); .    
15b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
15c0: 50 33 28 76 2c 20 61 64 64 72 2b 35 2c 20 70 41  P3(v, addr+5, pA
15d0: 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b  ll->z, pAll->n);
15e0: 0a 20 20 20 20 69 66 28 20 74 61 62 2d 3e 69 44  .    if( tab->iD
15f0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  b==0 ){.      sq
1600: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
1610: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
1620: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1630: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
1640: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1650: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
1660: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
1670: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
1680: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 2f  explain ){.    /
1690: 2a 20 53 74 69 63 6b 20 69 74 20 69 6e 20 74 68  * Stick it in th
16a0: 65 20 68 61 73 68 2d 74 61 62 6c 65 20 2a 2f 0a  e hash-table */.
16b0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
16c0: 73 65 72 74 28 26 28 64 62 2d 3e 61 44 62 5b 6e  sert(&(db->aDb[n
16d0: 74 2d 3e 69 44 62 5d 2e 74 72 69 67 48 61 73 68  t->iDb].trigHash
16e0: 29 2c 20 6e 74 2d 3e 6e 61 6d 65 2c 20 70 4e 61  ), nt->name, pNa
16f0: 6d 65 2d 3e 6e 20 2b 20 31 2c 20 6e 74 29 3b 0a  me->n + 1, nt);.
1700: 0a 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 69  .    /* Attach i
1710: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  t to the table o
1720: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6e 74 2d  bject */.    nt-
1730: 3e 70 4e 65 78 74 20 3d 20 74 61 62 2d 3e 70 54  >pNext = tab->pT
1740: 72 69 67 67 65 72 3b 0a 20 20 20 20 74 61 62 2d  rigger;.    tab-
1750: 3e 70 54 72 69 67 67 65 72 20 3d 20 6e 74 3b 0a  >pTrigger = nt;.
1760: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1770: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  lse{.    sqliteF
1780: 72 65 65 28 6e 74 2d 3e 6e 61 6d 65 29 3b 0a 20  ree(nt->name);. 
1790: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 6e 74     sqliteFree(nt
17a0: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  ->table);.    sq
17b0: 6c 69 74 65 46 72 65 65 28 6e 74 29 3b 0a 20 20  liteFree(nt);.  
17c0: 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  }..trigger_clean
17d0: 75 70 3a 0a 0a 20 20 73 71 6c 69 74 65 46 72 65  up:..  sqliteFre
17e0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  e(zName);.  sqli
17f0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
1800: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 73  pTableName);.  s
1810: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
1820: 65 28 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73  e(pColumns);.  s
1830: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
1840: 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pWhen);.  sqlite
1850: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
1860: 70 28 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a  p(pStepList);.}.
1870: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
1880: 70 79 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 6f 6e  py of all compon
1890: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
18a0: 6e 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  n trigger step. 
18b0: 20 54 68 69 73 20 68 61 73 0a 2a 2a 20 74 68 65   This has.** the
18c0: 20 65 66 66 65 63 74 20 6f 66 20 63 6f 70 79 69   effect of copyi
18d0: 6e 67 20 61 6c 6c 20 45 78 70 72 2e 74 6f 6b 65  ng all Expr.toke
18e0: 6e 2e 7a 20 76 61 6c 75 65 73 20 69 6e 74 6f 20  n.z values into 
18f0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
1900: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
1910: 6c 6c 6f 63 28 29 2e 20 20 41 73 20 69 6e 69 74  lloc().  As init
1920: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 2c 20 74  ially created, t
1930: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
1940: 76 61 6c 75 65 73 0a 2a 2a 20 61 6c 6c 20 70 6f  values.** all po
1950: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
1960: 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73   string that was
1970: 20 66 65 64 20 74 6f 20 74 68 65 20 70 61 72 73   fed to the pars
1980: 65 72 2e 20 20 42 75 74 20 74 68 61 74 0a 2a 2a  er.  But that.**
1990: 20 73 74 72 69 6e 67 20 69 73 20 65 70 68 65 6d   string is ephem
19a0: 65 72 61 6c 20 2d 20 69 74 20 77 69 6c 6c 20 67  eral - it will g
19b0: 6f 20 61 77 61 79 20 61 73 20 73 6f 6f 6e 20 61  o away as soon a
19c0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 65 78 65  s the sqlite_exe
19d0: 63 28 29 0a 2a 2a 20 63 61 6c 6c 20 74 68 61 74  c().** call that
19e0: 20 73 74 61 72 74 65 64 20 74 68 65 20 70 61 72   started the par
19f0: 73 65 72 20 65 78 69 74 73 2e 20 20 54 68 69 73  ser exits.  This
1a00: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61   routine makes a
1a10: 20 70 65 72 73 69 73 74 65 6e 74 0a 2a 2a 20 63   persistent.** c
1a20: 6f 70 79 20 6f 66 20 61 6c 6c 20 74 68 65 20 45  opy of all the E
1a30: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 73 74 72 69  xpr.token.z stri
1a40: 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ngs so that the 
1a50: 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72 75  TriggerStep stru
1a60: 63 74 75 72 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  cture.** will be
1a70: 20 76 61 6c 69 64 20 65 76 65 6e 20 61 66 74 65   valid even afte
1a80: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 65 78 65  r the sqlite_exe
1a90: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
1aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ab0: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
1ac0: 69 67 67 65 72 53 74 65 70 28 54 72 69 67 67 65  iggerStep(Trigge
1ad0: 72 53 74 65 70 20 2a 70 29 7b 0a 20 20 69 66 28  rStep *p){.  if(
1ae0: 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20 29 7b 0a   p->target.z ){.
1af0: 20 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20      p->target.z 
1b00: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
1b10: 70 2d 3e 74 61 72 67 65 74 2e 7a 2c 20 70 2d 3e  p->target.z, p->
1b20: 74 61 72 67 65 74 2e 6e 29 3b 0a 20 20 20 20 70  target.n);.    p
1b30: 2d 3e 74 61 72 67 65 74 2e 64 79 6e 20 3d 20 31  ->target.dyn = 1
1b40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1b50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 53 65  Select ){.    Se
1b60: 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  lect *pNew = sql
1b70: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  iteSelectDup(p->
1b80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1b90: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
1ba0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
1bb0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70    p->pSelect = p
1bc0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
1bd0: 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1be0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
1bf0: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 57  iteExprDup(p->pW
1c00: 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
1c10: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
1c20: 57 68 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Where);.    p->p
1c30: 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
1c40: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72  }.  if( p->pExpr
1c50: 4c 69 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72  List ){.    Expr
1c60: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  List *pNew = sql
1c70: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
1c80: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
1c90: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
1ca0: 44 65 6c 65 74 65 28 70 2d 3e 70 45 78 70 72 4c  Delete(p->pExprL
1cb0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 78  ist);.    p->pEx
1cc0: 70 72 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  prList = pNew;. 
1cd0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 4c   }.  if( p->pIdL
1ce0: 69 73 74 20 29 7b 0a 20 20 20 20 49 64 4c 69 73  ist ){.    IdLis
1cf0: 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  t *pNew = sqlite
1d00: 49 64 4c 69 73 74 44 75 70 28 70 2d 3e 70 49 64  IdListDup(p->pId
1d10: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
1d20: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  eIdListDelete(p-
1d30: 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 70  >pIdList);.    p
1d40: 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 4e 65 77  ->pIdList = pNew
1d50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1d60: 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  urn a SELECT sta
1d70: 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74 68 65  tement (that the
1d80: 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74   pSelect paramet
1d90: 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20 69 6e  er points to) in
1da0: 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65 72 20  to.** a trigger 
1db0: 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20 61 20  step.  Return a 
1dc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69  pointer to a Tri
1dd0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
1de0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  re..**.** The pa
1df0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
1e00: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
1e10: 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54 20 73  finds a SELECT s
1e20: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
1e30: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
1e40: 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  .  .*/.TriggerSt
1e50: 65 70 20 2a 73 71 6c 69 74 65 54 72 69 67 67 65  ep *sqliteTrigge
1e60: 72 53 65 6c 65 63 74 53 74 65 70 28 53 65 6c 65  rSelectStep(Sele
1e70: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
1e80: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
1e90: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
1ea0: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
1eb0: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
1ec0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
1ed0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
1ee0: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
1ef0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1f00: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
1f10: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
1f20: 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ect;.  pTriggerS
1f30: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45  tep->orconf = OE
1f40: 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69  _Default;.  sqli
1f50: 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72  tePersistTrigger
1f60: 53 74 65 70 28 70 54 72 69 67 67 65 72 53 74 65  Step(pTriggerSte
1f70: 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54  p);..  return pT
1f80: 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f  riggerStep;.}../
1f90: 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74 72 69  *.** Build a tri
1fa0: 67 67 65 72 20 73 74 65 70 20 6f 75 74 20 6f 66  gger step out of
1fb0: 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65   an INSERT state
1fc0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
1fd0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1fe0: 65 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 74  e new trigger st
1ff0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ep..**.** The pa
2000: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
2010: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
2020: 73 65 65 73 20 61 6e 20 49 4e 53 45 52 54 20 69  sees an INSERT i
2030: 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20 62 6f 64  nside the.** bod
2040: 79 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e 0a  y of a trigger..
2050: 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  */.TriggerStep *
2060: 73 71 6c 69 74 65 54 72 69 67 67 65 72 49 6e 73  sqliteTriggerIns
2070: 65 72 74 53 74 65 70 28 0a 20 20 54 6f 6b 65 6e  ertStep(.  Token
2080: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f   *pTableName,  /
2090: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
20a0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
20b0: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64  e insert */.  Id
20c0: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20  List *pColumn,  
20d0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
20e0: 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61  umns in pTableNa
20f0: 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  me to insert int
2100: 6f 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  o */.  ExprList 
2110: 2a 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68  *pEList,   /* Th
2120: 65 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20  e VALUE clause: 
2130: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
2140: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
2150: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
2160: 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45  lect,    /* A SE
2170: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
2180: 68 61 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c  hat supplies val
2190: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  ues */.  int orc
21a0: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  onf          /* 
21b0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
21c0: 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74  orithm (OE_Abort
21d0: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74  , OE_Replace, et
21e0: 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  c.) */.){.  Trig
21f0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
2200: 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 4d 61  rStep = sqliteMa
2210: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67  lloc(sizeof(Trig
2220: 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28  gerStep));.  if(
2230: 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30   pTriggerStep==0
2240: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2250: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 3d 3d  assert(pEList ==
2260: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 3d 3d   0 || pSelect ==
2270: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 45   0);.  assert(pE
2280: 4c 69 73 74 20 21 3d 20 30 20 7c 7c 20 70 53 65  List != 0 || pSe
2290: 6c 65 63 74 20 21 3d 20 30 29 3b 0a 0a 20 20 70  lect != 0);..  p
22a0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20  TriggerStep->op 
22b0: 3d 20 54 4b 5f 49 4e 53 45 52 54 3b 0a 20 20 70  = TK_INSERT;.  p
22c0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
22d0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
22e0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
22f0: 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62 6c  target  = *pTabl
2300: 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67 65  eName;.  pTrigge
2310: 72 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 20 3d  rStep->pIdList =
2320: 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 72 69   pColumn;.  pTri
2330: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
2340: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
2350: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72  pTriggerStep->or
2360: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20  conf = orconf;. 
2370: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
2380: 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67  iggerStep(pTrigg
2390: 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75  erStep);..  retu
23a0: 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b  rn pTriggerStep;
23b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
23c0: 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73 74  uct a trigger st
23d0: 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ep that implemen
23e0: 74 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ts an UPDATE sta
23f0: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
2400: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2410: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
2420: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
2430: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2440: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
2450: 65 65 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  ees an UPDATE st
2460: 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74  atement inside t
2470: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45  he body of a CRE
2480: 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a  ATE TRIGGER..*/.
2490: 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c  TriggerStep *sql
24a0: 69 74 65 54 72 69 67 67 65 72 55 70 64 61 74 65  iteTriggerUpdate
24b0: 53 74 65 70 28 0a 20 20 54 6f 6b 65 6e 20 2a 70  Step(.  Token *p
24c0: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
24d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
24e0: 65 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  e to be updated 
24f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2500: 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65  EList,    /* The
2510: 20 53 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73   SET clause: lis
2520: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  t of column and 
2530: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
2540: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2550: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2560: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
2570: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
2580: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
2590: 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f  ct algorithm. (O
25a0: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
25b0: 72 65 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20  re, etc) */.){. 
25c0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
25d0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
25e0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
25f0: 28 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a  (TriggerStep));.
2600: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
2610: 65 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ep==0 ) return 0
2620: 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  ;..  pTriggerSte
2630: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 44 41 54  p->op = TK_UPDAT
2640: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
2650: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
2660: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
2670: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
2680: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
2690: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
26a0: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
26b0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
26c0: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
26d0: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
26e0: 72 69 67 67 65 72 53 74 65 70 28 70 54 72 69 67  riggerStep(pTrig
26f0: 67 65 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74  gerStep);..  ret
2700: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
2710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
2720: 72 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73  ruct a trigger s
2730: 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  tep that impleme
2740: 6e 74 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  nts a DELETE sta
2750: 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  tement and retur
2760: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2770: 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20 73  o that trigger s
2780: 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65 72  tep.  The parser
2790: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
27a0: 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73  ine when it.** s
27b0: 65 65 73 20 61 20 44 45 4c 45 54 45 20 73 74 61  ees a DELETE sta
27c0: 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68  tement inside th
27d0: 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41  e body of a CREA
27e0: 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54  TE TRIGGER..*/.T
27f0: 72 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69  riggerStep *sqli
2800: 74 65 54 72 69 67 67 65 72 44 65 6c 65 74 65 53  teTriggerDeleteS
2810: 74 65 70 28 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  tep(Token *pTabl
2820: 65 4e 61 6d 65 2c 20 45 78 70 72 20 2a 70 57 68  eName, Expr *pWh
2830: 65 72 65 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ere){.  TriggerS
2840: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2850: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
2860: 28 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53  (sizeof(TriggerS
2870: 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72  tep));.  if( pTr
2880: 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29 20 72  iggerStep==0 ) r
2890: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54 72 69  eturn 0;..  pTri
28a0: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54  ggerStep->op = T
28b0: 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 70 54 72 69  K_DELETE;.  pTri
28c0: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
28d0: 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b    = *pTableName;
28e0: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
28f0: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
2900: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
2910: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65  ->orconf = OE_De
2920: 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69 74 65 50  fault;.  sqliteP
2930: 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74 65  ersistTriggerSte
2940: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  p(pTriggerStep);
2950: 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ..  return pTrig
2960: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a  gerStep;.}../* .
2970: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
2980: 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20  elete a Trigger 
2990: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69  structure.*/.voi
29a0: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 72  d sqliteDeleteTr
29b0: 69 67 67 65 72 28 54 72 69 67 67 65 72 20 2a 70  igger(Trigger *p
29c0: 54 72 69 67 67 65 72 29 7b 0a 20 20 73 71 6c 69  Trigger){.  sqli
29d0: 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  teDeleteTriggerS
29e0: 74 65 70 28 70 54 72 69 67 67 65 72 2d 3e 73 74  tep(pTrigger->st
29f0: 65 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ep_list);.  sqli
2a00: 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72 2d  teFree(pTrigger-
2a10: 3e 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  >name);.  sqlite
2a20: 46 72 65 65 28 70 54 72 69 67 67 65 72 2d 3e 74  Free(pTrigger->t
2a30: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  able);.  sqliteE
2a40: 78 70 72 44 65 6c 65 74 65 28 70 54 72 69 67 67  xprDelete(pTrigg
2a50: 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71  er->pWhen);.  sq
2a60: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
2a70: 28 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75  (pTrigger->pColu
2a80: 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  mns);.  sqliteFr
2a90: 65 65 28 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a  ee(pTrigger);.}.
2aa0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e 63  ./*. * This func
2ab0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2ac0: 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72  o drop a trigger
2ad0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2ae0: 73 65 20 73 63 68 65 6d 61 2e 20 0a 20 2a 0a 20  se schema. . *. 
2af0: 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61  * This may be ca
2b00: 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72  lled directly fr
2b10: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2c 20 6f  om the parser, o
2b20: 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 0a 20  r from within . 
2b30: 2a 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c  * sqliteDropTabl
2b40: 65 28 29 2e 20 49 6e 20 74 68 65 20 6c 61 74 74  e(). In the latt
2b50: 65 72 20 63 61 73 65 20 74 68 65 20 22 6e 65 73  er case the "nes
2b60: 74 65 64 22 20 61 72 67 75 6d 65 6e 74 20 69 73  ted" argument is
2b70: 20 74 72 75 65 2e 0a 20 2a 0a 20 2a 20 4e 6f 74   true.. *. * Not
2b80: 65 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  e that this func
2b90: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 64 65  tion does not de
2ba0: 6c 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72  lete the trigger
2bb0: 20 65 6e 74 69 72 65 6c 79 2e 20 49 6e 73 74 65   entirely. Inste
2bc0: 61 64 20 69 74 0a 20 2a 20 72 65 6d 6f 76 65 73  ad it. * removes
2bd0: 20 69 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 74   it from the int
2be0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
2bf0: 20 70 6c 61 63 65 73 20 69 74 20 69 6e 20 74 68   places it in th
2c00: 65 20 74 72 69 67 44 72 6f 70 20 68 61 73 68 20  e trigDrop hash 
2c10: 0a 20 2a 20 74 61 62 6c 65 2e 20 54 68 69 73 20  . * table. This 
2c20: 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  is so that the t
2c30: 72 69 67 67 65 72 20 63 61 6e 20 62 65 20 72 65  rigger can be re
2c40: 73 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  stored into the 
2c50: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 0a  database schema.
2c60: 20 2a 20 69 66 20 74 68 65 20 74 72 61 6e 73 61   * if the transa
2c70: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2c80: 62 61 63 6b 2e 0a 20 2a 2f 0a 76 6f 69 64 20 73  back.. */.void s
2c90: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
2ca0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2cb0: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
2cc0: 69 6e 74 20 6e 65 73 74 65 64 29 7b 0a 20 20 54  int nested){.  T
2cd0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
2ce0: 3b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61  ;.  Table   *pTa
2cf0: 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ble;.  Vdbe *v;.
2d00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
2d10: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
2d20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2d30: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
2d40: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
2d50: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
2d60: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
2d70: 69 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70  iled ) goto drop
2d80: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
2d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
2da0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
2db0: 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30  zDb = pName->a[0
2dc0: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a  ].zDatabase;.  z
2dd0: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b  Name = pName->a[
2de0: 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d  0].zName;.  nNam
2df0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
2e00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2e10: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2e20: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
2e30: 6c 69 74 65 53 74 72 49 43 6d 70 28 64 62 2d 3e  liteStrICmp(db->
2e40: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  aDb[i].zName, zD
2e50: 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  b) ) continue;. 
2e60: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
2e70: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 28 64  liteHashFind(&(d
2e80: 62 2d 3e 61 44 62 5b 69 5d 2e 74 72 69 67 48 61  b->aDb[i].trigHa
2e90: 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  sh), zName, nNam
2ea0: 65 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 54  e+1);.    if( pT
2eb0: 72 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a  rigger ) break;.
2ec0: 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67    }.  if( !pTrig
2ed0: 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ger ){.    sqlit
2ee0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
2ef0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
2f00: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 22   such trigger: "
2f10: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
2f20: 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67   goto drop_trigg
2f30: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
2f40: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
2f50: 65 72 2d 3e 69 44 62 3e 3d 30 20 26 26 20 70 54  er->iDb>=0 && pT
2f60: 72 69 67 67 65 72 2d 3e 69 44 62 3c 64 62 2d 3e  rigger->iDb<db->
2f70: 6e 44 62 20 29 3b 0a 20 20 69 66 28 20 70 54 72  nDb );.  if( pTr
2f80: 69 67 67 65 72 2d 3e 69 44 62 3e 3d 32 20 29 7b  igger->iDb>=2 ){
2f90: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
2fa0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
2fb0: 72 72 4d 73 67 2c 20 22 74 72 69 67 67 65 72 73  rrMsg, "triggers
2fc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 72 65 6d 6f   may not be remo
2fd0: 76 65 64 20 66 72 6f 6d 20 22 0a 20 20 20 20 20  ved from ".     
2fe0: 20 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74    "auxiliary dat
2ff0: 61 62 61 73 65 20 5c 22 22 2c 20 64 62 2d 3e 61  abase \"", db->a
3000: 44 62 5b 70 54 72 69 67 67 65 72 2d 3e 69 44 62  Db[pTrigger->iDb
3010: 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 30  ].zName, "\"", 0
3020: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
3030: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
3040: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
3050: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 54 61 62  anup;.  }.  pTab
3060: 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  le = sqliteFindT
3070: 61 62 6c 65 28 64 62 2c 20 70 54 72 69 67 67 65  able(db, pTrigge
3080: 72 2d 3e 74 61 62 6c 65 2c 20 64 62 2d 3e 61 44  r->table, db->aD
3090: 62 5b 70 54 72 69 67 67 65 72 2d 3e 69 44 62 5d  b[pTrigger->iDb]
30a0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72  .zName);.  asser
30b0: 74 28 70 54 61 62 6c 65 29 3b 0a 20 20 61 73 73  t(pTable);.  ass
30c0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62  ert( pTable->iDb
30d0: 3d 3d 70 54 72 69 67 67 65 72 2d 3e 69 44 62 20  ==pTrigger->iDb 
30e0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30f0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
3100: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
3110: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
3120: 52 4f 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  ROP_TRIGGER;.   
3130: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
3140: 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
3150: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
3160: 45 52 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ER;.    if( sqli
3170: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
3180: 73 65 2c 20 63 6f 64 65 2c 20 70 54 72 69 67 67  se, code, pTrigg
3190: 65 72 2d 3e 6e 61 6d 65 2c 20 70 54 61 62 6c 65  er->name, pTable
31a0: 2d 3e 7a 4e 61 6d 65 29 20 7c 7c 0a 20 20 20 20  ->zName) ||.    
31b0: 20 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63    sqliteAuthChec
31c0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
31d0: 5f 44 45 4c 45 54 45 2c 20 53 43 48 45 4d 41 5f  _DELETE, SCHEMA_
31e0: 54 41 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44  TABLE(pTable->iD
31f0: 62 29 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 72  b),0) ){.      r
3200: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
3210: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
3220: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
3230: 74 20 61 6e 20 22 65 78 70 6c 61 69 6e 22 2c 20  t an "explain", 
3240: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
3250: 74 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72  trigger structur
3260: 65 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21  e..   */.  if( !
3270: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
3280: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  ){.    if( pTabl
3290: 65 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70  e->pTrigger == p
32a0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
32b0: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
32c0: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
32d0: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
32e0: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 63        Trigger *c
32f0: 63 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  c = pTable->pTri
3300: 67 67 65 72 3b 0a 20 20 20 20 20 20 77 68 69 6c  gger;.      whil
3310: 65 28 20 63 63 20 29 7b 20 0a 20 20 20 20 20 20  e( cc ){ .      
3320: 20 20 69 66 28 20 63 63 2d 3e 70 4e 65 78 74 20    if( cc->pNext 
3330: 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  == pTrigger ){. 
3340: 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e 65           cc->pNe
3350: 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d 3e  xt = cc->pNext->
3360: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
3370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3380: 7d 0a 20 20 20 20 20 20 20 20 63 63 20 3d 20 63  }.        cc = c
3390: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  c->pNext;.      
33a0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 63  }.      assert(c
33b0: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  c);.    }.    sq
33c0: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
33d0: 28 64 62 2d 3e 61 44 62 5b 70 54 72 69 67 67 65  (db->aDb[pTrigge
33e0: 72 2d 3e 69 44 62 5d 2e 74 72 69 67 48 61 73 68  r->iDb].trigHash
33f0: 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  ), zName, nName+
3400: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
3410: 65 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70  eDeleteTrigger(p
3420: 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  Trigger);.  }.. 
3430: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
3440: 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 68 65  e to destroy the
3450: 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 72 64   database record
3460: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 2e   of the trigger.
3470: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
3480: 6c 65 21 3d 30 20 26 26 20 21 6e 65 73 74 65 64  le!=0 && !nested
3490: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 47   && (v = sqliteG
34a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
34b0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 61  =0 ){.    int ba
34c0: 73 65 3b 0a 20 20 20 20 73 74 61 74 69 63 20 56  se;.    static V
34d0: 64 62 65 4f 70 20 64 72 6f 70 54 72 69 67 67 65  dbeOp dropTrigge
34e0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  r[] = {.      { 
34f0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
3500: 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a  , ADDR(8),  0},.
3510: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
3520: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
3530: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
3540: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74        { OP_MemSt
3550: 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20  ore,   1, 1,    
3560: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3570: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
3580: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
3590: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
35a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
35b0: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 1,        0},.
35c0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
35d0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37         0, ADDR(7
35e0: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
35f0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
3600: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
3610: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
3620: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
3630: 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a  ),  0}, /* 7 */.
3640: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73 71 6c 69      };..    sqli
3650: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
3660: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3670: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f   0);.    sqliteO
3680: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
3690: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
36a0: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
36b0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
36c0: 2c 20 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  ,  ArraySize(dro
36d0: 70 54 72 69 67 67 65 72 29 2c 20 64 72 6f 70 54  pTrigger), dropT
36e0: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  rigger);.    sql
36f0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
3700: 76 2c 20 62 61 73 65 2b 31 2c 20 7a 4e 61 6d 65  v, base+1, zName
3710: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
3720: 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a  able->iDb==0 ){.
3730: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
3740: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
3750: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3760: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3770: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
3780: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
3790: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
37a0: 65 29 3b 0a 20 20 7d 0a 0a 64 72 6f 70 5f 74 72  e);.  }..drop_tr
37b0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20  igger_cleanup:. 
37c0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
37d0: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
37e0: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20  /*.** pEList is 
37f0: 74 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f  the SET clause o
3800: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
3810: 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74  ement.  Each ent
3820: 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  ry.** in pEList 
3830: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74  is of the format
3840: 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49   <id>=<expr>.  I
3850: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74  f any of the ent
3860: 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ries.** in pELis
3870: 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77  t have an <id> w
3880: 68 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20  hich matches an 
3890: 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49  identifier in pI
38a0: 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  dList,.** then r
38b0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
38c0: 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74  pIdList==NULL, t
38d0: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64  hen it is consid
38e0: 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61  ered a.** wildca
38f0: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rd that matches 
3900: 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77  anything.  Likew
3910: 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e  ise if pEList==N
3920: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d  ULL then.** it m
3930: 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20  atches anything 
3940: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
3950: 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66   true.  Return f
3960: 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alse only.** if 
3970: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
3980: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
3990: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
39a0: 4c 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c  Lap(IdList *pIdL
39b0: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ist, ExprList *p
39c0: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b  EList){.  int e;
39d0: 0a 20 20 69 66 28 20 21 70 49 64 4c 69 73 74 20  .  if( !pIdList 
39e0: 7c 7c 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  || !pEList ) ret
39f0: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30  urn 1;.  for(e=0
3a00: 3b 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; e<pEList->nExp
3a10: 72 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; e++){.    if(
3a20: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64   sqliteIdListInd
3a30: 65 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69  ex(pIdList, pELi
3a40: 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e  st->a[e].zName)>
3a50: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
3a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a   }.  return 0; .
3a70: 7d 0a 0a 2f 2a 20 41 20 67 6c 6f 62 61 6c 20 76  }../* A global v
3a80: 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
3a90: 54 52 55 45 20 69 66 20 77 65 20 73 68 6f 75 6c  TRUE if we shoul
3aa0: 64 20 61 6c 77 61 79 73 20 73 65 74 20 75 70 20  d always set up 
3ab0: 74 65 6d 70 20 74 61 62 6c 65 73 20 66 6f 72 0a  temp tables for.
3ac0: 20 2a 20 66 6f 72 20 74 72 69 67 67 65 72 73 2c   * for triggers,
3ad0: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
3ae0: 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20 74  re no triggers t
3af0: 6f 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  o code. This is 
3b00: 75 73 65 64 20 74 6f 20 74 65 73 74 20 0a 20 2a  used to test . *
3b10: 20 68 6f 77 20 6d 75 63 68 20 6f 76 65 72 68 65   how much overhe
3b20: 61 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  ad the triggers 
3b30: 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 63 61 75  algorithm is cau
3b40: 73 69 6e 67 2e 0a 20 2a 0a 20 2a 20 54 68 69 73  sing.. *. * This
3b50: 20 66 6c 61 67 20 63 61 6e 20 62 65 20 73 65 74   flag can be set
3b60: 20 6f 72 20 63 6c 65 61 72 65 64 20 75 73 69 6e   or cleared usin
3b70: 67 20 74 68 65 20 22 74 72 69 67 67 65 72 5f 6f  g the "trigger_o
3b80: 76 65 72 68 65 61 64 5f 74 65 73 74 22 20 70 72  verhead_test" pr
3b90: 61 67 6d 61 2e 0a 20 2a 20 54 68 65 20 70 72 61  agma.. * The pra
3ba0: 67 6d 61 20 69 73 20 6e 6f 74 20 64 6f 63 75 6d  gma is not docum
3bb0: 65 6e 74 65 64 20 73 69 6e 63 65 20 69 74 20 69  ented since it i
3bc0: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 70 61 72  s not really par
3bd0: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 66 61  t of the interfa
3be0: 63 65 0a 20 2a 20 74 6f 20 53 51 4c 69 74 65 2c  ce. * to SQLite,
3bf0: 20 6a 75 73 74 20 74 68 65 20 74 65 73 74 20 70   just the test p
3c00: 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74  rocedure..*/.int
3c10: 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
3c20: 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a  gger_setup = 0;.
3c30: 0a 2f 2a 0a 20 2a 20 52 65 74 75 72 6e 73 20 74  ./*. * Returns t
3c40: 72 75 65 20 69 66 20 61 20 74 72 69 67 67 65 72  rue if a trigger
3c50: 20 6d 61 74 63 68 69 6e 67 20 6f 70 2c 20 74 72   matching op, tr
3c60: 5f 74 6d 20 61 6e 64 20 66 6f 72 65 61 63 68 20  _tm and foreach 
3c70: 74 68 61 74 20 69 73 20 4e 4f 54 20 61 6c 72 65  that is NOT alre
3c80: 61 64 79 0a 20 2a 20 6f 6e 20 74 68 65 20 50 61  ady. * on the Pa
3c90: 72 73 65 20 6f 62 6a 65 63 74 73 20 74 72 69 67  rse objects trig
3ca0: 67 65 72 2d 73 74 61 63 6b 20 28 74 6f 20 70 72  ger-stack (to pr
3cb0: 65 76 65 6e 74 20 72 65 63 75 72 73 69 76 65 20  event recursive 
3cc0: 74 72 69 67 67 65 72 20 66 69 72 69 6e 67 29 20  trigger firing) 
3cd0: 69 73 0a 20 2a 20 66 6f 75 6e 64 20 69 6e 20 74  is. * found in t
3ce0: 68 65 20 6c 69 73 74 20 73 70 65 63 69 66 69 65  he list specifie
3cf0: 64 20 61 73 20 70 54 72 69 67 67 65 72 2e 0a 20  d as pTrigger.. 
3d00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 54 72 69  */.int sqliteTri
3d10: 67 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61  ggersExist(.  Pa
3d20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3d30: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
3d40: 20 63 68 65 63 6b 20 66 6f 72 20 72 65 63 75 72   check for recur
3d50: 73 69 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f  sive triggers */
3d60: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
3d70: 67 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 41 20  gger,      /* A 
3d80: 6c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  list of triggers
3d90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3da0: 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e   a table */.  in
3db0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3dc0: 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20        /* one of 
3dd0: 54 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e  TK_DELETE, TK_IN
3de0: 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20  SERT, TK_UPDATE 
3df0: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e10: 6f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  one of TK_BEFORE
3e20: 2c 20 54 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20  , TK_AFTER */.  
3e30: 69 6e 74 20 66 6f 72 65 61 63 68 2c 20 20 20 20  int foreach,    
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f          /* one o
3e50: 66 20 54 4b 5f 52 4f 57 20 6f 72 20 54 4b 5f 53  f TK_ROW or TK_S
3e60: 54 41 54 45 4d 45 4e 54 20 2a 2f 0a 20 20 45 78  TATEMENT */.  Ex
3e70: 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73  prList *pChanges
3e80: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
3e90: 20 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20   that change in 
3ea0: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
3eb0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  ent */.){.  Trig
3ec0: 67 65 72 20 2a 20 70 54 72 69 67 67 65 72 43 75  ger * pTriggerCu
3ed0: 72 73 6f 72 3b 0a 0a 20 20 69 66 28 20 61 6c 77  rsor;..  if( alw
3ee0: 61 79 73 5f 63 6f 64 65 5f 74 72 69 67 67 65 72  ays_code_trigger
3ef0: 5f 73 65 74 75 70 20 29 7b 0a 20 20 20 20 72 65  _setup ){.    re
3f00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 70  turn 1;.  }..  p
3f10: 54 72 69 67 67 65 72 43 75 72 73 6f 72 20 3d 20  TriggerCursor = 
3f20: 70 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c  pTrigger;.  whil
3f30: 65 28 20 70 54 72 69 67 67 65 72 43 75 72 73 6f  e( pTriggerCurso
3f40: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72  r ){.    if( pTr
3f50: 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 6f 70 20  iggerCursor->op 
3f60: 3d 3d 20 6f 70 20 26 26 20 0a 09 70 54 72 69 67  == op && ..pTrig
3f70: 67 65 72 43 75 72 73 6f 72 2d 3e 74 72 5f 74 6d  gerCursor->tr_tm
3f80: 20 3d 3d 20 74 72 5f 74 6d 20 26 26 20 0a 09 70   == tr_tm && ..p
3f90: 54 72 69 67 67 65 72 43 75 72 73 6f 72 2d 3e 66  TriggerCursor->f
3fa0: 6f 72 65 61 63 68 20 3d 3d 20 66 6f 72 65 61 63  oreach == foreac
3fb0: 68 20 26 26 0a 09 63 68 65 63 6b 43 6f 6c 75 6d  h &&..checkColum
3fc0: 6e 4f 76 65 72 4c 61 70 28 70 54 72 69 67 67 65  nOverLap(pTrigge
3fd0: 72 43 75 72 73 6f 72 2d 3e 70 43 6f 6c 75 6d 6e  rCursor->pColumn
3fe0: 73 2c 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a  s, pChanges) ){.
3ff0: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
4000: 63 6b 20 2a 20 73 73 3b 0a 20 20 20 20 20 20 73  ck * ss;.      s
4010: 73 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  s = pParse->trig
4020: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 77 68 69  Stack;.      whi
4030: 6c 65 28 20 73 73 20 26 26 20 73 73 2d 3e 70 54  le( ss && ss->pT
4040: 72 69 67 67 65 72 20 21 3d 20 70 54 72 69 67 67  rigger != pTrigg
4050: 65 72 20 29 7b 0a 09 73 73 20 3d 20 73 73 2d 3e  er ){..ss = ss->
4060: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
4070: 20 20 20 20 20 69 66 28 20 21 73 73 20 29 72 65       if( !ss )re
4080: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4090: 20 20 70 54 72 69 67 67 65 72 43 75 72 73 6f 72    pTriggerCursor
40a0: 20 3d 20 70 54 72 69 67 67 65 72 43 75 72 73 6f   = pTriggerCurso
40b0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  r->pNext;.  }.. 
40c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
40d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
40e0: 45 20 63 6f 64 65 20 66 6f 72 20 7a 65 72 6f 20  E code for zero 
40f0: 6f 72 20 6d 6f 72 65 20 73 74 61 74 65 6d 65 6e  or more statemen
4100: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f  ts inside the bo
4110: 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69 67 67  dy of a.** trigg
4120: 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  er.  .*/.static 
4130: 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65 72 50  int codeTriggerP
4140: 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20  rogram(.  Parse 
4150: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4160: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
4170: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4180: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
4190: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74  pList,   /* List
41a0: 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69   of statements i
41b0: 6e 73 69 64 65 20 74 68 65 20 74 72 69 67 67 65  nside the trigge
41c0: 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20  r body */.  int 
41d0: 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20 20 20 20  orconfin        
41e0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
41f0: 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45  t algorithm. (OE
4200: 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20  _Abort, etc) */ 
4210: 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74   .){.  TriggerSt
4220: 65 70 20 2a 20 70 54 72 69 67 67 65 72 53 74 65  ep * pTriggerSte
4230: 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  p = pStepList;. 
4240: 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 0a 20 20   int orconf;..  
4250: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53  while( pTriggerS
4260: 74 65 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  tep ){.    int s
4270: 61 76 65 4e 54 61 62 20 3d 20 70 50 61 72 73 65  aveNTab = pParse
4280: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 6f 72 63 6f  ->nTab;.    orco
4290: 6e 66 20 3d 20 28 6f 72 63 6f 6e 66 69 6e 20 3d  nf = (orconfin =
42a0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 54  = OE_Default)?pT
42b0: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f  riggerStep->orco
42c0: 6e 66 3a 6f 72 63 6f 6e 66 69 6e 3b 0a 20 20 20  nf:orconfin;.   
42d0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
42e0: 63 6b 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63  ck->orconf = orc
42f0: 6f 6e 66 3b 0a 20 20 20 20 73 77 69 74 63 68 28  onf;.    switch(
4300: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
4310: 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  p ){.      case 
4320: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 09 53 65  TK_SELECT: {..Se
4330: 6c 65 63 74 20 2a 20 73 73 20 3d 20 73 71 6c 69  lect * ss = sqli
4340: 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 72 69  teSelectDup(pTri
4350: 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63  ggerStep->pSelec
4360: 74 29 3b 09 09 20 20 0a 09 61 73 73 65 72 74 28  t);..  ..assert(
4370: 73 73 29 3b 0a 09 61 73 73 65 72 74 28 73 73 2d  ss);..assert(ss-
4380: 3e 70 53 72 63 29 3b 0a 09 73 71 6c 69 74 65 53  >pSrc);..sqliteS
4390: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 73 73  elect(pParse, ss
43a0: 2c 20 53 52 54 5f 44 69 73 63 61 72 64 2c 20 30  , SRT_Discard, 0
43b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 09 73 71 6c  , 0, 0, 0);..sql
43c0: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
43d0: 73 73 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ss);..break;.   
43e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43f0: 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20 20  TK_UPDATE: {.   
4400: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
4410: 72 63 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  rc;.        pSrc
4420: 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74   = sqliteSrcList
4430: 41 70 70 65 6e 64 28 30 2c 20 26 70 54 72 69 67  Append(0, &pTrig
4440: 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2c  gerStep->target,
4450: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
4460: 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50 61  iteVdbeAddOp(pPa
4470: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4c  rse->pVdbe, OP_L
4480: 69 73 74 50 75 73 68 2c 20 30 2c 20 30 29 3b 0a  istPush, 0, 0);.
4490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 55 70          sqliteUp
44a0: 64 61 74 65 28 70 50 61 72 73 65 2c 20 70 53 72  date(pParse, pSr
44b0: 63 2c 0a 09 09 73 71 6c 69 74 65 45 78 70 72 4c  c,...sqliteExprL
44c0: 69 73 74 44 75 70 28 70 54 72 69 67 67 65 72 53  istDup(pTriggerS
44d0: 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 2c  tep->pExprList),
44e0: 20 0a 09 09 73 71 6c 69 74 65 45 78 70 72 44 75   ...sqliteExprDu
44f0: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  p(pTriggerStep->
4500: 70 57 68 65 72 65 29 2c 20 6f 72 63 6f 6e 66 29  pWhere), orconf)
4510: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4520: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
4530: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74  ->pVdbe, OP_List
4540: 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Pop, 0, 0);.    
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4560: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b   }.      case TK
4570: 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _INSERT: {.     
4580: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
4590: 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d  ;.        pSrc =
45a0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70   sqliteSrcListAp
45b0: 70 65 6e 64 28 30 2c 20 26 70 54 72 69 67 67 65  pend(0, &pTrigge
45c0: 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 30  rStep->target, 0
45d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
45e0: 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  eInsert(pParse, 
45f0: 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
4600: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
4610: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  p(pTriggerStep->
4620: 70 45 78 70 72 4c 69 73 74 29 2c 20 0a 20 20 20  pExprList), .   
4630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
4640: 65 63 74 44 75 70 28 70 54 72 69 67 67 65 72 53  ectDup(pTriggerS
4650: 74 65 70 2d 3e 70 53 65 6c 65 63 74 29 2c 20 0a  tep->pSelect), .
4660: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4670: 49 64 4c 69 73 74 44 75 70 28 70 54 72 69 67 67  IdListDup(pTrigg
4680: 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 29  erStep->pIdList)
4690: 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20  , orconf);.     
46a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
46b0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
46c0: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20  DELETE: {.      
46d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
46e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
46f0: 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d  dbeAddOp(pParse-
4700: 3e 70 56 64 62 65 2c 20 4f 50 5f 4c 69 73 74 50  >pVdbe, OP_ListP
4710: 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ush, 0, 0);.    
4720: 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
4730: 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30  eSrcListAppend(0
4740: 2c 20 26 70 54 72 69 67 67 65 72 53 74 65 70 2d  , &pTriggerStep-
4750: 3e 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20  >target, 0);.   
4760: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
4770: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 70 53  eFrom(pParse, pS
4780: 72 63 2c 20 73 71 6c 69 74 65 45 78 70 72 44 75  rc, sqliteExprDu
4790: 70 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  p(pTriggerStep->
47a0: 70 57 68 65 72 65 29 29 3b 0a 20 20 20 20 20 20  pWhere));.      
47b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
47c0: 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  p(pParse->pVdbe,
47d0: 20 4f 50 5f 4c 69 73 74 50 6f 70 2c 20 30 2c 20   OP_ListPop, 0, 
47e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
47f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4800: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
4810: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
4820: 20 7d 20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   } .    pParse->
4830: 6e 54 61 62 20 3d 20 73 61 76 65 4e 54 61 62 3b  nTab = saveNTab;
4840: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
4850: 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70  p = pTriggerStep
4860: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
4870: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4880: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
4890: 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45 41  d to code FOR EA
48a0: 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 2e  CH ROW triggers.
48b0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
48c0: 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20 66  code that this f
48d0: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
48e0: 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  s is executed, t
48f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
4900: 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 2a   must be true:.*
4910: 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73 6f  *.** 1. No curso
4920: 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 69  rs may be open i
4930: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
4940: 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49 64  ase.  (But newId
4950: 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a 20  x and oldIdx.** 
4960: 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63 65     can be indice
4970: 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e 20  s of cursors in 
4980: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
4990: 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a 2a  .  See below.).*
49a0: 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20 74  *.** 2. If the t
49b0: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
49c0: 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45 52  ded are ON INSER
49d0: 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  T or ON UPDATE t
49e0: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
49f0: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
4a00: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
4a10: 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74 20  ex newIdx) must 
4a20: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
4a30: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
4a40: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
4a50: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
4a60: 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77 2e  tituted for new.
4a70: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
4a80: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
4a90: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
4aa0: 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20 74  *.** 3. If the t
4ab0: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
4ac0: 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45 54  ded are ON DELET
4ad0: 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  E or ON UPDATE t
4ae0: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
4af0: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
4b00: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
4b10: 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74 20  ex oldIdx) must 
4b20: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
4b30: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
4b40: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
4b50: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
4b60: 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64 2e  tituted for old.
4b70: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
4b80: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
4b90: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
4ba0: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43  *.*/.int sqliteC
4bb0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20  odeRowTrigger(. 
4bc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4be0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
4bf0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4c00: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50   /* One of TK_UP
4c10: 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  DATE, TK_INSERT,
4c20: 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20   TK_DELETE */.  
4c30: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
4c40: 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20  es,  /* Changes 
4c50: 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44  list for any UPD
4c60: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20  ATE OF triggers 
4c70: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4c90: 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54   of TK_BEFORE, T
4ca0: 4b 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62  K_AFTER */.  Tab
4cb0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
4cc0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4cd0: 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73 20  o code triggers 
4ce0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  from */.  int ne
4cf0: 77 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f  wIdx,          /
4d00: 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20  * The indice of 
4d10: 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74 6f  the "new" row to
4d20: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74   access */.  int
4d30: 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20 20   oldIdx,        
4d40: 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20    /* The indice 
4d50: 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f 77  of the "old" row
4d60: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
4d70: 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20  int orconf,     
4d80: 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c       /* ON CONFL
4d90: 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20  ICT policy */.  
4da0: 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20  int ignoreJump  
4db0: 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
4dc0: 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ion to jump to f
4dd0: 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  or RAISE(IGNORE)
4de0: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
4df0: 20 2a 20 70 54 72 69 67 67 65 72 3b 0a 20 20 54   * pTrigger;.  T
4e00: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 20 70 54  riggerStack * pT
4e10: 72 69 67 67 65 72 53 74 61 63 6b 3b 0a 0a 20 20  riggerStack;..  
4e20: 61 73 73 65 72 74 28 6f 70 20 3d 3d 20 54 4b 5f  assert(op == TK_
4e30: 55 50 44 41 54 45 20 7c 7c 20 6f 70 20 3d 3d 20  UPDATE || op == 
4e40: 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 20  TK_INSERT || op 
4e50: 3d 3d 20 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 20  == TK_DELETE);. 
4e60: 20 61 73 73 65 72 74 28 74 72 5f 74 6d 20 3d 3d   assert(tr_tm ==
4e70: 20 54 4b 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72   TK_BEFORE || tr
4e80: 5f 74 6d 20 3d 3d 20 54 4b 5f 41 46 54 45 52 29  _tm == TK_AFTER)
4e90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 65 77 49  ;..  assert(newI
4ea0: 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f 6c 64 49  dx != -1 || oldI
4eb0: 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20 20 70 54  dx != -1);..  pT
4ec0: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
4ed0: 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c 65  Trigger;.  while
4ee0: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
4ef0: 20 20 69 6e 74 20 66 69 72 65 5f 74 68 69 73 20    int fire_this 
4f00: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 64 65 74  = 0;..    /* det
4f10: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 77  ermine whether w
4f20: 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20 74 68  e should code th
4f30: 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  is trigger */.  
4f40: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e    if( pTrigger->
4f50: 6f 70 20 3d 3d 20 6f 70 20 26 26 20 70 54 72 69  op == op && pTri
4f60: 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 3d 20 74  gger->tr_tm == t
4f70: 72 5f 74 6d 20 26 26 20 0a 20 20 20 20 20 20 20  r_tm && .       
4f80: 20 70 54 72 69 67 67 65 72 2d 3e 66 6f 72 65 61   pTrigger->forea
4f90: 63 68 20 3d 3d 20 54 4b 5f 52 4f 57 20 29 7b 0a  ch == TK_ROW ){.
4fa0: 20 20 20 20 20 20 66 69 72 65 5f 74 68 69 73 20        fire_this 
4fb0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 72 69 67  = 1;.      pTrig
4fc0: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
4fd0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
4fe0: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
4ff0: 67 65 72 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  gerStack ){.    
5000: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
5010: 53 74 61 63 6b 2d 3e 70 54 72 69 67 67 65 72 20  Stack->pTrigger 
5020: 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 09  == pTrigger ){..
5030: 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b    fire_this = 0;
5040: 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 54 72 69  ..}.        pTri
5050: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 54 72 69  ggerStack = pTri
5060: 67 67 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78 74  ggerStack->pNext
5070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5080: 69 66 28 20 6f 70 20 3d 3d 20 54 4b 5f 55 50 44  if( op == TK_UPD
5090: 41 54 45 20 26 26 20 70 54 72 69 67 67 65 72 2d  ATE && pTrigger-
50a0: 3e 70 43 6f 6c 75 6d 6e 73 20 26 26 0a 20 20 20  >pColumns &&.   
50b0: 20 20 20 20 20 20 20 21 63 68 65 63 6b 43 6f 6c         !checkCol
50c0: 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54 72 69 67  umnOverLap(pTrig
50d0: 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70  ger->pColumns, p
50e0: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
50f0: 20 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20      fire_this = 
5100: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
5110: 0a 0a 20 20 20 20 69 66 28 20 66 69 72 65 5f 74  ..    if( fire_t
5120: 68 69 73 20 26 26 20 28 70 54 72 69 67 67 65 72  his && (pTrigger
5130: 53 74 61 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61  Stack = sqliteMa
5140: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67  lloc(sizeof(Trig
5150: 67 65 72 53 74 61 63 6b 29 29 29 21 3d 30 20 29  gerStack)))!=0 )
5160: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54  {.      int endT
5170: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 53 72  rigger;.      Sr
5180: 63 4c 69 73 74 20 64 75 6d 6d 79 54 61 62 6c 69  cList dummyTabli
5190: 73 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  st;.      Expr *
51a0: 20 77 68 65 6e 45 78 70 72 3b 0a 0a 20 20 20 20   whenExpr;..    
51b0: 20 20 64 75 6d 6d 79 54 61 62 6c 69 73 74 2e 6e    dummyTablist.n
51c0: 53 72 63 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Src = 0;..      
51d0: 2f 2a 20 50 75 73 68 20 61 6e 20 65 6e 74 72 79  /* Push an entry
51e0: 20 6f 6e 20 74 6f 20 74 68 65 20 74 72 69 67 67   on to the trigg
51f0: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20  er stack */.    
5200: 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d    pTriggerStack-
5210: 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69  >pTrigger = pTri
5220: 67 67 65 72 3b 0a 20 20 20 20 20 20 70 54 72 69  gger;.      pTri
5230: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
5240: 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20 20 20 20  x = newIdx;.    
5250: 20 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d    pTriggerStack-
5260: 3e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 49 64 78  >oldIdx = oldIdx
5270: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
5280: 53 74 61 63 6b 2d 3e 70 54 61 62 20 3d 20 70 54  Stack->pTab = pT
5290: 61 62 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67  ab;.      pTrigg
52a0: 65 72 53 74 61 63 6b 2d 3e 70 4e 65 78 74 20 3d  erStack->pNext =
52b0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
52c0: 63 6b 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67  ck;.      pTrigg
52d0: 65 72 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  erStack->ignoreJ
52e0: 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a 75 6d 70  ump = ignoreJump
52f0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5300: 74 72 69 67 53 74 61 63 6b 20 3d 20 70 54 72 69  trigStack = pTri
5310: 67 67 65 72 53 74 61 63 6b 3b 0a 0a 20 20 20 20  ggerStack;..    
5320: 20 20 2f 2a 20 63 6f 64 65 20 74 68 65 20 57 48    /* code the WH
5330: 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
5340: 20 20 20 65 6e 64 54 72 69 67 67 65 72 20 3d 20     endTrigger = 
5350: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
5360: 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62  bel(pParse->pVdb
5370: 65 29 3b 0a 20 20 20 20 20 20 77 68 65 6e 45 78  e);.      whenEx
5380: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  pr = sqliteExprD
5390: 75 70 28 70 54 72 69 67 67 65 72 2d 3e 70 57 68  up(pTrigger->pWh
53a0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  en);.      if( s
53b0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
53c0: 49 64 73 28 70 50 61 72 73 65 2c 20 30 2c 20 26  Ids(pParse, 0, &
53d0: 64 75 6d 6d 79 54 61 62 6c 69 73 74 2c 20 30 2c  dummyTablist, 0,
53e0: 20 77 68 65 6e 45 78 70 72 29 20 29 7b 0a 20 20   whenExpr) ){.  
53f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72        pParse->tr
5400: 69 67 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  igStack = pParse
5410: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 70 4e 65  ->trigStack->pNe
5420: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
5430: 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72 53  teFree(pTriggerS
5440: 74 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  tack);.        s
5450: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
5460: 77 68 65 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  whenExpr);.     
5470: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5480: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5490: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
54a0: 72 73 65 2c 20 77 68 65 6e 45 78 70 72 2c 20 65  rse, whenExpr, e
54b0: 6e 64 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20  ndTrigger, 1);. 
54c0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
54d0: 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29 3b  elete(whenExpr);
54e0: 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72 69 67  ..      codeTrig
54f0: 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61 72 73  gerProgram(pPars
5500: 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65  e, pTrigger->ste
5510: 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29 3b  p_list, orconf);
5520: 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70 20   ..      /* Pop 
5530: 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20 74 68  the entry off th
5540: 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b 20  e trigger stack 
5550: 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  */.      pParse-
5560: 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 70 50 61  >trigStack = pPa
5570: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
5580: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
5590: 69 74 65 46 72 65 65 28 70 54 72 69 67 67 65 72  iteFree(pTrigger
55a0: 53 74 61 63 6b 29 3b 0a 0a 20 20 20 20 20 20 73  Stack);..      s
55b0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
55c0: 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56  Label(pParse->pV
55d0: 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65 72 29  dbe, endTrigger)
55e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72 69  ;.    }.    pTri
55f0: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
5600: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72  >pNext;.  }..  r
5610: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  eturn 0;.}../*. 
5620: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5630: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64  is called to cod
5640: 65 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  e ON UPDATE and 
5650: 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  ON DELETE trigge
5660: 72 73 20 6f 6e 20 0a 20 2a 20 76 69 65 77 73 2e  rs on . * views.
5670: 20 0a 20 2a 0a 20 2a 20 54 68 69 73 20 66 75 6e   . *. * This fun
5680: 63 74 69 6f 6e 20 64 65 6c 65 74 65 73 20 74 68  ction deletes th
5690: 65 20 64 61 74 61 20 70 6f 69 6e 74 65 64 20 61  e data pointed a
56a0: 74 20 62 79 20 74 68 65 20 70 57 68 65 72 65 20  t by the pWhere 
56b0: 61 6e 64 20 70 43 68 61 6e 67 65 73 0a 20 2a 20  and pChanges. * 
56c0: 61 72 67 75 6d 65 6e 74 73 20 62 65 66 6f 72 65  arguments before
56d0: 20 69 74 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 20   it completes.. 
56e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 69  */.void sqliteVi
56f0: 65 77 54 72 69 67 67 65 72 73 28 0a 20 20 50 61  ewTriggers(.  Pa
5700: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
5710: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
5720: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
5730: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
5740: 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  s on */.  Expr *
5750: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f  pWhere,        /
5760: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
5770: 73 65 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  se of the statem
5780: 65 6e 74 20 63 61 75 73 69 6e 67 20 74 72 69 67  ent causing trig
5790: 67 65 72 73 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  gers*/.  int orc
57a0: 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  onf,          /*
57b0: 20 54 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   The ON CONFLICT
57c0: 20 70 6f 6c 69 63 79 20 73 70 65 63 69 66 69 65   policy specifie
57d0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
57e0: 0a 09 09 09 20 20 73 74 61 74 65 6d 65 6e 74 20  ....  statement 
57f0: 63 61 75 73 69 6e 67 20 74 68 65 73 65 20 74 72  causing these tr
5800: 69 67 67 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  iggers */.  Expr
5810: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 20 20  List *pChanges  
5820: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5830: 6e 20 73 74 61 74 65 6d 65 6e 74 20 63 61 75 73  n statement caus
5840: 69 6e 67 20 74 72 69 67 67 65 72 73 20 74 6f 20  ing triggers to 
5850: 66 69 72 65 0a 09 09 09 20 20 69 73 20 61 6e 20  fire....  is an 
5860: 55 50 44 41 54 45 2c 20 74 68 65 6e 20 74 68 69  UPDATE, then thi
5870: 73 20 6c 69 73 74 20 68 6f 6c 64 73 20 74 68 65  s list holds the
5880: 20 63 6f 6c 75 6d 6e 73 0a 09 09 09 20 20 74 6f   columns....  to
5890: 20 75 70 64 61 74 65 20 61 6e 64 20 74 68 65 20   update and the 
58a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 75  expressions to u
58b0: 70 64 61 74 65 20 74 68 65 6d 20 74 6f 2e 0a 09  pdate them to...
58c0: 09 09 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ..  See comments
58d0: 20 66 6f 72 20 73 71 6c 69 74 65 55 70 64 61 74   for sqliteUpdat
58e0: 65 28 29 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  e(). */.){.  int
58f0: 20 6f 6c 64 49 64 78 20 3d 20 2d 31 3b 0a 20 20   oldIdx = -1;.  
5900: 69 6e 74 20 6e 65 77 49 64 78 20 3d 20 2d 31 3b  int newIdx = -1;
5910: 0a 20 20 69 6e 74 20 2a 61 58 52 65 66 20 3d 20  .  int *aXRef = 
5920: 30 3b 20 20 20 0a 20 20 56 64 62 65 20 2a 76 3b  0;   .  Vdbe *v;
5930: 0a 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70  .  int endOfLoop
5940: 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 4f 66 4c  ;.  int startOfL
5950: 6f 6f 70 3b 0a 20 20 53 65 6c 65 63 74 20 74 68  oop;.  Select th
5960: 65 53 65 6c 65 63 74 3b 0a 20 20 54 6f 6b 65 6e  eSelect;.  Token
5970: 20 74 62 6c 4e 61 6d 65 54 6f 6b 65 6e 3b 0a 0a   tblNameToken;..
5980: 20 20 61 73 73 65 72 74 28 70 54 61 62 2d 3e 70    assert(pTab->p
5990: 53 65 6c 65 63 74 29 3b 0a 0a 20 20 74 62 6c 4e  Select);..  tblN
59a0: 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61  ameToken.z = pTa
59b0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 74 62 6c 4e  b->zName;.  tblN
59c0: 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72  ameToken.n = str
59d0: 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  len(pTab->zName)
59e0: 3b 0a 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 69  ;..  theSelect.i
59f0: 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
5a00: 20 74 68 65 53 65 6c 65 63 74 2e 70 45 4c 69 73   theSelect.pELis
5a10: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  t = sqliteExprLi
5a20: 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71 6c 69  stAppend(0, sqli
5a30: 74 65 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30  teExpr(TK_ALL, 0
5a40: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 20 20 74  , 0, 0), 0);.  t
5a50: 68 65 53 65 6c 65 63 74 2e 70 53 72 63 20 20 20  heSelect.pSrc   
5a60: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  = sqliteSrcListA
5a70: 70 70 65 6e 64 28 30 2c 20 26 74 62 6c 4e 61 6d  ppend(0, &tblNam
5a80: 65 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 74 68  eToken, 0);.  th
5a90: 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65 20 3d  eSelect.pWhere =
5aa0: 20 70 57 68 65 72 65 3b 20 20 20 20 70 57 68 65   pWhere;    pWhe
5ab0: 72 65 20 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c  re = 0;.  theSel
5ac0: 65 63 74 2e 70 47 72 6f 75 70 42 79 20 3d 20 30  ect.pGroupBy = 0
5ad0: 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 70 48  ;.  theSelect.pH
5ae0: 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 74 68 65  aving = 0;.  the
5af0: 53 65 6c 65 63 74 2e 70 4f 72 64 65 72 42 79 20  Select.pOrderBy 
5b00: 3d 20 30 3b 0a 20 20 74 68 65 53 65 6c 65 63 74  = 0;.  theSelect
5b10: 2e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  .op = TK_SELECT;
5b20: 20 2f 2a 20 3f 3f 20 2a 2f 0a 20 20 74 68 65 53   /* ?? */.  theS
5b30: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 3d 20 30  elect.pPrior = 0
5b40: 3b 0a 20 20 74 68 65 53 65 6c 65 63 74 2e 6e 4c  ;.  theSelect.nL
5b50: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 74 68 65  imit = -1;.  the
5b60: 53 65 6c 65 63 74 2e 6e 4f 66 66 73 65 74 20 3d  Select.nOffset =
5b70: 20 2d 31 3b 0a 20 20 74 68 65 53 65 6c 65 63 74   -1;.  theSelect
5b80: 2e 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .zSelect = 0;.  
5b90: 74 68 65 53 65 6c 65 63 74 2e 62 61 73 65 20 3d  theSelect.base =
5ba0: 20 30 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74   0;..  v = sqlit
5bb0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
5bc0: 3b 0a 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20  ;.  assert(v);. 
5bd0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
5be0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
5bf0: 65 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  e, 1, 0);..  /* 
5c00: 41 6c 6c 6f 63 61 74 65 20 74 65 6d 70 20 74 61  Allocate temp ta
5c10: 62 6c 65 73 20 2a 2f 0a 20 20 6f 6c 64 49 64 78  bles */.  oldIdx
5c20: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
5c30: 2b 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  +;.  sqliteVdbeA
5c40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
5c50: 65 6d 70 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b  emp, oldIdx, 0);
5c60: 0a 20 20 69 66 28 20 70 43 68 61 6e 67 65 73 20  .  if( pChanges 
5c70: 29 7b 0a 20 20 20 20 6e 65 77 49 64 78 20 3d 20  ){.    newIdx = 
5c80: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
5c90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5ca0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
5cb0: 6d 70 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  mp, newIdx, 0);.
5cc0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 6e 61 70 73 68    }..  /* Snapsh
5cd0: 6f 74 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ot the view */. 
5ce0: 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63   if( sqliteSelec
5cf0: 74 28 70 50 61 72 73 65 2c 20 26 74 68 65 53 65  t(pParse, &theSe
5d00: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
5d10: 20 6f 6c 64 49 64 78 2c 20 30 2c 20 30 2c 20 30   oldIdx, 0, 0, 0
5d20: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
5d30: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
5d40: 20 7d 0a 0a 20 20 2f 2a 20 6c 6f 6f 70 20 74 68   }..  /* loop th
5d50: 72 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70  ru the view snap
5d60: 73 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20  shot, executing 
5d70: 74 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63  triggers for eac
5d80: 68 20 72 6f 77 20 2a 2f 0a 20 20 65 6e 64 4f 66  h row */.  endOf
5d90: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56 64 62  Loop = sqliteVdb
5da0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5db0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5dc0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6f  (v, OP_Rewind, o
5dd0: 6c 64 49 64 78 2c 20 65 6e 64 4f 66 4c 6f 6f 70  ldIdx, endOfLoop
5de0: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  );..  /* Loop th
5df0: 72 75 20 74 68 65 20 76 69 65 77 20 73 6e 61 70  ru the view snap
5e00: 73 68 6f 74 2c 20 65 78 65 63 75 74 69 6e 67 20  shot, executing 
5e10: 74 72 69 67 67 65 72 73 20 66 6f 72 20 65 61 63  triggers for eac
5e20: 68 20 72 6f 77 20 2a 2f 0a 20 20 73 74 61 72 74  h row */.  start
5e30: 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 56  OfLoop = sqliteV
5e40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5e50: 29 3b 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74  );..  /* Build t
5e60: 68 65 20 75 70 64 61 74 65 64 20 72 6f 77 20 69  he updated row i
5e70: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
5e80: 69 66 28 20 70 43 68 61 6e 67 65 73 20 29 7b 0a  if( pChanges ){.
5e90: 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
5ea0: 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65 4d   aXRef = sqliteM
5eb0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e  alloc( sizeof(in
5ec0: 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t) * pTab->nCol 
5ed0: 29 3b 0a 20 20 20 20 69 66 28 20 61 58 52 65 66  );.    if( aXRef
5ee0: 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67  ==0 ) goto trigg
5ef0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  er_cleanup;.    
5f00: 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 3c  for(ii = 0; ii <
5f10: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 69 2b   pTab->nCol; ii+
5f20: 2b 29 7b 0a 20 20 20 20 20 20 61 58 52 65 66 5b  +){.      aXRef[
5f30: 69 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ii] = -1;.    }.
5f40: 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
5f50: 69 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70  i<pChanges->nExp
5f60: 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
5f70: 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  int jj;.      if
5f80: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5f90: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 6f  lveIds(pParse, o
5fa0: 6c 64 49 64 78 2c 20 74 68 65 53 65 6c 65 63 74  ldIdx, theSelect
5fb0: 2e 70 53 72 63 20 2c 20 30 2c 20 0a 20 20 20 20  .pSrc , 0, .    
5fc0: 20 20 20 20 20 20 20 20 70 43 68 61 6e 67 65 73          pChanges
5fd0: 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
5fe0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74  {.        goto t
5ff0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
6000: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6010: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
6020: 63 6b 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e  ck(pParse, pChan
6030: 67 65 73 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ges->a[ii].pExpr
6040: 2c 20 30 2c 20 30 29 20 29 0a 20 20 20 20 20 20  , 0, 0) ).      
6050: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
6060: 6c 65 61 6e 75 70 3b 0a 0a 20 20 20 20 20 20 66  leanup;..      f
6070: 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 54 61 62  or(jj=0; jj<pTab
6080: 2d 3e 6e 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  ->nCol; jj++){. 
6090: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
60a0: 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  eStrICmp(pTab->a
60b0: 43 6f 6c 5b 6a 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  Col[jj].zName, p
60c0: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e 7a  Changes->a[ii].z
60d0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
60e0: 20 20 20 20 20 20 61 58 52 65 66 5b 6a 6a 5d 20        aXRef[jj] 
60f0: 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
6100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6120: 66 28 20 6a 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  f( jj>=pTab->nCo
6130: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
6140: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
6150: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
6160: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
6170: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
6180: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 69 5d 2e  pChanges->a[ii].
6190: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
61a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
61b0: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
61c0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
61d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
61e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
61f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6200: 72 2c 20 31 33 2c 20 30 29 3b 0a 0a 20 20 20 20  r, 13, 0);..    
6210: 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 3c 70  for(ii = 0; ii<p
6220: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 69 2b 2b 29  Tab->nCol; ii++)
6230: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 58 52 65  {.      if( aXRe
6240: 66 5b 69 69 5d 20 3c 20 30 20 29 7b 20 0a 20 20  f[ii] < 0 ){ .  
6250: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
6270: 6d 6e 2c 20 6f 6c 64 49 64 78 2c 20 69 69 29 3b  mn, oldIdx, ii);
6280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6290: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
62a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 68  Code(pParse, pCh
62b0: 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b 69  anges->a[aXRef[i
62c0: 69 5d 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  i]].pExpr);.    
62d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
62e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
62f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6300: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 29 3b   pTab->nCol, 0);
6310: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6320: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
6330: 74 4b 65 79 2c 20 6e 65 77 49 64 78 2c 20 30 29  tKey, newIdx, 0)
6340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
6360: 6e 64 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  nd, newIdx, 0);.
6370: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52  .    sqliteCodeR
6380: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
6390: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
63a0: 61 6e 67 65 73 2c 20 54 4b 5f 42 45 46 4f 52 45  anges, TK_BEFORE
63b0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c  , .        pTab,
63c0: 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49 64 78 2c   newIdx, oldIdx,
63d0: 20 6f 72 63 6f 6e 66 2c 20 65 6e 64 4f 66 4c 6f   orconf, endOfLo
63e0: 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  op);.    sqliteC
63f0: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
6400: 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c  arse, TK_UPDATE,
6410: 20 70 43 68 61 6e 67 65 73 2c 20 54 4b 5f 41 46   pChanges, TK_AF
6420: 54 45 52 2c 20 0a 20 20 20 20 20 20 20 20 70 54  TER, .        pT
6430: 61 62 2c 20 6e 65 77 49 64 78 2c 20 6f 6c 64 49  ab, newIdx, oldI
6440: 64 78 2c 20 6f 72 63 6f 6e 66 2c 20 65 6e 64 4f  dx, orconf, endO
6450: 66 4c 6f 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  fLoop);.  }else{
6460: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 52  .    sqliteCodeR
6470: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
6480: 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20  , TK_DELETE, 0, 
6490: 54 4b 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c  TK_BEFORE, pTab,
64a0: 20 2d 31 2c 20 6f 6c 64 49 64 78 2c 20 0a 20 20   -1, oldIdx, .  
64b0: 20 20 20 20 20 20 6f 72 63 6f 6e 66 2c 20 65 6e        orconf, en
64c0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71  dOfLoop);.    sq
64d0: 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69 67 67  liteCodeRowTrigg
64e0: 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 45  er(pParse, TK_DE
64f0: 4c 45 54 45 2c 20 30 2c 20 54 4b 5f 41 46 54 45  LETE, 0, TK_AFTE
6500: 52 2c 20 70 54 61 62 2c 20 2d 31 2c 20 6f 6c 64  R, pTab, -1, old
6510: 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 6f 72  Idx, .        or
6520: 63 6f 6e 66 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  conf, endOfLoop)
6530: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 56  ;.  }..  sqliteV
6540: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
6550: 65 78 74 2c 20 6f 6c 64 49 64 78 2c 20 73 74 61  ext, oldIdx, sta
6560: 72 74 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 73 71  rtOfLoop);..  sq
6570: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
6580: 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f  abel(v, endOfLoo
6590: 70 29 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57  p);.  sqliteEndW
65a0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
65b0: 61 72 73 65 29 3b 0a 0a 74 72 69 67 67 65 72 5f  arse);..trigger_
65c0: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
65d0: 65 46 72 65 65 28 61 58 52 65 66 29 3b 0a 20 20  eFree(aXRef);.  
65e0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
65f0: 6c 65 74 65 28 70 43 68 61 6e 67 65 73 29 3b 0a  lete(pChanges);.
6600: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
6610: 74 65 28 70 57 68 65 72 65 29 3b 0a 20 20 73 71  te(pWhere);.  sq
6620: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
6630: 74 65 28 74 68 65 53 65 6c 65 63 74 2e 70 45 4c  te(theSelect.pEL
6640: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72  ist);.  sqliteSr
6650: 63 4c 69 73 74 44 65 6c 65 74 65 28 74 68 65 53  cListDelete(theS
6660: 65 6c 65 63 74 2e 70 53 72 63 29 3b 0a 20 20 73  elect.pSrc);.  s
6670: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
6680: 74 68 65 53 65 6c 65 63 74 2e 70 57 68 65 72 65  theSelect.pWhere
6690: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.