/ Hex Artifact Content
Login

Artifact 878bec1b4d9aab3b34585121b834fce9b2780352b7282510e4ffc94b75ce6c83:


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 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
2580: 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2a 73 69 7a 65  e->db, nCol*size
2590: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 69 66  of(int));.    if
25a0: 28 20 21 61 69 43 6f 6c 20 29 20 72 65 74 75 72  ( !aiCol ) retur
25b0: 6e 20 31 3b 0a 20 20 20 20 2a 70 61 69 43 6f 6c  n 1;.    *paiCol
25c0: 20 3d 20 61 69 43 6f 6c 3b 0a 20 20 7d 0a 0a 20   = aiCol;.  }.. 
25d0: 20 66 6f 72 28 70 49 64 78 3d 70 50 61 72 65 6e   for(pIdx=pParen
25e0: 74 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  t->pIndex; pIdx;
25f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2600: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
2610: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 43 6f 6c 20  ->nKeyCol==nCol 
2620: 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  && IsUniqueIndex
2630: 28 70 49 64 78 29 20 26 26 20 70 49 64 78 2d 3e  (pIdx) && pIdx->
2640: 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
2650: 20 29 7b 20 0a 20 20 20 20 20 20 2f 2a 20 70 49   ){ .      /* pI
2660: 64 78 20 69 73 20 61 20 55 4e 49 51 55 45 20 69  dx is a UNIQUE i
2670: 6e 64 65 78 20 28 6f 72 20 61 20 50 52 49 4d 41  ndex (or a PRIMA
2680: 52 59 20 4b 45 59 29 20 61 6e 64 20 68 61 73 20  RY KEY) and has 
2690: 74 68 65 20 72 69 67 68 74 20 6e 75 6d 62 65 72  the right number
26a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 63 6f 6c  .      ** of col
26b0: 75 6d 6e 73 2e 20 49 66 20 65 61 63 68 20 69 6e  umns. If each in
26c0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 63 6f 72  dexed column cor
26d0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 66 6f  responds to a fo
26e0: 72 65 69 67 6e 20 6b 65 79 0a 20 20 20 20 20 20  reign key.      
26f0: 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 46 4b  ** column of pFK
2700: 65 79 2c 20 74 68 65 6e 20 74 68 69 73 20 69 6e  ey, then this in
2710: 64 65 78 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  dex is a winner.
2720: 20 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20    */..      if( 
2730: 7a 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zKey==0 ){.     
2740: 20 20 20 2f 2a 20 49 66 20 7a 4b 65 79 20 69 73     /* If zKey is
2750: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
2760: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
2770: 69 6d 70 6c 69 63 69 74 6c 79 20 6d 61 70 70 65  implicitly mappe
2780: 64 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  d to .        **
2790: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
27a0: 20 6f 66 20 74 61 62 6c 65 20 70 50 61 72 65 6e   of table pParen
27b0: 74 2e 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b  t. The PRIMARY K
27c0: 45 59 20 69 6e 64 65 78 20 6d 61 79 20 62 65 20  EY index may be 
27d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 64 65 6e  .        ** iden
27e0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 74 65  tified by the te
27f0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
2800: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
2810: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
2820: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69 43           if( aiC
2830: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
2840: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2850: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2860: 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61 69 43 6f 6c  nCol; i++) aiCol
2870: 5b 69 5d 20 3d 20 70 46 4b 65 79 2d 3e 61 43 6f  [i] = pFKey->aCo
2880: 6c 5b 69 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20  l[i].iFrom;.    
2890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
28b0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 4b          /* If zK
28d0: 65 79 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  ey is non-NULL, 
28e0: 74 68 65 6e 20 74 68 69 73 20 66 6f 72 65 69 67  then this foreig
28f0: 6e 20 6b 65 79 20 77 61 73 20 64 65 63 6c 61 72  n key was declar
2900: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ed to.        **
2910: 20 6d 61 70 20 74 6f 20 61 6e 20 65 78 70 6c 69   map to an expli
2920: 63 69 74 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  cit list of colu
2930: 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 70 50 61  mns in table pPa
2940: 72 65 6e 74 2e 20 43 68 65 63 6b 20 69 66 20 74  rent. Check if t
2950: 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
2960: 6e 64 65 78 20 6d 61 74 63 68 65 73 20 74 68 6f  ndex matches tho
2970: 73 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f  se columns. Also
2980: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
2990: 20 69 6e 64 65 78 20 75 73 65 73 0a 20 20 20 20   index uses.    
29a0: 20 20 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75      ** the defau
29b0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
29c0: 75 65 6e 63 65 73 20 66 6f 72 20 65 61 63 68 20  uences for each 
29d0: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20 20  column. */.     
29e0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
29f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2a00: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2a10: 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d        i16 iCol =
2a20: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
2a30: 69 5d 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  i];     /* Index
2a40: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 61   of column in pa
2a50: 72 65 6e 74 20 74 62 6c 20 2a 2f 0a 20 20 20 20  rent tbl */.    
2a60: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a70: 20 2a 7a 44 66 6c 74 43 6f 6c 6c 3b 20 20 20 20   *zDfltColl;    
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 2e 20          /* Def. 
2a90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 6f 72 20 63 6f  collation for co
2aa0: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
2ab0: 20 20 63 68 61 72 20 2a 7a 49 64 78 43 6f 6c 3b    char *zIdxCol;
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
2ae0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  ndexed column */
2af0: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
2b00: 69 43 6f 6c 3c 30 20 29 20 62 72 65 61 6b 3b 20  iCol<0 ) break; 
2b10: 2f 2a 20 4e 6f 20 66 6f 72 65 69 67 6e 20 6b 65  /* No foreign ke
2b20: 79 73 20 61 67 61 69 6e 73 74 20 65 78 70 72 65  ys against expre
2b30: 73 73 69 6f 6e 20 69 6e 64 65 78 65 73 20 2a 2f  ssion indexes */
2b40: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
2b50: 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 73  f the index uses
2b60: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
2b70: 75 65 6e 63 65 20 74 68 61 74 20 69 73 20 64 69  uence that is di
2b80: 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20 20  fferent from.   
2b90: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 65         ** the de
2ba0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
2bb0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
2bc0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 69 73 20 69 6e   column, this in
2bd0: 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 20  dex is.         
2be0: 20 2a 2a 20 75 6e 75 73 61 62 6c 65 2e 20 42 61   ** unusable. Ba
2bf0: 69 6c 20 6f 75 74 20 65 61 72 6c 79 20 69 6e 20  il out early in 
2c00: 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
2c10: 20 20 20 20 20 20 20 20 20 7a 44 66 6c 74 43 6f           zDfltCo
2c20: 6c 6c 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 43  ll = pParent->aC
2c30: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a  ol[iCol].zColl;.
2c40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
2c50: 44 66 6c 74 43 6f 6c 6c 20 29 20 7a 44 66 6c 74  DfltColl ) zDflt
2c60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
2c70: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
2c80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2c90: 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f  rICmp(pIdx->azCo
2ca0: 6c 6c 5b 69 5d 2c 20 7a 44 66 6c 74 43 6f 6c 6c  ll[i], zDfltColl
2cb0: 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  ) ) break;..    
2cc0: 20 20 20 20 20 20 7a 49 64 78 43 6f 6c 20 3d 20        zIdxCol = 
2cd0: 70 50 61 72 65 6e 74 2d 3e 61 43 6f 6c 5b 69 43  pParent->aCol[iC
2ce0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
2cf0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2d00: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2d10: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2d20: 74 65 33 53 74 72 49 43 6d 70 28 70 46 4b 65 79  te3StrICmp(pFKey
2d30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 20  ->aCol[j].zCol, 
2d40: 7a 49 64 78 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  zIdxCol)==0 ){. 
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2d60: 20 61 69 43 6f 6c 20 29 20 61 69 43 6f 6c 5b 69   aiCol ) aiCol[i
2d70: 5d 20 3d 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  ] = pFKey->aCol[
2d80: 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20  j].iFrom;.      
2d90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2da0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2db0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dc0: 20 20 20 69 66 28 20 6a 3d 3d 6e 43 6f 6c 20 29     if( j==nCol )
2dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2de0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
2df0: 3d 6e 43 6f 6c 20 29 20 62 72 65 61 6b 3b 20 20  =nCol ) break;  
2e00: 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 75      /* pIdx is u
2e10: 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d  sable */.      }
2e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2e30: 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 69  ( !pIdx ){.    i
2e40: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 69 73 61  f( !pParse->disa
2e50: 62 6c 65 54 72 69 67 67 65 72 73 20 29 7b 0a 20  bleTriggers ){. 
2e60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2e70: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
2e80: 20 20 20 20 20 20 20 20 22 66 6f 72 65 69 67 6e          "foreign
2e90: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
2ea0: 5c 22 25 77 5c 22 20 72 65 66 65 72 65 6e 63 69  \"%w\" referenci
2eb0: 6e 67 20 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20  ng \"%w\"",.    
2ec0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 46         pFKey->pF
2ed0: 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 46 4b 65  rom->zName, pFKe
2ee0: 79 2d 3e 7a 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  y->zTo);.    }. 
2ef0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2f00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 43  (pParse->db, aiC
2f10: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
2f20: 31 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 49 64 78  1;.  }..  *ppIdx
2f30: 20 3d 20 70 49 64 78 3b 0a 20 20 72 65 74 75 72   = pIdx;.  retur
2f40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2f50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2f60: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 77  alled when a row
2f70: 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
2f80: 6f 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  o or deleted fro
2f90: 6d 20 74 68 65 20 0a 2a 2a 20 63 68 69 6c 64 20  m the .** child 
2fa0: 74 61 62 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e  table of foreign
2fb0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
2fc0: 70 46 4b 65 79 2e 20 49 66 20 61 6e 20 53 51 4c  pFKey. If an SQL
2fd0: 20 55 50 44 41 54 45 20 69 73 20 65 78 65 63 75   UPDATE is execu
2fe0: 74 65 64 20 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  ted .** on the c
2ff0: 68 69 6c 64 20 74 61 62 6c 65 20 6f 66 20 70 46  hild table of pF
3000: 4b 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  Key, this functi
3010: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 77  on is invoked tw
3020: 69 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ice for each row
3030: 0a 2a 2a 20 61 66 66 65 63 74 65 64 20 2d 20 6f  .** affected - o
3040: 6e 63 65 20 74 6f 20 22 64 65 6c 65 74 65 22 20  nce to "delete" 
3050: 74 68 65 20 6f 6c 64 20 72 6f 77 2c 20 61 6e 64  the old row, and
3060: 20 74 68 65 6e 20 61 67 61 69 6e 20 74 6f 20 22   then again to "
3070: 69 6e 73 65 72 74 22 20 74 68 65 0a 2a 2a 20 6e  insert" the.** n
3080: 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 45 61  ew row..**.** Ea
3090: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
30a0: 6c 6c 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  lled, this funct
30b0: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 44  ion generates VD
30c0: 42 45 20 63 6f 64 65 20 74 6f 20 6c 6f 63 61 74  BE code to locat
30d0: 65 20 74 68 65 0a 2a 2a 20 72 6f 77 20 69 6e 20  e the.** row in 
30e0: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
30f0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
3100: 73 20 74 6f 20 74 68 65 20 72 6f 77 20 62 65 69  s to the row bei
3110: 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ng inserted into
3120: 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 64 20   .** or deleted 
3130: 66 72 6f 6d 20 74 68 65 20 63 68 69 6c 64 20 74  from the child t
3140: 61 62 6c 65 2e 20 49 66 20 74 68 65 20 70 61 72  able. If the par
3150: 65 6e 74 20 72 6f 77 20 63 61 6e 20 62 65 20 66  ent row can be f
3160: 6f 75 6e 64 2c 20 6e 6f 20 0a 2a 2a 20 73 70 65  ound, no .** spe
3170: 63 69 61 6c 20 61 63 74 69 6f 6e 20 69 73 20 74  cial action is t
3180: 61 6b 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  aken. Otherwise,
3190: 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 72   if the parent r
31a0: 6f 77 20 63 61 6e 20 2a 6e 6f 74 2a 20 62 65 0a  ow can *not* be.
31b0: 2a 2a 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ** found in the 
31c0: 70 61 72 65 6e 74 20 74 61 62 6c 65 3a 0a 2a 2a  parent table:.**
31d0: 0a 2a 2a 20 20 20 4f 70 65 72 61 74 69 6f 6e 20  .**   Operation 
31e0: 7c 20 46 4b 20 74 79 70 65 20 20 20 7c 20 41 63  | FK type   | Ac
31f0: 74 69 6f 6e 20 74 61 6b 65 6e 0a 2a 2a 20 20 20  tion taken.**   
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
3250: 49 4e 53 45 52 54 20 20 20 20 20 20 69 6d 6d 65  INSERT      imme
3260: 64 69 61 74 65 20 20 20 49 6e 63 72 65 6d 65 6e  diate   Incremen
3270: 74 20 74 68 65 20 22 69 6d 6d 65 64 69 61 74 65  t the "immediate
3280: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
3290: 74 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 45  ter"..**.**   DE
32a0: 4c 45 54 45 20 20 20 20 20 20 69 6d 6d 65 64 69  LETE      immedi
32b0: 61 74 65 20 20 20 44 65 63 72 65 6d 65 6e 74 20  ate   Decrement 
32c0: 74 68 65 20 22 69 6d 6d 65 64 69 61 74 65 20 63  the "immediate c
32d0: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
32e0: 72 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45  r"..**.**   INSE
32f0: 52 54 20 20 20 20 20 20 64 65 66 65 72 72 65 64  RT      deferred
3300: 20 20 20 20 49 6e 63 72 65 6d 65 6e 74 20 74 68      Increment th
3310: 65 20 22 64 65 66 65 72 72 65 64 20 63 6f 6e 73  e "deferred cons
3320: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 2e  traint counter".
3330: 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 45 20  .**.**   DELETE 
3340: 20 20 20 20 20 64 65 66 65 72 72 65 64 20 20 20       deferred   
3350: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 22   Decrement the "
3360: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
3370: 69 6e 74 20 63 6f 75 6e 74 65 72 22 2e 0a 2a 2a  int counter"..**
3380: 0a 2a 2a 20 54 68 65 73 65 20 6f 70 65 72 61 74  .** These operat
3390: 69 6f 6e 73 20 61 72 65 20 69 64 65 6e 74 69 66  ions are identif
33a0: 69 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  ied in the comme
33b0: 6e 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  nt at the top of
33c0: 20 74 68 69 73 20 66 69 6c 65 20 0a 2a 2a 20 28   this file .** (
33d0: 66 6b 65 79 2e 63 29 20 61 73 20 22 49 2e 31 22  fkey.c) as "I.1"
33e0: 20 61 6e 64 20 22 44 2e 31 22 2e 0a 2a 2f 0a 73   and "D.1"..*/.s
33f0: 74 61 74 69 63 20 76 6f 69 64 20 66 6b 4c 6f 6f  tatic void fkLoo
3400: 6b 75 70 50 61 72 65 6e 74 28 0a 20 20 50 61 72  kupParent(.  Par
3410: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3420: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
3430: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
3440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3450: 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
3460: 61 73 65 20 68 6f 75 73 69 6e 67 20 70 54 61 62  ase housing pTab
3470: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
3480: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  b,          /* P
3490: 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 46  arent table of F
34a0: 4b 20 70 46 4b 65 79 20 2a 2f 0a 20 20 49 6e 64  K pFKey */.  Ind
34b0: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
34c0: 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 69 6e 64     /* Unique ind
34d0: 65 78 20 6f 6e 20 70 61 72 65 6e 74 20 6b 65 79  ex on parent key
34e0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62   columns in pTab
34f0: 20 2a 2f 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65   */.  FKey *pFKe
3500: 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  y,          /* F
3510: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
3520: 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  raint */.  int *
3530: 61 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  aiCol,          
3540: 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 70 61 72   /* Map from par
3550: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
3560: 74 6f 20 63 68 69 6c 64 20 74 61 62 6c 65 20 63  to child table c
3570: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
3580: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
3590: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
35a0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67  array containing
35b0: 20 63 68 69 6c 64 20 74 61 62 6c 65 20 72 6f 77   child table row
35c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 63 72 2c   */.  int nIncr,
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35e0: 6e 63 72 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61  ncrement constra
35f0: 69 6e 74 20 63 6f 75 6e 74 65 72 20 62 79 20 74  int counter by t
3600: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  his */.  int isI
3610: 67 6e 6f 72 65 20 20 20 20 20 20 20 20 20 20 2f  gnore          /
3620: 2a 20 49 66 20 74 72 75 65 2c 20 70 72 65 74 65  * If true, prete
3630: 6e 64 20 70 54 61 62 20 63 6f 6e 74 61 69 6e 73  nd pTab contains
3640: 20 61 6c 6c 20 4e 55 4c 4c 20 76 61 6c 75 65 73   all NULL values
3650: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
3690: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  ariable */.  Vdb
36a0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
36b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
36c0: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74         /* Vdbe t
36d0: 6f 20 61 64 64 20 63 6f 64 65 20 74 6f 20 2a 2f  o add code to */
36e0: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 50  .  int iCur = pP
36f0: 61 72 73 65 2d 3e 6e 54 61 62 20 2d 20 31 3b 20  arse->nTab - 1; 
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 74 6f  Cursor number to
3720: 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f   use */.  int iO
3730: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
3740: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
3750: 3b 20 20 20 2f 2a 20 6a 75 6d 70 20 68 65 72 65  ;   /* jump here
3760: 20 69 66 20 70 61 72 65 6e 74 20 6b 65 79 20 66   if parent key f
3770: 6f 75 6e 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ound */..  sqlit
3780: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
3790: 74 61 62 6c 65 28 76 2c 0a 20 20 20 20 28 21 70  table(v,.    (!p
37a0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
37b0: 0a 20 20 20 20 20 20 26 26 20 21 28 70 50 61 72  .      && !(pPar
37c0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
37d0: 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 29  SQLITE_DeferFKs)
37e0: 0a 20 20 20 20 20 20 26 26 20 21 70 50 61 72 73  .      && !pPars
37f0: 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 0a 20 20  e->pToplevel .  
3800: 20 20 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e      && !pParse->
3810: 69 73 4d 75 6c 74 69 57 72 69 74 65 29 20 3f 20  isMultiWrite) ? 
3820: 4f 45 5f 41 62 6f 72 74 20 3a 20 4f 45 5f 49 67  OE_Abort : OE_Ig
3830: 6e 6f 72 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nore);..  /* If 
3840: 6e 49 6e 63 72 20 69 73 20 6c 65 73 73 20 74 68  nIncr is less th
3850: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 63 68  an zero, then ch
3860: 65 63 6b 20 61 74 20 72 75 6e 74 69 6d 65 20 69  eck at runtime i
3870: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a  f there are any.
3880: 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
3890: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
38a0: 72 65 73 6f 6c 76 65 2e 20 49 66 20 74 68 65 72  resolve. If ther
38b0: 65 20 61 72 65 20 6e 6f 74 2c 20 74 68 65 72 65  e are not, there
38c0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a   is no need.  **
38d0: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 64 65 6c   to check if del
38e0: 65 74 69 6e 67 20 74 68 69 73 20 72 6f 77 20 72  eting this row r
38f0: 65 73 6f 6c 76 65 73 20 61 6e 79 20 6f 75 74 73  esolves any outs
3900: 74 61 6e 64 69 6e 67 20 76 69 6f 6c 61 74 69 6f  tanding violatio
3910: 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  ns..  **.  ** Ch
3920: 65 63 6b 20 69 66 20 61 6e 79 20 6f 66 20 74 68  eck if any of th
3930: 65 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  e key columns in
3940: 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
3950: 20 72 6f 77 20 61 72 65 20 4e 55 4c 4c 2e 20 49   row are NULL. I
3960: 66 20 0a 20 20 2a 2a 20 61 6e 79 20 61 72 65 2c  f .  ** any are,
3970: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
3980: 61 69 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72  aint is consider
3990: 65 64 20 73 61 74 69 73 66 69 65 64 2e 20 4e 6f  ed satisfied. No
39a0: 20 6e 65 65 64 20 74 6f 20 0a 20 20 2a 2a 20 73   need to .  ** s
39b0: 65 61 72 63 68 20 66 6f 72 20 61 20 6d 61 74 63  earch for a matc
39c0: 68 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65 20  hing row in the 
39d0: 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 2a  parent table.  *
39e0: 2f 0a 20 20 69 66 28 20 6e 49 6e 63 72 3c 30 20  /.  if( nIncr<0 
39f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
3a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46  beAddOp2(v, OP_F
3a10: 6b 49 66 5a 65 72 6f 2c 20 70 46 4b 65 79 2d 3e  kIfZero, pFKey->
3a20: 69 73 44 65 66 65 72 72 65 64 2c 20 69 4f 6b 29  isDeferred, iOk)
3a30: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
3a40: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  ge(v);.  }.  for
3a50: 28 69 3d 30 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e  (i=0; i<pFKey->n
3a60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
3a70: 6e 74 20 69 52 65 67 20 3d 20 61 69 43 6f 6c 5b  nt iReg = aiCol[
3a80: 69 5d 20 2b 20 72 65 67 44 61 74 61 20 2b 20 31  i] + regData + 1
3a90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3aa0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
3ab0: 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 4f 6b 29  Null, iReg, iOk)
3ac0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
3ad0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  );.  }..  if( is
3ae0: 49 67 6e 6f 72 65 3d 3d 30 20 29 7b 0a 20 20 20  Ignore==0 ){.   
3af0: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
3b00: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 49 64 78        /* If pIdx
3b10: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
3b20: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73  he parent key is
3b30: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
3b40: 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 20 20 2a  MARY KEY.      *
3b50: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  * column of the 
3b60: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 28 74 61  parent table (ta
3b70: 62 6c 65 20 70 54 61 62 29 2e 20 20 2a 2f 0a 20  ble pTab).  */. 
3b80: 20 20 20 20 20 69 6e 74 20 69 4d 75 73 74 42 65       int iMustBe
3b90: 49 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Int;            
3ba0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
3bb0: 20 4d 75 73 74 42 65 49 6e 74 20 69 6e 73 74 72   MustBeInt instr
3bc0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
3bd0: 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 73 71  int regTemp = sq
3be0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
3bf0: 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 20 20  pParse);.  .    
3c00: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 4d 75 73 74    /* Invoke Must
3c10: 42 65 49 6e 74 20 74 6f 20 63 6f 65 72 63 65 20  BeInt to coerce 
3c20: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
3c30: 6c 75 65 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  lue to an intege
3c40: 72 20 28 69 2e 65 2e 20 0a 20 20 20 20 20 20 2a  r (i.e. .      *
3c50: 2a 20 61 70 70 6c 79 20 74 68 65 20 61 66 66 69  * apply the affi
3c60: 6e 69 74 79 20 6f 66 20 74 68 65 20 70 61 72 65  nity of the pare
3c70: 6e 74 20 6b 65 79 29 2e 20 49 66 20 74 68 69 73  nt key). If this
3c80: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
3c90: 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  re.      ** is n
3ca0: 6f 20 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e  o matching paren
3cb0: 74 20 6b 65 79 2e 20 42 65 66 6f 72 65 20 75 73  t key. Before us
3cc0: 69 6e 67 20 4d 75 73 74 42 65 49 6e 74 2c 20 6d  ing MustBeInt, m
3cd0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ake a copy of.  
3ce0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
3cf0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
3d00: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3d10: 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 20 6b  into the child k
3d20: 65 79 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ey column.      
3d30: 2a 2a 20 77 69 6c 6c 20 68 61 76 65 20 49 4e 54  ** will have INT
3d40: 45 47 45 52 20 61 66 66 69 6e 69 74 79 20 61 70  EGER affinity ap
3d50: 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 77 68 69  plied to it, whi
3d60: 63 68 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 6f  ch may not be co
3d70: 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
3d80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d90: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
3da0: 61 69 43 6f 6c 5b 30 5d 2b 31 2b 72 65 67 44 61  aiCol[0]+1+regDa
3db0: 74 61 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20  ta, regTemp);.  
3dc0: 20 20 20 20 69 4d 75 73 74 42 65 49 6e 74 20 3d      iMustBeInt =
3dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3de0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
3df0: 6e 74 2c 20 72 65 67 54 65 6d 70 2c 20 30 29 3b  nt, regTemp, 0);
3e00: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
3e10: 61 67 65 28 76 29 3b 0a 20 20 0a 20 20 20 20 20  age(v);.  .     
3e20: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   /* If the paren
3e30: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 73  t table is the s
3e40: 61 6d 65 20 61 73 20 74 68 65 20 63 68 69 6c 64  ame as the child
3e50: 20 74 61 62 6c 65 2c 20 61 6e 64 20 77 65 20 61   table, and we a
3e60: 72 65 20 61 62 6f 75 74 0a 20 20 20 20 20 20 2a  re about.      *
3e70: 2a 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  * to increment t
3e80: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f  he constraint-co
3e90: 75 6e 74 65 72 20 28 69 2e 65 2e 20 74 68 69 73  unter (i.e. this
3ea0: 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 70   is an INSERT op
3eb0: 65 72 61 74 69 6f 6e 29 2c 0a 20 20 20 20 20 20  eration),.      
3ec0: 2a 2a 20 74 68 65 6e 20 63 68 65 63 6b 20 69 66  ** then check if
3ed0: 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 69   the row being i
3ee0: 6e 73 65 72 74 65 64 20 6d 61 74 63 68 65 73 20  nserted matches 
3ef0: 69 74 73 65 6c 66 2e 20 49 66 20 73 6f 2c 20 64  itself. If so, d
3f00: 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69  o not.      ** i
3f10: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 6e  ncrement the con
3f20: 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 2e  straint-counter.
3f30: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
3f40: 54 61 62 3d 3d 70 46 4b 65 79 2d 3e 70 46 72 6f  Tab==pFKey->pFro
3f50: 6d 20 26 26 20 6e 49 6e 63 72 3d 3d 31 20 29 7b  m && nIncr==1 ){
3f60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3f70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3f80: 5f 45 71 2c 20 72 65 67 44 61 74 61 2c 20 69 4f  _Eq, regData, iO
3f90: 6b 2c 20 72 65 67 54 65 6d 70 29 3b 20 56 64 62  k, regTemp); Vdb
3fa0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
3fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3fc0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
3fd0: 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  ITE_NOTNULL);.  
3fe0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 73      }.  .      s
3ff0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
4000: 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 69 44  pParse, iCur, iD
4010: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
4020: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  Read);.      sql
4030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4040: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
4050: 69 43 75 72 2c 20 30 2c 20 72 65 67 54 65 6d 70  iCur, 0, regTemp
4060: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4070: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
4080: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 4f 6b  3VdbeGoto(v, iOk
4090: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
40a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
40b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
40c0: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
40e0: 75 6d 70 48 65 72 65 28 76 2c 20 69 4d 75 73 74  umpHere(v, iMust
40f0: 42 65 49 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  BeInt);.      sq
4100: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4110: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
4120: 65 6d 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  emp);.    }else{
4130: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  .      int nCol 
4140: 3d 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3b 0a 20  = pFKey->nCol;. 
4150: 20 20 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70       int regTemp
4160: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4170: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
4180: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Col);.      int 
4190: 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65 33  regRec = sqlite3
41a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
41b0: 65 29 3b 0a 20 20 0a 20 20 20 20 20 20 73 71 6c  e);.  .      sql
41c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
41d0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
41e0: 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Cur, pIdx->tnum,
41f0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
4200: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
4210: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
4220: 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  x);.      for(i=
4230: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
4240: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4250: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4260: 5f 43 6f 70 79 2c 20 61 69 43 6f 6c 5b 69 5d 2b  _Copy, aiCol[i]+
4270: 31 2b 72 65 67 44 61 74 61 2c 20 72 65 67 54 65  1+regData, regTe
4280: 6d 70 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  mp+i);.      }. 
4290: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
42a0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 69  e parent table i
42b0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
42c0: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 2c 20 61  e child table, a
42d0: 6e 64 20 77 65 20 61 72 65 20 61 62 6f 75 74 0a  nd we are about.
42e0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 72        ** to incr
42f0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6e 73 74 72  ement the constr
4300: 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 28 69 2e  aint-counter (i.
4310: 65 2e 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  e. this is an IN
4320: 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 29 2c  SERT operation),
4330: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
4340: 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f 77 20  heck if the row 
4350: 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6d  being inserted m
4360: 61 74 63 68 65 73 20 69 74 73 65 6c 66 2e 20 49  atches itself. I
4370: 66 20 73 6f 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  f so, do not.   
4380: 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20     ** increment 
4390: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63  the constraint-c
43a0: 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 20 20 2a  ounter. .      *
43b0: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 61 6e  *.      ** If an
43c0: 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2d  y of the parent-
43d0: 6b 65 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e  key values are N
43e0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ULL, then the ro
43f0: 77 20 63 61 6e 6e 6f 74 20 6d 61 74 63 68 20 0a  w cannot match .
4400: 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e        ** itself.
4410: 20 53 6f 20 73 65 74 20 4a 55 4d 50 49 46 4e 55   So set JUMPIFNU
4420: 4c 4c 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  LL to make sure 
4430: 77 65 20 64 6f 20 74 68 65 20 4f 50 5f 46 6f 75  we do the OP_Fou
4440: 6e 64 20 69 66 20 61 6e 79 0a 20 20 20 20 20 20  nd if any.      
4450: 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
4460: 2d 6b 65 79 20 76 61 6c 75 65 73 20 61 72 65 20  -key values are 
4470: 4e 55 4c 4c 20 28 61 74 20 74 68 69 73 20 70 6f  NULL (at this po
4480: 69 6e 74 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20  int it is known 
4490: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  that.      ** no
44a0: 6e 65 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ne of the child 
44b0: 6b 65 79 20 76 61 6c 75 65 73 20 61 72 65 29 2e  key values are).
44c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
44d0: 69 66 28 20 70 54 61 62 3d 3d 70 46 4b 65 79 2d  if( pTab==pFKey-
44e0: 3e 70 46 72 6f 6d 20 26 26 20 6e 49 6e 63 72 3d  >pFrom && nIncr=
44f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =1 ){.        in
4500: 74 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  t iJump = sqlite
4510: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
4520: 28 76 29 20 2b 20 6e 43 6f 6c 20 2b 20 31 3b 0a  (v) + nCol + 1;.
4530: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4540: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
4550: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 68           int iCh
4560: 69 6c 64 20 3d 20 61 69 43 6f 6c 5b 69 5d 2b 31  ild = aiCol[i]+1
4570: 2b 72 65 67 44 61 74 61 3b 0a 20 20 20 20 20 20  +regData;.      
4580: 20 20 20 20 69 6e 74 20 69 50 61 72 65 6e 74 20      int iParent 
4590: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
45a0: 5b 69 5d 2b 31 2b 72 65 67 44 61 74 61 3b 0a 20  [i]+1+regData;. 
45b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
45c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45d0: 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  i]>=0 );.       
45e0: 20 20 20 61 73 73 65 72 74 28 20 61 69 43 6f 6c     assert( aiCol
45f0: 5b 69 5d 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79  [i]!=pTab->iPKey
4600: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
4610: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
4620: 5b 69 5d 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  [i]==pTab->iPKey
4630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4640: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65  /* The parent ke
4650: 79 20 69 73 20 61 20 63 6f 6d 70 6f 73 69 74 65  y is a composite
4660: 20 6b 65 79 20 74 68 61 74 20 69 6e 63 6c 75 64   key that includ
4670: 65 73 20 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d  es the IPK colum
4680: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
4690: 20 69 50 61 72 65 6e 74 20 3d 20 72 65 67 44 61   iParent = regDa
46a0: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ta;.          }.
46b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
46c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
46d0: 50 5f 4e 65 2c 20 69 43 68 69 6c 64 2c 20 69 4a  P_Ne, iChild, iJ
46e0: 75 6d 70 2c 20 69 50 61 72 65 6e 74 29 3b 20 56  ump, iParent); V
46f0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4700: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4710: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
4720: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
4730: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  LL);.        }. 
4740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4750: 62 65 47 6f 74 6f 28 76 2c 20 69 4f 6b 29 3b 0a  beGoto(v, iOk);.
4760: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
4770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4780: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
4790: 6f 72 64 2c 20 72 65 67 54 65 6d 70 2c 20 6e 43  ord, regTemp, nC
47a0: 6f 6c 2c 20 72 65 67 52 65 63 2c 0a 20 20 20 20  ol, regRec,.    
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
47d0: 41 66 66 69 6e 69 74 79 53 74 72 28 70 50 61 72  AffinityStr(pPar
47e0: 73 65 2d 3e 64 62 2c 70 49 64 78 29 2c 20 6e 43  se->db,pIdx), nC
47f0: 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ol);.      sqlit
4800: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
4810: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 43 75  v, OP_Found, iCu
4820: 72 2c 20 69 4f 6b 2c 20 72 65 67 52 65 63 2c 20  r, iOk, regRec, 
4830: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
4840: 28 76 29 3b 0a 20 20 0a 20 20 20 20 20 20 73 71  (v);.  .      sq
4850: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4860: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
4870: 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
4880: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
4890: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 54 65  ge(pParse, regTe
48a0: 6d 70 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d  mp, nCol);.    }
48b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 46 4b  .  }..  if( !pFK
48c0: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 26  ey->isDeferred &
48d0: 26 20 21 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  & !(pParse->db->
48e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
48f0: 65 66 65 72 46 4b 73 29 0a 20 20 20 26 26 20 21  eferFKs).   && !
4900: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
4910: 6c 20 0a 20 20 20 26 26 20 21 70 50 61 72 73 65  l .   && !pParse
4920: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
4930: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63    ){.    /* Spec
4940: 69 61 6c 20 63 61 73 65 3a 20 49 66 20 74 68 69  ial case: If thi
4950: 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 73  s is an INSERT s
4960: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
4970: 6c 6c 20 69 6e 73 65 72 74 20 65 78 61 63 74 6c  ll insert exactl
4980: 79 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77  y.    ** one row
4990: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2c   into the table,
49a0: 20 72 61 69 73 65 20 61 20 63 6f 6e 73 74 72 61   raise a constra
49b0: 69 6e 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  int immediately 
49c0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
49d0: 2a 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 61  * incrementing a
49e0: 20 63 6f 75 6e 74 65 72 2e 20 54 68 69 73 20 69   counter. This i
49f0: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
4a00: 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 62 65  he VM code is be
4a10: 69 6e 67 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  ing.    ** gener
4a20: 61 74 65 64 20 66 6f 72 20 77 69 6c 6c 20 6e 6f  ated for will no
4a30: 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65 6d 65  t open a stateme
4a40: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
4a50: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
4a60: 6e 49 6e 63 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nIncr==1 );.    
4a70: 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
4a80: 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
4a90: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
4aa0: 46 4f 52 45 49 47 4e 4b 45 59 2c 0a 20 20 20 20  FOREIGNKEY,.    
4ab0: 20 20 20 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c      OE_Abort, 0,
4ac0: 20 50 34 5f 53 54 41 54 49 43 2c 20 50 35 5f 43   P4_STATIC, P5_C
4ad0: 6f 6e 73 74 72 61 69 6e 74 46 4b 29 3b 0a 20 20  onstraintFK);.  
4ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
4af0: 49 6e 63 72 3e 30 20 26 26 20 70 46 4b 65 79 2d  Incr>0 && pFKey-
4b00: 3e 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 29  >isDeferred==0 )
4b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
4b20: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
4b30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4b40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4b50: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 2c 20 70 46  OP_FkCounter, pF
4b60: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 2c  Key->isDeferred,
4b70: 20 6e 49 6e 63 72 29 3b 0a 20 20 7d 0a 0a 20 20   nIncr);.  }..  
4b80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
4b90: 76 65 4c 61 62 65 6c 28 76 2c 20 69 4f 6b 29 3b  veLabel(v, iOk);
4ba0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4bb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
4bc0: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iCur);.}.../*.
4bd0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 45 78 70  ** Return an Exp
4be0: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 72 65  r object that re
4bf0: 66 65 72 73 20 74 6f 20 61 20 6d 65 6d 6f 72 79  fers to a memory
4c00: 20 72 65 67 69 73 74 65 72 20 63 6f 72 72 65 73   register corres
4c10: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 63 6f  ponding.** to co
4c20: 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 61 62  lumn iCol of tab
4c30: 6c 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 72  le pTab..**.** r
4c40: 65 67 42 61 73 65 20 69 73 20 74 68 65 20 66 69  egBase is the fi
4c50: 72 73 74 20 6f 66 20 61 6e 20 61 72 72 61 79 20  rst of an array 
4c60: 6f 66 20 72 65 67 69 73 74 65 72 20 74 68 61 74  of register that
4c70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
4c80: 74 61 0a 2a 2a 20 66 6f 72 20 70 54 61 62 2e 20  ta.** for pTab. 
4c90: 20 72 65 67 42 61 73 65 20 69 74 73 65 6c 66 20   regBase itself 
4ca0: 68 6f 6c 64 73 20 74 68 65 20 72 6f 77 69 64 2e  holds the rowid.
4cb0: 20 20 72 65 67 42 61 73 65 2b 31 20 68 6f 6c 64    regBase+1 hold
4cc0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  s the first.** c
4cd0: 6f 6c 75 6d 6e 2e 20 20 72 65 67 42 61 73 65 2b  olumn.  regBase+
4ce0: 32 20 68 6f 6c 64 73 20 74 68 65 20 73 65 63 6f  2 holds the seco
4cf0: 6e 64 20 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20 73  nd column, and s
4d00: 6f 20 66 6f 72 74 68 2e 0a 2a 2f 0a 73 74 61 74  o forth..*/.stat
4d10: 69 63 20 45 78 70 72 20 2a 65 78 70 72 54 61 62  ic Expr *exprTab
4d20: 6c 65 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  leRegister(.  Pa
4d30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4d40: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4d50: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4d60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
4d70: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
4d80: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 68 6f  /* The table who
4d90: 73 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 61 74  se content is at
4da0: 20 72 5b 72 65 67 42 61 73 65 5d 2e 2e 2e 20 2a   r[regBase]... *
4db0: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 2c  /.  int regBase,
4dc0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
4dd0: 74 73 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62  ts of table pTab
4de0: 20 2a 2f 0a 20 20 69 31 36 20 69 43 6f 6c 20 20   */.  i16 iCol  
4df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
4e00: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62  h column of pTab
4e10: 20 69 73 20 64 65 73 69 72 65 64 20 2a 2f 0a 29   is desired */.)
4e20: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
4e30: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4e50: 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  Coll;.  sqlite3 
4e60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4e70: 3b 0a 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  ;..  pExpr = sql
4e80: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
4e90: 52 45 47 49 53 54 45 52 2c 20 30 29 3b 0a 20 20  REGISTER, 0);.  
4ea0: 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
4eb0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
4ec0: 69 43 6f 6c 21 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol!=pTab->iPKe
4ed0: 79 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  y ){.      pCol 
4ee0: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
4ef0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ol];.      pExpr
4f00: 2d 3e 69 54 61 62 6c 65 20 3d 20 72 65 67 42 61  ->iTable = regBa
4f10: 73 65 20 2b 20 69 43 6f 6c 20 2b 20 31 3b 0a 20  se + iCol + 1;. 
4f20: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
4f30: 6e 69 74 79 20 3d 20 70 43 6f 6c 2d 3e 61 66 66  nity = pCol->aff
4f40: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7a 43 6f  inity;.      zCo
4f50: 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  ll = pCol->zColl
4f60: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  ;.      if( zCol
4f70: 6c 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 64  l==0 ) zColl = d
4f80: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
4f90: 61 6d 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ame;.      pExpr
4fa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 64   = sqlite3ExprAd
4fb0: 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
4fc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 7a 43  Parse, pExpr, zC
4fd0: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oll);.    }else{
4fe0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
4ff0: 61 62 6c 65 20 3d 20 72 65 67 42 61 73 65 3b 0a  able = regBase;.
5000: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
5010: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
5020: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
5030: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
5040: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Expr;.}../*.** R
5050: 65 74 75 72 6e 20 61 6e 20 45 78 70 72 20 6f 62  eturn an Expr ob
5060: 6a 65 63 74 20 74 68 61 74 20 72 65 66 65 72 73  ject that refers
5070: 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20   to column iCol 
5080: 6f 66 20 74 61 62 6c 65 20 70 54 61 62 20 77 68  of table pTab wh
5090: 69 63 68 0a 2a 2a 20 68 61 73 20 63 75 72 73 6f  ich.** has curso
50a0: 72 20 69 43 75 72 2e 0a 2a 2f 0a 73 74 61 74 69  r iCur..*/.stati
50b0: 63 20 45 78 70 72 20 2a 65 78 70 72 54 61 62 6c  c Expr *exprTabl
50c0: 65 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74  eColumn(.  sqlit
50d0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
50e0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
50f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  nection */.  Tab
5100: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 2f  le *pTab,      /
5110: 2a 20 54 68 65 20 74 61 62 6c 65 20 77 68 6f 73  * The table whos
5120: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 73 69  e column is desi
5130: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  red */.  int iCu
5140: 72 73 6f 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  rsor,      /* Th
5150: 65 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 6f 6e  e open cursor on
5160: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
5170: 69 31 36 20 69 43 6f 6c 20 20 20 20 20 20 20 20  i16 iCol        
5180: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
5190: 74 68 61 74 20 69 73 20 77 61 6e 74 65 64 20 2a  that is wanted *
51a0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  /.){.  Expr *pEx
51b0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
51c0: 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  (db, TK_COLUMN, 
51d0: 30 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  0);.  if( pExpr 
51e0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e  ){.    pExpr->y.
51f0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
5200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
5210: 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 45   iCursor;.    pE
5220: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  xpr->iColumn = i
5230: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
5240: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
5250: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5260: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 67 65 6e  is called to gen
5270: 65 72 61 74 65 20 63 6f 64 65 20 65 78 65 63 75  erate code execu
5280: 74 65 64 20 77 68 65 6e 20 61 20 72 6f 77 20 69  ted when a row i
5290: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 66 72 6f  s deleted.** fro
52a0: 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  m the parent tab
52b0: 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65  le of foreign ke
52c0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 46 4b  y constraint pFK
52d0: 65 79 20 61 6e 64 2c 20 69 66 20 70 46 4b 65 79  ey and, if pFKey
52e0: 20 69 73 20 0a 2a 2a 20 64 65 66 65 72 72 65 64   is .** deferred
52f0: 2c 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  , when a row is 
5300: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
5310: 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 57 68  e same table. Wh
5320: 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 0a 2a 2a  en generating.**
5330: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 53 51 4c   code for an SQL
5340: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
5350: 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
5360: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 74   may be called t
5370: 77 69 63 65 20 2d 0a 2a 2a 20 6f 6e 63 65 20 74  wice -.** once t
5380: 6f 20 22 64 65 6c 65 74 65 22 20 74 68 65 20 6f  o "delete" the o
5390: 6c 64 20 72 6f 77 20 61 6e 64 20 6f 6e 63 65 20  ld row and once 
53a0: 74 6f 20 22 69 6e 73 65 72 74 22 20 74 68 65 20  to "insert" the 
53b0: 6e 65 77 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 50  new row..**.** P
53c0: 61 72 61 6d 65 74 65 72 20 6e 49 6e 63 72 20 69  arameter nIncr i
53d0: 73 20 70 61 73 73 65 64 20 2d 31 20 77 68 65 6e  s passed -1 when
53e0: 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
53f0: 20 28 61 73 20 74 68 69 73 20 6d 61 79 20 64 65   (as this may de
5400: 63 72 65 61 73 65 0a 2a 2a 20 74 68 65 20 6e 75  crease.** the nu
5410: 6d 62 65 72 20 6f 66 20 46 4b 20 76 69 6f 6c 61  mber of FK viola
5420: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 62 29  tions in the db)
5430: 20 6f 72 20 2b 31 20 77 68 65 6e 20 64 65 6c 65   or +1 when dele
5440: 74 69 6e 67 20 6f 6e 65 20 28 61 73 20 74 68 69  ting one (as thi
5450: 73 0a 2a 2a 20 6d 61 79 20 69 6e 63 72 65 61 73  s.** may increas
5460: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
5470: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72  FK constraint pr
5480: 6f 62 6c 65 6d 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  oblems)..**.** T
5490: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
54a0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
54b0: 6f 6e 20 73 63 61 6e 73 20 74 68 72 6f 75 67 68  on scans through
54c0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
54d0: 20 63 68 69 6c 64 0a 2a 2a 20 74 61 62 6c 65 20   child.** table 
54e0: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
54f0: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  to the parent ta
5500: 62 6c 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  ble row being de
5510: 6c 65 74 65 64 20 6f 72 20 69 6e 73 65 72 74 65  leted or inserte
5520: 64 2e 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 63  d..** For each c
5530: 68 69 6c 64 20 72 6f 77 20 66 6f 75 6e 64 2c 20  hild row found, 
5540: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
5550: 77 69 6e 67 20 61 63 74 69 6f 6e 73 20 69 73 20  wing actions is 
5560: 74 61 6b 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  taken:.**.**   O
5570: 70 65 72 61 74 69 6f 6e 20 7c 20 46 4b 20 74 79  peration | FK ty
5580: 70 65 20 20 20 7c 20 41 63 74 69 6f 6e 20 74 61  pe   | Action ta
5590: 6b 65 6e 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ken.**   -------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 0a 2a 2a 20 20 20 44 45 4c 45 54 45 20  ---.**   DELETE 
55f0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 20 20       immediate  
5600: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22   Increment the "
5610: 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72  immediate constr
5620: 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 2e 0a 2a  aint counter"..*
5630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5640: 20 20 20 20 20 20 20 20 20 20 20 20 4f 72 2c 20              Or, 
5650: 69 66 20 74 68 65 20 4f 4e 20 28 55 50 44 41 54  if the ON (UPDAT
5660: 45 7c 44 45 4c 45 54 45 29 20 61 63 74 69 6f 6e  E|DELETE) action
5670: 20 69 73 20 52 45 53 54 52 49 43 54 2c 0a 2a 2a   is RESTRICT,.**
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
56a0: 20 61 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20   a "FOREIGN KEY 
56b0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
56c0: 64 22 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a  d" exception..**
56d0: 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20 20 20 20  .**   INSERT    
56e0: 20 20 69 6d 6d 65 64 69 61 74 65 20 20 20 44 65    immediate   De
56f0: 63 72 65 6d 65 6e 74 20 74 68 65 20 22 69 6d 6d  crement the "imm
5700: 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e  ediate constrain
5710: 74 20 63 6f 75 6e 74 65 72 22 2e 0a 2a 2a 0a 2a  t counter"..**.*
5720: 2a 20 20 20 44 45 4c 45 54 45 20 20 20 20 20 20  *   DELETE      
5730: 64 65 66 65 72 72 65 64 20 20 20 20 49 6e 63 72  deferred    Incr
5740: 65 6d 65 6e 74 20 74 68 65 20 22 64 65 66 65 72  ement the "defer
5750: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
5760: 6f 75 6e 74 65 72 22 2e 0a 2a 2a 20 20 20 20 20  ounter"..**     
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 4f 72 2c 20 69 66 20 74 68 65        Or, if the
5790: 20 4f 4e 20 28 55 50 44 41 54 45 7c 44 45 4c 45   ON (UPDATE|DELE
57a0: 54 45 29 20 61 63 74 69 6f 6e 20 69 73 20 52 45  TE) action is RE
57b0: 53 54 52 49 43 54 2c 0a 2a 2a 20 20 20 20 20 20  STRICT,.**      
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 74 68 72 6f 77 20 61 20 22 46 4f       throw a "FO
57e0: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
57f0: 61 69 6e 74 20 66 61 69 6c 65 64 22 20 65 78 63  aint failed" exc
5800: 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  eption..**.**   
5810: 49 4e 53 45 52 54 20 20 20 20 20 20 64 65 66 65  INSERT      defe
5820: 72 72 65 64 20 20 20 20 44 65 63 72 65 6d 65 6e  rred    Decremen
5830: 74 20 74 68 65 20 22 64 65 66 65 72 72 65 64 20  t the "deferred 
5840: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
5850: 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  er"..**.** These
5860: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
5870: 69 64 65 6e 74 69 66 69 65 64 20 69 6e 20 74 68  identified in th
5880: 65 20 63 6f 6d 6d 65 6e 74 20 61 74 20 74 68 65  e comment at the
5890: 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
58a0: 65 20 0a 2a 2a 20 28 66 6b 65 79 2e 63 29 20 61  e .** (fkey.c) a
58b0: 73 20 22 49 2e 32 22 20 61 6e 64 20 22 44 2e 32  s "I.2" and "D.2
58c0: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
58d0: 64 20 66 6b 53 63 61 6e 43 68 69 6c 64 72 65 6e  d fkScanChildren
58e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
58f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5900: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
5910: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
5920: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
5930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5940: 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74 6f 20   child table to 
5950: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
5960: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 74 61  /* The parent ta
5990: 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ble */.  Index *
59a0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
59b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
59c0: 78 20 6f 6e 20 70 61 72 65 6e 74 20 63 6f 76 65  x on parent cove
59d0: 72 69 6e 67 20 74 68 65 20 66 6f 72 65 69 67 6e  ring the foreign
59e0: 20 6b 65 79 20 2a 2f 0a 20 20 46 4b 65 79 20 2a   key */.  FKey *
59f0: 70 46 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  pFKey,          
5a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5a10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6c 69 6e   foreign key lin
5a20: 6b 69 6e 67 20 70 53 72 63 20 74 6f 20 70 54 61  king pSrc to pTa
5a30: 62 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 43 6f  b */.  int *aiCo
5a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5a50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
5a60: 6f 6d 20 70 49 64 78 20 63 6f 6c 73 20 74 6f 20  om pIdx cols to 
5a70: 63 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6c 73  child table cols
5a80: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
5a90: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
5aa0: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
5ab0: 72 6f 77 20 64 61 74 61 20 73 74 61 72 74 73 20  row data starts 
5ac0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  here */.  int nI
5ad0: 6e 63 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ncr             
5ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
5af0: 75 6e 74 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  unt to increment
5b00: 20 64 65 66 65 72 72 65 64 20 63 6f 75 6e 74 65   deferred counte
5b10: 72 20 62 79 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  r by */.){.  sql
5b20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5b30: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
5b40: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
5b50: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
5b80: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 45   variable */.  E
5b90: 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 30 3b  xpr *pWhere = 0;
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5bb0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5bc0: 6f 20 73 63 61 6e 20 77 69 74 68 20 2a 2f 0a 20  o scan with */. 
5bd0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 61   NameContext sNa
5be0: 6d 65 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  meContext;      
5bf0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 75 73 65 64   /* Context used
5c00: 20 74 6f 20 72 65 73 6f 6c 76 65 20 57 48 45 52   to resolve WHER
5c10: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
5c20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c40: 20 43 6f 6e 74 65 78 74 20 75 73 65 64 20 62 79   Context used by
5c50: 20 73 71 6c 69 74 65 33 57 68 65 72 65 58 58 58   sqlite3WhereXXX
5c60: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 46 6b 49  () */.  int iFkI
5c70: 66 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  fZero = 0;      
5c80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5c90: 73 73 20 6f 66 20 4f 50 5f 46 6b 49 66 5a 65 72  ss of OP_FkIfZer
5ca0: 6f 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  o */.  Vdbe *v =
5cb0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5cc0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65  pParse);..  asse
5cd0: 72 74 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70  rt( pIdx==0 || p
5ce0: 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
5cf0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
5d00: 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e  Idx==0 || pIdx->
5d10: 6e 4b 65 79 43 6f 6c 3d 3d 70 46 4b 65 79 2d 3e  nKeyCol==pFKey->
5d20: 6e 43 6f 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  nCol );.  assert
5d30: 28 20 70 49 64 78 21 3d 30 20 7c 7c 20 70 46 4b  ( pIdx!=0 || pFK
5d40: 65 79 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20  ey->nCol==1 );. 
5d50: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
5d60: 20 7c 7c 20 48 61 73 52 6f 77 69 64 28 70 54 61   || HasRowid(pTa
5d70: 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 49 6e  b) );..  if( nIn
5d80: 63 72 3c 30 20 29 7b 0a 20 20 20 20 69 46 6b 49  cr<0 ){.    iFkI
5d90: 66 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 56  fZero = sqlite3V
5da0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5db0: 46 6b 49 66 5a 65 72 6f 2c 20 70 46 4b 65 79 2d  FkIfZero, pFKey-
5dc0: 3e 69 73 44 65 66 65 72 72 65 64 2c 20 30 29 3b  >isDeferred, 0);
5dd0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
5de0: 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
5df0: 43 72 65 61 74 65 20 61 6e 20 45 78 70 72 20 6f  Create an Expr o
5e00: 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
5e10: 6e 67 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  ng an SQL expres
5e20: 73 69 6f 6e 20 6c 69 6b 65 3a 0a 20 20 2a 2a 0a  sion like:.  **.
5e30: 20 20 2a 2a 20 20 20 3c 70 61 72 65 6e 74 2d 6b    **   <parent-k
5e40: 65 79 31 3e 20 3d 20 3c 63 68 69 6c 64 2d 6b 65  ey1> = <child-ke
5e50: 79 31 3e 20 41 4e 44 20 3c 70 61 72 65 6e 74 2d  y1> AND <parent-
5e60: 6b 65 79 32 3e 20 3d 20 3c 63 68 69 6c 64 2d 6b  key2> = <child-k
5e70: 65 79 32 3e 20 2e 2e 2e 0a 20 20 2a 2a 0a 20 20  ey2> ....  **.  
5e80: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
5e90: 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 66   sequence used f
5ea0: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
5eb0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 68 61 74  n should be that
5ec0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 70 61 72   of.  ** the par
5ed0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ent key columns.
5ee0: 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   The affinity of
5ef0: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
5f00: 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 0a 20 20  column should.  
5f10: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
5f20: 20 65 61 63 68 20 63 68 69 6c 64 20 6b 65 79 20   each child key 
5f30: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65  value before the
5f40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61 6b 65   comparison take
5f50: 73 20 70 6c 61 63 65 2e 0a 20 20 2a 2f 0a 20 20  s place..  */.  
5f60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46 4b 65 79  for(i=0; i<pFKey
5f70: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
5f80: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 2f 2a 20 56 61 6c 75 65 20 66 72 6f 6d 20 70 61  /* Value from pa
5fb0: 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a  rent table row *
5fc0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  /.    Expr *pRig
5fd0: 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
5fe0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65      /* Column re
5ff0: 66 20 74 6f 20 63 68 69 6c 64 20 74 61 62 6c 65  f to child table
6000: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
6010: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
6020: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6030: 69 6f 6e 20 28 70 4c 65 66 74 20 3d 20 70 52 69  ion (pLeft = pRi
6040: 67 68 74 29 20 2a 2f 0a 20 20 20 20 69 31 36 20  ght) */.    i16 
6050: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
6060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
6070: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
6080: 63 68 69 6c 64 20 74 61 62 6c 65 20 2a 2f 20 0a  child table */ .
6090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
60a0: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
60b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
60c0: 75 6d 6e 20 69 6e 20 63 68 69 6c 64 20 74 61 62  umn in child tab
60d0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 43 6f 6c 20  le */..    iCol 
60e0: 3d 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 61  = pIdx ? pIdx->a
60f0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3a 20 2d 31 3b  iColumn[i] : -1;
6100: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 65 78 70  .    pLeft = exp
6110: 72 54 61 62 6c 65 52 65 67 69 73 74 65 72 28 70  rTableRegister(p
6120: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 72 65 67  Parse, pTab, reg
6130: 44 61 74 61 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Data, iCol);.   
6140: 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c 20 3f 20   iCol = aiCol ? 
6150: 61 69 43 6f 6c 5b 69 5d 20 3a 20 70 46 4b 65 79  aiCol[i] : pFKey
6160: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b  ->aCol[0].iFrom;
6170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
6180: 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  l>=0 );.    zCol
6190: 20 3d 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 2d   = pFKey->pFrom-
61a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
61b0: 65 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  e;.    pRight = 
61c0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
61d0: 54 4b 5f 49 44 2c 20 7a 43 6f 6c 29 3b 0a 20 20  TK_ID, zCol);.  
61e0: 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50    pEq = sqlite3P
61f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
6200: 45 51 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  EQ, pLeft, pRigh
6210: 74 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  t);.    pWhere =
6220: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
6230: 64 62 2c 20 70 57 68 65 72 65 2c 20 70 45 71 29  db, pWhere, pEq)
6240: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6250: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69  he child table i
6260: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
6270: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20  e parent table, 
6280: 74 68 65 6e 20 61 64 64 20 74 65 72 6d 73 0a 20  then add terms. 
6290: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
62a0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 72 65   clause that pre
62b0: 76 65 6e 74 20 74 68 69 73 20 65 6e 74 72 79 20  vent this entry 
62c0: 66 72 6f 6d 20 62 65 69 6e 67 20 73 63 61 6e 6e  from being scann
62d0: 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 61 64 64  ed..  ** The add
62e0: 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
62f0: 74 65 72 6d 73 20 61 72 65 20 6c 69 6b 65 20 74  terms are like t
6300: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
6310: 20 20 20 24 63 75 72 72 65 6e 74 5f 72 6f 77 69     $current_rowi
6320: 64 21 3d 72 6f 77 69 64 0a 20 20 2a 2a 20 20 20  d!=rowid.  **   
6330: 20 20 4e 4f 54 28 20 24 63 75 72 72 65 6e 74 5f    NOT( $current_
6340: 61 3d 3d 61 20 41 4e 44 20 24 63 75 72 72 65 6e  a==a AND $curren
6350: 74 5f 62 3d 3d 62 20 41 4e 44 20 2e 2e 2e 20 29  t_b==b AND ... )
6360: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
6370: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65  irst form is use
6380: 64 20 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c  d for rowid tabl
6390: 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  es.  The second 
63a0: 66 6f 72 6d 20 69 73 20 75 73 65 64 0a 20 20 2a  form is used.  *
63b0: 2a 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  * for WITHOUT RO
63c0: 57 49 44 20 74 61 62 6c 65 73 2e 20 49 6e 20 74  WID tables. In t
63d0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 2c 20  he second form, 
63e0: 74 68 65 20 2a 70 61 72 65 6e 74 2a 20 6b 65 79  the *parent* key
63f0: 20 69 73 0a 20 20 2a 2a 20 28 61 2c 62 2c 2e 2e   is.  ** (a,b,..
6400: 2e 29 2e 20 45 69 74 68 65 72 20 74 68 65 20 70  .). Either the p
6410: 61 72 65 6e 74 20 6f 72 20 70 72 69 6d 61 72 79  arent or primary
6420: 20 6b 65 79 20 63 6f 75 6c 64 20 62 65 20 75 73   key could be us
6430: 65 64 20 74 6f 20 0a 20 20 2a 2a 20 75 6e 69 71  ed to .  ** uniq
6440: 75 65 6c 79 20 69 64 65 6e 74 69 66 79 20 74 68  uely identify th
6450: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 62  e current row, b
6460: 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  ut the parent ke
6470: 79 20 69 73 20 6d 6f 72 65 20 63 6f 6e 76 65 6e  y is more conven
6480: 69 65 6e 74 0a 20 20 2a 2a 20 61 73 20 74 68 65  ient.  ** as the
6490: 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 73   required values
64a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
64b0: 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 72  en loaded into r
64c0: 65 67 69 73 74 65 72 73 0a 20 20 2a 2a 20 62 79  egisters.  ** by
64d0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
64e0: 2f 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 46  /.  if( pTab==pF
64f0: 4b 65 79 2d 3e 70 46 72 6f 6d 20 26 26 20 6e 49  Key->pFrom && nI
6500: 6e 63 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ncr>0 ){.    Exp
6510: 72 20 2a 70 4e 65 3b 20 20 20 20 20 20 20 20 20  r *pNe;         
6520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6530: 70 72 65 73 73 69 6f 6e 20 28 70 4c 65 66 74 20  pression (pLeft 
6540: 21 3d 20 70 52 69 67 68 74 29 20 2a 2f 0a 20 20  != pRight) */.  
6550: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 2f 2a 20 56 61 6c 75 65 20 66 72 6f 6d 20 70 61  /* Value from pa
6580: 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a  rent table row *
6590: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  /.    Expr *pRig
65a0: 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
65b0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65      /* Column re
65c0: 66 20 74 6f 20 63 68 69 6c 64 20 74 61 62 6c 65  f to child table
65d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 48 61 73 52   */.    if( HasR
65e0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
65f0: 20 20 20 20 70 4c 65 66 74 20 3d 20 65 78 70 72      pLeft = expr
6600: 54 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50  TableRegister(pP
6610: 61 72 73 65 2c 20 70 54 61 62 2c 20 72 65 67 44  arse, pTab, regD
6620: 61 74 61 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ata, -1);.      
6630: 70 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  pRight = exprTab
6640: 6c 65 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 54 61  leColumn(db, pTa
6650: 62 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  b, pSrc->a[0].iC
6660: 75 72 73 6f 72 2c 20 2d 31 29 3b 0a 20 20 20 20  ursor, -1);.    
6670: 20 20 70 4e 65 20 3d 20 73 71 6c 69 74 65 33 50    pNe = sqlite3P
6680: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
6690: 4e 45 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  NE, pLeft, pRigh
66a0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
66b0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 71 2c 20       Expr *pEq, 
66c0: 2a 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pAll = 0;.     
66d0: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
66e0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
66f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
6700: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6710: 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64    i16 iCol = pId
6720: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
6730: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6740: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20  iCol>=0 );.     
6750: 20 20 20 70 4c 65 66 74 20 3d 20 65 78 70 72 54     pLeft = exprT
6760: 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61  ableRegister(pPa
6770: 72 73 65 2c 20 70 54 61 62 2c 20 72 65 67 44 61  rse, pTab, regDa
6780: 74 61 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ta, iCol);.     
6790: 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
67a0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
67b0: 44 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  D, pTab->aCol[iC
67c0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
67d0: 20 20 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65      pEq = sqlite
67e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
67f0: 4b 5f 49 53 2c 20 70 4c 65 66 74 2c 20 70 52 69  K_IS, pLeft, pRi
6800: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 41  ght);.        pA
6810: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6820: 41 6e 64 28 64 62 2c 20 70 41 6c 6c 2c 20 70 45  And(db, pAll, pE
6830: 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  q);.      }.    
6840: 20 20 70 4e 65 20 3d 20 73 71 6c 69 74 65 33 50    pNe = sqlite3P
6850: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
6860: 4e 4f 54 2c 20 70 41 6c 6c 2c 20 30 29 3b 0a 20  NOT, pAll, 0);. 
6870: 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
6880: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
6890: 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65  (db, pWhere, pNe
68a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
68b0: 6f 6c 76 65 20 74 68 65 20 72 65 66 65 72 65 6e  olve the referen
68c0: 63 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ces in the WHERE
68d0: 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 6d 65   clause. */.  me
68e0: 6d 73 65 74 28 26 73 4e 61 6d 65 43 6f 6e 74 65  mset(&sNameConte
68f0: 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4e 61  xt, 0, sizeof(Na
6900: 6d 65 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 73  meContext));.  s
6910: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
6920: 4c 69 73 74 20 3d 20 70 53 72 63 3b 0a 20 20 73  List = pSrc;.  s
6930: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 50 61 72  NameContext.pPar
6940: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
6950: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
6960: 72 4e 61 6d 65 73 28 26 73 4e 61 6d 65 43 6f 6e  rNames(&sNameCon
6970: 74 65 78 74 2c 20 70 57 68 65 72 65 29 3b 0a 0a  text, pWhere);..
6980: 20 20 2f 2a 20 43 72 65 61 74 65 20 56 44 42 45    /* Create VDBE
6990: 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68   to loop through
69a0: 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
69b0: 70 53 72 63 20 74 68 61 74 20 6d 61 74 63 68 20  pSrc that match 
69c0: 74 68 65 20 57 48 45 52 45 0a 20 20 2a 2a 20 63  the WHERE.  ** c
69d0: 6c 61 75 73 65 2e 20 46 6f 72 20 65 61 63 68 20  lause. For each 
69e0: 72 6f 77 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65  row found, incre
69f0: 6d 65 6e 74 20 65 69 74 68 65 72 20 74 68 65 20  ment either the 
6a00: 64 65 66 65 72 72 65 64 20 6f 72 20 69 6d 6d 65  deferred or imme
6a10: 64 69 61 74 65 0a 20 20 2a 2a 20 66 6f 72 65 69  diate.  ** forei
6a20: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
6a30: 74 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20  t counter. */.  
6a40: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
6a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  ==0 ){.    pWInf
6a60: 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
6a70: 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 53  Begin(pParse, pS
6a80: 72 63 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  rc, pWhere, 0, 0
6a90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6aa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6ab0: 2c 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 2c 20  , OP_FkCounter, 
6ac0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
6ad0: 64 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69  d, nIncr);.    i
6ae0: 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
6af0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
6b00: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
6b10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
6b20: 6e 20 75 70 20 74 68 65 20 57 48 45 52 45 20 63  n up the WHERE c
6b30: 6c 61 75 73 65 20 63 6f 6e 73 74 72 75 63 74 65  lause constructe
6b40: 64 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 73 71  d above. */.  sq
6b50: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6b60: 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 69  db, pWhere);.  i
6b70: 66 28 20 69 46 6b 49 66 5a 65 72 6f 20 29 7b 0a  f( iFkIfZero ){.
6b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
6b90: 75 6d 70 48 65 72 65 28 76 2c 20 69 46 6b 49 66  umpHere(v, iFkIf
6ba0: 5a 65 72 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Zero);.  }.}../*
6bb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6bc0: 6e 20 72 65 74 75 72 6e 73 20 61 20 6c 69 6e 6b  n returns a link
6bd0: 65 64 20 6c 69 73 74 20 6f 66 20 46 4b 65 79 20  ed list of FKey 
6be0: 6f 62 6a 65 63 74 73 20 28 63 6f 6e 6e 65 63 74  objects (connect
6bf0: 65 64 20 62 79 0a 2a 2a 20 46 4b 65 79 2e 70 4e  ed by.** FKey.pN
6c00: 65 78 74 54 6f 29 20 68 6f 6c 64 69 6e 67 20 61  extTo) holding a
6c10: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  ll children of t
6c20: 61 62 6c 65 20 70 54 61 62 2e 20 20 46 6f 72 20  able pTab.  For 
6c30: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 67 69 76 65  example,.** give
6c40: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
6c50: 73 63 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  schema:.**.**   
6c60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6c70: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  a PRIMARY KEY);.
6c80: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
6c90: 45 20 74 32 28 62 20 52 45 46 45 52 45 4e 43 45  E t2(b REFERENCE
6ca0: 53 20 74 31 28 61 29 3b 0a 2a 2a 0a 2a 2a 20 43  S t1(a);.**.** C
6cb0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
6cc0: 74 69 6f 6e 20 77 69 74 68 20 74 61 62 6c 65 20  tion with table 
6cd0: 22 74 31 22 20 61 73 20 61 6e 20 61 72 67 75 6d  "t1" as an argum
6ce0: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ent returns a po
6cf0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
6d00: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 72  FKey structure r
6d10: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
6d20: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
6d30: 74 72 61 69 6e 74 20 6f 6e 20 74 61 62 6c 65 0a  traint on table.
6d40: 2a 2a 20 22 74 32 22 2e 20 43 61 6c 6c 69 6e 67  ** "t2". Calling
6d50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
6d60: 69 74 68 20 22 74 32 22 20 61 73 20 74 68 65 20  ith "t2" as the 
6d70: 61 72 67 75 6d 65 6e 74 20 77 6f 75 6c 64 20 72  argument would r
6d80: 65 74 75 72 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20  eturn a.** NULL 
6d90: 70 6f 69 6e 74 65 72 20 28 61 73 20 74 68 65 72  pointer (as ther
6da0: 65 20 61 72 65 20 6e 6f 20 46 4b 20 63 6f 6e 73  e are no FK cons
6db0: 74 72 61 69 6e 74 73 20 66 6f 72 20 77 68 69 63  traints for whic
6dc0: 68 20 74 32 20 69 73 20 74 68 65 20 70 61 72 65  h t2 is the pare
6dd0: 6e 74 0a 2a 2a 20 74 61 62 6c 65 29 2e 0a 2a 2f  nt.** table)..*/
6de0: 0a 46 4b 65 79 20 2a 73 71 6c 69 74 65 33 46 6b  .FKey *sqlite3Fk
6df0: 52 65 66 65 72 65 6e 63 65 73 28 54 61 62 6c 65  References(Table
6e00: 20 2a 70 54 61 62 29 7b 0a 20 20 72 65 74 75 72   *pTab){.  retur
6e10: 6e 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  n (FKey *)sqlite
6e20: 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 2d  3HashFind(&pTab-
6e30: 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
6e40: 73 68 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  sh, pTab->zName)
6e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
6e60: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6e70: 73 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75  s a Trigger stru
6e80: 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
6e90: 62 79 20 74 68 65 20 0a 2a 2a 20 66 6b 41 63 74  by the .** fkAct
6ea0: 69 6f 6e 54 72 69 67 67 65 72 28 29 20 72 6f 75  ionTrigger() rou
6eb0: 74 69 6e 65 2e 20 54 68 69 73 20 66 75 6e 63 74  tine. This funct
6ec0: 69 6f 6e 20 64 65 6c 65 74 65 73 20 74 68 65 20  ion deletes the 
6ed0: 54 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72  Trigger structur
6ee0: 65 0a 2a 2a 20 61 6e 64 20 61 6c 6c 20 6f 66 20  e.** and all of 
6ef0: 69 74 73 20 73 75 62 2d 63 6f 6d 70 6f 6e 65 6e  its sub-componen
6f00: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 72  ts..**.** The Tr
6f10: 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65 20  igger structure 
6f20: 6f 72 20 61 6e 79 20 6f 66 20 69 74 73 20 73 75  or any of its su
6f30: 62 2d 63 6f 6d 70 6f 6e 65 6e 74 73 20 6d 61 79  b-components may
6f40: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72   be allocated fr
6f50: 6f 6d 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73  om.** the lookas
6f60: 69 64 65 20 62 75 66 66 65 72 20 62 65 6c 6f 6e  ide buffer belon
6f70: 67 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ging to database
6f80: 20 68 61 6e 64 6c 65 20 64 62 4d 65 6d 2e 0a 2a   handle dbMem..*
6f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6b  /.static void fk
6fa0: 54 72 69 67 67 65 72 44 65 6c 65 74 65 28 73 71  TriggerDelete(sq
6fb0: 6c 69 74 65 33 20 2a 64 62 4d 65 6d 2c 20 54 72  lite3 *dbMem, Tr
6fc0: 69 67 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28  igger *p){.  if(
6fd0: 20 70 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   p ){.    Trigge
6fe0: 72 53 74 65 70 20 2a 70 53 74 65 70 20 3d 20 70  rStep *pStep = p
6ff0: 2d 3e 73 74 65 70 5f 6c 69 73 74 3b 0a 20 20 20  ->step_list;.   
7000: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7010: 74 65 28 64 62 4d 65 6d 2c 20 70 53 74 65 70 2d  te(dbMem, pStep-
7020: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
7030: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7040: 65 74 65 28 64 62 4d 65 6d 2c 20 70 53 74 65 70  ete(dbMem, pStep
7050: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
7060: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
7070: 65 6c 65 74 65 28 64 62 4d 65 6d 2c 20 70 53 74  elete(dbMem, pSt
7080: 65 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ep->pSelect);.  
7090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
70a0: 65 74 65 28 64 62 4d 65 6d 2c 20 70 2d 3e 70 57  ete(dbMem, p->pW
70b0: 68 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hen);.    sqlite
70c0: 33 44 62 46 72 65 65 28 64 62 4d 65 6d 2c 20 70  3DbFree(dbMem, p
70d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
70e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
70f0: 20 63 61 6c 6c 65 64 20 74 6f 20 67 65 6e 65 72   called to gener
7100: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
7110: 6e 73 20 77 68 65 6e 20 74 61 62 6c 65 20 70 54  ns when table pT
7120: 61 62 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 64  ab is.** being d
7130: 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
7140: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 53 72  database. The Sr
7150: 63 4c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  cList passed as 
7160: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7170: 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  ent.** to this f
7180: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
7190: 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   a single entry 
71a0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 72 65  guaranteed to re
71b0: 73 6f 6c 76 65 20 74 6f 0a 2a 2a 20 74 61 62 6c  solve to.** tabl
71c0: 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  e pTab..**.** No
71d0: 72 6d 61 6c 6c 79 2c 20 6e 6f 20 63 6f 64 65 20  rmally, no code 
71e0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 48 6f 77  is required. How
71f0: 65 76 65 72 2c 20 69 66 20 65 69 74 68 65 72 0a  ever, if either.
7200: 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20  **.**   (a) The 
7210: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 61 72  table is the par
7220: 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 61 20 46  ent table of a F
7230: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  K constraint, or
7240: 0a 2a 2a 20 20 20 28 62 29 20 54 68 65 20 74 61  .**   (b) The ta
7250: 62 6c 65 20 69 73 20 74 68 65 20 63 68 69 6c 64  ble is the child
7260: 20 74 61 62 6c 65 20 6f 66 20 61 20 64 65 66 65   table of a defe
7270: 72 72 65 64 20 46 4b 20 63 6f 6e 73 74 72 61 69  rred FK constrai
7280: 6e 74 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  nt and it is.** 
7290: 20 20 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64        determined
72a0: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 68 61 74   at runtime that
72b0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
72c0: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
72d0: 46 4b 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 6e  FK .**       con
72e0: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
72f0: 6e 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ns in the databa
7300: 73 65 2c 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  se,.**.** then t
7310: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
7320: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 3c 74   "DELETE FROM <t
7330: 62 6c 3e 22 20 69 73 20 65 78 65 63 75 74 65 64  bl>" is executed
7340: 20 62 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67   before dropping
7350: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 66 72  .** the table fr
7360: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
7370: 20 54 72 69 67 67 65 72 73 20 61 72 65 20 64 69   Triggers are di
7380: 73 61 62 6c 65 64 20 77 68 69 6c 65 20 72 75 6e  sabled while run
7390: 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20 44 45 4c  ning this.** DEL
73a0: 45 54 45 2c 20 62 75 74 20 66 6f 72 65 69 67 6e  ETE, but foreign
73b0: 20 6b 65 79 20 61 63 74 69 6f 6e 73 20 61 72 65   key actions are
73c0: 20 6e 6f 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   not..*/.void sq
73d0: 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
73e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
73f0: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
7400: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
7410: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7420: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
7430: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
7440: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 20 26  E_ForeignKeys) &
7450: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
7460: 62 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  b) ){.    int iS
7470: 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 56 64 62  kip = 0;.    Vdb
7480: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
7490: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
74a0: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 2f 2a 20 56 44 42 45 20 68 61 73 20 61 6c    /* VDBE has al
74d0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
74e0: 61 74 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ated */.    asse
74f0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
7500: 74 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 6f 74  t==0 );   /* Not
7510: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 69   a view */.    i
7520: 66 28 20 73 71 6c 69 74 65 33 46 6b 52 65 66 65  f( sqlite3FkRefe
7530: 72 65 6e 63 65 73 28 70 54 61 62 29 3d 3d 30 20  rences(pTab)==0 
7540: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72  ){.      /* Sear
7550: 63 68 20 66 6f 72 20 61 20 64 65 66 65 72 72 65  ch for a deferre
7560: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
7570: 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 77 68 69  nstraint for whi
7580: 63 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  ch this table.  
7590: 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 68      ** is the ch
75a0: 69 6c 64 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ild table. If on
75b0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
75c0: 64 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  d, return withou
75d0: 74 20 0a 20 20 20 20 20 20 2a 2a 20 67 65 6e 65  t .      ** gene
75e0: 72 61 74 69 6e 67 20 61 6e 79 20 56 44 42 45 20  rating any VDBE 
75f0: 63 6f 64 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  code. If one can
7600: 20 62 65 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   be found, then 
7610: 6a 75 6d 70 20 6f 76 65 72 0a 20 20 20 20 20 20  jump over.      
7620: 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 44 45  ** the entire DE
7630: 4c 45 54 45 20 69 66 20 74 68 65 72 65 20 61 72  LETE if there ar
7640: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
7650: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
7660: 61 69 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 77  aints.      ** w
7670: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
7680: 6e 74 20 69 73 20 72 75 6e 2e 20 20 2a 2f 0a 20  nt is run.  */. 
7690: 20 20 20 20 20 46 4b 65 79 20 2a 70 3b 0a 20 20       FKey *p;.  
76a0: 20 20 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e      for(p=pTab->
76b0: 70 46 4b 65 79 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFKey; p; p=p->p
76c0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
76d0: 20 20 20 69 66 28 20 70 2d 3e 69 73 44 65 66 65     if( p->isDefe
76e0: 72 72 65 64 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  rred || (db->fla
76f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65  gs & SQLITE_Defe
7700: 72 46 4b 73 29 20 29 20 62 72 65 61 6b 3b 0a 20  rFKs) ) break;. 
7710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7720: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
7730: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
7740: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7750: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7770: 32 28 76 2c 20 4f 50 5f 46 6b 49 66 5a 65 72 6f  2(v, OP_FkIfZero
7780: 2c 20 31 2c 20 69 53 6b 69 70 29 3b 20 56 64 62  , 1, iSkip); Vdb
7790: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
77a0: 20 20 7d 0a 0a 20 20 20 20 70 50 61 72 73 65 2d    }..    pParse-
77b0: 3e 64 69 73 61 62 6c 65 54 72 69 67 67 65 72 73  >disableTriggers
77c0: 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
77d0: 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72  3DeleteFrom(pPar
77e0: 73 65 2c 20 73 71 6c 69 74 65 33 53 72 63 4c 69  se, sqlite3SrcLi
77f0: 73 74 44 75 70 28 64 62 2c 20 70 4e 61 6d 65 2c  stDup(db, pName,
7800: 20 30 29 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20   0), 0, 0, 0);. 
7810: 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
7820: 6c 65 54 72 69 67 67 65 72 73 20 3d 20 30 3b 0a  leTriggers = 0;.
7830: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 44  .    /* If the D
7840: 45 4c 45 54 45 20 68 61 73 20 67 65 6e 65 72 61  ELETE has genera
7850: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  ted immediate fo
7860: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7870: 61 69 6e 74 20 0a 20 20 20 20 2a 2a 20 76 69 6f  aint .    ** vio
7880: 6c 61 74 69 6f 6e 73 2c 20 68 61 6c 74 20 74 68  lations, halt th
7890: 65 20 56 44 42 45 20 61 6e 64 20 72 65 74 75 72  e VDBE and retur
78a0: 6e 20 61 6e 20 65 72 72 6f 72 20 61 74 20 74 68  n an error at th
78b0: 69 73 20 70 6f 69 6e 74 2c 20 62 65 66 6f 72 65  is point, before
78c0: 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6d 6f 64 69  .    ** any modi
78d0: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  fications to the
78e0: 20 73 63 68 65 6d 61 20 61 72 65 20 6d 61 64 65   schema are made
78f0: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
7900: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  e statement.    
7910: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
7920: 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
7930: 72 6f 6c 6c 62 61 63 6b 20 73 63 68 65 6d 61 20  rollback schema 
7940: 63 68 61 6e 67 65 73 2e 20 20 0a 20 20 20 20 2a  changes.  .    *
7950: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
7960: 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20  SQLITE_DeferFKs 
7970: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
7980: 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  n this is not re
7990: 71 75 69 72 65 64 2c 20 61 73 0a 20 20 20 20 2a  quired, as.    *
79a0: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
79b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
79c0: 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62   not be rolled b
79d0: 61 63 6b 20 65 76 65 6e 20 69 66 20 46 4b 0a 20  ack even if FK. 
79e0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
79f0: 73 20 61 72 65 20 76 69 6f 6c 61 74 65 64 2e 0a  s are violated..
7a00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
7a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7a20: 54 45 5f 44 65 66 65 72 46 4b 73 29 3d 3d 30 20  TE_DeferFKs)==0 
7a30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7a40: 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
7a50: 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29  ble(v, OE_Abort)
7a60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7a70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a80: 46 6b 49 66 5a 65 72 6f 2c 20 30 2c 20 73 71 6c  FkIfZero, 0, sql
7a90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7aa0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
7ab0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7ac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  ;.      sqlite3H
7ad0: 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
7ae0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
7af0: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
7b00: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 45  EY,.          OE
7b10: 5f 41 62 6f 72 74 2c 20 30 2c 20 50 34 5f 53 54  _Abort, 0, P4_ST
7b20: 41 54 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61  ATIC, P5_Constra
7b30: 69 6e 74 46 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  intFK);.    }.. 
7b40: 20 20 20 69 66 28 20 69 53 6b 69 70 20 29 7b 0a     if( iSkip ){.
7b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7b60: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7b70: 20 69 53 6b 69 70 29 3b 0a 20 20 20 20 7d 0a 20   iSkip);.    }. 
7b80: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   }.}.../*.** The
7b90: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7ba0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 46 4b   points to an FK
7bb0: 65 79 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  ey object repres
7bc0: 65 6e 74 69 6e 67 20 61 20 66 6f 72 65 69 67 6e  enting a foreign
7bd0: 20 6b 65 79 0a 2a 2a 20 66 6f 72 20 77 68 69 63   key.** for whic
7be0: 68 20 70 54 61 62 20 69 73 20 74 68 65 20 63 68  h pTab is the ch
7bf0: 69 6c 64 20 74 61 62 6c 65 2e 20 41 6e 20 55 50  ild table. An UP
7c00: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61  DATE statement a
7c10: 67 61 69 6e 73 74 20 70 54 61 62 0a 2a 2a 20 69  gainst pTab.** i
7c20: 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
7c30: 67 20 70 72 6f 63 65 73 73 65 64 2e 20 46 6f 72  g processed. For
7c40: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
7c50: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
7c60: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 75  s .** actually u
7c70: 70 64 61 74 65 64 2c 20 74 68 65 20 63 6f 72 72  pdated, the corr
7c80: 65 73 70 6f 6e 64 69 6e 67 20 65 6c 65 6d 65 6e  esponding elemen
7c90: 74 20 69 6e 20 74 68 65 20 61 43 68 61 6e 67 65  t in the aChange
7ca0: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 69 73 20 7a  [] array.** is z
7cb0: 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 20 28  ero or greater (
7cc0: 69 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 75  if a column is u
7cd0: 6e 6d 6f 64 69 66 69 65 64 20 74 68 65 20 63 6f  nmodified the co
7ce0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6c 65 6d  rresponding elem
7cf0: 65 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ent.** is set to
7d00: 20 2d 31 29 2e 20 49 66 20 74 68 65 20 72 6f 77   -1). If the row
7d10: 69 64 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 64  id column is mod
7d20: 69 66 69 65 64 20 62 79 20 74 68 65 20 55 50 44  ified by the UPD
7d30: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ATE statement.**
7d40: 20 74 68 65 20 62 43 68 6e 67 52 6f 77 69 64 20   the bChngRowid 
7d50: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
7d60: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
7d70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7d80: 73 20 74 72 75 65 20 69 66 20 61 6e 79 20 6f 66  s true if any of
7d90: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61   the columns tha
7da0: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68  t are part of th
7db0: 65 0a 2a 2a 20 63 68 69 6c 64 20 6b 65 79 20 66  e.** child key f
7dc0: 6f 72 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  or FK constraint
7dd0: 20 2a 70 20 61 72 65 20 6d 6f 64 69 66 69 65 64   *p are modified
7de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7df0: 66 6b 43 68 69 6c 64 49 73 4d 6f 64 69 66 69 65  fkChildIsModifie
7e00: 64 28 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  d(.  Table *pTab
7e10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7e20: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
7e30: 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ing updated */. 
7e40: 20 46 4b 65 79 20 2a 70 2c 20 20 20 20 20 20 20   FKey *p,       
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79 20   /* Foreign key 
7e70: 66 6f 72 20 77 68 69 63 68 20 70 54 61 62 20 69  for which pTab i
7e80: 73 20 74 68 65 20 63 68 69 6c 64 20 2a 2f 0a 20  s the child */. 
7e90: 20 69 6e 74 20 2a 61 43 68 61 6e 67 65 2c 20 20   int *aChange,  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 2f 2a 20 41 72 72 61 79 20 69 6e 64 69 63 61   /* Array indica
7ec0: 74 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 63 6f  ting modified co
7ed0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  lumns */.  int b
7ee0: 43 68 6e 67 52 6f 77 69 64 20 20 20 20 20 20 20  ChngRowid       
7ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7f00: 75 65 20 69 66 20 72 6f 77 69 64 20 69 73 20 6d  ue if rowid is m
7f10: 6f 64 69 66 69 65 64 20 62 79 20 74 68 69 73 20  odified by this 
7f20: 75 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  update */.){.  i
7f30: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
7f40: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7f50: 7b 0a 20 20 20 20 69 6e 74 20 69 43 68 69 6c 64  {.    int iChild
7f60: 4b 65 79 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  Key = p->aCol[i]
7f70: 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 69 66 28 20  .iFrom;.    if( 
7f80: 61 43 68 61 6e 67 65 5b 69 43 68 69 6c 64 4b 65  aChange[iChildKe
7f90: 79 5d 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31  y]>=0 ) return 1
7fa0: 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
7fb0: 4b 65 79 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Key==pTab->iPKey
7fc0: 20 26 26 20 62 43 68 6e 67 52 6f 77 69 64 20 29   && bChngRowid )
7fd0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
7fe0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7ff0: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
8000: 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74  rgument points t
8010: 6f 20 61 6e 20 46 4b 65 79 20 6f 62 6a 65 63 74  o an FKey object
8020: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20   representing a 
8030: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20 66  foreign key.** f
8040: 6f 72 20 77 68 69 63 68 20 70 54 61 62 20 69 73  or which pTab is
8050: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
8060: 65 2e 20 41 6e 20 55 50 44 41 54 45 20 73 74 61  e. An UPDATE sta
8070: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 70  tement against p
8080: 54 61 62 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  Tab.** is curren
8090: 74 6c 79 20 62 65 69 6e 67 20 70 72 6f 63 65 73  tly being proces
80a0: 73 65 64 2e 20 46 6f 72 20 65 61 63 68 20 63 6f  sed. For each co
80b0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
80c0: 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 61 63  e that is .** ac
80d0: 74 75 61 6c 6c 79 20 75 70 64 61 74 65 64 2c 20  tually updated, 
80e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
80f0: 67 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65  g element in the
8100: 20 61 43 68 61 6e 67 65 5b 5d 20 61 72 72 61 79   aChange[] array
8110: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67  .** is zero or g
8120: 72 65 61 74 65 72 20 28 69 66 20 61 20 63 6f 6c  reater (if a col
8130: 75 6d 6e 20 69 73 20 75 6e 6d 6f 64 69 66 69 65  umn is unmodifie
8140: 64 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  d the correspond
8150: 69 6e 67 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ing element.** i
8160: 73 20 73 65 74 20 74 6f 20 2d 31 29 2e 20 49 66  s set to -1). If
8170: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
8180: 6e 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 79  n is modified by
8190: 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61 74   the UPDATE stat
81a0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 62 43 68  ement.** the bCh
81b0: 6e 67 52 6f 77 69 64 20 61 72 67 75 6d 65 6e 74  ngRowid argument
81c0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a   is non-zero..**
81d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
81e0: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
81f0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63 6f 6c  f any of the col
8200: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 70 61  umns that are pa
8210: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 72  rt of the.** par
8220: 65 6e 74 20 6b 65 79 20 66 6f 72 20 46 4b 20 63  ent key for FK c
8230: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20 61 72 65  onstraint *p are
8240: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74   modified..*/.st
8250: 61 74 69 63 20 69 6e 74 20 66 6b 50 61 72 65 6e  atic int fkParen
8260: 74 49 73 4d 6f 64 69 66 69 65 64 28 0a 20 20 54  tIsModified(.  T
8270: 61 62 6c 65 20 2a 70 54 61 62 2c 20 0a 20 20 46  able *pTab, .  F
8280: 4b 65 79 20 2a 70 2c 20 0a 20 20 69 6e 74 20 2a  Key *p, .  int *
8290: 61 43 68 61 6e 67 65 2c 20 0a 20 20 69 6e 74 20  aChange, .  int 
82a0: 62 43 68 6e 67 52 6f 77 69 64 0a 29 7b 0a 20 20  bChngRowid.){.  
82b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
82c0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
82d0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 65  ){.    char *zKe
82e0: 79 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  y = p->aCol[i].z
82f0: 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4b 65  Col;.    int iKe
8300: 79 3b 0a 20 20 20 20 66 6f 72 28 69 4b 65 79 3d  y;.    for(iKey=
8310: 30 3b 20 69 4b 65 79 3c 70 54 61 62 2d 3e 6e 43  0; iKey<pTab->nC
8320: 6f 6c 3b 20 69 4b 65 79 2b 2b 29 7b 0a 20 20 20  ol; iKey++){.   
8330: 20 20 20 69 66 28 20 61 43 68 61 6e 67 65 5b 69     if( aChange[i
8340: 4b 65 79 5d 3e 3d 30 20 7c 7c 20 28 69 4b 65 79  Key]>=0 || (iKey
8350: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 26 26  ==pTab->iPKey &&
8360: 20 62 43 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a   bChngRowid) ){.
8370: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
8380: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
8390: 6f 6c 5b 69 4b 65 79 5d 3b 0a 20 20 20 20 20 20  ol[iKey];.      
83a0: 20 20 69 66 28 20 7a 4b 65 79 20 29 7b 0a 20 20    if( zKey ){.  
83b0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
83c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
83d0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 4b 65 79 29  ol->zName, zKey)
83e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
83f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8400: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
8410: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 20  COLFLAG_PRIMKEY 
8420: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
8430: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
8440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8460: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8470: 72 75 65 20 69 66 20 74 68 65 20 70 61 72 73 65  rue if the parse
8480: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
8490: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
84a0: 73 20 62 65 69 6e 67 0a 2a 2a 20 75 73 65 64 20  s being.** used 
84b0: 74 6f 20 63 6f 64 65 20 61 20 74 72 69 67 67 65  to code a trigge
84c0: 72 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  r that is really
84d0: 20 61 20 22 53 45 54 20 4e 55 4c 4c 22 20 61 63   a "SET NULL" ac
84e0: 74 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 0a 2a  tion belonging.*
84f0: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 70 46 4b  * to trigger pFK
8500: 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ey..*/.static in
8510: 74 20 69 73 53 65 74 4e 75 6c 6c 41 63 74 69 6f  t isSetNullActio
8520: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8530: 20 46 4b 65 79 20 2a 70 46 4b 65 79 29 7b 0a 20   FKey *pFKey){. 
8540: 20 50 61 72 73 65 20 2a 70 54 6f 70 20 3d 20 73   Parse *pTop = s
8550: 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
8560: 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69  vel(pParse);.  i
8570: 66 28 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65  f( pTop->pTrigge
8580: 72 50 72 67 20 29 7b 0a 20 20 20 20 54 72 69 67  rPrg ){.    Trig
8590: 67 65 72 20 2a 70 20 3d 20 70 54 6f 70 2d 3e 70  ger *p = pTop->p
85a0: 54 72 69 67 67 65 72 50 72 67 2d 3e 70 54 72 69  TriggerPrg->pTri
85b0: 67 67 65 72 3b 0a 20 20 20 20 69 66 28 20 28 70  gger;.    if( (p
85c0: 3d 3d 70 46 4b 65 79 2d 3e 61 70 54 72 69 67 67  ==pFKey->apTrigg
85d0: 65 72 5b 30 5d 20 26 26 20 70 46 4b 65 79 2d 3e  er[0] && pFKey->
85e0: 61 41 63 74 69 6f 6e 5b 30 5d 3d 3d 4f 45 5f 53  aAction[0]==OE_S
85f0: 65 74 4e 75 6c 6c 29 0a 20 20 20 20 20 7c 7c 20  etNull).     || 
8600: 28 70 3d 3d 70 46 4b 65 79 2d 3e 61 70 54 72 69  (p==pFKey->apTri
8610: 67 67 65 72 5b 31 5d 20 26 26 20 70 46 4b 65 79  gger[1] && pFKey
8620: 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 3d 3d 4f 45  ->aAction[1]==OE
8630: 5f 53 65 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  _SetNull).    ){
8640: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8660: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
8680: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 73   called when ins
8690: 65 72 74 69 6e 67 2c 20 64 65 6c 65 74 69 6e 67  erting, deleting
86a0: 20 6f 72 20 75 70 64 61 74 69 6e 67 20 61 20 72   or updating a r
86b0: 6f 77 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 20 70  ow of.** table p
86c0: 54 61 62 20 74 6f 20 67 65 6e 65 72 61 74 65 20  Tab to generate 
86d0: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 70 65 72  VDBE code to per
86e0: 66 6f 72 6d 20 66 6f 72 65 69 67 6e 20 6b 65 79  form foreign key
86f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 0a 2a 2a 20   constraint .** 
8700: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
8710: 68 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  he operation..**
8720: 0a 2a 2a 20 46 6f 72 20 61 20 44 45 4c 45 54 45  .** For a DELETE
8730: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 61 72 61   operation, para
8740: 6d 65 74 65 72 20 72 65 67 4f 6c 64 20 69 73 20  meter regOld is 
8750: 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78  passed the index
8760: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
8770: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20   register in an 
8780: 61 72 72 61 79 20 6f 66 20 28 70 54 61 62 2d 3e  array of (pTab->
8790: 6e 43 6f 6c 2b 31 29 20 72 65 67 69 73 74 65 72  nCol+1) register
87a0: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
87b0: 0a 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65  .** rowid of the
87c0: 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
87d0: 65 64 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ed, followed by 
87e0: 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6c 75  each of the colu
87f0: 6d 6e 20 76 61 6c 75 65 73 0a 2a 2a 20 6f 66 20  mn values.** of 
8800: 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  the row being de
8810: 6c 65 74 65 64 2c 20 66 72 6f 6d 20 6c 65 66 74  leted, from left
8820: 20 74 6f 20 72 69 67 68 74 2e 20 50 61 72 61 6d   to right. Param
8830: 65 74 65 72 20 72 65 67 4e 65 77 20 69 73 20 70  eter regNew is p
8840: 61 73 73 65 64 0a 2a 2a 20 7a 65 72 6f 20 69 6e  assed.** zero in
8850: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
8860: 2a 20 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  * For an INSERT 
8870: 6f 70 65 72 61 74 69 6f 6e 2c 20 72 65 67 4f 6c  operation, regOl
8880: 64 20 69 73 20 70 61 73 73 65 64 20 7a 65 72 6f  d is passed zero
8890: 20 61 6e 64 20 72 65 67 4e 65 77 20 69 73 20 70   and regNew is p
88a0: 61 73 73 65 64 20 74 68 65 0a 2a 2a 20 66 69 72  assed the.** fir
88b0: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 61  st register of a
88c0: 6e 20 61 72 72 61 79 20 6f 66 20 28 70 54 61 62  n array of (pTab
88d0: 2d 3e 6e 43 6f 6c 2b 31 29 20 72 65 67 69 73 74  ->nCol+1) regist
88e0: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
88f0: 68 65 20 6e 65 77 0a 2a 2a 20 72 6f 77 20 64 61  he new.** row da
8900: 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  ta..**.** For an
8910: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
8920: 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
8930: 20 69 73 20 63 61 6c 6c 65 64 20 74 77 69 63 65   is called twice
8940: 2e 20 4f 6e 63 65 20 62 65 66 6f 72 65 0a 2a 2a  . Once before.**
8950: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
8960: 63 6f 72 64 20 69 73 20 64 65 6c 65 74 65 64 20  cord is deleted 
8970: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 75  from the table u
8980: 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 69 6e 67  sing the calling
8990: 20 63 6f 6e 76 65 6e 74 69 6f 6e 0a 2a 2a 20 64   convention.** d
89a0: 65 73 63 72 69 62 65 64 20 66 6f 72 20 44 45 4c  escribed for DEL
89b0: 45 54 45 2e 20 54 68 65 6e 20 61 67 61 69 6e 20  ETE. Then again 
89c0: 61 66 74 65 72 20 74 68 65 20 6f 72 69 67 69 6e  after the origin
89d0: 61 6c 20 72 65 63 6f 72 64 20 69 73 20 64 65 6c  al record is del
89e0: 65 74 65 64 0a 2a 2a 20 62 75 74 20 62 65 66 6f  eted.** but befo
89f0: 72 65 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  re the new recor
8a00: 64 20 69 73 20 69 6e 73 65 72 74 65 64 20 75 73  d is inserted us
8a10: 69 6e 67 20 74 68 65 20 49 4e 53 45 52 54 20 63  ing the INSERT c
8a20: 6f 6e 76 65 6e 74 69 6f 6e 2e 20 0a 2a 2f 0a 76  onvention. .*/.v
8a30: 6f 69 64 20 73 71 6c 69 74 65 33 46 6b 43 68 65  oid sqlite3FkChe
8a40: 63 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ck(.  Parse *pPa
8a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
8a60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
8a70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
8a80: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8aa0: 6f 77 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  ow is being dele
8ab0: 74 65 64 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ted from this ta
8ac0: 62 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 72 65  ble */ .  int re
8ad0: 67 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  gOld,           
8ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
8af0: 76 69 6f 75 73 20 72 6f 77 20 64 61 74 61 20 69  vious row data i
8b00: 73 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  s stored here */
8b10: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 2c 20 20  .  int regNew,  
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 2f 2a 20 4e 65 77 20 72 6f 77 20 64 61     /* New row da
8b40: 74 61 20 69 73 20 73 74 6f 72 65 64 20 68 65 72  ta is stored her
8b50: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 68 61  e */.  int *aCha
8b60: 6e 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  nge,            
8b70: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8b80: 69 6e 64 69 63 61 74 69 6e 67 20 55 50 44 41 54  indicating UPDAT
8b90: 45 64 20 63 6f 6c 75 6d 6e 73 20 28 6f 72 20 30  Ed columns (or 0
8ba0: 29 20 2a 2f 0a 20 20 69 6e 74 20 62 43 68 6e 67  ) */.  int bChng
8bb0: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
8bc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
8bd0: 66 20 72 6f 77 69 64 20 69 73 20 55 50 44 41 54  f rowid is UPDAT
8be0: 45 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  Ed */.){.  sqlit
8bf0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8c00: 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
8c10: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
8c20: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20  .  FKey *pFKey; 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8c50: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 46 4b  erate through FK
8c60: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  s */.  int iDb; 
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8c90: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
8ca0: 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20  aining pTab */. 
8cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
8cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8cd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
8ce0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
8cf0: 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 73  pTab */.  int is
8d00: 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 3d 20 70  IgnoreErrors = p
8d10: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54 72  Parse->disableTr
8d20: 69 67 67 65 72 73 3b 0a 0a 20 20 2f 2a 20 45 78  iggers;..  /* Ex
8d30: 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 72 65 67  actly one of reg
8d40: 4f 6c 64 20 61 6e 64 20 72 65 67 4e 65 77 20 73  Old and regNew s
8d50: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
8d60: 6f 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  o. */.  assert( 
8d70: 28 72 65 67 4f 6c 64 3d 3d 30 29 21 3d 28 72 65  (regOld==0)!=(re
8d80: 67 4e 65 77 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  gNew==0) );..  /
8d90: 2a 20 49 66 20 66 6f 72 65 69 67 6e 2d 6b 65 79  * If foreign-key
8da0: 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20  s are disabled, 
8db0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
8dc0: 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
8dd0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  f( (db->flags&SQ
8de0: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
8df0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )==0 ) return;..
8e00: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
8e10: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
8e20: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8e30: 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
8e40: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
8e50: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
8e60: 67 68 20 61 6c 6c 20 74 68 65 20 66 6f 72 65 69  gh all the forei
8e70: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
8e80: 74 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 61  ts for which pTa
8e90: 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 63 68  b is the.  ** ch
8ea0: 69 6c 64 20 74 61 62 6c 65 20 28 74 68 65 20 74  ild table (the t
8eb0: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
8ec0: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
8ed0: 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 29  tion is part of)
8ee0: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
8ef0: 79 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  y=pTab->pFKey; p
8f00: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
8f10: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
8f20: 20 20 20 54 61 62 6c 65 20 2a 70 54 6f 3b 20 20     Table *pTo;  
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65   /* Parent table
8f50: 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   of foreign key 
8f60: 70 46 4b 65 79 20 2a 2f 0a 20 20 20 20 49 6e 64  pFKey */.    Ind
8f70: 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 20 20 20  ex *pIdx = 0;   
8f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8f90: 64 65 78 20 6f 6e 20 6b 65 79 20 63 6f 6c 75 6d  dex on key colum
8fa0: 6e 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 20  ns in pTo */.   
8fb0: 20 69 6e 74 20 2a 61 69 46 72 65 65 20 3d 20 30   int *aiFree = 0
8fc0: 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ;.    int *aiCol
8fd0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
8fe0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
8ff0: 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b 0a  nt bIgnore = 0;.
9000: 0a 20 20 20 20 69 66 28 20 61 43 68 61 6e 67 65  .    if( aChange
9010: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
9020: 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d 3e  3_stricmp(pTab->
9030: 7a 4e 61 6d 65 2c 20 70 46 4b 65 79 2d 3e 7a 54  zName, pFKey->zT
9040: 6f 29 21 3d 30 0a 20 20 20 20 20 26 26 20 66 6b  o)!=0.     && fk
9050: 43 68 69 6c 64 49 73 4d 6f 64 69 66 69 65 64 28  ChildIsModified(
9060: 70 54 61 62 2c 20 70 46 4b 65 79 2c 20 61 43 68  pTab, pFKey, aCh
9070: 61 6e 67 65 2c 20 62 43 68 6e 67 52 6f 77 69 64  ange, bChngRowid
9080: 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
9090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
90a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
90b0: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
90c0: 20 6f 66 20 74 68 69 73 20 66 6f 72 65 69 67 6e   of this foreign
90d0: 20 6b 65 79 2e 20 41 6c 73 6f 20 66 69 6e 64 20   key. Also find 
90e0: 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 0a  a unique index .
90f0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
9100: 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  rent key columns
9110: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   in the parent t
9120: 61 62 6c 65 2e 20 49 66 20 65 69 74 68 65 72 20  able. If either 
9130: 6f 66 20 74 68 65 73 65 20 0a 20 20 20 20 2a 2a  of these .    **
9140: 20 73 63 68 65 6d 61 20 69 74 65 6d 73 20 63 61   schema items ca
9150: 6e 6e 6f 74 20 62 65 20 6c 6f 63 61 74 65 64 2c  nnot be located,
9160: 20 73 65 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   set an error in
9170: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
9180: 72 6e 20 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  rn .    ** early
9190: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  .  */.    if( pP
91a0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54 72 69  arse->disableTri
91b0: 67 67 65 72 73 20 29 7b 0a 20 20 20 20 20 20 70  ggers ){.      p
91c0: 54 6f 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  To = sqlite3Find
91d0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 65 79 2d  Table(db, pFKey-
91e0: 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20  >zTo, zDb);.    
91f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 6f  }else{.      pTo
9200: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
9210: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
9220: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 7a 44 62   pFKey->zTo, zDb
9230: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9240: 20 21 70 54 6f 20 7c 7c 20 73 71 6c 69 74 65 33   !pTo || sqlite3
9250: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
9260: 61 72 73 65 2c 20 70 54 6f 2c 20 70 46 4b 65 79  arse, pTo, pFKey
9270: 2c 20 26 70 49 64 78 2c 20 26 61 69 46 72 65 65  , &pIdx, &aiFree
9280: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
9290: 74 28 20 69 73 49 67 6e 6f 72 65 45 72 72 6f 72  t( isIgnoreError
92a0: 73 3d 3d 30 20 7c 7c 20 28 72 65 67 4f 6c 64 21  s==0 || (regOld!
92b0: 3d 30 20 26 26 20 72 65 67 4e 65 77 3d 3d 30 29  =0 && regNew==0)
92c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69   );.      if( !i
92d0: 73 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 7c 7c  sIgnoreErrors ||
92e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
92f0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
9300: 20 20 69 66 28 20 70 54 6f 3d 3d 30 20 29 7b 0a    if( pTo==0 ){.
9310: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
9320: 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 69 73 20  IgnoreErrors is 
9330: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 74 61 62  true, then a tab
9340: 6c 65 20 69 73 20 62 65 69 6e 67 20 64 72 6f 70  le is being drop
9350: 70 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  ped. In this.   
9360: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 53 51 4c       ** case SQL
9370: 69 74 65 20 72 75 6e 73 20 61 20 22 44 45 4c 45  ite runs a "DELE
9380: 54 45 20 46 52 4f 4d 20 78 78 78 22 20 6f 6e 20  TE FROM xxx" on 
9390: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
93a0: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 20 20  dropped.        
93b0: 2a 2a 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ** before actual
93c0: 6c 79 20 64 72 6f 70 70 69 6e 67 20 69 74 20 69  ly dropping it i
93d0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63 6b  n order to check
93e0: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e   FK constraints.
93f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74  .        ** If t
9400: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
9410: 6f 66 20 61 6e 20 46 4b 20 63 6f 6e 73 74 72 61  of an FK constra
9420: 69 6e 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  int on the curre
9430: 6e 74 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20  nt table is.    
9440: 20 20 20 20 2a 2a 20 6d 69 73 73 69 6e 67 2c 20      ** missing, 
9450: 62 65 68 61 76 65 20 61 73 20 69 66 20 69 74 20  behave as if it 
9460: 69 73 20 65 6d 70 74 79 2e 20 69 2e 65 2e 20 64  is empty. i.e. d
9470: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 6c  ecrement the rel
9480: 65 76 61 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  evant.        **
9490: 20 46 4b 20 63 6f 75 6e 74 65 72 20 66 6f 72 20   FK counter for 
94a0: 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
94b0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 77 69  current table wi
94c0: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 6b 65 79 73  th non-NULL keys
94d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
94e0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
94f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9500: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
9510: 6e 74 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74  nt iJump = sqlit
9520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
9530: 72 28 76 29 20 2b 20 70 46 4b 65 79 2d 3e 6e 43  r(v) + pFKey->nC
9540: 6f 6c 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  ol + 1;.        
9550: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46 4b 65 79  for(i=0; i<pFKey
9560: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
9570: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 65 67          int iReg
9580: 20 3d 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69   = pFKey->aCol[i
9590: 5d 2e 69 46 72 6f 6d 20 2b 20 72 65 67 4f 6c 64  ].iFrom + regOld
95a0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
95b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
95c0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
95d0: 69 52 65 67 2c 20 69 4a 75 6d 70 29 3b 20 56 64  iReg, iJump); Vd
95e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
95f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9610: 70 32 28 76 2c 20 4f 50 5f 46 6b 43 6f 75 6e 74  p2(v, OP_FkCount
9620: 65 72 2c 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  er, pFKey->isDef
9630: 65 72 72 65 64 2c 20 2d 31 29 3b 0a 20 20 20 20  erred, -1);.    
9640: 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
9650: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ue;.    }.    as
9660: 73 65 72 74 28 20 70 46 4b 65 79 2d 3e 6e 43 6f  sert( pFKey->nCo
9670: 6c 3d 3d 31 20 7c 7c 20 28 61 69 46 72 65 65 20  l==1 || (aiFree 
9680: 26 26 20 70 49 64 78 29 20 29 3b 0a 0a 20 20 20  && pIdx) );..   
9690: 20 69 66 28 20 61 69 46 72 65 65 20 29 7b 0a 20   if( aiFree ){. 
96a0: 20 20 20 20 20 61 69 43 6f 6c 20 3d 20 61 69 46       aiCol = aiF
96b0: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
96c0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 46 4b        iCol = pFK
96d0: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
96e0: 6d 3b 0a 20 20 20 20 20 20 61 69 43 6f 6c 20 3d  m;.      aiCol =
96f0: 20 26 69 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20   &iCol;.    }.  
9700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46 4b    for(i=0; i<pFK
9710: 65 79 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ey->nCol; i++){.
9720: 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 5b        if( aiCol[
9730: 69 5d 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  i]==pTab->iPKey 
9740: 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  ){.        aiCol
9750: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
9760: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9770: 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d  pIdx==0 || pIdx-
9780: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
9790: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
97a0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
97b0: 54 49 4f 4e 0a 20 20 20 20 20 20 2f 2a 20 52 65  TION.      /* Re
97c0: 71 75 65 73 74 20 70 65 72 6d 69 73 73 69 6f 6e  quest permission
97d0: 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 72   to read the par
97e0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ent key columns.
97f0: 20 49 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   If the .      *
9800: 2a 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * authorization 
9810: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
9820: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
9830: 62 65 68 61 76 65 20 61 73 20 69 66 20 61 6e 79  behave as if any
9840: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  .      ** values
9850: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
9860: 61 72 65 6e 74 20 74 61 62 6c 65 20 61 72 65 20  arent table are 
9870: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 69  NULL. */.      i
9880: 66 28 20 64 62 2d 3e 78 41 75 74 68 20 29 7b 0a  f( db->xAuth ){.
9890: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 61 75          int rcau
98a0: 74 68 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  th;.        char
98b0: 20 2a 7a 43 6f 6c 20 3d 20 70 54 6f 2d 3e 61 43   *zCol = pTo->aC
98c0: 6f 6c 5b 70 49 64 78 20 3f 20 70 49 64 78 2d 3e  ol[pIdx ? pIdx->
98d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3a 20 70 54  aiColumn[i] : pT
98e0: 6f 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 3b  o->iPKey].zName;
98f0: 0a 20 20 20 20 20 20 20 20 72 63 61 75 74 68 20  .        rcauth 
9900: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61  = sqlite3AuthRea
9910: 64 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 54 6f  dCol(pParse, pTo
9920: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 2c 20 69  ->zName, zCol, i
9930: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 62 49 67  Db);.        bIg
9940: 6e 6f 72 65 20 3d 20 28 72 63 61 75 74 68 3d 3d  nore = (rcauth==
9950: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 29 3b 0a  SQLITE_IGNORE);.
9960: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
9970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 61 6b     }..    /* Tak
9980: 65 20 61 20 73 68 61 72 65 64 2d 63 61 63 68 65  e a shared-cache
9990: 20 61 64 76 69 73 6f 72 79 20 72 65 61 64 2d 6c   advisory read-l
99a0: 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ock on the paren
99b0: 74 20 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74  t table. Allocat
99c0: 65 20 0a 20 20 20 20 2a 2a 20 61 20 63 75 72 73  e .    ** a curs
99d0: 6f 72 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61  or to use to sea
99e0: 72 63 68 20 74 68 65 20 75 6e 69 71 75 65 20 69  rch the unique i
99f0: 6e 64 65 78 20 6f 6e 20 74 68 65 20 70 61 72 65  ndex on the pare
9a00: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 0a  nt key columns .
9a10: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 70 61      ** in the pa
9a20: 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  rent table.  */.
9a30: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
9a40: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
9a50: 2c 20 70 54 6f 2d 3e 74 6e 75 6d 2c 20 30 2c 20  , pTo->tnum, 0, 
9a60: 70 54 6f 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pTo->zName);.   
9a70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
9a80: 0a 0a 20 20 20 20 69 66 28 20 72 65 67 4f 6c 64  ..    if( regOld
9a90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
9aa0: 41 20 72 6f 77 20 69 73 20 62 65 69 6e 67 20 72  A row is being r
9ab0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
9ac0: 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 53 65 61  child table. Sea
9ad0: 72 63 68 20 66 6f 72 20 74 68 65 20 70 61 72 65  rch for the pare
9ae0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  nt..      ** If 
9af0: 74 68 65 20 70 61 72 65 6e 74 20 64 6f 65 73 20  the parent does 
9b00: 6e 6f 74 20 65 78 69 73 74 2c 20 72 65 6d 6f 76  not exist, remov
9b10: 69 6e 67 20 74 68 65 20 63 68 69 6c 64 20 72 6f  ing the child ro
9b20: 77 20 72 65 73 6f 6c 76 65 73 20 61 6e 20 0a 20  w resolves an . 
9b30: 20 20 20 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64       ** outstand
9b40: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ing foreign key 
9b50: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
9b60: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 66  tion. */.      f
9b70: 6b 4c 6f 6f 6b 75 70 50 61 72 65 6e 74 28 70 50  kLookupParent(pP
9b80: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 6f 2c 20  arse, iDb, pTo, 
9b90: 70 49 64 78 2c 20 70 46 4b 65 79 2c 20 61 69 43  pIdx, pFKey, aiC
9ba0: 6f 6c 2c 20 72 65 67 4f 6c 64 2c 20 2d 31 2c 20  ol, regOld, -1, 
9bb0: 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20 20 7d 0a  bIgnore);.    }.
9bc0: 20 20 20 20 69 66 28 20 72 65 67 4e 65 77 21 3d      if( regNew!=
9bd0: 30 20 26 26 20 21 69 73 53 65 74 4e 75 6c 6c 41  0 && !isSetNullA
9be0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
9bf0: 4b 65 79 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Key) ){.      /*
9c00: 20 41 20 72 6f 77 20 69 73 20 62 65 69 6e 67 20   A row is being 
9c10: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 68 69  added to the chi
9c20: 6c 64 20 74 61 62 6c 65 2e 20 49 66 20 61 20 70  ld table. If a p
9c30: 61 72 65 6e 74 20 72 6f 77 20 63 61 6e 6e 6f 74  arent row cannot
9c40: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 66 6f 75  .      ** be fou
9c50: 6e 64 2c 20 61 64 64 69 6e 67 20 74 68 65 20 63  nd, adding the c
9c60: 68 69 6c 64 20 72 6f 77 20 68 61 73 20 76 69 6f  hild row has vio
9c70: 6c 61 74 65 64 20 74 68 65 20 46 4b 20 63 6f 6e  lated the FK con
9c80: 73 74 72 61 69 6e 74 2e 20 0a 20 20 20 20 20 20  straint. .      
9c90: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
9ca0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
9cb0: 20 62 65 69 6e 67 20 70 65 72 66 6f 72 6d 65 64   being performed
9cc0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 74 72   as part of a tr
9cd0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 20 20  igger program.  
9ce0: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 61      ** that is a
9cf0: 63 74 75 61 6c 6c 79 20 61 20 22 53 45 54 20 4e  ctually a "SET N
9d00: 55 4c 4c 22 20 61 63 74 69 6f 6e 20 62 65 6c 6f  ULL" action belo
9d10: 6e 67 69 6e 67 20 74 6f 20 74 68 69 73 20 76 65  nging to this ve
9d20: 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ry .      ** for
9d30: 65 69 67 6e 20 6b 65 79 2c 20 74 68 65 6e 20 6f  eign key, then o
9d40: 6d 69 74 20 74 68 69 73 20 73 63 61 6e 20 61 6c  mit this scan al
9d50: 74 6f 67 65 74 68 65 72 2e 20 41 73 20 61 6c 6c  together. As all
9d60: 20 63 68 69 6c 64 20 6b 65 79 0a 20 20 20 20 20   child key.     
9d70: 20 2a 2a 20 76 61 6c 75 65 73 20 61 72 65 20 67   ** values are g
9d80: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
9d90: 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6e 6f 74 20  NULL, it is not 
9da0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 64 64  possible for add
9db0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
9dc0: 73 20 72 6f 77 20 74 6f 20 63 61 75 73 65 20 61  s row to cause a
9dd0: 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20  n FK violation. 
9de0: 20 2a 2f 0a 20 20 20 20 20 20 66 6b 4c 6f 6f 6b   */.      fkLook
9df0: 75 70 50 61 72 65 6e 74 28 70 50 61 72 73 65 2c  upParent(pParse,
9e00: 20 69 44 62 2c 20 70 54 6f 2c 20 70 49 64 78 2c   iDb, pTo, pIdx,
9e10: 20 70 46 4b 65 79 2c 20 61 69 43 6f 6c 2c 20 72   pFKey, aiCol, r
9e20: 65 67 4e 65 77 2c 20 2b 31 2c 20 62 49 67 6e 6f  egNew, +1, bIgno
9e30: 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  re);.    }..    
9e40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9e50: 2c 20 61 69 46 72 65 65 29 3b 0a 20 20 7d 0a 0a  , aiFree);.  }..
9e60: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
9e70: 68 20 61 6c 6c 20 74 68 65 20 66 6f 72 65 69 67  h all the foreig
9e80: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
9e90: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
9ea0: 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  this table..  **
9eb0: 20 28 74 68 65 20 22 63 68 69 6c 64 22 20 63 6f   (the "child" co
9ec0: 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20  nstraints) */.  
9ed0: 66 6f 72 28 70 46 4b 65 79 20 3d 20 73 71 6c 69  for(pFKey = sqli
9ee0: 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28  te3FkReferences(
9ef0: 70 54 61 62 29 3b 20 70 46 4b 65 79 3b 20 70 46  pTab); pFKey; pF
9f00: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
9f10: 54 6f 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  To){.    Index *
9f20: 70 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  pIdx = 0;       
9f30: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67         /* Foreig
9f40: 6e 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20  n key index for 
9f50: 70 46 4b 65 79 20 2a 2f 0a 20 20 20 20 53 72 63  pFKey */.    Src
9f60: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20  List *pSrc;.    
9f70: 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 30 3b 0a  int *aiCol = 0;.
9f80: 0a 20 20 20 20 69 66 28 20 61 43 68 61 6e 67 65  .    if( aChange
9f90: 20 26 26 20 66 6b 50 61 72 65 6e 74 49 73 4d 6f   && fkParentIsMo
9fa0: 64 69 66 69 65 64 28 70 54 61 62 2c 20 70 46 4b  dified(pTab, pFK
9fb0: 65 79 2c 20 61 43 68 61 6e 67 65 2c 20 62 43 68  ey, aChange, bCh
9fc0: 6e 67 52 6f 77 69 64 29 3d 3d 30 20 29 7b 0a 20  ngRowid)==0 ){. 
9fd0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9fe0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
9ff0: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
a000: 20 26 26 20 21 28 64 62 2d 3e 66 6c 61 67 73 20   && !(db->flags 
a010: 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  & SQLITE_DeferFK
a020: 73 29 20 0a 20 20 20 20 20 26 26 20 21 70 50 61  s) .     && !pPa
a030: 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 20 26  rse->pToplevel &
a040: 26 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  & !pParse->isMul
a050: 74 69 57 72 69 74 65 20 0a 20 20 20 20 29 7b 0a  tiWrite .    ){.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
a070: 67 4f 6c 64 3d 3d 30 20 26 26 20 72 65 67 4e 65  gOld==0 && regNe
a080: 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  w!=0 );.      /*
a090: 20 49 6e 73 65 72 74 69 6e 67 20 61 20 73 69 6e   Inserting a sin
a0a0: 67 6c 65 20 72 6f 77 20 69 6e 74 6f 20 61 20 70  gle row into a p
a0b0: 61 72 65 6e 74 20 74 61 62 6c 65 20 63 61 6e 6e  arent table cann
a0c0: 6f 74 20 63 61 75 73 65 20 28 6f 72 20 66 69 78  ot cause (or fix
a0d0: 29 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6d  ).      ** an im
a0e0: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
a0f0: 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 53  key violation. S
a100: 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 20 69 6e 20  o do nothing in 
a110: 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
a120: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a130: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
a140: 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64  lite3FkLocateInd
a150: 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
a160: 20 70 46 4b 65 79 2c 20 26 70 49 64 78 2c 20 26   pFKey, &pIdx, &
a170: 61 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  aiCol) ){.      
a180: 69 66 28 20 21 69 73 49 67 6e 6f 72 65 45 72 72  if( !isIgnoreErr
a190: 6f 72 73 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ors || db->mallo
a1a0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
a1b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
a1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
a1d0: 72 74 28 20 61 69 43 6f 6c 20 7c 7c 20 70 46 4b  rt( aiCol || pFK
a1e0: 65 79 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 0a  ey->nCol==1 );..
a1f0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
a200: 53 72 63 4c 69 73 74 20 73 74 72 75 63 74 75 72  SrcList structur
a210: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
a220: 20 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 20 57   child table.  W
a230: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 20 2a  e need the.    *
a240: 2a 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 73  * child table as
a250: 20 61 20 53 72 63 4c 69 73 74 20 66 6f 72 20 73   a SrcList for s
a260: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
a270: 28 29 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  () */.    pSrc =
a280: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
a290: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
a2a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
a2b0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 73 74  pSrc ){.      st
a2c0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
a2d0: 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 2d  m *pItem = pSrc-
a2e0: 3e 61 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  >a;.      pItem-
a2f0: 3e 70 54 61 62 20 3d 20 70 46 4b 65 79 2d 3e 70  >pTab = pFKey->p
a300: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 70 49 74 65  From;.      pIte
a310: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 70 46 4b 65 79  m->zName = pFKey
a320: 2d 3e 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3b 0a  ->pFrom->zName;.
a330: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
a340: 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
a350: 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
a360: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
a370: 62 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 69 66  b++;.  .      if
a380: 28 20 72 65 67 4e 65 77 21 3d 30 20 29 7b 0a 20  ( regNew!=0 ){. 
a390: 20 20 20 20 20 20 20 66 6b 53 63 61 6e 43 68 69         fkScanChi
a3a0: 6c 64 72 65 6e 28 70 50 61 72 73 65 2c 20 70 53  ldren(pParse, pS
a3b0: 72 63 2c 20 70 54 61 62 2c 20 70 49 64 78 2c 20  rc, pTab, pIdx, 
a3c0: 70 46 4b 65 79 2c 20 61 69 43 6f 6c 2c 20 72 65  pFKey, aiCol, re
a3d0: 67 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  gNew, -1);.     
a3e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
a3f0: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
a400: 20 20 69 6e 74 20 65 41 63 74 69 6f 6e 20 3d 20    int eAction = 
a410: 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 61  pFKey->aAction[a
a420: 43 68 61 6e 67 65 21 3d 30 5d 3b 0a 20 20 20 20  Change!=0];.    
a430: 20 20 20 20 66 6b 53 63 61 6e 43 68 69 6c 64 72      fkScanChildr
a440: 65 6e 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  en(pParse, pSrc,
a450: 20 70 54 61 62 2c 20 70 49 64 78 2c 20 70 46 4b   pTab, pIdx, pFK
a460: 65 79 2c 20 61 69 43 6f 6c 2c 20 72 65 67 4f 6c  ey, aiCol, regOl
a470: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  d, 1);.        /
a480: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
a490: 65 66 65 72 72 65 64 20 46 4b 20 63 6f 6e 73 74  eferred FK const
a4a0: 72 61 69 6e 74 2c 20 6f 72 20 61 20 43 41 53 43  raint, or a CASC
a4b0: 41 44 45 20 6f 72 20 53 45 54 20 4e 55 4c 4c 0a  ADE or SET NULL.
a4c0: 20 20 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f          ** actio
a4d0: 6e 20 61 70 70 6c 69 65 73 2c 20 74 68 65 6e 20  n applies, then 
a4e0: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  any foreign key 
a4f0: 76 69 6f 6c 61 74 69 6f 6e 73 20 63 61 75 73 65  violations cause
a500: 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
a510: 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 72  removing the par
a520: 65 6e 74 20 6b 65 79 20 77 69 6c 6c 20 62 65 20  ent key will be 
a530: 72 65 63 74 69 66 69 65 64 20 62 79 20 74 68 65  rectified by the
a540: 20 61 63 74 69 6f 6e 20 74 72 69 67 67 65 72 2e   action trigger.
a550: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 64  .        ** So d
a560: 6f 20 6e 6f 74 20 73 65 74 20 74 68 65 20 22 6d  o not set the "m
a570: 61 79 2d 61 62 6f 72 74 22 20 66 6c 61 67 20 69  ay-abort" flag i
a580: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
a590: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
a5a0: 2a 2a 20 4e 6f 74 65 20 31 3a 20 49 66 20 74 68  ** Note 1: If th
a5b0: 65 20 46 4b 20 69 73 20 64 65 63 6c 61 72 65 64  e FK is declared
a5c0: 20 22 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43   "ON UPDATE CASC
a5d0: 41 44 45 22 2c 20 74 68 65 6e 20 74 68 65 0a 20  ADE", then the. 
a5e0: 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 2d 61 62         ** may-ab
a5f0: 6f 72 74 20 66 6c 61 67 20 77 69 6c 6c 20 65 76  ort flag will ev
a600: 65 6e 74 75 61 6c 6c 79 20 62 65 20 73 65 74 20  entually be set 
a610: 6f 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  on this statemen
a620: 74 20 61 6e 79 77 61 79 0a 20 20 20 20 20 20 20  t anyway.       
a630: 20 2a 2a 20 28 77 68 65 6e 20 74 68 69 73 20 66   ** (when this f
a640: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a650: 64 20 61 73 20 70 61 72 74 20 6f 66 20 70 72 6f  d as part of pro
a660: 63 65 73 73 69 6e 67 20 74 68 65 20 55 50 44 41  cessing the UPDA
a670: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  TE.        ** wi
a680: 74 68 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20  thin the action 
a690: 74 72 69 67 67 65 72 29 2e 0a 20 20 20 20 20 20  trigger)..      
a6a0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a6b0: 4e 6f 74 65 20 32 3a 20 41 74 20 66 69 72 73 74  Note 2: At first
a6c0: 20 67 6c 61 6e 63 65 20 69 74 20 6d 61 79 20 73   glance it may s
a6d0: 65 65 6d 20 6c 69 6b 65 20 53 51 4c 69 74 65 20  eem like SQLite 
a6e0: 63 6f 75 6c 64 20 73 69 6d 70 6c 79 20 6f 6d 69  could simply omi
a6f0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
a700: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 72 65   OP_FkCounter re
a710: 6c 61 74 65 64 20 73 63 61 6e 73 20 77 68 65 6e  lated scans when
a720: 20 65 69 74 68 65 72 20 43 41 53 43 41 44 45 20   either CASCADE 
a730: 6f 72 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20  or SET NULL.    
a740: 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 73 2e 20      ** applies. 
a750: 54 68 65 20 74 72 6f 75 62 6c 65 20 73 74 61 72  The trouble star
a760: 74 73 20 69 66 20 74 68 65 20 43 41 53 43 41 44  ts if the CASCAD
a770: 45 20 6f 72 20 53 45 54 20 4e 55 4c 4c 20 61 63  E or SET NULL ac
a780: 74 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  tion .        **
a790: 20 74 72 69 67 67 65 72 20 63 61 75 73 65 73 20   trigger causes 
a7a0: 6f 74 68 65 72 20 74 72 69 67 67 65 72 73 20 6f  other triggers o
a7b0: 72 20 61 63 74 69 6f 6e 20 72 75 6c 65 73 20 61  r action rules a
a7c0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 0a  ttached to the .
a7d0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 69 6c 64          ** child
a7e0: 20 74 61 62 6c 65 20 74 6f 20 66 69 72 65 2e 20   table to fire. 
a7f0: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74  In these cases t
a800: 68 65 20 66 6b 20 63 6f 6e 73 74 72 61 69 6e 74  he fk constraint
a810: 20 63 6f 75 6e 74 65 72 73 0a 20 20 20 20 20 20   counters.      
a820: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65    ** might be se
a830: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 69 66  t incorrectly if
a840: 20 61 6e 79 20 4f 50 5f 46 6b 43 6f 75 6e 74 65   any OP_FkCounte
a850: 72 20 72 65 6c 61 74 65 64 20 73 63 61 6e 73 20  r related scans 
a860: 61 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  are .        ** 
a870: 6f 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20  omitted.  */.   
a880: 20 20 20 20 20 69 66 28 20 21 70 46 4b 65 79 2d       if( !pFKey-
a890: 3e 69 73 44 65 66 65 72 72 65 64 20 26 26 20 65  >isDeferred && e
a8a0: 41 63 74 69 6f 6e 21 3d 4f 45 5f 43 61 73 63 61  Action!=OE_Casca
a8b0: 64 65 20 26 26 20 65 41 63 74 69 6f 6e 21 3d 4f  de && eAction!=O
a8c0: 45 5f 53 65 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  E_SetNull ){.   
a8d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
a8e0: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
a8f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a900: 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  }.      pItem->z
a910: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
a920: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
a930: 6c 65 74 65 28 64 62 2c 20 70 53 72 63 29 3b 0a  lete(db, pSrc);.
a940: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a950: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
a960: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  l);.  }.}..#defi
a970: 6e 65 20 43 4f 4c 55 4d 4e 5f 4d 41 53 4b 28 78  ne COLUMN_MASK(x
a980: 29 20 28 28 28 78 29 3e 33 31 29 20 3f 20 30 78  ) (((x)>31) ? 0x
a990: 66 66 66 66 66 66 66 66 20 3a 20 28 28 75 33 32  ffffffff : ((u32
a9a0: 29 31 3c 3c 28 78 29 29 29 0a 0a 2f 2a 0a 2a 2a  )1<<(x)))../*.**
a9b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
a9c0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
a9d0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
a9e0: 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  to update or del
a9f0: 65 74 65 20 61 20 0a 2a 2a 20 72 6f 77 20 63 6f  ete a .** row co
aa00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 61 62 6c 65  ntained in table
aa10: 20 70 54 61 62 2e 0a 2a 2f 0a 75 33 32 20 73 71   pTab..*/.u32 sq
aa20: 6c 69 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 0a  lite3FkOldmask(.
aa30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
aa60: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
aa70: 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Tab             
aa80: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
aa90: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20   being modified 
aaa0: 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 6d 61 73 6b  */.){.  u32 mask
aab0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
aac0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  se->db->flags&SQ
aad0: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
aae0: 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 3b   ){.    FKey *p;
aaf0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ab00: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 4b 65  for(p=pTab->pFKe
ab10: 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  y; p; p=p->pNext
ab20: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 66 6f 72  From){.      for
ab30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
ab40: 20 69 2b 2b 29 20 6d 61 73 6b 20 7c 3d 20 43 4f   i++) mask |= CO
ab50: 4c 55 4d 4e 5f 4d 41 53 4b 28 70 2d 3e 61 43 6f  LUMN_MASK(p->aCo
ab60: 6c 5b 69 5d 2e 69 46 72 6f 6d 29 3b 0a 20 20 20  l[i].iFrom);.   
ab70: 20 7d 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c   }.    for(p=sql
ab80: 69 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73  ite3FkReferences
ab90: 28 70 54 61 62 29 3b 20 70 3b 20 70 3d 70 2d 3e  (pTab); p; p=p->
aba0: 70 4e 65 78 74 54 6f 29 7b 0a 20 20 20 20 20 20  pNextTo){.      
abb0: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
abc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b  .      sqlite3Fk
abd0: 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72  LocateIndex(pPar
abe0: 73 65 2c 20 70 54 61 62 2c 20 70 2c 20 26 70 49  se, pTab, p, &pI
abf0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  dx, 0);.      if
ac00: 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
ac10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
ac20: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
ac30: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
ac40: 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
ac50: 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[i]>=0 );.    
ac60: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 43 4f        mask |= CO
ac70: 4c 55 4d 4e 5f 4d 41 53 4b 28 70 49 64 78 2d 3e  LUMN_MASK(pIdx->
ac80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20  aiColumn[i]);.  
ac90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
aca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
acb0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn mask;.}.../*.
acc0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
acd0: 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
ace0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  e generating cod
acf0: 65 20 74 6f 20 75 70 64 61 74 65 20 6f 72 20 64  e to update or d
ad00: 65 6c 65 74 65 20 61 20 0a 2a 2a 20 72 6f 77 20  elete a .** row 
ad10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 61 62  contained in tab
ad20: 6c 65 20 70 54 61 62 2e 20 49 66 20 74 68 65 20  le pTab. If the 
ad30: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 44  operation is a D
ad40: 45 4c 45 54 45 2c 20 74 68 65 6e 0a 2a 2a 20 70  ELETE, then.** p
ad50: 61 72 61 6d 65 74 65 72 20 61 43 68 61 6e 67 65  arameter aChange
ad60: 20 69 73 20 70 61 73 73 65 64 20 61 20 4e 55 4c   is passed a NUL
ad70: 4c 20 76 61 6c 75 65 2e 20 46 6f 72 20 61 6e 20  L value. For an 
ad80: 55 50 44 41 54 45 2c 20 61 43 68 61 6e 67 65 20  UPDATE, aChange 
ad90: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 6e 20  points.** to an 
ada0: 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 4e 2c  array of size N,
adb0: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
adc0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
add0: 73 20 69 6e 20 74 61 62 6c 65 20 70 54 61 62 2e  s in table pTab.
ade0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 27 74 68 20  .** If the i'th 
adf0: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6d 6f  column is not mo
ae00: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 55 50  dified by the UP
ae10: 44 41 54 45 2c 20 74 68 65 6e 20 74 68 65 20 63  DATE, then the c
ae20: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a  orresponding .**
ae30: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 61 43   entry in the aC
ae40: 68 61 6e 67 65 5b 5d 20 61 72 72 61 79 20 69 73  hange[] array is
ae50: 20 73 65 74 20 74 6f 20 2d 31 2e 20 49 66 20 74   set to -1. If t
ae60: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 64  he column is mod
ae70: 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 20 76 61  ified,.** the va
ae80: 6c 75 65 20 69 73 20 30 20 6f 72 20 67 72 65 61  lue is 0 or grea
ae90: 74 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 63  ter. Parameter c
aea0: 68 6e 67 52 6f 77 69 64 20 69 73 20 73 65 74 20  hngRowid is set 
aeb0: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 0a 2a  to true if the.*
aec0: 2a 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  * UPDATE stateme
aed0: 6e 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  nt modifies the 
aee0: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 6f 66 20  rowid fields of 
aef0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
af00: 20 49 66 20 61 6e 79 20 66 6f 72 65 69 67 6e 20   If any foreign 
af10: 6b 65 79 20 70 72 6f 63 65 73 73 69 6e 67 20 77  key processing w
af20: 69 6c 6c 20 62 65 20 72 65 71 75 69 72 65 64 2c  ill be required,
af30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
af40: 65 74 75 72 6e 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65  eturns.** non-ze
af50: 72 6f 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ro. If there is 
af60: 6e 6f 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 72  no foreign key r
af70: 65 6c 61 74 65 64 20 70 72 6f 63 65 73 73 69 6e  elated processin
af80: 67 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  g, this function
af90: 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72   .** returns zer
afa0: 6f 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  o..**.** For an 
afb0: 55 50 44 41 54 45 2c 20 74 68 69 73 20 66 75 6e  UPDATE, this fun
afc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 32 20  ction returns 2 
afd0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  if:.**.**   * Th
afe0: 65 72 65 20 61 72 65 20 61 6e 79 20 46 4b 73 20  ere are any FKs 
aff0: 66 6f 72 20 77 68 69 63 68 20 70 54 61 62 20 69  for which pTab i
b000: 73 20 74 68 65 20 63 68 69 6c 64 20 61 6e 64 20  s the child and 
b010: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
b020: 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 74 68 65 20  , or.**   * the 
b030: 55 50 44 41 54 45 20 6d 6f 64 69 66 69 65 73 20  UPDATE modifies 
b040: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 61 72 65  one or more pare
b050: 6e 74 20 6b 65 79 73 20 66 6f 72 20 77 68 69 63  nt keys for whic
b060: 68 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 0a  h the action is.
b070: 2a 2a 20 20 20 20 20 6e 6f 74 20 22 4e 4f 20 41  **     not "NO A
b080: 43 54 49 4f 4e 22 20 28 69 2e 65 2e 20 69 73 20  CTION" (i.e. is 
b090: 43 41 53 43 41 44 45 2c 20 53 45 54 20 44 45 46  CASCADE, SET DEF
b0a0: 41 55 4c 54 20 6f 72 20 53 45 54 20 4e 55 4c 4c  AULT or SET NULL
b0b0: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 61 73 73  )..**.** Or, ass
b0c0: 75 6d 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  uming some other
b0d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 72 6f   foreign key pro
b0e0: 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69  cessing is requi
b0f0: 72 65 64 2c 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  red, 1..*/.int s
b100: 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64  qlite3FkRequired
b110: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b120: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
b130: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
b140: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
b150: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
b160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
b170: 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  le being modifie
b180: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 68 61  d */.  int *aCha
b190: 6e 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  nge,            
b1a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 4e 55         /* Non-NU
b1b0: 4c 4c 20 66 6f 72 20 55 50 44 41 54 45 20 6f 70  LL for UPDATE op
b1c0: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
b1d0: 74 20 63 68 6e 67 52 6f 77 69 64 20 20 20 20 20  t chngRowid     
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b1f0: 20 54 72 75 65 20 66 6f 72 20 55 50 44 41 54 45   True for UPDATE
b200: 20 74 68 61 74 20 61 66 66 65 63 74 73 20 72 6f   that affects ro
b210: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
b220: 65 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  eRet = 0;.  if( 
b230: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
b240: 73 26 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  s&SQLITE_Foreign
b250: 4b 65 79 73 20 29 7b 0a 20 20 20 20 69 66 28 20  Keys ){.    if( 
b260: 21 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  !aChange ){.    
b270: 20 20 2f 2a 20 41 20 44 45 4c 45 54 45 20 6f 70    /* A DELETE op
b280: 65 72 61 74 69 6f 6e 2e 20 46 6f 72 65 69 67 6e  eration. Foreign
b290: 20 6b 65 79 20 70 72 6f 63 65 73 73 69 6e 67 20   key processing 
b2a0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 74  is required if t
b2b0: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  he .      ** tab
b2c0: 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 69  le in question i
b2d0: 73 20 65 69 74 68 65 72 20 74 68 65 20 63 68 69  s either the chi
b2e0: 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74 61 62  ld or parent tab
b2f0: 6c 65 20 66 6f 72 20 61 6e 79 20 0a 20 20 20 20  le for any .    
b300: 20 20 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79    ** foreign key
b310: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 2a 2f   constraint.  */
b320: 0a 20 20 20 20 20 20 65 52 65 74 20 3d 20 28 73  .      eRet = (s
b330: 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65 6e 63  qlite3FkReferenc
b340: 65 73 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62  es(pTab) || pTab
b350: 2d 3e 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 65  ->pFKey);.    }e
b360: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
b370: 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 2e  is is an UPDATE.
b380: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 70 72 6f   Foreign key pro
b390: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
b3a0: 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 0a  required if the.
b3b0: 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69        ** operati
b3c0: 6f 6e 20 6d 6f 64 69 66 69 65 73 20 6f 6e 65 20  on modifies one 
b3d0: 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6f 72  or more child or
b3e0: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75   parent key colu
b3f0: 6d 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 46 4b  mns. */.      FK
b400: 65 79 20 2a 70 3b 0a 0a 20 20 20 20 20 20 2f 2a  ey *p;..      /*
b410: 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20 63 68   Check if any ch
b420: 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ild key columns 
b430: 61 72 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  are being modifi
b440: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ed. */.      for
b450: 28 70 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  (p=pTab->pFKey; 
b460: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 46 72 6f  p; p=p->pNextFro
b470: 6d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m){.        if( 
b480: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
b490: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
b4a0: 70 2d 3e 7a 54 6f 29 20 29 20 72 65 74 75 72 6e  p->zTo) ) return
b4b0: 20 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   2;.        if( 
b4c0: 66 6b 43 68 69 6c 64 49 73 4d 6f 64 69 66 69 65  fkChildIsModifie
b4d0: 64 28 70 54 61 62 2c 20 70 2c 20 61 43 68 61 6e  d(pTab, p, aChan
b4e0: 67 65 2c 20 63 68 6e 67 52 6f 77 69 64 29 20 29  ge, chngRowid) )
b4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 65 52 65 74  {.          eRet
b500: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b510: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
b520: 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79 20 70  * Check if any p
b530: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
b540: 73 20 61 72 65 20 62 65 69 6e 67 20 6d 6f 64 69  s are being modi
b550: 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 66  fied. */.      f
b560: 6f 72 28 70 3d 73 71 6c 69 74 65 33 46 6b 52 65  or(p=sqlite3FkRe
b570: 66 65 72 65 6e 63 65 73 28 70 54 61 62 29 3b 20  ferences(pTab); 
b580: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 54 6f 29  p; p=p->pNextTo)
b590: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6b  {.        if( fk
b5a0: 50 61 72 65 6e 74 49 73 4d 6f 64 69 66 69 65 64  ParentIsModified
b5b0: 28 70 54 61 62 2c 20 70 2c 20 61 43 68 61 6e 67  (pTab, p, aChang
b5c0: 65 2c 20 63 68 6e 67 52 6f 77 69 64 29 20 29 7b  e, chngRowid) ){
b5d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
b5e0: 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 21 3d 4f 45  ->aAction[1]!=OE
b5f0: 5f 4e 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 32  _None ) return 2
b600: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 52 65 74  ;.          eRet
b610: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b620: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b630: 7d 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  }.  return eRet;
b640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b650: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
b660: 64 20 77 68 65 6e 20 61 6e 20 55 50 44 41 54 45  d when an UPDATE
b670: 20 6f 72 20 44 45 4c 45 54 45 20 6f 70 65 72 61   or DELETE opera
b680: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 0a 2a  tion is being .*
b690: 2a 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 74 61  * compiled on ta
b6a0: 62 6c 65 20 70 54 61 62 2c 20 77 68 69 63 68 20  ble pTab, which 
b6b0: 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  is the parent ta
b6c0: 62 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e 2d 6b  ble of foreign-k
b6d0: 65 79 20 70 46 4b 65 79 2e 0a 2a 2a 20 49 66 20  ey pFKey..** If 
b6e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
b6f0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41  ation is an UPDA
b700: 54 45 2c 20 74 68 65 6e 20 74 68 65 20 70 43 68  TE, then the pCh
b710: 61 6e 67 65 73 20 70 61 72 61 6d 65 74 65 72 20  anges parameter 
b720: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 61 20 70  is.** passed a p
b730: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69  ointer to the li
b740: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65  st of columns be
b750: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 49 66  ing modified. If
b760: 20 69 74 20 69 73 20 61 0a 2a 2a 20 44 45 4c 45   it is a.** DELE
b770: 54 45 2c 20 70 43 68 61 6e 67 65 73 20 69 73 20  TE, pChanges is 
b780: 70 61 73 73 65 64 20 61 20 4e 55 4c 4c 20 70 6f  passed a NULL po
b790: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  inter..**.** It 
b7a0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
b7b0: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 20 73  r to a Trigger s
b7c0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
b7d0: 69 6e 67 20 61 20 74 72 69 67 67 65 72 0a 2a 2a  ing a trigger.**
b7e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
b7f0: 68 65 20 4f 4e 20 55 50 44 41 54 45 20 6f 72 20  he ON UPDATE or 
b800: 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e  ON DELETE action
b810: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 46   specified by pF
b820: 4b 65 79 2e 0a 2a 2a 20 49 66 20 74 68 65 20 61  Key..** If the a
b830: 63 74 69 6f 6e 20 69 73 20 22 4e 4f 20 41 43 54  ction is "NO ACT
b840: 49 4f 4e 22 20 6f 72 20 22 52 45 53 54 52 49 43  ION" or "RESTRIC
b850: 54 22 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20  T", then a NULL 
b860: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 72 65  pointer is.** re
b870: 74 75 72 6e 65 64 20 28 74 68 65 73 65 20 61 63  turned (these ac
b880: 74 69 6f 6e 73 20 72 65 71 75 69 72 65 20 6e 6f  tions require no
b890: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
b8a0: 67 20 62 79 20 74 68 65 20 74 72 69 67 67 65 72  g by the trigger
b8b0: 73 0a 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2c  s.** sub-system,
b8c0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 6d 20 69   code for them i
b8d0: 73 20 63 72 65 61 74 65 64 20 62 79 20 66 6b 53  s created by fkS
b8e0: 63 61 6e 43 68 69 6c 64 72 65 6e 28 29 29 2e 0a  canChildren())..
b8f0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
b900: 65 2c 20 69 66 20 70 46 4b 65 79 20 69 73 20 74  e, if pFKey is t
b910: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  he foreign key a
b920: 6e 64 20 70 54 61 62 20 69 73 20 74 61 62 6c 65  nd pTab is table
b930: 20 22 70 22 20 69 6e 20 0a 2a 2a 20 74 68 65 20   "p" in .** the 
b940: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65 6d 61  following schema
b950: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
b960: 20 54 41 42 4c 45 20 70 28 70 6b 20 50 52 49 4d   TABLE p(pk PRIM
b970: 41 52 59 20 4b 45 59 29 3b 0a 2a 2a 20 20 20 43  ARY KEY);.**   C
b980: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 63 6b  REATE TABLE c(ck
b990: 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
b9a0: 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 29   DELETE CASCADE)
b9b0: 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ;.**.** then the
b9c0: 20 72 65 74 75 72 6e 65 64 20 74 72 69 67 67 65   returned trigge
b9d0: 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  r structure is e
b9e0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a  quivalent to:.**
b9f0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 52 49  .**   CREATE TRI
ba00: 47 47 45 52 20 2e 2e 2e 20 44 45 4c 45 54 45 20  GGER ... DELETE 
ba10: 4f 4e 20 70 20 42 45 47 49 4e 0a 2a 2a 20 20 20  ON p BEGIN.**   
ba20: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 20    DELETE FROM c 
ba30: 57 48 45 52 45 20 63 6b 20 3d 20 6f 6c 64 2e 70  WHERE ck = old.p
ba40: 6b 3b 0a 2a 2a 20 20 20 45 4e 44 3b 0a 2a 2a 0a  k;.**   END;.**.
ba50: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
ba60: 70 6f 69 6e 74 65 72 20 69 73 20 63 61 63 68 65  pointer is cache
ba70: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
ba80: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 62 6a   foreign key obj
ba90: 65 63 74 2e 20 49 74 0a 2a 2a 20 69 73 20 65 76  ect. It.** is ev
baa0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 61  entually freed a
bab0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
bac0: 73 74 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67  st of the foreig
bad0: 6e 20 6b 65 79 20 6f 62 6a 65 63 74 20 62 79 20  n key object by 
bae0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 6b 44 65 6c  .** sqlite3FkDel
baf0: 65 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ete()..*/.static
bb00: 20 54 72 69 67 67 65 72 20 2a 66 6b 41 63 74 69   Trigger *fkActi
bb10: 6f 6e 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  onTrigger(.  Par
bb20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb40: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
bb50: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
bb80: 67 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  g updated or del
bb90: 65 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 46  eted from */.  F
bba0: 4b 65 79 20 2a 70 46 4b 65 79 2c 20 20 20 20 20  Key *pFKey,     
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbc0: 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  * Foreign key to
bbd0: 20 67 65 74 20 61 63 74 69 6f 6e 20 66 6f 72 20   get action for 
bbe0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
bbf0: 43 68 61 6e 67 65 73 20 20 20 20 20 20 20 20 20  Changes         
bc00: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 2d 6c       /* Change-l
bc10: 69 73 74 20 66 6f 72 20 55 50 44 41 54 45 2c 20  ist for UPDATE, 
bc20: 4e 55 4c 4c 20 66 6f 72 20 44 45 4c 45 54 45 20  NULL for DELETE 
bc30: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
bc40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bc50: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
bc60: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
bc70: 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20  int action;     
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 2f 2a 20 4f 6e 65 20 6f 66 20 4f 45 5f 4e 6f 6e  /* One of OE_Non
bca0: 65 2c 20 4f 45 5f 43 61 73 63 61 64 65 20 65 74  e, OE_Cascade et
bcb0: 63 2e 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  c. */.  Trigger 
bcc0: 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20 20 20  *pTrigger;      
bcd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67          /* Trigg
bce0: 65 72 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 6f  er definition to
bcf0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
bd00: 20 69 41 63 74 69 6f 6e 20 3d 20 28 70 43 68 61   iAction = (pCha
bd10: 6e 67 65 73 21 3d 30 29 3b 20 20 20 20 2f 2a 20  nges!=0);    /* 
bd20: 31 20 66 6f 72 20 55 50 44 41 54 45 2c 20 30 20  1 for UPDATE, 0 
bd30: 66 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 0a 20  for DELETE */.. 
bd40: 20 61 63 74 69 6f 6e 20 3d 20 70 46 4b 65 79 2d   action = pFKey-
bd50: 3e 61 41 63 74 69 6f 6e 5b 69 41 63 74 69 6f 6e  >aAction[iAction
bd60: 5d 3b 0a 20 20 69 66 28 20 61 63 74 69 6f 6e 3d  ];.  if( action=
bd70: 3d 4f 45 5f 52 65 73 74 72 69 63 74 20 26 26 20  =OE_Restrict && 
bd80: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
bd90: 49 54 45 5f 44 65 66 65 72 46 4b 73 29 20 29 7b  ITE_DeferFKs) ){
bda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
bdb0: 20 7d 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20   }.  pTrigger = 
bdc0: 70 46 4b 65 79 2d 3e 61 70 54 72 69 67 67 65 72  pFKey->apTrigger
bdd0: 5b 69 41 63 74 69 6f 6e 5d 3b 0a 0a 20 20 69 66  [iAction];..  if
bde0: 28 20 61 63 74 69 6f 6e 21 3d 4f 45 5f 4e 6f 6e  ( action!=OE_Non
bdf0: 65 20 26 26 20 21 70 54 72 69 67 67 65 72 20 29  e && !pTrigger )
be00: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
be10: 20 2a 7a 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *zFrom;        
be20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63      /* Name of c
be30: 68 69 6c 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hild table */.  
be40: 20 20 69 6e 74 20 6e 46 72 6f 6d 3b 20 20 20 20    int nFrom;    
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
be70: 65 73 20 6f 66 20 7a 46 72 6f 6d 20 2a 2f 0a 20  es of zFrom */. 
be80: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
be90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bea0: 20 2f 2a 20 50 61 72 65 6e 74 20 6b 65 79 20 69   /* Parent key i
beb0: 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 46 4b  ndex for this FK
bec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43   */.    int *aiC
bed0: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ol = 0;         
bee0: 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20 74        /* child t
bef0: 61 62 6c 65 20 63 6f 6c 73 20 2d 3e 20 70 61 72  able cols -> par
bf00: 65 6e 74 20 6b 65 79 20 63 6f 6c 73 20 2a 2f 0a  ent key cols */.
bf10: 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70 20      TriggerStep 
bf20: 2a 70 53 74 65 70 20 3d 20 30 3b 20 20 20 20 20  *pStep = 0;     
bf30: 20 20 20 2f 2a 20 46 69 72 73 74 20 28 6f 6e 6c     /* First (onl
bf40: 79 29 20 73 74 65 70 20 6f 66 20 74 72 69 67 67  y) step of trigg
bf50: 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  er program */.  
bf60: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
bf70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bf80: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
bf90: 6f 66 20 74 72 69 67 67 65 72 20 73 74 65 70 20  of trigger step 
bfa0: 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
bfb0: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  *pList = 0;     
bfc0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
bfd0: 6c 69 73 74 20 69 66 20 4f 4e 20 55 50 44 41 54  list if ON UPDAT
bfe0: 45 20 43 41 53 43 41 44 45 20 2a 2f 0a 20 20 20  E CASCADE */.   
bff0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c000: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
c010: 2a 20 49 66 20 52 45 53 54 52 49 43 54 2c 20 22  * If RESTRICT, "
c020: 53 45 4c 45 43 54 20 52 41 49 53 45 28 2e 2e 2e  SELECT RAISE(...
c030: 29 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  )" */.    int i;
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
c060: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
c070: 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 6e 20      Expr *pWhen 
c080: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c090: 20 20 2f 2a 20 57 48 45 4e 20 63 6c 61 75 73 65    /* WHEN clause
c0a0: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72   for the trigger
c0b0: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 73 71 6c   */..    if( sql
c0c0: 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65  ite3FkLocateInde
c0d0: 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
c0e0: 70 46 4b 65 79 2c 20 26 70 49 64 78 2c 20 26 61  pFKey, &pIdx, &a
c0f0: 69 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30  iCol) ) return 0
c100: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 69  ;.    assert( ai
c110: 43 6f 6c 20 7c 7c 20 70 46 4b 65 79 2d 3e 6e 43  Col || pFKey->nC
c120: 6f 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 66 6f  ol==1 );..    fo
c130: 72 28 69 3d 30 3b 20 69 3c 70 46 4b 65 79 2d 3e  r(i=0; i<pFKey->
c140: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c150: 20 20 54 6f 6b 65 6e 20 74 4f 6c 64 20 3d 20 7b    Token tOld = {
c160: 20 22 6f 6c 64 22 2c 20 33 20 7d 3b 20 20 2f 2a   "old", 3 };  /*
c170: 20 4c 69 74 65 72 61 6c 20 22 6f 6c 64 22 20 74   Literal "old" t
c180: 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 54 6f  oken */.      To
c190: 6b 65 6e 20 74 4e 65 77 20 3d 20 7b 20 22 6e 65  ken tNew = { "ne
c1a0: 77 22 2c 20 33 20 7d 3b 20 20 2f 2a 20 4c 69 74  w", 3 };  /* Lit
c1b0: 65 72 61 6c 20 22 6e 65 77 22 20 74 6f 6b 65 6e  eral "new" token
c1c0: 20 2a 2f 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20   */.      Token 
c1d0: 74 46 72 6f 6d 43 6f 6c 3b 20 20 20 20 20 20 20  tFromCol;       
c1e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
c1f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 63 68 69 6c 64   column in child
c200: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
c210: 54 6f 6b 65 6e 20 74 54 6f 43 6f 6c 3b 20 20 20  Token tToCol;   
c220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c230: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
c240: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f   parent table */
c250: 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72 6f 6d  .      int iFrom
c260: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c270: 20 20 20 2f 2a 20 49 64 78 20 6f 66 20 63 6f 6c     /* Idx of col
c280: 75 6d 6e 20 69 6e 20 63 68 69 6c 64 20 74 61 62  umn in child tab
c290: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  le */.      Expr
c2a0: 20 2a 70 45 71 3b 20 20 20 20 20 20 20 20 20 20   *pEq;          
c2b0: 20 20 20 20 20 20 20 20 2f 2a 20 74 46 72 6f 6d          /* tFrom
c2c0: 43 6f 6c 20 3d 20 4f 4c 44 2e 74 54 6f 43 6f 6c  Col = OLD.tToCol
c2d0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 46 72 6f 6d   */..      iFrom
c2e0: 43 6f 6c 20 3d 20 61 69 43 6f 6c 20 3f 20 61 69  Col = aiCol ? ai
c2f0: 43 6f 6c 5b 69 5d 20 3a 20 70 46 4b 65 79 2d 3e  Col[i] : pFKey->
c300: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b 0a 20  aCol[0].iFrom;. 
c310: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c320: 6f 6d 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 20 20  omCol>=0 );.    
c330: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
c340: 30 20 7c 7c 20 28 70 54 61 62 2d 3e 69 50 4b 65  0 || (pTab->iPKe
c350: 79 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 69 50  y>=0 && pTab->iP
c360: 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Key<pTab->nCol) 
c370: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c380: 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49 64 78   pIdx==0 || pIdx
c390: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
c3a0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c3b0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 74 54 6f 43  3TokenInit(&tToC
c3c0: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
c3d0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
c3e0: 6c 5b 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 61  l[pIdx ? pIdx->a
c3f0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3a 20 70 54 61  iColumn[i] : pTa
c400: 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
c410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
c420: 6f 6b 65 6e 49 6e 69 74 28 26 74 46 72 6f 6d 43  okenInit(&tFromC
c430: 6f 6c 2c 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  ol, pFKey->pFrom
c440: 2d 3e 61 43 6f 6c 5b 69 46 72 6f 6d 43 6f 6c 5d  ->aCol[iFromCol]
c450: 2e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  .zName);..      
c460: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 65 78  /* Create the ex
c470: 70 72 65 73 73 69 6f 6e 20 22 4f 4c 44 2e 7a 54  pression "OLD.zT
c480: 6f 43 6f 6c 20 3d 20 7a 46 72 6f 6d 43 6f 6c 22  oCol = zFromCol"
c490: 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  . It is importan
c4a0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
c4b0: 74 68 65 20 22 4f 4c 44 2e 7a 54 6f 43 6f 6c 22  the "OLD.zToCol"
c4c0: 20 74 65 72 6d 20 69 73 20 6f 6e 20 74 68 65 20   term is on the 
c4d0: 4c 48 53 20 6f 66 20 74 68 65 20 3d 20 6f 70 65  LHS of the = ope
c4e0: 72 61 74 6f 72 2c 20 73 6f 0a 20 20 20 20 20 20  rator, so.      
c4f0: 2a 2a 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ** that the affi
c500: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
c510: 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f  on sequence asso
c520: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
c530: 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
c540: 74 61 62 6c 65 20 61 72 65 20 75 73 65 64 20 66  table are used f
c550: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
c560: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 71 20  n. */.      pEq 
c570: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c580: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 0a 20 20  Parse, TK_EQ,.  
c590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
c5a0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c5b0: 44 4f 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  DOT, .          
c5c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
c5d0: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74  oc(db, TK_ID, &t
c5e0: 4f 6c 64 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  Old, 0),.       
c5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c600: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
c610: 20 26 74 54 6f 43 6f 6c 2c 20 30 29 29 2c 0a 20   &tToCol, 0)),. 
c620: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c630: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
c640: 5f 49 44 2c 20 26 74 46 72 6f 6d 43 6f 6c 2c 20  _ID, &tFromCol, 
c650: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
c660: 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
c670: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
c680: 68 65 72 65 2c 20 70 45 71 29 3b 0a 0a 20 20 20  here, pEq);..   
c690: 20 20 20 2f 2a 20 46 6f 72 20 4f 4e 20 55 50 44     /* For ON UPD
c6a0: 41 54 45 2c 20 63 6f 6e 73 74 72 75 63 74 20 74  ATE, construct t
c6b0: 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20  he next term of 
c6c0: 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65 2e  the WHEN clause.
c6d0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66 69  .      ** The fi
c6e0: 6e 61 6c 20 57 48 45 4e 20 63 6c 61 75 73 65 20  nal WHEN clause 
c6f0: 77 69 6c 6c 20 62 65 20 6c 69 6b 65 20 74 68 69  will be like thi
c700: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
c710: 20 20 2a 2a 20 20 20 20 57 48 45 4e 20 4e 4f 54    **    WHEN NOT
c720: 28 6f 6c 64 2e 63 6f 6c 31 20 49 53 20 6e 65 77  (old.col1 IS new
c730: 2e 63 6f 6c 31 20 41 4e 44 20 2e 2e 2e 20 41 4e  .col1 AND ... AN
c740: 44 20 6f 6c 64 2e 63 6f 6c 4e 20 49 53 20 6e 65  D old.colN IS ne
c750: 77 2e 63 6f 6c 4e 29 0a 20 20 20 20 20 20 2a 2f  w.colN).      */
c760: 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 61 6e  .      if( pChan
c770: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ges ){.        p
c780: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
c790: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 53 2c  r(pParse, TK_IS,
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
c7b0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c7c0: 2c 20 54 4b 5f 44 4f 54 2c 20 0a 20 20 20 20 20  , TK_DOT, .     
c7d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c7e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
c7f0: 5f 49 44 2c 20 26 74 4f 6c 64 2c 20 30 29 2c 0a  _ID, &tOld, 0),.
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c810: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c820: 62 2c 20 54 4b 5f 49 44 2c 20 26 74 54 6f 43 6f  b, TK_ID, &tToCo
c830: 6c 2c 20 30 29 29 2c 0a 20 20 20 20 20 20 20 20  l, 0)),.        
c840: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c850: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
c860: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c870: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
c880: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74 4e 65  (db, TK_ID, &tNe
c890: 77 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  w, 0),.         
c8a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c8b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
c8c0: 20 26 74 54 6f 43 6f 6c 2c 20 30 29 29 0a 20 20   &tToCol, 0)).  
c8d0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
c8e0: 20 20 20 20 20 70 57 68 65 6e 20 3d 20 73 71 6c       pWhen = sql
c8f0: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
c900: 70 57 68 65 6e 2c 20 70 45 71 29 3b 0a 20 20 20  pWhen, pEq);.   
c910: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
c920: 28 20 61 63 74 69 6f 6e 21 3d 4f 45 5f 52 65 73  ( action!=OE_Res
c930: 74 72 69 63 74 20 26 26 20 28 61 63 74 69 6f 6e  trict && (action
c940: 21 3d 4f 45 5f 43 61 73 63 61 64 65 20 7c 7c 20  !=OE_Cascade || 
c950: 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  pChanges) ){.   
c960: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
c970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74  .        if( act
c980: 69 6f 6e 3d 3d 4f 45 5f 43 61 73 63 61 64 65 20  ion==OE_Cascade 
c990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
c9a0: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
c9b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
c9c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
c9d0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c9e0: 62 2c 20 54 4b 5f 49 44 2c 20 26 74 4e 65 77 2c  b, TK_ID, &tNew,
c9f0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
ca00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
ca10: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74 54  c(db, TK_ID, &tT
ca20: 6f 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  oCol, 0));.     
ca30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 74     }else if( act
ca40: 69 6f 6e 3d 3d 4f 45 5f 53 65 74 44 66 6c 74 20  ion==OE_SetDflt 
ca50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
ca60: 72 20 2a 70 44 66 6c 74 20 3d 20 70 46 4b 65 79  r *pDflt = pFKey
ca70: 2d 3e 70 46 72 6f 6d 2d 3e 61 43 6f 6c 5b 69 46  ->pFrom->aCol[iF
ca80: 72 6f 6d 43 6f 6c 5d 2e 70 44 66 6c 74 3b 0a 20  romCol].pDflt;. 
ca90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 44 66           if( pDf
caa0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
cab0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
cac0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 44 66 6c  ExprDup(db, pDfl
cad0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
cae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
caf0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
cb00: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
cb10: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a  TK_NULL, 0, 0);.
cb20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb40: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
cb50: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
cb60: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b   TK_NULL, 0, 0);
cb70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cb80: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
cb90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
cba0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
cbb0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 73  pNew);.        s
cbc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
cbd0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4c  tName(pParse, pL
cbe0: 69 73 74 2c 20 26 74 46 72 6f 6d 43 6f 6c 2c 20  ist, &tFromCol, 
cbf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
cc00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
cc10: 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 29 3b 0a  ree(db, aiCol);.
cc20: 0a 20 20 20 20 7a 46 72 6f 6d 20 3d 20 70 46 4b  .    zFrom = pFK
cc30: 65 79 2d 3e 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  ey->pFrom->zName
cc40: 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 73 71  ;.    nFrom = sq
cc50: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
cc60: 72 6f 6d 29 3b 0a 0a 20 20 20 20 69 66 28 20 61  rom);..    if( a
cc70: 63 74 69 6f 6e 3d 3d 4f 45 5f 52 65 73 74 72 69  ction==OE_Restri
cc80: 63 74 20 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65  ct ){.      Toke
cc90: 6e 20 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20 45  n tFrom;.      E
cca0: 78 70 72 20 2a 70 52 61 69 73 65 3b 20 0a 0a 20  xpr *pRaise; .. 
ccb0: 20 20 20 20 20 74 46 72 6f 6d 2e 7a 20 3d 20 7a       tFrom.z = z
ccc0: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 74 46 72 6f  From;.      tFro
ccd0: 6d 2e 6e 20 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20  m.n = nFrom;.   
cce0: 20 20 20 70 52 61 69 73 65 20 3d 20 73 71 6c 69     pRaise = sqli
ccf0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 52  te3Expr(db, TK_R
cd00: 41 49 53 45 2c 20 22 46 4f 52 45 49 47 4e 20 4b  AISE, "FOREIGN K
cd10: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
cd20: 69 6c 65 64 22 29 3b 0a 20 20 20 20 20 20 69 66  iled");.      if
cd30: 28 20 70 52 61 69 73 65 20 29 7b 0a 20 20 20 20  ( pRaise ){.    
cd40: 20 20 20 20 70 52 61 69 73 65 2d 3e 61 66 66 69      pRaise->affi
cd50: 6e 69 74 79 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  nity = OE_Abort;
cd60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cd70: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
cd80: 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65  SelectNew(pParse
cd90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
cda0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
cdb0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70 52  nd(pParse, 0, pR
cdc0: 61 69 73 65 29 2c 0a 20 20 20 20 20 20 20 20 20  aise),.         
cdd0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
cde0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
cdf0: 20 26 74 46 72 6f 6d 2c 20 30 29 2c 0a 20 20 20   &tFrom, 0),.   
ce00: 20 20 20 20 20 20 20 70 57 68 65 72 65 2c 0a 20         pWhere,. 
ce10: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
ce20: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
ce30: 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
ce40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ce50: 44 69 73 61 62 6c 65 20 6c 6f 6f 6b 61 73 69 64  Disable lookasid
ce60: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
ce70: 69 6f 6e 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6c  ion */.    db->l
ce80: 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
ce90: 65 2b 2b 3b 0a 0a 20 20 20 20 70 54 72 69 67 67  e++;..    pTrigg
cea0: 65 72 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  er = (Trigger *)
ceb0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cec0: 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ero(db, .       
ced0: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 29   sizeof(Trigger)
cee0: 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74   +         /* st
cef0: 72 75 63 74 20 54 72 69 67 67 65 72 20 2a 2f 0a  ruct Trigger */.
cf00: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 54          sizeof(T
cf10: 72 69 67 67 65 72 53 74 65 70 29 20 2b 20 20 20  riggerStep) +   
cf20: 20 20 2f 2a 20 53 69 6e 67 6c 65 20 73 74 65 70    /* Single step
cf30: 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67   in trigger prog
cf40: 72 61 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ram */.        n
cf50: 46 72 6f 6d 20 2b 20 31 20 20 20 20 20 20 20 20  From + 1        
cf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
cf70: 65 20 66 6f 72 20 70 53 74 65 70 2d 3e 7a 54 61  e for pStep->zTa
cf80: 72 67 65 74 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  rget */.    );. 
cf90: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20     if( pTrigger 
cfa0: 29 7b 0a 20 20 20 20 20 20 70 53 74 65 70 20 3d  ){.      pStep =
cfb0: 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f   pTrigger->step_
cfc0: 6c 69 73 74 20 3d 20 28 54 72 69 67 67 65 72 53  list = (TriggerS
cfd0: 74 65 70 20 2a 29 26 70 54 72 69 67 67 65 72 5b  tep *)&pTrigger[
cfe0: 31 5d 3b 0a 20 20 20 20 20 20 70 53 74 65 70 2d  1];.      pStep-
cff0: 3e 7a 54 61 72 67 65 74 20 3d 20 28 63 68 61 72  >zTarget = (char
d000: 20 2a 29 26 70 53 74 65 70 5b 31 5d 3b 0a 20 20   *)&pStep[1];.  
d010: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
d020: 20 2a 29 70 53 74 65 70 2d 3e 7a 54 61 72 67 65   *)pStep->zTarge
d030: 74 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29  t, zFrom, nFrom)
d040: 3b 0a 20 20 0a 20 20 20 20 20 20 70 53 74 65 70  ;.  .      pStep
d050: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
d060: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
d070: 68 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45  here, EXPRDUP_RE
d080: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 70 53 74  DUCE);.      pSt
d090: 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20  ep->pExprList = 
d0a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d0b0: 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 45 58  up(db, pList, EX
d0c0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
d0d0: 20 20 20 20 20 70 53 74 65 70 2d 3e 70 53 65 6c       pStep->pSel
d0e0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
d0f0: 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65  ectDup(db, pSele
d100: 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ct, EXPRDUP_REDU
d110: 43 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  CE);.      if( p
d120: 57 68 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  When ){.        
d130: 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 50  pWhen = sqlite3P
d140: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
d150: 4e 4f 54 2c 20 70 57 68 65 6e 2c 20 30 29 3b 0a  NOT, pWhen, 0);.
d160: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
d170: 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65  ->pWhen = sqlite
d180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
d190: 65 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  en, EXPRDUP_REDU
d1a0: 43 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CE);.      }.   
d1b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 2d 65 6e   }..    /* Re-en
d1c0: 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
d1d0: 64 65 20 62 75 66 66 65 72 2c 20 69 66 20 69 74  de buffer, if it
d1e0: 20 77 61 73 20 64 69 73 61 62 6c 65 64 20 65 61   was disabled ea
d1f0: 72 6c 69 65 72 2e 20 2a 2f 0a 20 20 20 20 64 62  rlier. */.    db
d200: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
d210: 61 62 6c 65 2d 2d 3b 0a 0a 20 20 20 20 73 71 6c  able--;..    sql
d220: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d230: 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  b, pWhere);.    
d240: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d250: 65 28 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20  e(db, pWhen);.  
d260: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
d270: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
d280: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
d290: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d2a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
d2b0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d2c0: 65 64 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66  ed==1 ){.      f
d2d0: 6b 54 72 69 67 67 65 72 44 65 6c 65 74 65 28 64  kTriggerDelete(d
d2e0: 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  b, pTrigger);.  
d2f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d300: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d310: 70 53 74 65 70 21 3d 30 20 29 3b 0a 0a 20 20 20  pStep!=0 );..   
d320: 20 73 77 69 74 63 68 28 20 61 63 74 69 6f 6e 20   switch( action 
d330: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  ){.      case OE
d340: 5f 52 65 73 74 72 69 63 74 3a 0a 20 20 20 20 20  _Restrict:.     
d350: 20 20 20 70 53 74 65 70 2d 3e 6f 70 20 3d 20 54     pStep->op = T
d360: 4b 5f 53 45 4c 45 43 54 3b 20 0a 20 20 20 20 20  K_SELECT; .     
d370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d380: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
d390: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70   .        if( !p
d3a0: 43 68 61 6e 67 65 73 20 29 7b 20 0a 20 20 20 20  Changes ){ .    
d3b0: 20 20 20 20 20 20 70 53 74 65 70 2d 3e 6f 70 20        pStep->op 
d3c0: 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 20 0a 20 20  = TK_DELETE; .  
d3d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a          break; .
d3e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d3f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
d400: 20 70 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f   pStep->op = TK_
d410: 55 50 44 41 54 45 3b 0a 20 20 20 20 7d 0a 20 20  UPDATE;.    }.  
d420: 20 20 70 53 74 65 70 2d 3e 70 54 72 69 67 20 3d    pStep->pTrig =
d430: 20 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70   pTrigger;.    p
d440: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
d450: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
d460: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e  ;.    pTrigger->
d470: 70 54 61 62 53 63 68 65 6d 61 20 3d 20 70 54 61  pTabSchema = pTa
d480: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
d490: 70 46 4b 65 79 2d 3e 61 70 54 72 69 67 67 65 72  pFKey->apTrigger
d4a0: 5b 69 41 63 74 69 6f 6e 5d 20 3d 20 70 54 72 69  [iAction] = pTri
d4b0: 67 67 65 72 3b 0a 20 20 20 20 70 54 72 69 67 67  gger;.    pTrigg
d4c0: 65 72 2d 3e 6f 70 20 3d 20 28 70 43 68 61 6e 67  er->op = (pChang
d4d0: 65 73 20 3f 20 54 4b 5f 55 50 44 41 54 45 20 3a  es ? TK_UPDATE :
d4e0: 20 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7d   TK_DELETE);.  }
d4f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ..  return pTrig
d500: 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ger;.}../*.** Th
d510: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d520: 61 6c 6c 65 64 20 77 68 65 6e 20 64 65 6c 65 74  alled when delet
d530: 69 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67 20  ing or updating 
d540: 61 20 72 6f 77 20 74 6f 20 69 6d 70 6c 65 6d 65  a row to impleme
d550: 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 71 75 69 72  nt.** any requir
d560: 65 64 20 43 41 53 43 41 44 45 2c 20 53 45 54 20  ed CASCADE, SET 
d570: 4e 55 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41  NULL or SET DEFA
d580: 55 4c 54 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ULT actions..*/.
d590: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 6b 41 63  void sqlite3FkAc
d5a0: 74 69 6f 6e 73 28 0a 20 20 50 61 72 73 65 20 2a  tions(.  Parse *
d5b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d5d0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
d5e0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d600: 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70  * Table being up
d610: 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  dated or deleted
d620: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 4c   from */.  ExprL
d630: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
d640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
d650: 61 6e 67 65 2d 6c 69 73 74 20 66 6f 72 20 55 50  ange-list for UP
d660: 44 41 54 45 2c 20 4e 55 4c 4c 20 66 6f 72 20 44  DATE, NULL for D
d670: 45 4c 45 54 45 20 2a 2f 0a 20 20 69 6e 74 20 72  ELETE */.  int r
d680: 65 67 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20  egOld,          
d690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d6a0: 64 72 65 73 73 20 6f 66 20 61 72 72 61 79 20 63  dress of array c
d6b0: 6f 6e 74 61 69 6e 69 6e 67 20 6f 6c 64 20 72 6f  ontaining old ro
d6c0: 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 68 61  w */.  int *aCha
d6d0: 6e 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  nge,            
d6e0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
d6f0: 69 6e 64 69 63 61 74 69 6e 67 20 55 50 44 41 54  indicating UPDAT
d700: 45 64 20 63 6f 6c 75 6d 6e 73 20 28 6f 72 20 30  Ed columns (or 0
d710: 29 20 2a 2f 0a 20 20 69 6e 74 20 62 43 68 6e 67  ) */.  int bChng
d720: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
d730: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
d740: 66 20 72 6f 77 69 64 20 69 73 20 55 50 44 41 54  f rowid is UPDAT
d750: 45 64 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  Ed */.){.  /* If
d760: 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 73 75 70   foreign-key sup
d770: 70 6f 72 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  port is enabled,
d780: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
d790: 20 61 6c 6c 20 46 4b 73 20 74 68 61 74 20 0a 20   all FKs that . 
d7a0: 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 61 62   ** refer to tab
d7b0: 6c 65 20 70 54 61 62 2e 20 49 66 20 74 68 65 72  le pTab. If ther
d7c0: 65 20 69 73 20 61 6e 20 61 63 74 69 6f 6e 20 61  e is an action a
d7d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d7e0: 68 65 20 46 4b 20 0a 20 20 2a 2a 20 66 6f 72 20  he FK .  ** for 
d7f0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 28  this operation (
d800: 65 69 74 68 65 72 20 75 70 64 61 74 65 20 6f 72  either update or
d810: 20 64 65 6c 65 74 65 29 2c 20 69 6e 76 6f 6b 65   delete), invoke
d820: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
d830: 0a 20 20 2a 2a 20 74 72 69 67 67 65 72 20 73 75  .  ** trigger su
d840: 62 2d 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20  b-program.  */. 
d850: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
d860: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f  >flags&SQLITE_Fo
d870: 72 65 69 67 6e 4b 65 79 73 20 29 7b 0a 20 20 20  reignKeys ){.   
d880: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 20 20   FKey *pFKey;   
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8a0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
d8b0: 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ble */.    for(p
d8c0: 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 46 6b  FKey = sqlite3Fk
d8d0: 52 65 66 65 72 65 6e 63 65 73 28 70 54 61 62 29  References(pTab)
d8e0: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
d8f0: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 29 7b 0a  FKey->pNextTo){.
d900: 20 20 20 20 20 20 69 66 28 20 61 43 68 61 6e 67        if( aChang
d910: 65 3d 3d 30 20 7c 7c 20 66 6b 50 61 72 65 6e 74  e==0 || fkParent
d920: 49 73 4d 6f 64 69 66 69 65 64 28 70 54 61 62 2c  IsModified(pTab,
d930: 20 70 46 4b 65 79 2c 20 61 43 68 61 6e 67 65 2c   pFKey, aChange,
d940: 20 62 43 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a   bChngRowid) ){.
d950: 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20          Trigger 
d960: 2a 70 41 63 74 20 3d 20 66 6b 41 63 74 69 6f 6e  *pAct = fkAction
d970: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
d980: 70 54 61 62 2c 20 70 46 4b 65 79 2c 20 70 43 68  pTab, pFKey, pCh
d990: 61 6e 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20  anges);.        
d9a0: 69 66 28 20 70 41 63 74 20 29 7b 0a 20 20 20 20  if( pAct ){.    
d9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
d9c0: 65 52 6f 77 54 72 69 67 67 65 72 44 69 72 65 63  eRowTriggerDirec
d9d0: 74 28 70 50 61 72 73 65 2c 20 70 41 63 74 2c 20  t(pParse, pAct, 
d9e0: 70 54 61 62 2c 20 72 65 67 4f 6c 64 2c 20 4f 45  pTab, regOld, OE
d9f0: 5f 41 62 6f 72 74 2c 20 30 29 3b 0a 20 20 20 20  _Abort, 0);.    
da00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
da10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
da20: 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
da30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
da40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  */../*.** Free a
da50: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
da60: 61 74 65 64 20 77 69 74 68 20 66 6f 72 65 69 67  ated with foreig
da70: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
da80: 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a  s attached to.**
da90: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 52 65 6d   table pTab. Rem
daa0: 6f 76 65 20 74 68 65 20 64 65 6c 65 74 65 64 20  ove the deleted 
dab0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f  foreign keys fro
dac0: 6d 20 74 68 65 20 53 63 68 65 6d 61 2e 66 6b 65  m the Schema.fke
dad0: 79 48 61 73 68 0a 2a 2a 20 68 61 73 68 20 74 61  yHash.** hash ta
dae0: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
daf0: 69 74 65 33 46 6b 44 65 6c 65 74 65 28 73 71 6c  ite3FkDelete(sql
db00: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
db10: 2a 70 54 61 62 29 7b 0a 20 20 46 4b 65 79 20 2a  *pTab){.  FKey *
db20: 70 46 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  pFKey;          
db30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
db40: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
db50: 2f 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 3b  /.  FKey *pNext;
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
db80: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
db90: 2a 2f 0a 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d  */..  for(pFKey=
dba0: 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  pTab->pFKey; pFK
dbb0: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 29  ey; pFKey=pNext)
dbc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
dbd0: 3d 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ==0 || IsVirtual
dbe0: 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 20 20  (pTab).         
dbf0: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
dc00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
dc10: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20   pTab->pSchema) 
dc20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  );..    /* Remov
dc30: 65 20 74 68 65 20 46 4b 20 66 72 6f 6d 20 74 68  e the FK from th
dc40: 65 20 66 6b 65 79 48 61 73 68 20 68 61 73 68 20  e fkeyHash hash 
dc50: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66  table. */.    if
dc60: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
dc70: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
dc80: 20 20 20 20 20 20 69 66 28 20 70 46 4b 65 79 2d        if( pFKey-
dc90: 3e 70 50 72 65 76 54 6f 20 29 7b 0a 20 20 20 20  >pPrevTo ){.    
dca0: 20 20 20 20 70 46 4b 65 79 2d 3e 70 50 72 65 76      pFKey->pPrev
dcb0: 54 6f 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  To->pNextTo = pF
dcc0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  Key->pNextTo;.  
dcd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dce0: 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f     void *p = (vo
dcf0: 69 64 20 2a 29 70 46 4b 65 79 2d 3e 70 4e 65 78  id *)pFKey->pNex
dd00: 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  tTo;.        con
dd10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 20  st char *z = (p 
dd20: 3f 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f  ? pFKey->pNextTo
dd30: 2d 3e 7a 54 6f 20 3a 20 70 46 4b 65 79 2d 3e 7a  ->zTo : pFKey->z
dd40: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  To);.        sql
dd50: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
dd60: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  pTab->pSchema->f
dd70: 6b 65 79 48 61 73 68 2c 20 7a 2c 20 70 29 3b 0a  keyHash, z, p);.
dd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dd90: 28 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f  ( pFKey->pNextTo
dda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 4b 65   ){.        pFKe
ddb0: 79 2d 3e 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  y->pNextTo->pPre
ddc0: 76 54 6f 20 3d 20 70 46 4b 65 79 2d 3e 70 50 72  vTo = pFKey->pPr
ddd0: 65 76 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  evTo;.      }.  
dde0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 3a 20    }..    /* EV: 
ddf0: 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 45 61  R-30323-21917 Ea
de00: 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
de10: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53 51 4c  onstraint in SQL
de20: 69 74 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6c  ite is.    ** cl
de30: 61 73 73 69 66 69 65 64 20 61 73 20 65 69 74 68  assified as eith
de40: 65 72 20 69 6d 6d 65 64 69 61 74 65 20 6f 72 20  er immediate or 
de50: 64 65 66 65 72 72 65 64 2e 0a 20 20 20 20 2a 2f  deferred..    */
de60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 4b  .    assert( pFK
de70: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 3d 3d  ey->isDeferred==
de80: 30 20 7c 7c 20 70 46 4b 65 79 2d 3e 69 73 44 65  0 || pFKey->isDe
de90: 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a 0a 20 20  ferred==1 );..  
dea0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
deb0: 74 72 69 67 67 65 72 73 20 63 72 65 61 74 65 64  triggers created
dec0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 63   to implement ac
ded0: 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 46  tions for this F
dee0: 4b 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  K. */.#ifndef SQ
def0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
df00: 52 0a 20 20 20 20 66 6b 54 72 69 67 67 65 72 44  R.    fkTriggerD
df10: 65 6c 65 74 65 28 64 62 2c 20 70 46 4b 65 79 2d  elete(db, pFKey-
df20: 3e 61 70 54 72 69 67 67 65 72 5b 30 5d 29 3b 0a  >apTrigger[0]);.
df30: 20 20 20 20 66 6b 54 72 69 67 67 65 72 44 65 6c      fkTriggerDel
df40: 65 74 65 28 64 62 2c 20 70 46 4b 65 79 2d 3e 61  ete(db, pFKey->a
df50: 70 54 72 69 67 67 65 72 5b 31 5d 29 3b 0a 23 65  pTrigger[1]);.#e
df60: 6e 64 69 66 0a 0a 20 20 20 20 70 4e 65 78 74 20  ndif..    pNext 
df70: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
df80: 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  om;.    sqlite3D
df90: 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
dfa0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
dfb0: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
dfc0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
dfd0: 20 2a 2f 0a                                       */.