/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 83e1baba999bed3144ea5a2143fc922edf51135f:


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 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0180: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 69 6c 65  d by the compile
0190: 72 20 74 6f 20 61 64 64 20 66 6f 72 65 69 67 6e  r to add foreign
01a0: 20 6b 65 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20   key.** support 
01b0: 74 6f 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 20  to compiled SQL 
01c0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
01d0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
01e0: 6e 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53  nt.h"..#ifndef S
01f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
0200: 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53  GN_KEY.#ifndef S
0210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0220: 45 52 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 65 72 72  ER../*.** Deferr
0230: 65 64 20 61 6e 64 20 49 6d 6d 65 64 69 61 74 65  ed and Immediate
0240: 20 46 4b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d   FKs.** --------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 0a 2a 2a 0a 2a 2a 20 46 6f 72 65 69 67 6e  --.**.** Foreign
0270: 20 6b 65 79 73 20 69 6e 20 53 51 4c 69 74 65 20   keys in SQLite 
0280: 63 6f 6d 65 20 69 6e 20 74 77 6f 20 66 6c 61 76  come in two flav
0290: 6f 75 72 73 3a 20 64 65 66 65 72 72 65 64 20 61  ours: deferred a
02a0: 6e 64 20 69 6d 6d 65 64 69 61 74 65 2e 0a 2a 2a  nd immediate..**
02b0: 20 49 66 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   If an immediate
02c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
02d0: 73 74 72 61 69 6e 74 20 69 73 20 76 69 6f 6c 61  straint is viola
02e0: 74 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  ted,.** SQLITE_C
02f0: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
0300: 4e 4b 45 59 20 69 73 20 72 65 74 75 72 6e 65 64  NKEY is returned
0310: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
0320: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
0330: 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
0340: 20 62 61 63 6b 2e 20 49 66 20 61 20 0a 2a 2a 20   back. If a .** 
0350: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
0360: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0370: 69 73 20 76 69 6f 6c 61 74 65 64 2c 20 6e 6f 20  is violated, no 
0380: 61 63 74 69 6f 6e 20 69 73 20 74 61 6b 65 6e 20  action is taken 
0390: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
03a0: 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20   However if the 
03b0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 74 74 65  application atte
03c0: 6d 70 74 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  mpts to commit t
03d0: 68 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  he .** transacti
03e0: 6f 6e 20 62 65 66 6f 72 65 20 66 69 78 69 6e 67  on before fixing
03f0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
0400: 76 69 6f 6c 61 74 69 6f 6e 2c 20 74 68 65 20 61  violation, the a
0410: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2a  ttempt fails..**
0420: 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 63 6f 6e  .** Deferred con
0430: 73 74 72 61 69 6e 74 73 20 61 72 65 20 69 6d 70  straints are imp
0440: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
0450: 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 65 72 20   simple counter 
0460: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
0470: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
0480: 68 61 6e 64 6c 65 2e 20 54 68 65 20 63 6f 75 6e  handle. The coun
0490: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ter is set to ze
04a0: 72 6f 20 65 61 63 68 20 74 69 6d 65 20 61 20 0a  ro each time a .
04b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
04c0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
04d0: 64 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 73  d. Each time a s
04e0: 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63  tatement is exec
04f0: 75 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 63 61  uted .** that ca
0500: 75 73 65 73 20 61 20 66 6f 72 65 69 67 6e 20 6b  uses a foreign k
0510: 65 79 20 76 69 6f 6c 61 74 69 6f 6e 2c 20 74 68  ey violation, th
0520: 65 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  e counter is inc
0530: 72 65 6d 65 6e 74 65 64 2e 20 45 61 63 68 0a 2a  remented. Each.*
0540: 2a 20 74 69 6d 65 20 61 20 73 74 61 74 65 6d 65  * time a stateme
0550: 6e 74 20 69 73 20 65 78 65 63 75 74 65 64 20 74  nt is executed t
0560: 68 61 74 20 72 65 6d 6f 76 65 73 20 61 6e 20 65  hat removes an e
0570: 78 69 73 74 69 6e 67 20 76 69 6f 6c 61 74 69 6f  xisting violatio
0580: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 64 61  n from.** the da
0590: 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 75 6e  tabase, the coun
05a0: 74 65 72 20 69 73 20 64 65 63 72 65 6d 65 6e 74  ter is decrement
05b0: 65 64 2e 20 57 68 65 6e 20 74 68 65 20 74 72 61  ed. When the tra
05c0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  nsaction is.** c
05d0: 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 63 6f  ommitted, the co
05e0: 6d 6d 69 74 20 66 61 69 6c 73 20 69 66 20 74 68  mmit fails if th
05f0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
0600: 6f 66 20 74 68 65 20 63 6f 75 6e 74 65 72 20 69  of the counter i
0610: 73 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61  s.** greater tha
0620: 6e 20 7a 65 72 6f 2e 20 54 68 69 73 20 73 63 68  n zero. This sch
0630: 65 6d 65 20 68 61 73 20 74 77 6f 20 62 69 67 20  eme has two big 
0640: 64 72 61 77 62 61 63 6b 73 3a 0a 2a 2a 0a 2a 2a  drawbacks:.**.**
0650: 20 20 20 2a 20 57 68 65 6e 20 61 20 63 6f 6d 6d     * When a comm
0660: 69 74 20 66 61 69 6c 73 20 64 75 65 20 74 6f 20  it fails due to 
0670: 61 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  a deferred forei
0680: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
0690: 74 2c 20 0a 2a 2a 20 20 20 20 20 74 68 65 72 65  t, .**     there
06a0: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 74 65   is no way to te
06b0: 6c 6c 20 77 68 69 63 68 20 66 6f 72 65 69 67 6e  ll which foreign
06c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
06d0: 6f 74 20 73 61 74 69 73 66 69 65 64 2c 0a 2a 2a  ot satisfied,.**
06e0: 20 20 20 20 20 6f 72 20 77 68 69 63 68 20 72 6f       or which ro
06f0: 77 20 69 74 20 69 73 20 6e 6f 74 20 73 61 74 69  w it is not sati
0700: 73 66 69 65 64 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  sfied for..**.**
0710: 20 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61     * If the data
0720: 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 66 6f  base contains fo
0730: 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
0740: 69 6f 6e 73 20 77 68 65 6e 20 74 68 65 20 0a 2a  ions when the .*
0750: 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f  *     transactio
0760: 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 69  n is opened, thi
0770: 73 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  s may cause the 
0780: 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 6d 61 6c  mechanism to mal
0790: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
07a0: 44 65 73 70 69 74 65 20 74 68 65 73 65 20 70 72  Despite these pr
07b0: 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 61 70 70  oblems, this app
07c0: 72 6f 61 63 68 20 69 73 20 61 64 6f 70 74 65 64  roach is adopted
07d0: 20 61 73 20 69 74 20 73 65 65 6d 73 20 73 69 6d   as it seems sim
07e0: 70 6c 65 72 0a 2a 2a 20 74 68 61 6e 20 74 68 65  pler.** than the
07f0: 20 61 6c 74 65 72 6e 61 74 69 76 65 73 2e 0a 2a   alternatives..*
0800: 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 6f 70 65 72  *.** INSERT oper
0810: 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ations:.**.**   
0820: 49 2e 31 29 20 46 6f 72 20 65 61 63 68 20 46 4b  I.1) For each FK
0830: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74   for which the t
0840: 61 62 6c 65 20 69 73 20 74 68 65 20 63 68 69 6c  able is the chil
0850: 64 20 74 61 62 6c 65 2c 20 73 65 61 72 63 68 0a  d table, search.
0860: 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
0870: 72 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 61  rent table for a
0880: 20 6d 61 74 63 68 2e 20 49 66 20 6e 6f 6e 65 20   match. If none 
0890: 69 73 20 66 6f 75 6e 64 20 69 6e 63 72 65 6d 65  is found increme
08a0: 6e 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  nt the.**       
08b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
08c0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 2e 32  ter..**.**   I.2
08d0: 29 20 46 6f 72 20 65 61 63 68 20 46 4b 20 66 6f  ) For each FK fo
08e0: 72 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  r which the tabl
08f0: 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  e is the parent 
0900: 74 61 62 6c 65 2c 20 0a 2a 2a 20 20 20 20 20 20  table, .**      
0910: 20 20 73 65 61 72 63 68 20 74 68 65 20 63 68 69    search the chi
0920: 6c 64 20 74 61 62 6c 65 20 66 6f 72 20 72 6f 77  ld table for row
0930: 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
0940: 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  d to the new.** 
0950: 20 20 20 20 20 20 20 72 6f 77 20 69 6e 20 74 68         row in th
0960: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
0970: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
0980: 75 6e 74 65 72 20 66 6f 72 20 65 61 63 68 20 72  unter for each r
0990: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 75  ow.**        fou
09a0: 6e 64 20 28 61 73 20 74 68 65 20 63 6f 6e 73 74  nd (as the const
09b0: 72 61 69 6e 74 20 69 73 20 6e 6f 77 20 73 61 74  raint is now sat
09c0: 69 73 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 44  isfied)..**.** D
09d0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
09e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 2e 31 29 20 46  :.**.**   D.1) F
09f0: 6f 72 20 65 61 63 68 20 46 4b 20 66 6f 72 20 77  or each FK for w
0a00: 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 69  hich the table i
0a10: 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  s the child tabl
0a20: 65 2c 20 0a 2a 2a 20 20 20 20 20 20 20 20 73 65  e, .**        se
0a30: 61 72 63 68 20 74 68 65 20 70 61 72 65 6e 74 20  arch the parent 
0a40: 74 61 62 6c 65 20 66 6f 72 20 61 20 72 6f 77 20  table for a row 
0a50: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
0a60: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   to the .**     
0a70: 20 20 20 64 65 6c 65 74 65 64 20 72 6f 77 20 69     deleted row i
0a80: 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  n the child tabl
0a90: 65 2e 20 49 66 20 73 75 63 68 20 61 20 72 6f 77  e. If such a row
0aa0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 0a   is not found, .
0ab0: 2a 2a 20 20 20 20 20 20 20 20 64 65 63 72 65 6d  **        decrem
0ac0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 65 72 2e  ent the counter.
0ad0: 0a 2a 2a 0a 2a 2a 20 20 20 44 2e 32 29 20 46 6f  .**.**   D.2) Fo
0ae0: 72 20 65 61 63 68 20 46 4b 20 66 6f 72 20 77 68  r each FK for wh
0af0: 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 69 73  ich the table is
0b00: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
0b10: 65 2c 20 73 65 61 72 63 68 20 0a 2a 2a 20 20 20  e, search .**   
0b20: 20 20 20 20 20 74 68 65 20 63 68 69 6c 64 20 74       the child t
0b30: 61 62 6c 65 20 66 6f 72 20 72 6f 77 73 20 74 68  able for rows th
0b40: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
0b50: 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 77   the deleted row
0b60: 20 0a 2a 2a 20 20 20 20 20 20 20 20 69 6e 20 74   .**        in t
0b70: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
0b80: 20 46 6f 72 20 65 61 63 68 20 66 6f 75 6e 64 20   For each found 
0b90: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  increment the co
0ba0: 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 55 50 44  unter..**.** UPD
0bb0: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 3a 0a  ATE operations:.
0bc0: 2a 2a 0a 2a 2a 20 20 20 41 6e 20 55 50 44 41 54  **.**   An UPDAT
0bd0: 45 20 63 6f 6d 6d 61 6e 64 20 72 65 71 75 69 72  E command requir
0be0: 65 73 20 74 68 61 74 20 61 6c 6c 20 34 20 73 74  es that all 4 st
0bf0: 65 70 73 20 61 62 6f 76 65 20 61 72 65 20 74 61  eps above are ta
0c00: 6b 65 6e 2c 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a  ken, but only.**
0c10: 20 20 20 66 6f 72 20 46 4b 20 63 6f 6e 73 74 72     for FK constr
0c20: 61 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20  aints for which 
0c30: 74 68 65 20 61 66 66 65 63 74 65 64 20 63 6f 6c  the affected col
0c40: 75 6d 6e 73 20 61 72 65 20 61 63 74 75 61 6c 6c  umns are actuall
0c50: 79 20 0a 2a 2a 20 20 20 6d 6f 64 69 66 69 65 64  y .**   modified
0c60: 20 28 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65   (values must be
0c70: 20 63 6f 6d 70 61 72 65 64 20 61 74 20 72 75 6e   compared at run
0c80: 74 69 6d 65 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  time)..**.** Not
0c90: 65 20 74 68 61 74 20 49 2e 31 20 61 6e 64 20 44  e that I.1 and D
0ca0: 2e 31 20 61 72 65 20 76 65 72 79 20 73 69 6d 69  .1 are very simi
0cb0: 6c 61 72 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20  lar operations, 
0cc0: 61 73 20 61 72 65 20 49 2e 32 20 61 6e 64 20 44  as are I.2 and D
0cd0: 2e 32 2e 0a 2a 2a 20 54 68 69 73 20 73 69 6d 70  .2..** This simp
0ce0: 6c 69 66 69 65 73 20 74 68 65 20 69 6d 70 6c 65  lifies the imple
0cf0: 6d 65 6e 74 61 74 69 6f 6e 20 61 20 62 69 74 2e  mentation a bit.
0d00: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
0d10: 75 72 70 6f 73 65 73 20 6f 66 20 69 6d 6d 65 64  urposes of immed
0d20: 69 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69  iate FK constrai
0d30: 6e 74 73 2c 20 74 68 65 20 4f 52 20 52 45 50 4c  nts, the OR REPL
0d40: 41 43 45 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20  ACE conflict.** 
0d50: 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 63 6f  resolution is co
0d60: 6e 73 69 64 65 72 65 64 20 74 6f 20 64 65 6c 65  nsidered to dele
0d70: 74 65 20 72 6f 77 73 20 62 65 66 6f 72 65 20 74  te rows before t
0d80: 68 65 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e  he new row is in
0d90: 73 65 72 74 65 64 2e 0a 2a 2a 20 49 66 20 61 20  serted..** If a 
0da0: 64 65 6c 65 74 65 20 63 61 75 73 65 64 20 62 79  delete caused by
0db0: 20 4f 52 20 52 45 50 4c 41 43 45 20 76 69 6f 6c   OR REPLACE viol
0dc0: 61 74 65 73 20 61 6e 20 46 4b 20 63 6f 6e 73 74  ates an FK const
0dd0: 72 61 69 6e 74 2c 20 61 6e 20 65 78 63 65 70 74  raint, an except
0de0: 69 6f 6e 0a 2a 2a 20 69 73 20 74 68 72 6f 77 6e  ion.** is thrown
0df0: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 46 4b  , even if the FK
0e00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 6f 75 6c   constraint woul
0e10: 64 20 62 65 20 73 61 74 69 73 66 69 65 64 20 61  d be satisfied a
0e20: 66 74 65 72 20 74 68 65 20 6e 65 77 20 0a 2a 2a  fter the new .**
0e30: 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
0e40: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
0e50: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
0e60: 65 20 75 73 75 61 6c 6c 79 20 68 61 6e 64 6c 65  e usually handle
0e70: 64 20 73 69 6d 69 6c 61 72 6c 79 2e 20 54 68 65  d similarly. The
0e80: 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
0e90: 20 0a 2a 2a 20 69 73 20 74 68 61 74 20 74 68 65   .** is that the
0ea0: 20 63 6f 75 6e 74 65 72 20 75 73 65 64 20 69 73   counter used is
0eb0: 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
0ec0: 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
0ed0: 61 6c 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  al statement.** 
0ee0: 6f 62 6a 65 63 74 20 28 73 74 72 75 63 74 20 56  object (struct V
0ef0: 64 62 65 29 2e 20 49 66 2c 20 61 66 74 65 72 20  dbe). If, after 
0f00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
0f10: 73 20 72 75 6e 2c 20 69 74 73 20 69 6d 6d 65 64  s run, its immed
0f20: 69 61 74 65 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  iate.** constrai
0f30: 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20 67 72  nt counter is gr
0f40: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
0f50: 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
0f60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
0f70: 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
0f80: 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  nd the statement
0f90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
0fa0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 41 6e 20  rolled back. An 
0fb0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 61 6e 20  exception is an 
0fc0: 49 4e 53 45 52 54 0a 2a 2a 20 73 74 61 74 65 6d  INSERT.** statem
0fd0: 65 6e 74 20 74 68 61 74 20 69 6e 73 65 72 74 73  ent that inserts
0fe0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 6e   a single row on
0ff0: 6c 79 20 28 6e 6f 20 74 72 69 67 67 65 72 73 29  ly (no triggers)
1000: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
1010: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 75 73  ** instead of us
1020: 69 6e 67 20 61 20 63 6f 75 6e 74 65 72 2c 20 61  ing a counter, a
1030: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74  n exception is t
1040: 68 72 6f 77 6e 20 69 6d 6d 65 64 69 61 74 65 6c  hrown immediatel
1050: 79 20 69 66 20 74 68 65 0a 2a 2a 20 49 4e 53 45  y if the.** INSE
1060: 52 54 20 76 69 6f 6c 61 74 65 73 20 61 20 66 6f  RT violates a fo
1070: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1080: 61 69 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 65  aint. This is ne
1090: 63 65 73 73 61 72 79 20 61 73 20 73 75 63 68 0a  cessary as such.
10a0: 2a 2a 20 61 6e 20 49 4e 53 45 52 54 20 64 6f 65  ** an INSERT doe
10b0: 73 20 6e 6f 74 20 6f 70 65 6e 20 61 20 73 74 61  s not open a sta
10c0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  on..**.** TODO: 
10e0: 48 6f 77 20 73 68 6f 75 6c 64 20 64 72 6f 70 70  How should dropp
10f0: 69 6e 67 20 61 20 74 61 62 6c 65 20 62 65 20 68  ing a table be h
1100: 61 6e 64 6c 65 64 3f 20 48 6f 77 20 73 68 6f 75  andled? How shou
1110: 6c 64 20 72 65 6e 61 6d 69 6e 67 20 61 20 0a 2a  ld renaming a .*
1120: 2a 20 74 61 62 6c 65 20 62 65 20 68 61 6e 64 6c  * table be handl
1130: 65 64 3f 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 51 75 65  ed?.**.**.** Que
1140: 72 79 20 41 50 49 20 4e 6f 74 65 73 0a 2a 2a 20  ry API Notes.** 
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1160: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63 6f 64  **.** Before cod
1170: 69 6e 67 20 61 6e 20 55 50 44 41 54 45 20 6f 72  ing an UPDATE or
1180: 20 44 45 4c 45 54 45 20 72 6f 77 20 6f 70 65 72   DELETE row oper
1190: 61 74 69 6f 6e 2c 20 74 68 65 20 63 6f 64 65 2d  ation, the code-
11a0: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 66 6f 72  generator.** for
11b0: 20 74 68 6f 73 65 20 74 77 6f 20 6f 70 65 72 61   those two opera
11c0: 74 69 6f 6e 73 20 6e 65 65 64 73 20 74 6f 20 6b  tions needs to k
11d0: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
11e0: 6f 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  ot the operation
11f0: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 61 6e 79  .** requires any
1200: 20 46 4b 20 70 72 6f 63 65 73 73 69 6e 67 20 61   FK processing a
1210: 6e 64 2c 20 69 66 20 73 6f 2c 20 77 68 69 63 68  nd, if so, which
1220: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1230: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 72 6f 77 20  original.** row 
1240: 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  are required by 
1250: 74 68 65 20 46 4b 20 70 72 6f 63 65 73 73 69 6e  the FK processin
1260: 67 20 56 44 42 45 20 63 6f 64 65 20 28 69 2e 65  g VDBE code (i.e
1270: 2e 20 69 66 20 46 4b 73 20 77 65 72 65 0a 2a 2a  . if FKs were.**
1280: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
1290: 6e 67 20 74 72 69 67 67 65 72 73 2c 20 77 68 69  ng triggers, whi
12a0: 63 68 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  ch of the old.* 
12b0: 63 6f 6c 75 6d 6e 73 20 77 6f 75 6c 64 20 62 65  columns would be
12c0: 20 0a 2a 2a 20 61 63 63 65 73 73 65 64 29 2e 20   .** accessed). 
12d0: 4e 6f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  No information i
12e0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
12f0: 65 20 63 6f 64 65 2d 67 65 6e 65 72 61 74 6f 72  e code-generator
1300: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 69 6e   before.** codin
1310: 67 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  g an INSERT oper
1320: 61 74 69 6f 6e 2e 20 54 68 65 20 66 75 6e 63 74  ation. The funct
1330: 69 6f 6e 73 20 75 73 65 64 20 62 79 20 74 68 65  ions used by the
1340: 20 55 50 44 41 54 45 2f 44 45 4c 45 54 45 0a 2a   UPDATE/DELETE.*
1350: 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 64  * generation cod
1360: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
1370: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1380: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  are:.**.**   sql
1390: 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 29  ite3FkRequired()
13a0: 20 2d 20 54 65 73 74 20 74 6f 20 73 65 65 20 69   - Test to see i
13b0: 66 20 46 4b 20 70 72 6f 63 65 73 73 69 6e 67 20  f FK processing 
13c0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  is required..** 
13d0: 20 20 73 71 6c 69 74 65 33 46 6b 4f 6c 64 6d 61    sqlite3FkOldma
13e0: 73 6b 28 29 20 20 2d 20 51 75 65 72 79 20 66 6f  sk()  - Query fo
13f0: 72 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 71  r the set of req
1400: 75 69 72 65 64 20 6f 6c 64 2e 2a 20 63 6f 6c 75  uired old.* colu
1410: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 78  mns..**.**.** Ex
1420: 74 65 72 6e 61 6c 6c 79 20 61 63 63 65 73 73 69  ternally accessi
1430: 62 6c 65 20 6d 6f 64 75 6c 65 20 66 75 6e 63 74  ble module funct
1440: 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1470: 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 6b  *.**   sqlite3Fk
1480: 43 68 65 63 6b 28 29 20 20 20 20 2d 20 43 68 65  Check()    - Che
1490: 63 6b 20 66 6f 72 20 66 6f 72 65 69 67 6e 20 6b  ck for foreign k
14a0: 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 0a 2a  ey violations..*
14b0: 2a 20 20 20 73 71 6c 69 74 65 33 46 6b 41 63 74  *   sqlite3FkAct
14c0: 69 6f 6e 73 28 29 20 20 2d 20 43 6f 64 65 20 74  ions()  - Code t
14d0: 72 69 67 67 65 72 73 20 66 6f 72 20 4f 4e 20 55  riggers for ON U
14e0: 50 44 41 54 45 2f 4f 4e 20 44 45 4c 45 54 45 20  PDATE/ON DELETE 
14f0: 61 63 74 69 6f 6e 73 2e 0a 2a 2a 20 20 20 73 71  actions..**   sq
1500: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 29 20  lite3FkDelete() 
1510: 20 20 2d 20 44 65 6c 65 74 65 20 61 6e 20 46 4b    - Delete an FK
1520: 65 79 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ey structure..*/
1530: 0a 0a 2f 2a 0a 2a 2a 20 56 44 42 45 20 43 61 6c  ../*.** VDBE Cal
1540: 6c 69 6e 67 20 43 6f 6e 76 65 6e 74 69 6f 6e 0a  ling Convention.
1550: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
1570: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
1580: 20 20 46 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77    For the follow
1590: 69 6e 67 20 49 4e 53 45 52 54 20 73 74 61 74 65  ing INSERT state
15a0: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
15b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
15c0: 61 2c 20 62 20 49 4e 54 45 47 45 52 20 50 52 49  a, b INTEGER PRI
15d0: 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b 0a 2a 2a  MARY KEY, c);.**
15e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
15f0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   t1 VALUES(1, 2,
1600: 20 33 2e 31 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 52   3.1);.**.**   R
1610: 65 67 69 73 74 65 72 20 28 78 29 3a 20 20 20 20  egister (x):    
1620: 20 20 20 20 32 20 20 20 20 28 74 79 70 65 20 69      2    (type i
1630: 6e 74 65 67 65 72 29 0a 2a 2a 20 20 20 52 65 67  nteger).**   Reg
1640: 69 73 74 65 72 20 28 78 2b 31 29 3a 20 20 20 20  ister (x+1):    
1650: 20 20 31 20 20 20 20 28 74 79 70 65 20 69 6e 74    1    (type int
1660: 65 67 65 72 29 0a 2a 2a 20 20 20 52 65 67 69 73  eger).**   Regis
1670: 74 65 72 20 28 78 2b 32 29 3a 20 20 20 20 20 20  ter (x+2):      
1680: 4e 55 4c 4c 20 28 74 79 70 65 20 4e 55 4c 4c 29  NULL (type NULL)
1690: 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20 28  .**   Register (
16a0: 78 2b 33 29 3a 20 20 20 20 20 20 33 2e 31 20 20  x+3):      3.1  
16b0: 28 74 79 70 65 20 72 65 61 6c 29 0a 2a 2f 0a 0a  (type real).*/..
16c0: 2f 2a 0a 2a 2a 20 41 20 66 6f 72 65 69 67 6e 20  /*.** A foreign 
16d0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  key constraint r
16e0: 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
16f0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
1700: 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 74 61  the parent.** ta
1710: 62 6c 65 20 61 72 65 20 63 6f 6c 6c 65 63 74 69  ble are collecti
1720: 76 65 6c 79 20 73 75 62 6a 65 63 74 20 74 6f 20  vely subject to 
1730: 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1740: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1750: 6e 74 2e 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61  nt..** Given tha
1760: 74 20 70 50 61 72 65 6e 74 20 69 73 20 74 68 65  t pParent is the
1770: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 66 6f   parent table fo
1780: 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  r foreign key co
1790: 6e 73 74 72 61 69 6e 74 20 70 46 4b 65 79 2c 20  nstraint pFKey, 
17a0: 0a 2a 2a 20 73 65 61 72 63 68 20 74 68 65 20 73  .** search the s
17b0: 63 68 65 6d 61 20 66 6f 72 20 61 20 75 6e 69 71  chema for a uniq
17c0: 75 65 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  ue index on the 
17d0: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
17e0: 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ns. .**.** If su
17f0: 63 63 65 73 73 66 75 6c 2c 20 7a 65 72 6f 20 69  ccessful, zero i
1800: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
1810: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73  he parent key is
1820: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
1830: 41 52 59 20 0a 2a 2a 20 4b 45 59 20 63 6f 6c 75  ARY .** KEY colu
1840: 6d 6e 2c 20 74 68 65 6e 20 6f 75 74 70 75 74 20  mn, then output 
1850: 76 61 72 69 61 62 6c 65 20 2a 70 70 49 64 78 20  variable *ppIdx 
1860: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
1870: 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 49 64  Otherwise, *ppId
1880: 78 20 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  x .** is set to 
1890: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 75 6e 69  point to the uni
18a0: 71 75 65 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 0a  que index. .** .
18b0: 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
18c0: 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f 66   key consists of
18d0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
18e0: 20 28 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65   (the foreign ke
18f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
1900: 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 73 69  is not a composi
1910: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 29 2c  te foreign key),
1920: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1930: 20 2a 70 61 69 43 6f 6c 20 69 73 20 73 65 74 20   *paiCol is set 
1940: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 20 4f 74 68 65  to NULL..** Othe
1950: 72 77 69 73 65 2c 20 69 74 20 69 73 20 73 65 74  rwise, it is set
1960: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20   to point to an 
1970: 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79 20  allocated array 
1980: 6f 66 20 73 69 7a 65 20 4e 2c 20 77 68 65 72 65  of size N, where
1990: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  .** N is the num
19a0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
19b0: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  n the parent key
19c0: 2e 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  . The first elem
19d0: 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 72  ent of the.** ar
19e0: 72 61 79 20 69 73 20 74 68 65 20 69 6e 64 65 78  ray is the index
19f0: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 61   of the child ta
1a00: 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
1a10: 69 73 20 6d 61 70 70 65 64 20 62 79 20 74 68 65  is mapped by the
1a20: 20 46 4b 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e   FK.** constrain
1a30: 74 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  t to the parent 
1a40: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 73 74 6f  table column sto
1a50: 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74 2d  red in the left-
1a60: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  most column.** o
1a70: 66 20 69 6e 64 65 78 20 2a 70 70 49 64 78 2e 20  f index *ppIdx. 
1a80: 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  The second eleme
1a90: 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  nt of the array 
1aa0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1ab0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 20 74 61 62  the.** child tab
1ac0: 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 63  le column that c
1ad0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1ae0: 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
1af0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  st column of.** 
1b00: 2a 70 70 49 64 78 2c 20 61 6e 64 20 73 6f 20 6f  *ppIdx, and so o
1b10: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1b20: 72 65 71 75 69 72 65 64 20 69 6e 64 65 78 20 63  required index c
1b30: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
1b40: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 3a 0a  either because:.
1b50: 2a 2a 0a 2a 2a 20 20 20 31 29 20 54 68 65 20 6e  **.**   1) The n
1b60: 61 6d 65 64 20 70 61 72 65 6e 74 20 6b 65 79 20  amed parent key 
1b70: 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65  columns do not e
1b80: 78 69 73 74 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  xist, or.**.**  
1b90: 20 32 29 20 54 68 65 20 6e 61 6d 65 64 20 70 61   2) The named pa
1ba0: 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  rent key columns
1bb0: 20 64 6f 20 65 78 69 73 74 2c 20 62 75 74 20 61   do exist, but a
1bc0: 72 65 20 6e 6f 74 20 73 75 62 6a 65 63 74 20 74  re not subject t
1bd0: 6f 20 61 0a 2a 2a 20 20 20 20 20 20 55 4e 49 51  o a.**      UNIQ
1be0: 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1bf0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  Y constraint, or
1c00: 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 4e 6f 20 70  .**.**   3) No p
1c10: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
1c20: 73 20 77 65 72 65 20 70 72 6f 76 69 64 65 64 20  s were provided 
1c30: 65 78 70 6c 69 63 69 74 6c 79 20 61 73 20 70 61  explicitly as pa
1c40: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  rt of the.**    
1c50: 20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65    foreign key de
1c60: 66 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 74 68  finition, and th
1c70: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64  e parent table d
1c80: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 2a  oes not have a.*
1c90: 2a 20 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b  *      PRIMARY K
1ca0: 45 59 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 34  EY, or.**.**   4
1cb0: 29 20 4e 6f 20 70 61 72 65 6e 74 20 6b 65 79 20  ) No parent key 
1cc0: 63 6f 6c 75 6d 6e 73 20 77 65 72 65 20 70 72 6f  columns were pro
1cd0: 76 69 64 65 64 20 65 78 70 6c 69 63 69 74 6c 79  vided explicitly
1ce0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1cf0: 2a 2a 20 20 20 20 20 20 66 6f 72 65 69 67 6e 20  **      foreign 
1d00: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  key definition, 
1d10: 61 6e 64 20 74 68 65 20 50 52 49 4d 41 52 59 20  and the PRIMARY 
1d20: 4b 45 59 20 6f 66 20 74 68 65 20 70 61 72 65 6e  KEY of the paren
1d30: 74 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20  t table .**     
1d40: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 64   consists of a d
1d50: 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
1d60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  of columns to th
1d70: 65 20 63 68 69 6c 64 20 6b 65 79 20 69 6e 20 0a  e child key in .
1d80: 2a 2a 20 20 20 20 20 20 74 68 65 20 63 68 69 6c  **      the chil
1d90: 64 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 74  d table..**.** t
1da0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  hen non-zero is 
1db0: 72 65 74 75 72 6e 65 64 2c 20 61 6e 64 20 61 20  returned, and a 
1dc0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
1dd0: 6d 61 74 63 68 22 20 65 72 72 6f 72 20 6c 6f 61  match" error loa
1de0: 64 65 64 0a 2a 2a 20 69 6e 74 6f 20 70 50 61 72  ded.** into pPar
1df0: 73 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  se. If an OOM er
1e00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6e 6f 6e 2d  ror occurs, non-
1e10: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1e20: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 70 50 61 72   and the.** pPar
1e30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1e40: 69 6c 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  iled flag is set
1e50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e60: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 0a 20  FkLocateIndex(. 
1e70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1ea0: 74 20 74 6f 20 73 74 6f 72 65 20 61 6e 79 20 65  t to store any e
1eb0: 72 72 6f 72 20 69 6e 20 2a 2f 0a 20 20 54 61 62  rror in */.  Tab
1ec0: 6c 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  le *pParent,    
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee0: 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  Parent table of 
1ef0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 46  FK constraint pF
1f00: 4b 65 79 20 2a 2f 0a 20 20 46 4b 65 79 20 2a 70  Key */.  FKey *p
1f10: 46 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  FKey,           
1f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65           /* Fore
1f30: 69 67 6e 20 6b 65 79 20 74 6f 20 66 69 6e 64 20  ign key to find 
1f40: 69 6e 64 65 78 20 66 6f 72 20 2a 2f 0a 20 20 49  index for */.  I
1f50: 6e 64 65 78 20 2a 2a 70 70 49 64 78 2c 20 20 20  ndex **ppIdx,   
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f70: 2a 20 4f 55 54 3a 20 55 6e 69 71 75 65 20 69 6e  * OUT: Unique in
1f80: 64 65 78 20 6f 6e 20 70 61 72 65 6e 74 20 74 61  dex on parent ta
1f90: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 2a 70  ble */.  int **p
1fa0: 61 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  aiCol           
1fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1fc0: 20 4d 61 70 20 6f 66 20 69 6e 64 65 78 20 63 6f   Map of index co
1fd0: 6c 75 6d 6e 73 20 69 6e 20 70 46 4b 65 79 20 2a  lumns in pFKey *
1fe0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  /.){.  Index *pI
1ff0: 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
2000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2010: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
2020: 61 20 2a 70 70 49 64 78 20 2a 2f 0a 20 20 69 6e  a *ppIdx */.  in
2030: 74 20 2a 61 69 43 6f 6c 20 3d 20 30 3b 20 20 20  t *aiCol = 0;   
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2060: 74 75 72 6e 20 76 69 61 20 2a 70 61 69 43 6f 6c  turn via *paiCol
2070: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
2080: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3b 20 20 20   pFKey->nCol;   
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20a0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
20b0: 6e 20 70 61 72 65 6e 74 20 6b 65 79 20 2a 2f 0a  n parent key */.
20c0: 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70    char *zKey = p
20d0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 7a 43  FKey->aCol[0].zC
20e0: 6f 6c 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ol;   /* Name of
20f0: 20 6c 65 66 74 2d 6d 6f 73 74 20 70 61 72 65 6e   left-most paren
2100: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  t key column */.
2110: 0a 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 65 72  .  /* The caller
2120: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2130: 66 6f 72 20 7a 65 72 6f 69 6e 67 20 6f 75 74 70  for zeroing outp
2140: 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 20 2a  ut parameters. *
2150: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 70 49 64  /.  assert( ppId
2160: 78 20 26 26 20 2a 70 70 49 64 78 3d 3d 30 20 29  x && *ppIdx==0 )
2170: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 69  ;.  assert( !pai
2180: 43 6f 6c 20 7c 7c 20 2a 70 61 69 43 6f 6c 3d 3d  Col || *paiCol==
2190: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
21a0: 50 61 72 73 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  Parse );..  /* I
21b0: 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d  f this is a non-
21c0: 63 6f 6d 70 6f 73 69 74 65 20 28 73 69 6e 67 6c  composite (singl
21d0: 65 20 63 6f 6c 75 6d 6e 29 20 66 6f 72 65 69 67  e column) foreig
21e0: 6e 20 6b 65 79 2c 20 63 68 65 63 6b 20 69 66 20  n key, check if 
21f0: 69 74 20 0a 20 20 2a 2a 20 6d 61 70 73 20 74 6f  it .  ** maps to
2200: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
2210: 4d 41 52 59 20 4b 45 59 20 6f 66 20 74 61 62 6c  MARY KEY of tabl
2220: 65 20 70 50 61 72 65 6e 74 2e 20 49 66 20 73 6f  e pParent. If so
2230: 2c 20 6c 65 61 76 65 20 2a 70 70 49 64 78 20 0a  , leave *ppIdx .
2240: 20 20 2a 2a 20 61 6e 64 20 2a 70 61 69 43 6f 6c    ** and *paiCol
2250: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
2260: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 0a   return early. .
2270: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77    **.  ** Otherw
2280: 69 73 65 2c 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ise, for a compo
2290: 73 69 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  site foreign key
22a0: 20 28 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   (more than one 
22b0: 63 6f 6c 75 6d 6e 29 2c 20 61 6c 6c 6f 63 61 74  column), allocat
22c0: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
22d0: 20 74 68 65 20 61 69 43 6f 6c 20 61 72 72 61 79   the aiCol array
22e0: 20 28 72 65 74 75 72 6e 65 64 20 76 69 61 20 6f   (returned via o
22f0: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
2300: 2a 70 61 69 43 6f 6c 29 2e 0a 20 20 2a 2a 20 4e  *paiCol)..  ** N
2310: 6f 6e 2d 63 6f 6d 70 6f 73 69 74 65 20 66 6f 72  on-composite for
2320: 65 69 67 6e 20 6b 65 79 73 20 64 6f 20 6e 6f 74  eign keys do not
2330: 20 72 65 71 75 69 72 65 20 74 68 65 20 61 69 43   require the aiC
2340: 6f 6c 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20  ol array..  */. 
2350: 20 69 66 28 20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a   if( nCol==1 ){.
2360: 20 20 20 20 2f 2a 20 54 68 65 20 46 4b 20 6d 61      /* The FK ma
2370: 70 73 20 74 6f 20 74 68 65 20 49 50 4b 20 69 66  ps to the IPK if
2380: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2390: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
23b0: 31 29 20 54 68 65 72 65 20 69 73 20 61 6e 20 49  1) There is an I
23c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
23d0: 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68  EY column and th
23e0: 65 20 46 4b 20 69 73 20 69 6d 70 6c 69 63 69 74  e FK is implicit
23f0: 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ly .    **      
2400: 6d 61 70 70 65 64 20 74 6f 20 74 68 65 20 70 72  mapped to the pr
2410: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 61 62  imary key of tab
2420: 6c 65 20 70 50 61 72 65 6e 74 2c 20 6f 72 0a 20  le pParent, or. 
2430: 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 46     **   2) The F
2440: 4b 20 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20  K is explicitly 
2450: 6d 61 70 70 65 64 20 74 6f 20 61 20 63 6f 6c 75  mapped to a colu
2460: 6d 6e 20 64 65 63 6c 61 72 65 64 20 61 73 20 49  mn declared as I
2470: 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20 20 20  NTEGER.    **   
2480: 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a     PRIMARY KEY..
2490: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
24a0: 50 61 72 65 6e 74 2d 3e 69 50 4b 65 79 3e 3d 30  Parent->iPKey>=0
24b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   ){.      if( !z
24c0: 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Key ) return 0;.
24d0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
24e0: 65 33 53 74 72 49 43 6d 70 28 70 50 61 72 65 6e  e3StrICmp(pParen
24f0: 74 2d 3e 61 43 6f 6c 5b 70 50 61 72 65 6e 74 2d  t->aCol[pParent-
2500: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 2c 20 7a  >iPKey].zName, z
2510: 4b 65 79 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Key) ) return 0;
2520: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2530: 66 28 20 70 61 69 43 6f 6c 20 29 7b 0a 20 20 20  f( paiCol ){.   
2540: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3e 31 20   assert( nCol>1 
2550: 29 3b 0a 20 20 20 20 61 69 43 6f 6c 20 3d 20 28  );.    aiCol = (
2560: 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  int *)sqlite3DbM
2570: 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  allocRaw(pParse-
2580: 3e 64 62 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  >db, nCol*sizeof
2590: 28 69 6e 74 29 29 3b 0a 20 20 20 20 69 66 28 20  (int));.    if( 
25a0: 21 61 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  !aiCol ) return 
25b0: 31 3b 0a 20 20 20 20 2a 70 61 69 43 6f 6c 20 3d  1;.    *paiCol =
25c0: 20 61 69 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 66   aiCol;.  }..  f
25d0: 6f 72 28 70 49 64 78 3d 70 50 61 72 65 6e 74 2d  or(pIdx=pParent-
25e0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
25f0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2600: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
2610: 6e 4b 65 79 43 6f 6c 3d 3d 6e 43 6f 6c 20 26 26  nKeyCol==nCol &&
2620: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
2630: 49 64 78 29 20 29 7b 20 0a 20 20 20 20 20 20 2f  Idx) ){ .      /
2640: 2a 20 70 49 64 78 20 69 73 20 61 20 55 4e 49 51  * pIdx is a UNIQ
2650: 55 45 20 69 6e 64 65 78 20 28 6f 72 20 61 20 50  UE index (or a P
2660: 52 49 4d 41 52 59 20 4b 45 59 29 20 61 6e 64 20  RIMARY KEY) and 
2670: 68 61 73 20 74 68 65 20 72 69 67 68 74 20 6e 75  has the right nu
2680: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
2690: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 65 61 63   columns. If eac
26a0: 68 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  h indexed column
26b0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
26c0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 20 20  a foreign key.  
26d0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66      ** column of
26e0: 20 70 46 4b 65 79 2c 20 74 68 65 6e 20 74 68 69   pFKey, then thi
26f0: 73 20 69 6e 64 65 78 20 69 73 20 61 20 77 69 6e  s index is a win
2700: 6e 65 72 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20  ner.  */..      
2710: 69 66 28 20 7a 4b 65 79 3d 3d 30 20 29 7b 0a 20  if( zKey==0 ){. 
2720: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 4b 65         /* If zKe
2730: 79 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  y is NULL, then 
2740: 74 68 69 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  this foreign key
2750: 20 69 73 20 69 6d 70 6c 69 63 69 74 6c 79 20 6d   is implicitly m
2760: 61 70 70 65 64 20 74 6f 20 0a 20 20 20 20 20 20  apped to .      
2770: 20 20 2a 2a 20 74 68 65 20 50 52 49 4d 41 52 59    ** the PRIMARY
2780: 20 4b 45 59 20 6f 66 20 74 61 62 6c 65 20 70 50   KEY of table pP
2790: 61 72 65 6e 74 2e 20 54 68 65 20 50 52 49 4d 41  arent. The PRIMA
27a0: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6d 61 79  RY KEY index may
27b0: 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
27c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
27d0: 65 20 74 65 73 74 2e 20 20 2a 2f 0a 20 20 20 20  e test.  */.    
27e0: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
27f0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
2800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2810: 20 61 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20   aiCol ){.      
2820: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2830: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2840: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61  ; i<nCol; i++) a
2850: 69 43 6f 6c 5b 69 5d 20 3d 20 70 46 4b 65 79 2d  iCol[i] = pFKey-
2860: 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 3b 0a  >aCol[i].iFrom;.
2870: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
28a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
28b0: 66 20 7a 4b 65 79 20 69 73 20 6e 6f 6e 2d 4e 55  f zKey is non-NU
28c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 6f  LL, then this fo
28d0: 72 65 69 67 6e 20 6b 65 79 20 77 61 73 20 64 65  reign key was de
28e0: 63 6c 61 72 65 64 20 74 6f 0a 20 20 20 20 20 20  clared to.      
28f0: 20 20 2a 2a 20 6d 61 70 20 74 6f 20 61 6e 20 65    ** map to an e
2900: 78 70 6c 69 63 69 74 20 6c 69 73 74 20 6f 66 20  xplicit list of 
2910: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
2920: 20 70 50 61 72 65 6e 74 2e 20 43 68 65 63 6b 20   pParent. Check 
2930: 69 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  if this.        
2940: 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68 65 73  ** index matches
2950: 20 74 68 6f 73 65 20 63 6f 6c 75 6d 6e 73 2e 20   those columns. 
2960: 41 6c 73 6f 2c 20 63 68 65 63 6b 20 74 68 61 74  Also, check that
2970: 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 73 0a   the index uses.
2980: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
2990: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
29a0: 20 73 65 71 75 65 6e 63 65 73 20 66 6f 72 20 65   sequences for e
29b0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  ach column. */. 
29c0: 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b         int i, j;
29d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
29e0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
29f0: 20 20 20 20 20 20 20 20 20 20 69 31 36 20 69 43            i16 iC
2a00: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
2a10: 75 6d 6e 5b 69 5d 3b 20 20 20 20 20 2f 2a 20 49  umn[i];     /* I
2a20: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2a30: 6e 20 70 61 72 65 6e 74 20 74 62 6c 20 2a 2f 0a  n parent tbl */.
2a40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2a50: 7a 44 66 6c 74 43 6f 6c 6c 3b 20 20 20 20 20 20  zDfltColl;      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a70: 65 66 2e 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 6f  ef. collation fo
2a80: 72 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  r column */.    
2a90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 64 78        char *zIdx
2aa0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ac0: 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  of indexed colum
2ad0: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
2ae0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
2af0: 75 73 65 73 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  uses a collation
2b00: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 69   sequence that i
2b10: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
2b20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2b30: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
2b40: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2b50: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 69   the column, thi
2b60: 73 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  s index is.     
2b70: 20 20 20 20 20 2a 2a 20 75 6e 75 73 61 62 6c 65       ** unusable
2b80: 2e 20 42 61 69 6c 20 6f 75 74 20 65 61 72 6c 79  . Bail out early
2b90: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
2ba0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 44 66  */.          zDf
2bb0: 6c 74 43 6f 6c 6c 20 3d 20 70 50 61 72 65 6e 74  ltColl = pParent
2bc0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
2bd0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ll;.          if
2be0: 28 20 21 7a 44 66 6c 74 43 6f 6c 6c 20 29 7b 0a  ( !zDfltColl ){.
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 66 6c              zDfl
2c00: 74 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22  tColl = "BINARY"
2c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c20: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2c30: 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
2c40: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 20 7a 44 66 6c  >azColl[i], zDfl
2c50: 74 43 6f 6c 6c 29 20 29 20 62 72 65 61 6b 3b 0a  tColl) ) break;.
2c60: 0a 20 20 20 20 20 20 20 20 20 20 7a 49 64 78 43  .          zIdxC
2c70: 6f 6c 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 43  ol = pParent->aC
2c80: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
2c90: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2ca0: 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  0; j<nCol; j++){
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2cc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2cd0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  pFKey->aCol[j].z
2ce0: 43 6f 6c 2c 20 7a 49 64 78 43 6f 6c 29 3d 3d 30  Col, zIdxCol)==0
2cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d00: 20 20 69 66 28 20 61 69 43 6f 6c 20 29 20 61 69    if( aiCol ) ai
2d10: 43 6f 6c 5b 69 5d 20 3d 20 70 46 4b 65 79 2d 3e  Col[i] = pFKey->
2d20: 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20  aCol[j].iFrom;. 
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2d40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2d50: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2d60: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
2d70: 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Col ) break;.   
2d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d90: 66 28 20 69 3d 3d 6e 43 6f 6c 20 29 20 62 72 65  f( i==nCol ) bre
2da0: 61 6b 3b 20 20 20 20 20 20 2f 2a 20 70 49 64 78  ak;      /* pIdx
2db0: 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20   is usable */.  
2dc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2dd0: 0a 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a  .  if( !pIdx ){.
2de0: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
2df0: 3e 64 69 73 61 62 6c 65 54 72 69 67 67 65 72 73  >disableTriggers
2e00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2e20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 6f  ,.           "fo
2e30: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
2e40: 63 68 20 2d 20 5c 22 25 77 5c 22 20 72 65 66 65  ch - \"%w\" refe
2e50: 72 65 6e 63 69 6e 67 20 5c 22 25 77 5c 22 22 2c  rencing \"%w\"",
2e60: 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  .           pFKe
2e70: 79 2d 3e 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  y->pFrom->zName,
2e80: 20 70 46 4b 65 79 2d 3e 7a 54 6f 29 3b 0a 20 20   pFKey->zTo);.  
2e90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
2ea0: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
2eb0: 2c 20 61 69 43 6f 6c 29 3b 0a 20 20 20 20 72 65  , aiCol);.    re
2ec0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2a  turn 1;.  }..  *
2ed0: 70 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  ppIdx = pIdx;.  
2ee0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2ef0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2f10: 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  a row is inserte
2f20: 64 20 69 6e 74 6f 20 6f 72 20 64 65 6c 65 74 65  d into or delete
2f30: 64 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 63  d from the .** c
2f40: 68 69 6c 64 20 74 61 62 6c 65 20 6f 66 20 66 6f  hild table of fo
2f50: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
2f60: 61 69 6e 74 20 70 46 4b 65 79 2e 20 49 66 20 61  aint pFKey. If a
2f70: 6e 20 53 51 4c 20 55 50 44 41 54 45 20 69 73 20  n SQL UPDATE is 
2f80: 65 78 65 63 75 74 65 64 20 0a 2a 2a 20 6f 6e 20  executed .** on 
2f90: 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
2fa0: 6f 66 20 70 46 4b 65 79 2c 20 74 68 69 73 20 66  of pFKey, this f
2fb0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
2fc0: 65 64 20 74 77 69 63 65 20 66 6f 72 20 65 61 63  ed twice for eac
2fd0: 68 20 72 6f 77 0a 2a 2a 20 61 66 66 65 63 74 65  h row.** affecte
2fe0: 64 20 2d 20 6f 6e 63 65 20 74 6f 20 22 64 65 6c  d - once to "del
2ff0: 65 74 65 22 20 74 68 65 20 6f 6c 64 20 72 6f 77  ete" the old row
3000: 2c 20 61 6e 64 20 74 68 65 6e 20 61 67 61 69 6e  , and then again
3010: 20 74 6f 20 22 69 6e 73 65 72 74 22 20 74 68 65   to "insert" the
3020: 0a 2a 2a 20 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a  .** new row..**.
3030: 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 69 74 20  ** Each time it 
3040: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 69 73 20  is called, this 
3050: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
3060: 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
3070: 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 72 6f  locate the.** ro
3080: 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  w in the parent 
3090: 74 61 62 6c 65 20 74 68 61 74 20 63 6f 72 72 65  table that corre
30a0: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 72 6f  sponds to the ro
30b0: 77 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  w being inserted
30c0: 20 69 6e 74 6f 20 0a 2a 2a 20 6f 72 20 64 65 6c   into .** or del
30d0: 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68  eted from the ch
30e0: 69 6c 64 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ild table. If th
30f0: 65 20 70 61 72 65 6e 74 20 72 6f 77 20 63 61 6e  e parent row can
3100: 20 62 65 20 66 6f 75 6e 64 2c 20 6e 6f 20 0a 2a   be found, no .*
3110: 2a 20 73 70 65 63 69 61 6c 20 61 63 74 69 6f 6e  * special action
3120: 20 69 73 20 74 61 6b 65 6e 2e 20 4f 74 68 65 72   is taken. Other
3130: 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 72  wise, if the par
3140: 65 6e 74 20 72 6f 77 20 63 61 6e 20 2a 6e 6f 74  ent row can *not
3150: 2a 20 62 65 0a 2a 2a 20 66 6f 75 6e 64 20 69 6e  * be.** found in
3160: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
3170: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 65 72 61  e:.**.**   Opera
3180: 74 69 6f 6e 20 7c 20 46 4b 20 74 79 70 65 20 20  tion | FK type  
3190: 20 7c 20 41 63 74 69 6f 6e 20 74 61 6b 65 6e 0a   | Action taken.
31a0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
31f0: 2a 2a 20 20 20 49 4e 53 45 52 54 20 20 20 20 20  **   INSERT     
3200: 20 69 6d 6d 65 64 69 61 74 65 20 20 20 49 6e 63   immediate   Inc
3210: 72 65 6d 65 6e 74 20 74 68 65 20 22 69 6d 6d 65  rement the "imme
3220: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
3230: 20 63 6f 75 6e 74 65 72 22 2e 0a 2a 2a 0a 2a 2a   counter"..**.**
3240: 20 20 20 44 45 4c 45 54 45 20 20 20 20 20 20 69     DELETE      i
3250: 6d 6d 65 64 69 61 74 65 20 20 20 44 65 63 72 65  mmediate   Decre
3260: 6d 65 6e 74 20 74 68 65 20 22 69 6d 6d 65 64 69  ment the "immedi
3270: 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ate constraint c
3280: 6f 75 6e 74 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 20  ounter"..**.**  
3290: 20 49 4e 53 45 52 54 20 20 20 20 20 20 64 65 66   INSERT      def
32a0: 65 72 72 65 64 20 20 20 20 49 6e 63 72 65 6d 65  erred    Increme
32b0: 6e 74 20 74 68 65 20 22 64 65 66 65 72 72 65 64  nt the "deferred
32c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
32d0: 74 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 45  ter"..**.**   DE
32e0: 4c 45 54 45 20 20 20 20 20 20 64 65 66 65 72 72  LETE      deferr
32f0: 65 64 20 20 20 20 44 65 63 72 65 6d 65 6e 74 20  ed    Decrement 
3300: 74 68 65 20 22 64 65 66 65 72 72 65 64 20 63 6f  the "deferred co
3310: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
3320: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 6f  "..**.** These o
3330: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 69 64  perations are id
3340: 65 6e 74 69 66 69 65 64 20 69 6e 20 74 68 65 20  entified in the 
3350: 63 6f 6d 6d 65 6e 74 20 61 74 20 74 68 65 20 74  comment at the t
3360: 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  op of this file 
3370: 0a 2a 2a 20 28 66 6b 65 79 2e 63 29 20 61 73 20  .** (fkey.c) as 
3380: 22 49 2e 31 22 20 61 6e 64 20 22 44 2e 31 22 2e  "I.1" and "D.1".
3390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
33a0: 66 6b 4c 6f 6f 6b 75 70 50 61 72 65 6e 74 28 0a  fkLookupParent(.
33b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
33d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
33e0: 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
33f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
3400: 64 61 74 61 62 61 73 65 20 68 6f 75 73 69 6e 67  database housing
3410: 20 70 54 61 62 20 2a 2f 0a 20 20 54 61 62 6c 65   pTab */.  Table
3420: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
3430: 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65   /* Parent table
3440: 20 6f 66 20 46 4b 20 70 46 4b 65 79 20 2a 2f 0a   of FK pFKey */.
3450: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
3460: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
3470: 65 20 69 6e 64 65 78 20 6f 6e 20 70 61 72 65 6e  e index on paren
3480: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  t key columns in
3490: 20 70 54 61 62 20 2a 2f 0a 20 20 46 4b 65 79 20   pTab */.  FKey 
34a0: 2a 70 46 4b 65 79 2c 20 20 20 20 20 20 20 20 20  *pFKey,         
34b0: 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79 20   /* Foreign key 
34c0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
34d0: 69 6e 74 20 2a 61 69 43 6f 6c 2c 20 20 20 20 20  int *aiCol,     
34e0: 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
34f0: 6d 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  m parent key col
3500: 75 6d 6e 73 20 74 6f 20 63 68 69 6c 64 20 74 61  umns to child ta
3510: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ble columns */. 
3520: 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20   int regData,   
3530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
3540: 73 20 6f 66 20 61 72 72 61 79 20 63 6f 6e 74 61  s of array conta
3550: 69 6e 69 6e 67 20 63 68 69 6c 64 20 74 61 62 6c  ining child tabl
3560: 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6e  e row */.  int n
3570: 49 6e 63 72 2c 20 20 20 20 20 20 20 20 20 20 20  Incr,           
3580: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 63 6f   /* Increment co
3590: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
35a0: 20 62 79 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e   by this */.  in
35b0: 74 20 69 73 49 67 6e 6f 72 65 20 20 20 20 20 20  t isIgnore      
35c0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
35d0: 70 72 65 74 65 6e 64 20 70 54 61 62 20 63 6f 6e  pretend pTab con
35e0: 74 61 69 6e 73 20 61 6c 6c 20 4e 55 4c 4c 20 76  tains all NULL v
35f0: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
3600: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
3630: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
3640: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
3650: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
3660: 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56  e);         /* V
3670: 64 62 65 20 74 6f 20 61 64 64 20 63 6f 64 65 20  dbe to add code 
3680: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  to */.  int iCur
3690: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   = pParse->nTab 
36a0: 2d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  - 1;            
36b0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
36c0: 65 72 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  er to use */.  i
36d0: 6e 74 20 69 4f 6b 20 3d 20 73 71 6c 69 74 65 33  nt iOk = sqlite3
36e0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
36f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  ;        /* jump
3700: 20 68 65 72 65 20 69 66 20 70 61 72 65 6e 74 20   here if parent 
3710: 6b 65 79 20 66 6f 75 6e 64 20 2a 2f 0a 0a 20 20  key found */..  
3720: 2f 2a 20 49 66 20 6e 49 6e 63 72 20 69 73 20 6c  /* If nIncr is l
3730: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
3740: 68 65 6e 20 63 68 65 63 6b 20 61 74 20 72 75 6e  hen check at run
3750: 74 69 6d 65 20 69 66 20 74 68 65 72 65 20 61 72  time if there ar
3760: 65 20 61 6e 79 0a 20 20 2a 2a 20 6f 75 74 73 74  e any.  ** outst
3770: 61 6e 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  anding constrain
3780: 74 73 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 49  ts to resolve. I
3790: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 74 2c  f there are not,
37a0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
37b0: 64 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63 6b 20  d.  ** to check 
37c0: 69 66 20 64 65 6c 65 74 69 6e 67 20 74 68 69 73  if deleting this
37d0: 20 72 6f 77 20 72 65 73 6f 6c 76 65 73 20 61 6e   row resolves an
37e0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 76 69  y outstanding vi
37f0: 6f 6c 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  olations..  **. 
3800: 20 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79   ** Check if any
3810: 20 6f 66 20 74 68 65 20 6b 65 79 20 63 6f 6c 75   of the key colu
3820: 6d 6e 73 20 69 6e 20 74 68 65 20 63 68 69 6c 64  mns in the child
3830: 20 74 61 62 6c 65 20 72 6f 77 20 61 72 65 20 4e   table row are N
3840: 55 4c 4c 2e 20 49 66 20 0a 20 20 2a 2a 20 61 6e  ULL. If .  ** an
3850: 79 20 61 72 65 2c 20 74 68 65 6e 20 74 68 65 20  y are, then the 
3860: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 63 6f  constraint is co
3870: 6e 73 69 64 65 72 65 64 20 73 61 74 69 73 66 69  nsidered satisfi
3880: 65 64 2e 20 4e 6f 20 6e 65 65 64 20 74 6f 20 0a  ed. No need to .
3890: 20 20 2a 2a 20 73 65 61 72 63 68 20 66 6f 72 20    ** search for 
38a0: 61 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 69  a matching row i
38b0: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
38c0: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 49  le.  */.  if( nI
38d0: 6e 63 72 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ncr<0 ){.    sql
38e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
38f0: 2c 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 2c 20 70  , OP_FkIfZero, p
3900: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
3910: 2c 20 69 4f 6b 29 3b 0a 20 20 20 20 56 64 62 65  , iOk);.    Vdbe
3920: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
3930: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46  .  for(i=0; i<pF
3940: 4b 65 79 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Key->nCol; i++){
3950: 0a 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20  .    int iReg = 
3960: 61 69 43 6f 6c 5b 69 5d 20 2b 20 72 65 67 44 61  aiCol[i] + regDa
3970: 74 61 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69  ta + 1;.    sqli
3980: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3990: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
39a0: 2c 20 69 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65  , iOk); VdbeCove
39b0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
39c0: 69 66 28 20 69 73 49 67 6e 6f 72 65 3d 3d 30 20  if( isIgnore==0 
39d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d  ){.    if( pIdx=
39e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
39f0: 66 20 70 49 64 78 20 69 73 20 4e 55 4c 4c 2c 20  f pIdx is NULL, 
3a00: 74 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20  then the parent 
3a10: 6b 65 79 20 69 73 20 74 68 65 20 49 4e 54 45 47  key is the INTEG
3a20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20  ER PRIMARY KEY. 
3a30: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f       ** column o
3a40: 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  f the parent tab
3a50: 6c 65 20 28 74 61 62 6c 65 20 70 54 61 62 29 2e  le (table pTab).
3a60: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69    */.      int i
3a70: 4d 75 73 74 42 65 49 6e 74 3b 20 20 20 20 20 20  MustBeInt;      
3a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
3a90: 65 73 73 20 6f 66 20 4d 75 73 74 42 65 49 6e 74  ess of MustBeInt
3aa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
3ab0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 65 6d        int regTem
3ac0: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
3ad0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
3ae0: 20 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b   .      /* Invok
3af0: 65 20 4d 75 73 74 42 65 49 6e 74 20 74 6f 20 63  e MustBeInt to c
3b00: 6f 65 72 63 65 20 74 68 65 20 63 68 69 6c 64 20  oerce the child 
3b10: 6b 65 79 20 76 61 6c 75 65 20 74 6f 20 61 6e 20  key value to an 
3b20: 69 6e 74 65 67 65 72 20 28 69 2e 65 2e 20 0a 20  integer (i.e. . 
3b30: 20 20 20 20 20 2a 2a 20 61 70 70 6c 79 20 74 68       ** apply th
3b40: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
3b50: 65 20 70 61 72 65 6e 74 20 6b 65 79 29 2e 20 49  e parent key). I
3b60: 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 74 68  f this fails, th
3b70: 65 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  en there.      *
3b80: 2a 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * is no matching
3b90: 20 70 61 72 65 6e 74 20 6b 65 79 2e 20 42 65 66   parent key. Bef
3ba0: 6f 72 65 20 75 73 69 6e 67 20 4d 75 73 74 42 65  ore using MustBe
3bb0: 49 6e 74 2c 20 6d 61 6b 65 20 61 20 63 6f 70 79  Int, make a copy
3bc0: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
3bd0: 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73   value. Otherwis
3be0: 65 2c 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73  e, the value ins
3bf0: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 63  erted into the c
3c00: 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 0a  hild key column.
3c10: 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 68 61        ** will ha
3c20: 76 65 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  ve INTEGER affin
3c30: 69 74 79 20 61 70 70 6c 69 65 64 20 74 6f 20 69  ity applied to i
3c40: 74 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74  t, which may not
3c50: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f   be correct.  */
3c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3c80: 43 6f 70 79 2c 20 61 69 43 6f 6c 5b 30 5d 2b 31  Copy, aiCol[0]+1
3c90: 2b 72 65 67 44 61 74 61 2c 20 72 65 67 54 65 6d  +regData, regTem
3ca0: 70 29 3b 0a 20 20 20 20 20 20 69 4d 75 73 74 42  p);.      iMustB
3cb0: 65 49 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eInt = sqlite3Vd
3cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
3cd0: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 54 65 6d  ustBeInt, regTem
3ce0: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  p, 0);.      Vdb
3cf0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
3d00: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
3d10: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 69 73   parent table is
3d20: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
3d30: 20 63 68 69 6c 64 20 74 61 62 6c 65 2c 20 61 6e   child table, an
3d40: 64 20 77 65 20 61 72 65 20 61 62 6f 75 74 0a 20  d we are about. 
3d50: 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 72 65       ** to incre
3d60: 6d 65 6e 74 20 74 68 65 20 63 6f 6e 73 74 72 61  ment the constra
3d70: 69 6e 74 2d 63 6f 75 6e 74 65 72 20 28 69 2e 65  int-counter (i.e
3d80: 2e 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  . this is an INS
3d90: 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 29 2c 0a  ERT operation),.
3da0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 68        ** then ch
3db0: 65 63 6b 20 69 66 20 74 68 65 20 72 6f 77 20 62  eck if the row b
3dc0: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6d 61  eing inserted ma
3dd0: 74 63 68 65 73 20 69 74 73 65 6c 66 2e 20 49 66  tches itself. If
3de0: 20 73 6f 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20   so, do not.    
3df0: 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74    ** increment t
3e00: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f  he constraint-co
3e10: 75 6e 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  unter.  */.     
3e20: 20 69 66 28 20 70 54 61 62 3d 3d 70 46 4b 65 79   if( pTab==pFKey
3e30: 2d 3e 70 46 72 6f 6d 20 26 26 20 6e 49 6e 63 72  ->pFrom && nIncr
3e40: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
3e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3e60: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 44 61  (v, OP_Eq, regDa
3e70: 74 61 2c 20 69 4f 6b 2c 20 72 65 67 54 65 6d 70  ta, iOk, regTemp
3e80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
3e90: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
3ea0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3eb0: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
3ec0: 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  L);.      }.  . 
3ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
3ee0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 43  Table(pParse, iC
3ef0: 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ur, iDb, pTab, O
3f00: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
3f10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3f20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
3f30: 69 73 74 73 2c 20 69 43 75 72 2c 20 30 2c 20 72  ists, iCur, 0, r
3f40: 65 67 54 65 6d 70 29 3b 20 56 64 62 65 43 6f 76  egTemp); VdbeCov
3f50: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
3f60: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
3f70: 76 2c 20 69 4f 6b 29 3b 0a 20 20 20 20 20 20 73  v, iOk);.      s
3f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3f90: 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  re(v, sqlite3Vdb
3fa0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
3fb0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
3fc0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3fd0: 20 69 4d 75 73 74 42 65 49 6e 74 29 3b 0a 20 20   iMustBeInt);.  
3fe0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
3ff0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4000: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
4010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
4020: 20 6e 43 6f 6c 20 3d 20 70 46 4b 65 79 2d 3e 6e   nCol = pFKey->n
4030: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Col;.      int r
4040: 65 67 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33  egTemp = sqlite3
4050: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
4060: 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
4070: 20 20 69 6e 74 20 72 65 67 52 65 63 20 3d 20 73    int regRec = s
4080: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4090: 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20  (pParse);.  .   
40a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
40b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
40c0: 65 61 64 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  ead, iCur, pIdx-
40d0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
40e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
40f0: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
4100: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
4110: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
4120: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
4130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4140: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 61 69 43  (v, OP_Copy, aiC
4150: 6f 6c 5b 69 5d 2b 31 2b 72 65 67 44 61 74 61 2c  ol[i]+1+regData,
4160: 20 72 65 67 54 65 6d 70 2b 69 29 3b 0a 20 20 20   regTemp+i);.   
4170: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
4180: 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 74   If the parent t
4190: 61 62 6c 65 20 69 73 20 74 68 65 20 73 61 6d 65  able is the same
41a0: 20 61 73 20 74 68 65 20 63 68 69 6c 64 20 74 61   as the child ta
41b0: 62 6c 65 2c 20 61 6e 64 20 77 65 20 61 72 65 20  ble, and we are 
41c0: 61 62 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  about.      ** t
41d0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
41e0: 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
41f0: 65 72 20 28 69 2e 65 2e 20 74 68 69 73 20 69 73  er (i.e. this is
4200: 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61   an INSERT opera
4210: 74 69 6f 6e 29 2c 0a 20 20 20 20 20 20 2a 2a 20  tion),.      ** 
4220: 74 68 65 6e 20 63 68 65 63 6b 20 69 66 20 74 68  then check if th
4230: 65 20 72 6f 77 20 62 65 69 6e 67 20 69 6e 73 65  e row being inse
4240: 72 74 65 64 20 6d 61 74 63 68 65 73 20 69 74 73  rted matches its
4250: 65 6c 66 2e 20 49 66 20 73 6f 2c 20 64 6f 20 6e  elf. If so, do n
4260: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ot.      ** incr
4270: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6e 73 74 72  ement the constr
4280: 61 69 6e 74 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  aint-counter. . 
4290: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
42a0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 70   If any of the p
42b0: 61 72 65 6e 74 2d 6b 65 79 20 76 61 6c 75 65 73  arent-key values
42c0: 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   are NULL, then 
42d0: 74 68 65 20 72 6f 77 20 63 61 6e 6e 6f 74 20 6d  the row cannot m
42e0: 61 74 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 69  atch .      ** i
42f0: 74 73 65 6c 66 2e 20 53 6f 20 73 65 74 20 4a 55  tself. So set JU
4300: 4d 50 49 46 4e 55 4c 4c 20 74 6f 20 6d 61 6b 65  MPIFNULL to make
4310: 20 73 75 72 65 20 77 65 20 64 6f 20 74 68 65 20   sure we do the 
4320: 4f 50 5f 46 6f 75 6e 64 20 69 66 20 61 6e 79 0a  OP_Found if any.
4330: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4340: 70 61 72 65 6e 74 2d 6b 65 79 20 76 61 6c 75 65  parent-key value
4350: 73 20 61 72 65 20 4e 55 4c 4c 20 28 61 74 20 74  s are NULL (at t
4360: 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20  his point it is 
4370: 6b 6e 6f 77 6e 20 74 68 61 74 0a 20 20 20 20 20  known that.     
4380: 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   ** none of the 
4390: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73  child key values
43a0: 20 61 72 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   are)..      */.
43b0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
43c0: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 26 26 20  pFKey->pFrom && 
43d0: 6e 49 6e 63 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nIncr==1 ){.    
43e0: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 20 3d 20      int iJump = 
43f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
4400: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 43 6f 6c  ntAddr(v) + nCol
4410: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f   + 1;.        fo
4420: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
4430: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
4440: 6e 74 20 69 43 68 69 6c 64 20 3d 20 61 69 43 6f  nt iChild = aiCo
4450: 6c 5b 69 5d 2b 31 2b 72 65 67 44 61 74 61 3b 0a  l[i]+1+regData;.
4460: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
4470: 61 72 65 6e 74 20 3d 20 70 49 64 78 2d 3e 61 69  arent = pIdx->ai
4480: 43 6f 6c 75 6d 6e 5b 69 5d 2b 31 2b 72 65 67 44  Column[i]+1+regD
4490: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ata;.          a
44a0: 73 73 65 72 74 28 20 61 69 43 6f 6c 5b 69 5d 21  ssert( aiCol[i]!
44b0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
44c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
44d0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3d  dx->aiColumn[i]=
44e0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4500: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73  he parent key is
4510: 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6b 65 79   a composite key
4520: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
4530: 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f  he IPK column */
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61  .            iPa
4550: 72 65 6e 74 20 3d 20 72 65 67 44 61 74 61 3b 0a  rent = regData;.
4560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4580: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
4590: 2c 20 69 43 68 69 6c 64 2c 20 69 4a 75 6d 70 2c  , iChild, iJump,
45a0: 20 69 50 61 72 65 6e 74 29 3b 20 56 64 62 65 43   iParent); VdbeC
45b0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
45c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
45d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
45e0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
45f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4600: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
4610: 74 6f 28 76 2c 20 69 4f 6b 29 3b 0a 20 20 20 20  to(v, iOk);.    
4620: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 73 71 6c    }.  .      sql
4630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
4640: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4650: 20 72 65 67 54 65 6d 70 2c 20 6e 43 6f 6c 2c 20   regTemp, nCol, 
4660: 72 65 67 52 65 63 2c 0a 20 20 20 20 20 20 20 20  regRec,.        
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
4690: 6e 69 74 79 53 74 72 28 70 50 61 72 73 65 2d 3e  nityStr(pParse->
46a0: 64 62 2c 70 49 64 78 29 2c 20 6e 43 6f 6c 29 3b  db,pIdx), nCol);
46b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
46c0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
46d0: 50 5f 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 69  P_Found, iCur, i
46e0: 4f 6b 2c 20 72 65 67 52 65 63 2c 20 30 29 3b 20  Ok, regRec, 0); 
46f0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4700: 0a 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  .  .      sqlite
4710: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4720: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 29 3b  pParse, regRec);
4730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
4740: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
4750: 50 61 72 73 65 2c 20 72 65 67 54 65 6d 70 2c 20  Parse, regTemp, 
4760: 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCol);.    }.  }
4770: 0a 0a 20 20 69 66 28 20 21 70 46 4b 65 79 2d 3e  ..  if( !pFKey->
4780: 69 73 44 65 66 65 72 72 65 64 20 26 26 20 21 28  isDeferred && !(
4790: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
47a0: 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72  s & SQLITE_Defer
47b0: 46 4b 73 29 0a 20 20 20 26 26 20 21 70 50 61 72  FKs).   && !pPar
47c0: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 0a 20  se->pToplevel . 
47d0: 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69 73    && !pParse->is
47e0: 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20 29 7b  MultiWrite .  ){
47f0: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
4800: 63 61 73 65 3a 20 49 66 20 74 68 69 73 20 69 73  case: If this is
4810: 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65   an INSERT state
4820: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 69  ment that will i
4830: 6e 73 65 72 74 20 65 78 61 63 74 6c 79 0a 20 20  nsert exactly.  
4840: 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 69 6e 74    ** one row int
4850: 6f 20 74 68 65 20 74 61 62 6c 65 2c 20 72 61 69  o the table, rai
4860: 73 65 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  se a constraint 
4870: 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
4880: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  ead of.    ** in
4890: 63 72 65 6d 65 6e 74 69 6e 67 20 61 20 63 6f 75  crementing a cou
48a0: 6e 74 65 72 2e 20 54 68 69 73 20 69 73 20 6e 65  nter. This is ne
48b0: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 56  cessary as the V
48c0: 4d 20 63 6f 64 65 20 69 73 20 62 65 69 6e 67 0a  M code is being.
48d0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64      ** generated
48e0: 20 66 6f 72 20 77 69 6c 6c 20 6e 6f 74 20 6f 70   for will not op
48f0: 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
4900: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
4910: 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 63      assert( nInc
4920: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==1 );.    sqli
4930: 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
4940: 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
4950: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
4960: 49 47 4e 4b 45 59 2c 0a 20 20 20 20 20 20 20 20  IGNKEY,.        
4970: 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 20 50 34 5f  OE_Abort, 0, P4_
4980: 53 54 41 54 49 43 2c 20 50 35 5f 43 6f 6e 73 74  STATIC, P5_Const
4990: 72 61 69 6e 74 46 4b 29 3b 0a 20 20 7d 65 6c 73  raintFK);.  }els
49a0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 49 6e 63 72  e{.    if( nIncr
49b0: 3e 30 20 26 26 20 70 46 4b 65 79 2d 3e 69 73 44  >0 && pFKey->isD
49c0: 65 66 65 72 72 65 64 3d 3d 30 20 29 7b 0a 20 20  eferred==0 ){.  
49d0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
49e0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
49f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
4a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46  beAddOp2(v, OP_F
4a10: 6b 43 6f 75 6e 74 65 72 2c 20 70 46 4b 65 79 2d  kCounter, pFKey-
4a20: 3e 69 73 44 65 66 65 72 72 65 64 2c 20 6e 49 6e  >isDeferred, nIn
4a30: 63 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  cr);.  }..  sqli
4a40: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
4a50: 62 65 6c 28 76 2c 20 69 4f 6b 29 3b 0a 20 20 73  bel(v, iOk);.  s
4a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4a70: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
4a80: 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ur);.}.../*.** R
4a90: 65 74 75 72 6e 20 61 6e 20 45 78 70 72 20 6f 62  eturn an Expr ob
4aa0: 6a 65 63 74 20 74 68 61 74 20 72 65 66 65 72 73  ject that refers
4ab0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 72 65 67   to a memory reg
4ac0: 69 73 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  ister correspond
4ad0: 69 6e 67 0a 2a 2a 20 74 6f 20 63 6f 6c 75 6d 6e  ing.** to column
4ae0: 20 69 43 6f 6c 20 6f 66 20 74 61 62 6c 65 20 70   iCol of table p
4af0: 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 42 61  Tab..**.** regBa
4b00: 73 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  se is the first 
4b10: 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  of an array of r
4b20: 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e  egister that con
4b30: 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 0a 2a  tains the data.*
4b40: 2a 20 66 6f 72 20 70 54 61 62 2e 20 20 72 65 67  * for pTab.  reg
4b50: 42 61 73 65 20 69 74 73 65 6c 66 20 68 6f 6c 64  Base itself hold
4b60: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 72 65  s the rowid.  re
4b70: 67 42 61 73 65 2b 31 20 68 6f 6c 64 73 20 74 68  gBase+1 holds th
4b80: 65 20 66 69 72 73 74 0a 2a 2a 20 63 6f 6c 75 6d  e first.** colum
4b90: 6e 2e 20 20 72 65 67 42 61 73 65 2b 32 20 68 6f  n.  regBase+2 ho
4ba0: 6c 64 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  lds the second c
4bb0: 6f 6c 75 6d 6e 2c 20 61 6e 64 20 73 6f 20 66 6f  olumn, and so fo
4bc0: 72 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  rth..*/.static E
4bd0: 78 70 72 20 2a 65 78 70 72 54 61 62 6c 65 52 65  xpr *exprTableRe
4be0: 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65 20  gister(.  Parse 
4bf0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
4c00: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4c10: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4c20: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
4c30: 70 54 61 62 2c 20 20 20 20 20 20 20 2f 2a 20 54  pTab,       /* T
4c40: 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 63  he table whose c
4c50: 6f 6e 74 65 6e 74 20 69 73 20 61 74 20 72 5b 72  ontent is at r[r
4c60: 65 67 42 61 73 65 5d 2e 2e 2e 20 2a 2f 0a 20 20  egBase]... */.  
4c70: 69 6e 74 20 72 65 67 42 61 73 65 2c 20 20 20 20  int regBase,    
4c80: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f     /* Contents o
4c90: 66 20 74 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a  f table pTab */.
4ca0: 20 20 69 31 36 20 69 43 6f 6c 20 20 20 20 20 20    i16 iCol      
4cb0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
4cc0: 6c 75 6d 6e 20 6f 66 20 70 54 61 62 20 69 73 20  lumn of pTab is 
4cd0: 64 65 73 69 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  desired */.){.  
4ce0: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 43  Expr *pExpr;.  C
4cf0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 63  olumn *pCol;.  c
4d00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
4d10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4d20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
4d30: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
4d40: 45 78 70 72 28 64 62 2c 20 54 4b 5f 52 45 47 49  Expr(db, TK_REGI
4d50: 53 54 45 52 2c 20 30 29 3b 0a 20 20 69 66 28 20  STER, 0);.  if( 
4d60: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28  pExpr ){.    if(
4d70: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
4d80: 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  !=pTab->iPKey ){
4d90: 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
4da0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
4db0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
4dc0: 61 62 6c 65 20 3d 20 72 65 67 42 61 73 65 20 2b  able = regBase +
4dd0: 20 69 43 6f 6c 20 2b 20 31 3b 0a 20 20 20 20 20   iCol + 1;.     
4de0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
4df0: 20 3d 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   = pCol->affinit
4e00: 79 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  y;.      zColl =
4e10: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
4e20: 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
4e30: 20 29 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) zColl = db->p
4e40: 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b  DfltColl->zName;
4e50: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73  .      pExpr = s
4e60: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
4e70: 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
4e80: 65 2c 20 70 45 78 70 72 2c 20 7a 43 6f 6c 6c 29  e, pExpr, zColl)
4e90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4ea0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4eb0: 20 3d 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   = regBase;.    
4ec0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
4ed0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
4ee0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 20 20  NTEGER;.    }.  
4ef0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
4f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4f10: 6e 20 61 6e 20 45 78 70 72 20 6f 62 6a 65 63 74  n an Expr object
4f20: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
4f30: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
4f40: 61 62 6c 65 20 70 54 61 62 20 77 68 69 63 68 0a  able pTab which.
4f50: 2a 2a 20 68 61 73 20 63 75 72 73 6f 72 20 69 43  ** has cursor iC
4f60: 75 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ur..*/.static Ex
4f70: 70 72 20 2a 65 78 70 72 54 61 62 6c 65 43 6f 6c  pr *exprTableCol
4f80: 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  umn(.  sqlite3 *
4f90: 64 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db,      /* The 
4fa0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4fb0: 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
4fc0: 70 54 61 62 2c 20 20 20 20 20 20 2f 2a 20 54 68  pTab,      /* Th
4fd0: 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 63 6f  e table whose co
4fe0: 6c 75 6d 6e 20 69 73 20 64 65 73 69 72 65 64 20  lumn is desired 
4ff0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  */.  int iCursor
5000: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ,      /* The op
5010: 65 6e 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  en cursor on the
5020: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 31 36 20   table */.  i16 
5030: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  iCol          /*
5040: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74   The column that
5050: 20 69 73 20 77 61 6e 74 65 64 20 2a 2f 0a 29 7b   is wanted */.){
5060: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
5070: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
5080: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 29 3b 0a   TK_COLUMN, 0);.
5090: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
50a0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
50b0: 20 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72   pTab;.    pExpr
50c0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73  ->iTable = iCurs
50d0: 6f 72 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  or;.    pExpr->i
50e0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
5100: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
5110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
5120: 6c 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  led to generate 
5130: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
5140: 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65  en a row is dele
5150: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
5160: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  parent table of 
5170: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
5180: 74 72 61 69 6e 74 20 70 46 4b 65 79 20 61 6e 64  traint pFKey and
5190: 2c 20 69 66 20 70 46 4b 65 79 20 69 73 20 0a 2a  , if pFKey is .*
51a0: 2a 20 64 65 66 65 72 72 65 64 2c 20 77 68 65 6e  * deferred, when
51b0: 20 61 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74   a row is insert
51c0: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 61 6d 65  ed into the same
51d0: 20 74 61 62 6c 65 2e 20 57 68 65 6e 20 67 65 6e   table. When gen
51e0: 65 72 61 74 69 6e 67 0a 2a 2a 20 63 6f 64 65 20  erating.** code 
51f0: 66 6f 72 20 61 6e 20 53 51 4c 20 55 50 44 41 54  for an SQL UPDAT
5200: 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  E operation, thi
5210: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
5220: 65 20 63 61 6c 6c 65 64 20 74 77 69 63 65 20 2d  e called twice -
5230: 0a 2a 2a 20 6f 6e 63 65 20 74 6f 20 22 64 65 6c  .** once to "del
5240: 65 74 65 22 20 74 68 65 20 6f 6c 64 20 72 6f 77  ete" the old row
5250: 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20 22 69 6e   and once to "in
5260: 73 65 72 74 22 20 74 68 65 20 6e 65 77 20 72 6f  sert" the new ro
5270: 77 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  w..**.** Paramet
5280: 65 72 20 6e 49 6e 63 72 20 69 73 20 70 61 73 73  er nIncr is pass
5290: 65 64 20 2d 31 20 77 68 65 6e 20 69 6e 73 65 72  ed -1 when inser
52a0: 74 69 6e 67 20 61 20 72 6f 77 20 28 61 73 20 74  ting a row (as t
52b0: 68 69 73 20 6d 61 79 20 64 65 63 72 65 61 73 65  his may decrease
52c0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
52d0: 66 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  f FK violations 
52e0: 69 6e 20 74 68 65 20 64 62 29 20 6f 72 20 2b 31  in the db) or +1
52f0: 20 77 68 65 6e 20 64 65 6c 65 74 69 6e 67 20 6f   when deleting o
5300: 6e 65 20 28 61 73 20 74 68 69 73 0a 2a 2a 20 6d  ne (as this.** m
5310: 61 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ay increase the 
5320: 6e 75 6d 62 65 72 20 6f 66 20 46 4b 20 63 6f 6e  number of FK con
5330: 73 74 72 61 69 6e 74 20 70 72 6f 62 6c 65 6d 73  straint problems
5340: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  )..**.** The cod
5350: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
5360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 63 61  his function sca
5370: 6e 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  ns through the r
5380: 6f 77 73 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ows in the child
5390: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63  .** table that c
53a0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
53b0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 72 6f   parent table ro
53c0: 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  w being deleted 
53d0: 6f 72 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 20  or inserted..** 
53e0: 46 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 72  For each child r
53f0: 6f 77 20 66 6f 75 6e 64 2c 20 6f 6e 65 20 6f 66  ow found, one of
5400: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
5410: 63 74 69 6f 6e 73 20 69 73 20 74 61 6b 65 6e 3a  ctions is taken:
5420: 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 65 72 61 74 69  .**.**   Operati
5430: 6f 6e 20 7c 20 46 4b 20 74 79 70 65 20 20 20 7c  on | FK type   |
5440: 20 41 63 74 69 6f 6e 20 74 61 6b 65 6e 0a 2a 2a   Action taken.**
5450: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
54a0: 20 20 20 44 45 4c 45 54 45 20 20 20 20 20 20 69     DELETE      i
54b0: 6d 6d 65 64 69 61 74 65 20 20 20 49 6e 63 72 65  mmediate   Incre
54c0: 6d 65 6e 74 20 74 68 65 20 22 69 6d 6d 65 64 69  ment the "immedi
54d0: 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ate constraint c
54e0: 6f 75 6e 74 65 72 22 2e 0a 2a 2a 20 20 20 20 20  ounter"..**     
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 20 20 4f 72 2c 20 69 66 20 74 68 65        Or, if the
5510: 20 4f 4e 20 28 55 50 44 41 54 45 7c 44 45 4c 45   ON (UPDATE|DELE
5520: 54 45 29 20 61 63 74 69 6f 6e 20 69 73 20 52 45  TE) action is RE
5530: 53 54 52 49 43 54 2c 0a 2a 2a 20 20 20 20 20 20  STRICT,.**      
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 74 68 72 6f 77 20 61 20 22 46 4f       throw a "FO
5560: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
5570: 61 69 6e 74 20 66 61 69 6c 65 64 22 20 65 78 63  aint failed" exc
5580: 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  eption..**.**   
5590: 49 4e 53 45 52 54 20 20 20 20 20 20 69 6d 6d 65  INSERT      imme
55a0: 64 69 61 74 65 20 20 20 44 65 63 72 65 6d 65 6e  diate   Decremen
55b0: 74 20 74 68 65 20 22 69 6d 6d 65 64 69 61 74 65  t the "immediate
55c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
55d0: 74 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 45  ter"..**.**   DE
55e0: 4c 45 54 45 20 20 20 20 20 20 64 65 66 65 72 72  LETE      deferr
55f0: 65 64 20 20 20 20 49 6e 63 72 65 6d 65 6e 74 20  ed    Increment 
5600: 74 68 65 20 22 64 65 66 65 72 72 65 64 20 63 6f  the "deferred co
5610: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
5620: 22 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  "..**           
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 4f 72 2c 20 69 66 20 74 68 65 20 4f 4e 20 28 55  Or, if the ON (U
5650: 50 44 41 54 45 7c 44 45 4c 45 54 45 29 20 61 63  PDATE|DELETE) ac
5660: 74 69 6f 6e 20 69 73 20 52 45 53 54 52 49 43 54  tion is RESTRICT
5670: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5690: 68 72 6f 77 20 61 20 22 46 4f 52 45 49 47 4e 20  hrow a "FOREIGN 
56a0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
56b0: 61 69 6c 65 64 22 20 65 78 63 65 70 74 69 6f 6e  ailed" exception
56c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54  ..**.**   INSERT
56d0: 20 20 20 20 20 20 64 65 66 65 72 72 65 64 20 20        deferred  
56e0: 20 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20    Decrement the 
56f0: 22 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72  "deferred constr
5700: 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 2e 0a 2a  aint counter"..*
5710: 2a 0a 2a 2a 20 54 68 65 73 65 20 6f 70 65 72 61  *.** These opera
5720: 74 69 6f 6e 73 20 61 72 65 20 69 64 65 6e 74 69  tions are identi
5730: 66 69 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  fied in the comm
5740: 65 6e 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ent at the top o
5750: 66 20 74 68 69 73 20 66 69 6c 65 20 0a 2a 2a 20  f this file .** 
5760: 28 66 6b 65 79 2e 63 29 20 61 73 20 22 49 2e 32  (fkey.c) as "I.2
5770: 22 20 61 6e 64 20 22 44 2e 32 22 2e 0a 2a 2f 0a  " and "D.2"..*/.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6b 53 63  static void fkSc
5790: 61 6e 43 68 69 6c 64 72 65 6e 28 0a 20 20 50 61  anChildren(.  Pa
57a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57c0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
57d0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
57e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
57f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
5800: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 63 61   table to be sca
5810: 6e 6e 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20  nned */.  Table 
5820: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
5830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5840: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f   parent table */
5850: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 6e 20 70     /* Index on p
5880: 61 72 65 6e 74 20 63 6f 76 65 72 69 6e 67 20 74  arent covering t
5890: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a  he foreign key *
58a0: 2f 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  /.  FKey *pFKey,
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 72 65 69      /* The forei
58d0: 67 6e 20 6b 65 79 20 6c 69 6e 6b 69 6e 67 20 70  gn key linking p
58e0: 53 72 63 20 74 6f 20 70 54 61 62 20 2a 2f 0a 20  Src to pTab */. 
58f0: 20 69 6e 74 20 2a 61 69 43 6f 6c 2c 20 20 20 20   int *aiCol,    
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 70 49 64   /* Map from pId
5920: 78 20 63 6f 6c 73 20 74 6f 20 63 68 69 6c 64 20  x cols to child 
5930: 74 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20 20  table cols */.  
5940: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20  int regData,    
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 2f 2a 20 50 61 72 65 6e 74 20 72 6f 77 20 64 61  /* Parent row da
5970: 74 61 20 73 74 61 72 74 73 20 68 65 72 65 20 2a  ta starts here *
5980: 2f 0a 20 20 69 6e 74 20 6e 49 6e 63 72 20 20 20  /.  int nIncr   
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 74 6f      /* Amount to
59b0: 20 69 6e 63 72 65 6d 65 6e 74 20 64 65 66 65 72   increment defer
59c0: 72 65 64 20 63 6f 75 6e 74 65 72 20 62 79 20 2a  red counter by *
59d0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
59e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
59f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5a00: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
5a10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a30: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
5a40: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ble */.  Expr *p
5a50: 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20  Where = 0;      
5a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
5a70: 45 20 63 6c 61 75 73 65 20 74 6f 20 73 63 61 6e  E clause to scan
5a80: 20 77 69 74 68 20 2a 2f 0a 20 20 4e 61 6d 65 43   with */.  NameC
5a90: 6f 6e 74 65 78 74 20 73 4e 61 6d 65 43 6f 6e 74  ontext sNameCont
5aa0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext;       /* Co
5ab0: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
5ac0: 73 6f 6c 76 65 20 57 48 45 52 45 20 63 6c 61 75  solve WHERE clau
5ad0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  se */.  WhereInf
5ae0: 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
5af0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
5b00: 78 74 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  xt used by sqlit
5b10: 65 33 57 68 65 72 65 58 58 58 28 29 20 2a 2f 0a  e3WhereXXX() */.
5b20: 20 20 69 6e 74 20 69 46 6b 49 66 5a 65 72 6f 20    int iFkIfZero 
5b30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5b40: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
5b50: 4f 50 5f 46 6b 49 66 5a 65 72 6f 20 2a 2f 0a 20  OP_FkIfZero */. 
5b60: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
5b70: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5b80: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  );..  assert( pI
5b90: 64 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 70  dx==0 || pIdx->p
5ba0: 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
5bb0: 20 61 73 73 65 72 74 28 20 70 49 64 78 3d 3d 30   assert( pIdx==0
5bc0: 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
5bd0: 6c 3d 3d 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 29  l==pFKey->nCol )
5be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
5bf0: 21 3d 30 20 7c 7c 20 70 46 4b 65 79 2d 3e 6e 43  !=0 || pFKey->nC
5c00: 6f 6c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ol==1 );.  asser
5c10: 74 28 20 70 49 64 78 21 3d 30 20 7c 7c 20 48 61  t( pIdx!=0 || Ha
5c20: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b 0a  sRowid(pTab) );.
5c30: 0a 20 20 69 66 28 20 6e 49 6e 63 72 3c 30 20 29  .  if( nIncr<0 )
5c40: 7b 0a 20 20 20 20 69 46 6b 49 66 5a 65 72 6f 20  {.    iFkIfZero 
5c50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5c60: 4f 70 32 28 76 2c 20 4f 50 5f 46 6b 49 66 5a 65  Op2(v, OP_FkIfZe
5c70: 72 6f 2c 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ro, pFKey->isDef
5c80: 65 72 72 65 64 2c 20 30 29 3b 0a 20 20 20 20 56  erred, 0);.    V
5c90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
5cb0: 20 61 6e 20 45 78 70 72 20 6f 62 6a 65 63 74 20   an Expr object 
5cc0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
5cd0: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  SQL expression l
5ce0: 69 6b 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ike:.  **.  **  
5cf0: 20 3c 70 61 72 65 6e 74 2d 6b 65 79 31 3e 20 3d   <parent-key1> =
5d00: 20 3c 63 68 69 6c 64 2d 6b 65 79 31 3e 20 41 4e   <child-key1> AN
5d10: 44 20 3c 70 61 72 65 6e 74 2d 6b 65 79 32 3e 20  D <parent-key2> 
5d20: 3d 20 3c 63 68 69 6c 64 2d 6b 65 79 32 3e 20 2e  = <child-key2> .
5d30: 2e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ...  **.  ** The
5d40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5d50: 6e 63 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  nce used for the
5d60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 73 68 6f 75   comparison shou
5d70: 6c 64 20 62 65 20 74 68 61 74 20 6f 66 0a 20 20  ld be that of.  
5d80: 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  ** the parent ke
5d90: 79 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 61  y columns. The a
5da0: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 70  ffinity of the p
5db0: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
5dc0: 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20   should.  ** be 
5dd0: 61 70 70 6c 69 65 64 20 74 6f 20 65 61 63 68 20  applied to each 
5de0: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 20  child key value 
5df0: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 61  before the compa
5e00: 72 69 73 6f 6e 20 74 61 6b 65 73 20 70 6c 61 63  rison takes plac
5e10: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
5e20: 30 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0; i<pFKey->nCol
5e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5e40: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
5e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
5e60: 75 65 20 66 72 6f 6d 20 70 61 72 65 6e 74 20 74  ue from parent t
5e70: 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20  able row */.    
5e80: 45 78 70 72 20 2a 70 52 69 67 68 74 3b 20 20 20  Expr *pRight;   
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ea0: 20 43 6f 6c 75 6d 6e 20 72 65 66 20 74 6f 20 63   Column ref to c
5eb0: 68 69 6c 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hild table */.  
5ec0: 20 20 45 78 70 72 20 2a 70 45 71 3b 20 20 20 20    Expr *pEq;    
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 28 70  /* Expression (p
5ef0: 4c 65 66 74 20 3d 20 70 52 69 67 68 74 29 20 2a  Left = pRight) *
5f00: 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20  /.    i16 iCol; 
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
5f30: 63 6f 6c 75 6d 6e 20 69 6e 20 63 68 69 6c 64 20  column in child 
5f40: 74 61 62 6c 65 20 2a 2f 20 0a 20 20 20 20 63 6f  table */ .    co
5f50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 20  nst char *zCol; 
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5f70: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
5f80: 20 63 68 69 6c 64 20 74 61 62 6c 65 20 2a 2f 0a   child table */.
5f90: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 49 64 78  .    iCol = pIdx
5fa0: 20 3f 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   ? pIdx->aiColum
5fb0: 6e 5b 69 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 70  n[i] : -1;.    p
5fc0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
5fd0: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
5fe0: 20 70 54 61 62 2c 20 72 65 67 44 61 74 61 2c 20   pTab, regData, 
5ff0: 69 43 6f 6c 29 3b 0a 20 20 20 20 69 43 6f 6c 20  iCol);.    iCol 
6000: 3d 20 61 69 43 6f 6c 20 3f 20 61 69 43 6f 6c 5b  = aiCol ? aiCol[
6010: 69 5d 20 3a 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  i] : pFKey->aCol
6020: 5b 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 61  [0].iFrom;.    a
6030: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
6040: 3b 0a 20 20 20 20 7a 43 6f 6c 20 3d 20 70 46 4b  ;.    zCol = pFK
6050: 65 79 2d 3e 70 46 72 6f 6d 2d 3e 61 43 6f 6c 5b  ey->pFrom->aCol[
6060: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
6070: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
6080: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
6090: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 70 45 71 20   zCol);.    pEq 
60a0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
60b0: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 4c  Parse, TK_EQ, pL
60c0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
60d0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
60e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
60f0: 20 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 20   pWhere, pEq);. 
6100: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6110: 63 68 69 6c 64 20 74 61 62 6c 65 20 69 73 20 74  child table is t
6120: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
6130: 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 74 68 65  arent table, the
6140: 6e 20 61 64 64 20 74 65 72 6d 73 0a 20 20 2a 2a  n add terms.  **
6150: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
6160: 61 75 73 65 20 74 68 61 74 20 70 72 65 76 65 6e  ause that preven
6170: 74 20 74 68 69 73 20 65 6e 74 72 79 20 66 72 6f  t this entry fro
6180: 6d 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 2e  m being scanned.
6190: 0a 20 20 2a 2a 20 54 68 65 20 61 64 64 65 64 20  .  ** The added 
61a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
61b0: 6d 73 20 61 72 65 20 6c 69 6b 65 20 74 68 69 73  ms are like this
61c0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
61d0: 24 63 75 72 72 65 6e 74 5f 72 6f 77 69 64 21 3d  $current_rowid!=
61e0: 72 6f 77 69 64 0a 20 20 2a 2a 20 20 20 20 20 4e  rowid.  **     N
61f0: 4f 54 28 20 24 63 75 72 72 65 6e 74 5f 61 3d 3d  OT( $current_a==
6200: 61 20 41 4e 44 20 24 63 75 72 72 65 6e 74 5f 62  a AND $current_b
6210: 3d 3d 62 20 41 4e 44 20 2e 2e 2e 20 29 0a 20 20  ==b AND ... ).  
6220: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
6230: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 66  t form is used f
6240: 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73 2e  or rowid tables.
6250: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
6260: 6d 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  m is used.  ** f
6270: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
6280: 20 74 61 62 6c 65 73 2e 20 20 49 6e 20 74 68 65   tables.  In the
6290: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 2c 20 74 68   second form, th
62a0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
62b0: 0a 20 20 2a 2a 20 28 61 2c 62 2c 2e 2e 2e 29 0a  .  ** (a,b,...).
62c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 3d    */.  if( pTab=
62d0: 3d 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 26 26  =pFKey->pFrom &&
62e0: 20 6e 49 6e 63 72 3e 30 20 29 7b 0a 20 20 20 20   nIncr>0 ){.    
62f0: 45 78 70 72 20 2a 70 4e 65 3b 20 20 20 20 20 20  Expr *pNe;      
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6310: 20 45 78 70 72 65 73 73 69 6f 6e 20 28 70 4c 65   Expression (pLe
6320: 66 74 20 21 3d 20 70 52 69 67 68 74 29 20 2a 2f  ft != pRight) */
6330: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
6340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6350: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 72 6f 6d     /* Value from
6360: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 72 6f   parent table ro
6370: 77 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  w */.    Expr *p
6380: 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
6390: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
63a0: 20 72 65 66 20 74 6f 20 63 68 69 6c 64 20 74 61   ref to child ta
63b0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 48  ble */.    if( H
63c0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
63d0: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 65  .      pLeft = e
63e0: 78 70 72 54 61 62 6c 65 52 65 67 69 73 74 65 72  xprTableRegister
63f0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 72  (pParse, pTab, r
6400: 65 67 44 61 74 61 2c 20 2d 31 29 3b 0a 20 20 20  egData, -1);.   
6410: 20 20 20 70 52 69 67 68 74 20 3d 20 65 78 70 72     pRight = expr
6420: 54 61 62 6c 65 43 6f 6c 75 6d 6e 28 64 62 2c 20  TableColumn(db, 
6430: 70 54 61 62 2c 20 70 53 72 63 2d 3e 61 5b 30 5d  pTab, pSrc->a[0]
6440: 2e 69 43 75 72 73 6f 72 2c 20 2d 31 29 3b 0a 20  .iCursor, -1);. 
6450: 20 20 20 20 20 70 4e 65 20 3d 20 73 71 6c 69 74       pNe = sqlit
6460: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
6470: 54 4b 5f 4e 45 2c 20 70 4c 65 66 74 2c 20 70 52  TK_NE, pLeft, pR
6480: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ight, 0);.    }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
64a0: 2a 70 45 71 2c 20 2a 70 41 6c 6c 20 3d 20 30 3b  *pEq, *pAll = 0;
64b0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
64c0: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
64d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
64e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
64f0: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
6500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d   for(i=0; i<pPk-
6510: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
6520: 20 20 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c          i16 iCol
6530: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
6540: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 4c  n[i];.        pL
6550: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 52  eft = exprTableR
6560: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
6570: 70 54 61 62 2c 20 72 65 67 44 61 74 61 2c 20 69  pTab, regData, i
6580: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Col);.        pR
6590: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
65a0: 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 54 61 62 2c  Column(db, pTab,
65b0: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
65c0: 73 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  sor, iCol);.    
65d0: 20 20 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65      pEq = sqlite
65e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
65f0: 4b 5f 45 51 2c 20 70 4c 65 66 74 2c 20 70 52 69  K_EQ, pLeft, pRi
6600: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
6610: 20 70 41 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45   pAll = sqlite3E
6620: 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6c 6c 2c  xprAnd(db, pAll,
6630: 20 70 45 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pEq);.      }. 
6640: 20 20 20 20 20 70 4e 65 20 3d 20 73 71 6c 69 74       pNe = sqlit
6650: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
6660: 54 4b 5f 4e 4f 54 2c 20 70 41 6c 6c 2c 20 30 2c  TK_NOT, pAll, 0,
6670: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
6680: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
6690: 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
66a0: 65 2c 20 70 4e 65 29 3b 0a 20 20 7d 0a 0a 20 20  e, pNe);.  }..  
66b0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 72  /* Resolve the r
66c0: 65 66 65 72 65 6e 63 65 73 20 69 6e 20 74 68 65  eferences in the
66d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a   WHERE clause. *
66e0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 61 6d  /.  memset(&sNam
66f0: 65 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a  eContext, 0, siz
6700: 65 6f 66 28 4e 61 6d 65 43 6f 6e 74 65 78 74 29  eof(NameContext)
6710: 29 3b 0a 20 20 73 4e 61 6d 65 43 6f 6e 74 65 78  );.  sNameContex
6720: 74 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 72  t.pSrcList = pSr
6730: 63 3b 0a 20 20 73 4e 61 6d 65 43 6f 6e 74 65 78  c;.  sNameContex
6740: 74 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  t.pParse = pPars
6750: 65 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  e;.  sqlite3Reso
6760: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
6770: 61 6d 65 43 6f 6e 74 65 78 74 2c 20 70 57 68 65  ameContext, pWhe
6780: 72 65 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  re);..  /* Creat
6790: 65 20 56 44 42 45 20 74 6f 20 6c 6f 6f 70 20 74  e VDBE to loop t
67a0: 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69  hrough the entri
67b0: 65 73 20 69 6e 20 70 53 72 63 20 74 68 61 74 20  es in pSrc that 
67c0: 6d 61 74 63 68 20 74 68 65 20 57 48 45 52 45 0a  match the WHERE.
67d0: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 20 46 6f 72    ** clause. For
67e0: 20 65 61 63 68 20 72 6f 77 20 66 6f 75 6e 64 2c   each row found,
67f0: 20 69 6e 63 72 65 6d 65 6e 74 20 65 69 74 68 65   increment eithe
6800: 72 20 74 68 65 20 64 65 66 65 72 72 65 64 20 6f  r the deferred o
6810: 72 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 2a 2a  r immediate.  **
6820: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
6830: 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 2e  straint counter.
6840: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
6850: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
6860: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 70  (pParse, pSrc, p
6870: 57 68 65 72 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Where, 0, 0, 0, 
6880: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
6890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46 6b  eAddOp2(v, OP_Fk
68a0: 43 6f 75 6e 74 65 72 2c 20 70 46 4b 65 79 2d 3e  Counter, pFKey->
68b0: 69 73 44 65 66 65 72 72 65 64 2c 20 6e 49 6e 63  isDeferred, nInc
68c0: 72 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  r);.  if( pWInfo
68d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
68e0: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
68f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
6900: 20 75 70 20 74 68 65 20 57 48 45 52 45 20 63 6c   up the WHERE cl
6910: 61 75 73 65 20 63 6f 6e 73 74 72 75 63 74 65 64  ause constructed
6920: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 73 71 6c   above. */.  sql
6930: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6940: 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 69 66  b, pWhere);.  if
6950: 28 20 69 46 6b 49 66 5a 65 72 6f 20 29 7b 0a 20  ( iFkIfZero ){. 
6960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
6970: 6d 70 48 65 72 65 28 76 2c 20 69 46 6b 49 66 5a  mpHere(v, iFkIfZ
6980: 65 72 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ero);.  }.}../*.
6990: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
69a0: 20 72 65 74 75 72 6e 73 20 61 20 6c 69 6e 6b 65   returns a linke
69b0: 64 20 6c 69 73 74 20 6f 66 20 46 4b 65 79 20 6f  d list of FKey o
69c0: 62 6a 65 63 74 73 20 28 63 6f 6e 6e 65 63 74 65  bjects (connecte
69d0: 64 20 62 79 0a 2a 2a 20 46 4b 65 79 2e 70 4e 65  d by.** FKey.pNe
69e0: 78 74 54 6f 29 20 68 6f 6c 64 69 6e 67 20 61 6c  xtTo) holding al
69f0: 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 61  l children of ta
6a00: 62 6c 65 20 70 54 61 62 2e 20 20 46 6f 72 20 65  ble pTab.  For e
6a10: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 67 69 76 65 6e  xample,.** given
6a20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6a30: 63 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  chema:.**.**   C
6a40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6a50: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 2a   PRIMARY KEY);.*
6a60: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
6a70: 20 74 32 28 62 20 52 45 46 45 52 45 4e 43 45 53   t2(b REFERENCES
6a80: 20 74 31 28 61 29 3b 0a 2a 2a 0a 2a 2a 20 43 61   t1(a);.**.** Ca
6a90: 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
6aa0: 69 6f 6e 20 77 69 74 68 20 74 61 62 6c 65 20 22  ion with table "
6ab0: 74 31 22 20 61 73 20 61 6e 20 61 72 67 75 6d 65  t1" as an argume
6ac0: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nt returns a poi
6ad0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 46  nter.** to the F
6ae0: 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 72 65  Key structure re
6af0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 66  presenting the f
6b00: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
6b10: 72 61 69 6e 74 20 6f 6e 20 74 61 62 6c 65 0a 2a  raint on table.*
6b20: 2a 20 22 74 32 22 2e 20 43 61 6c 6c 69 6e 67 20  * "t2". Calling 
6b30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
6b40: 74 68 20 22 74 32 22 20 61 73 20 74 68 65 20 61  th "t2" as the a
6b50: 72 67 75 6d 65 6e 74 20 77 6f 75 6c 64 20 72 65  rgument would re
6b60: 74 75 72 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20 70  turn a.** NULL p
6b70: 6f 69 6e 74 65 72 20 28 61 73 20 74 68 65 72 65  ointer (as there
6b80: 20 61 72 65 20 6e 6f 20 46 4b 20 63 6f 6e 73 74   are no FK const
6b90: 72 61 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  raints for which
6ba0: 20 74 32 20 69 73 20 74 68 65 20 70 61 72 65 6e   t2 is the paren
6bb0: 74 0a 2a 2a 20 74 61 62 6c 65 29 2e 0a 2a 2f 0a  t.** table)..*/.
6bc0: 46 4b 65 79 20 2a 73 71 6c 69 74 65 33 46 6b 52  FKey *sqlite3FkR
6bd0: 65 66 65 72 65 6e 63 65 73 28 54 61 62 6c 65 20  eferences(Table 
6be0: 2a 70 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e  *pTab){.  return
6bf0: 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
6c00: 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 2d 3e  HashFind(&pTab->
6c10: 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
6c20: 68 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  h, pTab->zName);
6c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
6c40: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6c50: 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63   a Trigger struc
6c60: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62  ture allocated b
6c70: 79 20 74 68 65 20 0a 2a 2a 20 66 6b 41 63 74 69  y the .** fkActi
6c80: 6f 6e 54 72 69 67 67 65 72 28 29 20 72 6f 75 74  onTrigger() rout
6c90: 69 6e 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ine. This functi
6ca0: 6f 6e 20 64 65 6c 65 74 65 73 20 74 68 65 20 54  on deletes the T
6cb0: 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65  rigger structure
6cc0: 0a 2a 2a 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  .** and all of i
6cd0: 74 73 20 73 75 62 2d 63 6f 6d 70 6f 6e 65 6e 74  ts sub-component
6ce0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 72 69  s..**.** The Tri
6cf0: 67 67 65 72 20 73 74 72 75 63 74 75 72 65 20 6f  gger structure o
6d00: 72 20 61 6e 79 20 6f 66 20 69 74 73 20 73 75 62  r any of its sub
6d10: 2d 63 6f 6d 70 6f 6e 65 6e 74 73 20 6d 61 79 20  -components may 
6d20: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f  be allocated fro
6d30: 6d 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69  m.** the lookasi
6d40: 64 65 20 62 75 66 66 65 72 20 62 65 6c 6f 6e 67  de buffer belong
6d50: 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
6d60: 68 61 6e 64 6c 65 20 64 62 4d 65 6d 2e 0a 2a 2f  handle dbMem..*/
6d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6b 54  .static void fkT
6d80: 72 69 67 67 65 72 44 65 6c 65 74 65 28 73 71 6c  riggerDelete(sql
6d90: 69 74 65 33 20 2a 64 62 4d 65 6d 2c 20 54 72 69  ite3 *dbMem, Tri
6da0: 67 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  gger *p){.  if( 
6db0: 70 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  p ){.    Trigger
6dc0: 53 74 65 70 20 2a 70 53 74 65 70 20 3d 20 70 2d  Step *pStep = p-
6dd0: 3e 73 74 65 70 5f 6c 69 73 74 3b 0a 20 20 20 20  >step_list;.    
6de0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6df0: 65 28 64 62 4d 65 6d 2c 20 70 53 74 65 70 2d 3e  e(dbMem, pStep->
6e00: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
6e10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6e20: 74 65 28 64 62 4d 65 6d 2c 20 70 53 74 65 70 2d  te(dbMem, pStep-
6e30: 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20  >pExprList);.   
6e40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6e50: 6c 65 74 65 28 64 62 4d 65 6d 2c 20 70 53 74 65  lete(dbMem, pSte
6e60: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
6e70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6e80: 74 65 28 64 62 4d 65 6d 2c 20 70 2d 3e 70 57 68  te(dbMem, p->pWh
6e90: 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  en);.    sqlite3
6ea0: 44 62 46 72 65 65 28 64 62 4d 65 6d 2c 20 70 29  DbFree(dbMem, p)
6eb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6ec0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6ed0: 63 61 6c 6c 65 64 20 74 6f 20 67 65 6e 65 72 61  called to genera
6ee0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
6ef0: 73 20 77 68 65 6e 20 74 61 62 6c 65 20 70 54 61  s when table pTa
6f00: 62 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 64 72  b is.** being dr
6f10: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 64  opped from the d
6f20: 61 74 61 62 61 73 65 2e 20 54 68 65 20 53 72 63  atabase. The Src
6f30: 4c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  List passed as t
6f40: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6f50: 6e 74 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  nt.** to this fu
6f60: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
6f70: 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 67  a single entry g
6f80: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 72 65 73  uaranteed to res
6f90: 6f 6c 76 65 20 74 6f 0a 2a 2a 20 74 61 62 6c 65  olve to.** table
6fa0: 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72   pTab..**.** Nor
6fb0: 6d 61 6c 6c 79 2c 20 6e 6f 20 63 6f 64 65 20 69  mally, no code i
6fc0: 73 20 72 65 71 75 69 72 65 64 2e 20 48 6f 77 65  s required. Howe
6fd0: 76 65 72 2c 20 69 66 20 65 69 74 68 65 72 0a 2a  ver, if either.*
6fe0: 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 74  *.**   (a) The t
6ff0: 61 62 6c 65 20 69 73 20 74 68 65 20 70 61 72 65  able is the pare
7000: 6e 74 20 74 61 62 6c 65 20 6f 66 20 61 20 46 4b  nt table of a FK
7010: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 0a   constraint, or.
7020: 2a 2a 20 20 20 28 62 29 20 54 68 65 20 74 61 62  **   (b) The tab
7030: 6c 65 20 69 73 20 74 68 65 20 63 68 69 6c 64 20  le is the child 
7040: 74 61 62 6c 65 20 6f 66 20 61 20 64 65 66 65 72  table of a defer
7050: 72 65 64 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  red FK constrain
7060: 74 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20  t and it is.**  
7070: 20 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20       determined 
7080: 61 74 20 72 75 6e 74 69 6d 65 20 74 68 61 74 20  at runtime that 
7090: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
70a0: 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 46  nding deferred F
70b0: 4b 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 6e 73  K .**       cons
70c0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
70d0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
70e0: 65 2c 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  e,.**.** then th
70f0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
7100: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 3c 74 62  "DELETE FROM <tb
7110: 6c 3e 22 20 69 73 20 65 78 65 63 75 74 65 64 20  l>" is executed 
7120: 62 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67 0a  before dropping.
7130: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ** the table fro
7140: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
7150: 54 72 69 67 67 65 72 73 20 61 72 65 20 64 69 73  Triggers are dis
7160: 61 62 6c 65 64 20 77 68 69 6c 65 20 72 75 6e 6e  abled while runn
7170: 69 6e 67 20 74 68 69 73 0a 2a 2a 20 44 45 4c 45  ing this.** DELE
7180: 54 45 2c 20 62 75 74 20 66 6f 72 65 69 67 6e 20  TE, but foreign 
7190: 6b 65 79 20 61 63 74 69 6f 6e 73 20 61 72 65 20  key actions are 
71a0: 6e 6f 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  not..*/.void sql
71b0: 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
71c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
71d0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 54  rcList *pName, T
71e0: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 73  able *pTab){.  s
71f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7200: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
7210: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
7220: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 20 26 26  _ForeignKeys) &&
7230: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
7240: 29 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  ) && !pTab->pSel
7250: 65 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ect ){.    int i
7260: 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 56 64  Skip = 0;.    Vd
7270: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
7280: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
7290: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
72a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72b0: 20 20 20 2f 2a 20 56 44 42 45 20 68 61 73 20 61     /* VDBE has a
72c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
72d0: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
72e0: 20 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65   sqlite3FkRefere
72f0: 6e 63 65 73 28 70 54 61 62 29 3d 3d 30 20 29 7b  nces(pTab)==0 ){
7300: 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68  .      /* Search
7310: 20 66 6f 72 20 61 20 64 65 66 65 72 72 65 64 20   for a deferred 
7320: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
7330: 74 72 61 69 6e 74 20 66 6f 72 20 77 68 69 63 68  traint for which
7340: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 20 20   this table.    
7350: 20 20 2a 2a 20 69 73 20 74 68 65 20 63 68 69 6c    ** is the chil
7360: 64 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  d table. If one 
7370: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
7380: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
7390: 0a 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  .      ** genera
73a0: 74 69 6e 67 20 61 6e 79 20 56 44 42 45 20 63 6f  ting any VDBE co
73b0: 64 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  de. If one can b
73c0: 65 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 6a 75  e found, then ju
73d0: 6d 70 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a  mp over.      **
73e0: 20 74 68 65 20 65 6e 74 69 72 65 20 44 45 4c 45   the entire DELE
73f0: 54 45 20 69 66 20 74 68 65 72 65 20 61 72 65 20  TE if there are 
7400: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  no outstanding d
7410: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
7420: 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  nts.      ** whe
7430: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
7440: 20 69 73 20 72 75 6e 2e 20 20 2a 2f 0a 20 20 20   is run.  */.   
7450: 20 20 20 46 4b 65 79 20 2a 70 3b 0a 20 20 20 20     FKey *p;.    
7460: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46    for(p=pTab->pF
7470: 4b 65 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  Key; p; p=p->pNe
7480: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
7490: 20 69 66 28 20 70 2d 3e 69 73 44 65 66 65 72 72   if( p->isDeferr
74a0: 65 64 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73  ed || (db->flags
74b0: 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46   & SQLITE_DeferF
74c0: 4b 73 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Ks) ) break;.   
74d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
74e0: 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  p ) return;.    
74f0: 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69 74 65    iSkip = sqlite
7500: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
7510: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7530: 5f 46 6b 49 66 5a 65 72 6f 2c 20 31 2c 20 69 53  _FkIfZero, 1, iS
7540: 6b 69 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61  kip); VdbeCovera
7550: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ge(v);.    }..  
7560: 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
7570: 65 54 72 69 67 67 65 72 73 20 3d 20 31 3b 0a 20  eTriggers = 1;. 
7580: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
7590: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 73 71 6c  From(pParse, sql
75a0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
75b0: 62 2c 20 70 4e 61 6d 65 2c 20 30 29 2c 20 30 29  b, pName, 0), 0)
75c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69  ;.    pParse->di
75d0: 73 61 62 6c 65 54 72 69 67 67 65 72 73 20 3d 20  sableTriggers = 
75e0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
75f0: 65 20 44 45 4c 45 54 45 20 68 61 73 20 67 65 6e  e DELETE has gen
7600: 65 72 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  erated immediate
7610: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
7620: 73 74 72 61 69 6e 74 20 0a 20 20 20 20 2a 2a 20  straint .    ** 
7630: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 68 61 6c 74  violations, halt
7640: 20 74 68 65 20 56 44 42 45 20 61 6e 64 20 72 65   the VDBE and re
7650: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 61 74  turn an error at
7660: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 66   this point, bef
7670: 6f 72 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6d  ore.    ** any m
7680: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
7690: 74 68 65 20 73 63 68 65 6d 61 20 61 72 65 20 6d  the schema are m
76a0: 61 64 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ade. This is bec
76b0: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 0a 20  ause statement. 
76c0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
76d0: 6e 73 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20  ns are not able 
76e0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 73 63 68 65  to rollback sche
76f0: 6d 61 20 63 68 61 6e 67 65 73 2e 20 20 0a 20 20  ma changes.  .  
7700: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
7710: 68 65 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46  he SQLITE_DeferF
7720: 4b 73 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  Ks flag is set, 
7730: 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
7740: 20 72 65 71 75 69 72 65 64 2c 20 61 73 0a 20 20   required, as.  
7750: 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
7760: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
7770: 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65  ill not be rolle
7780: 64 20 62 61 63 6b 20 65 76 65 6e 20 69 66 20 46  d back even if F
7790: 4b 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61  K.    ** constra
77a0: 69 6e 74 73 20 61 72 65 20 76 69 6f 6c 61 74 65  ints are violate
77b0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
77c0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
77d0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 29 3d  QLITE_DeferFKs)=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
77f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7800: 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 2c 20 30 2c   OP_FkIfZero, 0,
7810: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7820: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
7830: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
7840: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
7850: 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
7860: 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
7870: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
7880: 49 47 4e 4b 45 59 2c 0a 20 20 20 20 20 20 20 20  IGNKEY,.        
7890: 20 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 20 50    OE_Abort, 0, P
78a0: 34 5f 53 54 41 54 49 43 2c 20 50 35 5f 43 6f 6e  4_STATIC, P5_Con
78b0: 73 74 72 61 69 6e 74 46 4b 29 3b 0a 20 20 20 20  straintFK);.    
78c0: 7d 0a 0a 20 20 20 20 69 66 28 20 69 53 6b 69 70  }..    if( iSkip
78d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
78e0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
78f0: 6c 28 76 2c 20 69 53 6b 69 70 29 3b 0a 20 20 20  l(v, iSkip);.   
7900: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
7910: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
7920: 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  ment points to a
7930: 6e 20 46 4b 65 79 20 6f 62 6a 65 63 74 20 72 65  n FKey object re
7940: 70 72 65 73 65 6e 74 69 6e 67 20 61 20 66 6f 72  presenting a for
7950: 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 66 6f 72 20  eign key.** for 
7960: 77 68 69 63 68 20 70 54 61 62 20 69 73 20 74 68  which pTab is th
7970: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 41  e child table. A
7980: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
7990: 6e 74 20 61 67 61 69 6e 73 74 20 70 54 61 62 0a  nt against pTab.
79a0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
79b0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
79c0: 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   For each column
79d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
79e0: 61 74 20 69 73 20 0a 2a 2a 20 61 63 74 75 61 6c  at is .** actual
79f0: 6c 79 20 75 70 64 61 74 65 64 2c 20 74 68 65 20  ly updated, the 
7a00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6c  corresponding el
7a10: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 43 68  ement in the aCh
7a20: 61 6e 67 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  ange[] array.** 
7a30: 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
7a40: 65 72 20 28 69 66 20 61 20 63 6f 6c 75 6d 6e 20  er (if a column 
7a50: 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 74 68  is unmodified th
7a60: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7a70: 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 73 65  element.** is se
7a80: 74 20 74 6f 20 2d 31 29 2e 20 49 66 20 74 68 65  t to -1). If the
7a90: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 73   rowid column is
7aa0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
7ab0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
7ac0: 74 0a 2a 2a 20 74 68 65 20 62 43 68 6e 67 52 6f  t.** the bChngRo
7ad0: 77 69 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  wid argument is 
7ae0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
7af0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
7b00: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 61 6e  turns true if an
7b10: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  y of the columns
7b20: 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
7b30: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 20 6b  f the.** child k
7b40: 65 79 20 66 6f 72 20 46 4b 20 63 6f 6e 73 74 72  ey for FK constr
7b50: 61 69 6e 74 20 2a 70 20 61 72 65 20 6d 6f 64 69  aint *p are modi
7b60: 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
7b70: 69 6e 74 20 66 6b 43 68 69 6c 64 49 73 4d 6f 64  int fkChildIsMod
7b80: 69 66 69 65 64 28 0a 20 20 54 61 62 6c 65 20 2a  ified(.  Table *
7b90: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
7ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7bb0: 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20  e being updated 
7bc0: 2a 2f 0a 20 20 46 4b 65 79 20 2a 70 2c 20 20 20  */.  FKey *p,   
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20       /* Foreign 
7bf0: 6b 65 79 20 66 6f 72 20 77 68 69 63 68 20 70 54  key for which pT
7c00: 61 62 20 69 73 20 74 68 65 20 63 68 69 6c 64 20  ab is the child 
7c10: 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 68 61 6e 67  */.  int *aChang
7c20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7c30: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 69 6e       /* Array in
7c40: 64 69 63 61 74 69 6e 67 20 6d 6f 64 69 66 69 65  dicating modifie
7c50: 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  d columns */.  i
7c60: 6e 74 20 62 43 68 6e 67 52 6f 77 69 64 20 20 20  nt bChngRowid   
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7c80: 2a 20 54 72 75 65 20 69 66 20 72 6f 77 69 64 20  * True if rowid 
7c90: 69 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  is modified by t
7ca0: 68 69 73 20 75 70 64 61 74 65 20 2a 2f 0a 29 7b  his update */.){
7cb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
7cc0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
7cd0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
7ce0: 68 69 6c 64 4b 65 79 20 3d 20 70 2d 3e 61 43 6f  hildKey = p->aCo
7cf0: 6c 5b 69 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20  l[i].iFrom;.    
7d00: 69 66 28 20 61 43 68 61 6e 67 65 5b 69 43 68 69  if( aChange[iChi
7d10: 6c 64 4b 65 79 5d 3e 3d 30 20 29 20 72 65 74 75  ldKey]>=0 ) retu
7d20: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 69 43  rn 1;.    if( iC
7d30: 68 69 6c 64 4b 65 79 3d 3d 70 54 61 62 2d 3e 69  hildKey==pTab->i
7d40: 50 4b 65 79 20 26 26 20 62 43 68 6e 67 52 6f 77  PKey && bChngRow
7d50: 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  id ) return 1;. 
7d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
7d80: 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  nd argument poin
7d90: 74 73 20 74 6f 20 61 6e 20 46 4b 65 79 20 6f 62  ts to an FKey ob
7da0: 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
7db0: 67 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a  g a foreign key.
7dc0: 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 70 54 61  ** for which pTa
7dd0: 62 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  b is the parent 
7de0: 74 61 62 6c 65 2e 20 41 6e 20 55 50 44 41 54 45  table. An UPDATE
7df0: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
7e00: 73 74 20 70 54 61 62 0a 2a 2a 20 69 73 20 63 75  st pTab.** is cu
7e10: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72  rrently being pr
7e20: 6f 63 65 73 73 65 64 2e 20 46 6f 72 20 65 61 63  ocessed. For eac
7e30: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
7e40: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 0a 2a  table that is .*
7e50: 2a 20 61 63 74 75 61 6c 6c 79 20 75 70 64 61 74  * actually updat
7e60: 65 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ed, the correspo
7e70: 6e 64 69 6e 67 20 65 6c 65 6d 65 6e 74 20 69 6e  nding element in
7e80: 20 74 68 65 20 61 43 68 61 6e 67 65 5b 5d 20 61   the aChange[] a
7e90: 72 72 61 79 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rray.** is zero 
7ea0: 6f 72 20 67 72 65 61 74 65 72 20 28 69 66 20 61  or greater (if a
7eb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 6e 6d 6f 64   column is unmod
7ec0: 69 66 69 65 64 20 74 68 65 20 63 6f 72 72 65 73  ified the corres
7ed0: 70 6f 6e 64 69 6e 67 20 65 6c 65 6d 65 6e 74 0a  ponding element.
7ee0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 29  ** is set to -1)
7ef0: 2e 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63  . If the rowid c
7f00: 6f 6c 75 6d 6e 20 69 73 20 6d 6f 64 69 66 69 65  olumn is modifie
7f10: 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45 20  d by the UPDATE 
7f20: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  statement.** the
7f30: 20 62 43 68 6e 67 52 6f 77 69 64 20 61 72 67 75   bChngRowid argu
7f40: 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
7f50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
7f60: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
7f70: 75 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ue if any of the
7f80: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
7f90: 65 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  e part of the.**
7fa0: 20 70 61 72 65 6e 74 20 6b 65 79 20 66 6f 72 20   parent key for 
7fb0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  FK constraint *p
7fc0: 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   are modified..*
7fd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6b 50  /.static int fkP
7fe0: 61 72 65 6e 74 49 73 4d 6f 64 69 66 69 65 64 28  arentIsModified(
7ff0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
8000: 0a 20 20 46 4b 65 79 20 2a 70 2c 20 0a 20 20 69  .  FKey *p, .  i
8010: 6e 74 20 2a 61 43 68 61 6e 67 65 2c 20 0a 20 20  nt *aChange, .  
8020: 69 6e 74 20 62 43 68 6e 67 52 6f 77 69 64 0a 29  int bChngRowid.)
8030: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
8040: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8050: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
8060: 2a 7a 4b 65 79 20 3d 20 70 2d 3e 61 43 6f 6c 5b  *zKey = p->aCol[
8070: 69 5d 2e 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  i].zCol;.    int
8080: 20 69 4b 65 79 3b 0a 20 20 20 20 66 6f 72 28 69   iKey;.    for(i
8090: 4b 65 79 3d 30 3b 20 69 4b 65 79 3c 70 54 61 62  Key=0; iKey<pTab
80a0: 2d 3e 6e 43 6f 6c 3b 20 69 4b 65 79 2b 2b 29 7b  ->nCol; iKey++){
80b0: 0a 20 20 20 20 20 20 69 66 28 20 61 43 68 61 6e  .      if( aChan
80c0: 67 65 5b 69 4b 65 79 5d 3e 3d 30 20 7c 7c 20 28  ge[iKey]>=0 || (
80d0: 69 4b 65 79 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iKey==pTab->iPKe
80e0: 79 20 26 26 20 62 43 68 6e 67 52 6f 77 69 64 29  y && bChngRowid)
80f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75   ){.        Colu
8100: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62  mn *pCol = &pTab
8110: 2d 3e 61 43 6f 6c 5b 69 4b 65 79 5d 3b 0a 20 20  ->aCol[iKey];.  
8120: 20 20 20 20 20 20 69 66 28 20 7a 4b 65 79 20 29        if( zKey )
8130: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8140: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
8150: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
8160: 4b 65 79 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Key) ) return 1;
8170: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8180: 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  f( pCol->colFlag
8190: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
81a0: 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  KEY ){.         
81b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
81c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
81d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
81e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
81f0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
8200: 61 72 73 65 72 20 70 61 73 73 65 64 20 61 73 20  arser passed as 
8210: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
8220: 6e 74 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 75  nt is being.** u
8230: 73 65 64 20 74 6f 20 63 6f 64 65 20 61 20 74 72  sed to code a tr
8240: 69 67 67 65 72 20 74 68 61 74 20 69 73 20 72 65  igger that is re
8250: 61 6c 6c 79 20 61 20 22 53 45 54 20 4e 55 4c 4c  ally a "SET NULL
8260: 22 20 61 63 74 69 6f 6e 20 62 65 6c 6f 6e 67 69  " action belongi
8270: 6e 67 0a 2a 2a 20 74 6f 20 74 72 69 67 67 65 72  ng.** to trigger
8280: 20 70 46 4b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69   pFKey..*/.stati
8290: 63 20 69 6e 74 20 69 73 53 65 74 4e 75 6c 6c 41  c int isSetNullA
82a0: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
82b0: 72 73 65 2c 20 46 4b 65 79 20 2a 70 46 4b 65 79  rse, FKey *pFKey
82c0: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
82d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
82e0: 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
82f0: 0a 20 20 69 66 28 20 70 54 6f 70 2d 3e 70 54 72  .  if( pTop->pTr
8300: 69 67 67 65 72 50 72 67 20 29 7b 0a 20 20 20 20  iggerPrg ){.    
8310: 54 72 69 67 67 65 72 20 2a 70 20 3d 20 70 54 6f  Trigger *p = pTo
8320: 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 2d 3e  p->pTriggerPrg->
8330: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69 66  pTrigger;.    if
8340: 28 20 28 70 3d 3d 70 46 4b 65 79 2d 3e 61 70 54  ( (p==pFKey->apT
8350: 72 69 67 67 65 72 5b 30 5d 20 26 26 20 70 46 4b  rigger[0] && pFK
8360: 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 3d 3d  ey->aAction[0]==
8370: 4f 45 5f 53 65 74 4e 75 6c 6c 29 0a 20 20 20 20  OE_SetNull).    
8380: 20 7c 7c 20 28 70 3d 3d 70 46 4b 65 79 2d 3e 61   || (p==pFKey->a
8390: 70 54 72 69 67 67 65 72 5b 31 5d 20 26 26 20 70  pTrigger[1] && p
83a0: 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
83b0: 3d 3d 4f 45 5f 53 65 74 4e 75 6c 6c 29 0a 20 20  ==OE_SetNull).  
83c0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
83d0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
83e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8400: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
8410: 20 69 6e 73 65 72 74 69 6e 67 2c 20 64 65 6c 65   inserting, dele
8420: 74 69 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67  ting or updating
8430: 20 61 20 72 6f 77 20 6f 66 0a 2a 2a 20 74 61 62   a row of.** tab
8440: 6c 65 20 70 54 61 62 20 74 6f 20 67 65 6e 65 72  le pTab to gener
8450: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ate VDBE code to
8460: 20 70 65 72 66 6f 72 6d 20 66 6f 72 65 69 67 6e   perform foreign
8470: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
8480: 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 66  .** processing f
8490: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  or the operation
84a0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 44 45  ..**.** For a DE
84b0: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  LETE operation, 
84c0: 70 61 72 61 6d 65 74 65 72 20 72 65 67 4f 6c 64  parameter regOld
84d0: 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69   is passed the i
84e0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 66  ndex of the.** f
84f0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
8500: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 28 70 54   an array of (pT
8510: 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 72 65 67 69  ab->nCol+1) regi
8520: 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
8530: 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20 6f 66   the.** rowid of
8540: 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
8550: 65 6c 65 74 65 64 2c 20 66 6f 6c 6c 6f 77 65 64  eleted, followed
8560: 20 62 79 20 65 61 63 68 20 6f 66 20 74 68 65 20   by each of the 
8570: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 0a 2a 2a  column values.**
8580: 20 6f 66 20 74 68 65 20 72 6f 77 20 62 65 69 6e   of the row bein
8590: 67 20 64 65 6c 65 74 65 64 2c 20 66 72 6f 6d 20  g deleted, from 
85a0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 50  left to right. P
85b0: 61 72 61 6d 65 74 65 72 20 72 65 67 4e 65 77 20  arameter regNew 
85c0: 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 7a 65 72  is passed.** zer
85d0: 6f 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  o in this case..
85e0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 53  **.** For an INS
85f0: 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 72  ERT operation, r
8600: 65 67 4f 6c 64 20 69 73 20 70 61 73 73 65 64 20  egOld is passed 
8610: 7a 65 72 6f 20 61 6e 64 20 72 65 67 4e 65 77 20  zero and regNew 
8620: 69 73 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  is passed the.**
8630: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
8640: 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20 28  of an array of (
8650: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 72 65  pTab->nCol+1) re
8660: 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69  gisters containi
8670: 6e 67 20 74 68 65 20 6e 65 77 0a 2a 2a 20 72 6f  ng the new.** ro
8680: 77 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 6f  w data..**.** Fo
8690: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  r an UPDATE oper
86a0: 61 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63  ation, this func
86b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
86c0: 77 69 63 65 2e 20 4f 6e 63 65 20 62 65 66 6f 72  wice. Once befor
86d0: 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61  e.** the origina
86e0: 6c 20 72 65 63 6f 72 64 20 69 73 20 64 65 6c 65  l record is dele
86f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ted from the tab
8700: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  le using the cal
8710: 6c 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 0a  ling convention.
8720: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  ** described for
8730: 20 44 45 4c 45 54 45 2e 20 54 68 65 6e 20 61 67   DELETE. Then ag
8740: 61 69 6e 20 61 66 74 65 72 20 74 68 65 20 6f 72  ain after the or
8750: 69 67 69 6e 61 6c 20 72 65 63 6f 72 64 20 69 73  iginal record is
8760: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 62 75 74 20   deleted.** but 
8770: 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 72  before the new r
8780: 65 63 6f 72 64 20 69 73 20 69 6e 73 65 72 74 65  ecord is inserte
8790: 64 20 75 73 69 6e 67 20 74 68 65 20 49 4e 53 45  d using the INSE
87a0: 52 54 20 63 6f 6e 76 65 6e 74 69 6f 6e 2e 20 0a  RT convention. .
87b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
87c0: 6b 43 68 65 63 6b 28 0a 20 20 50 61 72 73 65 20  kCheck(.  Parse 
87d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
87e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
87f0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
8800: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 2f 2a 20 52 6f 77 20 69 73 20 62 65 69 6e 67 20  /* Row is being 
8830: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 69  deleted from thi
8840: 73 20 74 61 62 6c 65 20 2a 2f 20 0a 20 20 69 6e  s table */ .  in
8850: 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20 20 20  t regOld,       
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8870: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 64 61   Previous row da
8880: 74 61 20 69 73 20 73 74 6f 72 65 64 20 68 65 72  ta is stored her
8890: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65  e */.  int regNe
88a0: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
88b0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 6f         /* New ro
88c0: 77 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64  w data is stored
88d0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
88e0: 61 43 68 61 6e 67 65 2c 20 20 20 20 20 20 20 20  aChange,        
88f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8900: 72 61 79 20 69 6e 64 69 63 61 74 69 6e 67 20 55  ray indicating U
8910: 50 44 41 54 45 64 20 63 6f 6c 75 6d 6e 73 20 28  PDATEd columns (
8920: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 62  or 0) */.  int b
8930: 43 68 6e 67 52 6f 77 69 64 20 20 20 20 20 20 20  ChngRowid       
8940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8950: 75 65 20 69 66 20 72 6f 77 69 64 20 69 73 20 55  ue if rowid is U
8960: 50 44 41 54 45 64 20 2a 2f 0a 29 7b 0a 20 20 73  PDATEd */.){.  s
8970: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8980: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
8990: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
89a0: 65 20 2a 2f 0a 20 20 46 4b 65 79 20 2a 70 46 4b  e */.  FKey *pFK
89b0: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
89c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
89d0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
89e0: 68 20 46 4b 73 20 2a 2f 0a 20 20 69 6e 74 20 69  h FKs */.  int i
89f0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
8a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8a10: 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20  dex of database 
8a20: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 20  containing pTab 
8a30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8a40: 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
8a50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8a60: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
8a70: 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ing pTab */.  in
8a80: 74 20 69 73 49 67 6e 6f 72 65 45 72 72 6f 72 73  t isIgnoreErrors
8a90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62   = pParse->disab
8aa0: 6c 65 54 72 69 67 67 65 72 73 3b 0a 0a 20 20 2f  leTriggers;..  /
8ab0: 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  * Exactly one of
8ac0: 20 72 65 67 4f 6c 64 20 61 6e 64 20 72 65 67 4e   regOld and regN
8ad0: 65 77 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  ew should be non
8ae0: 2d 7a 65 72 6f 2e 20 2a 2f 0a 20 20 61 73 73 65  -zero. */.  asse
8af0: 72 74 28 20 28 72 65 67 4f 6c 64 3d 3d 30 29 21  rt( (regOld==0)!
8b00: 3d 28 72 65 67 4e 65 77 3d 3d 30 29 20 29 3b 0a  =(regNew==0) );.
8b10: 0a 20 20 2f 2a 20 49 66 20 66 6f 72 65 69 67 6e  .  /* If foreign
8b20: 2d 6b 65 79 73 20 61 72 65 20 64 69 73 61 62 6c  -keys are disabl
8b30: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
8b40: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  n is a no-op. */
8b50: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
8b60: 73 26 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  s&SQLITE_Foreign
8b70: 4b 65 79 73 29 3d 3d 30 20 29 20 72 65 74 75 72  Keys)==0 ) retur
8b80: 6e 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  n;..  iDb = sqli
8b90: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
8ba0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
8bb0: 6d 61 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  ma);.  zDb = db-
8bc0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
8bd0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
8be0: 75 67 68 20 61 6c 6c 20 74 68 65 20 66 6f 72 65  ugh all the fore
8bf0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
8c00: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  nts for which pT
8c10: 61 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 63  ab is the.  ** c
8c20: 68 69 6c 64 20 74 61 62 6c 65 20 28 74 68 65 20  hild table (the 
8c30: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
8c40: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
8c50: 69 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ition is part of
8c60: 29 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b  ).  */.  for(pFK
8c70: 65 79 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  ey=pTab->pFKey; 
8c80: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
8c90: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
8ca0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 6f 3b 20      Table *pTo; 
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
8cd0: 65 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  e of foreign key
8ce0: 20 70 46 4b 65 79 20 2a 2f 0a 20 20 20 20 49 6e   pFKey */.    In
8cf0: 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 20 20  dex *pIdx = 0;  
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8d10: 6e 64 65 78 20 6f 6e 20 6b 65 79 20 63 6f 6c 75  ndex on key colu
8d20: 6d 6e 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20  mns in pTo */.  
8d30: 20 20 69 6e 74 20 2a 61 69 46 72 65 65 20 3d 20    int *aiFree = 
8d40: 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  0;.    int *aiCo
8d50: 6c 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  l;.    int iCol;
8d60: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
8d70: 69 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b  int bIgnore = 0;
8d80: 0a 0a 20 20 20 20 69 66 28 20 61 43 68 61 6e 67  ..    if( aChang
8d90: 65 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  e .     && sqlit
8da0: 65 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d  e3_stricmp(pTab-
8db0: 3e 7a 4e 61 6d 65 2c 20 70 46 4b 65 79 2d 3e 7a  >zName, pFKey->z
8dc0: 54 6f 29 21 3d 30 0a 20 20 20 20 20 26 26 20 66  To)!=0.     && f
8dd0: 6b 43 68 69 6c 64 49 73 4d 6f 64 69 66 69 65 64  kChildIsModified
8de0: 28 70 54 61 62 2c 20 70 46 4b 65 79 2c 20 61 43  (pTab, pFKey, aC
8df0: 68 61 6e 67 65 2c 20 62 43 68 6e 67 52 6f 77 69  hange, bChngRowi
8e00: 64 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  d)==0 .    ){.  
8e10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8e20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
8e30: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
8e40: 65 20 6f 66 20 74 68 69 73 20 66 6f 72 65 69 67  e of this foreig
8e50: 6e 20 6b 65 79 2e 20 41 6c 73 6f 20 66 69 6e 64  n key. Also find
8e60: 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20   a unique index 
8e70: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
8e80: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
8e90: 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
8ea0: 74 61 62 6c 65 2e 20 49 66 20 65 69 74 68 65 72  table. If either
8eb0: 20 6f 66 20 74 68 65 73 65 20 0a 20 20 20 20 2a   of these .    *
8ec0: 2a 20 73 63 68 65 6d 61 20 69 74 65 6d 73 20 63  * schema items c
8ed0: 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 61 74 65 64  annot be located
8ee0: 2c 20 73 65 74 20 61 6e 20 65 72 72 6f 72 20 69  , set an error i
8ef0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
8f00: 75 72 6e 20 0a 20 20 20 20 2a 2a 20 65 61 72 6c  urn .    ** earl
8f10: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  y.  */.    if( p
8f20: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54 72  Parse->disableTr
8f30: 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 20 20  iggers ){.      
8f40: 70 54 6f 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  pTo = sqlite3Fin
8f50: 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 65 79  dTable(db, pFKey
8f60: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
8f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
8f80: 6f 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  o = sqlite3Locat
8f90: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
8fa0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 7a 44  , pFKey->zTo, zD
8fb0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  b);.    }.    if
8fc0: 28 20 21 70 54 6f 20 7c 7c 20 73 71 6c 69 74 65  ( !pTo || sqlite
8fd0: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
8fe0: 50 61 72 73 65 2c 20 70 54 6f 2c 20 70 46 4b 65  Parse, pTo, pFKe
8ff0: 79 2c 20 26 70 49 64 78 2c 20 26 61 69 46 72 65  y, &pIdx, &aiFre
9000: 65 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  e) ){.      asse
9010: 72 74 28 20 69 73 49 67 6e 6f 72 65 45 72 72 6f  rt( isIgnoreErro
9020: 72 73 3d 3d 30 20 7c 7c 20 28 72 65 67 4f 6c 64  rs==0 || (regOld
9030: 21 3d 30 20 26 26 20 72 65 67 4e 65 77 3d 3d 30  !=0 && regNew==0
9040: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ) );.      if( !
9050: 69 73 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 7c  isIgnoreErrors |
9060: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9070: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
9080: 20 20 20 69 66 28 20 70 54 6f 3d 3d 30 20 29 7b     if( pTo==0 ){
9090: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
90a0: 73 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 69 73  sIgnoreErrors is
90b0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 74 61   true, then a ta
90c0: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 64 72 6f  ble is being dro
90d0: 70 70 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20  pped. In this.  
90e0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 53 51        ** case SQ
90f0: 4c 69 74 65 20 72 75 6e 73 20 61 20 22 44 45 4c  Lite runs a "DEL
9100: 45 54 45 20 46 52 4f 4d 20 78 78 78 22 20 6f 6e  ETE FROM xxx" on
9110: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
9120: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 20   dropped.       
9130: 20 2a 2a 20 62 65 66 6f 72 65 20 61 63 74 75 61   ** before actua
9140: 6c 6c 79 20 64 72 6f 70 70 69 6e 67 20 69 74 20  lly dropping it 
9150: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63  in order to chec
9160: 6b 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  k FK constraints
9170: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ..        ** If 
9180: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
9190: 20 6f 66 20 61 6e 20 46 4b 20 63 6f 6e 73 74 72   of an FK constr
91a0: 61 69 6e 74 20 6f 6e 20 74 68 65 20 63 75 72 72  aint on the curr
91b0: 65 6e 74 20 74 61 62 6c 65 20 69 73 0a 20 20 20  ent table is.   
91c0: 20 20 20 20 20 2a 2a 20 6d 69 73 73 69 6e 67 2c       ** missing,
91d0: 20 62 65 68 61 76 65 20 61 73 20 69 66 20 69 74   behave as if it
91e0: 20 69 73 20 65 6d 70 74 79 2e 20 69 2e 65 2e 20   is empty. i.e. 
91f0: 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  decrement the re
9200: 6c 65 76 61 6e 74 0a 20 20 20 20 20 20 20 20 2a  levant.        *
9210: 2a 20 46 4b 20 63 6f 75 6e 74 65 72 20 66 6f 72  * FK counter for
9220: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
9230: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 77   current table w
9240: 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 6b 65 79  ith non-NULL key
9250: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
9260: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
9270: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9280: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
9290: 69 6e 74 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69  int iJump = sqli
92a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
92b0: 64 72 28 76 29 20 2b 20 70 46 4b 65 79 2d 3e 6e  dr(v) + pFKey->n
92c0: 43 6f 6c 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Col + 1;.       
92d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46 4b 65   for(i=0; i<pFKe
92e0: 79 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  y->nCol; i++){. 
92f0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65           int iRe
9300: 67 20 3d 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  g = pFKey->aCol[
9310: 69 5d 2e 69 46 72 6f 6d 20 2b 20 72 65 67 4f 6c  i].iFrom + regOl
9320: 64 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d + 1;.         
9330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9340: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
9350: 20 69 52 65 67 2c 20 69 4a 75 6d 70 29 3b 20 56   iReg, iJump); V
9360: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9370: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9390: 4f 70 32 28 76 2c 20 4f 50 5f 46 6b 43 6f 75 6e  Op2(v, OP_FkCoun
93a0: 74 65 72 2c 20 70 46 4b 65 79 2d 3e 69 73 44 65  ter, pFKey->isDe
93b0: 66 65 72 72 65 64 2c 20 2d 31 29 3b 0a 20 20 20  ferred, -1);.   
93c0: 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
93d0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  nue;.    }.    a
93e0: 73 73 65 72 74 28 20 70 46 4b 65 79 2d 3e 6e 43  ssert( pFKey->nC
93f0: 6f 6c 3d 3d 31 20 7c 7c 20 28 61 69 46 72 65 65  ol==1 || (aiFree
9400: 20 26 26 20 70 49 64 78 29 20 29 3b 0a 0a 20 20   && pIdx) );..  
9410: 20 20 69 66 28 20 61 69 46 72 65 65 20 29 7b 0a    if( aiFree ){.
9420: 20 20 20 20 20 20 61 69 43 6f 6c 20 3d 20 61 69        aiCol = ai
9430: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
9440: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 46  .      iCol = pF
9450: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
9460: 6f 6d 3b 0a 20 20 20 20 20 20 61 69 43 6f 6c 20  om;.      aiCol 
9470: 3d 20 26 69 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20  = &iCol;.    }. 
9480: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46     for(i=0; i<pF
9490: 4b 65 79 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Key->nCol; i++){
94a0: 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c  .      if( aiCol
94b0: 5b 69 5d 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  [i]==pTab->iPKey
94c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f   ){.        aiCo
94d0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  l[i] = -1;.     
94e0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
94f0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
9500: 54 49 4f 4e 0a 20 20 20 20 20 20 2f 2a 20 52 65  TION.      /* Re
9510: 71 75 65 73 74 20 70 65 72 6d 69 73 73 69 6f 6e  quest permission
9520: 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 72   to read the par
9530: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ent key columns.
9540: 20 49 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   If the .      *
9550: 2a 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * authorization 
9560: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
9570: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
9580: 62 65 68 61 76 65 20 61 73 20 69 66 20 61 6e 79  behave as if any
9590: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  .      ** values
95a0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
95b0: 61 72 65 6e 74 20 74 61 62 6c 65 20 61 72 65 20  arent table are 
95c0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 69  NULL. */.      i
95d0: 66 28 20 64 62 2d 3e 78 41 75 74 68 20 29 7b 0a  f( db->xAuth ){.
95e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 61 75          int rcau
95f0: 74 68 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  th;.        char
9600: 20 2a 7a 43 6f 6c 20 3d 20 70 54 6f 2d 3e 61 43   *zCol = pTo->aC
9610: 6f 6c 5b 70 49 64 78 20 3f 20 70 49 64 78 2d 3e  ol[pIdx ? pIdx->
9620: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3a 20 70 54  aiColumn[i] : pT
9630: 6f 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 3b  o->iPKey].zName;
9640: 0a 20 20 20 20 20 20 20 20 72 63 61 75 74 68 20  .        rcauth 
9650: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61  = sqlite3AuthRea
9660: 64 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 54 6f  dCol(pParse, pTo
9670: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 2c 20 69  ->zName, zCol, i
9680: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 62 49 67  Db);.        bIg
9690: 6e 6f 72 65 20 3d 20 28 72 63 61 75 74 68 3d 3d  nore = (rcauth==
96a0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 29 3b 0a  SQLITE_IGNORE);.
96b0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
96c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 61 6b     }..    /* Tak
96d0: 65 20 61 20 73 68 61 72 65 64 2d 63 61 63 68 65  e a shared-cache
96e0: 20 61 64 76 69 73 6f 72 79 20 72 65 61 64 2d 6c   advisory read-l
96f0: 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ock on the paren
9700: 74 20 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74  t table. Allocat
9710: 65 20 0a 20 20 20 20 2a 2a 20 61 20 63 75 72 73  e .    ** a curs
9720: 6f 72 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61  or to use to sea
9730: 72 63 68 20 74 68 65 20 75 6e 69 71 75 65 20 69  rch the unique i
9740: 6e 64 65 78 20 6f 6e 20 74 68 65 20 70 61 72 65  ndex on the pare
9750: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 0a  nt key columns .
9760: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 70 61      ** in the pa
9770: 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  rent table.  */.
9780: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
9790: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
97a0: 2c 20 70 54 6f 2d 3e 74 6e 75 6d 2c 20 30 2c 20  , pTo->tnum, 0, 
97b0: 70 54 6f 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pTo->zName);.   
97c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
97d0: 0a 0a 20 20 20 20 69 66 28 20 72 65 67 4f 6c 64  ..    if( regOld
97e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
97f0: 41 20 72 6f 77 20 69 73 20 62 65 69 6e 67 20 72  A row is being r
9800: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
9810: 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 53 65 61  child table. Sea
9820: 72 63 68 20 66 6f 72 20 74 68 65 20 70 61 72 65  rch for the pare
9830: 6e 74 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  nt..      ** If 
9840: 74 68 65 20 70 61 72 65 6e 74 20 64 6f 65 73 20  the parent does 
9850: 6e 6f 74 20 65 78 69 73 74 2c 20 72 65 6d 6f 76  not exist, remov
9860: 69 6e 67 20 74 68 65 20 63 68 69 6c 64 20 72 6f  ing the child ro
9870: 77 20 72 65 73 6f 6c 76 65 73 20 61 6e 20 0a 20  w resolves an . 
9880: 20 20 20 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64       ** outstand
9890: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ing foreign key 
98a0: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
98b0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 66  tion. */.      f
98c0: 6b 4c 6f 6f 6b 75 70 50 61 72 65 6e 74 28 70 50  kLookupParent(pP
98d0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 6f 2c 20  arse, iDb, pTo, 
98e0: 70 49 64 78 2c 20 70 46 4b 65 79 2c 20 61 69 43  pIdx, pFKey, aiC
98f0: 6f 6c 2c 20 72 65 67 4f 6c 64 2c 20 2d 31 2c 20  ol, regOld, -1, 
9900: 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20 20 7d 0a  bIgnore);.    }.
9910: 20 20 20 20 69 66 28 20 72 65 67 4e 65 77 21 3d      if( regNew!=
9920: 30 20 26 26 20 21 69 73 53 65 74 4e 75 6c 6c 41  0 && !isSetNullA
9930: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
9940: 4b 65 79 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Key) ){.      /*
9950: 20 41 20 72 6f 77 20 69 73 20 62 65 69 6e 67 20   A row is being 
9960: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 69  added to the chi
9970: 6c 64 20 74 61 62 6c 65 2e 20 49 66 20 61 20 70  ld table. If a p
9980: 61 72 65 6e 74 20 72 6f 77 20 63 61 6e 6e 6f 74  arent row cannot
9990: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 66 6f 75  .      ** be fou
99a0: 6e 64 2c 20 61 64 64 69 6e 67 20 74 68 65 20 63  nd, adding the c
99b0: 68 69 6c 64 20 72 6f 77 20 68 61 73 20 76 69 6f  hild row has vio
99c0: 6c 61 74 65 64 20 74 68 65 20 46 4b 20 63 6f 6e  lated the FK con
99d0: 73 74 72 61 69 6e 74 2e 20 0a 20 20 20 20 20 20  straint. .      
99e0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
99f0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
9a00: 20 62 65 69 6e 67 20 70 65 72 66 6f 72 6d 65 64   being performed
9a10: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 74 72   as part of a tr
9a20: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 20 20  igger program.  
9a30: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 61      ** that is a
9a40: 63 74 75 61 6c 6c 79 20 61 20 22 53 45 54 20 4e  ctually a "SET N
9a50: 55 4c 4c 22 20 61 63 74 69 6f 6e 20 62 65 6c 6f  ULL" action belo
9a60: 6e 67 69 6e 67 20 74 6f 20 74 68 69 73 20 76 65  nging to this ve
9a70: 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ry .      ** for
9a80: 65 69 67 6e 20 6b 65 79 2c 20 74 68 65 6e 20 6f  eign key, then o
9a90: 6d 69 74 20 74 68 69 73 20 73 63 61 6e 20 61 6c  mit this scan al
9aa0: 74 6f 67 65 74 68 65 72 2e 20 41 73 20 61 6c 6c  together. As all
9ab0: 20 63 68 69 6c 64 20 6b 65 79 0a 20 20 20 20 20   child key.     
9ac0: 20 2a 2a 20 76 61 6c 75 65 73 20 61 72 65 20 67   ** values are g
9ad0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
9ae0: 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6e 6f 74 20  NULL, it is not 
9af0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 64 64  possible for add
9b00: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
9b10: 73 20 72 6f 77 20 74 6f 20 63 61 75 73 65 20 61  s row to cause a
9b20: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20  n FK violation. 
9b30: 20 2a 2f 0a 20 20 20 20 20 20 66 6b 4c 6f 6f 6b   */.      fkLook
9b40: 75 70 50 61 72 65 6e 74 28 70 50 61 72 73 65 2c  upParent(pParse,
9b50: 20 69 44 62 2c 20 70 54 6f 2c 20 70 49 64 78 2c   iDb, pTo, pIdx,
9b60: 20 70 46 4b 65 79 2c 20 61 69 43 6f 6c 2c 20 72   pFKey, aiCol, r
9b70: 65 67 4e 65 77 2c 20 2b 31 2c 20 62 49 67 6e 6f  egNew, +1, bIgno
9b80: 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  re);.    }..    
9b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9ba0: 2c 20 61 69 46 72 65 65 29 3b 0a 20 20 7d 0a 0a  , aiFree);.  }..
9bb0: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
9bc0: 68 20 61 6c 6c 20 74 68 65 20 66 6f 72 65 69 67  h all the foreig
9bd0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
9be0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
9bf0: 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  this table..  **
9c00: 20 28 74 68 65 20 22 63 68 69 6c 64 22 20 63 6f   (the "child" co
9c10: 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20  nstraints) */.  
9c20: 66 6f 72 28 70 46 4b 65 79 20 3d 20 73 71 6c 69  for(pFKey = sqli
9c30: 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28  te3FkReferences(
9c40: 70 54 61 62 29 3b 20 70 46 4b 65 79 3b 20 70 46  pTab); pFKey; pF
9c50: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
9c60: 54 6f 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  To){.    Index *
9c70: 70 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  pIdx = 0;       
9c80: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67         /* Foreig
9c90: 6e 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20  n key index for 
9ca0: 70 46 4b 65 79 20 2a 2f 0a 20 20 20 20 53 72 63  pFKey */.    Src
9cb0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20  List *pSrc;.    
9cc0: 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 30 3b 0a  int *aiCol = 0;.
9cd0: 0a 20 20 20 20 69 66 28 20 61 43 68 61 6e 67 65  .    if( aChange
9ce0: 20 26 26 20 66 6b 50 61 72 65 6e 74 49 73 4d 6f   && fkParentIsMo
9cf0: 64 69 66 69 65 64 28 70 54 61 62 2c 20 70 46 4b  dified(pTab, pFK
9d00: 65 79 2c 20 61 43 68 61 6e 67 65 2c 20 62 43 68  ey, aChange, bCh
9d10: 6e 67 52 6f 77 69 64 29 3d 3d 30 20 29 7b 0a 20  ngRowid)==0 ){. 
9d20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9d30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
9d40: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
9d50: 20 26 26 20 21 28 64 62 2d 3e 66 6c 61 67 73 20   && !(db->flags 
9d60: 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  & SQLITE_DeferFK
9d70: 73 29 20 0a 20 20 20 20 20 26 26 20 21 70 50 61  s) .     && !pPa
9d80: 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 26  rse->pToplevel &
9d90: 26 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  & !pParse->isMul
9da0: 74 69 57 72 69 74 65 20 0a 20 20 20 20 29 7b 0a  tiWrite .    ){.
9db0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
9dc0: 67 4f 6c 64 3d 3d 30 20 26 26 20 72 65 67 4e 65  gOld==0 && regNe
9dd0: 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  w!=0 );.      /*
9de0: 20 49 6e 73 65 72 74 69 6e 67 20 61 20 73 69 6e   Inserting a sin
9df0: 67 6c 65 20 72 6f 77 20 69 6e 74 6f 20 61 20 70  gle row into a p
9e00: 61 72 65 6e 74 20 74 61 62 6c 65 20 63 61 6e 6e  arent table cann
9e10: 6f 74 20 63 61 75 73 65 20 28 6f 72 20 66 69 78  ot cause (or fix
9e20: 29 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6d  ).      ** an im
9e30: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
9e40: 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 53  key violation. S
9e50: 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 20 69 6e 20  o do nothing in 
9e60: 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
9e70: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9e80: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
9e90: 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64  lite3FkLocateInd
9ea0: 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
9eb0: 20 70 46 4b 65 79 2c 20 26 70 49 64 78 2c 20 26   pFKey, &pIdx, &
9ec0: 61 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  aiCol) ){.      
9ed0: 69 66 28 20 21 69 73 49 67 6e 6f 72 65 45 72 72  if( !isIgnoreErr
9ee0: 6f 72 73 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ors || db->mallo
9ef0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
9f00: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
9f10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
9f20: 72 74 28 20 61 69 43 6f 6c 20 7c 7c 20 70 46 4b  rt( aiCol || pFK
9f30: 65 79 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 0a  ey->nCol==1 );..
9f40: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
9f50: 53 72 63 4c 69 73 74 20 73 74 72 75 63 74 75 72  SrcList structur
9f60: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9f70: 20 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 20 57   child table.  W
9f80: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 20 2a  e need the.    *
9f90: 2a 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 73  * child table as
9fa0: 20 61 20 53 72 63 4c 69 73 74 20 66 6f 72 20 73   a SrcList for s
9fb0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
9fc0: 28 29 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  () */.    pSrc =
9fd0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
9fe0: 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
9ff0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  0);.    if( pSrc
a000: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
a010: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a020: 49 74 65 6d 20 3d 20 70 53 72 63 2d 3e 61 3b 0a  Item = pSrc->a;.
a030: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
a040: 62 20 3d 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  b = pFKey->pFrom
a050: 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ;.      pItem->z
a060: 4e 61 6d 65 20 3d 20 70 46 4b 65 79 2d 3e 70 46  Name = pFKey->pF
a070: 72 6f 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  rom->zName;.    
a080: 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
a090: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 49 74  Ref++;.      pIt
a0a0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
a0b0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a0c0: 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 4e 65  .      if( regNe
a0d0: 77 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w!=0 ){.        
a0e0: 66 6b 53 63 61 6e 43 68 69 6c 64 72 65 6e 28 70  fkScanChildren(p
a0f0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 70 54 61  Parse, pSrc, pTa
a100: 62 2c 20 70 49 64 78 2c 20 70 46 4b 65 79 2c 20  b, pIdx, pFKey, 
a110: 61 69 43 6f 6c 2c 20 72 65 67 4e 65 77 2c 20 2d  aiCol, regNew, -
a120: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
a130: 20 20 69 66 28 20 72 65 67 4f 6c 64 21 3d 30 20    if( regOld!=0 
a140: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
a150: 41 63 74 69 6f 6e 20 3d 20 70 46 4b 65 79 2d 3e  Action = pFKey->
a160: 61 41 63 74 69 6f 6e 5b 61 43 68 61 6e 67 65 21  aAction[aChange!
a170: 3d 30 5d 3b 0a 20 20 20 20 20 20 20 20 66 6b 53  =0];.        fkS
a180: 63 61 6e 43 68 69 6c 64 72 65 6e 28 70 50 61 72  canChildren(pPar
a190: 73 65 2c 20 70 53 72 63 2c 20 70 54 61 62 2c 20  se, pSrc, pTab, 
a1a0: 70 49 64 78 2c 20 70 46 4b 65 79 2c 20 61 69 43  pIdx, pFKey, aiC
a1b0: 6f 6c 2c 20 72 65 67 4f 6c 64 2c 20 31 29 3b 0a  ol, regOld, 1);.
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
a1d0: 69 73 20 69 73 20 61 20 64 65 66 65 72 72 65 64  is is a deferred
a1e0: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20   FK constraint, 
a1f0: 6f 72 20 61 20 43 41 53 43 41 44 45 20 6f 72 20  or a CASCADE or 
a200: 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20  SET NULL.       
a210: 20 2a 2a 20 61 63 74 69 6f 6e 20 61 70 70 6c 69   ** action appli
a220: 65 73 2c 20 74 68 65 6e 20 61 6e 79 20 66 6f 72  es, then any for
a230: 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
a240: 6f 6e 73 20 63 61 75 73 65 64 20 62 79 0a 20 20  ons caused by.  
a250: 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 69 6e        ** removin
a260: 67 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  g the parent key
a270: 20 77 69 6c 6c 20 62 65 20 72 65 63 74 69 66 69   will be rectifi
a280: 65 64 20 62 79 20 74 68 65 20 61 63 74 69 6f 6e  ed by the action
a290: 20 74 72 69 67 67 65 72 2e 0a 20 20 20 20 20 20   trigger..      
a2a0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 73    ** So do not s
a2b0: 65 74 20 74 68 65 20 22 6d 61 79 2d 61 62 6f 72  et the "may-abor
a2c0: 74 22 20 66 6c 61 67 20 69 6e 20 74 68 69 73 20  t" flag in this 
a2d0: 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  case..        **
a2e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
a2f0: 20 31 3a 20 49 66 20 74 68 65 20 46 4b 20 69 73   1: If the FK is
a300: 20 64 65 63 6c 61 72 65 64 20 22 4f 4e 20 55 50   declared "ON UP
a310: 44 41 54 45 20 43 41 53 43 41 44 45 22 2c 20 74  DATE CASCADE", t
a320: 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
a330: 2a 2a 20 6d 61 79 2d 61 62 6f 72 74 20 66 6c 61  ** may-abort fla
a340: 67 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  g will eventuall
a350: 79 20 62 65 20 73 65 74 20 6f 6e 20 74 68 69 73  y be set on this
a360: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 79 77 61   statement anywa
a370: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 77 68  y.        ** (wh
a380: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a390: 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
a3a0: 72 74 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  rt of processing
a3b0: 20 74 68 65 20 55 50 44 41 54 45 0a 20 20 20 20   the UPDATE.    
a3c0: 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
a3d0: 65 20 61 63 74 69 6f 6e 20 74 72 69 67 67 65 72  e action trigger
a3e0: 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
a3f0: 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 32 3a        ** Note 2:
a400: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
a410: 20 69 74 20 6d 61 79 20 73 65 65 6d 20 6c 69 6b   it may seem lik
a420: 65 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73  e SQLite could s
a430: 69 6d 70 6c 79 20 6f 6d 69 74 0a 20 20 20 20 20  imply omit.     
a440: 20 20 20 2a 2a 20 61 6c 6c 20 4f 50 5f 46 6b 43     ** all OP_FkC
a450: 6f 75 6e 74 65 72 20 72 65 6c 61 74 65 64 20 73  ounter related s
a460: 63 61 6e 73 20 77 68 65 6e 20 65 69 74 68 65 72  cans when either
a470: 20 43 41 53 43 41 44 45 20 6f 72 20 53 45 54 20   CASCADE or SET 
a480: 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20  NULL.        ** 
a490: 61 70 70 6c 69 65 73 2e 20 54 68 65 20 74 72 6f  applies. The tro
a4a0: 75 62 6c 65 20 73 74 61 72 74 73 20 69 66 20 74  uble starts if t
a4b0: 68 65 20 43 41 53 43 41 44 45 20 6f 72 20 53 45  he CASCADE or SE
a4c0: 54 20 4e 55 4c 4c 20 61 63 74 69 6f 6e 20 0a 20  T NULL action . 
a4d0: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
a4e0: 72 20 63 61 75 73 65 73 20 6f 74 68 65 72 20 74  r causes other t
a4f0: 72 69 67 67 65 72 73 20 6f 72 20 61 63 74 69 6f  riggers or actio
a500: 6e 20 72 75 6c 65 73 20 61 74 74 61 63 68 65 64  n rules attached
a510: 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20   to the .       
a520: 20 2a 2a 20 63 68 69 6c 64 20 74 61 62 6c 65 20   ** child table 
a530: 74 6f 20 66 69 72 65 2e 20 49 6e 20 74 68 65 73  to fire. In thes
a540: 65 20 63 61 73 65 73 20 74 68 65 20 66 6b 20 63  e cases the fk c
a550: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
a560: 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 69  rs.        ** mi
a570: 67 68 74 20 62 65 20 73 65 74 20 69 6e 63 6f 72  ght be set incor
a580: 72 65 63 74 6c 79 20 69 66 20 61 6e 79 20 4f 50  rectly if any OP
a590: 5f 46 6b 43 6f 75 6e 74 65 72 20 72 65 6c 61 74  _FkCounter relat
a5a0: 65 64 20 73 63 61 6e 73 20 61 72 65 20 0a 20 20  ed scans are .  
a5b0: 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64        ** omitted
a5c0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .  */.        if
a5d0: 28 20 21 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  ( !pFKey->isDefe
a5e0: 72 72 65 64 20 26 26 20 65 41 63 74 69 6f 6e 21  rred && eAction!
a5f0: 3d 4f 45 5f 43 61 73 63 61 64 65 20 26 26 20 65  =OE_Cascade && e
a600: 41 63 74 69 6f 6e 21 3d 4f 45 5f 53 65 74 4e 75  Action!=OE_SetNu
a610: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
a620: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
a630: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
a640: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a650: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
a660: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
a670: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
a680: 2c 20 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20  , pSrc);.    }. 
a690: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a6a0: 28 64 62 2c 20 61 69 43 6f 6c 29 3b 0a 20 20 7d  (db, aiCol);.  }
a6b0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 43 4f 4c 55  .}..#define COLU
a6c0: 4d 4e 5f 4d 41 53 4b 28 78 29 20 28 28 28 78 29  MN_MASK(x) (((x)
a6d0: 3e 33 31 29 20 3f 20 30 78 66 66 66 66 66 66 66  >31) ? 0xfffffff
a6e0: 66 20 3a 20 28 28 75 33 32 29 31 3c 3c 28 78 29  f : ((u32)1<<(x)
a6f0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ))../*.** This f
a700: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a710: 64 20 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74  d before generat
a720: 69 6e 67 20 63 6f 64 65 20 74 6f 20 75 70 64 61  ing code to upda
a730: 74 65 20 6f 72 20 64 65 6c 65 74 65 20 61 20 0a  te or delete a .
a740: 2a 2a 20 72 6f 77 20 63 6f 6e 74 61 69 6e 65 64  ** row contained
a750: 20 69 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 0a   in table pTab..
a760: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 46 6b  */.u32 sqlite3Fk
a770: 4f 6c 64 6d 61 73 6b 28 0a 20 20 50 61 72 73 65  Oldmask(.  Parse
a780: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a7a0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
a7b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
a7e0: 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 29 7b 0a 20  modified */.){. 
a7f0: 20 75 33 32 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   u32 mask = 0;. 
a800: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
a810: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f  >flags&SQLITE_Fo
a820: 72 65 69 67 6e 4b 65 79 73 20 29 7b 0a 20 20 20  reignKeys ){.   
a830: 20 46 4b 65 79 20 2a 70 3b 0a 20 20 20 20 69 6e   FKey *p;.    in
a840: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  t i;.    for(p=p
a850: 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 3b 20 70  Tab->pFKey; p; p
a860: 3d 70 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  =p->pNextFrom){.
a870: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a880: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 6d  <p->nCol; i++) m
a890: 61 73 6b 20 7c 3d 20 43 4f 4c 55 4d 4e 5f 4d 41  ask |= COLUMN_MA
a8a0: 53 4b 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  SK(p->aCol[i].iF
a8b0: 72 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rom);.    }.    
a8c0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 46 6b 52  for(p=sqlite3FkR
a8d0: 65 66 65 72 65 6e 63 65 73 28 70 54 61 62 29 3b  eferences(pTab);
a8e0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 54 6f   p; p=p->pNextTo
a8f0: 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
a900: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
a910: 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49  sqlite3FkLocateI
a920: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
a930: 62 2c 20 70 2c 20 26 70 49 64 78 2c 20 30 29 3b  b, p, &pIdx, 0);
a940: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
a950: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
a960: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; i<pIdx->nKey
a970: 43 6f 6c 3b 20 69 2b 2b 29 20 6d 61 73 6b 20 7c  Col; i++) mask |
a980: 3d 20 43 4f 4c 55 4d 4e 5f 4d 41 53 4b 28 70 49  = COLUMN_MASK(pI
a990: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  dx->aiColumn[i])
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a9b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
a9c0: 6b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  k;.}.../*.** Thi
a9d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a9e0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 67 65 6e 65  lled before gene
a9f0: 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 75  rating code to u
aa00: 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
aa10: 61 20 0a 2a 2a 20 72 6f 77 20 63 6f 6e 74 61 69  a .** row contai
aa20: 6e 65 64 20 69 6e 20 74 61 62 6c 65 20 70 54 61  ned in table pTa
aa30: 62 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  b. If the operat
aa40: 69 6f 6e 20 69 73 20 61 20 44 45 4c 45 54 45 2c  ion is a DELETE,
aa50: 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65 74   then.** paramet
aa60: 65 72 20 61 43 68 61 6e 67 65 20 69 73 20 70 61  er aChange is pa
aa70: 73 73 65 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75  ssed a NULL valu
aa80: 65 2e 20 46 6f 72 20 61 6e 20 55 50 44 41 54 45  e. For an UPDATE
aa90: 2c 20 61 43 68 61 6e 67 65 20 70 6f 69 6e 74 73  , aChange points
aaa0: 0a 2a 2a 20 74 6f 20 61 6e 20 61 72 72 61 79 20  .** to an array 
aab0: 6f 66 20 73 69 7a 65 20 4e 2c 20 77 68 65 72 65  of size N, where
aac0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
aad0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
aae0: 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2a 20 49 66  able pTab..** If
aaf0: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
ab00: 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
ab10: 20 62 79 20 74 68 65 20 55 50 44 41 54 45 2c 20   by the UPDATE, 
ab20: 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
ab30: 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 6e 74 72 79  onding .** entry
ab40: 20 69 6e 20 74 68 65 20 61 43 68 61 6e 67 65 5b   in the aChange[
ab50: 5d 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74  ] array is set t
ab60: 6f 20 2d 31 2e 20 49 66 20 74 68 65 20 63 6f 6c  o -1. If the col
ab70: 75 6d 6e 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  umn is modified,
ab80: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73  .** the value is
ab90: 20 30 20 6f 72 20 67 72 65 61 74 65 72 2e 20 50   0 or greater. P
aba0: 61 72 61 6d 65 74 65 72 20 63 68 6e 67 52 6f 77  arameter chngRow
abb0: 69 64 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  id is set to tru
abc0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 55 50 44 41  e if the.** UPDA
abd0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64  TE statement mod
abe0: 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 20  ifies the rowid 
abf0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 61  fields of the ta
ac00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ble..**.** If an
ac10: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 72  y foreign key pr
ac20: 6f 63 65 73 73 69 6e 67 20 77 69 6c 6c 20 62 65  ocessing will be
ac30: 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73 20   required, this 
ac40: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
ac50: 0a 2a 2a 20 74 72 75 65 2e 20 49 66 20 74 68 65  .** true. If the
ac60: 72 65 20 69 73 20 6e 6f 20 66 6f 72 65 69 67 6e  re is no foreign
ac70: 20 6b 65 79 20 72 65 6c 61 74 65 64 20 70 72 6f   key related pro
ac80: 63 65 73 73 69 6e 67 2c 20 74 68 69 73 20 66 75  cessing, this fu
ac90: 6e 63 74 69 6f 6e 20 0a 2a 2a 20 72 65 74 75 72  nction .** retur
aca0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  ns false..*/.int
acb0: 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72   sqlite3FkRequir
acc0: 65 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ed(.  Parse *pPa
acd0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
ace0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
acf0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
ad00: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ad20: 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66  able being modif
ad30: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43  ied */.  int *aC
ad40: 68 61 6e 67 65 2c 20 20 20 20 20 20 20 20 20 20  hange,          
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d           /* Non-
ad60: 4e 55 4c 4c 20 66 6f 72 20 55 50 44 41 54 45 20  NULL for UPDATE 
ad70: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
ad80: 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 20 20 20  int chngRowid   
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 55 50 44 41  /* True for UPDA
adb0: 54 45 20 74 68 61 74 20 61 66 66 65 63 74 73 20  TE that affects 
adc0: 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  rowid */.){.  if
add0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
ade0: 61 67 73 26 53 51 4c 49 54 45 5f 46 6f 72 65 69  ags&SQLITE_Forei
adf0: 67 6e 4b 65 79 73 20 29 7b 0a 20 20 20 20 69 66  gnKeys ){.    if
ae00: 28 20 21 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  ( !aChange ){.  
ae10: 20 20 20 20 2f 2a 20 41 20 44 45 4c 45 54 45 20      /* A DELETE 
ae20: 6f 70 65 72 61 74 69 6f 6e 2e 20 46 6f 72 65 69  operation. Forei
ae30: 67 6e 20 6b 65 79 20 70 72 6f 63 65 73 73 69 6e  gn key processin
ae40: 67 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  g is required if
ae50: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
ae60: 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
ae70: 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 63   is either the c
ae80: 68 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74  hild or parent t
ae90: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 0a 20 20  able for any .  
aea0: 20 20 20 20 2a 2a 20 66 6f 72 65 69 67 6e 20 6b      ** foreign k
aeb0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  ey constraint.  
aec0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
aed0: 28 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65  (sqlite3FkRefere
aee0: 6e 63 65 73 28 70 54 61 62 29 20 7c 7c 20 70 54  nces(pTab) || pT
aef0: 61 62 2d 3e 70 46 4b 65 79 29 3b 0a 20 20 20 20  ab->pFKey);.    
af00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
af10: 54 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  This is an UPDAT
af20: 45 2e 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 70  E. Foreign key p
af30: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c  rocessing is onl
af40: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  y required if th
af50: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  e.      ** opera
af60: 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 6f 6e  tion modifies on
af70: 65 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20  e or more child 
af80: 6f 72 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  or parent key co
af90: 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20  lumns. */.      
afa0: 46 4b 65 79 20 2a 70 3b 0a 0a 20 20 20 20 20 20  FKey *p;..      
afb0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20  /* Check if any 
afc0: 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
afd0: 73 20 61 72 65 20 62 65 69 6e 67 20 6d 6f 64 69  s are being modi
afe0: 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 66  fied. */.      f
aff0: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 4b 65 79  or(p=pTab->pFKey
b000: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 46  ; p; p=p->pNextF
b010: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rom){.        if
b020: 28 20 66 6b 43 68 69 6c 64 49 73 4d 6f 64 69 66  ( fkChildIsModif
b030: 69 65 64 28 70 54 61 62 2c 20 70 2c 20 61 43 68  ied(pTab, p, aCh
b040: 61 6e 67 65 2c 20 63 68 6e 67 52 6f 77 69 64 29  ange, chngRowid)
b050: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
b060: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
b070: 68 65 63 6b 20 69 66 20 61 6e 79 20 70 61 72 65  heck if any pare
b080: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61  nt key columns a
b090: 72 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  re being modifie
b0a0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  d. */.      for(
b0b0: 70 3d 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72  p=sqlite3FkRefer
b0c0: 65 6e 63 65 73 28 70 54 61 62 29 3b 20 70 3b 20  ences(pTab); p; 
b0d0: 70 3d 70 2d 3e 70 4e 65 78 74 54 6f 29 7b 0a 20  p=p->pNextTo){. 
b0e0: 20 20 20 20 20 20 20 69 66 28 20 66 6b 50 61 72         if( fkPar
b0f0: 65 6e 74 49 73 4d 6f 64 69 66 69 65 64 28 70 54  entIsModified(pT
b100: 61 62 2c 20 70 2c 20 61 43 68 61 6e 67 65 2c 20  ab, p, aChange, 
b110: 63 68 6e 67 52 6f 77 69 64 29 20 29 20 72 65 74  chngRowid) ) ret
b120: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
b130: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b140: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
b150: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
b160: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 55 50  alled when an UP
b170: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f  DATE or DELETE o
b180: 70 65 72 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  peration is bein
b190: 67 20 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 6f  g .** compiled o
b1a0: 6e 20 74 61 62 6c 65 20 70 54 61 62 2c 20 77 68  n table pTab, wh
b1b0: 69 63 68 20 69 73 20 74 68 65 20 70 61 72 65 6e  ich is the paren
b1c0: 74 20 74 61 62 6c 65 20 6f 66 20 66 6f 72 65 69  t table of forei
b1d0: 67 6e 2d 6b 65 79 20 70 46 4b 65 79 2e 0a 2a 2a  gn-key pFKey..**
b1e0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
b1f0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
b200: 55 50 44 41 54 45 2c 20 74 68 65 6e 20 74 68 65  UPDATE, then the
b210: 20 70 43 68 61 6e 67 65 73 20 70 61 72 61 6d 65   pChanges parame
b220: 74 65 72 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ter is.** passed
b230: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b240: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
b250: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
b260: 2e 20 49 66 20 69 74 20 69 73 20 61 0a 2a 2a 20  . If it is a.** 
b270: 44 45 4c 45 54 45 2c 20 70 43 68 61 6e 67 65 73  DELETE, pChanges
b280: 20 69 73 20 70 61 73 73 65 64 20 61 20 4e 55 4c   is passed a NUL
b290: 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  L pointer..**.**
b2a0: 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f   It returns a po
b2b0: 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69 67 67  inter to a Trigg
b2c0: 65 72 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  er structure con
b2d0: 74 61 69 6e 69 6e 67 20 61 20 74 72 69 67 67 65  taining a trigge
b2e0: 72 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  r.** equivalent 
b2f0: 74 6f 20 74 68 65 20 4f 4e 20 55 50 44 41 54 45  to the ON UPDATE
b300: 20 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61 63   or ON DELETE ac
b310: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62  tion specified b
b320: 79 20 70 46 4b 65 79 2e 0a 2a 2a 20 49 66 20 74  y pFKey..** If t
b330: 68 65 20 61 63 74 69 6f 6e 20 69 73 20 22 4e 4f  he action is "NO
b340: 20 41 43 54 49 4f 4e 22 20 6f 72 20 22 52 45 53   ACTION" or "RES
b350: 54 52 49 43 54 22 2c 20 74 68 65 6e 20 61 20 4e  TRICT", then a N
b360: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  ULL pointer is.*
b370: 2a 20 72 65 74 75 72 6e 65 64 20 28 74 68 65 73  * returned (thes
b380: 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
b390: 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e  e no special han
b3a0: 64 6c 69 6e 67 20 62 79 20 74 68 65 20 74 72 69  dling by the tri
b3b0: 67 67 65 72 73 0a 2a 2a 20 73 75 62 2d 73 79 73  ggers.** sub-sys
b3c0: 74 65 6d 2c 20 63 6f 64 65 20 66 6f 72 20 74 68  tem, code for th
b3d0: 65 6d 20 69 73 20 63 72 65 61 74 65 64 20 62 79  em is created by
b3e0: 20 66 6b 53 63 61 6e 43 68 69 6c 64 72 65 6e 28   fkScanChildren(
b3f0: 29 29 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ))..**.** For ex
b400: 61 6d 70 6c 65 2c 20 69 66 20 70 46 4b 65 79 20  ample, if pFKey 
b410: 69 73 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  is the foreign k
b420: 65 79 20 61 6e 64 20 70 54 61 62 20 69 73 20 74  ey and pTab is t
b430: 61 62 6c 65 20 22 70 22 20 69 6e 20 0a 2a 2a 20  able "p" in .** 
b440: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
b450: 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  hema:.**.**   CR
b460: 45 41 54 45 20 54 41 42 4c 45 20 70 28 70 6b 20  EATE TABLE p(pk 
b470: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 2a 2a  PRIMARY KEY);.**
b480: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b490: 63 28 63 6b 20 52 45 46 45 52 45 4e 43 45 53 20  c(ck REFERENCES 
b4a0: 70 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  p ON DELETE CASC
b4b0: 41 44 45 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ADE);.**.** then
b4c0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 74 72   the returned tr
b4d0: 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65 20  igger structure 
b4e0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
b4f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
b500: 20 54 52 49 47 47 45 52 20 2e 2e 2e 20 44 45 4c   TRIGGER ... DEL
b510: 45 54 45 20 4f 4e 20 70 20 42 45 47 49 4e 0a 2a  ETE ON p BEGIN.*
b520: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  *     DELETE FRO
b530: 4d 20 63 20 57 48 45 52 45 20 63 6b 20 3d 20 6f  M c WHERE ck = o
b540: 6c 64 2e 70 6b 3b 0a 2a 2a 20 20 20 45 4e 44 3b  ld.pk;.**   END;
b550: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
b560: 6e 65 64 20 70 6f 69 6e 74 65 72 20 69 73 20 63  ned pointer is c
b570: 61 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  ached as part of
b580: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
b590: 20 6f 62 6a 65 63 74 2e 20 49 74 0a 2a 2a 20 69   object. It.** i
b5a0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  s eventually fre
b5b0: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
b5c0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 66 6f  e rest of the fo
b5d0: 72 65 69 67 6e 20 6b 65 79 20 6f 62 6a 65 63 74  reign key object
b5e0: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 46   by .** sqlite3F
b5f0: 6b 44 65 6c 65 74 65 28 29 2e 0a 2a 2f 0a 73 74  kDelete()..*/.st
b600: 61 74 69 63 20 54 72 69 67 67 65 72 20 2a 66 6b  atic Trigger *fk
b610: 41 63 74 69 6f 6e 54 72 69 67 67 65 72 28 0a 20  ActionTrigger(. 
b620: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
b650: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
b660: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
b670: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
b680: 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 6f 72  being updated or
b690: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 2a 2f   deleted from */
b6a0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20  .  FKey *pFKey, 
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65     /* Foreign ke
b6d0: 79 20 74 6f 20 67 65 74 20 61 63 74 69 6f 6e 20  y to get action 
b6e0: 66 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  for */.  ExprLis
b6f0: 74 20 2a 70 43 68 61 6e 67 65 73 20 20 20 20 20  t *pChanges     
b700: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
b710: 67 65 2d 6c 69 73 74 20 66 6f 72 20 55 50 44 41  ge-list for UPDA
b720: 54 45 2c 20 4e 55 4c 4c 20 66 6f 72 20 44 45 4c  TE, NULL for DEL
b730: 45 54 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ETE */.){.  sqli
b740: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b750: 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
b760: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
b770: 2f 0a 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20  /.  int action; 
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 4f 45      /* One of OE
b7a0: 5f 4e 6f 6e 65 2c 20 4f 45 5f 43 61 73 63 61 64  _None, OE_Cascad
b7b0: 65 20 65 74 63 2e 20 2a 2f 0a 20 20 54 72 69 67  e etc. */.  Trig
b7c0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20  ger *pTrigger;  
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b7e0: 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f  rigger definitio
b7f0: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
b800: 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20 28   int iAction = (
b810: 70 43 68 61 6e 67 65 73 21 3d 30 29 3b 20 20 20  pChanges!=0);   
b820: 20 2f 2a 20 31 20 66 6f 72 20 55 50 44 41 54 45   /* 1 for UPDATE
b830: 2c 20 30 20 66 6f 72 20 44 45 4c 45 54 45 20 2a  , 0 for DELETE *
b840: 2f 0a 0a 20 20 61 63 74 69 6f 6e 20 3d 20 70 46  /..  action = pF
b850: 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 69 41 63  Key->aAction[iAc
b860: 74 69 6f 6e 5d 3b 0a 20 20 70 54 72 69 67 67 65  tion];.  pTrigge
b870: 72 20 3d 20 70 46 4b 65 79 2d 3e 61 70 54 72 69  r = pFKey->apTri
b880: 67 67 65 72 5b 69 41 63 74 69 6f 6e 5d 3b 0a 0a  gger[iAction];..
b890: 20 20 69 66 28 20 61 63 74 69 6f 6e 21 3d 4f 45    if( action!=OE
b8a0: 5f 4e 6f 6e 65 20 26 26 20 21 70 54 72 69 67 67  _None && !pTrigg
b8b0: 65 72 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  er ){.    u8 ena
b8c0: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 20 20 20  bleLookaside;   
b8d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
b8e0: 6f 66 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  of db->lookaside
b8f0: 2e 62 45 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  .bEnabled */.   
b900: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 72   char const *zFr
b910: 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  om;            /
b920: 2a 20 4e 61 6d 65 20 6f 66 20 63 68 69 6c 64 20  * Name of child 
b930: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
b940: 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
b950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
b960: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
b970: 20 7a 46 72 6f 6d 20 2a 2f 0a 20 20 20 20 49 6e   zFrom */.    In
b980: 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 20 20  dex *pIdx = 0;  
b990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b9a0: 61 72 65 6e 74 20 6b 65 79 20 69 6e 64 65 78 20  arent key index 
b9b0: 66 6f 72 20 74 68 69 73 20 46 4b 20 2a 2f 0a 20  for this FK */. 
b9c0: 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20     int *aiCol = 
b9d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b9e0: 20 2f 2a 20 63 68 69 6c 64 20 74 61 62 6c 65 20   /* child table 
b9f0: 63 6f 6c 73 20 2d 3e 20 70 61 72 65 6e 74 20 6b  cols -> parent k
ba00: 65 79 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 54  ey cols */.    T
ba10: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
ba20: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
ba30: 20 46 69 72 73 74 20 28 6f 6e 6c 79 29 20 73 74   First (only) st
ba40: 65 70 20 6f 66 20 74 72 69 67 67 65 72 20 70 72  ep of trigger pr
ba50: 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 45 78 70  ogram */.    Exp
ba60: 72 20 2a 70 57 68 65 72 65 20 3d 20 30 3b 20 20  r *pWhere = 0;  
ba70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
ba80: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 72  ERE clause of tr
ba90: 69 67 67 65 72 20 73 74 65 70 20 2a 2f 0a 20 20  igger step */.  
baa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
bab0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
bac0: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20  /* Changes list 
bad0: 69 66 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  if ON UPDATE CAS
bae0: 43 41 44 45 20 2a 2f 0a 20 20 20 20 53 65 6c 65  CADE */.    Sele
baf0: 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  ct *pSelect = 0;
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
bb10: 52 45 53 54 52 49 43 54 2c 20 22 53 45 4c 45 43  RESTRICT, "SELEC
bb20: 54 20 52 41 49 53 45 28 2e 2e 2e 29 22 20 2a 2f  T RAISE(...)" */
bb30: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
bb60: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 45  ariable */.    E
bb70: 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20  xpr *pWhen = 0; 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb90: 57 48 45 4e 20 63 6c 61 75 73 65 20 66 6f 72 20  WHEN clause for 
bba0: 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  the trigger */..
bbb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
bbc0: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
bbd0: 72 73 65 2c 20 70 54 61 62 2c 20 70 46 4b 65 79  rse, pTab, pFKey
bbe0: 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 29  , &pIdx, &aiCol)
bbf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
bc00: 20 61 73 73 65 72 74 28 20 61 69 43 6f 6c 20 7c   assert( aiCol |
bc10: 7c 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3d 3d 31  | pFKey->nCol==1
bc20: 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
bc30: 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3b  ; i<pFKey->nCol;
bc40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 6f 6b   i++){.      Tok
bc50: 65 6e 20 74 4f 6c 64 20 3d 20 7b 20 22 6f 6c 64  en tOld = { "old
bc60: 22 2c 20 33 20 7d 3b 20 20 2f 2a 20 4c 69 74 65  ", 3 };  /* Lite
bc70: 72 61 6c 20 22 6f 6c 64 22 20 74 6f 6b 65 6e 20  ral "old" token 
bc80: 2a 2f 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74  */.      Token t
bc90: 4e 65 77 20 3d 20 7b 20 22 6e 65 77 22 2c 20 33  New = { "new", 3
bca0: 20 7d 3b 20 20 2f 2a 20 4c 69 74 65 72 61 6c 20   };  /* Literal 
bcb0: 22 6e 65 77 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20  "new" token */. 
bcc0: 20 20 20 20 20 54 6f 6b 65 6e 20 74 46 72 6f 6d       Token tFrom
bcd0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
bce0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
bcf0: 6d 6e 20 69 6e 20 63 68 69 6c 64 20 74 61 62 6c  mn in child tabl
bd00: 65 20 2a 2f 0a 20 20 20 20 20 20 54 6f 6b 65 6e  e */.      Token
bd10: 20 74 54 6f 43 6f 6c 3b 20 20 20 20 20 20 20 20   tToCol;        
bd20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
bd30: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 61 72 65  f column in pare
bd40: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
bd50: 20 20 69 6e 74 20 69 46 72 6f 6d 43 6f 6c 3b 20    int iFromCol; 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd70: 20 49 64 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69   Idx of column i
bd80: 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 20 2a 2f  n child table */
bd90: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 71  .      Expr *pEq
bda0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bdb0: 20 20 20 2f 2a 20 74 46 72 6f 6d 43 6f 6c 20 3d     /* tFromCol =
bdc0: 20 4f 4c 44 2e 74 54 6f 43 6f 6c 20 2a 2f 0a 0a   OLD.tToCol */..
bdd0: 20 20 20 20 20 20 69 46 72 6f 6d 43 6f 6c 20 3d        iFromCol =
bde0: 20 61 69 43 6f 6c 20 3f 20 61 69 43 6f 6c 5b 69   aiCol ? aiCol[i
bdf0: 5d 20 3a 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  ] : pFKey->aCol[
be00: 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20  0].iFrom;.      
be10: 61 73 73 65 72 74 28 20 69 46 72 6f 6d 43 6f 6c  assert( iFromCol
be20: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=0 );.      ass
be30: 65 72 74 28 20 70 49 64 78 21 3d 30 20 7c 7c 20  ert( pIdx!=0 || 
be40: 28 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20  (pTab->iPKey>=0 
be50: 26 26 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 70  && pTab->iPKey<p
be60: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
be70: 20 20 20 20 74 54 6f 43 6f 6c 2e 7a 20 3d 20 70      tToCol.z = p
be80: 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 20 3f  Tab->aCol[pIdx ?
be90: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
bea0: 69 5d 20 3a 20 70 54 61 62 2d 3e 69 50 4b 65 79  i] : pTab->iPKey
beb0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 74  ].zName;.      t
bec0: 46 72 6f 6d 43 6f 6c 2e 7a 20 3d 20 70 46 4b 65  FromCol.z = pFKe
bed0: 79 2d 3e 70 46 72 6f 6d 2d 3e 61 43 6f 6c 5b 69  y->pFrom->aCol[i
bee0: 46 72 6f 6d 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  FromCol].zName;.
bef0: 0a 20 20 20 20 20 20 74 54 6f 43 6f 6c 2e 6e 20  .      tToCol.n 
bf00: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
bf10: 30 28 74 54 6f 43 6f 6c 2e 7a 29 3b 0a 20 20 20  0(tToCol.z);.   
bf20: 20 20 20 74 46 72 6f 6d 43 6f 6c 2e 6e 20 3d 20     tFromCol.n = 
bf30: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
bf40: 74 46 72 6f 6d 43 6f 6c 2e 7a 29 3b 0a 0a 20 20  tFromCol.z);..  
bf50: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
bf60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 4f 4c  e expression "OL
bf70: 44 2e 7a 54 6f 43 6f 6c 20 3d 20 7a 46 72 6f 6d  D.zToCol = zFrom
bf80: 43 6f 6c 22 2e 20 49 74 20 69 73 20 69 6d 70 6f  Col". It is impo
bf90: 72 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  rtant.      ** t
bfa0: 68 61 74 20 74 68 65 20 22 4f 4c 44 2e 7a 54 6f  hat the "OLD.zTo
bfb0: 43 6f 6c 22 20 74 65 72 6d 20 69 73 20 6f 6e 20  Col" term is on 
bfc0: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 3d  the LHS of the =
bfd0: 20 6f 70 65 72 61 74 6f 72 2c 20 73 6f 0a 20 20   operator, so.  
bfe0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
bff0: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
c000: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c010: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c020: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  the.      ** par
c030: 65 6e 74 20 74 61 62 6c 65 20 61 72 65 20 75 73  ent table are us
c040: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
c050: 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rison. */.      
c060: 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pEq = sqlite3PEx
c070: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51  pr(pParse, TK_EQ
c080: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
c090: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c0a0: 20 54 4b 5f 44 4f 54 2c 20 0a 20 20 20 20 20 20   TK_DOT, .      
c0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c0c0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
c0d0: 2c 20 26 74 4f 6c 64 2c 20 30 29 2c 0a 20 20 20  , &tOld, 0),.   
c0e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c0f0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
c100: 5f 49 44 2c 20 26 74 54 6f 43 6f 6c 2c 20 30 29  _ID, &tToCol, 0)
c110: 0a 20 20 20 20 20 20 20 20 20 20 2c 20 30 29 2c  .          , 0),
c120: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c130: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
c140: 54 4b 5f 49 44 2c 20 26 74 46 72 6f 6d 43 6f 6c  TK_ID, &tFromCol
c150: 2c 20 30 29 0a 20 20 20 20 20 20 2c 20 30 29 3b  , 0).      , 0);
c160: 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
c170: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
c180: 62 2c 20 70 57 68 65 72 65 2c 20 70 45 71 29 3b  b, pWhere, pEq);
c190: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 4f  ..      /* For O
c1a0: 4e 20 55 50 44 41 54 45 2c 20 63 6f 6e 73 74 72  N UPDATE, constr
c1b0: 75 63 74 20 74 68 65 20 6e 65 78 74 20 74 65 72  uct the next ter
c1c0: 6d 20 6f 66 20 74 68 65 20 57 48 45 4e 20 63 6c  m of the WHEN cl
c1d0: 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ause..      ** T
c1e0: 68 65 20 66 69 6e 61 6c 20 57 48 45 4e 20 63 6c  he final WHEN cl
c1f0: 61 75 73 65 20 77 69 6c 6c 20 62 65 20 6c 69 6b  ause will be lik
c200: 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20 2a 2a  e this:.      **
c210: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 57 48 45  .      **    WHE
c220: 4e 20 4e 4f 54 28 6f 6c 64 2e 63 6f 6c 31 20 49  N NOT(old.col1 I
c230: 53 20 6e 65 77 2e 63 6f 6c 31 20 41 4e 44 20 2e  S new.col1 AND .
c240: 2e 2e 20 41 4e 44 20 6f 6c 64 2e 63 6f 6c 4e 20  .. AND old.colN 
c250: 49 53 20 6e 65 77 2e 63 6f 6c 4e 29 0a 20 20 20  IS new.colN).   
c260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c270: 70 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  pChanges ){.    
c280: 20 20 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65      pEq = sqlite
c290: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c2a0: 4b 5f 49 53 2c 0a 20 20 20 20 20 20 20 20 20 20  K_IS,.          
c2b0: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
c2c0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 0a  Parse, TK_DOT, .
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c2e0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c2f0: 62 2c 20 54 4b 5f 49 44 2c 20 26 74 4f 6c 64 2c  b, TK_ID, &tOld,
c300: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
c310: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
c320: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26  loc(db, TK_ID, &
c330: 74 54 6f 43 6f 6c 2c 20 30 29 2c 0a 20 20 20 20  tToCol, 0),.    
c340: 20 20 20 20 20 20 20 20 20 20 30 29 2c 0a 20 20            0),.  
c350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c360: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c370: 4b 5f 44 4f 54 2c 20 0a 20 20 20 20 20 20 20 20  K_DOT, .        
c380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c390: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
c3a0: 2c 20 26 74 4e 65 77 2c 20 30 29 2c 0a 20 20 20  , &tNew, 0),.   
c3b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c3c0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
c3d0: 54 4b 5f 49 44 2c 20 26 74 54 6f 43 6f 6c 2c 20  TK_ID, &tToCol, 
c3e0: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
c3f0: 20 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20    0),.          
c400: 20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 57    0);.        pW
c410: 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  hen = sqlite3Exp
c420: 72 41 6e 64 28 64 62 2c 20 70 57 68 65 6e 2c 20  rAnd(db, pWhen, 
c430: 70 45 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pEq);.      }.  
c440: 0a 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f  .      if( actio
c450: 6e 21 3d 4f 45 5f 52 65 73 74 72 69 63 74 20 26  n!=OE_Restrict &
c460: 26 20 28 61 63 74 69 6f 6e 21 3d 4f 45 5f 43 61  & (action!=OE_Ca
c470: 73 63 61 64 65 20 7c 7c 20 70 43 68 61 6e 67 65  scade || pChange
c480: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  s) ){.        Ex
c490: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
c4a0: 20 20 69 66 28 20 61 63 74 69 6f 6e 3d 3d 4f 45    if( action==OE
c4b0: 5f 43 61 73 63 61 64 65 20 29 7b 0a 20 20 20 20  _Cascade ){.    
c4c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
c4d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c4e0: 2c 20 54 4b 5f 44 4f 54 2c 20 0a 20 20 20 20 20  , TK_DOT, .     
c4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c500: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
c510: 44 2c 20 26 74 4e 65 77 2c 20 30 29 2c 0a 20 20  D, &tNew, 0),.  
c520: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c530: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
c540: 4b 5f 49 44 2c 20 26 74 54 6f 43 6f 6c 2c 20 30  K_ID, &tToCol, 0
c550: 29 0a 20 20 20 20 20 20 20 20 20 20 2c 20 30 29  ).          , 0)
c560: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c570: 69 66 28 20 61 63 74 69 6f 6e 3d 3d 4f 45 5f 53  if( action==OE_S
c580: 65 74 44 66 6c 74 20 29 7b 0a 20 20 20 20 20 20  etDflt ){.      
c590: 20 20 20 20 45 78 70 72 20 2a 70 44 66 6c 74 20      Expr *pDflt 
c5a0: 3d 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 2d 3e  = pFKey->pFrom->
c5b0: 61 43 6f 6c 5b 69 46 72 6f 6d 43 6f 6c 5d 2e 70  aCol[iFromCol].p
c5c0: 44 66 6c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Dflt;.          
c5d0: 69 66 28 20 70 44 66 6c 74 20 29 7b 0a 20 20 20  if( pDflt ){.   
c5e0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
c5f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c600: 62 2c 20 70 44 66 6c 74 2c 20 30 29 3b 0a 20 20  b, pDflt, 0);.  
c610: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c620: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
c630: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c640: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
c650: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
c660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
c670: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
c680: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
c690: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55  pr(pParse, TK_NU
c6a0: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, 0, 0, 0);.  
c6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c6c0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
c6d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
c6e0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 4e 65  arse, pList, pNe
c6f0: 77 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  w);.        sqli
c700: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
c710: 6d 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  me(pParse, pList
c720: 2c 20 26 74 46 72 6f 6d 43 6f 6c 2c 20 30 29 3b  , &tFromCol, 0);
c730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c740: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c750: 28 64 62 2c 20 61 69 43 6f 6c 29 3b 0a 0a 20 20  (db, aiCol);..  
c760: 20 20 7a 46 72 6f 6d 20 3d 20 70 46 4b 65 79 2d    zFrom = pFKey-
c770: 3e 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  >pFrom->zName;. 
c780: 20 20 20 6e 46 72 6f 6d 20 3d 20 73 71 6c 69 74     nFrom = sqlit
c790: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 72 6f 6d  e3Strlen30(zFrom
c7a0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 61 63 74 69  );..    if( acti
c7b0: 6f 6e 3d 3d 4f 45 5f 52 65 73 74 72 69 63 74 20  on==OE_Restrict 
c7c0: 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74  ){.      Token t
c7d0: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  From;.      Expr
c7e0: 20 2a 70 52 61 69 73 65 3b 20 0a 0a 20 20 20 20   *pRaise; ..    
c7f0: 20 20 74 46 72 6f 6d 2e 7a 20 3d 20 7a 46 72 6f    tFrom.z = zFro
c800: 6d 3b 0a 20 20 20 20 20 20 74 46 72 6f 6d 2e 6e  m;.      tFrom.n
c810: 20 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20 20 20 20   = nFrom;.      
c820: 70 52 61 69 73 65 20 3d 20 73 71 6c 69 74 65 33  pRaise = sqlite3
c830: 45 78 70 72 28 64 62 2c 20 54 4b 5f 52 41 49 53  Expr(db, TK_RAIS
c840: 45 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  E, "FOREIGN KEY 
c850: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
c860: 64 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d");.      if( p
c870: 52 61 69 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Raise ){.       
c880: 20 70 52 61 69 73 65 2d 3e 61 66 66 69 6e 69 74   pRaise->affinit
c890: 79 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  y = OE_Abort;.  
c8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c      }.      pSel
c8b0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
c8c0: 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20 0a  ectNew(pParse, .
c8d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c8e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c8f0: 70 50 61 72 73 65 2c 20 30 2c 20 70 52 61 69 73  pParse, 0, pRais
c900: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  e),.          sq
c910: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
c920: 6e 64 28 64 62 2c 20 30 2c 20 26 74 46 72 6f 6d  nd(db, 0, &tFrom
c930: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
c940: 70 57 68 65 72 65 2c 0a 20 20 20 20 20 20 20 20  pWhere,.        
c950: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
c960: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
c970: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
c980: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
c990: 62 6c 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  ble lookaside me
c9a0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
c9b0: 2a 2f 0a 20 20 20 20 65 6e 61 62 6c 65 4c 6f 6f  */.    enableLoo
c9c0: 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f  kaside = db->loo
c9d0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
c9e0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
c9f0: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
ca00: 0a 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ..    pTrigger =
ca10: 20 28 54 72 69 67 67 65 72 20 2a 29 73 71 6c 69   (Trigger *)sqli
ca20: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
ca30: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a  db, .        siz
ca40: 65 6f 66 28 54 72 69 67 67 65 72 29 20 2b 20 20  eof(Trigger) +  
ca50: 20 20 20 20 20 20 20 2f 2a 20 73 74 72 75 63 74         /* struct
ca60: 20 54 72 69 67 67 65 72 20 2a 2f 0a 20 20 20 20   Trigger */.    
ca70: 20 20 20 20 73 69 7a 65 6f 66 28 54 72 69 67 67      sizeof(Trigg
ca80: 65 72 53 74 65 70 29 20 2b 20 20 20 20 20 2f 2a  erStep) +     /*
ca90: 20 53 69 6e 67 6c 65 20 73 74 65 70 20 69 6e 20   Single step in 
caa0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
cab0: 2a 2f 0a 20 20 20 20 20 20 20 20 6e 46 72 6f 6d  */.        nFrom
cac0: 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
cad0: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
cae0: 72 20 70 53 74 65 70 2d 3e 7a 54 61 72 67 65 74  r pStep->zTarget
caf0: 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   */.    );.    i
cb00: 66 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  f( pTrigger ){. 
cb10: 20 20 20 20 20 70 53 74 65 70 20 3d 20 70 54 72       pStep = pTr
cb20: 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74  igger->step_list
cb30: 20 3d 20 28 54 72 69 67 67 65 72 53 74 65 70 20   = (TriggerStep 
cb40: 2a 29 26 70 54 72 69 67 67 65 72 5b 31 5d 3b 0a  *)&pTrigger[1];.
cb50: 20 20 20 20 20 20 70 53 74 65 70 2d 3e 7a 54 61        pStep->zTa
cb60: 72 67 65 74 20 3d 20 28 63 68 61 72 20 2a 29 26  rget = (char *)&
cb70: 70 53 74 65 70 5b 31 5d 3b 0a 20 20 20 20 20 20  pStep[1];.      
cb80: 6d 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70  memcpy((char *)p
cb90: 53 74 65 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a  Step->zTarget, z
cba0: 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a 20 20  From, nFrom);.  
cbb0: 0a 20 20 20 20 20 20 70 53 74 65 70 2d 3e 70 57  .      pStep->pW
cbc0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
cbd0: 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
cbe0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
cbf0: 29 3b 0a 20 20 20 20 20 20 70 53 74 65 70 2d 3e  );.      pStep->
cc00: 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69  pExprList = sqli
cc10: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
cc20: 62 2c 20 70 4c 69 73 74 2c 20 45 58 50 52 44 55  b, pList, EXPRDU
cc30: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
cc40: 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20   pStep->pSelect 
cc50: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
cc60: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
cc70: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
cc80: 0a 20 20 20 20 20 20 69 66 28 20 70 57 68 65 6e  .      if( pWhen
cc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 68 65   ){.        pWhe
cca0: 6e 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  n = sqlite3PExpr
ccb0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c  (pParse, TK_NOT,
ccc0: 20 70 57 68 65 6e 2c 20 30 2c 20 30 29 3b 0a 20   pWhen, 0, 0);. 
ccd0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
cce0: 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33  >pWhen = sqlite3
ccf0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
cd00: 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  n, EXPRDUP_REDUC
cd10: 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
cd20: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 2d 65 6e 61  }..    /* Re-ena
cd30: 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  ble the lookasid
cd40: 65 20 62 75 66 66 65 72 2c 20 69 66 20 69 74 20  e buffer, if it 
cd50: 77 61 73 20 64 69 73 61 62 6c 65 64 20 65 61 72  was disabled ear
cd60: 6c 69 65 72 2e 20 2a 2f 0a 20 20 20 20 64 62 2d  lier. */.    db-
cd70: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
cd80: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
cd90: 61 73 69 64 65 3b 0a 0a 20 20 20 20 73 71 6c 69  aside;..    sqli
cda0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
cdb0: 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  , pWhere);.    s
cdc0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
cdd0: 28 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 20  (db, pWhen);.   
cde0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cdf0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
ce00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
ce10: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
ce20: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
ce30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ce40: 64 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6b  d==1 ){.      fk
ce50: 54 72 69 67 67 65 72 44 65 6c 65 74 65 28 64 62  TriggerDelete(db
ce60: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
ce70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ce80: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
ce90: 53 74 65 70 21 3d 30 20 29 3b 0a 0a 20 20 20 20  Step!=0 );..    
cea0: 73 77 69 74 63 68 28 20 61 63 74 69 6f 6e 20 29  switch( action )
ceb0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  {.      case OE_
cec0: 52 65 73 74 72 69 63 74 3a 0a 20 20 20 20 20 20  Restrict:.      
ced0: 20 20 70 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b    pStep->op = TK
cee0: 5f 53 45 4c 45 43 54 3b 20 0a 20 20 20 20 20 20  _SELECT; .      
cef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cf00: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
cf10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
cf20: 68 61 6e 67 65 73 20 29 7b 20 0a 20 20 20 20 20  hanges ){ .     
cf30: 20 20 20 20 20 70 53 74 65 70 2d 3e 6f 70 20 3d       pStep->op =
cf40: 20 54 4b 5f 44 45 4c 45 54 45 3b 20 0a 20 20 20   TK_DELETE; .   
cf50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20         break; . 
cf60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64         }.      d
cf70: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
cf80: 70 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55  pStep->op = TK_U
cf90: 50 44 41 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20  PDATE;.    }.   
cfa0: 20 70 53 74 65 70 2d 3e 70 54 72 69 67 20 3d 20   pStep->pTrig = 
cfb0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 54  pTrigger;.    pT
cfc0: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
cfd0: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
cfe0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70  .    pTrigger->p
cff0: 54 61 62 53 63 68 65 6d 61 20 3d 20 70 54 61 62  TabSchema = pTab
d000: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
d010: 46 4b 65 79 2d 3e 61 70 54 72 69 67 67 65 72 5b  FKey->apTrigger[
d020: 69 41 63 74 69 6f 6e 5d 20 3d 20 70 54 72 69 67  iAction] = pTrig
d030: 67 65 72 3b 0a 20 20 20 20 70 54 72 69 67 67 65  ger;.    pTrigge
d040: 72 2d 3e 6f 70 20 3d 20 28 70 43 68 61 6e 67 65  r->op = (pChange
d050: 73 20 3f 20 54 4b 5f 55 50 44 41 54 45 20 3a 20  s ? TK_UPDATE : 
d060: 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7d 0a  TK_DELETE);.  }.
d070: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
d080: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  er;.}../*.** Thi
d090: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0a0: 6c 6c 65 64 20 77 68 65 6e 20 64 65 6c 65 74 69  lled when deleti
d0b0: 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67 20 61  ng or updating a
d0c0: 20 72 6f 77 20 74 6f 20 69 6d 70 6c 65 6d 65 6e   row to implemen
d0d0: 74 0a 2a 2a 20 61 6e 79 20 72 65 71 75 69 72 65  t.** any require
d0e0: 64 20 43 41 53 43 41 44 45 2c 20 53 45 54 20 4e  d CASCADE, SET N
d0f0: 55 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41 55  ULL or SET DEFAU
d100: 4c 54 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  LT actions..*/.v
d110: 6f 69 64 20 73 71 6c 69 74 65 33 46 6b 41 63 74  oid sqlite3FkAct
d120: 69 6f 6e 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ions(.  Parse *p
d130: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d140: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
d150: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
d160: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d180: 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64   Table being upd
d190: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  ated or deleted 
d1a0: 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69  from */.  ExprLi
d1b0: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20  st *pChanges,   
d1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
d1d0: 6e 67 65 2d 6c 69 73 74 20 66 6f 72 20 55 50 44  nge-list for UPD
d1e0: 41 54 45 2c 20 4e 55 4c 4c 20 66 6f 72 20 44 45  ATE, NULL for DE
d1f0: 4c 45 54 45 20 2a 2f 0a 20 20 69 6e 74 20 72 65  LETE */.  int re
d200: 67 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  gOld,           
d210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d220: 72 65 73 73 20 6f 66 20 61 72 72 61 79 20 63 6f  ress of array co
d230: 6e 74 61 69 6e 69 6e 67 20 6f 6c 64 20 72 6f 77  ntaining old row
d240: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 68 61 6e   */.  int *aChan
d250: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
d260: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 69        /* Array i
d270: 6e 64 69 63 61 74 69 6e 67 20 55 50 44 41 54 45  ndicating UPDATE
d280: 64 20 63 6f 6c 75 6d 6e 73 20 28 6f 72 20 30 29  d columns (or 0)
d290: 20 2a 2f 0a 20 20 69 6e 74 20 62 43 68 6e 67 52   */.  int bChngR
d2a0: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
d2b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d2c0: 20 72 6f 77 69 64 20 69 73 20 55 50 44 41 54 45   rowid is UPDATE
d2d0: 64 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  d */.){.  /* If 
d2e0: 66 6f 72 65 69 67 6e 2d 6b 65 79 20 73 75 70 70  foreign-key supp
d2f0: 6f 72 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ort is enabled, 
d300: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
d310: 61 6c 6c 20 46 4b 73 20 74 68 61 74 20 0a 20 20  all FKs that .  
d320: 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 61 62 6c  ** refer to tabl
d330: 65 20 70 54 61 62 2e 20 49 66 20 74 68 65 72 65  e pTab. If there
d340: 20 69 73 20 61 6e 20 61 63 74 69 6f 6e 20 61 73   is an action as
d350: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
d360: 65 20 46 4b 20 0a 20 20 2a 2a 20 66 6f 72 20 74  e FK .  ** for t
d370: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 28 65  his operation (e
d380: 69 74 68 65 72 20 75 70 64 61 74 65 20 6f 72 20  ither update or 
d390: 64 65 6c 65 74 65 29 2c 20 69 6e 76 6f 6b 65 20  delete), invoke 
d3a0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
d3b0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 73 75 62    ** trigger sub
d3c0: 2d 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20  -program.  */.  
d3d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
d3e0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f 72  flags&SQLITE_For
d3f0: 65 69 67 6e 4b 65 79 73 20 29 7b 0a 20 20 20 20  eignKeys ){.    
d400: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 20 20 20  FKey *pFKey;    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d420: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
d430: 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 46  le */.    for(pF
d440: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 46 6b 52  Key = sqlite3FkR
d450: 65 66 65 72 65 6e 63 65 73 28 70 54 61 62 29 3b  eferences(pTab);
d460: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
d470: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 29 7b 0a 20  Key->pNextTo){. 
d480: 20 20 20 20 20 69 66 28 20 61 43 68 61 6e 67 65       if( aChange
d490: 3d 3d 30 20 7c 7c 20 66 6b 50 61 72 65 6e 74 49  ==0 || fkParentI
d4a0: 73 4d 6f 64 69 66 69 65 64 28 70 54 61 62 2c 20  sModified(pTab, 
d4b0: 70 46 4b 65 79 2c 20 61 43 68 61 6e 67 65 2c 20  pFKey, aChange, 
d4c0: 62 43 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a 20  bChngRowid) ){. 
d4d0: 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a         Trigger *
d4e0: 70 41 63 74 20 3d 20 66 6b 41 63 74 69 6f 6e 54  pAct = fkActionT
d4f0: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
d500: 54 61 62 2c 20 70 46 4b 65 79 2c 20 70 43 68 61  Tab, pFKey, pCha
d510: 6e 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  nges);.        i
d520: 66 28 20 70 41 63 74 20 29 7b 0a 20 20 20 20 20  f( pAct ){.     
d530: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
d540: 52 6f 77 54 72 69 67 67 65 72 44 69 72 65 63 74  RowTriggerDirect
d550: 28 70 50 61 72 73 65 2c 20 70 41 63 74 2c 20 70  (pParse, pAct, p
d560: 54 61 62 2c 20 72 65 67 4f 6c 64 2c 20 4f 45 5f  Tab, regOld, OE_
d570: 41 62 6f 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Abort, 0);.     
d580: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d590: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
d5a0: 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
d5b0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a  E_OMIT_TRIGGER *
d5c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  /../*.** Free al
d5d0: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
d5e0: 74 65 64 20 77 69 74 68 20 66 6f 72 65 69 67 6e  ted with foreign
d5f0: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73   key definitions
d600: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
d610: 74 61 62 6c 65 20 70 54 61 62 2e 20 52 65 6d 6f  table pTab. Remo
d620: 76 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 66  ve the deleted f
d630: 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d  oreign keys from
d640: 20 74 68 65 20 53 63 68 65 6d 61 2e 66 6b 65 79   the Schema.fkey
d650: 48 61 73 68 0a 2a 2a 20 68 61 73 68 20 74 61 62  Hash.** hash tab
d660: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
d670: 74 65 33 46 6b 44 65 6c 65 74 65 28 73 71 6c 69  te3FkDelete(sqli
d680: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
d690: 70 54 61 62 29 7b 0a 20 20 46 4b 65 79 20 2a 70  pTab){.  FKey *p
d6a0: 46 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  FKey;           
d6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
d6c0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
d6d0: 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 3b 20  .  FKey *pNext; 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 46     /* Copy of pF
d700: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 2a  Key->pNextFrom *
d710: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d  /..  assert( db=
d720: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68  =0 || sqlite3Sch
d730: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
d740: 20 30 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   0, pTab->pSchem
d750: 61 29 20 29 3b 0a 20 20 66 6f 72 28 70 46 4b 65  a) );.  for(pFKe
d760: 79 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  y=pTab->pFKey; p
d770: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
d780: 74 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  t){..    /* Remo
d790: 76 65 20 74 68 65 20 46 4b 20 66 72 6f 6d 20 74  ve the FK from t
d7a0: 68 65 20 66 6b 65 79 48 61 73 68 20 68 61 73 68  he fkeyHash hash
d7b0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
d7c0: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e  f( !db || db->pn
d7d0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b  BytesFreed==0 ){
d7e0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 65 79  .      if( pFKey
d7f0: 2d 3e 70 50 72 65 76 54 6f 20 29 7b 0a 20 20 20  ->pPrevTo ){.   
d800: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 50 72 65       pFKey->pPre
d810: 76 54 6f 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  vTo->pNextTo = p
d820: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20  FKey->pNextTo;. 
d830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d840: 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 28 76      void *p = (v
d850: 6f 69 64 20 2a 29 70 46 4b 65 79 2d 3e 70 4e 65  oid *)pFKey->pNe
d860: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 63 6f  xtTo;.        co
d870: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70  nst char *z = (p
d880: 20 3f 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54   ? pFKey->pNextT
d890: 6f 2d 3e 7a 54 6f 20 3a 20 70 46 4b 65 79 2d 3e  o->zTo : pFKey->
d8a0: 7a 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  zTo);.        sq
d8b0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
d8c0: 26 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  &pTab->pSchema->
d8d0: 66 6b 65 79 48 61 73 68 2c 20 7a 2c 20 70 29 3b  fkeyHash, z, p);
d8e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d8f0: 66 28 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  f( pFKey->pNextT
d900: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 4b  o ){.        pFK
d910: 65 79 2d 3e 70 4e 65 78 74 54 6f 2d 3e 70 50 72  ey->pNextTo->pPr
d920: 65 76 54 6f 20 3d 20 70 46 4b 65 79 2d 3e 70 50  evTo = pFKey->pP
d930: 72 65 76 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  revTo;.      }. 
d940: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 3a     }..    /* EV:
d950: 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 45   R-30323-21917 E
d960: 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
d970: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53 51  constraint in SQ
d980: 4c 69 74 65 20 69 73 0a 20 20 20 20 2a 2a 20 63  Lite is.    ** c
d990: 6c 61 73 73 69 66 69 65 64 20 61 73 20 65 69 74  lassified as eit
d9a0: 68 65 72 20 69 6d 6d 65 64 69 61 74 65 20 6f 72  her immediate or
d9b0: 20 64 65 66 65 72 72 65 64 2e 0a 20 20 20 20 2a   deferred..    *
d9c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  /.    assert( pF
d9d0: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 3d  Key->isDeferred=
d9e0: 3d 30 20 7c 7c 20 70 46 4b 65 79 2d 3e 69 73 44  =0 || pFKey->isD
d9f0: 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a 0a 20  eferred==1 );.. 
da00: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79     /* Delete any
da10: 20 74 72 69 67 67 65 72 73 20 63 72 65 61 74 65   triggers create
da20: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
da30: 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ctions for this 
da40: 46 4b 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  FK. */.#ifndef S
da50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
da60: 45 52 0a 20 20 20 20 66 6b 54 72 69 67 67 65 72  ER.    fkTrigger
da70: 44 65 6c 65 74 65 28 64 62 2c 20 70 46 4b 65 79  Delete(db, pFKey
da80: 2d 3e 61 70 54 72 69 67 67 65 72 5b 30 5d 29 3b  ->apTrigger[0]);
da90: 0a 20 20 20 20 66 6b 54 72 69 67 67 65 72 44 65  .    fkTriggerDe
daa0: 6c 65 74 65 28 64 62 2c 20 70 46 4b 65 79 2d 3e  lete(db, pFKey->
dab0: 61 70 54 72 69 67 67 65 72 5b 31 5d 29 3b 0a 23  apTrigger[1]);.#
dac0: 65 6e 64 69 66 0a 0a 20 20 20 20 70 4e 65 78 74  endif..    pNext
dad0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
dae0: 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rom;.    sqlite3
daf0: 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
db00: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
db10: 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
db20: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
db30: 59 20 2a 2f 0a                                   Y */.