/ Hex Artifact Content
Login

Artifact 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33:


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: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
6240: 70 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pEq);.  }..  /* 
6250: 49 66 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  If the child tab
6260: 6c 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  le is the same a
6270: 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  s the parent tab
6280: 6c 65 2c 20 74 68 65 6e 20 61 64 64 20 74 65 72  le, then add ter
6290: 6d 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  ms.  ** to the W
62a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
62b0: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 65 6e   prevent this en
62c0: 74 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 73  try from being s
62d0: 63 61 6e 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 65  canned..  ** The
62e0: 20 61 64 64 65 64 20 57 48 45 52 45 20 63 6c 61   added WHERE cla
62f0: 75 73 65 20 74 65 72 6d 73 20 61 72 65 20 6c 69  use terms are li
6300: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
6310: 2a 2a 20 20 20 20 20 24 63 75 72 72 65 6e 74 5f  **     $current_
6320: 72 6f 77 69 64 21 3d 72 6f 77 69 64 0a 20 20 2a  rowid!=rowid.  *
6330: 2a 20 20 20 20 20 4e 4f 54 28 20 24 63 75 72 72  *     NOT( $curr
6340: 65 6e 74 5f 61 3d 3d 61 20 41 4e 44 20 24 63 75  ent_a==a AND $cu
6350: 72 72 65 6e 74 5f 62 3d 3d 62 20 41 4e 44 20 2e  rrent_b==b AND .
6360: 2e 2e 20 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  .. ).  **.  ** T
6370: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
6380: 20 75 73 65 64 20 66 6f 72 20 72 6f 77 69 64 20   used for rowid 
6390: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 73 65 63  tables.  The sec
63a0: 6f 6e 64 20 66 6f 72 6d 20 69 73 20 75 73 65 64  ond form is used
63b0: 0a 20 20 2a 2a 20 66 6f 72 20 57 49 54 48 4f 55  .  ** for WITHOU
63c0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 20  T ROWID tables. 
63d0: 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  In the second fo
63e0: 72 6d 2c 20 74 68 65 20 2a 70 61 72 65 6e 74 2a  rm, the *parent*
63f0: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 28 61 2c   key is.  ** (a,
6400: 62 2c 2e 2e 2e 29 2e 20 45 69 74 68 65 72 20 74  b,...). Either t
6410: 68 65 20 70 61 72 65 6e 74 20 6f 72 20 70 72 69  he parent or pri
6420: 6d 61 72 79 20 6b 65 79 20 63 6f 75 6c 64 20 62  mary key could b
6430: 65 20 75 73 65 64 20 74 6f 20 0a 20 20 2a 2a 20  e used to .  ** 
6440: 75 6e 69 71 75 65 6c 79 20 69 64 65 6e 74 69 66  uniquely identif
6450: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  y the current ro
6460: 77 2c 20 62 75 74 20 74 68 65 20 70 61 72 65 6e  w, but the paren
6470: 74 20 6b 65 79 20 69 73 20 6d 6f 72 65 20 63 6f  t key is more co
6480: 6e 76 65 6e 69 65 6e 74 0a 20 20 2a 2a 20 61 73  nvenient.  ** as
6490: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
64a0: 6c 75 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  lues have alread
64b0: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e  y been loaded in
64c0: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a  to registers.  *
64d0: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
64e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
64f0: 3d 3d 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 26  ==pFKey->pFrom &
6500: 26 20 6e 49 6e 63 72 3e 30 20 29 7b 0a 20 20 20  & nIncr>0 ){.   
6510: 20 45 78 70 72 20 2a 70 4e 65 3b 20 20 20 20 20   Expr *pNe;     
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6530: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 28 70 4c  * Expression (pL
6540: 65 66 74 20 21 3d 20 70 52 69 67 68 74 29 20 2a  eft != pRight) *
6550: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  /.    Expr *pLef
6560: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6570: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 72 6f      /* Value fro
6580: 6d 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 72  m parent table r
6590: 6f 77 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  ow */.    Expr *
65a0: 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
65b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
65c0: 6e 20 72 65 66 20 74 6f 20 63 68 69 6c 64 20 74  n ref to child t
65d0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  able */.    if( 
65e0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
65f0: 7b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  {.      pLeft = 
6600: 65 78 70 72 54 61 62 6c 65 52 65 67 69 73 74 65  exprTableRegiste
6610: 72 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  r(pParse, pTab, 
6620: 72 65 67 44 61 74 61 2c 20 2d 31 29 3b 0a 20 20  regData, -1);.  
6630: 20 20 20 20 70 52 69 67 68 74 20 3d 20 65 78 70      pRight = exp
6640: 72 54 61 62 6c 65 43 6f 6c 75 6d 6e 28 64 62 2c  rTableColumn(db,
6650: 20 70 54 61 62 2c 20 70 53 72 63 2d 3e 61 5b 30   pTab, pSrc->a[0
6660: 5d 2e 69 43 75 72 73 6f 72 2c 20 2d 31 29 3b 0a  ].iCursor, -1);.
6670: 20 20 20 20 20 20 70 4e 65 20 3d 20 73 71 6c 69        pNe = sqli
6680: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
6690: 20 54 4b 5f 4e 45 2c 20 70 4c 65 66 74 2c 20 70   TK_NE, pLeft, p
66a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Right);.    }els
66b0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
66c0: 45 71 2c 20 2a 70 41 6c 6c 20 3d 20 30 3b 0a 20  Eq, *pAll = 0;. 
66d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
66e0: 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  x!=0 );.      fo
66f0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6700: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
6710: 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d        i16 iCol =
6720: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6730: 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  i];.        asse
6740: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
6750: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 65         pLeft = e
6760: 78 70 72 54 61 62 6c 65 52 65 67 69 73 74 65 72  xprTableRegister
6770: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 72  (pParse, pTab, r
6780: 65 67 44 61 74 61 2c 20 69 43 6f 6c 29 3b 0a 20  egData, iCol);. 
6790: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
67a0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
67b0: 54 4b 5f 49 44 2c 20 70 54 61 62 2d 3e 61 43 6f  TK_ID, pTab->aCo
67c0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a  l[iCol].zName);.
67d0: 20 20 20 20 20 20 20 20 70 45 71 20 3d 20 73 71          pEq = sq
67e0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
67f0: 65 2c 20 54 4b 5f 49 53 2c 20 70 4c 65 66 74 2c  e, TK_IS, pLeft,
6800: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
6810: 20 20 70 41 6c 6c 20 3d 20 73 71 6c 69 74 65 33    pAll = sqlite3
6820: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20  ExprAnd(pParse, 
6830: 70 41 6c 6c 2c 20 70 45 71 29 3b 0a 20 20 20 20  pAll, pEq);.    
6840: 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 20 3d 20    }.      pNe = 
6850: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6860: 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 70 41 6c  rse, TK_NOT, pAl
6870: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
6880: 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
6890: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c  3ExprAnd(pParse,
68a0: 20 70 57 68 65 72 65 2c 20 70 4e 65 29 3b 0a 20   pWhere, pNe);. 
68b0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
68c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 73 20   the references 
68d0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
68e0: 75 73 65 2e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  use. */.  memset
68f0: 28 26 73 4e 61 6d 65 43 6f 6e 74 65 78 74 2c 20  (&sNameContext, 
6900: 30 2c 20 73 69 7a 65 6f 66 28 4e 61 6d 65 43 6f  0, sizeof(NameCo
6910: 6e 74 65 78 74 29 29 3b 0a 20 20 73 4e 61 6d 65  ntext));.  sName
6920: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
6930: 20 3d 20 70 53 72 63 3b 0a 20 20 73 4e 61 6d 65   = pSrc;.  sName
6940: 43 6f 6e 74 65 78 74 2e 70 50 61 72 73 65 20 3d  Context.pParse =
6950: 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
6960: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
6970: 65 73 28 26 73 4e 61 6d 65 43 6f 6e 74 65 78 74  es(&sNameContext
6980: 2c 20 70 57 68 65 72 65 29 3b 0a 0a 20 20 2f 2a  , pWhere);..  /*
6990: 20 43 72 65 61 74 65 20 56 44 42 45 20 74 6f 20   Create VDBE to 
69a0: 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  loop through the
69b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 70 53 72 63   entries in pSrc
69c0: 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
69d0: 57 48 45 52 45 0a 20 20 2a 2a 20 63 6c 61 75 73  WHERE.  ** claus
69e0: 65 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  e. For each row 
69f0: 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  found, increment
6a00: 20 65 69 74 68 65 72 20 74 68 65 20 64 65 66 65   either the defe
6a10: 72 72 65 64 20 6f 72 20 69 6d 6d 65 64 69 61 74  rred or immediat
6a20: 65 0a 20 20 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  e.  ** foreign k
6a30: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ey constraint co
6a40: 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  unter. */.  if( 
6a50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
6a60: 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  ){.    pWInfo = 
6a70: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
6a80: 6e 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  n(pParse, pSrc, 
6a90: 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20 30 2c  pWhere, 0, 0, 0,
6aa0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6ab0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6ac0: 5f 46 6b 43 6f 75 6e 74 65 72 2c 20 70 46 4b 65  _FkCounter, pFKe
6ad0: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 2c 20 6e  y->isDeferred, n
6ae0: 49 6e 63 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Incr);.    if( p
6af0: 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 73  WInfo ){.      s
6b00: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
6b10: 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
6b20: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
6b30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6b40: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 61 62  e constructed ab
6b50: 6f 76 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ove. */.  sqlite
6b60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6b70: 70 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 69  pWhere);.  if( i
6b80: 46 6b 49 66 5a 65 72 6f 20 29 7b 0a 20 20 20 20  FkIfZero ){.    
6b90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6ba0: 65 72 65 28 76 2c 20 69 46 6b 49 66 5a 65 72 6f  ere(v, iFkIfZero
6bb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6bc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
6bd0: 74 75 72 6e 73 20 61 20 6c 69 6e 6b 65 64 20 6c  turns a linked l
6be0: 69 73 74 20 6f 66 20 46 4b 65 79 20 6f 62 6a 65  ist of FKey obje
6bf0: 63 74 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  cts (connected b
6c00: 79 0a 2a 2a 20 46 4b 65 79 2e 70 4e 65 78 74 54  y.** FKey.pNextT
6c10: 6f 29 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 63  o) holding all c
6c20: 68 69 6c 64 72 65 6e 20 6f 66 20 74 61 62 6c 65  hildren of table
6c30: 20 70 54 61 62 2e 20 20 46 6f 72 20 65 78 61 6d   pTab.  For exam
6c40: 70 6c 65 2c 0a 2a 2a 20 67 69 76 65 6e 20 74 68  ple,.** given th
6c50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 68 65  e following sche
6c60: 6d 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ma:.**.**   CREA
6c70: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
6c80: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 2a 2a 20 20  IMARY KEY);.**  
6c90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
6ca0: 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  (b REFERENCES t1
6cb0: 28 61 29 3b 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  (a);.**.** Calli
6cc0: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
6cd0: 20 77 69 74 68 20 74 61 62 6c 65 20 22 74 31 22   with table "t1"
6ce0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
6cf0: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
6d00: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 46 4b 65 79  r.** to the FKey
6d10: 20 73 74 72 75 63 74 75 72 65 20 72 65 70 72 65   structure repre
6d20: 73 65 6e 74 69 6e 67 20 74 68 65 20 66 6f 72 65  senting the fore
6d30: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
6d40: 6e 74 20 6f 6e 20 74 61 62 6c 65 0a 2a 2a 20 22  nt on table.** "
6d50: 74 32 22 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69  t2". Calling thi
6d60: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
6d70: 22 74 32 22 20 61 73 20 74 68 65 20 61 72 67 75  "t2" as the argu
6d80: 6d 65 6e 74 20 77 6f 75 6c 64 20 72 65 74 75 72  ment would retur
6d90: 6e 20 61 0a 2a 2a 20 4e 55 4c 4c 20 70 6f 69 6e  n a.** NULL poin
6da0: 74 65 72 20 28 61 73 20 74 68 65 72 65 20 61 72  ter (as there ar
6db0: 65 20 6e 6f 20 46 4b 20 63 6f 6e 73 74 72 61 69  e no FK constrai
6dc0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 32  nts for which t2
6dd0: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 0a 2a   is the parent.*
6de0: 2a 20 74 61 62 6c 65 29 2e 0a 2a 2f 0a 46 4b 65  * table)..*/.FKe
6df0: 79 20 2a 73 71 6c 69 74 65 33 46 6b 52 65 66 65  y *sqlite3FkRefe
6e00: 72 65 6e 63 65 73 28 54 61 62 6c 65 20 2a 70 54  rences(Table *pT
6e10: 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 46  ab){.  return (F
6e20: 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
6e30: 68 46 69 6e 64 28 26 70 54 61 62 2d 3e 70 53 63  hFind(&pTab->pSc
6e40: 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20  hema->fkeyHash, 
6e50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 7d 0a  pTab->zName);.}.
6e60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
6e70: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
6e80: 54 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72  Trigger structur
6e90: 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  e allocated by t
6ea0: 68 65 20 0a 2a 2a 20 66 6b 41 63 74 69 6f 6e 54  he .** fkActionT
6eb0: 72 69 67 67 65 72 28 29 20 72 6f 75 74 69 6e 65  rigger() routine
6ec0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
6ed0: 64 65 6c 65 74 65 73 20 74 68 65 20 54 72 69 67  deletes the Trig
6ee0: 67 65 72 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ger structure.**
6ef0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
6f00: 73 75 62 2d 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a  sub-components..
6f10: 2a 2a 0a 2a 2a 20 54 68 65 20 54 72 69 67 67 65  **.** The Trigge
6f20: 72 20 73 74 72 75 63 74 75 72 65 20 6f 72 20 61  r structure or a
6f30: 6e 79 20 6f 66 20 69 74 73 20 73 75 62 2d 63 6f  ny of its sub-co
6f40: 6d 70 6f 6e 65 6e 74 73 20 6d 61 79 20 62 65 20  mponents may be 
6f50: 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 0a 2a  allocated from.*
6f60: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
6f70: 62 75 66 66 65 72 20 62 65 6c 6f 6e 67 69 6e 67  buffer belonging
6f80: 20 74 6f 20 64 61 74 61 62 61 73 65 20 68 61 6e   to database han
6f90: 64 6c 65 20 64 62 4d 65 6d 2e 0a 2a 2f 0a 73 74  dle dbMem..*/.st
6fa0: 61 74 69 63 20 76 6f 69 64 20 66 6b 54 72 69 67  atic void fkTrig
6fb0: 67 65 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  gerDelete(sqlite
6fc0: 33 20 2a 64 62 4d 65 6d 2c 20 54 72 69 67 67 65  3 *dbMem, Trigge
6fd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  r *p){.  if( p )
6fe0: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65  {.    TriggerSte
6ff0: 70 20 2a 70 53 74 65 70 20 3d 20 70 2d 3e 73 74  p *pStep = p->st
7000: 65 70 5f 6c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ep_list;.    sql
7010: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7020: 62 4d 65 6d 2c 20 70 53 74 65 70 2d 3e 70 57 68  bMem, pStep->pWh
7030: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
7040: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7050: 64 62 4d 65 6d 2c 20 70 53 74 65 70 2d 3e 70 45  dbMem, pStep->pE
7060: 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  xprList);.    sq
7070: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7080: 65 28 64 62 4d 65 6d 2c 20 70 53 74 65 70 2d 3e  e(dbMem, pStep->
7090: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
70a0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
70b0: 64 62 4d 65 6d 2c 20 70 2d 3e 70 57 68 65 6e 29  dbMem, p->pWhen)
70c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
70d0: 72 65 65 28 64 62 4d 65 6d 2c 20 70 29 3b 0a 20  ree(dbMem, p);. 
70e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
70f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7100: 6c 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  led to generate 
7110: 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
7120: 68 65 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69  hen table pTab i
7130: 73 0a 2a 2a 20 62 65 69 6e 67 20 64 72 6f 70 70  s.** being dropp
7140: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
7150: 62 61 73 65 2e 20 54 68 65 20 53 72 63 4c 69 73  base. The SrcLis
7160: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
7170: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
7180: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
7190: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ion contains a s
71a0: 69 6e 67 6c 65 20 65 6e 74 72 79 20 67 75 61 72  ingle entry guar
71b0: 61 6e 74 65 65 64 20 74 6f 20 72 65 73 6f 6c 76  anteed to resolv
71c0: 65 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 70 54  e to.** table pT
71d0: 61 62 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ab..**.** Normal
71e0: 6c 79 2c 20 6e 6f 20 63 6f 64 65 20 69 73 20 72  ly, no code is r
71f0: 65 71 75 69 72 65 64 2e 20 48 6f 77 65 76 65 72  equired. However
7200: 2c 20 69 66 20 65 69 74 68 65 72 0a 2a 2a 0a 2a  , if either.**.*
7210: 2a 20 20 20 28 61 29 20 54 68 65 20 74 61 62 6c  *   (a) The tabl
7220: 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  e is the parent 
7230: 74 61 62 6c 65 20 6f 66 20 61 20 46 4b 20 63 6f  table of a FK co
7240: 6e 73 74 72 61 69 6e 74 2c 20 6f 72 0a 2a 2a 20  nstraint, or.** 
7250: 20 20 28 62 29 20 54 68 65 20 74 61 62 6c 65 20    (b) The table 
7260: 69 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  is the child tab
7270: 6c 65 20 6f 66 20 61 20 64 65 66 65 72 72 65 64  le of a deferred
7280: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   FK constraint a
7290: 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  nd it is.**     
72a0: 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
72b0: 72 75 6e 74 69 6d 65 20 74 68 61 74 20 74 68 65  runtime that the
72c0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
72d0: 6e 67 20 64 65 66 65 72 72 65 64 20 46 4b 20 0a  ng deferred FK .
72e0: 2a 2a 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61  **       constra
72f0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 69  int violations i
7300: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  n the database,.
7310: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65  **.** then the e
7320: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 22 44 45  quivalent of "DE
7330: 4c 45 54 45 20 46 52 4f 4d 20 3c 74 62 6c 3e 22  LETE FROM <tbl>"
7340: 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66   is executed bef
7350: 6f 72 65 20 64 72 6f 70 70 69 6e 67 0a 2a 2a 20  ore dropping.** 
7360: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
7370: 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 72 69  he database. Tri
7380: 67 67 65 72 73 20 61 72 65 20 64 69 73 61 62 6c  ggers are disabl
7390: 65 64 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  ed while running
73a0: 20 74 68 69 73 0a 2a 2a 20 44 45 4c 45 54 45 2c   this.** DELETE,
73b0: 20 62 75 74 20 66 6f 72 65 69 67 6e 20 6b 65 79   but foreign key
73c0: 20 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74   actions are not
73d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
73e0: 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 50 61 72  3FkDropTable(Par
73f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
7400: 69 73 74 20 2a 70 4e 61 6d 65 2c 20 54 61 62 6c  ist *pName, Tabl
7410: 65 20 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c 69  e *pTab){.  sqli
7420: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7430: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 62 2d  ->db;.  if( (db-
7440: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f  >flags&SQLITE_Fo
7450: 72 65 69 67 6e 4b 65 79 73 29 20 26 26 20 21 49  reignKeys) && !I
7460: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
7470: 7b 0a 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20  {.    int iSkip 
7480: 3d 20 30 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  = 0;.    Vdbe *v
7490: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
74a0: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
74b0: 61 73 73 65 72 74 28 20 76 20 29 3b 20 20 20 20  assert( v );    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
74d0: 20 56 44 42 45 20 68 61 73 20 61 6c 72 65 61 64   VDBE has alread
74e0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
74f0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
7500: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
7510: 20 29 3b 20 20 20 2f 2a 20 4e 6f 74 20 61 20 76   );   /* Not a v
7520: 69 65 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  iew */.    if( s
7530: 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65 6e 63  qlite3FkReferenc
7540: 65 73 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  es(pTab)==0 ){. 
7550: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
7560: 6f 72 20 61 20 64 65 66 65 72 72 65 64 20 66 6f  or a deferred fo
7570: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7580: 61 69 6e 74 20 66 6f 72 20 77 68 69 63 68 20 74  aint for which t
7590: 68 69 73 20 74 61 62 6c 65 0a 20 20 20 20 20 20  his table.      
75a0: 2a 2a 20 69 73 20 74 68 65 20 63 68 69 6c 64 20  ** is the child 
75b0: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 63 61  table. If one ca
75c0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
75d0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 0a 20  eturn without . 
75e0: 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 69       ** generati
75f0: 6e 67 20 61 6e 79 20 56 44 42 45 20 63 6f 64 65  ng any VDBE code
7600: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
7610: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 6a 75 6d 70  found, then jump
7620: 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 74   over.      ** t
7630: 68 65 20 65 6e 74 69 72 65 20 44 45 4c 45 54 45  he entire DELETE
7640: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
7650: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
7660: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
7670: 73 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  s.      ** when 
7680: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  this statement i
7690: 73 20 72 75 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  s run.  */.     
76a0: 20 46 4b 65 79 20 2a 70 3b 0a 20 20 20 20 20 20   FKey *p;.      
76b0: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 4b 65  for(p=pTab->pFKe
76c0: 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  y; p; p=p->pNext
76d0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 69  From){.        i
76e0: 66 28 20 70 2d 3e 69 73 44 65 66 65 72 72 65 64  f( p->isDeferred
76f0: 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   || (db->flags &
7700: 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73   SQLITE_DeferFKs
7710: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
7720: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 20   }.      if( !p 
7730: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
7740: 69 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56  iSkip = sqlite3V
7750: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
7760: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
7770: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7780: 20 4f 50 5f 46 6b 49 66 5a 65 72 6f 2c 20 31 2c   OP_FkIfZero, 1,
7790: 20 69 53 6b 69 70 29 3b 20 56 64 62 65 43 6f 76   iSkip); VdbeCov
77a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
77b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73  .    pParse->dis
77c0: 61 62 6c 65 54 72 69 67 67 65 72 73 20 3d 20 31  ableTriggers = 1
77d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
77e0: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20  eteFrom(pParse, 
77f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7800: 70 28 64 62 2c 20 70 4e 61 6d 65 2c 20 30 29 2c  p(db, pName, 0),
7810: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
7820: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54 72  Parse->disableTr
7830: 69 67 67 65 72 73 20 3d 20 30 3b 0a 0a 20 20 20  iggers = 0;..   
7840: 20 2f 2a 20 49 66 20 74 68 65 20 44 45 4c 45 54   /* If the DELET
7850: 45 20 68 61 73 20 67 65 6e 65 72 61 74 65 64 20  E has generated 
7860: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
7870: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
7880: 20 0a 20 20 20 20 2a 2a 20 76 69 6f 6c 61 74 69   .    ** violati
7890: 6f 6e 73 2c 20 68 61 6c 74 20 74 68 65 20 56 44  ons, halt the VD
78a0: 42 45 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  BE and return an
78b0: 20 65 72 72 6f 72 20 61 74 20 74 68 69 73 20 70   error at this p
78c0: 6f 69 6e 74 2c 20 62 65 66 6f 72 65 0a 20 20 20  oint, before.   
78d0: 20 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61   ** any modifica
78e0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 63 68  tions to the sch
78f0: 65 6d 61 20 61 72 65 20 6d 61 64 65 2e 20 54 68  ema are made. Th
7900: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 73 74  is is because st
7910: 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 74  atement.    ** t
7920: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
7930: 6e 6f 74 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  not able to roll
7940: 62 61 63 6b 20 73 63 68 65 6d 61 20 63 68 61 6e  back schema chan
7950: 67 65 73 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ges.  .    **.  
7960: 20 20 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49    ** If the SQLI
7970: 54 45 5f 44 65 66 65 72 46 4b 73 20 66 6c 61 67  TE_DeferFKs flag
7980: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
7990: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
79a0: 65 64 2c 20 61 73 0a 20 20 20 20 2a 2a 20 74 68  ed, as.    ** th
79b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
79c0: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  saction will not
79d0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
79e0: 65 76 65 6e 20 69 66 20 46 4b 0a 20 20 20 20 2a  even if FK.    *
79f0: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
7a00: 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20  e violated..    
7a10: 2a 2f 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  */.    if( (db->
7a20: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
7a30: 65 66 65 72 46 4b 73 29 3d 3d 30 20 29 7b 0a 20  eferFKs)==0 ){. 
7a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7a50: 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
7a60: 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20  v, OE_Abort);.  
7a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7a80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 46 6b 49 66  ddOp2(v, OP_FkIf
7a90: 5a 65 72 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Zero, 0, sqlite3
7aa0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7ab0: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  v)+2);.      Vdb
7ac0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
7ae0: 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
7af0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
7b00: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 2c 0a  INT_FOREIGNKEY,.
7b10: 20 20 20 20 20 20 20 20 20 20 4f 45 5f 41 62 6f            OE_Abo
7b20: 72 74 2c 20 30 2c 20 50 34 5f 53 54 41 54 49 43  rt, 0, P4_STATIC
7b30: 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 46  , P5_ConstraintF
7b40: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K);.    }..    i
7b50: 66 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( iSkip ){.    
7b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
7b70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 53 6b  olveLabel(v, iSk
7b80: 69 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ip);.    }.  }.}
7b90: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  .../*.** The sec
7ba0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 6f 69  ond argument poi
7bb0: 6e 74 73 20 74 6f 20 61 6e 20 46 4b 65 79 20 6f  nts to an FKey o
7bc0: 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
7bd0: 6e 67 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ng a foreign key
7be0: 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 70 54  .** for which pT
7bf0: 61 62 20 69 73 20 74 68 65 20 63 68 69 6c 64 20  ab is the child 
7c00: 74 61 62 6c 65 2e 20 41 6e 20 55 50 44 41 54 45  table. An UPDATE
7c10: 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e   statement again
7c20: 73 74 20 70 54 61 62 0a 2a 2a 20 69 73 20 63 75  st pTab.** is cu
7c30: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72  rrently being pr
7c40: 6f 63 65 73 73 65 64 2e 20 46 6f 72 20 65 61 63  ocessed. For eac
7c50: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
7c60: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 0a 2a  table that is .*
7c70: 2a 20 61 63 74 75 61 6c 6c 79 20 75 70 64 61 74  * actually updat
7c80: 65 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ed, the correspo
7c90: 6e 64 69 6e 67 20 65 6c 65 6d 65 6e 74 20 69 6e  nding element in
7ca0: 20 74 68 65 20 61 43 68 61 6e 67 65 5b 5d 20 61   the aChange[] a
7cb0: 72 72 61 79 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rray.** is zero 
7cc0: 6f 72 20 67 72 65 61 74 65 72 20 28 69 66 20 61  or greater (if a
7cd0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 6e 6d 6f 64   column is unmod
7ce0: 69 66 69 65 64 20 74 68 65 20 63 6f 72 72 65 73  ified the corres
7cf0: 70 6f 6e 64 69 6e 67 20 65 6c 65 6d 65 6e 74 0a  ponding element.
7d00: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 29  ** is set to -1)
7d10: 2e 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63  . If the rowid c
7d20: 6f 6c 75 6d 6e 20 69 73 20 6d 6f 64 69 66 69 65  olumn is modifie
7d30: 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45 20  d by the UPDATE 
7d40: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  statement.** the
7d50: 20 62 43 68 6e 67 52 6f 77 69 64 20 61 72 67 75   bChngRowid argu
7d60: 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
7d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
7d80: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
7d90: 75 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ue if any of the
7da0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
7db0: 65 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  e part of the.**
7dc0: 20 63 68 69 6c 64 20 6b 65 79 20 66 6f 72 20 46   child key for F
7dd0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20  K constraint *p 
7de0: 61 72 65 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  are modified..*/
7df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6b 43 68  .static int fkCh
7e00: 69 6c 64 49 73 4d 6f 64 69 66 69 65 64 28 0a 20  ildIsModified(. 
7e10: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e30: 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
7e40: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 4b 65  updated */.  FKe
7e50: 79 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  y *p,           
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 46 6f 72 65 69 67 6e 20 6b 65 79 20 66 6f 72 20  Foreign key for 
7e80: 77 68 69 63 68 20 70 54 61 62 20 69 73 20 74 68  which pTab is th
7e90: 65 20 63 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74  e child */.  int
7ea0: 20 2a 61 43 68 61 6e 67 65 2c 20 20 20 20 20 20   *aChange,      
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ec0: 41 72 72 61 79 20 69 6e 64 69 63 61 74 69 6e 67  Array indicating
7ed0: 20 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d 6e   modified column
7ee0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 43 68 6e 67  s */.  int bChng
7ef0: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
7f00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7f10: 66 20 72 6f 77 69 64 20 69 73 20 6d 6f 64 69 66  f rowid is modif
7f20: 69 65 64 20 62 79 20 74 68 69 73 20 75 70 64 61  ied by this upda
7f30: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
7f40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7f50: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7f60: 20 20 69 6e 74 20 69 43 68 69 6c 64 4b 65 79 20    int iChildKey 
7f70: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  = p->aCol[i].iFr
7f80: 6f 6d 3b 0a 20 20 20 20 69 66 28 20 61 43 68 61  om;.    if( aCha
7f90: 6e 67 65 5b 69 43 68 69 6c 64 4b 65 79 5d 3e 3d  nge[iChildKey]>=
7fa0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7fb0: 20 20 69 66 28 20 69 43 68 69 6c 64 4b 65 79 3d    if( iChildKey=
7fc0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 26 26 20  =pTab->iPKey && 
7fd0: 62 43 68 6e 67 52 6f 77 69 64 20 29 20 72 65 74  bChngRowid ) ret
7fe0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
7ff0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8000: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
8010: 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ent points to an
8020: 20 46 4b 65 79 20 6f 62 6a 65 63 74 20 72 65 70   FKey object rep
8030: 72 65 73 65 6e 74 69 6e 67 20 61 20 66 6f 72 65  resenting a fore
8040: 69 67 6e 20 6b 65 79 0a 2a 2a 20 66 6f 72 20 77  ign key.** for w
8050: 68 69 63 68 20 70 54 61 62 20 69 73 20 74 68 65  hich pTab is the
8060: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 41   parent table. A
8070: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
8080: 6e 74 20 61 67 61 69 6e 73 74 20 70 54 61 62 0a  nt against pTab.
8090: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
80a0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
80b0: 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   For each column
80c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
80d0: 61 74 20 69 73 20 0a 2a 2a 20 61 63 74 75 61 6c  at is .** actual
80e0: 6c 79 20 75 70 64 61 74 65 64 2c 20 74 68 65 20  ly updated, the 
80f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6c  corresponding el
8100: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 43 68  ement in the aCh
8110: 61 6e 67 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  ange[] array.** 
8120: 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
8130: 65 72 20 28 69 66 20 61 20 63 6f 6c 75 6d 6e 20  er (if a column 
8140: 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 74 68  is unmodified th
8150: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8160: 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 73 65  element.** is se
8170: 74 20 74 6f 20 2d 31 29 2e 20 49 66 20 74 68 65  t to -1). If the
8180: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 73   rowid column is
8190: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
81a0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
81b0: 74 0a 2a 2a 20 74 68 65 20 62 43 68 6e 67 52 6f  t.** the bChngRo
81c0: 77 69 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  wid argument is 
81d0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
81e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
81f0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 61 6e  turns true if an
8200: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  y of the columns
8210: 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
8220: 66 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  f the.** parent 
8230: 6b 65 79 20 66 6f 72 20 46 4b 20 63 6f 6e 73 74  key for FK const
8240: 72 61 69 6e 74 20 2a 70 20 61 72 65 20 6d 6f 64  raint *p are mod
8250: 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
8260: 20 69 6e 74 20 66 6b 50 61 72 65 6e 74 49 73 4d   int fkParentIsM
8270: 6f 64 69 66 69 65 64 28 0a 20 20 54 61 62 6c 65  odified(.  Table
8280: 20 2a 70 54 61 62 2c 20 0a 20 20 46 4b 65 79 20   *pTab, .  FKey 
8290: 2a 70 2c 20 0a 20 20 69 6e 74 20 2a 61 43 68 61  *p, .  int *aCha
82a0: 6e 67 65 2c 20 0a 20 20 69 6e 74 20 62 43 68 6e  nge, .  int bChn
82b0: 67 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20  gRowid.){.  int 
82c0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
82d0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
82e0: 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20     char *zKey = 
82f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 3b  p->aCol[i].zCol;
8300: 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 3b 0a 20  .    int iKey;. 
8310: 20 20 20 66 6f 72 28 69 4b 65 79 3d 30 3b 20 69     for(iKey=0; i
8320: 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Key<pTab->nCol; 
8330: 69 4b 65 79 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iKey++){.      i
8340: 66 28 20 61 43 68 61 6e 67 65 5b 69 4b 65 79 5d  f( aChange[iKey]
8350: 3e 3d 30 20 7c 7c 20 28 69 4b 65 79 3d 3d 70 54  >=0 || (iKey==pT
8360: 61 62 2d 3e 69 50 4b 65 79 20 26 26 20 62 43 68  ab->iPKey && bCh
8370: 6e 67 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  ngRowid) ){.    
8380: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8390: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
83a0: 4b 65 79 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  Key];.        if
83b0: 28 20 7a 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ( zKey ){.      
83c0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
83d0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
83e0: 7a 4e 61 6d 65 2c 20 7a 4b 65 79 29 20 29 20 72  zName, zKey) ) r
83f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
8400: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 2d   }else if( pCol-
8410: 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
8420: 4c 41 47 5f 50 52 49 4d 4b 45 59 20 29 7b 0a 20  LAG_PRIMKEY ){. 
8430: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8440: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8450: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8460: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8470: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
8480: 69 66 20 74 68 65 20 70 61 72 73 65 72 20 70 61  if the parser pa
8490: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
84a0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 62 65  t argument is be
84b0: 69 6e 67 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63  ing.** used to c
84c0: 6f 64 65 20 61 20 74 72 69 67 67 65 72 20 74 68  ode a trigger th
84d0: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 61 20 22  at is really a "
84e0: 53 45 54 20 4e 55 4c 4c 22 20 61 63 74 69 6f 6e  SET NULL" action
84f0: 20 62 65 6c 6f 6e 67 69 6e 67 0a 2a 2a 20 74 6f   belonging.** to
8500: 20 74 72 69 67 67 65 72 20 70 46 4b 65 79 2e 0a   trigger pFKey..
8510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
8520: 53 65 74 4e 75 6c 6c 41 63 74 69 6f 6e 28 50 61  SetNullAction(Pa
8530: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 4b 65  rse *pParse, FKe
8540: 79 20 2a 70 46 4b 65 79 29 7b 0a 20 20 50 61 72  y *pFKey){.  Par
8550: 73 65 20 2a 70 54 6f 70 20 3d 20 73 71 6c 69 74  se *pTop = sqlit
8560: 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
8570: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70  pParse);.  if( p
8580: 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67  Top->pTriggerPrg
8590: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
85a0: 2a 70 20 3d 20 70 54 6f 70 2d 3e 70 54 72 69 67  *p = pTop->pTrig
85b0: 67 65 72 50 72 67 2d 3e 70 54 72 69 67 67 65 72  gerPrg->pTrigger
85c0: 3b 0a 20 20 20 20 69 66 28 20 28 70 3d 3d 70 46  ;.    if( (p==pF
85d0: 4b 65 79 2d 3e 61 70 54 72 69 67 67 65 72 5b 30  Key->apTrigger[0
85e0: 5d 20 26 26 20 70 46 4b 65 79 2d 3e 61 41 63 74  ] && pFKey->aAct
85f0: 69 6f 6e 5b 30 5d 3d 3d 4f 45 5f 53 65 74 4e 75  ion[0]==OE_SetNu
8600: 6c 6c 29 0a 20 20 20 20 20 7c 7c 20 28 70 3d 3d  ll).     || (p==
8610: 70 46 4b 65 79 2d 3e 61 70 54 72 69 67 67 65 72  pFKey->apTrigger
8620: 5b 31 5d 20 26 26 20 70 46 4b 65 79 2d 3e 61 41  [1] && pFKey->aA
8630: 63 74 69 6f 6e 5b 31 5d 3d 3d 4f 45 5f 53 65 74  ction[1]==OE_Set
8640: 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
8650: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8660: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8670: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
8680: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
8690: 6c 65 64 20 77 68 65 6e 20 69 6e 73 65 72 74 69  led when inserti
86a0: 6e 67 2c 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ng, deleting or 
86b0: 75 70 64 61 74 69 6e 67 20 61 20 72 6f 77 20 6f  updating a row o
86c0: 66 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  f.** table pTab 
86d0: 74 6f 20 67 65 6e 65 72 61 74 65 20 56 44 42 45  to generate VDBE
86e0: 20 63 6f 64 65 20 74 6f 20 70 65 72 66 6f 72 6d   code to perform
86f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
8700: 73 74 72 61 69 6e 74 20 0a 2a 2a 20 70 72 6f 63  straint .** proc
8710: 65 73 73 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  essing for the o
8720: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
8730: 46 6f 72 20 61 20 44 45 4c 45 54 45 20 6f 70 65  For a DELETE ope
8740: 72 61 74 69 6f 6e 2c 20 70 61 72 61 6d 65 74 65  ration, paramete
8750: 72 20 72 65 67 4f 6c 64 20 69 73 20 70 61 73 73  r regOld is pass
8760: 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
8770: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 72 65 67  the.** first reg
8780: 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61  ister in an arra
8790: 79 20 6f 66 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  y of (pTab->nCol
87a0: 2b 31 29 20 72 65 67 69 73 74 65 72 73 20 63 6f  +1) registers co
87b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ntaining the.** 
87c0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
87d0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20   being deleted, 
87e0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 65 61 63 68  followed by each
87f0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
8800: 61 6c 75 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20  alues.** of the 
8810: 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65  row being delete
8820: 64 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  d, from left to 
8830: 72 69 67 68 74 2e 20 50 61 72 61 6d 65 74 65 72  right. Parameter
8840: 20 72 65 67 4e 65 77 20 69 73 20 70 61 73 73 65   regNew is passe
8850: 64 0a 2a 2a 20 7a 65 72 6f 20 69 6e 20 74 68 69  d.** zero in thi
8860: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s case..**.** Fo
8870: 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  r an INSERT oper
8880: 61 74 69 6f 6e 2c 20 72 65 67 4f 6c 64 20 69 73  ation, regOld is
8890: 20 70 61 73 73 65 64 20 7a 65 72 6f 20 61 6e 64   passed zero and
88a0: 20 72 65 67 4e 65 77 20 69 73 20 70 61 73 73 65   regNew is passe
88b0: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 72  d the.** first r
88c0: 65 67 69 73 74 65 72 20 6f 66 20 61 6e 20 61 72  egister of an ar
88d0: 72 61 79 20 6f 66 20 28 70 54 61 62 2d 3e 6e 43  ray of (pTab->nC
88e0: 6f 6c 2b 31 29 20 72 65 67 69 73 74 65 72 73 20  ol+1) registers 
88f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
8900: 65 77 0a 2a 2a 20 72 6f 77 20 64 61 74 61 2e 0a  ew.** row data..
8910: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44  **.** For an UPD
8920: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ATE operation, t
8930: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8940: 63 61 6c 6c 65 64 20 74 77 69 63 65 2e 20 4f 6e  called twice. On
8950: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ce before.** the
8960: 20 6f 72 69 67 69 6e 61 6c 20 72 65 63 6f 72 64   original record
8970: 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
8980: 20 74 68 65 20 74 61 62 6c 65 20 75 73 69 6e 67   the table using
8990: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 63 6f 6e   the calling con
89a0: 76 65 6e 74 69 6f 6e 0a 2a 2a 20 64 65 73 63 72  vention.** descr
89b0: 69 62 65 64 20 66 6f 72 20 44 45 4c 45 54 45 2e  ibed for DELETE.
89c0: 20 54 68 65 6e 20 61 67 61 69 6e 20 61 66 74 65   Then again afte
89d0: 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  r the original r
89e0: 65 63 6f 72 64 20 69 73 20 64 65 6c 65 74 65 64  ecord is deleted
89f0: 0a 2a 2a 20 62 75 74 20 62 65 66 6f 72 65 20 74  .** but before t
8a00: 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73  he new record is
8a10: 20 69 6e 73 65 72 74 65 64 20 75 73 69 6e 67 20   inserted using 
8a20: 74 68 65 20 49 4e 53 45 52 54 20 63 6f 6e 76 65  the INSERT conve
8a30: 6e 74 69 6f 6e 2e 20 0a 2a 2f 0a 76 6f 69 64 20  ntion. .*/.void 
8a40: 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28 0a  sqlite3FkCheck(.
8a50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
8a80: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
8a90: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 20 69          /* Row i
8ab0: 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  s being deleted 
8ac0: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
8ad0: 2a 2f 20 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64  */ .  int regOld
8ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8af0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
8b00: 73 20 72 6f 77 20 64 61 74 61 20 69 73 20 73 74  s row data is st
8b10: 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 69  ored here */.  i
8b20: 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20  nt regNew,      
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b40: 2a 20 4e 65 77 20 72 6f 77 20 64 61 74 61 20 69  * New row data i
8b50: 73 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  s stored here */
8b60: 0a 20 20 69 6e 74 20 2a 61 43 68 61 6e 67 65 2c  .  int *aChange,
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 2f 2a 20 41 72 72 61 79 20 69 6e 64 69     /* Array indi
8b90: 63 61 74 69 6e 67 20 55 50 44 41 54 45 64 20 63  cating UPDATEd c
8ba0: 6f 6c 75 6d 6e 73 20 28 6f 72 20 30 29 20 2a 2f  olumns (or 0) */
8bb0: 0a 20 20 69 6e 74 20 62 43 68 6e 67 52 6f 77 69  .  int bChngRowi
8bc0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
8bd0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 6f     /* True if ro
8be0: 77 69 64 20 69 73 20 55 50 44 41 54 45 64 20 2a  wid is UPDATEd *
8bf0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
8c00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8c10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8c20: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  se handle */.  F
8c30: 4b 65 79 20 2a 70 46 4b 65 79 3b 20 20 20 20 20  Key *pFKey;     
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c50: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
8c60: 65 20 74 68 72 6f 75 67 68 20 46 4b 73 20 2a 2f  e through FKs */
8c70: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
8ca0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
8cb0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 63 6f 6e  ng pTab */.  con
8cc0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ce0: 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65  Name of database
8cf0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
8d00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f   */.  int isIgno
8d10: 72 65 45 72 72 6f 72 73 20 3d 20 70 50 61 72 73  reErrors = pPars
8d20: 65 2d 3e 64 69 73 61 62 6c 65 54 72 69 67 67 65  e->disableTrigge
8d30: 72 73 3b 0a 0a 20 20 2f 2a 20 45 78 61 63 74 6c  rs;..  /* Exactl
8d40: 79 20 6f 6e 65 20 6f 66 20 72 65 67 4f 6c 64 20  y one of regOld 
8d50: 61 6e 64 20 72 65 67 4e 65 77 20 73 68 6f 75 6c  and regNew shoul
8d60: 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 2a  d be non-zero. *
8d70: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 72 65 67  /.  assert( (reg
8d80: 4f 6c 64 3d 3d 30 29 21 3d 28 72 65 67 4e 65 77  Old==0)!=(regNew
8d90: 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
8da0: 20 66 6f 72 65 69 67 6e 2d 6b 65 79 73 20 61 72   foreign-keys ar
8db0: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 69 73  e disabled, this
8dc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
8dd0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 28  o-op. */.  if( (
8de0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8df0: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 3d 3d 30  _ForeignKeys)==0
8e00: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 44   ) return;..  iD
8e10: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
8e20: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
8e30: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7a  b->pSchema);.  z
8e40: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
8e50: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 0a 20 20 2f  ].zDbSName;..  /
8e60: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
8e70: 6c 6c 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  ll the foreign k
8e80: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  ey constraints f
8e90: 6f 72 20 77 68 69 63 68 20 70 54 61 62 20 69 73  or which pTab is
8ea0: 20 74 68 65 0a 20 20 2a 2a 20 63 68 69 6c 64 20   the.  ** child 
8eb0: 74 61 62 6c 65 20 28 74 68 65 20 74 61 62 6c 65  table (the table
8ec0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
8ed0: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
8ee0: 20 69 73 20 70 61 72 74 20 6f 66 29 2e 20 20 2a   is part of).  *
8ef0: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
8f00: 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  ab->pFKey; pFKey
8f10: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
8f20: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 54  NextFrom){.    T
8f30: 61 62 6c 65 20 2a 70 54 6f 3b 20 20 20 20 20 20  able *pTo;      
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f50: 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  Parent table of 
8f60: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 46 4b 65  foreign key pFKe
8f70: 79 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  y */.    Index *
8f80: 70 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  pIdx = 0;       
8f90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8fa0: 6f 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  on key columns i
8fb0: 6e 20 70 54 6f 20 2a 2f 0a 20 20 20 20 69 6e 74  n pTo */.    int
8fc0: 20 2a 61 69 46 72 65 65 20 3d 20 30 3b 0a 20 20   *aiFree = 0;.  
8fd0: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 3b 0a 20 20    int *aiCol;.  
8fe0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
8ff0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 62  int i;.    int b
9000: 49 67 6e 6f 72 65 20 3d 20 30 3b 0a 0a 20 20 20  Ignore = 0;..   
9010: 20 69 66 28 20 61 43 68 61 6e 67 65 20 0a 20 20   if( aChange .  
9020: 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
9030: 72 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  ricmp(pTab->zNam
9040: 65 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 29 21 3d  e, pFKey->zTo)!=
9050: 30 0a 20 20 20 20 20 26 26 20 66 6b 43 68 69 6c  0.     && fkChil
9060: 64 49 73 4d 6f 64 69 66 69 65 64 28 70 54 61 62  dIsModified(pTab
9070: 2c 20 70 46 4b 65 79 2c 20 61 43 68 61 6e 67 65  , pFKey, aChange
9080: 2c 20 62 43 68 6e 67 52 6f 77 69 64 29 3d 3d 30  , bChngRowid)==0
9090: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
90a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
90b0: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
90c0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  parent table of 
90d0: 74 68 69 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  this foreign key
90e0: 2e 20 41 6c 73 6f 20 66 69 6e 64 20 61 20 75 6e  . Also find a un
90f0: 69 71 75 65 20 69 6e 64 65 78 20 0a 20 20 20 20  ique index .    
9100: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ** on the parent
9110: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
9120: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
9130: 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
9140: 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 73 63 68  hese .    ** sch
9150: 65 6d 61 20 69 74 65 6d 73 20 63 61 6e 6e 6f 74  ema items cannot
9160: 20 62 65 20 6c 6f 63 61 74 65 64 2c 20 73 65 74   be located, set
9170: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
9180: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 0a  rse and return .
9190: 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 20 2a      ** early.  *
91a0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
91b0: 2d 3e 64 69 73 61 62 6c 65 54 72 69 67 67 65 72  ->disableTrigger
91c0: 73 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 20 3d  s ){.      pTo =
91d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
91e0: 65 28 64 62 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  e(db, pFKey->zTo
91f0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d 65 6c 73  , zDb);.    }els
9200: 65 7b 0a 20 20 20 20 20 20 70 54 6f 20 3d 20 73  e{.      pTo = s
9210: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
9220: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 4b  e(pParse, 0, pFK
9230: 65 79 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20  ey->zTo, zDb);. 
9240: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 54     }.    if( !pT
9250: 6f 20 7c 7c 20 73 71 6c 69 74 65 33 46 6b 4c 6f  o || sqlite3FkLo
9260: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
9270: 2c 20 70 54 6f 2c 20 70 46 4b 65 79 2c 20 26 70  , pTo, pFKey, &p
9280: 49 64 78 2c 20 26 61 69 46 72 65 65 29 20 29 7b  Idx, &aiFree) ){
9290: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
92a0: 73 49 67 6e 6f 72 65 45 72 72 6f 72 73 3d 3d 30  sIgnoreErrors==0
92b0: 20 7c 7c 20 28 72 65 67 4f 6c 64 21 3d 30 20 26   || (regOld!=0 &
92c0: 26 20 72 65 67 4e 65 77 3d 3d 30 29 20 29 3b 0a  & regNew==0) );.
92d0: 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
92e0: 6f 72 65 45 72 72 6f 72 73 20 7c 7c 20 64 62 2d  oreErrors || db-
92f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
9300: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 69 66  return;.      if
9310: 28 20 70 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pTo==0 ){.    
9320: 20 20 20 20 2f 2a 20 49 66 20 69 73 49 67 6e 6f      /* If isIgno
9330: 72 65 45 72 72 6f 72 73 20 69 73 20 74 72 75 65  reErrors is true
9340: 2c 20 74 68 65 6e 20 61 20 74 61 62 6c 65 20 69  , then a table i
9350: 73 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  s being dropped.
9360: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
9370: 20 2a 2a 20 63 61 73 65 20 53 51 4c 69 74 65 20   ** case SQLite 
9380: 72 75 6e 73 20 61 20 22 44 45 4c 45 54 45 20 46  runs a "DELETE F
9390: 52 4f 4d 20 78 78 78 22 20 6f 6e 20 74 68 65 20  ROM xxx" on the 
93a0: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
93b0: 70 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ped.        ** b
93c0: 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 64  efore actually d
93d0: 72 6f 70 70 69 6e 67 20 69 74 20 69 6e 20 6f 72  ropping it in or
93e0: 64 65 72 20 74 6f 20 63 68 65 63 6b 20 46 4b 20  der to check FK 
93f0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
9400: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70       ** If the p
9410: 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 61  arent table of a
9420: 6e 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  n FK constraint 
9430: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
9440: 61 62 6c 65 20 69 73 0a 20 20 20 20 20 20 20 20  able is.        
9450: 2a 2a 20 6d 69 73 73 69 6e 67 2c 20 62 65 68 61  ** missing, beha
9460: 76 65 20 61 73 20 69 66 20 69 74 20 69 73 20 65  ve as if it is e
9470: 6d 70 74 79 2e 20 69 2e 65 2e 20 64 65 63 72 65  mpty. i.e. decre
9480: 6d 65 6e 74 20 74 68 65 20 72 65 6c 65 76 61 6e  ment the relevan
9490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 4b 20  t.        ** FK 
94a0: 63 6f 75 6e 74 65 72 20 66 6f 72 20 65 61 63 68  counter for each
94b0: 20 72 6f 77 20 6f 66 20 74 68 65 20 63 75 72 72   row of the curr
94c0: 65 6e 74 20 74 61 62 6c 65 20 77 69 74 68 20 6e  ent table with n
94d0: 6f 6e 2d 4e 55 4c 4c 20 6b 65 79 73 2e 0a 20 20  on-NULL keys..  
94e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
94f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
9500: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
9510: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
9520: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
9530: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9540: 20 2b 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 2b   + pFKey->nCol +
9550: 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
9560: 69 3d 30 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e 43  i=0; i<pFKey->nC
9570: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
9580: 20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 70      int iReg = p
9590: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
95a0: 72 6f 6d 20 2b 20 72 65 67 4f 6c 64 20 2b 20 31  rom + regOld + 1
95b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
95c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
95d0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
95e0: 2c 20 69 4a 75 6d 70 29 3b 20 56 64 62 65 43 6f  , iJump); VdbeCo
95f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
9600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
9610: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9620: 2c 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 2c 20  , OP_FkCounter, 
9630: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
9640: 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  d, -1);.      }.
9650: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9660: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9670: 28 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3d 3d 31  ( pFKey->nCol==1
9680: 20 7c 7c 20 28 61 69 46 72 65 65 20 26 26 20 70   || (aiFree && p
9690: 49 64 78 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Idx) );..    if(
96a0: 20 61 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20   aiFree ){.     
96b0: 20 61 69 43 6f 6c 20 3d 20 61 69 46 72 65 65 3b   aiCol = aiFree;
96c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
96d0: 20 20 69 43 6f 6c 20 3d 20 70 46 4b 65 79 2d 3e    iCol = pFKey->
96e0: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b 0a 20  aCol[0].iFrom;. 
96f0: 20 20 20 20 20 61 69 43 6f 6c 20 3d 20 26 69 43       aiCol = &iC
9700: 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ol;.    }.    fo
9710: 72 28 69 3d 30 3b 20 69 3c 70 46 4b 65 79 2d 3e  r(i=0; i<pFKey->
9720: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9730: 20 20 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3d 3d    if( aiCol[i]==
9740: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
9750: 20 20 20 20 20 20 20 61 69 43 6f 6c 5b 69 5d 20         aiCol[i] 
9760: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
9770: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9780: 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 61 69 43  ==0 || pIdx->aiC
9790: 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 23  olumn[i]>=0 );.#
97a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
97b0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
97c0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73  .      /* Reques
97d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20  t permission to 
97e0: 72 65 61 64 20 74 68 65 20 70 61 72 65 6e 74 20  read the parent 
97f0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  key columns. If 
9800: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 61 75  the .      ** au
9810: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
9820: 62 61 63 6b 20 72 65 74 75 72 6e 73 20 53 51 4c  back returns SQL
9830: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 62 65 68 61  ITE_IGNORE, beha
9840: 76 65 20 61 73 20 69 66 20 61 6e 79 0a 20 20 20  ve as if any.   
9850: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 61     ** values rea
9860: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  d from the paren
9870: 74 20 74 61 62 6c 65 20 61 72 65 20 4e 55 4c 4c  t table are NULL
9880: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  . */.      if( d
9890: 62 2d 3e 78 41 75 74 68 20 29 7b 0a 20 20 20 20  b->xAuth ){.    
98a0: 20 20 20 20 69 6e 74 20 72 63 61 75 74 68 3b 0a      int rcauth;.
98b0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
98c0: 6f 6c 20 3d 20 70 54 6f 2d 3e 61 43 6f 6c 5b 70  ol = pTo->aCol[p
98d0: 49 64 78 20 3f 20 70 49 64 78 2d 3e 61 69 43 6f  Idx ? pIdx->aiCo
98e0: 6c 75 6d 6e 5b 69 5d 20 3a 20 70 54 6f 2d 3e 69  lumn[i] : pTo->i
98f0: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  PKey].zName;.   
9900: 20 20 20 20 20 72 63 61 75 74 68 20 3d 20 73 71       rcauth = sq
9910: 6c 69 74 65 33 41 75 74 68 52 65 61 64 43 6f 6c  lite3AuthReadCol
9920: 28 70 50 61 72 73 65 2c 20 70 54 6f 2d 3e 7a 4e  (pParse, pTo->zN
9930: 61 6d 65 2c 20 7a 43 6f 6c 2c 20 69 44 62 29 3b  ame, zCol, iDb);
9940: 0a 20 20 20 20 20 20 20 20 62 49 67 6e 6f 72 65  .        bIgnore
9950: 20 3d 20 28 72 63 61 75 74 68 3d 3d 53 51 4c 49   = (rcauth==SQLI
9960: 54 45 5f 49 47 4e 4f 52 45 29 3b 0a 20 20 20 20  TE_IGNORE);.    
9970: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
9980: 0a 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 20  ..    /* Take a 
9990: 73 68 61 72 65 64 2d 63 61 63 68 65 20 61 64 76  shared-cache adv
99a0: 69 73 6f 72 79 20 72 65 61 64 2d 6c 6f 63 6b 20  isory read-lock 
99b0: 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  on the parent ta
99c0: 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 0a 20  ble. Allocate . 
99d0: 20 20 20 2a 2a 20 61 20 63 75 72 73 6f 72 20 74     ** a cursor t
99e0: 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68 20  o use to search 
99f0: 74 68 65 20 75 6e 69 71 75 65 20 69 6e 64 65 78  the unique index
9a00: 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b   on the parent k
9a10: 65 79 20 63 6f 6c 75 6d 6e 73 20 0a 20 20 20 20  ey columns .    
9a20: 2a 2a 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ** in the parent
9a30: 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
9a40: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
9a50: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
9a60: 6f 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 6f 2d  o->tnum, 0, pTo-
9a70: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  >zName);.    pPa
9a80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20  rse->nTab++;..  
9a90: 20 20 69 66 28 20 72 65 67 4f 6c 64 21 3d 30 20    if( regOld!=0 
9aa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 6f  ){.      /* A ro
9ab0: 77 20 69 73 20 62 65 69 6e 67 20 72 65 6d 6f 76  w is being remov
9ac0: 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68 69 6c  ed from the chil
9ad0: 64 20 74 61 62 6c 65 2e 20 53 65 61 72 63 68 20  d table. Search 
9ae0: 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 2e 0a  for the parent..
9af0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
9b00: 70 61 72 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  parent does not 
9b10: 65 78 69 73 74 2c 20 72 65 6d 6f 76 69 6e 67 20  exist, removing 
9b20: 74 68 65 20 63 68 69 6c 64 20 72 6f 77 20 72 65  the child row re
9b30: 73 6f 6c 76 65 73 20 61 6e 20 0a 20 20 20 20 20  solves an .     
9b40: 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
9b50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
9b60: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
9b70: 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6b 4c 6f 6f  . */.      fkLoo
9b80: 6b 75 70 50 61 72 65 6e 74 28 70 50 61 72 73 65  kupParent(pParse
9b90: 2c 20 69 44 62 2c 20 70 54 6f 2c 20 70 49 64 78  , iDb, pTo, pIdx
9ba0: 2c 20 70 46 4b 65 79 2c 20 61 69 43 6f 6c 2c 20  , pFKey, aiCol, 
9bb0: 72 65 67 4f 6c 64 2c 20 2d 31 2c 20 62 49 67 6e  regOld, -1, bIgn
9bc0: 6f 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ore);.    }.    
9bd0: 69 66 28 20 72 65 67 4e 65 77 21 3d 30 20 26 26  if( regNew!=0 &&
9be0: 20 21 69 73 53 65 74 4e 75 6c 6c 41 63 74 69 6f   !isSetNullActio
9bf0: 6e 28 70 50 61 72 73 65 2c 20 70 46 4b 65 79 29  n(pParse, pFKey)
9c00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
9c10: 6f 77 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  ow is being adde
9c20: 64 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 74  d to the child t
9c30: 61 62 6c 65 2e 20 49 66 20 61 20 70 61 72 65 6e  able. If a paren
9c40: 74 20 72 6f 77 20 63 61 6e 6e 6f 74 0a 20 20 20  t row cannot.   
9c50: 20 20 20 2a 2a 20 62 65 20 66 6f 75 6e 64 2c 20     ** be found, 
9c60: 61 64 64 69 6e 67 20 74 68 65 20 63 68 69 6c 64  adding the child
9c70: 20 72 6f 77 20 68 61 73 20 76 69 6f 6c 61 74 65   row has violate
9c80: 64 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61  d the FK constra
9c90: 69 6e 74 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  int. .      **. 
9ca0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
9cb0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 62 65 69  operation is bei
9cc0: 6e 67 20 70 65 72 66 6f 72 6d 65 64 20 61 73 20  ng performed as 
9cd0: 70 61 72 74 20 6f 66 20 61 20 74 72 69 67 67 65  part of a trigge
9ce0: 72 20 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  r program.      
9cf0: 2a 2a 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ** that is actua
9d00: 6c 6c 79 20 61 20 22 53 45 54 20 4e 55 4c 4c 22  lly a "SET NULL"
9d10: 20 61 63 74 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e   action belongin
9d20: 67 20 74 6f 20 74 68 69 73 20 76 65 72 79 20 0a  g to this very .
9d30: 20 20 20 20 20 20 2a 2a 20 66 6f 72 65 69 67 6e        ** foreign
9d40: 20 6b 65 79 2c 20 74 68 65 6e 20 6f 6d 69 74 20   key, then omit 
9d50: 74 68 69 73 20 73 63 61 6e 20 61 6c 74 6f 67 65  this scan altoge
9d60: 74 68 65 72 2e 20 41 73 20 61 6c 6c 20 63 68 69  ther. As all chi
9d70: 6c 64 20 6b 65 79 0a 20 20 20 20 20 20 2a 2a 20  ld key.      ** 
9d80: 76 61 6c 75 65 73 20 61 72 65 20 67 75 61 72 61  values are guara
9d90: 6e 74 65 65 64 20 74 6f 20 62 65 20 4e 55 4c 4c  nteed to be NULL
9da0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
9db0: 69 62 6c 65 20 66 6f 72 20 61 64 64 69 6e 67 0a  ible for adding.
9dc0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 72 6f        ** this ro
9dd0: 77 20 74 6f 20 63 61 75 73 65 20 61 6e 20 46 4b  w to cause an FK
9de0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 20 2a 2f 0a   violation.  */.
9df0: 20 20 20 20 20 20 66 6b 4c 6f 6f 6b 75 70 50 61        fkLookupPa
9e00: 72 65 6e 74 28 70 50 61 72 73 65 2c 20 69 44 62  rent(pParse, iDb
9e10: 2c 20 70 54 6f 2c 20 70 49 64 78 2c 20 70 46 4b  , pTo, pIdx, pFK
9e20: 65 79 2c 20 61 69 43 6f 6c 2c 20 72 65 67 4e 65  ey, aiCol, regNe
9e30: 77 2c 20 2b 31 2c 20 62 49 67 6e 6f 72 65 29 3b  w, +1, bIgnore);
9e40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
9e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 69  te3DbFree(db, ai
9e60: 46 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Free);.  }..  /*
9e70: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
9e80: 6c 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  l the foreign ke
9e90: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  y constraints th
9ea0: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 69 73  at refer to this
9eb0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20 28 74 68   table..  ** (th
9ec0: 65 20 22 63 68 69 6c 64 22 20 63 6f 6e 73 74 72  e "child" constr
9ed0: 61 69 6e 74 73 29 20 2a 2f 0a 20 20 66 6f 72 28  aints) */.  for(
9ee0: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 46  pFKey = sqlite3F
9ef0: 6b 52 65 66 65 72 65 6e 63 65 73 28 70 54 61 62  kReferences(pTab
9f00: 29 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  ); pFKey; pFKey=
9f10: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 29 7b  pFKey->pNextTo){
9f20: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9f30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9f40: 20 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65     /* Foreign ke
9f50: 79 20 69 6e 64 65 78 20 66 6f 72 20 70 46 4b 65  y index for pFKe
9f60: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
9f70: 20 2a 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20   *pSrc;.    int 
9f80: 2a 61 69 43 6f 6c 20 3d 20 30 3b 0a 0a 20 20 20  *aiCol = 0;..   
9f90: 20 69 66 28 20 61 43 68 61 6e 67 65 20 26 26 20   if( aChange && 
9fa0: 66 6b 50 61 72 65 6e 74 49 73 4d 6f 64 69 66 69  fkParentIsModifi
9fb0: 65 64 28 70 54 61 62 2c 20 70 46 4b 65 79 2c 20  ed(pTab, pFKey, 
9fc0: 61 43 68 61 6e 67 65 2c 20 62 43 68 6e 67 52 6f  aChange, bChngRo
9fd0: 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  wid)==0 ){.     
9fe0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
9ff0: 0a 0a 20 20 20 20 69 66 28 20 21 70 46 4b 65 79  ..    if( !pFKey
a000: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 26 26 20  ->isDeferred && 
a010: 21 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  !(db->flags & SQ
a020: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 29 20 0a  LITE_DeferFKs) .
a030: 20 20 20 20 20 26 26 20 21 70 50 61 72 73 65 2d       && !pParse-
a040: 3e 70 54 6f 70 6c 65 76 65 6c 20 26 26 20 21 70  >pToplevel && !p
a050: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
a060: 69 74 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ite .    ){.    
a070: 20 20 61 73 73 65 72 74 28 20 72 65 67 4f 6c 64    assert( regOld
a080: 3d 3d 30 20 26 26 20 72 65 67 4e 65 77 21 3d 30  ==0 && regNew!=0
a090: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73   );.      /* Ins
a0a0: 65 72 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  erting a single 
a0b0: 72 6f 77 20 69 6e 74 6f 20 61 20 70 61 72 65 6e  row into a paren
a0c0: 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 63  t table cannot c
a0d0: 61 75 73 65 20 28 6f 72 20 66 69 78 29 0a 20 20  ause (or fix).  
a0e0: 20 20 20 20 2a 2a 20 61 6e 20 69 6d 6d 65 64 69      ** an immedi
a0f0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
a100: 76 69 6f 6c 61 74 69 6f 6e 2e 20 53 6f 20 64 6f  violation. So do
a110: 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68 69 73   nothing in this
a120: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20   case.  */.     
a130: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
a140: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
a150: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
a160: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 46 4b  Parse, pTab, pFK
a170: 65 79 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  ey, &pIdx, &aiCo
a180: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
a190: 21 69 73 49 67 6e 6f 72 65 45 72 72 6f 72 73 20  !isIgnoreErrors 
a1a0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
a1b0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
a1c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a1d0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
a1e0: 61 69 43 6f 6c 20 7c 7c 20 70 46 4b 65 79 2d 3e  aiCol || pFKey->
a1f0: 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nCol==1 );..    
a200: 2f 2a 20 43 72 65 61 74 65 20 61 20 53 72 63 4c  /* Create a SrcL
a210: 69 73 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ist structure co
a220: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 68 69  ntaining the chi
a230: 6c 64 20 74 61 62 6c 65 2e 20 20 57 65 20 6e 65  ld table.  We ne
a240: 65 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  ed the.    ** ch
a250: 69 6c 64 20 74 61 62 6c 65 20 61 73 20 61 20 53  ild table as a S
a260: 72 63 4c 69 73 74 20 66 6f 72 20 73 71 6c 69 74  rcList for sqlit
a270: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
a280: 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c  /.    pSrc = sql
a290: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
a2a0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  d(pParse, 0, 0, 
a2b0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  0);.    if( pSrc
a2c0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
a2d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a2e0: 49 74 65 6d 20 3d 20 70 53 72 63 2d 3e 61 3b 0a  Item = pSrc->a;.
a2f0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
a300: 62 20 3d 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  b = pFKey->pFrom
a310: 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ;.      pItem->z
a320: 4e 61 6d 65 20 3d 20 70 46 4b 65 79 2d 3e 70 46  Name = pFKey->pF
a330: 72 6f 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  rom->zName;.    
a340: 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
a350: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
a360: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
a370: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a380: 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65  .  .      if( re
a390: 67 4e 65 77 21 3d 30 20 29 7b 0a 20 20 20 20 20  gNew!=0 ){.     
a3a0: 20 20 20 66 6b 53 63 61 6e 43 68 69 6c 64 72 65     fkScanChildre
a3b0: 6e 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  n(pParse, pSrc, 
a3c0: 70 54 61 62 2c 20 70 49 64 78 2c 20 70 46 4b 65  pTab, pIdx, pFKe
a3d0: 79 2c 20 61 69 43 6f 6c 2c 20 72 65 67 4e 65 77  y, aiCol, regNew
a3e0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
a3f0: 20 20 20 20 20 69 66 28 20 72 65 67 4f 6c 64 21       if( regOld!
a400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
a410: 74 20 65 41 63 74 69 6f 6e 20 3d 20 70 46 4b 65  t eAction = pFKe
a420: 79 2d 3e 61 41 63 74 69 6f 6e 5b 61 43 68 61 6e  y->aAction[aChan
a430: 67 65 21 3d 30 5d 3b 0a 20 20 20 20 20 20 20 20  ge!=0];.        
a440: 66 6b 53 63 61 6e 43 68 69 6c 64 72 65 6e 28 70  fkScanChildren(p
a450: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 70 54 61  Parse, pSrc, pTa
a460: 62 2c 20 70 49 64 78 2c 20 70 46 4b 65 79 2c 20  b, pIdx, pFKey, 
a470: 61 69 43 6f 6c 2c 20 72 65 67 4f 6c 64 2c 20 31  aiCol, regOld, 1
a480: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
a490: 20 74 68 69 73 20 69 73 20 61 20 64 65 66 65 72   this is a defer
a4a0: 72 65 64 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  red FK constrain
a4b0: 74 2c 20 6f 72 20 61 20 43 41 53 43 41 44 45 20  t, or a CASCADE 
a4c0: 6f 72 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20  or SET NULL.    
a4d0: 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20 61 70      ** action ap
a4e0: 70 6c 69 65 73 2c 20 74 68 65 6e 20 61 6e 79 20  plies, then any 
a4f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
a500: 61 74 69 6f 6e 73 20 63 61 75 73 65 64 20 62 79  ations caused by
a510: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
a520: 76 69 6e 67 20 74 68 65 20 70 61 72 65 6e 74 20  ving the parent 
a530: 6b 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 74  key will be rect
a540: 69 66 69 65 64 20 62 79 20 74 68 65 20 61 63 74  ified by the act
a550: 69 6f 6e 20 74 72 69 67 67 65 72 2e 0a 20 20 20  ion trigger..   
a560: 20 20 20 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f       ** So do no
a570: 74 20 73 65 74 20 74 68 65 20 22 6d 61 79 2d 61  t set the "may-a
a580: 62 6f 72 74 22 20 66 6c 61 67 20 69 6e 20 74 68  bort" flag in th
a590: 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
a5a0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
a5b0: 6f 74 65 20 31 3a 20 49 66 20 74 68 65 20 46 4b  ote 1: If the FK
a5c0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 22 4f 4e   is declared "ON
a5d0: 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 22   UPDATE CASCADE"
a5e0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
a5f0: 20 20 20 2a 2a 20 6d 61 79 2d 61 62 6f 72 74 20     ** may-abort 
a600: 66 6c 61 67 20 77 69 6c 6c 20 65 76 65 6e 74 75  flag will eventu
a610: 61 6c 6c 79 20 62 65 20 73 65 74 20 6f 6e 20 74  ally be set on t
a620: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  his statement an
a630: 79 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  yway.        ** 
a640: 28 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74  (when this funct
a650: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
a660: 20 70 61 72 74 20 6f 66 20 70 72 6f 63 65 73 73   part of process
a670: 69 6e 67 20 74 68 65 20 55 50 44 41 54 45 0a 20  ing the UPDATE. 
a680: 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e         ** within
a690: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 72 69 67   the action trig
a6a0: 67 65 72 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ger)..        **
a6b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
a6c0: 20 32 3a 20 41 74 20 66 69 72 73 74 20 67 6c 61   2: At first gla
a6d0: 6e 63 65 20 69 74 20 6d 61 79 20 73 65 65 6d 20  nce it may seem 
a6e0: 6c 69 6b 65 20 53 51 4c 69 74 65 20 63 6f 75 6c  like SQLite coul
a6f0: 64 20 73 69 6d 70 6c 79 20 6f 6d 69 74 0a 20 20  d simply omit.  
a700: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 4f 50 5f        ** all OP_
a710: 46 6b 43 6f 75 6e 74 65 72 20 72 65 6c 61 74 65  FkCounter relate
a720: 64 20 73 63 61 6e 73 20 77 68 65 6e 20 65 69 74  d scans when eit
a730: 68 65 72 20 43 41 53 43 41 44 45 20 6f 72 20 53  her CASCADE or S
a740: 45 54 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  ET NULL.        
a750: 2a 2a 20 61 70 70 6c 69 65 73 2e 20 54 68 65 20  ** applies. The 
a760: 74 72 6f 75 62 6c 65 20 73 74 61 72 74 73 20 69  trouble starts i
a770: 66 20 74 68 65 20 43 41 53 43 41 44 45 20 6f 72  f the CASCADE or
a780: 20 53 45 54 20 4e 55 4c 4c 20 61 63 74 69 6f 6e   SET NULL action
a790: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69   .        ** tri
a7a0: 67 67 65 72 20 63 61 75 73 65 73 20 6f 74 68 65  gger causes othe
a7b0: 72 20 74 72 69 67 67 65 72 73 20 6f 72 20 61 63  r triggers or ac
a7c0: 74 69 6f 6e 20 72 75 6c 65 73 20 61 74 74 61 63  tion rules attac
a7d0: 68 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  hed to the .    
a7e0: 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 74 61 62      ** child tab
a7f0: 6c 65 20 74 6f 20 66 69 72 65 2e 20 49 6e 20 74  le to fire. In t
a800: 68 65 73 65 20 63 61 73 65 73 20 74 68 65 20 66  hese cases the f
a810: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  k constraint cou
a820: 6e 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  nters.        **
a830: 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 6e   might be set in
a840: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 61 6e 79  correctly if any
a850: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 72 65   OP_FkCounter re
a860: 6c 61 74 65 64 20 73 63 61 6e 73 20 61 72 65 20  lated scans are 
a870: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74  .        ** omit
a880: 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ted.  */.       
a890: 20 69 66 28 20 21 70 46 4b 65 79 2d 3e 69 73 44   if( !pFKey->isD
a8a0: 65 66 65 72 72 65 64 20 26 26 20 65 41 63 74 69  eferred && eActi
a8b0: 6f 6e 21 3d 4f 45 5f 43 61 73 63 61 64 65 20 26  on!=OE_Cascade &
a8c0: 26 20 65 41 63 74 69 6f 6e 21 3d 4f 45 5f 53 65  & eAction!=OE_Se
a8d0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
a8e0: 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
a8f0: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a910: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
a920: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
a930: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
a940: 28 64 62 2c 20 70 53 72 63 29 3b 0a 20 20 20 20  (db, pSrc);.    
a950: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
a960: 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 29 3b 0a  ree(db, aiCol);.
a970: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 43    }.}..#define C
a980: 4f 4c 55 4d 4e 5f 4d 41 53 4b 28 78 29 20 28 28  OLUMN_MASK(x) ((
a990: 28 78 29 3e 33 31 29 20 3f 20 30 78 66 66 66 66  (x)>31) ? 0xffff
a9a0: 66 66 66 66 20 3a 20 28 28 75 33 32 29 31 3c 3c  ffff : ((u32)1<<
a9b0: 28 78 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  (x)))../*.** Thi
a9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a9d0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 67 65 6e 65  lled before gene
a9e0: 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 75  rating code to u
a9f0: 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
aa00: 61 20 0a 2a 2a 20 72 6f 77 20 63 6f 6e 74 61 69  a .** row contai
aa10: 6e 65 64 20 69 6e 20 74 61 62 6c 65 20 70 54 61  ned in table pTa
aa20: 62 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  b..*/.u32 sqlite
aa30: 33 46 6b 4f 6c 64 6d 61 73 6b 28 0a 20 20 50 61  3FkOldmask(.  Pa
aa40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa60: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
aa70: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
aaa0: 6e 67 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 29  ng modified */.)
aab0: 7b 0a 20 20 75 33 32 20 6d 61 73 6b 20 3d 20 30  {.  u32 mask = 0
aac0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
aad0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
aae0: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 29 7b 0a  _ForeignKeys ){.
aaf0: 20 20 20 20 46 4b 65 79 20 2a 70 3b 0a 20 20 20      FKey *p;.   
ab00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ab10: 70 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  p=pTab->pFKey; p
ab20: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 46 72 6f 6d  ; p=p->pNextFrom
ab30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
ab40: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
ab50: 29 20 6d 61 73 6b 20 7c 3d 20 43 4f 4c 55 4d 4e  ) mask |= COLUMN
ab60: 5f 4d 41 53 4b 28 70 2d 3e 61 43 6f 6c 5b 69 5d  _MASK(p->aCol[i]
ab70: 2e 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20  .iFrom);.    }. 
ab80: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33     for(p=sqlite3
ab90: 46 6b 52 65 66 65 72 65 6e 63 65 73 28 70 54 61  FkReferences(pTa
aba0: 62 29 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  b); p; p=p->pNex
abb0: 74 54 6f 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  tTo){.      Inde
abc0: 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
abd0: 20 20 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61     sqlite3FkLoca
abe0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
abf0: 70 54 61 62 2c 20 70 2c 20 26 70 49 64 78 2c 20  pTab, p, &pIdx, 
ac00: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  0);.      if( pI
ac10: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  dx ){.        fo
ac20: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
ac30: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
ac40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ac50: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
ac60: 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
ac70: 20 20 6d 61 73 6b 20 7c 3d 20 43 4f 4c 55 4d 4e    mask |= COLUMN
ac80: 5f 4d 41 53 4b 28 70 49 64 78 2d 3e 61 69 43 6f  _MASK(pIdx->aiCo
ac90: 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lumn[i]);.      
aca0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
acb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
acc0: 61 73 6b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ask;.}.../*.** T
acd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ace0: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 67 65  called before ge
acf0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f  nerating code to
ad00: 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
ad10: 65 20 61 20 0a 2a 2a 20 72 6f 77 20 63 6f 6e 74  e a .** row cont
ad20: 61 69 6e 65 64 20 69 6e 20 74 61 62 6c 65 20 70  ained in table p
ad30: 54 61 62 2e 20 49 66 20 74 68 65 20 6f 70 65 72  Tab. If the oper
ad40: 61 74 69 6f 6e 20 69 73 20 61 20 44 45 4c 45 54  ation is a DELET
ad50: 45 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d  E, then.** param
ad60: 65 74 65 72 20 61 43 68 61 6e 67 65 20 69 73 20  eter aChange is 
ad70: 70 61 73 73 65 64 20 61 20 4e 55 4c 4c 20 76 61  passed a NULL va
ad80: 6c 75 65 2e 20 46 6f 72 20 61 6e 20 55 50 44 41  lue. For an UPDA
ad90: 54 45 2c 20 61 43 68 61 6e 67 65 20 70 6f 69 6e  TE, aChange poin
ada0: 74 73 0a 2a 2a 20 74 6f 20 61 6e 20 61 72 72 61  ts.** to an arra
adb0: 79 20 6f 66 20 73 69 7a 65 20 4e 2c 20 77 68 65  y of size N, whe
adc0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
add0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
ade0: 20 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2a 20   table pTab..** 
adf0: 49 66 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  If the i'th colu
ae00: 6d 6e 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  mn is not modifi
ae10: 65 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45  ed by the UPDATE
ae20: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
ae30: 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 6e 74  sponding .** ent
ae40: 72 79 20 69 6e 20 74 68 65 20 61 43 68 61 6e 67  ry in the aChang
ae50: 65 5b 5d 20 61 72 72 61 79 20 69 73 20 73 65 74  e[] array is set
ae60: 20 74 6f 20 2d 31 2e 20 49 66 20 74 68 65 20 63   to -1. If the c
ae70: 6f 6c 75 6d 6e 20 69 73 20 6d 6f 64 69 66 69 65  olumn is modifie
ae80: 64 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  d,.** the value 
ae90: 69 73 20 30 20 6f 72 20 67 72 65 61 74 65 72 2e  is 0 or greater.
aea0: 20 50 61 72 61 6d 65 74 65 72 20 63 68 6e 67 52   Parameter chngR
aeb0: 6f 77 69 64 20 69 73 20 73 65 74 20 74 6f 20 74  owid is set to t
aec0: 72 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 55 50  rue if the.** UP
aed0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 6d  DATE statement m
aee0: 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69  odifies the rowi
aef0: 64 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  d fields of the 
af00: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
af10: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  any foreign key 
af20: 70 72 6f 63 65 73 73 69 6e 67 20 77 69 6c 6c 20  processing will 
af30: 62 65 20 72 65 71 75 69 72 65 64 2c 20 74 68 69  be required, thi
af40: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
af50: 6e 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  ns.** non-zero. 
af60: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 66  If there is no f
af70: 6f 72 65 69 67 6e 20 6b 65 79 20 72 65 6c 61 74  oreign key relat
af80: 65 64 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 74  ed processing, t
af90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
afa0: 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 0a 2a   returns zero..*
afb0: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44 41  *.** For an UPDA
afc0: 54 45 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  TE, this functio
afd0: 6e 20 72 65 74 75 72 6e 73 20 32 20 69 66 3a 0a  n returns 2 if:.
afe0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 72 65 20  **.**   * There 
aff0: 61 72 65 20 61 6e 79 20 46 4b 73 20 66 6f 72 20  are any FKs for 
b000: 77 68 69 63 68 20 70 54 61 62 20 69 73 20 74 68  which pTab is th
b010: 65 20 63 68 69 6c 64 20 61 6e 64 20 74 68 65 20  e child and the 
b020: 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 6f 72  parent table, or
b030: 0a 2a 2a 20 20 20 2a 20 74 68 65 20 55 50 44 41  .**   * the UPDA
b040: 54 45 20 6d 6f 64 69 66 69 65 73 20 6f 6e 65 20  TE modifies one 
b050: 6f 72 20 6d 6f 72 65 20 70 61 72 65 6e 74 20 6b  or more parent k
b060: 65 79 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  eys for which th
b070: 65 20 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 20  e action is.**  
b080: 20 20 20 6e 6f 74 20 22 4e 4f 20 41 43 54 49 4f     not "NO ACTIO
b090: 4e 22 20 28 69 2e 65 2e 20 69 73 20 43 41 53 43  N" (i.e. is CASC
b0a0: 41 44 45 2c 20 53 45 54 20 44 45 46 41 55 4c 54  ADE, SET DEFAULT
b0b0: 20 6f 72 20 53 45 54 20 4e 55 4c 4c 29 2e 0a 2a   or SET NULL)..*
b0c0: 2a 0a 2a 2a 20 4f 72 2c 20 61 73 73 75 6d 69 6e  *.** Or, assumin
b0d0: 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 66 6f 72  g some other for
b0e0: 65 69 67 6e 20 6b 65 79 20 70 72 6f 63 65 73 73  eign key process
b0f0: 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2c  ing is required,
b100: 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
b110: 65 33 46 6b 52 65 71 75 69 72 65 64 28 0a 20 20  e3FkRequired(.  
b120: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
b150: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
b160: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
b170: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
b180: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 2a 2f  eing modified */
b190: 0a 20 20 69 6e 74 20 2a 61 43 68 61 6e 67 65 2c  .  int *aChange,
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 2f 2a 20 4e 6f 6e 2d 4e 55 4c 4c 20 66     /* Non-NULL f
b1c0: 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
b1d0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63 68  ions */.  int ch
b1e0: 6e 67 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  ngRowid         
b1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b200: 65 20 66 6f 72 20 55 50 44 41 54 45 20 74 68 61  e for UPDATE tha
b210: 74 20 61 66 66 65 63 74 73 20 72 6f 77 69 64 20  t affects rowid 
b220: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  */.){.  int eRet
b230: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
b240: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  se->db->flags&SQ
b250: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
b260: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 61 43 68   ){.    if( !aCh
b270: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ange ){.      /*
b280: 20 41 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74   A DELETE operat
b290: 69 6f 6e 2e 20 46 6f 72 65 69 67 6e 20 6b 65 79  ion. Foreign key
b2a0: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
b2b0: 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 0a  equired if the .
b2c0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69        ** table i
b2d0: 6e 20 71 75 65 73 74 69 6f 6e 20 69 73 20 65 69  n question is ei
b2e0: 74 68 65 72 20 74 68 65 20 63 68 69 6c 64 20 6f  ther the child o
b2f0: 72 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 66  r parent table f
b300: 6f 72 20 61 6e 79 20 0a 20 20 20 20 20 20 2a 2a  or any .      **
b310: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
b320: 73 74 72 61 69 6e 74 2e 20 20 2a 2f 0a 20 20 20  straint.  */.   
b330: 20 20 20 65 52 65 74 20 3d 20 28 73 71 6c 69 74     eRet = (sqlit
b340: 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28 70  e3FkReferences(p
b350: 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 46  Tab) || pTab->pF
b360: 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Key);.    }else{
b370: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
b380: 73 20 61 6e 20 55 50 44 41 54 45 2e 20 46 6f 72  s an UPDATE. For
b390: 65 69 67 6e 20 6b 65 79 20 70 72 6f 63 65 73 73  eign key process
b3a0: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  ing is only requ
b3b0: 69 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ired if the.    
b3c0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6d    ** operation m
b3d0: 6f 64 69 66 69 65 73 20 6f 6e 65 20 6f 72 20 6d  odifies one or m
b3e0: 6f 72 65 20 63 68 69 6c 64 20 6f 72 20 70 61 72  ore child or par
b3f0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ent key columns.
b400: 20 2a 2f 0a 20 20 20 20 20 20 46 4b 65 79 20 2a   */.      FKey *
b410: 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  p;..      /* Che
b420: 63 6b 20 69 66 20 61 6e 79 20 63 68 69 6c 64 20  ck if any child 
b430: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  key columns are 
b440: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
b450: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  */.      for(p=p
b460: 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 3b 20 70  Tab->pFKey; p; p
b470: 3d 70 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  =p->pNextFrom){.
b480: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
b490: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
b4a0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a  Tab->zName, p->z
b4b0: 54 6f 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  To) ) return 2;.
b4c0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6b 43 68          if( fkCh
b4d0: 69 6c 64 49 73 4d 6f 64 69 66 69 65 64 28 70 54  ildIsModified(pT
b4e0: 61 62 2c 20 70 2c 20 61 43 68 61 6e 67 65 2c 20  ab, p, aChange, 
b4f0: 63 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a 20 20  chngRowid) ){.  
b500: 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 31          eRet = 1
b510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b520: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68    }..      /* Ch
b530: 65 63 6b 20 69 66 20 61 6e 79 20 70 61 72 65 6e  eck if any paren
b540: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 72  t key columns ar
b550: 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  e being modified
b560: 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70  . */.      for(p
b570: 3d 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65  =sqlite3FkRefere
b580: 6e 63 65 73 28 70 54 61 62 29 3b 20 70 3b 20 70  nces(pTab); p; p
b590: 3d 70 2d 3e 70 4e 65 78 74 54 6f 29 7b 0a 20 20  =p->pNextTo){.  
b5a0: 20 20 20 20 20 20 69 66 28 20 66 6b 50 61 72 65        if( fkPare
b5b0: 6e 74 49 73 4d 6f 64 69 66 69 65 64 28 70 54 61  ntIsModified(pTa
b5c0: 62 2c 20 70 2c 20 61 43 68 61 6e 67 65 2c 20 63  b, p, aChange, c
b5d0: 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  hngRowid) ){.   
b5e0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
b5f0: 63 74 69 6f 6e 5b 31 5d 21 3d 4f 45 5f 4e 6f 6e  ction[1]!=OE_Non
b600: 65 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  e ) return 2;.  
b610: 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 31          eRet = 1
b620: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b630: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b640: 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
b650: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b660: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
b670: 65 6e 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  en an UPDATE or 
b680: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
b690: 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 63 6f   is being .** co
b6a0: 6d 70 69 6c 65 64 20 6f 6e 20 74 61 62 6c 65 20  mpiled on table 
b6b0: 70 54 61 62 2c 20 77 68 69 63 68 20 69 73 20 74  pTab, which is t
b6c0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
b6d0: 6f 66 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 70  of foreign-key p
b6e0: 46 4b 65 79 2e 0a 2a 2a 20 49 66 20 74 68 65 20  FKey..** If the 
b6f0: 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f  current operatio
b700: 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20  n is an UPDATE, 
b710: 74 68 65 6e 20 74 68 65 20 70 43 68 61 6e 67 65  then the pChange
b720: 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 0a 2a  s parameter is.*
b730: 2a 20 70 61 73 73 65 64 20 61 20 70 6f 69 6e 74  * passed a point
b740: 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  er to the list o
b750: 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67 20  f columns being 
b760: 6d 6f 64 69 66 69 65 64 2e 20 49 66 20 69 74 20  modified. If it 
b770: 69 73 20 61 0a 2a 2a 20 44 45 4c 45 54 45 2c 20  is a.** DELETE, 
b780: 70 43 68 61 6e 67 65 73 20 69 73 20 70 61 73 73  pChanges is pass
b790: 65 64 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ed a NULL pointe
b7a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 72 65 74 75  r..**.** It retu
b7b0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
b7c0: 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75 63   a Trigger struc
b7d0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
b7e0: 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 65 71 75  a trigger.** equ
b7f0: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 4f  ivalent to the O
b800: 4e 20 55 50 44 41 54 45 20 6f 72 20 4f 4e 20 44  N UPDATE or ON D
b810: 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 73 70 65  ELETE action spe
b820: 63 69 66 69 65 64 20 62 79 20 70 46 4b 65 79 2e  cified by pFKey.
b830: 0a 2a 2a 20 49 66 20 74 68 65 20 61 63 74 69 6f  .** If the actio
b840: 6e 20 69 73 20 22 4e 4f 20 41 43 54 49 4f 4e 22  n is "NO ACTION"
b850: 20 6f 72 20 22 52 45 53 54 52 49 43 54 22 2c 20   or "RESTRICT", 
b860: 74 68 65 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  then a NULL poin
b870: 74 65 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ter is.** return
b880: 65 64 20 28 74 68 65 73 65 20 61 63 74 69 6f 6e  ed (these action
b890: 73 20 72 65 71 75 69 72 65 20 6e 6f 20 73 70 65  s require no spe
b8a0: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 62 79  cial handling by
b8b0: 20 74 68 65 20 74 72 69 67 67 65 72 73 0a 2a 2a   the triggers.**
b8c0: 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 63 6f 64   sub-system, cod
b8d0: 65 20 66 6f 72 20 74 68 65 6d 20 69 73 20 63 72  e for them is cr
b8e0: 65 61 74 65 64 20 62 79 20 66 6b 53 63 61 6e 43  eated by fkScanC
b8f0: 68 69 6c 64 72 65 6e 28 29 29 2e 0a 2a 2a 0a 2a  hildren())..**.*
b900: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
b910: 66 20 70 46 4b 65 79 20 69 73 20 74 68 65 20 66  f pFKey is the f
b920: 6f 72 65 69 67 6e 20 6b 65 79 20 61 6e 64 20 70  oreign key and p
b930: 54 61 62 20 69 73 20 74 61 62 6c 65 20 22 70 22  Tab is table "p"
b940: 20 69 6e 20 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c   in .** the foll
b950: 6f 77 69 6e 67 20 73 63 68 65 6d 61 3a 0a 2a 2a  owing schema:.**
b960: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
b970: 4c 45 20 70 28 70 6b 20 50 52 49 4d 41 52 59 20  LE p(pk PRIMARY 
b980: 4b 45 59 29 3b 0a 2a 2a 20 20 20 43 52 45 41 54  KEY);.**   CREAT
b990: 45 20 54 41 42 4c 45 20 63 28 63 6b 20 52 45 46  E TABLE c(ck REF
b9a0: 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
b9b0: 45 54 45 20 43 41 53 43 41 44 45 29 3b 0a 2a 2a  ETE CASCADE);.**
b9c0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
b9d0: 75 72 6e 65 64 20 74 72 69 67 67 65 72 20 73 74  urned trigger st
b9e0: 72 75 63 74 75 72 65 20 69 73 20 65 71 75 69 76  ructure is equiv
b9f0: 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  alent to:.**.** 
ba00: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
ba10: 20 2e 2e 2e 20 44 45 4c 45 54 45 20 4f 4e 20 70   ... DELETE ON p
ba20: 20 42 45 47 49 4e 0a 2a 2a 20 20 20 20 20 44 45   BEGIN.**     DE
ba30: 4c 45 54 45 20 46 52 4f 4d 20 63 20 57 48 45 52  LETE FROM c WHER
ba40: 45 20 63 6b 20 3d 20 6f 6c 64 2e 70 6b 3b 0a 2a  E ck = old.pk;.*
ba50: 2a 20 20 20 45 4e 44 3b 0a 2a 2a 0a 2a 2a 20 54  *   END;.**.** T
ba60: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
ba70: 74 65 72 20 69 73 20 63 61 63 68 65 64 20 61 73  ter is cached as
ba80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6f 72   part of the for
ba90: 65 69 67 6e 20 6b 65 79 20 6f 62 6a 65 63 74 2e  eign key object.
baa0: 20 49 74 0a 2a 2a 20 69 73 20 65 76 65 6e 74 75   It.** is eventu
bab0: 61 6c 6c 79 20 66 72 65 65 64 20 61 6c 6f 6e 67  ally freed along
bac0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f   with the rest o
bad0: 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  f the foreign ke
bae0: 79 20 6f 62 6a 65 63 74 20 62 79 20 0a 2a 2a 20  y object by .** 
baf0: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
bb00: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69  )..*/.static Tri
bb10: 67 67 65 72 20 2a 66 6b 41 63 74 69 6f 6e 54 72  gger *fkActionTr
bb20: 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a  igger(.  Parse *
bb30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
bb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
bb50: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
bb60: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb80: 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70  * Table being up
bb90: 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  dated or deleted
bba0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 4b 65 79 20   from */.  FKey 
bbb0: 2a 70 46 4b 65 79 2c 20 20 20 20 20 20 20 20 20  *pFKey,         
bbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
bbd0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 67 65 74  reign key to get
bbe0: 20 61 63 74 69 6f 6e 20 66 6f 72 20 2a 2f 0a 20   action for */. 
bbf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
bc00: 67 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ges             
bc10: 20 2f 2a 20 43 68 61 6e 67 65 2d 6c 69 73 74 20   /* Change-list 
bc20: 66 6f 72 20 55 50 44 41 54 45 2c 20 4e 55 4c 4c  for UPDATE, NULL
bc30: 20 66 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 29   for DELETE */.)
bc40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
bc50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
bc60: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
bc70: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
bc80: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bca0: 6e 65 20 6f 66 20 4f 45 5f 4e 6f 6e 65 2c 20 4f  ne of OE_None, O
bcb0: 45 5f 43 61 73 63 61 64 65 20 65 74 63 2e 20 2a  E_Cascade etc. *
bcc0: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
bcd0: 69 67 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  igger;          
bce0: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 64      /* Trigger d
bcf0: 65 66 69 6e 69 74 69 6f 6e 20 74 6f 20 72 65 74  efinition to ret
bd00: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 41 63  urn */.  int iAc
bd10: 74 69 6f 6e 20 3d 20 28 70 43 68 61 6e 67 65 73  tion = (pChanges
bd20: 21 3d 30 29 3b 20 20 20 20 2f 2a 20 31 20 66 6f  !=0);    /* 1 fo
bd30: 72 20 55 50 44 41 54 45 2c 20 30 20 66 6f 72 20  r UPDATE, 0 for 
bd40: 44 45 4c 45 54 45 20 2a 2f 0a 0a 20 20 61 63 74  DELETE */..  act
bd50: 69 6f 6e 20 3d 20 70 46 4b 65 79 2d 3e 61 41 63  ion = pFKey->aAc
bd60: 74 69 6f 6e 5b 69 41 63 74 69 6f 6e 5d 3b 0a 20  tion[iAction];. 
bd70: 20 69 66 28 20 61 63 74 69 6f 6e 3d 3d 4f 45 5f   if( action==OE_
bd80: 52 65 73 74 72 69 63 74 20 26 26 20 28 64 62 2d  Restrict && (db-
bd90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
bda0: 44 65 66 65 72 46 4b 73 29 20 29 7b 0a 20 20 20  DeferFKs) ){.   
bdb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bdc0: 20 70 54 72 69 67 67 65 72 20 3d 20 70 46 4b 65   pTrigger = pFKe
bdd0: 79 2d 3e 61 70 54 72 69 67 67 65 72 5b 69 41 63  y->apTrigger[iAc
bde0: 74 69 6f 6e 5d 3b 0a 0a 20 20 69 66 28 20 61 63  tion];..  if( ac
bdf0: 74 69 6f 6e 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  tion!=OE_None &&
be00: 20 21 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20   !pTrigger ){.  
be10: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
be20: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
be30: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 68 69 6c 64  /* Name of child
be40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
be50: 74 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t nFrom;        
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
be70: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
be80: 66 20 7a 46 72 6f 6d 20 2a 2f 0a 20 20 20 20 49  f zFrom */.    I
be90: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 20  ndex *pIdx = 0; 
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 50 61 72 65 6e 74 20 6b 65 79 20 69 6e 64 65 78  Parent key index
bec0: 20 66 6f 72 20 74 68 69 73 20 46 4b 20 2a 2f 0a   for this FK */.
bed0: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d      int *aiCol =
bee0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bef0: 20 20 2f 2a 20 63 68 69 6c 64 20 74 61 62 6c 65    /* child table
bf00: 20 63 6f 6c 73 20 2d 3e 20 70 61 72 65 6e 74 20   cols -> parent 
bf10: 6b 65 79 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20  key cols */.    
bf20: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
bf30: 65 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ep = 0;        /
bf40: 2a 20 46 69 72 73 74 20 28 6f 6e 6c 79 29 20 73  * First (only) s
bf50: 74 65 70 20 6f 66 20 74 72 69 67 67 65 72 20 70  tep of trigger p
bf60: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 45 78  rogram */.    Ex
bf70: 70 72 20 2a 70 57 68 65 72 65 20 3d 20 30 3b 20  pr *pWhere = 0; 
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
bf90: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
bfa0: 72 69 67 67 65 72 20 73 74 65 70 20 2a 2f 0a 20  rigger step */. 
bfb0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
bfc0: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
bfd0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74   /* Changes list
bfe0: 20 69 66 20 4f 4e 20 55 50 44 41 54 45 20 43 41   if ON UPDATE CA
bff0: 53 43 41 44 45 20 2a 2f 0a 20 20 20 20 53 65 6c  SCADE */.    Sel
c000: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30  ect *pSelect = 0
c010: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
c020: 20 52 45 53 54 52 49 43 54 2c 20 22 53 45 4c 45   RESTRICT, "SELE
c030: 43 54 20 52 41 49 53 45 28 2e 2e 2e 29 22 20 2a  CT RAISE(...)" *
c040: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
c070: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
c080: 45 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b  Expr *pWhen = 0;
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0a0: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 66 6f 72   WHEN clause for
c0b0: 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a   the trigger */.
c0c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c0d0: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
c0e0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 46 4b 65  arse, pTab, pFKe
c0f0: 79 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c  y, &pIdx, &aiCol
c100: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
c110: 20 20 61 73 73 65 72 74 28 20 61 69 43 6f 6c 20    assert( aiCol 
c120: 7c 7c 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3d 3d  || pFKey->nCol==
c130: 31 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  1 );..    for(i=
c140: 30 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0; i<pFKey->nCol
c150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 6f  ; i++){.      To
c160: 6b 65 6e 20 74 4f 6c 64 20 3d 20 7b 20 22 6f 6c  ken tOld = { "ol
c170: 64 22 2c 20 33 20 7d 3b 20 20 2f 2a 20 4c 69 74  d", 3 };  /* Lit
c180: 65 72 61 6c 20 22 6f 6c 64 22 20 74 6f 6b 65 6e  eral "old" token
c190: 20 2a 2f 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20   */.      Token 
c1a0: 74 4e 65 77 20 3d 20 7b 20 22 6e 65 77 22 2c 20  tNew = { "new", 
c1b0: 33 20 7d 3b 20 20 2f 2a 20 4c 69 74 65 72 61 6c  3 };  /* Literal
c1c0: 20 22 6e 65 77 22 20 74 6f 6b 65 6e 20 2a 2f 0a   "new" token */.
c1d0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 74 46 72 6f        Token tFro
c1e0: 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  mCol;           
c1f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
c200: 75 6d 6e 20 69 6e 20 63 68 69 6c 64 20 74 61 62  umn in child tab
c210: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 54 6f 6b 65  le */.      Toke
c220: 6e 20 74 54 6f 43 6f 6c 3b 20 20 20 20 20 20 20  n tToCol;       
c230: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
c240: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 61 72  of column in par
c250: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ent table */.   
c260: 20 20 20 69 6e 74 20 69 46 72 6f 6d 43 6f 6c 3b     int iFromCol;
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c280: 2a 20 49 64 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  * Idx of column 
c290: 69 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 20 2a  in child table *
c2a0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
c2b0: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
c2c0: 20 20 20 20 2f 2a 20 74 46 72 6f 6d 43 6f 6c 20      /* tFromCol 
c2d0: 3d 20 4f 4c 44 2e 74 54 6f 43 6f 6c 20 2a 2f 0a  = OLD.tToCol */.
c2e0: 0a 20 20 20 20 20 20 69 46 72 6f 6d 43 6f 6c 20  .      iFromCol 
c2f0: 3d 20 61 69 43 6f 6c 20 3f 20 61 69 43 6f 6c 5b  = aiCol ? aiCol[
c300: 69 5d 20 3a 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  i] : pFKey->aCol
c310: 5b 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20  [0].iFrom;.     
c320: 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 43 6f   assert( iFromCo
c330: 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l>=0 );.      as
c340: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 7c 7c  sert( pIdx!=0 ||
c350: 20 28 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30   (pTab->iPKey>=0
c360: 20 26 26 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   && pTab->iPKey<
c370: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
c380: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
c390: 78 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 61 69  x==0 || pIdx->ai
c3a0: 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a  Column[i]>=0 );.
c3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
c3c0: 65 6e 49 6e 69 74 28 26 74 54 6f 43 6f 6c 2c 0a  enInit(&tToCol,.
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49     pTab->aCol[pI
c3f0: 64 78 20 3f 20 70 49 64 78 2d 3e 61 69 43 6f 6c  dx ? pIdx->aiCol
c400: 75 6d 6e 5b 69 5d 20 3a 20 70 54 61 62 2d 3e 69  umn[i] : pTab->i
c410: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
c420: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
c430: 49 6e 69 74 28 26 74 46 72 6f 6d 43 6f 6c 2c 20  Init(&tFromCol, 
c440: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 2d 3e 61 43  pFKey->pFrom->aC
c450: 6f 6c 5b 69 46 72 6f 6d 43 6f 6c 5d 2e 7a 4e 61  ol[iFromCol].zNa
c460: 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  me);..      /* C
c470: 72 65 61 74 65 20 74 68 65 20 65 78 70 72 65 73  reate the expres
c480: 73 69 6f 6e 20 22 4f 4c 44 2e 7a 54 6f 43 6f 6c  sion "OLD.zToCol
c490: 20 3d 20 7a 46 72 6f 6d 43 6f 6c 22 2e 20 49 74   = zFromCol". It
c4a0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20   is important.  
c4b0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
c4c0: 22 4f 4c 44 2e 7a 54 6f 43 6f 6c 22 20 74 65 72  "OLD.zToCol" ter
c4d0: 6d 20 69 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  m is on the LHS 
c4e0: 6f 66 20 74 68 65 20 3d 20 6f 70 65 72 61 74 6f  of the = operato
c4f0: 72 2c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 74  r, so.      ** t
c500: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
c510: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   and collation s
c520: 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74  equence associat
c530: 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ed with the.    
c540: 20 20 2a 2a 20 70 61 72 65 6e 74 20 74 61 62 6c    ** parent tabl
c550: 65 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  e are used for t
c560: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a  he comparison. *
c570: 2f 0a 20 20 20 20 20 20 70 45 71 20 3d 20 73 71  /.      pEq = sq
c580: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c590: 65 2c 20 54 4b 5f 45 51 2c 0a 20 20 20 20 20 20  e, TK_EQ,.      
c5a0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c5b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
c5c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
c5d0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c5e0: 62 2c 20 54 4b 5f 49 44 2c 20 26 74 4f 6c 64 2c  b, TK_ID, &tOld,
c5f0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
c600: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
c610: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74 54  c(db, TK_ID, &tT
c620: 6f 43 6f 6c 2c 20 30 29 29 2c 0a 20 20 20 20 20  oCol, 0)),.     
c630: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c640: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
c650: 20 26 74 46 72 6f 6d 43 6f 6c 2c 20 30 29 0a 20   &tFromCol, 0). 
c660: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 57       );.      pW
c670: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
c680: 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 57  prAnd(pParse, pW
c690: 68 65 72 65 2c 20 70 45 71 29 3b 0a 0a 20 20 20  here, pEq);..   
c6a0: 20 20 20 2f 2a 20 46 6f 72 20 4f 4e 20 55 50 44     /* For ON UPD
c6b0: 41 54 45 2c 20 63 6f 6e 73 74 72 75 63 74 20 74  ATE, construct t
c6c0: 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20  he next term of 
c6d0: 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65 2e  the WHEN clause.
c6e0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66 69  .      ** The fi
c6f0: 6e 61 6c 20 57 48 45 4e 20 63 6c 61 75 73 65 20  nal WHEN clause 
c700: 77 69 6c 6c 20 62 65 20 6c 69 6b 65 20 74 68 69  will be like thi
c710: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
c720: 20 20 2a 2a 20 20 20 20 57 48 45 4e 20 4e 4f 54    **    WHEN NOT
c730: 28 6f 6c 64 2e 63 6f 6c 31 20 49 53 20 6e 65 77  (old.col1 IS new
c740: 2e 63 6f 6c 31 20 41 4e 44 20 2e 2e 2e 20 41 4e  .col1 AND ... AN
c750: 44 20 6f 6c 64 2e 63 6f 6c 4e 20 49 53 20 6e 65  D old.colN IS ne
c760: 77 2e 63 6f 6c 4e 29 0a 20 20 20 20 20 20 2a 2f  w.colN).      */
c770: 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 61 6e  .      if( pChan
c780: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ges ){.        p
c790: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
c7a0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 53 2c  r(pParse, TK_IS,
c7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
c7c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c7d0: 2c 20 54 4b 5f 44 4f 54 2c 20 0a 20 20 20 20 20  , TK_DOT, .     
c7e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c7f0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
c800: 5f 49 44 2c 20 26 74 4f 6c 64 2c 20 30 29 2c 0a  _ID, &tOld, 0),.
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c820: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
c830: 62 2c 20 54 4b 5f 49 44 2c 20 26 74 54 6f 43 6f  b, TK_ID, &tToCo
c840: 6c 2c 20 30 29 29 2c 0a 20 20 20 20 20 20 20 20  l, 0)),.        
c850: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c860: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
c870: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c880: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
c890: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74 4e 65  (db, TK_ID, &tNe
c8a0: 77 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  w, 0),.         
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c8c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
c8d0: 20 26 74 54 6f 43 6f 6c 2c 20 30 29 29 0a 20 20   &tToCol, 0)).  
c8e0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
c8f0: 20 20 20 20 20 70 57 68 65 6e 20 3d 20 73 71 6c       pWhen = sql
c900: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
c910: 73 65 2c 20 70 57 68 65 6e 2c 20 70 45 71 29 3b  se, pWhen, pEq);
c920: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
c930: 20 20 69 66 28 20 61 63 74 69 6f 6e 21 3d 4f 45    if( action!=OE
c940: 5f 52 65 73 74 72 69 63 74 20 26 26 20 28 61 63  _Restrict && (ac
c950: 74 69 6f 6e 21 3d 4f 45 5f 43 61 73 63 61 64 65  tion!=OE_Cascade
c960: 20 7c 7c 20 70 43 68 61 6e 67 65 73 29 20 29 7b   || pChanges) ){
c970: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
c980: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  New;.        if(
c990: 20 61 63 74 69 6f 6e 3d 3d 4f 45 5f 43 61 73 63   action==OE_Casc
c9a0: 61 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ade ){.         
c9b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
c9c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c9d0: 44 4f 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  DOT, .          
c9e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
c9f0: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 74  oc(db, TK_ID, &t
ca00: 4e 65 77 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  New, 0),.       
ca10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ca20: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
ca30: 20 26 74 54 6f 43 6f 6c 2c 20 30 29 29 3b 0a 20   &tToCol, 0));. 
ca40: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ca50: 20 61 63 74 69 6f 6e 3d 3d 4f 45 5f 53 65 74 44   action==OE_SetD
ca60: 66 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  flt ){.         
ca70: 20 45 78 70 72 20 2a 70 44 66 6c 74 20 3d 20 70   Expr *pDflt = p
ca80: 46 4b 65 79 2d 3e 70 46 72 6f 6d 2d 3e 61 43 6f  FKey->pFrom->aCo
ca90: 6c 5b 69 46 72 6f 6d 43 6f 6c 5d 2e 70 44 66 6c  l[iFromCol].pDfl
caa0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  t;.          if(
cab0: 20 70 44 66 6c 74 20 29 7b 0a 20 20 20 20 20 20   pDflt ){.      
cac0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
cad0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
cae0: 70 44 66 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  pDflt, 0);.     
caf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb00: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
cb10: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
cb20: 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  db, TK_NULL, 0, 
cb30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
cb40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cb50: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
cb60: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
cb70: 28 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  (db, TK_NULL, 0,
cb80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
cb90: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
cba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
cbb0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  pend(pParse, pLi
cbc0: 73 74 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  st, pNew);.     
cbd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
cbe0: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
cbf0: 2c 20 70 4c 69 73 74 2c 20 26 74 46 72 6f 6d 43  , pList, &tFromC
cc00: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, 0);.      }.
cc10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
cc20: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
cc30: 6c 29 3b 0a 0a 20 20 20 20 7a 46 72 6f 6d 20 3d  l);..    zFrom =
cc40: 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 2d 3e 7a   pFKey->pFrom->z
cc50: 4e 61 6d 65 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  Name;.    nFrom 
cc60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cc70: 30 28 7a 46 72 6f 6d 29 3b 0a 0a 20 20 20 20 69  0(zFrom);..    i
cc80: 66 28 20 61 63 74 69 6f 6e 3d 3d 4f 45 5f 52 65  f( action==OE_Re
cc90: 73 74 72 69 63 74 20 29 7b 0a 20 20 20 20 20 20  strict ){.      
cca0: 54 6f 6b 65 6e 20 74 46 72 6f 6d 3b 0a 20 20 20  Token tFrom;.   
ccb0: 20 20 20 45 78 70 72 20 2a 70 52 61 69 73 65 3b     Expr *pRaise;
ccc0: 20 0a 0a 20 20 20 20 20 20 74 46 72 6f 6d 2e 7a   ..      tFrom.z
ccd0: 20 3d 20 7a 46 72 6f 6d 3b 0a 20 20 20 20 20 20   = zFrom;.      
cce0: 74 46 72 6f 6d 2e 6e 20 3d 20 6e 46 72 6f 6d 3b  tFrom.n = nFrom;
ccf0: 0a 20 20 20 20 20 20 70 52 61 69 73 65 20 3d 20  .      pRaise = 
cd00: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
cd10: 54 4b 5f 52 41 49 53 45 2c 20 22 46 4f 52 45 49  TK_RAISE, "FOREI
cd20: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
cd30: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
cd40: 20 20 69 66 28 20 70 52 61 69 73 65 20 29 7b 0a    if( pRaise ){.
cd50: 20 20 20 20 20 20 20 20 70 52 61 69 73 65 2d 3e          pRaise->
cd60: 61 66 66 69 6e 69 74 79 20 3d 20 4f 45 5f 41 62  affinity = OE_Ab
cd70: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
cd80: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 73 71 6c     pSelect = sql
cd90: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
cda0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
cdb0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cdc0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
cdd0: 2c 20 70 52 61 69 73 65 29 2c 0a 20 20 20 20 20  , pRaise),.     
cde0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
cdf0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
ce00: 2c 20 30 2c 20 26 74 46 72 6f 6d 2c 20 30 29 2c  , 0, &tFrom, 0),
ce10: 0a 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72  .          pWher
ce20: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  e,.          0, 
ce30: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20  0, 0, 0, 0.     
ce40: 20 29 3b 0a 20 20 20 20 20 20 70 57 68 65 72 65   );.      pWhere
ce50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
ce60: 20 2f 2a 20 44 69 73 61 62 6c 65 20 6c 6f 6f 6b   /* Disable look
ce70: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  aside memory all
ce80: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 64  ocation */.    d
ce90: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
cea0: 73 61 62 6c 65 2b 2b 3b 0a 0a 20 20 20 20 70 54  sable++;..    pT
ceb0: 72 69 67 67 65 72 20 3d 20 28 54 72 69 67 67 65  rigger = (Trigge
cec0: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
ced0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
cee0: 20 20 20 20 20 73 69 7a 65 6f 66 28 54 72 69 67       sizeof(Trig
cef0: 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 2f  ger) +         /
cf00: 2a 20 73 74 72 75 63 74 20 54 72 69 67 67 65 72  * struct Trigger
cf10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
cf20: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 20  of(TriggerStep) 
cf30: 2b 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20  +     /* Single 
cf40: 73 74 65 70 20 69 6e 20 74 72 69 67 67 65 72 20  step in trigger 
cf50: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 20  program */.     
cf60: 20 20 20 6e 46 72 6f 6d 20 2b 20 31 20 20 20 20     nFrom + 1    
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf80: 53 70 61 63 65 20 66 6f 72 20 70 53 74 65 70 2d  Space for pStep-
cf90: 3e 7a 54 61 72 67 65 74 20 2a 2f 0a 20 20 20 20  >zTarget */.    
cfa0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  );.    if( pTrig
cfb0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 70 53 74  ger ){.      pSt
cfc0: 65 70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 73  ep = pTrigger->s
cfd0: 74 65 70 5f 6c 69 73 74 20 3d 20 28 54 72 69 67  tep_list = (Trig
cfe0: 67 65 72 53 74 65 70 20 2a 29 26 70 54 72 69 67  gerStep *)&pTrig
cff0: 67 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53  ger[1];.      pS
d000: 74 65 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20 28  tep->zTarget = (
d010: 63 68 61 72 20 2a 29 26 70 53 74 65 70 5b 31 5d  char *)&pStep[1]
d020: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
d030: 63 68 61 72 20 2a 29 70 53 74 65 70 2d 3e 7a 54  char *)pStep->zT
d040: 61 72 67 65 74 2c 20 7a 46 72 6f 6d 2c 20 6e 46  arget, zFrom, nF
d050: 72 6f 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 70  rom);.  .      p
d060: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  Step->pWhere = s
d070: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
d080: 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52 44 55  , pWhere, EXPRDU
d090: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
d0a0: 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73   pStep->pExprLis
d0b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
d0c0: 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74  istDup(db, pList
d0d0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
d0e0: 29 3b 0a 20 20 20 20 20 20 70 53 74 65 70 2d 3e  );.      pStep->
d0f0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
d100: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
d110: 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
d120: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 69  REDUCE);.      i
d130: 66 28 20 70 57 68 65 6e 20 29 7b 0a 20 20 20 20  f( pWhen ){.    
d140: 20 20 20 20 70 57 68 65 6e 20 3d 20 73 71 6c 69      pWhen = sqli
d150: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
d160: 20 54 4b 5f 4e 4f 54 2c 20 70 57 68 65 6e 2c 20   TK_NOT, pWhen, 
d170: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 69  0);.        pTri
d180: 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20 73 71  gger->pWhen = sq
d190: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d1a0: 20 70 57 68 65 6e 2c 20 45 58 50 52 44 55 50 5f   pWhen, EXPRDUP_
d1b0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 7d  REDUCE);.      }
d1c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
d1d0: 65 2d 65 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f  e-enable the loo
d1e0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 2c 20 69  kaside buffer, i
d1f0: 66 20 69 74 20 77 61 73 20 64 69 73 61 62 6c 65  f it was disable
d200: 64 20 65 61 72 6c 69 65 72 2e 20 2a 2f 0a 20 20  d earlier. */.  
d210: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
d220: 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 0a 20 20 20  bDisable--;..   
d230: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
d240: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
d250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d260: 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 6e 29  elete(db, pWhen)
d270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
d280: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
d290: 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  pList);.    sqli
d2a0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d2b0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d2c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d2d0: 46 61 69 6c 65 64 3d 3d 31 20 29 7b 0a 20 20 20  Failed==1 ){.   
d2e0: 20 20 20 66 6b 54 72 69 67 67 65 72 44 65 6c 65     fkTriggerDele
d2f0: 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 29  te(db, pTrigger)
d300: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d320: 72 74 28 20 70 53 74 65 70 21 3d 30 20 29 3b 0a  rt( pStep!=0 );.
d330: 0a 20 20 20 20 73 77 69 74 63 68 28 20 61 63 74  .    switch( act
d340: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ion ){.      cas
d350: 65 20 4f 45 5f 52 65 73 74 72 69 63 74 3a 0a 20  e OE_Restrict:. 
d360: 20 20 20 20 20 20 20 70 53 74 65 70 2d 3e 6f 70         pStep->op
d370: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 20 0a 20   = TK_SELECT; . 
d380: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d390: 20 20 20 20 63 61 73 65 20 4f 45 5f 43 61 73 63      case OE_Casc
d3a0: 61 64 65 3a 20 0a 20 20 20 20 20 20 20 20 69 66  ade: .        if
d3b0: 28 20 21 70 43 68 61 6e 67 65 73 20 29 7b 20 0a  ( !pChanges ){ .
d3c0: 20 20 20 20 20 20 20 20 20 20 70 53 74 65 70 2d            pStep-
d3d0: 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b  >op = TK_DELETE;
d3e0: 20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61   .          brea
d3f0: 6b 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k; .        }.  
d400: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
d410: 20 20 20 20 20 70 53 74 65 70 2d 3e 6f 70 20 3d       pStep->op =
d420: 20 54 4b 5f 55 50 44 41 54 45 3b 0a 20 20 20 20   TK_UPDATE;.    
d430: 7d 0a 20 20 20 20 70 53 74 65 70 2d 3e 70 54 72  }.    pStep->pTr
d440: 69 67 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 20  ig = pTrigger;. 
d450: 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
d460: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
d470: 68 65 6d 61 3b 0a 20 20 20 20 70 54 72 69 67 67  hema;.    pTrigg
d480: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
d490: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
d4a0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 70 54 72 69      pFKey->apTri
d4b0: 67 67 65 72 5b 69 41 63 74 69 6f 6e 5d 20 3d 20  gger[iAction] = 
d4c0: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 70 54  pTrigger;.    pT
d4d0: 72 69 67 67 65 72 2d 3e 6f 70 20 3d 20 28 70 43  rigger->op = (pC
d4e0: 68 61 6e 67 65 73 20 3f 20 54 4b 5f 55 50 44 41  hanges ? TK_UPDA
d4f0: 54 45 20 3a 20 54 4b 5f 44 45 4c 45 54 45 29 3b  TE : TK_DELETE);
d500: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
d510: 54 72 69 67 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Trigger;.}../*.*
d520: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d530: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
d540: 65 6c 65 74 69 6e 67 20 6f 72 20 75 70 64 61 74  eleting or updat
d550: 69 6e 67 20 61 20 72 6f 77 20 74 6f 20 69 6d 70  ing a row to imp
d560: 6c 65 6d 65 6e 74 0a 2a 2a 20 61 6e 79 20 72 65  lement.** any re
d570: 71 75 69 72 65 64 20 43 41 53 43 41 44 45 2c 20  quired CASCADE, 
d580: 53 45 54 20 4e 55 4c 4c 20 6f 72 20 53 45 54 20  SET NULL or SET 
d590: 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e  DEFAULT actions.
d5a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5b0: 46 6b 41 63 74 69 6f 6e 73 28 0a 20 20 50 61 72  FkActions(.  Par
d5c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5e0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
d5f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
d620: 67 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  g updated or del
d630: 65 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  eted from */.  E
d640: 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65  xprList *pChange
d650: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
d660: 2a 20 43 68 61 6e 67 65 2d 6c 69 73 74 20 66 6f  * Change-list fo
d670: 72 20 55 50 44 41 54 45 2c 20 4e 55 4c 4c 20 66  r UPDATE, NULL f
d680: 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 69  or DELETE */.  i
d690: 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20 20  nt regOld,      
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 72 72  * Address of arr
d6c0: 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6c  ay containing ol
d6d0: 64 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a  d row */.  int *
d6e0: 61 43 68 61 6e 67 65 2c 20 20 20 20 20 20 20 20  aChange,        
d6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d700: 72 61 79 20 69 6e 64 69 63 61 74 69 6e 67 20 55  ray indicating U
d710: 50 44 41 54 45 64 20 63 6f 6c 75 6d 6e 73 20 28  PDATEd columns (
d720: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 62  or 0) */.  int b
d730: 43 68 6e 67 52 6f 77 69 64 20 20 20 20 20 20 20  ChngRowid       
d740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d750: 75 65 20 69 66 20 72 6f 77 69 64 20 69 73 20 55  ue if rowid is U
d760: 50 44 41 54 45 64 20 2a 2f 0a 29 7b 0a 20 20 2f  PDATEd */.){.  /
d770: 2a 20 49 66 20 66 6f 72 65 69 67 6e 2d 6b 65 79  * If foreign-key
d780: 20 73 75 70 70 6f 72 74 20 69 73 20 65 6e 61 62   support is enab
d790: 6c 65 64 2c 20 69 74 65 72 61 74 65 20 74 68 72  led, iterate thr
d7a0: 6f 75 67 68 20 61 6c 6c 20 46 4b 73 20 74 68 61  ough all FKs tha
d7b0: 74 20 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  t .  ** refer to
d7c0: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 49 66 20   table pTab. If 
d7d0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 69  there is an acti
d7e0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
d7f0: 74 68 20 74 68 65 20 46 4b 20 0a 20 20 2a 2a 20  th the FK .  ** 
d800: 66 6f 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  for this operati
d810: 6f 6e 20 28 65 69 74 68 65 72 20 75 70 64 61 74  on (either updat
d820: 65 20 6f 72 20 64 65 6c 65 74 65 29 2c 20 69 6e  e or delete), in
d830: 76 6f 6b 65 20 74 68 65 20 61 73 73 6f 63 69 61  voke the associa
d840: 74 65 64 20 0a 20 20 2a 2a 20 74 72 69 67 67 65  ted .  ** trigge
d850: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 20  r sub-program.  
d860: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d870: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
d880: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 29 7b  E_ForeignKeys ){
d890: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
d8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d8b0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
d8c0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  ariable */.    f
d8d0: 6f 72 28 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  or(pFKey = sqlit
d8e0: 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28 70  e3FkReferences(p
d8f0: 54 61 62 29 3b 20 70 46 4b 65 79 3b 20 70 46 4b  Tab); pFKey; pFK
d900: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  ey=pFKey->pNextT
d910: 6f 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 43  o){.      if( aC
d920: 68 61 6e 67 65 3d 3d 30 20 7c 7c 20 66 6b 50 61  hange==0 || fkPa
d930: 72 65 6e 74 49 73 4d 6f 64 69 66 69 65 64 28 70  rentIsModified(p
d940: 54 61 62 2c 20 70 46 4b 65 79 2c 20 61 43 68 61  Tab, pFKey, aCha
d950: 6e 67 65 2c 20 62 43 68 6e 67 52 6f 77 69 64 29  nge, bChngRowid)
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 72 69 67   ){.        Trig
d970: 67 65 72 20 2a 70 41 63 74 20 3d 20 66 6b 41 63  ger *pAct = fkAc
d980: 74 69 6f 6e 54 72 69 67 67 65 72 28 70 50 61 72  tionTrigger(pPar
d990: 73 65 2c 20 70 54 61 62 2c 20 70 46 4b 65 79 2c  se, pTab, pFKey,
d9a0: 20 70 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20   pChanges);.    
d9b0: 20 20 20 20 69 66 28 20 70 41 63 74 20 29 7b 0a      if( pAct ){.
d9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d9d0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 44  3CodeRowTriggerD
d9e0: 69 72 65 63 74 28 70 50 61 72 73 65 2c 20 70 41  irect(pParse, pA
d9f0: 63 74 2c 20 70 54 61 62 2c 20 72 65 67 4f 6c 64  ct, pTab, regOld
da00: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30 29 3b 0a  , OE_Abort, 0);.
da10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  }.    }.  }.}..#
da30: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
da40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
da50: 47 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72  GER */../*.** Fr
da60: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
da70: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 66 6f  sociated with fo
da80: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
da90: 74 69 6f 6e 73 20 61 74 74 61 63 68 65 64 20 74  tions attached t
daa0: 6f 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 2e  o.** table pTab.
dab0: 20 52 65 6d 6f 76 65 20 74 68 65 20 64 65 6c 65   Remove the dele
dac0: 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ted foreign keys
dad0: 20 66 72 6f 6d 20 74 68 65 20 53 63 68 65 6d 61   from the Schema
dae0: 2e 66 6b 65 79 48 61 73 68 0a 2a 2a 20 68 61 73  .fkeyHash.** has
daf0: 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  h table..*/.void
db00: 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65   sqlite3FkDelete
db10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
db20: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 46 4b  ble *pTab){.  FK
db30: 65 79 20 2a 70 46 4b 65 79 3b 20 20 20 20 20 20  ey *pFKey;      
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db50: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
db60: 6c 65 20 2a 2f 0a 20 20 46 4b 65 79 20 2a 70 4e  le */.  FKey *pN
db70: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
db80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
db90: 6f 66 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  of pFKey->pNextF
dba0: 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rom */..  assert
dbb0: 28 20 64 62 3d 3d 30 20 7c 7c 20 49 73 56 69 72  ( db==0 || IsVir
dbc0: 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20 20 20  tual(pTab).     
dbd0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 63      || sqlite3Sc
dbe0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
dbf0: 2c 20 30 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  , 0, pTab->pSche
dc00: 6d 61 29 20 29 3b 0a 20 20 66 6f 72 28 70 46 4b  ma) );.  for(pFK
dc10: 65 79 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  ey=pTab->pFKey; 
dc20: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
dc30: 78 74 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  xt){..    /* Rem
dc40: 6f 76 65 20 74 68 65 20 46 4b 20 66 72 6f 6d 20  ove the FK from 
dc50: 74 68 65 20 66 6b 65 79 48 61 73 68 20 68 61 73  the fkeyHash has
dc60: 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
dc70: 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70  if( !db || db->p
dc80: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
dc90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 65  {.      if( pFKe
dca0: 79 2d 3e 70 50 72 65 76 54 6f 20 29 7b 0a 20 20  y->pPrevTo ){.  
dcb0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 50 72        pFKey->pPr
dcc0: 65 76 54 6f 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  evTo->pNextTo = 
dcd0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 3b 0a  pFKey->pNextTo;.
dce0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dcf0: 20 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 28       void *p = (
dd00: 76 6f 69 64 20 2a 29 70 46 4b 65 79 2d 3e 70 4e  void *)pFKey->pN
dd10: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 63  extTo;.        c
dd20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
dd30: 70 20 3f 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  p ? pFKey->pNext
dd40: 54 6f 2d 3e 7a 54 6f 20 3a 20 70 46 4b 65 79 2d  To->zTo : pFKey-
dd50: 3e 7a 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  >zTo);.        s
dd60: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
dd70: 28 26 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 2d  (&pTab->pSchema-
dd80: 3e 66 6b 65 79 48 61 73 68 2c 20 7a 2c 20 70 29  >fkeyHash, z, p)
dd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dda0: 69 66 28 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  if( pFKey->pNext
ddb0: 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  To ){.        pF
ddc0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 2d 3e 70 50  Key->pNextTo->pP
ddd0: 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 2d 3e 70  revTo = pFKey->p
dde0: 50 72 65 76 54 6f 3b 0a 20 20 20 20 20 20 7d 0a  PrevTo;.      }.
ddf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56      }..    /* EV
de00: 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
de10: 45 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  Each foreign key
de20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53   constraint in S
de30: 51 4c 69 74 65 20 69 73 0a 20 20 20 20 2a 2a 20  QLite is.    ** 
de40: 63 6c 61 73 73 69 66 69 65 64 20 61 73 20 65 69  classified as ei
de50: 74 68 65 72 20 69 6d 6d 65 64 69 61 74 65 20 6f  ther immediate o
de60: 72 20 64 65 66 65 72 72 65 64 2e 0a 20 20 20 20  r deferred..    
de70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
de80: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
de90: 3d 3d 30 20 7c 7c 20 70 46 4b 65 79 2d 3e 69 73  ==0 || pFKey->is
dea0: 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 0a 0a  Deferred==1 );..
deb0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e      /* Delete an
dec0: 79 20 74 72 69 67 67 65 72 73 20 63 72 65 61 74  y triggers creat
ded0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
dee0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  actions for this
def0: 20 46 4b 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20   FK. */.#ifndef 
df00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
df10: 47 45 52 0a 20 20 20 20 66 6b 54 72 69 67 67 65  GER.    fkTrigge
df20: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 46 4b 65  rDelete(db, pFKe
df30: 79 2d 3e 61 70 54 72 69 67 67 65 72 5b 30 5d 29  y->apTrigger[0])
df40: 3b 0a 20 20 20 20 66 6b 54 72 69 67 67 65 72 44  ;.    fkTriggerD
df50: 65 6c 65 74 65 28 64 62 2c 20 70 46 4b 65 79 2d  elete(db, pFKey-
df60: 3e 61 70 54 72 69 67 67 65 72 5b 31 5d 29 3b 0a  >apTrigger[1]);.
df70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 4e 65 78  #endif..    pNex
df80: 74 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  t = pFKey->pNext
df90: 46 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  From;.    sqlite
dfa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
dfb0: 79 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  y);.  }.}.#endif
dfc0: 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
dfd0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
dfe0: 45 59 20 2a 2f 0a                                EY */.