/ Hex Artifact Content
Login

Artifact 6721a741c6499b3ab7e5385923233343c8f1ad05:


0000: 23 20 32 30 30 39 20 4f 63 74 6f 62 65 72 20 37  # 2009 October 7
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
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 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 74 65 73 74 73 20 74 6f 20 76 65 72 69 66 79 20  tests to verify 
0190: 74 68 65 20 22 74 65 73 74 61 62 6c 65 20 73 74  the "testable st
01a0: 61 74 65 6d 65 6e 74 73 22 20 69 6e 20 74 68 65  atements" in the
01b0: 0a 23 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 69  .# foreignkeys.i
01c0: 6e 20 64 6f 63 75 6d 65 6e 74 2e 0a 23 0a 23 20  n document..#.# 
01d0: 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  The tests in thi
01e0: 73 20 66 69 6c 65 20 61 72 65 20 61 72 72 61 6e  s file are arran
01f0: 67 65 64 20 74 6f 20 6d 69 72 72 6f 72 20 74 68  ged to mirror th
0200: 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 0a  e structure of .
0210: 23 20 66 6f 72 65 69 67 6e 6b 65 79 2e 69 6e 2c  # foreignkey.in,
0220: 20 77 69 74 68 20 6f 6e 65 20 65 78 63 65 70 74   with one except
0230: 69 6f 6e 3a 20 54 68 65 20 73 74 61 74 65 6d 65  ion: The stateme
0240: 6e 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32  nts in section 2
0250: 2c 20 77 68 69 63 68 20 0a 23 20 64 65 61 6c 73  , which .# deals
0260: 20 77 69 74 68 20 65 6e 61 62 6c 69 6e 67 2f 64   with enabling/d
0270: 69 73 61 62 6c 69 6e 67 20 66 6f 72 65 69 67 6e  isabling foreign
0280: 20 6b 65 79 20 73 75 70 70 6f 72 74 2c 20 69 73   key support, is
0290: 20 74 65 73 74 65 64 20 66 69 72 73 74 2c 0a 23   tested first,.#
02a0: 20 62 65 66 6f 72 65 20 73 65 63 74 69 6f 6e 20   before section 
02b0: 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
02c0: 73 65 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  se some statemen
02d0: 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32 20  ts in section 2 
02e0: 64 65 61 6c 0a 23 20 77 69 74 68 20 62 75 69 6c  deal.# with buil
02f0: 64 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 69  ds that do not i
0300: 6e 63 6c 75 64 65 20 63 6f 6d 70 6c 65 74 65 20  nclude complete 
0310: 66 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  foreign key supp
0320: 6f 72 74 20 28 62 65 63 61 75 73 65 0a 23 20 65  ort (because.# e
0330: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4d 49  ither SQLITE_OMI
0340: 54 5f 54 52 49 47 47 45 52 20 6f 72 20 53 51 4c  T_TRIGGER or SQL
0350: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
0360: 5f 4b 45 59 20 77 61 73 20 64 65 66 69 6e 65 64  _KEY was defined
0370: 0a 23 20 61 74 20 62 75 69 6c 64 20 74 69 6d 65  .# at build time
0380: 29 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  )..#..set testdi
0390: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
03a0: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
03b0: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
03c0: 63 6c 0a 0a 70 72 6f 63 20 65 71 70 20 7b 73 71  cl..proc eqp {sq
03d0: 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 20 75 70 6c  l {db db}} { upl
03e0: 65 76 65 6c 20 65 78 65 63 73 71 6c 20 5b 6c 69  evel execsql [li
03f0: 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  st "EXPLAIN QUER
0400: 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 20 24 64  Y PLAN $sql"] $d
0410: 62 20 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  b }..###########
0420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0460: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 32 3a 20  .### SECTION 2: 
0470: 45 6e 61 62 6c 69 6e 67 20 46 6f 72 65 69 67 6e  Enabling Foreign
0480: 20 4b 65 79 20 53 75 70 70 6f 72 74 0a 23 23 23   Key Support.###
0490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04d0: 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
0530: 4f 46 3a 20 52 2d 33 33 37 31 30 2d 35 36 33 34  OF: R-33710-5634
0540: 34 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 75 73  4 In order to us
0550: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
0560: 6e 73 74 72 61 69 6e 74 73 20 69 6e 0a 23 20 53  nstraints in.# S
0570: 51 4c 69 74 65 2c 20 74 68 65 20 6c 69 62 72 61  QLite, the libra
0580: 72 79 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 69  ry must be compi
0590: 6c 65 64 20 77 69 74 68 20 6e 65 69 74 68 65 72  led with neither
05a0: 0a 23 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  .# SQLITE_OMIT_F
05b0: 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53 51  OREIGN_KEY or SQ
05c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
05d0: 52 20 64 65 66 69 6e 65 64 2e 0a 23 0a 69 66 63  R defined..#.ifc
05e0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26  apable trigger&&
05f0: 66 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64  foreignkey {.  d
0600: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 20  o_test e_fkey-1 
0610: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
0620: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
0630: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
0640: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0650: 4c 45 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b  LE p(i PRIMARY K
0660: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
0670: 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45  E TABLE c(j REFE
0680: 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41  RENCES p ON UPDA
0690: 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
06a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
06b0: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
06c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
06d0: 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65  NTO c VALUES('he
06e0: 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44  llo');.      UPD
06f0: 41 54 45 20 70 20 53 45 54 20 69 20 3d 20 27 77  ATE p SET i = 'w
0700: 6f 72 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c  orld';.      SEL
0710: 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
0720: 20 20 7d 0a 20 20 7d 20 7b 77 6f 72 6c 64 7d 0a    }.  } {world}.
0730: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0780: 54 65 73 74 20 74 68 65 20 65 66 66 65 63 74 73  Test the effects
0790: 20 6f 66 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49   of defining OMI
07a0: 54 5f 54 52 49 47 47 45 52 20 62 75 74 20 6e 6f  T_TRIGGER but no
07b0: 74 20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  t OMIT_FOREIGN_K
07c0: 45 59 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  EY..#.# EVIDENCE
07d0: 2d 4f 46 3a 20 52 2d 34 34 36 39 37 2d 36 31 35  -OF: R-44697-615
07e0: 34 33 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  43 If SQLITE_OMI
07f0: 54 5f 54 52 49 47 47 45 52 20 69 73 20 64 65 66  T_TRIGGER is def
0800: 69 6e 65 64 20 62 75 74 0a 23 20 53 51 4c 49 54  ined but.# SQLIT
0810: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
0820: 45 59 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  EY is not, then 
0830: 53 51 4c 69 74 65 20 62 65 68 61 76 65 73 20 61  SQLite behaves a
0840: 73 20 69 74 20 64 69 64 20 70 72 69 6f 72 20 74  s it did prior t
0850: 6f 0a 23 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e  o.# version 3.6.
0860: 31 39 20 2d 20 66 6f 72 65 69 67 6e 20 6b 65 79  19 - foreign key
0870: 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 61 72 65   definitions are
0880: 20 70 61 72 73 65 64 20 61 6e 64 20 6d 61 79 20   parsed and may 
0890: 62 65 20 71 75 65 72 69 65 64 0a 23 20 75 73 69  be queried.# usi
08a0: 6e 67 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  ng PRAGMA foreig
08b0: 6e 5f 6b 65 79 5f 6c 69 73 74 2c 20 62 75 74 20  n_key_list, but 
08c0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
08d0: 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74 0a  traints are not.
08e0: 23 20 65 6e 66 6f 72 63 65 64 2e 0a 23 0a 23 20  # enforced..#.# 
08f0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 65  Specifically, te
0900: 73 74 20 74 68 61 74 20 22 50 52 41 47 4d 41 20  st that "PRAGMA 
0910: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 69 73  foreign_keys" is
0920: 20 61 20 6e 6f 2d 6f 70 20 69 6e 20 74 68 69 73   a no-op in this
0930: 20 63 61 73 65 2e 0a 23 20 57 68 65 6e 20 75 73   case..# When us
0940: 69 6e 67 20 74 68 65 20 70 72 61 67 6d 61 20 74  ing the pragma t
0950: 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
0960: 65 6e 74 20 73 65 74 74 69 6e 67 2c 20 30 20 72  ent setting, 0 r
0970: 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  ows are returned
0980: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
0990: 46 3a 20 52 2d 32 32 35 36 37 2d 34 34 30 33 39  F: R-22567-44039
09a0: 20 54 68 65 20 50 52 41 47 4d 41 20 66 6f 72 65   The PRAGMA fore
09b0: 69 67 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64  ign_keys command
09c0: 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 23 20 69 6e   is a no-op.# in
09d0: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
09e0: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
09f0: 45 2d 4f 46 3a 20 52 2d 34 31 37 38 34 2d 31 33  E-OF: R-41784-13
0a00: 33 33 39 20 54 69 70 3a 20 49 66 20 74 68 65 20  339 Tip: If the 
0a10: 63 6f 6d 6d 61 6e 64 20 22 50 52 41 47 4d 41 20  command "PRAGMA 
0a20: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 0a 23 20  foreign_keys".# 
0a30: 72 65 74 75 72 6e 73 20 6e 6f 20 64 61 74 61 20  returns no data 
0a40: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e  instead of a sin
0a50: 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
0a60: 6e 67 20 22 30 22 20 6f 72 20 22 31 22 2c 20 74  ng "0" or "1", t
0a70: 68 65 6e 0a 23 20 74 68 65 20 76 65 72 73 69 6f  hen.# the versio
0a80: 6e 20 6f 66 20 53 51 4c 69 74 65 20 79 6f 75 20  n of SQLite you 
0a90: 61 72 65 20 75 73 69 6e 67 20 64 6f 65 73 20 6e  are using does n
0aa0: 6f 74 20 73 75 70 70 6f 72 74 20 66 6f 72 65 69  ot support forei
0ab0: 67 6e 20 6b 65 79 73 0a 23 20 28 65 69 74 68 65  gn keys.# (eithe
0ac0: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
0ad0: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 36 2e 31  older than 3.6.1
0ae0: 39 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  9 or because it 
0af0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 23 20 77  was compiled.# w
0b00: 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
0b10: 46 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53  FOREIGN_KEY or S
0b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0b30: 45 52 20 64 65 66 69 6e 65 64 29 2e 0a 23 0a 72  ER defined)..#.r
0b40: 65 73 65 74 5f 64 62 0a 69 66 63 61 70 61 62 6c  eset_db.ifcapabl
0b50: 65 20 21 74 72 69 67 67 65 72 26 26 66 6f 72 65  e !trigger&&fore
0b60: 69 67 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65  ignkey {.  do_te
0b70: 73 74 20 65 5f 66 6b 65 79 2d 32 2e 31 20 7b 0a  st e_fkey-2.1 {.
0b80: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0b90: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
0ba0: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
0bb0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0bc0: 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59   p(i PRIMARY KEY
0bd0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
0be0: 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45  TABLE c(j REFERE
0bf0: 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41 54 45  NCES p ON UPDATE
0c00: 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 20   CASCADE);.     
0c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
0c20: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a  ALUES('hello');.
0c30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0c40: 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  O c VALUES('hell
0c50: 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54  o');.      UPDAT
0c60: 45 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72  E p SET i = 'wor
0c70: 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ld';.      SELEC
0c80: 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20  T * FROM c;.    
0c90: 7d 0a 20 20 7d 20 7b 68 65 6c 6c 6f 7d 0a 20 20  }.  } {hello}.  
0ca0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
0cb0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
0cc0: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
0cd0: 6e 5f 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a  n_key_list(c) }.
0ce0: 20 20 7d 20 7b 30 20 30 20 70 20 6a 20 7b 7d 20    } {0 0 p j {} 
0cf0: 43 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54 49  CASCADE {NO ACTI
0d00: 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 64 6f 5f 74  ON} NONE}.  do_t
0d10: 65 73 74 20 65 5f 66 6b 65 79 2d 32 2e 33 20 7b  est e_fkey-2.3 {
0d20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
0d30: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0d40: 79 73 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 0a  ys }.  } {}.}...
0d50: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
0da0: 74 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  t the effects of
0db0: 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49 54 5f 46   defining OMIT_F
0dc0: 4f 52 45 49 47 4e 5f 4b 45 59 2e 0a 23 0a 23 20  OREIGN_KEY..#.# 
0dd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
0de0: 38 34 32 38 2d 33 36 36 36 30 20 49 66 20 4f 4d  8428-36660 If OM
0df0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 69  IT_FOREIGN_KEY i
0e00: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a  s defined, then.
0e10: 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  # foreign key de
0e20: 66 69 6e 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74  finitions cannot
0e30: 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64 20   even be parsed 
0e40: 28 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73  (attempting to s
0e50: 70 65 63 69 66 79 20 61 0a 23 20 66 6f 72 65 69  pecify a.# forei
0e60: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
0e70: 6e 20 69 73 20 61 20 73 79 6e 74 61 78 20 65 72  n is a syntax er
0e80: 72 6f 72 29 2e 0a 23 0a 23 20 53 70 65 63 69 66  ror)..#.# Specif
0e90: 69 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61  ically, test tha
0ea0: 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  t foreign key co
0eb0: 6e 73 74 72 61 69 6e 74 73 20 63 61 6e 6e 6f 74  nstraints cannot
0ec0: 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64 20   even be parsed 
0ed0: 0a 23 20 69 6e 20 73 75 63 68 20 61 20 62 75 69  .# in such a bui
0ee0: 6c 64 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 69  ld..#.reset_db.i
0ef0: 66 63 61 70 61 62 6c 65 20 21 66 6f 72 65 69 67  fcapable !foreig
0f00: 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74  nkey {.  do_test
0f10: 20 65 5f 66 6b 65 79 2d 33 2e 31 20 7b 0a 20 20   e_fkey-3.1 {.  
0f20: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
0f30: 54 45 20 54 41 42 4c 45 20 70 28 69 20 50 52 49  TE TABLE p(i PRI
0f40: 4d 41 52 59 20 4b 45 59 29 20 7d 0a 20 20 20 20  MARY KEY) }.    
0f50: 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54  catchsql { CREAT
0f60: 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45  E TABLE c(j REFE
0f70: 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41  RENCES p ON UPDA
0f80: 54 45 20 43 41 53 43 41 44 45 29 20 7d 0a 20 20  TE CASCADE) }.  
0f90: 7d 20 7b 31 20 7b 6e 65 61 72 20 22 4f 4e 22 3a  } {1 {near "ON":
0fa0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a   syntax error}}.
0fb0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
0fc0: 2d 33 2e 32 20 7b 0a 20 20 20 20 23 20 54 68 69  -3.2 {.    # Thi
0fd0: 73 20 69 73 20 61 6c 6c 6f 77 65 64 2c 20 61 73  s is allowed, as
0fe0: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
0ff0: 22 52 45 46 45 52 45 4e 43 45 53 22 20 69 73 20  "REFERENCES" is 
1000: 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2e 0a 20  not a keyword.. 
1010: 20 20 20 23 20 54 68 65 20 64 65 63 6c 61 72 65     # The declare
1020: 64 20 64 61 74 61 74 79 70 65 20 6f 66 20 63 6f  d datatype of co
1030: 6c 75 6d 6e 20 6a 20 69 73 20 22 52 45 46 45 52  lumn j is "REFER
1040: 45 4e 43 45 53 20 70 22 2e 0a 20 20 20 20 65 78  ENCES p"..    ex
1050: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
1060: 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45 4e  ABLE c(j REFEREN
1070: 43 45 53 20 70 29 20 7d 0a 20 20 7d 20 7b 7d 0a  CES p) }.  } {}.
1080: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
1090: 2d 33 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  -3.3 {.    execs
10a0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c  ql { PRAGMA tabl
10b0: 65 5f 69 6e 66 6f 28 63 29 20 7d 0a 20 20 7d 20  e_info(c) }.  } 
10c0: 7b 30 20 6a 20 7b 52 45 46 45 52 45 4e 43 45 53  {0 j {REFERENCES
10d0: 20 70 7d 20 30 20 7b 7d 20 30 7d 0a 20 20 64 6f   p} 0 {} 0}.  do
10e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e 34  _test e_fkey-3.4
10f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1100: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1110: 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a 20 20  key_list(c) }.  
1120: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65  } {}.  do_test e
1130: 5f 66 6b 65 79 2d 33 2e 35 20 7b 0a 20 20 20 20  _fkey-3.5 {.    
1140: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1150: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a   foreign_keys }.
1160: 20 20 7d 20 7b 7d 0a 7d 0a 0a 69 66 63 61 70 61    } {}.}..ifcapa
1170: 62 6c 65 20 21 66 6f 72 65 69 67 6e 6b 65 79 7c  ble !foreignkey|
1180: 7c 21 74 72 69 67 67 65 72 20 7b 20 66 69 6e 69  |!trigger { fini
1190: 73 68 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e  sh_test ; return
11a0: 20 7d 0a 72 65 73 65 74 5f 64 62 0a 0a 0a 23 2d   }.reset_db...#-
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
1200: 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 38 30 2d  NCE-OF: R-07280-
1210: 36 30 35 31 30 20 41 73 73 75 6d 69 6e 67 20 74  60510 Assuming t
1220: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
1230: 6d 70 69 6c 65 64 20 77 69 74 68 0a 23 20 66 6f  mpiled with.# fo
1240: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1250: 61 69 6e 74 73 20 65 6e 61 62 6c 65 64 2c 20 69  aints enabled, i
1260: 74 20 6d 75 73 74 20 73 74 69 6c 6c 20 62 65 20  t must still be 
1270: 65 6e 61 62 6c 65 64 20 62 79 20 74 68 65 0a 23  enabled by the.#
1280: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 74 20   application at 
1290: 72 75 6e 74 69 6d 65 2c 20 75 73 69 6e 67 20 74  runtime, using t
12a0: 68 65 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  he PRAGMA foreig
12b0: 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64 2e 0a  n_keys command..
12c0: 23 0a 23 20 54 68 69 73 20 61 6c 73 6f 20 74 65  #.# This also te
12d0: 73 74 73 20 74 68 61 74 20 66 6f 72 65 69 67 6e  sts that foreign
12e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
12f0: 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62 79   are disabled by
1300: 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56   default..#.# EV
1310: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 35  IDENCE-OF: R-595
1320: 37 38 2d 30 34 39 39 30 20 46 6f 72 65 69 67 6e  78-04990 Foreign
1330: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
1340: 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62 79   are disabled by
1350: 0a 23 20 64 65 66 61 75 6c 74 20 28 66 6f 72 20  .# default (for 
1360: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1370: 69 62 69 6c 69 74 79 29 2c 20 73 6f 20 6d 75 73  ibility), so mus
1380: 74 20 62 65 20 65 6e 61 62 6c 65 64 20 73 65 70  t be enabled sep
1390: 61 72 61 74 65 6c 79 0a 23 20 66 6f 72 20 65 61  arately.# for ea
13a0: 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ch database conn
13b0: 65 63 74 69 6f 6e 20 73 65 70 61 72 61 74 65 6c  ection separatel
13c0: 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  y..#.drop_all_ta
13d0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
13e0: 6b 65 79 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63  key-4.1 {.  exec
13f0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1400: 20 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d 41   TABLE p(i PRIMA
1410: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
1420: 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45  ATE TABLE c(j RE
1430: 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50  FERENCES p ON UP
1440: 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  DATE CASCADE);. 
1450: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
1460: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
1470: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1480: 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  O c VALUES('hell
1490: 6f 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  o');.    UPDATE 
14a0: 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72 6c 64  p SET i = 'world
14b0: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
14c0: 46 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b  FROM c;.  } .} {
14d0: 68 65 6c 6c 6f 7d 0a 64 6f 5f 74 65 73 74 20 65  hello}.do_test e
14e0: 5f 66 6b 65 79 2d 34 2e 32 20 7b 0a 20 20 65 78  _fkey-4.2 {.  ex
14f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
1500: 54 45 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 44  TE FROM c;.    D
1510: 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20 20  ELETE FROM p;.  
1520: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
1530: 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20  _keys = ON;.    
1540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
1550: 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20  LUES('hello');. 
1560: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
1570: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
1580: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 20 53  ;.    UPDATE p S
1590: 45 54 20 69 20 3d 20 27 77 6f 72 6c 64 27 3b 0a  ET i = 'world';.
15a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
15b0: 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b 77 6f 72  M c;.  } .} {wor
15c0: 6c 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ld}..#----------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1610: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
1620: 2d 31 35 32 37 38 2d 35 34 34 35 36 20 54 68 65  -15278-54456 The
1630: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e   application can
1640: 20 63 61 6e 20 61 6c 73 6f 20 75 73 65 20 61 20   can also use a 
1650: 50 52 41 47 4d 41 0a 23 20 66 6f 72 65 69 67 6e  PRAGMA.# foreign
1660: 5f 6b 65 79 73 20 73 74 61 74 65 6d 65 6e 74 20  _keys statement 
1670: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1680: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65  foreign keys are
1690: 20 63 75 72 72 65 6e 74 6c 79 0a 23 20 65 6e 61   currently.# ena
16a0: 62 6c 65 64 2e 0a 23 0a 23 20 54 68 69 73 20 61  bled..#.# This a
16b0: 6c 73 6f 20 74 65 73 74 73 20 74 68 65 20 65 78  lso tests the ex
16c0: 61 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 73 65  ample code in se
16d0: 63 74 69 6f 6e 20 32 20 6f 66 20 66 6f 72 65 69  ction 2 of forei
16e0: 67 6e 6b 65 79 73 2e 69 6e 2e 0a 23 0a 23 20 45  gnkeys.in..#.# E
16f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
1700: 32 35 35 2d 31 39 39 30 37 0a 23 20 0a 72 65 73  255-19907.# .res
1710: 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 65 5f  et_db.do_test e_
1720: 66 6b 65 79 2d 35 2e 31 20 7b 0a 20 20 65 78 65  fkey-5.1 {.  exe
1730: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
1740: 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 7d 20 7b  reign_keys }.} {
1750: 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  0}.do_test e_fke
1760: 79 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  y-5.2 {.  execsq
1770: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
1780: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
1790: 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f  N;.    PRAGMA fo
17a0: 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d 0a  reign_keys;.  }.
17b0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {1}.do_test e_
17c0: 66 6b 65 79 2d 35 2e 33 20 7b 0a 20 20 65 78 65  fkey-5.3 {.  exe
17d0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
17e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
17f0: 3d 20 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d  = OFF;.    PRAGM
1800: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a  A foreign_keys;.
1810: 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d    }.} {0}..#----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
1870: 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  t it is not poss
1880: 69 62 6c 65 20 74 6f 20 65 6e 61 62 6c 65 20 6f  ible to enable o
1890: 72 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  r disable foreig
18a0: 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 0a 23 20  n key support.# 
18b0: 77 68 69 6c 65 20 6e 6f 74 20 69 6e 20 61 75 74  while not in aut
18c0: 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 23  o-commit mode..#
18d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
18e0: 52 2d 34 36 36 34 39 2d 35 38 35 33 37 20 49 74  R-46649-58537 It
18f0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1900: 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69   to enable or di
1910: 73 61 62 6c 65 0a 23 20 66 6f 72 65 69 67 6e 20  sable.# foreign 
1920: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
1930: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
1940: 20 61 20 6d 75 6c 74 69 2d 73 74 61 74 65 6d 65   a multi-stateme
1950: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23  nt transaction.#
1960: 20 28 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73   (when SQLite is
1970: 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d   not in autocomm
1980: 69 74 20 6d 6f 64 65 29 2e 20 41 74 74 65 6d 70  it mode). Attemp
1990: 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f 20 64 6f  ting to do so do
19a0: 65 73 20 6e 6f 74 0a 23 20 72 65 74 75 72 6e 20  es not.# return 
19b0: 61 6e 20 65 72 72 6f 72 3b 20 69 74 20 73 69 6d  an error; it sim
19c0: 70 6c 79 20 68 61 73 20 6e 6f 20 65 66 66 65 63  ply has no effec
19d0: 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f  t..#.reset_db.do
19e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e 31  _test e_fkey-6.1
19f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1a00: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
1a10: 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20  n_keys = ON;.   
1a20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1a30: 28 61 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a 20  (a UNIQUE, b);. 
1a40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1a50: 74 32 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43  t2(c, d REFERENC
1a60: 45 53 20 74 31 28 61 29 29 3b 0a 20 20 20 20 49  ES t1(a));.    I
1a70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1a80: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
1a90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1aa0: 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20  ALUES(2, 1);.   
1ab0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52   BEGIN;.      PR
1ac0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1ad0: 73 20 3d 20 4f 46 46 3b 0a 20 20 7d 0a 20 20 63  s = OFF;.  }.  c
1ae0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
1af0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a 20  DELETE FROM t1. 
1b00: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
1b10: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
1b20: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
1b30: 20 65 5f 66 6b 65 79 2d 36 2e 32 20 7b 0a 20 20   e_fkey-6.2 {.  
1b40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1b50: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a   foreign_keys }.
1b60: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {1}.do_test e_
1b70: 66 6b 65 79 2d 36 2e 33 20 7b 0a 20 20 65 78 65  fkey-6.3 {.  exe
1b80: 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49  csql {.    COMMI
1b90: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f  T;.    PRAGMA fo
1ba0: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
1bb0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
1bc0: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
1bd0: 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20  n_keys = ON;.   
1be0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1bf0: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
1c00: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20  foreign_keys;.  
1c10: 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  }.} {0}.do_test 
1c20: 65 5f 66 6b 65 79 2d 36 2e 34 20 7b 0a 20 20 65  e_fkey-6.4 {.  e
1c30: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
1c40: 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  {}..############
1c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
1c90: 23 23 23 20 53 45 43 54 49 4f 4e 20 31 3a 20 49  ### SECTION 1: I
1ca0: 6e 74 72 6f 64 75 63 74 69 6f 6e 20 74 6f 20 46  ntroduction to F
1cb0: 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74  oreign Key Const
1cc0: 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23  raints.#########
1cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d10: 23 23 0a 65 78 65 63 73 71 6c 20 22 50 52 41 47  ##.execsql "PRAG
1d20: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
1d30: 3d 20 4f 4e 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  = ON"..#--------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  -.# Verify that 
1d90: 74 68 65 20 73 79 6e 74 61 78 20 69 6e 20 74 68  the syntax in th
1da0: 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20  e first example 
1db0: 69 6e 20 73 65 63 74 69 6f 6e 20 31 20 69 73 20  in section 1 is 
1dc0: 76 61 6c 69 64 2e 0a 23 0a 23 20 45 56 49 44 45  valid..#.# EVIDE
1dd0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 30 34 32 2d  NCE-OF: R-04042-
1de0: 32 34 38 32 35 20 54 6f 20 64 6f 20 73 6f 2c 20  24825 To do so, 
1df0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
1e00: 66 69 6e 69 74 69 6f 6e 20 6d 61 79 20 62 65 0a  finition may be.
1e10: 23 20 61 64 64 65 64 20 62 79 20 6d 6f 64 69 66  # added by modif
1e20: 79 69 6e 67 20 74 68 65 20 64 65 63 6c 61 72 61  ying the declara
1e30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 61 63  tion of the trac
1e40: 6b 20 74 61 62 6c 65 20 74 6f 20 74 68 65 0a 23  k table to the.#
1e50: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 43 52 45 41   following: CREA
1e60: 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 20  TE TABLE track( 
1e70: 74 72 61 63 6b 69 64 20 49 4e 54 45 47 45 52 2c  trackid INTEGER,
1e80: 20 74 72 61 63 6b 6e 61 6d 65 20 54 45 58 54 2c   trackname TEXT,
1e90: 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74 20 49  .# trackartist I
1ea0: 4e 54 45 47 45 52 2c 20 46 4f 52 45 49 47 4e 20  NTEGER, FOREIGN 
1eb0: 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74 29  KEY(trackartist)
1ec0: 20 52 45 46 45 52 45 4e 43 45 53 0a 23 20 61 72   REFERENCES.# ar
1ed0: 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20 29  tist(artistid) )
1ee0: 3b 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ;.#.do_test e_fk
1ef0: 65 79 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73  ey-7.1 {.  execs
1f00: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f10: 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
1f20: 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
1f30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1f40: 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
1f50: 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
1f60: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
1f70: 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
1f80: 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
1f90: 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74 72  TEGER, .      tr
1fa0: 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20  ackname   TEXT, 
1fb0: 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69  .      trackarti
1fc0: 73 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  st INTEGER,.    
1fd0: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72    FOREIGN KEY(tr
1fe0: 61 63 6b 61 72 74 69 73 74 29 20 52 45 46 45 52  ackartist) REFER
1ff0: 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74  ENCES artist(art
2000: 69 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20 20  istid).    );.  
2010: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
2070: 3a 20 52 2d 36 31 33 36 32 2d 33 32 30 38 37 20  : R-61362-32087 
2080: 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69 6e  Attempting to in
2090: 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20  sert a row into 
20a0: 74 68 65 20 74 72 61 63 6b 0a 23 20 74 61 62 6c  the track.# tabl
20b0: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
20c0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e  correspond to an
20d0: 79 20 72 6f 77 20 69 6e 20 74 68 65 20 61 72 74  y row in the art
20e0: 69 73 74 20 74 61 62 6c 65 20 77 69 6c 6c 0a 23  ist table will.#
20f0: 20 66 61 69 6c 2c 0a 23 0a 64 6f 5f 74 65 73 74   fail,.#.do_test
2100: 20 65 5f 66 6b 65 79 2d 38 2e 31 20 7b 0a 20 20   e_fkey-8.1 {.  
2110: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
2120: 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
2130: 55 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27  UES(1, 'track 1'
2140: 2c 20 31 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 1) }.} {1 {for
2150: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2160: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
2170: 74 65 73 74 20 65 5f 66 6b 65 79 2d 38 2e 32 20  test e_fkey-8.2 
2180: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
2190: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
21a0: 20 56 41 4c 55 45 53 28 32 2c 20 27 61 72 74 69   VALUES(2, 'arti
21b0: 73 74 20 31 27 29 20 7d 0a 20 20 63 61 74 63 68  st 1') }.  catch
21c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
21d0: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
21e0: 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 31 29 20  , 'track 1', 1) 
21f0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2200: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2210: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
2220: 65 5f 66 6b 65 79 2d 38 2e 32 20 7b 0a 20 20 65  e_fkey-8.2 {.  e
2230: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
2240: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
2250: 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20  S(1, 'track 1', 
2260: 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  2) }.} {}..#----
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d 70 74 69  -----.# Attempti
22c0: 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72  ng to delete a r
22d0: 6f 77 20 66 72 6f 6d 20 74 68 65 20 27 61 72 74  ow from the 'art
22e0: 69 73 74 27 20 74 61 62 6c 65 20 77 68 69 6c 65  ist' table while
22f0: 20 74 68 65 72 65 20 61 72 65 20 0a 23 20 64 65   there are .# de
2300: 70 65 6e 64 65 6e 74 20 72 6f 77 73 20 69 6e 20  pendent rows in 
2310: 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20  the track table 
2320: 61 6c 73 6f 20 66 61 69 6c 73 2e 0a 23 0a 23 20  also fails..#.# 
2330: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2340: 34 34 30 31 2d 35 32 34 30 30 20 61 73 20 77 69  4401-52400 as wi
2350: 6c 6c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ll attempting to
2360: 20 64 65 6c 65 74 65 20 61 20 72 6f 77 20 66 72   delete a row fr
2370: 6f 6d 20 74 68 65 0a 23 20 61 72 74 69 73 74 20  om the.# artist 
2380: 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65 72 65  table when there
2390: 20 65 78 69 73 74 20 64 65 70 65 6e 64 65 6e 74   exist dependent
23a0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61   rows in the tra
23b0: 63 6b 20 74 61 62 6c 65 0a 23 0a 64 6f 5f 74 65  ck table.#.do_te
23c0: 73 74 20 65 5f 66 6b 65 79 2d 39 2e 31 20 7b 0a  st e_fkey-9.1 {.
23d0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
23e0: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
23f0: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
2400: 20 32 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   2 }.} {1 {forei
2410: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
2420: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
2430: 73 74 20 65 5f 66 6b 65 79 2d 39 2e 32 20 7b 0a  st e_fkey-9.2 {.
2440: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
2450: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61   DELETE FROM tra
2460: 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72  ck WHERE trackar
2470: 74 69 73 74 20 3d 20 32 3b 0a 20 20 20 20 44 45  tist = 2;.    DE
2480: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
2490: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
24a0: 3d 20 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  = 2;.  }.} {}..#
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 74  ---------.# If t
2500: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
2510: 6f 6c 75 6d 6e 20 28 74 72 61 63 6b 61 72 74 69  olumn (trackarti
2520: 73 74 29 20 69 6e 20 74 61 62 6c 65 20 27 74 72  st) in table 'tr
2530: 61 63 6b 27 20 69 73 20 73 65 74 20 74 6f 20 4e  ack' is set to N
2540: 55 4c 4c 2c 0a 23 20 74 68 65 72 65 20 69 73 20  ULL,.# there is 
2550: 6e 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66  no requirement f
2560: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 72 6f  or a matching ro
2570: 77 20 69 6e 20 74 68 65 20 27 61 72 74 69 73 74  w in the 'artist
2580: 27 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49  ' table..#.# EVI
2590: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39 38  DENCE-OF: R-2398
25a0: 30 2d 34 38 38 35 39 20 54 68 65 72 65 20 69 73  0-48859 There is
25b0: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 3a 20   one exception: 
25c0: 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  if the foreign k
25d0: 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ey.# column in t
25e0: 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20 69  he track table i
25f0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6e 6f 20  s NULL, then no 
2600: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
2610: 74 72 79 20 69 6e 20 74 68 65 0a 23 20 61 72 74  try in the.# art
2620: 69 73 74 20 74 61 62 6c 65 20 69 73 20 72 65 71  ist table is req
2630: 75 69 72 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  uired..#.do_test
2640: 20 65 5f 66 6b 65 79 2d 31 30 2e 31 20 7b 0a 20   e_fkey-10.1 {. 
2650: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
2660: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
2670: 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63   VALUES(1, 'trac
2680: 6b 20 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  k 1', NULL);.   
2690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
26a0: 63 6b 20 56 41 4c 55 45 53 28 32 2c 20 27 74 72  ck VALUES(2, 'tr
26b0: 61 63 6b 20 32 27 2c 20 4e 55 4c 4c 29 3b 0a 20  ack 2', NULL);. 
26c0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
26d0: 65 5f 66 6b 65 79 2d 31 30 2e 32 20 7b 0a 20 20  e_fkey-10.2 {.  
26e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
26f0: 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20 7d   * FROM artist }
2700: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
2710: 66 6b 65 79 2d 31 30 2e 33 20 7b 0a 20 20 23 20  fkey-10.3 {.  # 
2720: 53 65 74 74 69 6e 67 20 74 68 65 20 74 72 61 63  Setting the trac
2730: 6b 69 64 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  kid to a non-NUL
2740: 4c 20 76 61 6c 75 65 20 66 61 69 6c 73 2c 20 6f  L value fails, o
2750: 66 20 63 6f 75 72 73 65 2e 0a 20 20 63 61 74 63  f course..  catc
2760: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 72  hsql { UPDATE tr
2770: 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74  ack SET trackart
2780: 69 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72  ist = 5 WHERE tr
2790: 61 63 6b 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31  ackid = 1 }.} {1
27a0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
27b0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
27c0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
27d0: 2d 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -10.4 {.  execsq
27e0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
27f0: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
2800: 53 28 35 2c 20 27 61 72 74 69 73 74 20 35 27 29  S(5, 'artist 5')
2810: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 72 61  ;.    UPDATE tra
2820: 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69  ck SET trackarti
2830: 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72 61  st = 5 WHERE tra
2840: 63 6b 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ckid = 1;.  }.  
2850: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
2860: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
2870: 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35  ERE artistid = 5
2880: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2890: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
28a0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
28b0: 65 5f 66 6b 65 79 2d 31 30 2e 35 20 7b 0a 20 20  e_fkey-10.5 {.  
28c0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55  execsql { .    U
28d0: 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20  PDATE track SET 
28e0: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 4e 55  trackartist = NU
28f0: 4c 4c 20 57 48 45 52 45 20 74 72 61 63 6b 69 64  LL WHERE trackid
2900: 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45   = 1;.    DELETE
2910: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
2920: 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35 3b  RE artistid = 5;
2930: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2990: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
29a0: 69 73 20 74 72 75 65 20 66 6f 20 61 6c 6c 20 72  is true fo all r
29b0: 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61 63 6b  ows in the track
29c0: 20 74 61 62 6c 65 3a 0a 23 0a 23 20 20 20 74 72   table:.#.#   tr
29d0: 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55 4c  ackartist IS NUL
29e0: 4c 20 4f 52 20 0a 23 20 20 20 45 58 49 53 54 53  L OR .#   EXISTS
29f0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61  (SELECT 1 FROM a
2a00: 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
2a10: 73 74 69 64 3d 74 72 61 63 6b 61 72 74 69 73 74  stid=trackartist
2a20: 29 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ).#.# EVIDENCE-O
2a30: 46 3a 20 52 2d 35 32 34 38 36 2d 32 31 33 35 32  F: R-52486-21352
2a40: 20 45 78 70 72 65 73 73 65 64 20 69 6e 20 53 51   Expressed in SQ
2a50: 4c 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  L, this means th
2a60: 61 74 20 66 6f 72 20 65 76 65 72 79 0a 23 20 72  at for every.# r
2a70: 6f 77 20 69 6e 20 74 68 65 20 74 72 61 63 6b 20  ow in the track 
2a80: 74 61 62 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  table, the follo
2a90: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  wing expression 
2aa0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
2ab0: 65 3a 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74  e:.# trackartist
2ac0: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 45 58 49 53   IS NULL OR EXIS
2ad0: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
2ae0: 20 61 72 74 69 73 74 20 57 48 45 52 45 0a 23 20   artist WHERE.# 
2af0: 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61 72  artistid=trackar
2b00: 74 69 73 74 29 0a 0a 23 20 54 68 69 73 20 70 72  tist)..# This pr
2b10: 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65 73  ocedure executes
2b20: 20 61 20 74 65 73 74 20 63 61 73 65 20 74 6f 20   a test case to 
2b30: 63 68 65 63 6b 20 74 68 61 74 20 73 74 61 74 65  check that state
2b40: 6d 65 6e 74 20 0a 23 20 52 2d 35 32 34 38 36 2d  ment .# R-52486-
2b50: 32 31 33 35 32 20 69 73 20 74 72 75 65 20 61 66  21352 is true af
2b60: 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68  ter executing th
2b70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2b80: 70 61 73 73 65 64 2e 0a 23 20 61 73 20 74 68 65  passed..# as the
2b90: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ba0: 2e 0a 70 72 6f 63 20 74 65 73 74 5f 72 35 32 34  ..proc test_r524
2bb0: 38 36 5f 32 31 33 35 32 20 7b 74 6e 20 73 71 6c  86_21352 {tn sql
2bc0: 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 63  } {.  set res [c
2bd0: 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 0a 20 20  atchsql $sql].  
2be0: 73 65 74 20 72 65 73 75 6c 74 73 20 7b 0a 20 20  set results {.  
2bf0: 20 20 7b 30 20 7b 7d 7d 20 0a 20 20 20 20 7b 31    {0 {}} .    {1
2c00: 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75   {PRIMARY KEY mu
2c10: 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 20 0a  st be unique}} .
2c20: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
2c30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2c40: 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20 69 66  ailed}}.  }.  if
2c50: 20 7b 5b 6c 73 65 61 72 63 68 20 24 72 65 73 75   {[lsearch $resu
2c60: 6c 74 73 20 24 72 65 73 5d 3c 30 7d 20 7b 0a 20  lts $res]<0} {. 
2c70: 20 20 20 65 72 72 6f 72 20 24 72 65 73 0a 20 20     error $res.  
2c80: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  }..  do_test e_f
2c90: 6b 65 79 2d 31 31 2e 24 74 6e 20 7b 0a 20 20 20  key-11.$tn {.   
2ca0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2cb0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2cc0: 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52   FROM track WHER
2cd0: 45 20 4e 4f 54 20 28 0a 20 20 20 20 20 20 20 20  E NOT (.        
2ce0: 74 72 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e  trackartist IS N
2cf0: 55 4c 4c 20 4f 52 20 0a 20 20 20 20 20 20 20 20  ULL OR .        
2d00: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
2d10: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
2d20: 45 20 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b  E artistid=track
2d30: 61 72 74 69 73 74 29 0a 20 20 20 20 20 20 29 0a  artist).      ).
2d40: 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a      }.  } {0}.}.
2d50: 0a 23 20 45 78 65 63 75 74 65 20 61 20 73 65 72  .# Execute a ser
2d60: 69 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 49 4e  ies of random IN
2d70: 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64  SERT, UPDATE and
2d80: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2d90: 6e 73 0a 23 20 28 73 6f 6d 65 20 6f 66 20 77 68  ns.# (some of wh
2da0: 69 63 68 20 6d 61 79 20 66 61 69 6c 20 64 75 65  ich may fail due
2db0: 20 74 6f 20 46 4b 20 6f 72 20 50 4b 20 63 6f 6e   to FK or PK con
2dc0: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
2dd0: 6e 73 29 20 6f 6e 20 0a 23 20 74 68 65 20 74 77  ns) on .# the tw
2de0: 6f 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  o tables in the 
2df0: 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 2e 20  example schema. 
2e00: 54 65 73 74 20 74 68 61 74 20 52 2d 35 32 34 38  Test that R-5248
2e10: 36 2d 32 31 33 35 32 0a 23 20 69 73 20 74 72 75  6-21352.# is tru
2e20: 65 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e  e after executin
2e30: 67 20 65 61 63 68 20 6f 70 65 72 61 74 69 6f 6e  g each operation
2e40: 2e 0a 23 0a 73 65 74 20 54 65 6d 70 6c 61 74 65  ..#.set Template
2e50: 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   {.  {INSERT INT
2e60: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 24  O track VALUES($
2e70: 74 2c 20 27 74 72 61 63 6b 20 24 74 27 2c 20 24  t, 'track $t', $
2e80: 61 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52  a)}.  {DELETE FR
2e90: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
2ea0: 72 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20 7b  rackid = $t}.  {
2eb0: 55 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54  UPDATE track SET
2ec0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 24   trackartist = $
2ed0: 61 20 57 48 45 52 45 20 74 72 61 63 6b 69 64 20  a WHERE trackid 
2ee0: 3d 20 24 74 7d 0a 20 20 7b 49 4e 53 45 52 54 20  = $t}.  {INSERT 
2ef0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
2f00: 45 53 28 24 61 2c 20 27 61 72 74 69 73 74 20 24  ES($a, 'artist $
2f10: 61 27 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46  a')}.  {DELETE F
2f20: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
2f30: 20 61 72 74 69 73 74 69 64 20 3d 20 24 61 7d 0a   artistid = $a}.
2f40: 20 20 7b 55 50 44 41 54 45 20 61 72 74 69 73 74    {UPDATE artist
2f50: 20 53 45 54 20 61 72 74 69 73 74 69 64 20 3d 20   SET artistid = 
2f60: 24 61 32 20 57 48 45 52 45 20 61 72 74 69 73 74  $a2 WHERE artist
2f70: 69 64 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72 20 7b  id = $a}.}.for {
2f80: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35  set i 0} {$i < 5
2f90: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
2fa0: 20 73 65 74 20 61 20 20 20 5b 65 78 70 72 20 69   set a   [expr i
2fb0: 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20  nt(rand()*10)]. 
2fc0: 20 73 65 74 20 61 32 20 20 5b 65 78 70 72 20 69   set a2  [expr i
2fd0: 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20  nt(rand()*10)]. 
2fe0: 20 73 65 74 20 74 20 20 20 5b 65 78 70 72 20 69   set t   [expr i
2ff0: 6e 74 28 72 61 6e 64 28 29 2a 35 30 29 5d 0a 20  nt(rand()*50)]. 
3000: 20 73 65 74 20 73 71 6c 20 5b 73 75 62 73 74 20   set sql [subst 
3010: 5b 6c 69 6e 64 65 78 20 24 54 65 6d 70 6c 61 74  [lindex $Templat
3020: 65 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64  e [expr int(rand
3030: 28 29 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65 73 74  ()*6)]]]..  test
3040: 5f 72 35 32 34 38 36 5f 32 31 33 35 32 20 24 69  _r52486_21352 $i
3050: 20 24 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   $sql.}..#------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
30b0: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
30c0: 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20 61 64  traint can be ad
30d0: 64 65 64 20 74 6f 20 74 68 65 20 65 78 61 6d 70  ded to the examp
30e0: 6c 65 20 73 63 68 65 6d 61 0a 23 20 74 6f 20 70  le schema.# to p
30f0: 72 6f 68 69 62 69 74 20 4e 55 4c 4c 20 63 68 69  rohibit NULL chi
3100: 6c 64 20 6b 65 79 73 20 66 72 6f 6d 20 62 65 69  ld keys from bei
3110: 6e 67 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a 23  ng inserted..#.#
3120: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3130: 34 32 34 31 32 2d 35 39 33 32 31 20 54 69 70 3a  42412-59321 Tip:
3140: 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
3150: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 20 73  ion requires a s
3160: 74 72 69 63 74 65 72 0a 23 20 72 65 6c 61 74 69  tricter.# relati
3170: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 61  onship between a
3180: 72 74 69 73 74 20 61 6e 64 20 74 72 61 63 6b 2c  rtist and track,
3190: 20 77 68 65 72 65 20 4e 55 4c 4c 20 76 61 6c 75   where NULL valu
31a0: 65 73 20 61 72 65 20 6e 6f 74 0a 23 20 70 65 72  es are not.# per
31b0: 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20 74 72  mitted in the tr
31c0: 61 63 6b 61 72 74 69 73 74 20 63 6f 6c 75 6d 6e  ackartist column
31d0: 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68 65  , simply add the
31e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 22 4e 4f   appropriate "NO
31f0: 54 0a 23 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  T.# NULL" constr
3200: 61 69 6e 74 20 74 6f 20 74 68 65 20 73 63 68 65  aint to the sche
3210: 6d 61 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ma..#.drop_all_t
3220: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
3230: 66 6b 65 79 2d 31 32 2e 31 20 7b 0a 20 20 65 78  fkey-12.1 {.  ex
3240: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3250: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
3260: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
3270: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
3280: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
3290: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
32a0: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
32b0: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
32c0: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
32d0: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
32e0: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
32f0: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
3300: 72 74 69 73 74 20 49 4e 54 45 47 45 52 20 4e 4f  rtist INTEGER NO
3310: 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 46 4f  T NULL,.      FO
3320: 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61  REIGN KEY(tracka
3330: 72 74 69 73 74 29 20 52 45 46 45 52 45 4e 43 45  rtist) REFERENCE
3340: 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
3350: 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  d).    );.  }.} 
3360: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
3370: 79 2d 31 32 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-12.2 {.  catch
3380: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
3390: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
33a0: 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65  4, 'Mr. Bojangle
33b0: 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31  s', NULL) }.} {1
33c0: 20 7b 74 72 61 63 6b 2e 74 72 61 63 6b 61 72 74   {track.trackart
33d0: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e  ist may not be N
33e0: 55 4c 4c 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ULL}}..#--------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
3440: 20 52 2d 31 36 31 32 37 2d 33 35 34 34 32 0a 23   R-16127-35442.#
3450: 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70  .# Test an examp
3460: 6c 65 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b  le from foreignk
3470: 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70  eys.html..#.drop
3480: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
3490: 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 31 20  est e_fkey-13.1 
34a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
34b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
34c0: 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74  rtist(.      art
34d0: 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52  istid    INTEGER
34e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
34f0: 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20       artistname 
3500: 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20   TEXT.    );.   
3510: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
3520: 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b  ack(.      track
3530: 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20  id     INTEGER, 
3540: 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
3550: 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
3560: 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
3570: 47 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  GER,.      FOREI
3580: 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69  GN KEY(trackarti
3590: 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20 61  st) REFERENCES a
35a0: 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29 0a  rtist(artistid).
35b0: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
35c0: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
35d0: 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d 61  LUES(1, 'Dean Ma
35e0: 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  rtin');.    INSE
35f0: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
3600: 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b 20  ALUES(2, 'Frank 
3610: 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20 49  Sinatra');.    I
3620: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3630: 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68 61   VALUES(11, 'Tha
3640: 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29 3b  t''s Amore', 1);
3650: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3660: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 32   track VALUES(12
3670: 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c 75  , 'Christmas Blu
3680: 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  es', 1);.    INS
3690: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
36a0: 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57 61  ALUES(13, 'My Wa
36b0: 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  y', 2);.  }.} {}
36c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
36d0: 31 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  13.2 {.  catchsq
36e0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
36f0: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34 2c  track VALUES(14,
3700: 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27   'Mr. Bojangles'
3710: 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 3) }.} {1 {for
3720: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
3730: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
3740: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 33  test e_fkey-13.3
3750: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
3760: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3770: 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e   VALUES(14, 'Mr.
3780: 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 4e 55 4c   Bojangles', NUL
3790: 4c 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  L) }.} {}.do_tes
37a0: 74 20 65 5f 66 6b 65 79 2d 31 33 2e 34 20 7b 0a  t e_fkey-13.4 {.
37b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20    catchsql { .  
37c0: 20 20 55 50 44 41 54 45 20 74 72 61 63 6b 20 53    UPDATE track S
37d0: 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d  ET trackartist =
37e0: 20 33 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61   3 WHERE trackna
37f0: 6d 65 20 3d 20 27 4d 72 2e 20 42 6f 6a 61 6e 67  me = 'Mr. Bojang
3800: 6c 65 73 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  les';.  }.} {1 {
3810: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3820: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
3830: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
3840: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
3850: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
3860: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
3870: 33 2c 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20  3, 'Sammy Davis 
3880: 4a 72 2e 27 29 3b 0a 20 20 20 20 55 50 44 41 54  Jr.');.    UPDAT
3890: 45 20 74 72 61 63 6b 20 53 45 54 20 74 72 61 63  E track SET trac
38a0: 6b 61 72 74 69 73 74 20 3d 20 33 20 57 48 45 52  kartist = 3 WHER
38b0: 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d  E trackname = 'M
38c0: 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a 20  r. Bojangles';. 
38d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
38e0: 72 61 63 6b 20 56 41 4c 55 45 53 28 31 35 2c 20  rack VALUES(15, 
38f0: 27 42 6f 6f 67 69 65 20 57 6f 6f 67 69 65 27 2c  'Boogie Woogie',
3900: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23   3);.  }.} {}..#
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3960: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 39 35 38  ENCE-OF: R-15958
3970: 2d 35 30 32 33 33 0a 23 0a 23 20 54 65 73 74 20  -50233.#.# Test 
3980: 74 68 65 20 73 65 63 6f 6e 64 20 65 78 61 6d 70  the second examp
3990: 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  le from the firs
39a0: 74 20 73 65 63 74 69 6f 6e 20 6f 66 20 66 6f 72  t section of for
39b0: 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23  eignkeys.html..#
39c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
39d0: 31 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  14.1 {.  catchsq
39e0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
39f0: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
3a00: 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 46   artistname = 'F
3a10: 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 3b 0a 20  rank Sinatra';. 
3a20: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
3a30: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
3a40: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
3a50: 20 65 5f 66 6b 65 79 2d 31 34 2e 32 20 7b 0a 20   e_fkey-14.2 {. 
3a60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3a70: 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63 6b  ELETE FROM track
3a80: 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61 6d 65   WHERE trackname
3a90: 20 3d 20 27 4d 79 20 57 61 79 27 3b 0a 20 20 20   = 'My Way';.   
3aa0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
3ab0: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
3ac0: 6e 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53 69  name = 'Frank Si
3ad0: 6e 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b 7d  natra';.  }.} {}
3ae0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3af0: 31 34 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  14.3 {.  catchsq
3b00: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  l {.    UPDATE a
3b10: 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74  rtist SET artist
3b20: 69 64 3d 34 20 57 48 45 52 45 20 61 72 74 69 73  id=4 WHERE artis
3b30: 74 6e 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61  tname = 'Dean Ma
3b40: 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  rtin';.  }.} {1 
3b50: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
3b60: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
3b70: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3b80: 31 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  14.4 {.  execsql
3b90: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
3ba0: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
3bb0: 72 61 63 6b 6e 61 6d 65 20 49 4e 28 27 54 68 61  rackname IN('Tha
3bc0: 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 27 43 68  t''s Amore', 'Ch
3bd0: 72 69 73 74 6d 61 73 20 42 6c 75 65 73 27 29 3b  ristmas Blues');
3be0: 0a 20 20 20 20 55 50 44 41 54 45 20 61 72 74 69  .    UPDATE arti
3bf0: 73 74 20 53 45 54 20 61 72 74 69 73 74 69 64 3d  st SET artistid=
3c00: 34 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61  4 WHERE artistna
3c10: 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69  me = 'Dean Marti
3c20: 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23  n';.  }.} {}...#
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3c80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 30 33 32  ENCE-OF: R-56032
3c90: 2d 32 34 39 32 33 20 54 68 65 20 66 6f 72 65 69  -24923 The forei
3ca0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3cb0: 74 20 69 73 20 73 61 74 69 73 66 69 65 64 20 69  t is satisfied i
3cc0: 66 0a 23 20 66 6f 72 20 65 61 63 68 20 72 6f 77  f.# for each row
3cd0: 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61   in the child ta
3ce0: 62 6c 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ble either one o
3cf0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 63 68  r more of the ch
3d00: 69 6c 64 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e  ild key.# column
3d10: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6f 72 20 74  s are NULL, or t
3d20: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 72 6f  here exists a ro
3d30: 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  w in the parent 
3d40: 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 0a  table for which.
3d50: 23 20 65 61 63 68 20 70 61 72 65 6e 74 20 6b 65  # each parent ke
3d60: 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  y column contain
3d70: 73 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20  s a value equal 
3d80: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
3d90: 69 74 73 0a 23 20 61 73 73 6f 63 69 61 74 65 64  its.# associated
3da0: 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d   child key colum
3db0: 6e 2e 0a 23 0a 23 20 54 65 73 74 20 61 6c 73 6f  n..#.# Test also
3dc0: 20 74 68 61 74 20 74 68 65 20 75 73 75 61 6c 20   that the usual 
3dd0: 63 6f 6d 70 61 72 69 73 6f 6e 20 72 75 6c 65 73  comparison rules
3de0: 20 61 72 65 20 75 73 65 64 20 77 68 65 6e 20 74   are used when t
3df0: 65 73 74 69 6e 67 20 69 66 20 74 68 65 72 65 20  esting if there 
3e00: 0a 23 20 69 73 20 61 20 6d 61 74 63 68 69 6e 67  .# is a matching
3e10: 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65   row in the pare
3e20: 6e 74 20 74 61 62 6c 65 20 6f 66 20 61 20 66 6f  nt table of a fo
3e30: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
3e40: 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  aint..#.# EVIDEN
3e50: 43 45 2d 4f 46 3a 20 52 2d 35 37 37 36 35 2d 31  CE-OF: R-57765-1
3e60: 32 33 38 30 20 49 6e 20 74 68 65 20 61 62 6f 76  2380 In the abov
3e70: 65 20 70 61 72 61 67 72 61 70 68 2c 20 74 68 65  e paragraph, the
3e80: 20 74 65 72 6d 20 22 65 71 75 61 6c 22 0a 23 20   term "equal".# 
3e90: 6d 65 61 6e 73 20 65 71 75 61 6c 20 77 68 65 6e  means equal when
3ea0: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70   values are comp
3eb0: 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 72  ared using the r
3ec0: 75 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 68  ules specified h
3ed0: 65 72 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ere..#.drop_all_
3ee0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
3ef0: 5f 66 6b 65 79 2d 31 35 2e 31 20 7b 0a 20 20 65  _fkey-15.1 {.  e
3f00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
3f10: 41 54 45 20 54 41 42 4c 45 20 70 61 72 28 70 20  ATE TABLE par(p 
3f20: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
3f30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
3f40: 68 69 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  hi(c REFERENCES 
3f50: 70 61 72 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  par);..    INSER
3f60: 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45  T INTO par VALUE
3f70: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
3f80: 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45 53   INTO par VALUES
3f90: 28 27 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('1');.    INSER
3fa0: 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45  T INTO par VALUE
3fb0: 53 28 58 27 33 31 27 29 3b 0a 20 20 20 20 53 45  S(X'31');.    SE
3fc0: 4c 45 43 54 20 74 79 70 65 6f 66 28 70 29 20 46  LECT typeof(p) F
3fd0: 52 4f 4d 20 70 61 72 3b 0a 20 20 7d 0a 7d 20 7b  ROM par;.  }.} {
3fe0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 62 6c 6f  integer text blo
3ff0: 62 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66  b}..proc test_ef
4000: 6b 65 79 5f 34 35 20 7b 74 6e 20 69 73 45 72 72  key_45 {tn isErr
4010: 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74  or sql} {.  do_t
4020: 65 73 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24 74  est e_fkey-15.$t
4030: 6e 2e 31 20 22 0a 20 20 20 20 63 61 74 63 68 73  n.1 ".    catchs
4040: 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c  ql {$sql}.  " [l
4050: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
4060: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
4070: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4080: 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 0a 20 20  }} $isError]..  
4090: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
40a0: 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  5.$tn.2 {.    ex
40b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
40c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 20  LECT * FROM chi 
40d0: 57 48 45 52 45 20 63 20 49 53 20 4e 4f 54 20 4e  WHERE c IS NOT N
40e0: 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 49 4e  ULL AND c NOT IN
40f0: 20 28 53 45 4c 45 43 54 20 70 20 46 52 4f 4d 20   (SELECT p FROM 
4100: 70 61 72 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  par).    }.  } {
4110: 7d 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f  }.}..test_efkey_
4120: 34 35 20 31 20 30 20 22 49 4e 53 45 52 54 20 49  45 1 0 "INSERT I
4130: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 31  NTO chi VALUES(1
4140: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  )".test_efkey_45
4150: 20 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54   2 1 "INSERT INT
4160: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27 31 2e  O chi VALUES('1.
4170: 30 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  0')".test_efkey_
4180: 34 35 20 33 20 30 20 22 49 4e 53 45 52 54 20 49  45 3 0 "INSERT I
4190: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27  NTO chi VALUES('
41a0: 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  1')".test_efkey_
41b0: 34 35 20 34 20 31 20 22 44 45 4c 45 54 45 20 46  45 4 1 "DELETE F
41c0: 52 4f 4d 20 70 61 72 20 57 48 45 52 45 20 70 20  ROM par WHERE p 
41d0: 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65  = '1'".test_efke
41e0: 79 5f 34 35 20 35 20 30 20 22 44 45 4c 45 54 45  y_45 5 0 "DELETE
41f0: 20 46 52 4f 4d 20 63 68 69 20 57 48 45 52 45 20   FROM chi WHERE 
4200: 63 20 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66  c = '1'".test_ef
4210: 6b 65 79 5f 34 35 20 36 20 30 20 22 44 45 4c 45  key_45 6 0 "DELE
4220: 54 45 20 46 52 4f 4d 20 70 61 72 20 57 48 45 52  TE FROM par WHER
4230: 45 20 70 20 3d 20 27 31 27 22 0a 74 65 73 74 5f  E p = '1'".test_
4240: 65 66 6b 65 79 5f 34 35 20 37 20 31 20 22 49 4e  efkey_45 7 1 "IN
4250: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
4260: 4c 55 45 53 28 27 31 27 29 22 0a 74 65 73 74 5f  LUES('1')".test_
4270: 65 66 6b 65 79 5f 34 35 20 38 20 30 20 22 49 4e  efkey_45 8 0 "IN
4280: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
4290: 4c 55 45 53 28 58 27 33 31 27 29 22 0a 74 65 73  LUES(X'31')".tes
42a0: 74 5f 65 66 6b 65 79 5f 34 35 20 39 20 31 20 22  t_efkey_45 9 1 "
42b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20  INSERT INTO chi 
42c0: 56 41 4c 55 45 53 28 58 27 33 32 27 29 22 0a 0a  VALUES(X'32')"..
42d0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65  ----------.# Spe
4320: 63 69 66 69 63 61 6c 6c 79 2c 20 74 65 73 74 20  cifically, test 
4330: 74 68 61 74 20 77 68 65 6e 20 63 6f 6d 70 61 72  that when compar
4340: 69 6e 67 20 63 68 69 6c 64 20 61 6e 64 20 70 61  ing child and pa
4350: 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20  rent key values 
4360: 74 68 65 0a 23 20 64 65 66 61 75 6c 74 20 63 6f  the.# default co
4370: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4380: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   of the parent k
4390: 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ey column is use
43a0: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
43b0: 4f 46 3a 20 52 2d 31 35 37 39 36 2d 34 37 35 31  OF: R-15796-4751
43c0: 33 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  3 When comparing
43d0: 20 74 65 78 74 20 76 61 6c 75 65 73 2c 20 74 68   text values, th
43e0: 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 23 20 73 65  e collating.# se
43f0: 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65  quence associate
4400: 64 20 77 69 74 68 20 74 68 65 20 70 61 72 65 6e  d with the paren
4410: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20  t key column is 
4420: 61 6c 77 61 79 73 20 75 73 65 64 2e 0a 23 0a 64  always used..#.d
4430: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
4440: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36  o_test e_fkey-16
4450: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
4460: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4470: 45 20 74 31 28 61 20 43 4f 4c 4c 41 54 45 20 6e  E t1(a COLLATE n
4480: 6f 63 61 73 65 20 50 52 49 4d 41 52 59 20 4b 45  ocase PRIMARY KE
4490: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
44a0: 41 42 4c 45 20 74 32 28 62 20 52 45 46 45 52 45  ABLE t2(b REFERE
44b0: 4e 43 45 53 20 74 31 29 3b 0a 20 20 7d 0a 7d 20  NCES t1);.  }.} 
44c0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
44d0: 79 2d 31 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-16.2 {.  execs
44e0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
44f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4500: 6f 4e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  oNe');.    INSER
4510: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
4520: 28 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53  ('one');.    INS
4530: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
4540: 45 53 28 27 4f 4e 45 27 29 3b 0a 20 20 20 20 55  ES('ONE');.    U
4550: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
4560: 20 27 4f 6e 45 27 3b 0a 20 20 20 20 55 50 44 41   'OnE';.    UPDA
4570: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 27 4f  TE t1 SET a = 'O
4580: 4e 45 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  NE';.  }.} {}.do
4590: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e  _test e_fkey-16.
45a0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
45b0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62   UPDATE t2 SET b
45c0: 20 3d 20 27 74 77 6f 27 20 57 48 45 52 45 20 72   = 'two' WHERE r
45d0: 6f 77 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31 20  owid = 1 }.} {1 
45e0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
45f0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
4600: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
4610: 31 36 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  16.4 {.  catchsq
4620: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
4630: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  t1 WHERE rowid =
4640: 20 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   1 }.} {1 {forei
4650: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
4660: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d  t failed}}..#---
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66 69  ------.# Specifi
46c0: 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74  cally, test that
46d0: 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   when comparing 
46e0: 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74  child and parent
46f0: 20 6b 65 79 20 76 61 6c 75 65 73 20 74 68 65 0a   key values the.
4700: 23 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  # affinity of th
4710: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
4720: 75 6d 6e 20 69 73 20 61 70 70 6c 69 65 64 20 74  umn is applied t
4730: 6f 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  o the child key 
4740: 76 61 6c 75 65 0a 23 20 62 65 66 6f 72 65 20 74  value.# before t
4750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61  he comparison ta
4760: 6b 65 73 20 70 6c 61 63 65 2e 0a 23 0a 23 20 45  kes place..#.# E
4770: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
4780: 32 34 30 2d 31 33 38 36 30 20 57 68 65 6e 20 63  240-13860 When c
4790: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 2c  omparing values,
47a0: 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   if the parent k
47b0: 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ey.# column has 
47c0: 61 6e 20 61 66 66 69 6e 69 74 79 2c 20 74 68 65  an affinity, the
47d0: 6e 20 74 68 61 74 20 61 66 66 69 6e 69 74 79 20  n that affinity 
47e0: 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  is applied to th
47f0: 65 20 63 68 69 6c 64 20 6b 65 79 0a 23 20 76 61  e child key.# va
4800: 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  lue before the c
4810: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 65 72  omparison is per
4820: 66 6f 72 6d 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  formed..#.drop_a
4830: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
4840: 74 20 65 5f 66 6b 65 79 2d 31 37 2e 31 20 7b 0a  t e_fkey-17.1 {.
4850: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4870: 61 20 4e 55 4d 45 52 49 43 20 50 52 49 4d 41 52  a NUMERIC PRIMAR
4880: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
4890: 54 45 20 54 41 42 4c 45 20 74 32 28 62 20 54 45  TE TABLE t2(b TE
48a0: 58 54 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  XT REFERENCES t1
48b0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
48c0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 32 20  est e_fkey-17.2 
48d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
48e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
48f0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
4900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4910: 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e  ALUES(2);.    IN
4920: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4930: 55 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20  UES('three');.  
4940: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
4950: 20 56 41 4c 55 45 53 28 27 32 2e 30 27 29 3b 0a   VALUES('2.0');.
4960: 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20 74 79      SELECT b, ty
4970: 70 65 6f 66 28 62 29 20 46 52 4f 4d 20 74 32 3b  peof(b) FROM t2;
4980: 0a 20 20 7d 0a 7d 20 7b 32 2e 30 20 74 65 78 74  .  }.} {2.0 text
4990: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
49a0: 2d 31 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -17.3 {.  execsq
49b0: 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  l { SELECT typeo
49c0: 66 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  f(a) FROM t1 }.}
49d0: 20 7b 69 6e 74 65 67 65 72 20 69 6e 74 65 67 65   {integer intege
49e0: 72 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74 20  r text}.do_test 
49f0: 65 5f 66 6b 65 79 2d 31 37 2e 34 20 7b 0a 20 20  e_fkey-17.4 {.  
4a00: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
4a10: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
4a20: 72 6f 77 69 64 20 3d 20 32 20 7d 0a 7d 20 7b 31  rowid = 2 }.} {1
4a30: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
4a40: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4a50: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
4a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
4aa0: 23 23 20 53 45 43 54 49 4f 4e 20 33 3a 20 52 65  ## SECTION 3: Re
4ab0: 71 75 69 72 65 64 20 61 6e 64 20 53 75 67 67 65  quired and Sugge
4ac0: 73 74 65 64 20 44 61 74 61 62 61 73 65 20 49 6e  sted Database In
4ad0: 64 65 78 65 73 0a 23 23 23 23 23 23 23 23 23 23  dexes.##########
4ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #..#------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4b70: 41 20 70 61 72 65 6e 74 20 6b 65 79 20 6d 75 73  A parent key mus
4b80: 74 20 62 65 20 65 69 74 68 65 72 20 61 20 50 52  t be either a PR
4b90: 49 4d 41 52 59 20 4b 45 59 2c 20 73 75 62 6a 65  IMARY KEY, subje
4ba0: 63 74 20 74 6f 20 61 20 55 4e 49 51 55 45 20 0a  ct to a UNIQUE .
4bb0: 23 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  # constraint, or
4bc0: 20 68 61 76 65 20 61 20 55 4e 49 51 55 45 20 69   have a UNIQUE i
4bd0: 6e 64 65 78 20 63 72 65 61 74 65 64 20 6f 6e 20  ndex created on 
4be0: 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  it..#.# EVIDENCE
4bf0: 2d 4f 46 3a 20 52 2d 31 33 34 33 35 2d 32 36 33  -OF: R-13435-263
4c00: 31 31 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  11 Usually, the 
4c10: 70 61 72 65 6e 74 20 6b 65 79 20 6f 66 20 61 20  parent key of a 
4c20: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f  foreign key.# co
4c30: 6e 73 74 72 61 69 6e 74 20 69 73 20 74 68 65 20  nstraint is the 
4c40: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
4c50: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
4c60: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
4c70: 20 74 68 65 0a 23 20 70 72 69 6d 61 72 79 20 6b   the.# primary k
4c80: 65 79 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72  ey, then the par
4c90: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
4ca0: 6d 75 73 74 20 62 65 20 63 6f 6c 6c 65 63 74 69  must be collecti
4cb0: 76 65 6c 79 20 73 75 62 6a 65 63 74 0a 23 20 74  vely subject.# t
4cc0: 6f 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  o a UNIQUE const
4cd0: 72 61 69 6e 74 20 6f 72 20 68 61 76 65 20 61 20  raint or have a 
4ce0: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 20  UNIQUE index..# 
4cf0: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
4d00: 74 20 69 66 20 61 20 70 61 72 65 6e 74 20 6b 65  t if a parent ke
4d10: 79 20 69 73 20 6e 6f 74 20 73 75 62 6a 65 63 74  y is not subject
4d20: 20 74 6f 20 61 20 50 52 49 4d 41 52 59 20 4b 45   to a PRIMARY KE
4d30: 59 20 6f 72 20 55 4e 49 51 55 45 0a 23 20 63 6f  Y or UNIQUE.# co
4d40: 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 64 6f  nstraint, but do
4d50: 65 73 20 68 61 76 65 20 61 20 55 4e 49 51 55 45  es have a UNIQUE
4d60: 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 6f   index created o
4d70: 6e 20 69 74 2c 20 74 68 65 6e 20 74 68 65 20 55  n it, then the U
4d80: 4e 49 51 55 45 20 69 6e 64 65 78 0a 23 20 6d 75  NIQUE index.# mu
4d90: 73 74 20 75 73 65 20 74 68 65 20 64 65 66 61 75  st use the defau
4da0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
4db0: 75 65 6e 63 65 73 20 61 73 73 6f 63 69 61 74 65  uences associate
4dc0: 64 20 77 69 74 68 20 74 68 65 20 70 61 72 65 6e  d with the paren
4dd0: 74 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 2e  t key.# columns.
4de0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
4df0: 3a 20 52 2d 30 30 33 37 36 2d 33 39 32 31 32 20  : R-00376-39212 
4e00: 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  If the parent ke
4e10: 79 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 61  y columns have a
4e20: 20 55 4e 49 51 55 45 0a 23 20 69 6e 64 65 78 2c   UNIQUE.# index,
4e30: 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
4e40: 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 63 6f   must use the co
4e50: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4e60: 73 20 74 68 61 74 20 61 72 65 0a 23 20 73 70 65  s that are.# spe
4e70: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 43 52  cified in the CR
4e80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4e90: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 61 72  ment for the par
4ea0: 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 64 72 6f  ent table..#.dro
4eb0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
4ec0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 38 2e 31  test e_fkey-18.1
4ed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4ef0: 74 32 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t2(a REFERENCES 
4f00: 74 31 28 78 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  t1(x));.  }.} {}
4f10: 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79  .proc test_efkey
4f20: 5f 35 37 20 7b 74 6e 20 69 73 45 72 72 6f 72 20  _57 {tn isError 
4f30: 73 71 6c 7d 20 7b 0a 20 20 63 61 74 63 68 73 71  sql} {.  catchsq
4f40: 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74  l { DROP TABLE t
4f50: 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 24 73  1 }.  execsql $s
4f60: 71 6c 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  ql.  do_test e_f
4f70: 6b 65 79 2d 31 38 2e 24 74 6e 20 7b 0a 20 20 20  key-18.$tn {.   
4f80: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
4f90: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4fa0: 53 28 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 5b 6c  S(NULL) }.  } [l
4fb0: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
4fc0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
4fd0: 73 6d 61 74 63 68 7d 7d 7d 20 24 69 73 45 72 72  smatch}}} $isErr
4fe0: 6f 72 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79  or].}.test_efkey
4ff0: 5f 35 37 20 32 20 30 20 7b 20 43 52 45 41 54 45  _57 2 0 { CREATE
5000: 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d   TABLE t1(x PRIM
5010: 41 52 59 20 4b 45 59 29 20 7d 0a 74 65 73 74 5f  ARY KEY) }.test_
5020: 65 66 6b 65 79 5f 35 37 20 33 20 30 20 7b 20 43  efkey_57 3 0 { C
5030: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5040: 20 55 4e 49 51 55 45 29 20 7d 0a 74 65 73 74 5f   UNIQUE) }.test_
5050: 65 66 6b 65 79 5f 35 37 20 34 20 30 20 7b 20 43  efkey_57 4 0 { C
5060: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5070: 29 3b 20 43 52 45 41 54 45 20 55 4e 49 51 55 45  ); CREATE UNIQUE
5080: 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31   INDEX t1i ON t1
5090: 28 78 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79  (x) }.test_efkey
50a0: 5f 35 37 20 35 20 31 20 7b 20 0a 20 20 43 52 45  _57 5 1 { .  CRE
50b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
50c0: 20 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55   .  CREATE UNIQU
50d0: 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74  E INDEX t1i ON t
50e0: 31 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  1(x COLLATE noca
50f0: 73 65 29 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65  se);.}.test_efke
5100: 79 5f 35 37 20 36 20 31 20 7b 20 43 52 45 41 54  y_57 6 1 { CREAT
5110: 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d 0a  E TABLE t1(x) }.
5120: 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 37 20  test_efkey_57 7 
5130: 31 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  1 { CREATE TABLE
5140: 20 74 31 28 78 2c 20 79 2c 20 50 52 49 4d 41 52   t1(x, y, PRIMAR
5150: 59 20 4b 45 59 28 78 2c 20 79 29 29 20 7d 0a 74  Y KEY(x, y)) }.t
5160: 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 38 20 31  est_efkey_57 8 1
5170: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
5180: 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28  t1(x, y, UNIQUE(
5190: 78 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f 65 66  x, y)) }.test_ef
51a0: 6b 65 79 5f 35 37 20 39 20 31 20 7b 20 0a 20 20  key_57 9 1 { .  
51b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
51c0: 78 2c 20 79 29 3b 20 0a 20 20 43 52 45 41 54 45  x, y); .  CREATE
51d0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 31   UNIQUE INDEX t1
51e0: 69 20 4f 4e 20 74 31 28 78 2c 20 79 29 3b 0a 7d  i ON t1(x, y);.}
51f0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5240: 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
5250: 20 61 6e 20 65 78 61 6d 70 6c 65 20 69 6e 20 66   an example in f
5260: 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
5270: 20 53 65 76 65 72 61 6c 20 74 65 73 74 61 62 6c   Several testabl
5280: 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 72  e.# statements r
5290: 65 66 65 72 20 74 6f 20 74 68 69 73 20 65 78 61  efer to this exa
52a0: 6d 70 6c 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  mple, as follows
52b0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
52c0: 3a 20 52 2d 32 37 34 38 34 2d 30 31 34 36 37 0a  : R-27484-01467.
52d0: 23 0a 23 20 46 4b 20 43 6f 6e 73 74 72 61 69 6e  #.# FK Constrain
52e0: 74 73 20 6f 6e 20 63 68 69 6c 64 31 2c 20 63 68  ts on child1, ch
52f0: 69 6c 64 32 20 61 6e 64 20 63 68 69 6c 64 33 20  ild2 and child3 
5300: 61 72 65 20 4f 6b 2e 0a 23 0a 23 20 50 72 6f 62  are Ok..#.# Prob
5310: 6c 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63  lem with FK on c
5320: 68 69 6c 64 34 3a 0a 23 0a 23 20 45 56 49 44 45  hild4:.#.# EVIDE
5330: 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 30 33 39 2d  NCE-OF: R-51039-
5340: 34 34 38 34 30 20 54 68 65 20 66 6f 72 65 69 67  44840 The foreig
5350: 6e 20 6b 65 79 20 64 65 63 6c 61 72 65 64 20 61  n key declared a
5360: 73 20 70 61 72 74 20 6f 66 20 74 61 62 6c 65 0a  s part of table.
5370: 23 20 63 68 69 6c 64 34 20 69 73 20 61 6e 20 65  # child4 is an e
5380: 72 72 6f 72 20 62 65 63 61 75 73 65 20 65 76 65  rror because eve
5390: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 70 61 72  n though the par
53a0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ent key column i
53b0: 73 0a 23 20 69 6e 64 65 78 65 64 2c 20 74 68 65  s.# indexed, the
53c0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 55 4e   index is not UN
53d0: 49 51 55 45 2e 0a 23 0a 23 20 50 72 6f 62 6c 65  IQUE..#.# Proble
53e0: 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68 69  m with FK on chi
53f0: 6c 64 35 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43  ld5:.#.# EVIDENC
5400: 45 2d 4f 46 3a 20 52 2d 30 31 30 36 30 2d 34 38  E-OF: R-01060-48
5410: 37 38 38 20 54 68 65 20 66 6f 72 65 69 67 6e 20  788 The foreign 
5420: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 20 63 68  key for table ch
5430: 69 6c 64 35 20 69 73 20 61 6e 0a 23 20 65 72 72  ild5 is an.# err
5440: 6f 72 20 62 65 63 61 75 73 65 20 65 76 65 6e 20  or because even 
5450: 74 68 6f 75 67 68 20 74 68 65 20 70 61 72 65 6e  though the paren
5460: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 68 61 73  t key column has
5470: 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2c   a unique index,
5480: 0a 23 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  .# the index use
5490: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  s a different co
54a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
54b0: 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69  ..#.# Problem wi
54c0: 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 36 20  th FK on child6 
54d0: 61 6e 64 20 63 68 69 6c 64 37 3a 0a 23 0a 23 20  and child7:.#.# 
54e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
54f0: 33 30 38 38 2d 33 37 34 36 39 20 54 61 62 6c 65  3088-37469 Table
5500: 73 20 63 68 69 6c 64 36 20 61 6e 64 20 63 68 69  s child6 and chi
5510: 6c 64 37 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ld7 are incorrec
5520: 74 0a 23 20 62 65 63 61 75 73 65 20 77 68 69 6c  t.# because whil
5530: 65 20 62 6f 74 68 20 68 61 76 65 20 55 4e 49 51  e both have UNIQ
5540: 55 45 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  UE indices on th
5550: 65 69 72 20 70 61 72 65 6e 74 20 6b 65 79 73 2c  eir parent keys,
5560: 20 74 68 65 20 6b 65 79 73 0a 23 20 61 72 65 20   the keys.# are 
5570: 6e 6f 74 20 61 6e 20 65 78 61 63 74 20 6d 61 74  not an exact mat
5580: 63 68 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ch to the column
5590: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 4e  s of a single UN
55a0: 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64 72  IQUE index..#.dr
55b0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
55c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e  _test e_fkey-19.
55d0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
55e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
55f0: 20 70 61 72 65 6e 74 28 61 20 50 52 49 4d 41 52   parent(a PRIMAR
5600: 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 2c  Y KEY, b UNIQUE,
5610: 20 63 2c 20 64 2c 20 65 2c 20 66 29 3b 0a 20 20   c, d, e, f);.  
5620: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
5630: 49 4e 44 45 58 20 69 31 20 4f 4e 20 70 61 72 65  INDEX i1 ON pare
5640: 6e 74 28 63 2c 20 64 29 3b 0a 20 20 20 20 43 52  nt(c, d);.    CR
5650: 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
5660: 20 70 61 72 65 6e 74 28 65 29 3b 0a 20 20 20 20   parent(e);.    
5670: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
5680: 44 45 58 20 69 33 20 4f 4e 20 70 61 72 65 6e 74  DEX i3 ON parent
5690: 28 66 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (f COLLATE nocas
56a0: 65 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  e);..    CREATE 
56b0: 54 41 42 4c 45 20 63 68 69 6c 64 31 28 66 2c 20  TABLE child1(f, 
56c0: 67 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  g REFERENCES par
56d0: 65 6e 74 28 61 29 29 3b 20 20 20 20 20 20 20 20  ent(a));        
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
56f0: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
5700: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 68 2c 20  TABLE child2(h, 
5710: 69 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  i REFERENCES par
5720: 65 6e 74 28 62 29 29 3b 20 20 20 20 20 20 20 20  ent(b));        
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
5740: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
5750: 54 41 42 4c 45 20 63 68 69 6c 64 33 28 6a 2c 20  TABLE child3(j, 
5760: 6b 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  k, FOREIGN KEY(j
5770: 2c 20 6b 29 20 52 45 46 45 52 45 4e 43 45 53 20  , k) REFERENCES 
5780: 70 61 72 65 6e 74 28 63 2c 20 64 29 29 3b 20 2d  parent(c, d)); -
5790: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
57a0: 54 41 42 4c 45 20 63 68 69 6c 64 34 28 6c 2c 20  TABLE child4(l, 
57b0: 6d 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  m REFERENCES par
57c0: 65 6e 74 28 65 29 29 3b 20 20 20 20 20 20 20 20  ent(e));        
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
57e0: 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45  - Err.    CREATE
57f0: 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28 6e 2c   TABLE child5(n,
5800: 20 6f 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   o REFERENCES pa
5810: 72 65 6e 74 28 66 29 29 3b 20 20 20 20 20 20 20  rent(f));       
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54  -- Err.    CREAT
5840: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28 70  E TABLE child6(p
5850: 2c 20 71 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , q, FOREIGN KEY
5860: 28 70 2c 71 29 20 52 45 46 45 52 45 4e 43 45 53  (p,q) REFERENCES
5870: 20 70 61 72 65 6e 74 28 62 2c 20 63 29 29 3b 20   parent(b, c)); 
5880: 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41   -- Err.    CREA
5890: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28  TE TABLE child7(
58a0: 72 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  r REFERENCES par
58b0: 65 6e 74 28 63 29 29 3b 20 20 20 20 20 20 20 20  ent(c));        
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b    -- Err.  }.} {
58e0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
58f0: 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -19.2 {.  execsq
5900: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
5910: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
5920: 53 28 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c  S(1, 2, 3, 4, 5,
5930: 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   6);.    INSERT 
5940: 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
5950: 45 53 28 27 78 78 78 27 2c 20 31 29 3b 0a 20 20  ES('xxx', 1);.  
5960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
5970: 69 6c 64 32 20 56 41 4c 55 45 53 28 27 78 78 78  ild2 VALUES('xxx
5980: 27 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 2);.    INSER
5990: 54 20 49 4e 54 4f 20 63 68 69 6c 64 33 20 56 41  T INTO child3 VA
59a0: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a  LUES(3, 4);.  }.
59b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
59c0: 6b 65 79 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74  key-19.2 {.  cat
59d0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
59e0: 4e 54 4f 20 63 68 69 6c 64 34 20 56 41 4c 55 45  NTO child4 VALUE
59f0: 53 28 27 78 78 78 27 2c 20 35 29 20 7d 0a 7d 20  S('xxx', 5) }.} 
5a00: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
5a10: 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65  mismatch}}.do_te
5a20: 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 33 20 7b  st e_fkey-19.3 {
5a30: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
5a40: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 35  SERT INTO child5
5a50: 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20 36   VALUES('xxx', 6
5a60: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
5a70: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
5a80: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
5a90: 31 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  19.4 {.  catchsq
5aa0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
5ab0: 63 68 69 6c 64 36 20 56 41 4c 55 45 53 28 32 2c  child6 VALUES(2,
5ac0: 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65   3) }.} {1 {fore
5ad0: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
5ae0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
5af0: 79 2d 31 39 2e 35 20 7b 0a 20 20 63 61 74 63 68  y-19.5 {.  catch
5b00: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5b10: 4f 20 63 68 69 6c 64 37 20 56 41 4c 55 45 53 28  O child7 VALUES(
5b20: 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  3) }.} {1 {forei
5b30: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d  gn key mismatch}
5b40: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5b90: 54 65 73 74 20 65 72 72 6f 72 73 20 69 6e 20 74  Test errors in t
5ba0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
5bb0: 6d 61 20 74 68 61 74 20 61 72 65 20 64 65 74 65  ma that are dete
5bc0: 63 74 65 64 20 77 68 69 6c 65 20 70 72 65 70 61  cted while prepa
5bd0: 72 69 6e 67 0a 23 20 44 4d 4c 20 73 74 61 74 65  ring.# DML state
5be0: 6d 65 6e 74 73 2e 20 54 68 65 20 65 72 72 6f 72  ments. The error
5bf0: 20 74 65 78 74 20 66 6f 72 20 74 68 65 73 65 20   text for these 
5c00: 6d 65 73 73 61 67 65 73 20 61 6c 77 61 79 73 20  messages always 
5c10: 6d 61 74 63 68 65 73 20 0a 23 20 65 69 74 68 65  matches .# eithe
5c20: 72 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  r "foreign key m
5c30: 69 73 6d 61 74 63 68 22 20 6f 72 20 22 6e 6f 20  ismatch" or "no 
5c40: 73 75 63 68 20 74 61 62 6c 65 2a 22 20 28 75 73  such table*" (us
5c50: 69 6e 67 20 5b 73 74 72 69 6e 67 20 6d 61 74 63  ing [string matc
5c60: 68 5d 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  h])..#.# EVIDENC
5c70: 45 2d 4f 46 3a 20 52 2d 34 35 34 38 38 2d 30 38  E-OF: R-45488-08
5c80: 35 30 34 20 49 66 20 74 68 65 20 64 61 74 61 62  504 If the datab
5c90: 61 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74 61  ase schema conta
5ca0: 69 6e 73 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a  ins foreign key.
5cb0: 23 20 65 72 72 6f 72 73 20 74 68 61 74 20 72 65  # errors that re
5cc0: 71 75 69 72 65 20 6c 6f 6f 6b 69 6e 67 20 61 74  quire looking at
5cd0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
5ce0: 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  able definition 
5cf0: 74 6f 0a 23 20 69 64 65 6e 74 69 66 79 2c 20 74  to.# identify, t
5d00: 68 65 6e 20 74 68 6f 73 65 20 65 72 72 6f 72 73  hen those errors
5d10: 20 61 72 65 20 6e 6f 74 20 64 65 74 65 63 74 65   are not detecte
5d20: 64 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  d when the table
5d30: 73 20 61 72 65 0a 23 20 63 72 65 61 74 65 64 2e  s are.# created.
5d40: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
5d50: 3a 20 52 2d 34 38 33 39 31 2d 33 38 34 37 32 20  : R-48391-38472 
5d60: 49 6e 73 74 65 61 64 2c 20 73 75 63 68 20 65 72  Instead, such er
5d70: 72 6f 72 73 20 70 72 65 76 65 6e 74 20 74 68 65  rors prevent the
5d80: 0a 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 66  .# application f
5d90: 72 6f 6d 20 70 72 65 70 61 72 69 6e 67 20 53 51  rom preparing SQ
5da0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  L statements tha
5db0: 74 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e  t modify the con
5dc0: 74 65 6e 74 20 6f 66 0a 23 20 74 68 65 20 63 68  tent of.# the ch
5dd0: 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74 61  ild or parent ta
5de0: 62 6c 65 73 20 69 6e 20 77 61 79 73 20 74 68 61  bles in ways tha
5df0: 74 20 75 73 65 20 74 68 65 20 66 6f 72 65 69 67  t use the foreig
5e00: 6e 20 6b 65 79 73 2e 0a 23 0a 23 20 45 56 49 44  n keys..#.# EVID
5e10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 31 30 38  ENCE-OF: R-03108
5e20: 2d 36 33 36 35 39 20 54 68 65 20 45 6e 67 6c 69  -63659 The Engli
5e30: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
5e40: 72 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 23 20  r message for.# 
5e50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20  foreign key DML 
5e60: 65 72 72 6f 72 73 20 69 73 20 75 73 75 61 6c 6c  errors is usuall
5e70: 79 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  y "foreign key m
5e80: 69 73 6d 61 74 63 68 22 20 62 75 74 20 63 61 6e  ismatch" but can
5e90: 20 61 6c 73 6f 0a 23 20 62 65 20 22 6e 6f 20 73   also.# be "no s
5ea0: 75 63 68 20 74 61 62 6c 65 22 20 69 66 20 74 68  uch table" if th
5eb0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64  e parent table d
5ec0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23  oes not exist..#
5ed0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5ee0: 52 2d 36 30 37 38 31 2d 32 36 35 37 36 20 46 6f  R-60781-26576 Fo
5ef0: 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72  reign key DML er
5f00: 72 6f 72 73 20 61 72 65 20 6d 61 79 20 62 65 20  rors are may be 
5f10: 72 65 70 6f 72 74 65 64 0a 23 20 69 66 3a 20 54  reported.# if: T
5f20: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
5f30: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
5f40: 6f 72 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65  or The parent ke
5f50: 79 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 0a  y columns named.
5f60: 23 20 69 6e 20 74 68 65 20 66 6f 72 65 69 67 6e  # in the foreign
5f70: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
5f80: 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  do not exist, or
5f90: 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   The parent key 
5fa0: 63 6f 6c 75 6d 6e 73 0a 23 20 6e 61 6d 65 64 20  columns.# named 
5fb0: 69 6e 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  in the foreign k
5fc0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72  ey constraint ar
5fd0: 65 20 6e 6f 74 20 74 68 65 20 70 72 69 6d 61 72  e not the primar
5fe0: 79 20 6b 65 79 20 6f 66 20 74 68 65 0a 23 20 70  y key of the.# p
5ff0: 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
6000: 61 72 65 20 6e 6f 74 20 73 75 62 6a 65 63 74 20  are not subject 
6010: 74 6f 20 61 20 75 6e 69 71 75 65 20 63 6f 6e 73  to a unique cons
6020: 74 72 61 69 6e 74 20 75 73 69 6e 67 0a 23 20 63  traint using.# c
6030: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
6040: 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
6050: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 2c  he CREATE TABLE,
6060: 20 6f 72 20 54 68 65 20 63 68 69 6c 64 20 74 61   or The child ta
6070: 62 6c 65 0a 23 20 72 65 66 65 72 65 6e 63 65 73  ble.# references
6080: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
6090: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 77   of the parent w
60a0: 69 74 68 6f 75 74 20 73 70 65 63 69 66 79 69 6e  ithout specifyin
60b0: 67 20 74 68 65 0a 23 20 70 72 69 6d 61 72 79 20  g the.# primary 
60c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  key columns and 
60d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  the number of pr
60e0: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
60f0: 73 20 69 6e 20 74 68 65 0a 23 20 70 61 72 65 6e  s in the.# paren
6100: 74 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  t do not match t
6110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 69  he number of chi
6120: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a  ld key columns..
6130: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
6140: 2d 32 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -20.1 {.  execsq
6150: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
6160: 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
6170: 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65  NCES nosuchtable
6180: 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  , d);..    CREAT
6190: 45 20 54 41 42 4c 45 20 70 32 28 61 2c 20 62 2c  E TABLE p2(a, b,
61a0: 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a   UNIQUE(a, b));.
61b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
61c0: 20 63 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c2(c, d, FOREIG
61d0: 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
61e0: 52 45 4e 43 45 53 20 70 32 28 61 2c 20 78 29 29  RENCES p2(a, x))
61f0: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6200: 42 4c 45 20 70 33 28 61 20 50 52 49 4d 41 52 59  BLE p3(a PRIMARY
6210: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
6220: 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 63 20  EATE TABLE c3(c 
6230: 52 45 46 45 52 45 4e 43 45 53 20 70 33 28 62 29  REFERENCES p3(b)
6240: 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  , d);..    CREAT
6250: 45 20 54 41 42 4c 45 20 70 34 28 61 20 50 52 49  E TABLE p4(a PRI
6260: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
6270: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
6280: 49 4e 44 45 58 20 70 34 69 20 4f 4e 20 70 34 28  INDEX p4i ON p4(
6290: 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  b COLLATE nocase
62a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
62b0: 42 4c 45 20 63 34 28 63 20 52 45 46 45 52 45 4e  BLE c4(c REFEREN
62c0: 43 45 53 20 70 34 28 62 29 2c 20 64 29 3b 0a 0a  CES p4(b), d);..
62d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
62e0: 20 70 35 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p5(a PRIMARY KE
62f0: 59 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  Y, b COLLATE noc
6300: 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ase);.    CREATE
6310: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 35   UNIQUE INDEX p5
6320: 69 20 4f 4e 20 70 35 28 62 20 43 4f 4c 4c 41 54  i ON p5(b COLLAT
6330: 45 20 62 69 6e 61 72 79 29 3b 0a 20 20 20 20 43  E binary);.    C
6340: 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28 63  REATE TABLE c5(c
6350: 20 52 45 46 45 52 45 4e 43 45 53 20 70 35 28 62   REFERENCES p5(b
6360: 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  ), d);..    CREA
6370: 54 45 20 54 41 42 4c 45 20 70 36 28 61 20 50 52  TE TABLE p6(a PR
6380: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
6390: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
63a0: 63 36 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c6(c, d, FOREIGN
63b0: 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
63c0: 45 4e 43 45 53 20 70 36 29 3b 0a 0a 20 20 20 20  ENCES p6);..    
63d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 37 28  CREATE TABLE p7(
63e0: 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
63f0: 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
6400: 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 63 2c  EATE TABLE c7(c,
6410: 20 64 20 52 45 46 45 52 45 4e 43 45 53 20 70 37   d REFERENCES p7
6420: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72  );.  }.} {}..for
6430: 65 61 63 68 20 7b 74 6e 20 74 62 6c 20 70 74 62  each {tn tbl ptb
6440: 6c 20 65 72 72 7d 20 7b 0a 20 20 32 20 63 31 20  l err} {.  2 c1 
6450: 7b 7d 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  {} "no such tabl
6460: 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61  e: main.nosuchta
6470: 62 6c 65 22 0a 20 20 33 20 63 32 20 70 32 20 22  ble".  3 c2 p2 "
6480: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6490: 61 74 63 68 22 0a 20 20 34 20 63 33 20 70 33 20  atch".  4 c3 p3 
64a0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
64b0: 6d 61 74 63 68 22 0a 20 20 35 20 63 34 20 70 34  match".  5 c4 p4
64c0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
64d0: 73 6d 61 74 63 68 22 0a 20 20 36 20 63 35 20 70  smatch".  6 c5 p
64e0: 35 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  5 "foreign key m
64f0: 69 73 6d 61 74 63 68 22 0a 20 20 37 20 63 36 20  ismatch".  7 c6 
6500: 70 36 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  p6 "foreign key 
6510: 6d 69 73 6d 61 74 63 68 22 0a 20 20 38 20 63 37  mismatch".  8 c7
6520: 20 70 37 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p7 "foreign key
6530: 20 6d 69 73 6d 61 74 63 68 22 0a 7d 20 7b 0a 20   mismatch".} {. 
6540: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
6550: 32 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63  20.$tn.1 {.    c
6560: 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54 20  atchsql "INSERT 
6570: 49 4e 54 4f 20 24 74 62 6c 20 56 41 4c 55 45 53  INTO $tbl VALUES
6580: 28 27 61 27 2c 20 27 62 27 29 22 0a 20 20 7d 20  ('a', 'b')".  } 
6590: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
65a0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
65b0: 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63 61  0.$tn.2 {.    ca
65c0: 74 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 24  tchsql "UPDATE $
65d0: 74 62 6c 20 53 45 54 20 63 20 3d 20 3f 2c 20 64  tbl SET c = ?, d
65e0: 20 3d 20 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20   = ?".  } [list 
65f0: 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73  1 $err].  do_tes
6600: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
6610: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
6620: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74   "INSERT INTO $t
6630: 62 6c 20 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a  bl SELECT ?, ?".
6640: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
6650: 5d 0a 0a 20 20 69 66 20 7b 24 70 74 62 6c 20 6e  ]..  if {$ptbl n
6660: 65 20 22 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  e ""} {.    do_t
6670: 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74  est e_fkey-20.$t
6680: 6e 2e 34 20 7b 0a 20 20 20 20 20 20 63 61 74 63  n.4 {.      catc
6690: 68 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  hsql "DELETE FRO
66a0: 4d 20 24 70 74 62 6c 22 0a 20 20 20 20 7d 20 5b  M $ptbl".    } [
66b0: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20 20  list 1 $err].   
66c0: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
66d0: 32 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 20  20.$tn.5 {.     
66e0: 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41 54   catchsql "UPDAT
66f0: 45 20 24 70 74 62 6c 20 53 45 54 20 61 20 3d 20  E $ptbl SET a = 
6700: 3f 2c 20 62 20 3d 20 3f 22 0a 20 20 20 20 7d 20  ?, b = ?".    } 
6710: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
6720: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
6730: 2d 32 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -20.$tn.6 {.    
6740: 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45    catchsql "INSE
6750: 52 54 20 49 4e 54 4f 20 24 70 74 62 6c 20 53 45  RT INTO $ptbl SE
6760: 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20 20 20 7d  LECT ?, ?".    }
6770: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20   [list 1 $err]. 
6780: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
67e0: 52 2d 31 39 33 35 33 2d 34 33 36 34 33 0a 23 0a  R-19353-43643.#.
67f0: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
6800: 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65  le of foreign ke
6810: 79 20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72  y mismatch error
6820: 73 20 63 61 75 73 65 64 20 62 79 20 69 6d 70 6c  s caused by impl
6830: 69 63 69 74 6c 79 0a 23 20 6d 61 70 70 69 6e 67  icitly.# mapping
6840: 20 61 20 63 68 69 6c 64 20 6b 65 79 20 74 6f 20   a child key to 
6850: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
6860: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  of the parent ta
6870: 62 6c 65 20 77 68 65 6e 20 74 68 65 0a 23 20 63  ble when the.# c
6880: 68 69 6c 64 20 6b 65 79 20 63 6f 6e 73 69 73 74  hild key consist
6890: 73 20 6f 66 20 61 20 64 69 66 66 65 72 65 6e 74  s of a different
68a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
68b0: 6e 73 20 74 6f 20 74 68 61 74 20 70 72 69 6d 61  ns to that prima
68c0: 72 79 20 6b 65 79 2e 0a 23 20 0a 64 72 6f 70 5f  ry key..# .drop_
68d0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
68e0: 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 31 20 7b  st e_fkey-21.1 {
68f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6900: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
6910: 72 65 6e 74 32 28 61 2c 20 62 2c 20 50 52 49 4d  rent2(a, b, PRIM
6920: 41 52 59 20 4b 45 59 28 61 2c 62 29 29 3b 0a 0a  ARY KEY(a,b));..
6930: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6940: 20 63 68 69 6c 64 38 28 78 2c 20 79 2c 20 46 4f   child8(x, y, FO
6950: 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20 52  REIGN KEY(x,y) R
6960: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
6970: 32 29 3b 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20  2);     -- Ok.  
6980: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
6990: 68 69 6c 64 39 28 78 20 52 45 46 45 52 45 4e 43  hild9(x REFERENC
69a0: 45 53 20 70 61 72 65 6e 74 32 29 3b 20 20 20 20  ES parent2);    
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 20 20 20 20 2d 2d 20 45 72 72 0a 20 20 20        -- Err.   
69d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
69e0: 69 6c 64 31 30 28 78 2c 79 2c 7a 2c 20 46 4f 52  ild10(x,y,z, FOR
69f0: 45 49 47 4e 20 4b 45 59 28 78 2c 79 2c 7a 29 20  EIGN KEY(x,y,z) 
6a00: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
6a10: 74 32 29 3b 20 2d 2d 20 45 72 72 0a 20 20 7d 0a  t2); -- Err.  }.
6a20: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6a30: 6b 65 79 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65  key-21.2 {.  exe
6a40: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
6a50: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 32 20 56  T INTO parent2 V
6a60: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
6a70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6a80: 4f 20 63 68 69 6c 64 38 20 56 41 4c 55 45 53 28  O child8 VALUES(
6a90: 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 7d 0a  'I', 'II');.  }.
6aa0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6ab0: 6b 65 79 2d 32 31 2e 33 20 7b 0a 20 20 63 61 74  key-21.3 {.  cat
6ac0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
6ad0: 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45  NTO child9 VALUE
6ae0: 53 28 27 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66  S('I') }.} {1 {f
6af0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6b00: 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  tch}}.do_test e_
6b10: 66 6b 65 79 2d 32 31 2e 34 20 7b 0a 20 20 63 61  fkey-21.4 {.  ca
6b20: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6b30: 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55  INTO child9 VALU
6b40: 45 53 28 27 49 49 27 29 20 7d 0a 7d 20 7b 31 20  ES('II') }.} {1 
6b50: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6b60: 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20  match}}.do_test 
6b70: 65 5f 66 6b 65 79 2d 32 31 2e 35 20 7b 0a 20 20  e_fkey-21.5 {.  
6b80: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
6b90: 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41  T INTO child9 VA
6ba0: 4c 55 45 53 28 4e 55 4c 4c 29 20 7d 0a 7d 20 7b  LUES(NULL) }.} {
6bb0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
6bc0: 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73  ismatch}}.do_tes
6bd0: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 36 20 7b 0a  t e_fkey-21.6 {.
6be0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6bf0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30  ERT INTO child10
6c00: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
6c10: 27 2c 20 27 49 49 49 27 29 20 7d 0a 7d 20 7b 31  ', 'III') }.} {1
6c20: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6c30: 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74  smatch}}.do_test
6c40: 20 65 5f 66 6b 65 79 2d 32 31 2e 37 20 7b 0a 20   e_fkey-21.7 {. 
6c50: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
6c60: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20  RT INTO child10 
6c70: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 20  VALUES(1, 2, 3) 
6c80: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
6c90: 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64  key mismatch}}.d
6ca0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31  o_test e_fkey-21
6cb0: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
6cc0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68  { INSERT INTO ch
6cd0: 69 6c 64 31 30 20 56 41 4c 55 45 53 28 4e 55 4c  ild10 VALUES(NUL
6ce0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d  L, NULL, NULL) }
6cf0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
6d00: 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 23  ey mismatch}}..#
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
6d60: 20 65 72 72 6f 72 73 20 74 68 61 74 20 61 72 65   errors that are
6d70: 20 72 65 70 6f 72 74 65 64 20 77 68 65 6e 20 63   reported when c
6d80: 72 65 61 74 69 6e 67 20 74 68 65 20 63 68 69 6c  reating the chil
6d90: 64 20 74 61 62 6c 65 2e 20 0a 23 20 53 70 65 63  d table. .# Spec
6da0: 69 66 69 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20  ifically:.#.#   
6db0: 2a 20 64 69 66 66 65 72 65 6e 74 20 6e 75 6d 62  * different numb
6dc0: 65 72 20 6f 66 20 63 68 69 6c 64 20 61 6e 64 20  er of child and 
6dd0: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
6de0: 6e 73 2c 20 61 6e 64 0a 23 20 20 20 2a 20 63 68  ns, and.#   * ch
6df0: 69 6c 64 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ild columns that
6e00: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23   do not exist..#
6e10: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
6e20: 52 2d 32 33 36 38 32 2d 35 39 38 32 30 20 42 79  R-23682-59820 By
6e30: 20 63 6f 6e 74 72 61 73 74 2c 20 69 66 20 66 6f   contrast, if fo
6e40: 72 65 69 67 6e 20 6b 65 79 20 65 72 72 6f 72 73  reign key errors
6e50: 20 63 61 6e 20 62 65 0a 23 20 72 65 63 6f 67 6e   can be.# recogn
6e60: 69 7a 65 64 20 73 69 6d 70 6c 79 20 62 79 20 6c  ized simply by l
6e70: 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 64 65  ooking at the de
6e80: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
6e90: 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 0a  child table and.
6ea0: 23 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  # without having
6eb0: 20 74 6f 20 63 6f 6e 73 75 6c 74 20 74 68 65 20   to consult the 
6ec0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 65 66  parent table def
6ed0: 69 6e 69 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  inition, then th
6ee0: 65 20 43 52 45 41 54 45 0a 23 20 54 41 42 4c 45  e CREATE.# TABLE
6ef0: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74   statement for t
6f00: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 66  he child table f
6f10: 61 69 6c 73 2e 0a 23 0a 23 20 54 68 65 73 65 20  ails..#.# These 
6f20: 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72  errors are repor
6f30: 74 65 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ted whether or n
6f40: 6f 74 20 46 4b 20 73 75 70 70 6f 72 74 20 69 73  ot FK support is
6f50: 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 23 20 45 56   enabled..#.# EV
6f60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 38  IDENCE-OF: R-338
6f70: 38 33 2d 32 38 38 33 33 20 46 6f 72 65 69 67 6e  83-28833 Foreign
6f80: 20 6b 65 79 20 44 44 4c 20 65 72 72 6f 72 73 20   key DDL errors 
6f90: 61 72 65 20 72 65 70 6f 72 74 65 64 0a 23 20 72  are reported.# r
6fa0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
6fb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65  ther or not fore
6fc0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
6fd0: 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20  nts are enabled 
6fe0: 77 68 65 6e 0a 23 20 74 68 65 20 74 61 62 6c 65  when.# the table
6ff0: 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64   is created..#.d
7000: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 66  rop_all_tables.f
7010: 6f 72 65 61 63 68 20 66 6b 20 5b 6c 69 73 74 20  oreach fk [list 
7020: 4f 46 46 20 4f 4e 5d 20 7b 0a 20 20 65 78 65 63  OFF ON] {.  exec
7030: 73 71 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  sql "PRAGMA fore
7040: 69 67 6e 5f 6b 65 79 73 20 3d 20 24 66 6b 22 0a  ign_keys = $fk".
7050: 20 20 73 65 74 20 69 20 30 0a 20 20 66 6f 72 65    set i 0.  fore
7060: 61 63 68 20 7b 73 71 6c 20 65 72 72 6f 72 7d 20  ach {sql error} 
7070: 7b 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  {.    "CREATE TA
7080: 42 4c 45 20 63 68 69 6c 64 31 28 61 2c 20 62 2c  BLE child1(a, b,
7090: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
70a0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  b) REFERENCES p(
70b0: 63 29 29 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62  c))".      {numb
70c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
70d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
70e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
70f0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7100: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
7110: 63 65 64 20 74 61 62 6c 65 7d 0a 20 20 20 20 22  ced table}.    "
7120: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
7130: 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  ld2(a, b, FOREIG
7140: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
7150: 52 45 4e 43 45 53 20 70 28 63 2c 20 64 2c 20 65  RENCES p(c, d, e
7160: 29 29 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65  ))".      {numbe
7170: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
7180: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
7190: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
71a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
71b0: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
71c0: 65 64 20 74 61 62 6c 65 7d 0a 20 20 20 20 22 43  ed table}.    "C
71d0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
71e0: 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  d2(a, b, FOREIGN
71f0: 20 4b 45 59 28 61 2c 20 63 29 20 52 45 46 45 52   KEY(a, c) REFER
7200: 45 4e 43 45 53 20 70 28 63 2c 20 64 29 29 22 0a  ENCES p(c, d))".
7210: 20 20 20 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63        {unknown c
7220: 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72  olumn "c" in for
7230: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
7240: 69 6f 6e 7d 0a 20 20 20 20 22 43 52 45 41 54 45  ion}.    "CREATE
7250: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c   TABLE child2(a,
7260: 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
7270: 63 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  c, b) REFERENCES
7280: 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20 20 20   p(c, d))".     
7290: 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   {unknown column
72a0: 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67 6e 20   "c" in foreign 
72b0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a  key definition}.
72c0: 20 20 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73    } {.    do_tes
72d0: 74 20 65 5f 66 6b 65 79 2d 32 32 2e 24 66 6b 2e  t e_fkey-22.$fk.
72e0: 5b 69 6e 63 72 20 69 5d 20 7b 0a 20 20 20 20 20  [incr i] {.     
72f0: 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c 0a 20   catchsql $sql. 
7300: 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72     } [list 1 $er
7310: 72 6f 72 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  ror].  }.}..#---
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7360: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
7370: 61 74 20 61 20 52 45 46 45 52 45 4e 43 49 4e 47  at a REFERENCING
7380: 20 63 6c 61 75 73 65 20 74 68 61 74 20 64 6f 65   clause that doe
7390: 73 20 6e 6f 74 20 73 70 65 63 69 66 79 20 70 61  s not specify pa
73a0: 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  rent key columns
73b0: 0a 23 20 69 6d 70 6c 69 63 69 74 6c 79 20 6d 61  .# implicitly ma
73c0: 70 73 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72  ps to the primar
73d0: 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72  y key of the par
73e0: 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45  ent table..#.# E
73f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
7400: 38 37 39 2d 30 38 30 32 35 20 41 74 74 61 63 68  879-08025 Attach
7410: 69 6e 67 20 61 20 22 52 45 46 45 52 45 4e 43 45  ing a "REFERENCE
7420: 53 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e  S <parent-table>
7430: 22 0a 23 20 63 6c 61 75 73 65 20 74 6f 20 61 20  ".# clause to a 
7440: 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
7450: 6e 20 63 72 65 61 74 65 73 20 61 20 66 6f 72 65  n creates a fore
7460: 69 67 6e 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72  ign.# key constr
7470: 61 69 6e 74 20 74 68 61 74 20 6d 61 70 73 20 74  aint that maps t
7480: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  he column to the
7490: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 0a   primary key of.
74a0: 23 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e  # <parent-table>
74b0: 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ..# .do_test e_f
74c0: 6b 65 79 2d 32 33 2e 31 20 7b 0a 20 20 65 78 65  key-23.1 {.  exe
74d0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
74e0: 45 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 2c  E TABLE p1(a, b,
74f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
7500: 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
7510: 54 41 42 4c 45 20 70 32 28 61 2c 20 62 20 50 52  TABLE p2(a, b PR
7520: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
7530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
7540: 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
7550: 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
7560: 45 53 20 70 31 29 3b 0a 20 20 20 20 43 52 45 41  ES p1);.    CREA
7570: 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62  TE TABLE c2(a, b
7580: 20 52 45 46 45 52 45 4e 43 45 53 20 70 32 29 3b   REFERENCES p2);
7590: 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74  .  }.} {}.proc t
75a0: 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 7b 74 6e  est_efkey_60 {tn
75b0: 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a   isError sql} {.
75c0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
75d0: 2d 32 33 2e 24 74 6e 20 22 0a 20 20 20 20 63 61  -23.$tn ".    ca
75e0: 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20  tchsql {$sql}.  
75f0: 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d  " [lindex {{0 {}
7600: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
7610: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
7620: 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d  led}}} $isError]
7630: 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  .}..test_efkey_6
7640: 30 20 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e  0 2 1 "INSERT IN
7650: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32 33 39  TO c1 VALUES(239
7660: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
7670: 65 79 5f 36 30 20 33 20 30 20 22 49 4e 53 45 52  ey_60 3 0 "INSER
7680: 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53  T INTO p1 VALUES
7690: 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74  (239, 231)".test
76a0: 5f 65 66 6b 65 79 5f 36 30 20 34 20 30 20 22 49  _efkey_60 4 0 "I
76b0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
76c0: 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a  LUES(239, 231)".
76d0: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 35 20  test_efkey_60 5 
76e0: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  1 "INSERT INTO c
76f0: 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  2 VALUES(239, 23
7700: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  1)".test_efkey_6
7710: 30 20 36 20 30 20 22 49 4e 53 45 52 54 20 49 4e  0 6 0 "INSERT IN
7720: 54 4f 20 70 32 20 56 41 4c 55 45 53 28 32 33 39  TO p2 VALUES(239
7730: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
7740: 65 79 5f 36 30 20 37 20 30 20 22 49 4e 53 45 52  ey_60 7 0 "INSER
7750: 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53  T INTO c2 VALUES
7760: 28 32 33 39 2c 20 32 33 31 29 22 0a 0a 23 2d 2d  (239, 231)"..#--
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
77c0: 68 61 74 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20  hat an index on 
77d0: 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  on the child key
77e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46   columns of an F
77f0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20 69  K constraint.# i
7800: 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 23 0a 23 20  s optional..#.# 
7810: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7820: 35 34 31 37 2d 32 38 30 31 34 20 49 6e 64 69 63  5417-28014 Indic
7830: 65 73 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  es are not requi
7840: 72 65 64 20 66 6f 72 20 63 68 69 6c 64 20 6b 65  red for child ke
7850: 79 0a 23 20 63 6f 6c 75 6d 6e 73 0a 23 0a 23 20  y.# columns.#.# 
7860: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69  Also test that i
7870: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 72  f an index is cr
7880: 65 61 74 65 64 20 6f 6e 20 74 68 65 20 63 68 69  eated on the chi
7890: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20  ld key columns, 
78a0: 69 74 20 64 6f 65 73 0a 23 20 6e 6f 74 20 6d 61  it does.# not ma
78b0: 6b 65 20 61 20 64 69 66 66 65 72 65 6e 63 65 20  ke a difference 
78c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69  whether or not i
78d0: 74 20 69 73 20 61 20 55 4e 49 51 55 45 20 69 6e  t is a UNIQUE in
78e0: 64 65 78 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  dex..#.# EVIDENC
78f0: 45 2d 4f 46 3a 20 52 2d 31 35 37 34 31 2d 35 30  E-OF: R-15741-50
7900: 38 39 33 20 54 68 65 20 63 68 69 6c 64 20 6b 65  893 The child ke
7910: 79 20 69 6e 64 65 78 20 64 6f 65 73 20 6e 6f 74  y index does not
7920: 20 68 61 76 65 20 74 6f 20 62 65 0a 23 20 28 61   have to be.# (a
7930: 6e 64 20 75 73 75 61 6c 6c 79 20 77 69 6c 6c 20  nd usually will 
7940: 6e 6f 74 20 62 65 29 20 61 20 55 4e 49 51 55 45  not be) a UNIQUE
7950: 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61   index..#.drop_a
7960: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
7970: 74 20 65 5f 66 6b 65 79 2d 32 34 2e 31 20 7b 0a  t e_fkey-24.1 {.
7980: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7990: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
79a0: 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  ent(x, y, UNIQUE
79b0: 28 79 2c 20 78 29 29 3b 0a 20 20 20 20 43 52 45  (y, x));.    CRE
79c0: 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 2c 20  ATE TABLE c1(a, 
79d0: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
79e0: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
79f0: 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20  parent(x, y));. 
7a00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7a10: 63 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  c2(a, b, FOREIGN
7a20: 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52   KEY(a, b) REFER
7a30: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20  ENCES parent(x, 
7a40: 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  y));.    CREATE 
7a50: 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c 20 46  TABLE c3(a, b, F
7a60: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
7a70: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
7a80: 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43  nt(x, y));.    C
7a90: 52 45 41 54 45 20 49 4e 44 45 58 20 63 32 69 20  REATE INDEX c2i 
7aa0: 4f 4e 20 63 32 28 61 2c 20 62 29 3b 0a 20 20 20  ON c2(a, b);.   
7ab0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
7ac0: 4e 44 45 58 20 63 33 69 20 4f 4e 20 63 32 28 62  NDEX c3i ON c2(b
7ad0: 2c 20 61 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70  , a);.  }.} {}.p
7ae0: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  roc test_efkey_6
7af0: 31 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  1 {tn isError sq
7b00: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
7b10: 5f 66 6b 65 79 2d 32 34 2e 24 74 6e 20 22 0a 20  _fkey-24.$tn ". 
7b20: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71     catchsql {$sq
7b30: 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  l}.  " [lindex {
7b40: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69  {0 {}} {1 {forei
7b50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
7b60: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
7b70: 72 72 6f 72 5d 0a 7d 0a 66 6f 72 65 61 63 68 20  rror].}.foreach 
7b80: 7b 74 6e 20 63 7d 20 5b 6c 69 73 74 20 32 20 63  {tn c} [list 2 c
7b90: 31 20 33 20 63 32 20 34 20 63 33 5d 20 7b 0a 20  1 3 c2 4 c3] {. 
7ba0: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24   test_efkey_61 $
7bb0: 74 6e 2e 31 20 31 20 22 49 4e 53 45 52 54 20 49  tn.1 1 "INSERT I
7bc0: 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28 31 2c  NTO $c VALUES(1,
7bd0: 20 32 29 22 0a 20 20 74 65 73 74 5f 65 66 6b 65   2)".  test_efke
7be0: 79 5f 36 31 20 24 74 6e 2e 32 20 30 20 22 49 4e  y_61 $tn.2 0 "IN
7bf0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
7c00: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 20   VALUES(1, 2)". 
7c10: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24   test_efkey_61 $
7c20: 74 6e 2e 33 20 30 20 22 49 4e 53 45 52 54 20 49  tn.3 0 "INSERT I
7c30: 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28 31 2c  NTO $c VALUES(1,
7c40: 20 32 29 22 0a 0a 20 20 65 78 65 63 73 71 6c 20   2)"..  execsql 
7c50: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 24 63 20  "DELETE FROM $c 
7c60: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61  ; DELETE FROM pa
7c70: 72 65 6e 74 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  rent".}..#------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
7cd0: 46 3a 20 52 2d 30 30 32 37 39 2d 35 32 32 38 33  F: R-00279-52283
7ce0: 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61  .#.# Test an exa
7cf0: 6d 70 6c 65 20 73 68 6f 77 69 6e 67 20 74 68 61  mple showing tha
7d00: 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  t when a row is 
7d10: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
7d20: 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62 6c 65   parent .# table
7d30: 2c 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  , the child tabl
7d40: 65 20 69 73 20 71 75 65 72 69 65 64 20 66 6f 72  e is queried for
7d50: 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 73 20 61   orphaned rows a
7d60: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
7d70: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
7d80: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
7d90: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 3f 0a 23  rackartist = ?.#
7da0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7db0: 52 2d 32 33 33 30 32 2d 33 30 39 35 36 20 49 66  R-23302-30956 If
7dc0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65 74   this SELECT ret
7dd0: 75 72 6e 73 20 61 6e 79 20 72 6f 77 73 20 61 74  urns any rows at
7de0: 20 61 6c 6c 2c 0a 23 20 74 68 65 6e 20 53 51 4c   all,.# then SQL
7df0: 69 74 65 20 63 6f 6e 63 6c 75 64 65 73 20 74 68  ite concludes th
7e00: 61 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  at deleting the 
7e10: 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 70 61 72  row from the par
7e20: 65 6e 74 20 74 61 62 6c 65 0a 23 20 77 6f 75 6c  ent table.# woul
7e30: 64 20 76 69 6f 6c 61 74 65 20 74 68 65 20 66 6f  d violate the fo
7e40: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7e50: 61 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 73  aint and returns
7e60: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f   an error..#.do_
7e70: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 31  test e_fkey-25.1
7e80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7e90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7ea0: 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
7eb0: 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
7ec0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
7ed0: 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
7ee0: 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
7ef0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7f00: 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
7f10: 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
7f20: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d   .      tracknam
7f30: 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
7f40: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
7f50: 45 47 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45  EGER,.      FORE
7f60: 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74  IGN KEY(trackart
7f70: 69 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20  ist) REFERENCES 
7f80: 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29  artist(artistid)
7f90: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
7fa0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
7fb0: 32 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  25.2 {.  execsql
7fc0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f   {.    PRAGMA fo
7fd0: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
7fe0: 3b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55  ;.    EXPLAIN QU
7ff0: 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20  ERY PLAN DELETE 
8000: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
8010: 45 20 31 3b 0a 20 20 20 20 45 58 50 4c 41 49 4e  E 1;.    EXPLAIN
8020: 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
8030: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72  CT rowid FROM tr
8040: 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61  ack WHERE tracka
8050: 72 74 69 73 74 20 3d 20 3f 3b 0a 20 20 7d 0a 7d  rtist = ?;.  }.}
8060: 20 7b 30 20 30 20 7b 54 41 42 4c 45 20 61 72 74   {0 0 {TABLE art
8070: 69 73 74 7d 20 30 20 30 20 7b 54 41 42 4c 45 20  ist} 0 0 {TABLE 
8080: 74 72 61 63 6b 7d 7d 0a 64 6f 5f 74 65 73 74 20  track}}.do_test 
8090: 65 5f 66 6b 65 79 2d 32 35 2e 33 20 7b 0a 20 20  e_fkey-25.3 {.  
80a0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
80b0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
80c0: 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20 45 58 50  ys = ON;.    EXP
80d0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
80e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
80f0: 73 74 20 57 48 45 52 45 20 31 3b 0a 20 20 7d 0a  st WHERE 1;.  }.
8100: 7d 20 7b 30 20 30 20 7b 54 41 42 4c 45 20 61 72  } {0 0 {TABLE ar
8110: 74 69 73 74 7d 20 30 20 30 20 7b 54 41 42 4c 45  tist} 0 0 {TABLE
8120: 20 74 72 61 63 6b 7d 7d 0a 64 6f 5f 74 65 73 74   track}}.do_test
8130: 20 65 5f 66 6b 65 79 2d 32 35 2e 34 20 7b 0a 20   e_fkey-25.4 {. 
8140: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
8150: 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73  NSERT INTO artis
8160: 74 20 56 41 4c 55 45 53 28 35 2c 20 27 61 72 74  t VALUES(5, 'art
8170: 69 73 74 20 35 27 29 3b 0a 20 20 20 20 49 4e 53  ist 5');.    INS
8180: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
8190: 56 41 4c 55 45 53 28 36 2c 20 27 61 72 74 69 73  VALUES(6, 'artis
81a0: 74 20 36 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  t 6');.    INSER
81b0: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
81c0: 4c 55 45 53 28 37 2c 20 27 61 72 74 69 73 74 20  LUES(7, 'artist 
81d0: 37 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  7');.    INSERT 
81e0: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
81f0: 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20  S(1, 'track 1', 
8200: 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  5);.    INSERT I
8210: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
8220: 28 32 2c 20 27 74 72 61 63 6b 20 32 27 2c 20 36  (2, 'track 2', 6
8230: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  );.  }.} {}..do_
8240: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 35  test e_fkey-25.5
8250: 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20   {.  concat \.  
8260: 20 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c    [execsql { SEL
8270: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
8280: 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b  rack WHERE track
8290: 61 72 74 69 73 74 20 3d 20 35 20 7d 5d 20 20 20  artist = 5 }]   
82a0: 5c 0a 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20  \.    [catchsql 
82b0: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72  { DELETE FROM ar
82c0: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
82d0: 74 69 64 20 3d 20 35 20 7d 5d 0a 7d 20 7b 31 20  tid = 5 }].} {1 
82e0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
82f0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
8300: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }}..do_test e_fk
8310: 65 79 2d 32 35 2e 36 20 7b 0a 20 20 63 6f 6e 63  ey-25.6 {.  conc
8320: 61 74 20 5c 0a 20 20 20 20 5b 65 78 65 63 73 71  at \.    [execsq
8330: 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64  l { SELECT rowid
8340: 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52   FROM track WHER
8350: 45 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20  E trackartist = 
8360: 37 20 7d 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61  7 }]   \.    [ca
8370: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
8380: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
8390: 45 20 61 72 74 69 73 74 69 64 20 3d 20 37 20 7d  E artistid = 7 }
83a0: 5d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74  ].} {0 {}}..do_t
83b0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 37 20  est e_fkey-25.7 
83c0: 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20  {.  concat \.   
83d0: 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45   [execsql { SELE
83e0: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72  CT rowid FROM tr
83f0: 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61  ack WHERE tracka
8400: 72 74 69 73 74 20 3d 20 36 20 7d 5d 20 20 20 5c  rtist = 6 }]   \
8410: 0a 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b  .    [catchsql {
8420: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
8430: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
8440: 69 64 20 3d 20 36 20 7d 5d 0a 7d 20 7b 32 20 31  id = 6 }].} {2 1
8450: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
8460: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
8470: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
84c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
84d0: 37 39 33 36 2d 31 30 30 34 34 20 4f 72 2c 20 6d  7936-10044 Or, m
84e0: 6f 72 65 20 67 65 6e 65 72 61 6c 6c 79 3a 0a 23  ore generally:.#
84f0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
8500: 4f 4d 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e  OM <child-table>
8510: 20 57 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65   WHERE <child-ke
8520: 79 3e 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79  y> = :parent_key
8530: 5f 76 61 6c 75 65 0a 23 0a 23 20 54 65 73 74 20  _value.#.# Test 
8540: 74 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20  that when a row 
8550: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
8560: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
8570: 20 6f 66 20 61 6e 20 46 4b 20 0a 23 20 63 6f 6e   of an FK .# con
8580: 73 74 72 61 69 6e 74 2c 20 74 68 65 20 63 68 69  straint, the chi
8590: 6c 64 20 74 61 62 6c 65 20 69 73 20 71 75 65 72  ld table is quer
85a0: 69 65 64 20 66 6f 72 20 6f 72 70 68 61 6e 65 64  ied for orphaned
85b0: 20 72 6f 77 73 2e 20 54 68 65 0a 23 20 71 75 65   rows. The.# que
85c0: 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ry is equivalent
85d0: 20 74 6f 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43   to:.#.#   SELEC
85e0: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68  T rowid FROM <ch
85f0: 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45  ild-table> WHERE
8600: 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a   <child-key> = :
8610: 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65  parent_key_value
8620: 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74  .#.# Also test t
8630: 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69  hat when a row i
8640: 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
8650: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
8660: 2c 20 6f 72 20 77 68 65 6e 20 74 68 65 20 0a 23  , or when the .#
8670: 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75   parent key valu
8680: 65 73 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e  es of an existin
8690: 67 20 72 6f 77 20 61 72 65 20 6d 6f 64 69 66 69  g row are modifi
86a0: 65 64 2c 20 61 20 71 75 65 72 79 20 65 71 75 69  ed, a query equi
86b0: 76 61 6c 65 6e 74 0a 23 20 74 6f 20 74 68 65 20  valent.# to the 
86c0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 70 6c 61  following is pla
86d0: 6e 6e 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61  nned. In some ca
86e0: 73 65 73 20 69 74 20 69 73 20 6e 6f 74 20 65 78  ses it is not ex
86f0: 65 63 75 74 65 64 2c 20 62 75 74 20 69 74 0a 23  ecuted, but it.#
8700: 20 69 73 20 61 6c 77 61 79 73 20 70 6c 61 6e 6e   is always plann
8710: 65 64 2e 0a 23 0a 23 20 20 20 53 45 4c 45 43 54  ed..#.#   SELECT
8720: 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69   rowid FROM <chi
8730: 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20  ld-table> WHERE 
8740: 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70  <child-key> = :p
8750: 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a  arent_key_value.
8760: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
8770: 20 52 2d 36 31 36 31 36 2d 34 36 37 30 30 20 53   R-61616-46700 S
8780: 69 6d 69 6c 61 72 20 71 75 65 72 69 65 73 20 6d  imilar queries m
8790: 61 79 20 62 65 20 72 75 6e 20 69 66 20 74 68 65  ay be run if the
87a0: 20 63 6f 6e 74 65 6e 74 0a 23 20 6f 66 20 74 68   content.# of th
87b0: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20  e parent key is 
87c0: 6d 6f 64 69 66 69 65 64 20 6f 72 20 61 20 6e 65  modified or a ne
87d0: 77 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65  w row is inserte
87e0: 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  d into the paren
87f0: 74 0a 23 20 74 61 62 6c 65 2e 0a 23 0a 23 0a 64  t.# table..#.#.d
8800: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
8810: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36  o_test e_fkey-26
8820: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
8830: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
8840: 72 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  rent(x, y, UNIQU
8850: 45 28 79 2c 20 78 29 29 20 7d 0a 7d 20 7b 7d 0a  E(y, x)) }.} {}.
8860: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
8870: 20 7b 0a 20 20 32 20 7b 20 0a 20 20 20 20 43 52   {.  2 { .    CR
8880: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
8890: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
88a0: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
88b0: 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29  CES parent(x, y)
88c0: 29 0a 20 20 7d 0a 20 20 33 20 7b 20 0a 20 20 20  ).  }.  3 { .   
88d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
88e0: 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  ild(a, b, FOREIG
88f0: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
8900: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c  RENCES parent(x,
8910: 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   y));.    CREATE
8920: 20 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e   INDEX childi ON
8930: 20 63 68 69 6c 64 28 61 2c 20 62 29 3b 0a 20 20   child(a, b);.  
8940: 7d 0a 20 20 34 20 7b 20 0a 20 20 20 20 43 52 45  }.  4 { .    CRE
8950: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
8960: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
8970: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
8980: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29  ES parent(x, y))
8990: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
89a0: 51 55 45 20 49 4e 44 45 58 20 63 68 69 6c 64 69  QUE INDEX childi
89b0: 20 4f 4e 20 63 68 69 6c 64 28 62 2c 20 61 29 3b   ON child(b, a);
89c0: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73  .  }.} {.  execs
89d0: 71 6c 20 24 73 71 6c 0a 0a 20 20 65 78 65 63 73  ql $sql..  execs
89e0: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
89f0: 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20  gn_keys = OFF}. 
8a00: 20 73 65 74 20 64 65 6c 65 74 65 20 5b 63 6f 6e   set delete [con
8a10: 63 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70  cat \.      [eqp
8a20: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
8a30: 72 65 6e 74 20 57 48 45 52 45 20 31 22 5d 20 5c  rent WHERE 1"] \
8a40: 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c  .      [eqp "SEL
8a50: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63  ECT rowid FROM c
8a60: 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f  hild WHERE a = ?
8a70: 20 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d   AND b = ?"].  ]
8a80: 0a 20 20 73 65 74 20 75 70 64 61 74 65 20 5b 63  .  set update [c
8a90: 6f 6e 63 61 74 20 5c 0a 20 20 20 20 20 20 5b 65  oncat \.      [e
8aa0: 71 70 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  qp "UPDATE paren
8ab0: 74 20 53 45 54 20 78 3d 3f 2c 20 79 3d 3f 22 5d  t SET x=?, y=?"]
8ac0: 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53   \.      [eqp "S
8ad0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8ae0: 20 63 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d   child WHERE a =
8af0: 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d 20 5c   ? AND b = ?"] \
8b00: 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c  .      [eqp "SEL
8b10: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63  ECT rowid FROM c
8b20: 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f  hild WHERE a = ?
8b30: 20 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d   AND b = ?"].  ]
8b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
8b50: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
8b60: 3d 20 4f 4e 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  = ON}..  do_test
8b70: 20 65 5f 66 6b 65 79 2d 32 36 2e 24 74 6e 2e 31   e_fkey-26.$tn.1
8b80: 20 7b 20 65 71 70 20 22 44 45 4c 45 54 45 20 46   { eqp "DELETE F
8b90: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
8ba0: 20 31 22 20 7d 20 24 64 65 6c 65 74 65 0a 20 20   1" } $delete.  
8bb0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8bc0: 36 2e 24 74 6e 2e 32 20 7b 20 65 71 70 20 22 55  6.$tn.2 { eqp "U
8bd0: 50 44 41 54 45 20 70 61 72 65 6e 74 20 73 65 74  PDATE parent set
8be0: 20 78 3d 3f 2c 20 79 3d 3f 22 20 7d 20 24 75 70   x=?, y=?" } $up
8bf0: 64 61 74 65 0a 0a 20 20 65 78 65 63 73 71 6c 20  date..  execsql 
8c00: 7b 44 52 4f 50 20 54 41 42 4c 45 20 63 68 69 6c  {DROP TABLE chil
8c10: 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}.}..#---------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8c70: 52 2d 31 34 35 35 33 2d 33 34 30 31 33 0a 23 0a  R-14553-34013.#.
8c80: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
8c90: 6c 65 20 73 63 68 65 6d 61 20 61 74 20 74 68 65  le schema at the
8ca0: 20 65 6e 64 20 6f 66 20 73 65 63 74 69 6f 6e 20   end of section 
8cb0: 33 2e 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  3. Also test tha
8cc0: 74 20 69 73 0a 23 20 69 73 20 22 65 66 66 69 63  t is.# is "effic
8cd0: 69 65 6e 74 22 2e 20 49 6e 20 74 68 69 73 20 63  ient". In this c
8ce0: 61 73 65 20 22 65 66 66 69 63 69 65 6e 74 22 20  ase "efficient" 
8cf0: 6d 65 61 6e 73 20 74 68 61 74 20 66 6f 72 65 69  means that forei
8d00: 67 6e 20 6b 65 79 0a 23 20 72 65 6c 61 74 65 64  gn key.# related
8d10: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
8d20: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
8d30: 64 6f 20 6e 6f 74 20 70 72 6f 76 6f 6b 65 20 6c  do not provoke l
8d40: 69 6e 65 61 72 20 73 63 61 6e 73 2e 0a 23 0a 64  inear scans..#.d
8d50: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
8d60: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37  o_test e_fkey-27
8d70: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
8d80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8d90: 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20  E artist(.      
8da0: 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45  artistid    INTE
8db0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
8dc0: 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61   .      artistna
8dd0: 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a  me  TEXT.    );.
8de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8df0: 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72   track(.      tr
8e00: 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45  ackid     INTEGE
8e10: 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61  R,.      trackna
8e20: 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20  me   TEXT, .    
8e30: 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e    trackartist IN
8e40: 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53  TEGER REFERENCES
8e50: 20 61 72 74 69 73 74 0a 20 20 20 20 29 3b 0a 20   artist.    );. 
8e60: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
8e70: 74 72 61 63 6b 69 6e 64 65 78 20 4f 4e 20 74 72  trackindex ON tr
8e80: 61 63 6b 28 74 72 61 63 6b 61 72 74 69 73 74 29  ack(trackartist)
8e90: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
8ea0: 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 32 20 7b  st e_fkey-27.2 {
8eb0: 0a 20 20 65 71 70 20 7b 20 49 4e 53 45 52 54 20  .  eqp { INSERT 
8ec0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
8ed0: 45 53 28 3f 2c 20 3f 29 20 7d 0a 7d 20 7b 7d 0a  ES(?, ?) }.} {}.
8ee0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8ef0: 37 2e 33 20 7b 0a 20 20 65 71 70 20 7b 20 55 50  7.3 {.  eqp { UP
8f00: 44 41 54 45 20 61 72 74 69 73 74 20 53 45 54 20  DATE artist SET 
8f10: 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20 61 72  artistid = ?, ar
8f20: 74 69 73 74 6e 61 6d 65 20 3d 20 3f 20 7d 0a 7d  tistname = ? }.}
8f30: 20 5b 6c 69 73 74 20 5c 0a 20 20 30 20 30 20 7b   [list \.  0 0 {
8f40: 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 5c 0a  TABLE artist} \.
8f50: 20 20 30 20 30 20 7b 54 41 42 4c 45 20 74 72 61    0 0 {TABLE tra
8f60: 63 6b 20 57 49 54 48 20 49 4e 44 45 58 20 74 72  ck WITH INDEX tr
8f70: 61 63 6b 69 6e 64 65 78 7d 20 5c 0a 20 20 30 20  ackindex} \.  0 
8f80: 30 20 7b 54 41 42 4c 45 20 74 72 61 63 6b 20 57  0 {TABLE track W
8f90: 49 54 48 20 49 4e 44 45 58 20 74 72 61 63 6b 69  ITH INDEX tracki
8fa0: 6e 64 65 78 7d 0a 5d 0a 64 6f 5f 74 65 73 74 20  ndex}.].do_test 
8fb0: 65 5f 66 6b 65 79 2d 32 37 2e 34 20 7b 0a 20 20  e_fkey-27.4 {.  
8fc0: 65 71 70 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  eqp { DELETE FRO
8fd0: 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 5b 6c 69  M artist }.} [li
8fe0: 73 74 20 5c 0a 20 20 30 20 30 20 7b 54 41 42 4c  st \.  0 0 {TABL
8ff0: 45 20 61 72 74 69 73 74 7d 20 5c 0a 20 20 30 20  E artist} \.  0 
9000: 30 20 7b 54 41 42 4c 45 20 74 72 61 63 6b 20 57  0 {TABLE track W
9010: 49 54 48 20 49 4e 44 45 58 20 74 72 61 63 6b 69  ITH INDEX tracki
9020: 6e 64 65 78 7d 0a 5d 0a 0a 0a 23 23 23 23 23 23  ndex}.]...######
9030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9070: 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f  #####.### SECTIO
9080: 4e 20 34 2e 31 3a 20 43 6f 6d 70 6f 73 69 74 65  N 4.1: Composite
9090: 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e   Foreign Key Con
90a0: 73 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23  straints.#######
90b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
90c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
90d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
90e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
90f0: 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 70 61  .# Check that pa
9150: 72 65 6e 74 20 61 6e 64 20 63 68 69 6c 64 20 6b  rent and child k
9160: 65 79 73 20 6d 75 73 74 20 68 61 76 65 20 74 68  eys must have th
9170: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
9180: 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45 56   columns..#.# EV
9190: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 30  IDENCE-OF: R-410
91a0: 36 32 2d 33 34 34 33 31 20 50 61 72 65 6e 74 20  62-34431 Parent 
91b0: 61 6e 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d  and child keys m
91c0: 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
91d0: 65 0a 23 20 63 61 72 64 69 6e 61 6c 69 74 79 2e  e.# cardinality.
91e0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .#.foreach {tn s
91f0: 71 6c 20 65 72 72 7d 20 7b 0a 20 20 31 20 22 43  ql err} {.  1 "C
9200: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a  REATE TABLE c(jj
9210: 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c   REFERENCES p(x,
9220: 20 79 29 29 22 20 0a 20 20 20 20 7b 66 6f 72 65   y))" .    {fore
9230: 69 67 6e 20 6b 65 79 20 6f 6e 20 6a 6a 20 73 68  ign key on jj sh
9240: 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
9250: 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
9260: 66 20 74 61 62 6c 65 20 70 7d 0a 0a 20 20 32 20  f table p}..  2 
9270: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  "CREATE TABLE c(
9280: 6a 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  jj REFERENCES p(
9290: 29 29 22 20 7b 6e 65 61 72 20 22 29 22 3a 20 73  ))" {near ")": s
92a0: 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20  yntax error}..  
92b0: 33 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  3 "CREATE TABLE 
92c0: 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c(jj, FOREIGN KE
92d0: 59 28 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53  Y(jj) REFERENCES
92e0: 20 70 28 78 2c 20 79 29 29 22 20 0a 20 20 20 20   p(x, y))" .    
92f0: 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  {number of colum
9300: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
9310: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
9320: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9330: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
9340: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a  ferenced table}.
9350: 0a 20 20 34 20 22 43 52 45 41 54 45 20 54 41 42  .  4 "CREATE TAB
9360: 4c 45 20 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e  LE c(jj, FOREIGN
9370: 20 4b 45 59 28 6a 6a 29 20 52 45 46 45 52 45 4e   KEY(jj) REFEREN
9380: 43 45 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b  CES p())" .    {
9390: 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78  near ")": syntax
93a0: 20 65 72 72 6f 72 7d 0a 0a 20 20 35 20 22 43 52   error}..  5 "CR
93b0: 45 41 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c  EATE TABLE c(ii,
93c0: 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59   jj, FOREIGN KEY
93d0: 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e  (jj, ii) REFEREN
93e0: 43 45 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b  CES p())" .    {
93f0: 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78  near ")": syntax
9400: 20 65 72 72 6f 72 7d 0a 0a 20 20 36 20 22 43 52   error}..  6 "CR
9410: 45 41 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c  EATE TABLE c(ii,
9420: 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59   jj, FOREIGN KEY
9430: 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e  (jj, ii) REFEREN
9440: 43 45 53 20 70 28 78 29 29 22 20 0a 20 20 20 20  CES p(x))" .    
9450: 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  {number of colum
9460: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
9470: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
9480: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9490: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
94a0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a  ferenced table}.
94b0: 0a 20 20 37 20 22 43 52 45 41 54 45 20 54 41 42  .  7 "CREATE TAB
94c0: 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46 4f 52  LE c(ii, jj, FOR
94d0: 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69 69 29  EIGN KEY(jj, ii)
94e0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c   REFERENCES p(x,
94f0: 79 2c 7a 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d  y,z))" .    {num
9500: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9510: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
9520: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
9530: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9540: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
9550: 6e 63 65 64 20 74 61 62 6c 65 7d 0a 7d 20 7b 0a  nced table}.} {.
9560: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
9570: 73 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  s.  do_test e_fk
9580: 65 79 2d 32 38 2e 24 74 6e 20 5b 6c 69 73 74 20  ey-28.$tn [list 
9590: 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 20 5b  catchsql $sql] [
95a0: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a 64  list 1 $err].}.d
95b0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38  o_test e_fkey-28
95c0: 2e 38 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .8 {.  drop_all_
95d0: 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
95e0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
95f0: 42 4c 45 20 70 28 78 20 50 52 49 4d 41 52 59 20  BLE p(x PRIMARY 
9600: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
9610: 20 54 41 42 4c 45 20 63 28 61 2c 20 62 2c 20 46   TABLE c(a, b, F
9620: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
9630: 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20  REFERENCES p);. 
9640: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44   }.  catchsql {D
9650: 45 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20  ELETE FROM p}.} 
9660: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
9670: 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65  mismatch}}.do_te
9680: 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 39 20 7b  st e_fkey-28.9 {
9690: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
96a0: 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
96b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
96c0: 70 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20  p(x, y, PRIMARY 
96d0: 4b 45 59 28 78 2c 79 29 29 3b 0a 20 20 20 20 43  KEY(x,y));.    C
96e0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 61 20  REATE TABLE c(a 
96f0: 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20  REFERENCES p);. 
9700: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44   }.  catchsql {D
9710: 45 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20  ELETE FROM p}.} 
9720: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
9730: 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 0a 23 2d 2d  mismatch}}...#--
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9780: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
9790: 43 45 2d 4f 46 3a 20 52 2d 32 34 36 37 36 2d 30  CE-OF: R-24676-0
97a0: 39 38 35 39 0a 23 0a 23 20 54 65 73 74 20 74 68  9859.#.# Test th
97b0: 65 20 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61  e example schema
97c0: 20 69 6e 20 74 68 65 20 22 43 6f 6d 70 6f 73 69   in the "Composi
97d0: 74 65 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43  te Foreign Key C
97e0: 6f 6e 73 74 72 61 69 6e 74 73 22 20 0a 23 20 73  onstraints" .# s
97f0: 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ection..#.do_tes
9800: 74 20 65 5f 66 6b 65 79 2d 32 39 2e 31 20 7b 0a  t e_fkey-29.1 {.
9810: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 6c 62  CREATE TABLE alb
9830: 75 6d 28 0a 20 20 20 20 20 20 61 6c 62 75 6d 61  um(.      albuma
9840: 72 74 69 73 74 20 54 45 58 54 2c 0a 20 20 20 20  rtist TEXT,.    
9850: 20 20 61 6c 62 75 6d 6e 61 6d 65 20 54 45 58 54    albumname TEXT
9860: 2c 0a 20 20 20 20 20 20 61 6c 62 75 6d 63 6f 76  ,.      albumcov
9870: 65 72 20 42 49 4e 41 52 59 2c 0a 20 20 20 20 20  er BINARY,.     
9880: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 6c 62   PRIMARY KEY(alb
9890: 75 6d 61 72 74 69 73 74 2c 20 61 6c 62 75 6d 6e  umartist, albumn
98a0: 61 6d 65 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ame).    );.    
98b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 6f 6e  CREATE TABLE son
98c0: 67 28 0a 20 20 20 20 20 20 73 6f 6e 67 69 64 20  g(.      songid 
98d0: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 73  INTEGER,.      s
98e0: 6f 6e 67 61 72 74 69 73 74 20 54 45 58 54 2c 0a  ongartist TEXT,.
98f0: 20 20 20 20 20 20 73 6f 6e 67 61 6c 62 75 6d 20        songalbum 
9900: 54 45 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67  TEXT,.      song
9910: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20  name TEXT,.     
9920: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 73 6f 6e   FOREIGN KEY(son
9930: 67 61 72 74 69 73 74 2c 20 73 6f 6e 67 61 6c 62  gartist, songalb
9940: 75 6d 29 20 52 45 46 45 52 45 4e 43 45 53 20 61  um) REFERENCES a
9950: 6c 62 75 6d 28 61 6c 62 75 6d 61 72 74 69 73 74  lbum(albumartist
9960: 2c 61 6c 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20  ,albumname).    
9970: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  );.  }.} {}..do_
9980: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 39 2e 32  test e_fkey-29.2
9990: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
99a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
99b0: 6c 62 75 6d 20 56 41 4c 55 45 53 28 27 45 6c 76  lbum VALUES('Elv
99c0: 69 73 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c  is Presley', 'El
99d0: 76 69 73 27 27 20 43 68 72 69 73 74 6d 61 73 20  vis'' Christmas 
99e0: 41 6c 62 75 6d 27 2c 20 4e 55 4c 4c 29 3b 0a 20  Album', NULL);. 
99f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73     INSERT INTO s
9a00: 6f 6e 67 20 56 41 4c 55 45 53 28 0a 20 20 20 20  ong VALUES(.    
9a10: 20 20 31 2c 20 27 45 6c 76 69 73 20 50 72 65 73    1, 'Elvis Pres
9a20: 6c 65 79 27 2c 20 27 45 6c 76 69 73 27 27 20 43  ley', 'Elvis'' C
9a30: 68 72 69 73 74 6d 61 73 20 41 6c 62 75 6d 27 2c  hristmas Album',
9a40: 20 27 48 65 72 65 20 43 6f 6d 65 73 20 53 61 6e   'Here Comes San
9a50: 74 61 20 43 6c 61 75 73 65 27 0a 20 20 20 20 29  ta Clause'.    )
9a60: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9a70: 73 74 20 65 5f 66 6b 65 79 2d 32 39 2e 33 20 7b  st e_fkey-29.3 {
9a80: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
9a90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f    INSERT INTO so
9aa0: 6e 67 20 56 41 4c 55 45 53 28 32 2c 20 27 45 6c  ng VALUES(2, 'El
9ab0: 76 69 73 20 50 72 65 73 6c 65 79 27 2c 20 27 45  vis Presley', 'E
9ac0: 6c 76 69 73 20 49 73 20 42 61 63 6b 21 27 2c 20  lvis Is Back!', 
9ad0: 27 46 65 76 65 72 27 29 3b 0a 20 20 7d 0a 7d 20  'Fever');.  }.} 
9ae0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
9af0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
9b00: 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}}...#---------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9b60: 52 2d 33 33 36 32 36 2d 34 38 34 31 38 20 49 6e  R-33626-48418 In
9b70: 20 53 51 4c 69 74 65 2c 20 69 66 20 61 6e 79 20   SQLite, if any 
9b80: 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
9b90: 20 63 6f 6c 75 6d 6e 73 0a 23 20 28 69 6e 20 74   columns.# (in t
9ba0: 68 69 73 20 63 61 73 65 20 73 6f 6e 67 61 72 74  his case songart
9bb0: 69 73 74 20 61 6e 64 20 73 6f 6e 67 61 6c 62 75  ist and songalbu
9bc0: 6d 29 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 65  m) are NULL, the
9bd0: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 23 20  n there is no.# 
9be0: 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
9bf0: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
9c00: 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e  row in the paren
9c10: 74 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65  t table..#.do_te
9c20: 73 74 20 65 5f 66 6b 65 79 2d 33 30 2e 31 20 7b  st e_fkey-30.1 {
9c30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
9c40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e   INSERT INTO son
9c50: 67 20 56 41 4c 55 45 53 28 32 2c 20 27 45 6c 76  g VALUES(2, 'Elv
9c60: 69 73 20 50 72 65 73 6c 65 79 27 2c 20 4e 55 4c  is Presley', NUL
9c70: 4c 2c 20 27 46 65 76 65 72 27 29 3b 0a 20 20 20  L, 'Fever');.   
9c80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e   INSERT INTO son
9c90: 67 20 56 41 4c 55 45 53 28 33 2c 20 4e 55 4c 4c  g VALUES(3, NULL
9ca0: 2c 20 27 45 6c 76 69 73 20 49 73 20 42 61 63 6b  , 'Elvis Is Back
9cb0: 27 2c 20 27 53 6f 6c 64 69 65 72 20 42 6f 79 27  ', 'Soldier Boy'
9cc0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23  );.  }.} {}..###
9cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d10: 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43  ########.### SEC
9d20: 54 49 4f 4e 20 34 2e 32 3a 20 44 65 66 65 72 72  TION 4.2: Deferr
9d30: 65 64 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43  ed Foreign Key C
9d40: 6f 6e 73 74 72 61 69 6e 74 73 0a 23 23 23 23 23  onstraints.#####
9d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9d90: 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ######..#-------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9de0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
9df0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 76 69  f a statement vi
9e00: 6f 6c 61 74 65 73 20 61 6e 20 69 6d 6d 65 64 69  olates an immedi
9e10: 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  ate FK constrain
9e20: 74 2c 20 61 6e 64 20 74 68 65 0a 23 20 64 61 74  t, and the.# dat
9e30: 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 73  abase does not s
9e40: 61 74 69 73 66 79 20 74 68 65 20 46 4b 20 63 6f  atisfy the FK co
9e50: 6e 73 74 72 61 69 6e 74 20 6f 6e 63 65 20 61 6c  nstraint once al
9e60: 6c 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65  l effects of the
9e70: 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  .# statement hav
9e80: 65 20 62 65 65 6e 20 61 70 70 6c 69 65 64 2c 20  e been applied, 
9e90: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  an error is repo
9ea0: 72 74 65 64 20 61 6e 64 20 74 68 65 20 65 66 66  rted and the eff
9eb0: 65 63 74 73 20 6f 66 0a 23 20 74 68 65 20 73 74  ects of.# the st
9ec0: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 65 64 20 62  atement rolled b
9ed0: 61 63 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ack..#.# EVIDENC
9ee0: 45 2d 4f 46 3a 20 52 2d 30 39 33 32 33 2d 33 30  E-OF: R-09323-30
9ef0: 34 37 30 20 49 66 20 61 20 73 74 61 74 65 6d 65  470 If a stateme
9f00: 6e 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  nt modifies the 
9f10: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
9f20: 23 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  # database so th
9f30: 61 74 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  at an immediate 
9f40: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
9f50: 74 72 61 69 6e 74 20 69 73 20 69 6e 20 76 69 6f  traint is in vio
9f60: 6c 61 74 69 6f 6e 0a 23 20 61 74 20 74 68 65 20  lation.# at the 
9f70: 63 6f 6e 63 6c 75 73 69 6f 6e 20 74 68 65 20 73  conclusion the s
9f80: 74 61 74 65 6d 65 6e 74 2c 20 61 6e 20 65 78 63  tatement, an exc
9f90: 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e  eption is thrown
9fa0: 20 61 6e 64 20 74 68 65 0a 23 20 65 66 66 65 63   and the.# effec
9fb0: 74 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ts of the statem
9fc0: 65 6e 74 20 61 72 65 20 72 65 76 65 72 74 65 64  ent are reverted
9fd0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
9fe0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
9ff0: 65 79 2d 33 31 2e 31 20 7b 0a 20 20 65 78 65 63  ey-31.1 {.  exec
a000: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a010: 20 54 41 42 4c 45 20 6b 69 6e 67 28 61 2c 20 62   TABLE king(a, b
a020: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 29  , PRIMARY KEY(a)
a030: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
a040: 42 4c 45 20 70 72 69 6e 63 65 28 63 20 52 45 46  BLE prince(c REF
a050: 45 52 45 4e 43 45 53 20 6b 69 6e 67 2c 20 64 29  ERENCES king, d)
a060: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
a070: 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 32 20  est e_fkey-31.2 
a080: 7b 0a 20 20 23 20 45 78 65 63 75 74 65 20 61 20  {.  # Execute a 
a090: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 76  statement that v
a0a0: 69 6f 6c 61 74 65 73 20 74 68 65 20 69 6d 6d 65  iolates the imme
a0b0: 64 69 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61  diate FK constra
a0c0: 69 6e 74 2e 0a 20 20 63 61 74 63 68 73 71 6c 20  int..  catchsql 
a0d0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72  { INSERT INTO pr
a0e0: 69 6e 63 65 20 56 41 4c 55 45 53 28 31 2c 20 32  ince VALUES(1, 2
a0f0: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
a100: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a110: 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65   failed}}..do_te
a120: 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 33 20 7b  st e_fkey-31.3 {
a130: 0a 20 20 23 20 54 68 69 73 20 74 69 6d 65 2c 20  .  # This time, 
a140: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 74 6f  use a trigger to
a150: 20 66 69 78 20 74 68 65 20 63 6f 6e 73 74 72 61   fix the constra
a160: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 62 65  int violation be
a170: 66 6f 72 65 20 74 68 65 0a 20 20 23 20 73 74 61  fore the.  # sta
a180: 74 65 6d 65 6e 74 20 68 61 73 20 66 69 6e 69 73  tement has finis
a190: 68 65 64 20 65 78 65 63 75 74 69 6e 67 2e 20 54  hed executing. T
a1a0: 68 65 6e 20 65 78 65 63 75 74 65 20 74 68 65 20  hen execute the 
a1b0: 73 61 6d 65 20 73 74 61 74 65 6d 65 6e 74 20 61  same statement a
a1c0: 73 0a 20 20 23 20 69 6e 20 74 68 65 20 70 72 65  s.  # in the pre
a1d0: 76 69 6f 75 73 20 74 65 73 74 20 63 61 73 65 2e  vious test case.
a1e0: 20 54 68 69 73 20 74 69 6d 65 2c 20 6e 6f 20 65   This time, no e
a1f0: 72 72 6f 72 2e 0a 20 20 65 78 65 63 73 71 6c 20  rror..  execsql 
a200: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  {.    CREATE TRI
a210: 47 47 45 52 20 6b 74 20 41 46 54 45 52 20 49 4e  GGER kt AFTER IN
a220: 53 45 52 54 20 4f 4e 20 70 72 69 6e 63 65 20 57  SERT ON prince W
a230: 48 45 4e 0a 20 20 20 20 20 20 4e 4f 54 20 45 58  HEN.      NOT EX
a240: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
a250: 52 4f 4d 20 6b 69 6e 67 20 57 48 45 52 45 20 61  ROM king WHERE a
a260: 20 3d 20 6e 65 77 2e 63 29 0a 20 20 20 20 42 45   = new.c).    BE
a270: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
a280: 20 49 4e 54 4f 20 6b 69 6e 67 20 56 41 4c 55 45   INTO king VALUE
a290: 53 28 6e 65 77 2e 63 2c 20 4e 55 4c 4c 29 3b 0a  S(new.c, NULL);.
a2a0: 20 20 20 20 45 4e 44 0a 20 20 7d 0a 20 20 65 78      END.  }.  ex
a2b0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
a2c0: 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45  NTO prince VALUE
a2d0: 53 28 31 2c 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a  S(1, 2) }.} {}..
a2e0: 23 20 54 65 73 74 20 74 68 61 74 20 6f 70 65 72  # Test that oper
a2f0: 61 74 69 6e 67 20 69 6e 73 69 64 65 20 61 20 74  ating inside a t
a300: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 6b 65 73  ransaction makes
a310: 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74   no difference t
a320: 6f 20 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63  o .# immediate c
a330: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
a340: 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 2e 0a 64 6f  ion handling..do
a350: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e  _test e_fkey-31.
a360: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
a370: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
a380: 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63  NSERT INTO princ
a390: 65 20 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a  e VALUES(2, 3);.
a3a0: 20 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52      DROP TRIGGER
a3b0: 20 6b 74 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68   kt;.  }.  catch
a3c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a3d0: 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28  O prince VALUES(
a3e0: 33 2c 20 34 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  3, 4) }.} {1 {fo
a3f0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a400: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
a410: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e  _test e_fkey-31.
a420: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
a430: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
a440: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 69  SELECT * FROM ki
a450: 6e 67 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 7d 20  ng;.  }.} {1 {} 
a460: 32 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  2 {}}..#--------
a470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4b0: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66  -.# Test that if
a4c0: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
a4d0: 74 72 61 69 6e 74 20 69 73 20 76 69 6f 6c 61 74  traint is violat
a4e0: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  ed within a tran
a4f0: 73 61 63 74 69 6f 6e 2c 0a 23 20 6e 6f 74 68 69  saction,.# nothi
a500: 6e 67 20 68 61 70 70 65 6e 73 20 69 6d 6d 65 64  ng happens immed
a510: 69 61 74 65 6c 79 20 61 6e 64 20 74 68 65 20 64  iately and the d
a520: 61 74 61 62 61 73 65 20 69 73 20 61 6c 6c 6f 77  atabase is allow
a530: 65 64 20 74 6f 20 70 65 72 73 69 73 74 0a 23 20  ed to persist.# 
a540: 69 6e 20 61 20 73 74 61 74 65 20 74 68 61 74 20  in a state that 
a550: 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
a560: 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61 69   the FK constrai
a570: 6e 74 2e 20 48 6f 77 65 76 65 72 20 61 74 74 65  nt. However atte
a580: 6d 70 74 73 0a 23 20 74 6f 20 43 4f 4d 4d 49 54  mpts.# to COMMIT
a590: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a5a0: 20 66 61 69 6c 20 75 6e 74 69 6c 20 74 68 65 20   fail until the 
a5b0: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  FK constraint is
a5c0: 20 73 61 74 69 73 66 69 65 64 2e 0a 23 0a 23 20   satisfied..#.# 
a5d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
a5e0: 39 31 37 38 2d 32 31 33 35 38 20 42 79 20 63 6f  9178-21358 By co
a5f0: 6e 74 72 61 73 74 2c 20 69 66 20 61 20 73 74 61  ntrast, if a sta
a600: 74 65 6d 65 6e 74 20 6d 6f 64 69 66 69 65 73 20  tement modifies 
a610: 74 68 65 0a 23 20 63 6f 6e 74 65 6e 74 73 20 6f  the.# contents o
a620: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
a630: 75 63 68 20 74 68 61 74 20 61 20 64 65 66 65 72  uch that a defer
a640: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
a650: 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20 69 73 20  constraint.# is 
a660: 76 69 6f 6c 61 74 65 64 2c 20 74 68 65 20 76 69  violated, the vi
a670: 6f 6c 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72  olation is not r
a680: 65 70 6f 72 74 65 64 20 69 6d 6d 65 64 69 61 74  eported immediat
a690: 65 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ely..#.# EVIDENC
a6a0: 45 2d 4f 46 3a 20 52 2d 33 39 36 39 32 2d 31 32  E-OF: R-39692-12
a6b0: 34 38 38 20 44 65 66 65 72 72 65 64 20 66 6f 72  488 Deferred for
a6c0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
a6d0: 69 6e 74 73 20 61 72 65 20 6e 6f 74 0a 23 20 63  ints are not.# c
a6e0: 68 65 63 6b 65 64 20 75 6e 74 69 6c 20 74 68 65  hecked until the
a6f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 72 69   transaction tri
a700: 65 73 20 74 6f 20 43 4f 4d 4d 49 54 2e 0a 23 0a  es to COMMIT..#.
a710: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
a720: 2d 35 35 31 34 37 2d 34 37 36 36 34 20 46 6f 72  -55147-47664 For
a730: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
a740: 75 73 65 72 20 68 61 73 20 61 6e 20 6f 70 65 6e  user has an open
a750: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  .# transaction, 
a760: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
a770: 61 6c 6c 6f 77 65 64 20 74 6f 20 65 78 69 73 74  allowed to exist
a780: 20 69 6e 20 61 20 73 74 61 74 65 20 74 68 61 74   in a state that
a790: 20 76 69 6f 6c 61 74 65 73 0a 23 20 61 6e 79 20   violates.# any 
a7a0: 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72  number of deferr
a7b0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
a7c0: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20  onstraints..#.# 
a7d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
a7e0: 39 36 30 34 2d 33 30 33 39 35 20 48 6f 77 65 76  9604-30395 Howev
a7f0: 65 72 2c 20 43 4f 4d 4d 49 54 20 77 69 6c 6c 20  er, COMMIT will 
a800: 66 61 69 6c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  fail as long as.
a810: 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  # foreign key co
a820: 6e 73 74 72 61 69 6e 74 73 20 72 65 6d 61 69 6e  nstraints remain
a830: 20 69 6e 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23   in violation..#
a840: 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79  .proc test_efkey
a850: 5f 33 34 20 7b 74 6e 20 69 73 45 72 72 6f 72 20  _34 {tn isError 
a860: 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  sql} {.  do_test
a870: 20 65 5f 66 6b 65 79 2d 33 32 2e 24 74 6e 20 22   e_fkey-32.$tn "
a880: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24  .    catchsql {$
a890: 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78  sql}.  " [lindex
a8a0: 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72   {{0 {}} {1 {for
a8b0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
a8c0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69  int failed}}} $i
a8d0: 73 45 72 72 6f 72 5d 0a 7d 0a 64 72 6f 70 5f 61  sError].}.drop_a
a8e0: 6c 6c 5f 74 61 62 6c 65 73 0a 0a 74 65 73 74 5f  ll_tables..test_
a8f0: 65 66 6b 65 79 5f 33 34 20 20 31 20 30 20 7b 0a  efkey_34  1 0 {.
a900: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c    CREATE TABLE l
a910: 6c 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 29  l(k PRIMARY KEY)
a920: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
a930: 20 6b 6b 28 63 20 52 45 46 45 52 45 4e 43 45 53   kk(c REFERENCES
a940: 20 6c 6c 20 44 45 46 45 52 52 41 42 4c 45 20 49   ll DEFERRABLE I
a950: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
a960: 44 29 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79  D);.}.test_efkey
a970: 5f 33 34 20 20 32 20 30 20 22 42 45 47 49 4e 22  _34  2 0 "BEGIN"
a980: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
a990: 33 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e  3 0   "INSERT IN
a9a0: 54 4f 20 6b 6b 20 56 41 4c 55 45 53 28 35 29 22  TO kk VALUES(5)"
a9b0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
a9c0: 34 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e  4 0   "INSERT IN
a9d0: 54 4f 20 6b 6b 20 56 41 4c 55 45 53 28 31 30 29  TO kk VALUES(10)
a9e0: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  ".test_efkey_34 
a9f0: 20 35 20 31 20 22 43 4f 4d 4d 49 54 22 0a 74 65   5 1 "COMMIT".te
aa00: 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 36 20 30  st_efkey_34  6 0
aa10: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
aa20: 6c 6c 20 56 41 4c 55 45 53 28 31 30 29 22 0a 74  ll VALUES(10)".t
aa30: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 37 20  est_efkey_34  7 
aa40: 31 20 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f  1 "COMMIT".test_
aa50: 65 66 6b 65 79 5f 33 34 20 20 38 20 30 20 20 20  efkey_34  8 0   
aa60: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20  "INSERT INTO ll 
aa70: 56 41 4c 55 45 53 28 35 29 22 0a 74 65 73 74 5f  VALUES(5)".test_
aa80: 65 66 6b 65 79 5f 33 34 20 20 39 20 30 20 22 43  efkey_34  9 0 "C
aa90: 4f 4d 4d 49 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  OMMIT"..#-------
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aae0: 2d 2d 0a 23 20 57 68 65 6e 20 6e 6f 74 20 72 75  --.# When not ru
aaf0: 6e 6e 69 6e 67 20 69 6e 73 69 64 65 20 61 20 74  nning inside a t
ab00: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 64 65  ransaction, a de
ab10: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
ab20: 74 20 69 73 20 73 69 6d 69 6c 61 72 0a 23 20 74  t is similar.# t
ab30: 6f 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 63  o an immediate c
ab40: 6f 6e 73 74 72 61 69 6e 74 20 28 76 69 6f 6c 61  onstraint (viola
ab50: 74 69 6f 6e 73 20 61 72 65 20 72 65 70 6f 72 74  tions are report
ab60: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  ed immediately).
ab70: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
ab80: 3a 20 52 2d 35 36 38 34 34 2d 36 31 37 30 35 20  : R-56844-61705 
ab90: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
aba0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20  tatement is not 
abb0: 69 6e 73 69 64 65 20 61 6e 0a 23 20 65 78 70 6c  inside an.# expl
abc0: 69 63 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  icit transaction
abd0: 20 28 61 20 42 45 47 49 4e 2f 43 4f 4d 4d 49 54   (a BEGIN/COMMIT
abe0: 2f 52 4f 4c 4c 42 41 43 4b 20 62 6c 6f 63 6b 29  /ROLLBACK block)
abf0: 2c 20 74 68 65 6e 20 61 6e 20 69 6d 70 6c 69 63  , then an implic
ac00: 69 74 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  it.# transaction
ac10: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 61 73   is committed as
ac20: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 73 74 61   soon as the sta
ac30: 74 65 6d 65 6e 74 20 68 61 73 20 66 69 6e 69 73  tement has finis
ac40: 68 65 64 0a 23 20 65 78 65 63 75 74 69 6e 67 2e  hed.# executing.
ac50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 64 65   In this case de
ac60: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
ac70: 74 73 20 62 65 68 61 76 65 20 74 68 65 20 73 61  ts behave the sa
ac80: 6d 65 20 61 73 0a 23 20 69 6d 6d 65 64 69 61 74  me as.# immediat
ac90: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23  e constraints..#
aca0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
acb0: 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79  .proc test_efkey
acc0: 5f 33 35 20 7b 74 6e 20 69 73 45 72 72 6f 72 20  _35 {tn isError 
acd0: 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  sql} {.  do_test
ace0: 20 65 5f 66 6b 65 79 2d 33 33 2e 24 74 6e 20 22   e_fkey-33.$tn "
acf0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24  .    catchsql {$
ad00: 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78  sql}.  " [lindex
ad10: 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72   {{0 {}} {1 {for
ad20: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
ad30: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69  int failed}}} $i
ad40: 73 45 72 72 6f 72 5d 0a 7d 0a 64 6f 5f 74 65 73  sError].}.do_tes
ad50: 74 20 65 5f 66 6b 65 79 2d 33 33 2e 31 20 7b 0a  t e_fkey-33.1 {.
ad60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
ad70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
ad80: 65 6e 74 28 78 2c 20 79 29 3b 0a 20 20 20 20 43  ent(x, y);.    C
ad90: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
ada0: 45 58 20 70 69 20 4f 4e 20 70 61 72 65 6e 74 28  EX pi ON parent(
adb0: 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54  x, y);.    CREAT
adc0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c  E TABLE child(a,
add0: 20 62 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   b,.      FOREIG
ade0: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
adf0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c  RENCES parent(x,
ae00: 20 79 29 20 44 45 46 45 52 52 41 42 4c 45 20 49   y) DEFERRABLE I
ae10: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ae20: 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  D.    );.  }.} {
ae30: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20  }.test_efkey_35 
ae40: 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  2 1 "INSERT INTO
ae50: 20 63 68 69 6c 64 20 20 56 41 4c 55 45 53 28 27   child  VALUES('
ae60: 78 27 2c 20 27 79 27 29 22 0a 74 65 73 74 5f 65  x', 'y')".test_e
ae70: 66 6b 65 79 5f 33 35 20 33 20 30 20 22 49 4e 53  fkey_35 3 0 "INS
ae80: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
ae90: 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29  VALUES('x', 'y')
aea0: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20  ".test_efkey_35 
aeb0: 34 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  4 0 "INSERT INTO
aec0: 20 63 68 69 6c 64 20 20 56 41 4c 55 45 53 28 27   child  VALUES('
aed0: 78 27 2c 20 27 79 27 29 22 0a 0a 0a 23 2d 2d 2d  x', 'y')"...#---
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
af30: 45 2d 4f 46 3a 20 52 2d 31 32 37 38 32 2d 36 31  E-OF: R-12782-61
af40: 38 34 31 0a 23 0a 23 20 54 65 73 74 20 74 68 61  841.#.# Test tha
af50: 74 20 61 6e 20 46 4b 20 63 6f 6e 73 74 72 61 69  t an FK constrai
af60: 6e 74 20 69 73 20 6d 61 64 65 20 64 65 66 65 72  nt is made defer
af70: 72 65 64 20 62 79 20 61 64 64 69 6e 67 20 74 68  red by adding th
af80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 6f  e following.# to
af90: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 3a   the definition:
afa0: 0a 23 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c  .#.#   DEFERRABL
afb0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
afc0: 52 52 45 44 0a 23 0a 23 20 45 56 49 44 45 4e 43  RRED.#.# EVIDENC
afd0: 45 2d 4f 46 3a 20 52 2d 30 39 30 30 35 2d 32 38  E-OF: R-09005-28
afe0: 37 39 31 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73  791.#.# Also tes
aff0: 74 20 74 68 61 74 20 61 64 64 69 6e 67 20 61 6e  t that adding an
b000: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
b010: 6e 67 20 74 6f 20 61 20 66 6f 72 65 69 67 6e 20  ng to a foreign 
b020: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a  key definition .
b030: 23 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 6e 73  # makes the cons
b040: 74 72 61 69 6e 74 20 49 4d 4d 45 44 49 41 54 45  traint IMMEDIATE
b050: 3a 0a 23 0a 23 20 20 20 4e 4f 54 20 44 45 46 45  :.#.#   NOT DEFE
b060: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b070: 20 44 45 46 45 52 52 45 44 0a 23 20 20 20 4e 4f   DEFERRED.#   NO
b080: 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  T DEFERRABLE INI
b090: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b0a0: 0a 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41  .#   NOT DEFERRA
b0b0: 42 4c 45 0a 23 20 20 20 44 45 46 45 52 52 41 42  BLE.#   DEFERRAB
b0c0: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  LE INITIALLY IMM
b0d0: 45 44 49 41 54 45 0a 23 20 20 20 44 45 46 45 52  EDIATE.#   DEFER
b0e0: 52 41 42 4c 45 0a 23 0a 23 20 46 6f 72 65 69 67  RABLE.#.# Foreig
b0f0: 6e 20 6b 65 79 73 20 61 72 65 20 49 4d 4d 45 44  n keys are IMMED
b100: 49 41 54 45 20 62 79 20 64 65 66 61 75 6c 74 20  IATE by default 
b110: 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (if there is no 
b120: 44 45 46 45 52 52 41 42 4c 45 20 6f 72 20 4e 4f  DEFERRABLE or NO
b130: 54 0a 23 20 44 45 46 45 52 52 41 42 4c 45 20 63  T.# DEFERRABLE c
b140: 6c 61 75 73 65 29 2e 0a 23 0a 23 20 45 56 49 44  lause)..#.# EVID
b150: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 32 39 30  ENCE-OF: R-35290
b160: 2d 31 36 34 36 30 20 46 6f 72 65 69 67 6e 20 6b  -16460 Foreign k
b170: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ey constraints a
b180: 72 65 20 69 6d 6d 65 64 69 61 74 65 20 62 79 0a  re immediate by.
b190: 23 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  # default..#.# E
b1a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
b1b0: 33 32 33 2d 32 31 39 31 37 20 45 61 63 68 20 66  323-21917 Each f
b1c0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
b1d0: 72 61 69 6e 74 20 69 6e 20 53 51 4c 69 74 65 20  raint in SQLite 
b1e0: 69 73 0a 23 20 63 6c 61 73 73 69 66 69 65 64 20  is.# classified 
b1f0: 61 73 20 65 69 74 68 65 72 20 69 6d 6d 65 64 69  as either immedi
b200: 61 74 65 20 6f 72 20 64 65 66 65 72 72 65 64 2e  ate or deferred.
b210: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
b220: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
b230: 79 2d 33 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-34.1 {.  execs
b240: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
b250: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 2c 20  TABLE parent(x, 
b260: 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  y, z, PRIMARY KE
b270: 59 28 78 2c 79 2c 7a 29 29 3b 0a 20 20 20 20 43  Y(x,y,z));.    C
b280: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61  REATE TABLE c1(a
b290: 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f  , b, c,.      FO
b2a0: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20  REIGN KEY(a, b, 
b2b0: 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  c) REFERENCES pa
b2c0: 72 65 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41  rent NOT DEFERRA
b2d0: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
b2e0: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
b2f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b300: 32 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20  2(a, b, c,.     
b310: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b320: 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53  b, c) REFERENCES
b330: 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45 46 45   parent NOT DEFE
b340: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b350: 20 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 29   IMMEDIATE.    )
b360: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b370: 4c 45 20 63 33 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c3(a, b, c,. 
b380: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b390: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b3a0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20  NCES parent NOT 
b3b0: 44 45 46 45 52 52 41 42 4c 45 0a 20 20 20 20 29  DEFERRABLE.    )
b3c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b3d0: 4c 45 20 63 34 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c4(a, b, c,. 
b3e0: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b3f0: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b400: 4e 43 45 53 20 70 61 72 65 6e 74 20 44 45 46 45  NCES parent DEFE
b410: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b420: 20 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 29   IMMEDIATE.    )
b430: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b440: 4c 45 20 63 35 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c5(a, b, c,. 
b450: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b460: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b470: 4e 43 45 53 20 70 61 72 65 6e 74 20 44 45 46 45  NCES parent DEFE
b480: 52 52 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20  RRABLE.    );.  
b490: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b4a0: 36 28 61 2c 20 62 2c 20 63 2c 20 46 4f 52 45 49  6(a, b, c, FOREI
b4b0: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b4c0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b4d0: 74 29 3b 0a 0a 20 20 20 20 2d 2d 20 54 68 69 73  t);..    -- This
b4e0: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   FK constraint i
b4f0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 65 66 65 72  s the only defer
b500: 72 61 62 6c 65 20 6f 6e 65 2e 0a 20 20 20 20 43  rable one..    C
b510: 52 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 61  REATE TABLE c7(a
b520: 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f  , b, c,.      FO
b530: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20  REIGN KEY(a, b, 
b540: 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  c) REFERENCES pa
b550: 72 65 6e 74 20 44 45 46 45 52 52 41 42 4c 45 20  rent DEFERRABLE 
b560: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
b570: 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 49  ED.    );..    I
b580: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
b590: 74 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  t VALUES('a', 'b
b5a0: 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'c');.    INS
b5b0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
b5c0: 56 41 4c 55 45 53 28 27 64 27 2c 20 27 65 27 2c  VALUES('d', 'e',
b5d0: 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'f');.    INSER
b5e0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b5f0: 4c 55 45 53 28 27 67 27 2c 20 27 68 27 2c 20 27  LUES('g', 'h', '
b600: 69 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  i');.    INSERT 
b610: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b620: 45 53 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27  ES('j', 'k', 'l'
b630: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b640: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b650: 28 27 6d 27 2c 20 27 6e 27 2c 20 27 6f 27 29 3b  ('m', 'n', 'o');
b660: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b670: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
b680: 70 27 2c 20 27 71 27 2c 20 27 72 27 29 3b 0a 20  p', 'q', 'r');. 
b690: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b6a0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 73 27  arent VALUES('s'
b6b0: 2c 20 27 74 27 2c 20 27 75 27 29 3b 0a 0a 20 20  , 't', 'u');..  
b6c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
b6d0: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
b6e0: 2c 20 27 63 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'c');.    INSE
b6f0: 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
b700: 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66 27 29  S('d', 'e', 'f')
b710: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b720: 4f 20 63 33 20 56 41 4c 55 45 53 28 27 67 27 2c  O c3 VALUES('g',
b730: 20 27 68 27 2c 20 27 69 27 29 3b 0a 20 20 20 20   'h', 'i');.    
b740: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 34 20 56  INSERT INTO c4 V
b750: 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27 2c 20  ALUES('j', 'k', 
b760: 27 6c 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'l');.    INSERT
b770: 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28   INTO c5 VALUES(
b780: 27 6d 27 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a  'm', 'n', 'o');.
b790: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b7a0: 63 36 20 56 41 4c 55 45 53 28 27 70 27 2c 20 27  c6 VALUES('p', '
b7b0: 71 27 2c 20 27 72 27 29 3b 0a 20 20 20 20 49 4e  q', 'r');.    IN
b7c0: 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c  SERT INTO c7 VAL
b7d0: 55 45 53 28 27 73 27 2c 20 27 74 27 2c 20 27 75  UES('s', 't', 'u
b7e0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 70 72  ');.  }.} {}..pr
b7f0: 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 32 39  oc test_efkey_29
b800: 20 7b 74 6e 20 73 71 6c 20 69 73 45 72 72 6f 72   {tn sql isError
b810: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
b820: 66 6b 65 79 2d 33 34 2e 24 74 6e 20 22 63 61 74  fkey-34.$tn "cat
b830: 63 68 73 71 6c 20 7b 24 73 71 6c 7d 22 20 5b 0a  chsql {$sql}" [.
b840: 20 20 20 20 6c 69 6e 64 65 78 20 7b 7b 30 20 7b      lindex {{0 {
b850: 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  }} {1 {foreign k
b860: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
b870: 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72  iled}}} $isError
b880: 0a 20 20 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65  .  ].}.test_efke
b890: 79 5f 32 39 20 20 32 20 22 42 45 47 49 4e 22 20  y_29  2 "BEGIN" 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
b8d0: 39 20 20 33 20 22 44 45 4c 45 54 45 20 46 52 4f  9  3 "DELETE FRO
b8e0: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
b8f0: 20 3d 20 27 61 27 22 20 20 20 20 20 20 20 20 31   = 'a'"        1
b900: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
b910: 34 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  4 "DELETE FROM p
b920: 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
b930: 27 64 27 22 20 20 20 20 20 20 20 20 31 0a 74 65  'd'"        1.te
b940: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 35 20 22  st_efkey_29  5 "
b950: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
b960: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 67 27  nt WHERE x = 'g'
b970: 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f  "        1.test_
b980: 65 66 6b 65 79 5f 32 39 20 20 36 20 22 44 45 4c  efkey_29  6 "DEL
b990: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
b9a0: 57 48 45 52 45 20 78 20 3d 20 27 6a 27 22 20 20  WHERE x = 'j'"  
b9b0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
b9c0: 65 79 5f 32 39 20 20 37 20 22 44 45 4c 45 54 45  ey_29  7 "DELETE
b9d0: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
b9e0: 52 45 20 78 20 3d 20 27 6d 27 22 20 20 20 20 20  RE x = 'm'"     
b9f0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
ba00: 32 39 20 20 38 20 22 44 45 4c 45 54 45 20 46 52  29  8 "DELETE FR
ba10: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
ba20: 78 20 3d 20 27 70 27 22 20 20 20 20 20 20 20 20  x = 'p'"        
ba30: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
ba40: 20 39 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   9 "DELETE FROM 
ba50: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
ba60: 20 27 73 27 22 20 20 20 20 20 20 20 20 30 0a 74   's'"        0.t
ba70: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 30 20  est_efkey_29 10 
ba80: 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20  "COMMIT"        
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
bab0: 5f 65 66 6b 65 79 5f 32 39 20 31 31 20 22 52 4f  _efkey_29 11 "RO
bac0: 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20  LLBACK"         
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65         0..test_e
baf0: 66 6b 65 79 5f 32 39 20 20 39 20 22 42 45 47 49  fkey_29  9 "BEGI
bb00: 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N"              
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65       0.test_efke
bb30: 79 5f 32 39 20 31 30 20 22 55 50 44 41 54 45 20  y_29 10 "UPDATE 
bb40: 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27  parent SET z = '
bb50: 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 63 27  z' WHERE z = 'c'
bb60: 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32  " 1.test_efkey_2
bb70: 39 20 31 31 20 22 55 50 44 41 54 45 20 70 61 72  9 11 "UPDATE par
bb80: 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20  ent SET z = 'z' 
bb90: 57 48 45 52 45 20 7a 20 3d 20 27 66 27 22 20 31  WHERE z = 'f'" 1
bba0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
bbb0: 32 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  2 "UPDATE parent
bbc0: 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45   SET z = 'z' WHE
bbd0: 52 45 20 7a 20 3d 20 27 69 27 22 20 31 0a 74 65  RE z = 'i'" 1.te
bbe0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 33 20 22  st_efkey_29 13 "
bbf0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
bc00: 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20  T z = 'z' WHERE 
bc10: 7a 20 3d 20 27 6c 27 22 20 31 0a 74 65 73 74 5f  z = 'l'" 1.test_
bc20: 65 66 6b 65 79 5f 32 39 20 31 34 20 22 55 50 44  efkey_29 14 "UPD
bc30: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
bc40: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bc50: 20 27 6f 27 22 20 31 0a 74 65 73 74 5f 65 66 6b   'o'" 1.test_efk
bc60: 65 79 5f 32 39 20 31 35 20 22 55 50 44 41 54 45  ey_29 15 "UPDATE
bc70: 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20   parent SET z = 
bc80: 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 72  'z' WHERE z = 'r
bc90: 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '" 1.test_efkey_
bca0: 32 39 20 31 36 20 22 55 50 44 41 54 45 20 70 61  29 16 "UPDATE pa
bcb0: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
bcc0: 20 57 48 45 52 45 20 7a 20 3d 20 27 75 27 22 20   WHERE z = 'u'" 
bcd0: 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  0.test_efkey_29 
bce0: 31 37 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20  17 "COMMIT"     
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
bd10: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 38 20  est_efkey_29 18 
bd20: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 20 20 20 30 0a 0a 74 65 73            0..tes
bd50: 74 5f 65 66 6b 65 79 5f 32 39 20 31 37 20 22 42  t_efkey_29 17 "B
bd60: 45 47 49 4e 22 20 20 20 20 20 20 20 20 20 20 20  EGIN"           
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
bd90: 66 6b 65 79 5f 32 39 20 31 38 20 22 49 4e 53 45  fkey_29 18 "INSE
bda0: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
bdb0: 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  S(1, 2, 3)"     
bdc0: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
bdd0: 79 5f 32 39 20 31 39 20 22 49 4e 53 45 52 54 20  y_29 19 "INSERT 
bde0: 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31  INTO c2 VALUES(1
bdf0: 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20  , 2, 3)"        
be00: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
be10: 39 20 32 30 20 22 49 4e 53 45 52 54 20 49 4e 54  9 20 "INSERT INT
be20: 4f 20 63 33 20 56 41 4c 55 45 53 28 31 2c 20 32  O c3 VALUES(1, 2
be30: 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31  , 3)"          1
be40: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
be50: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  1 "INSERT INTO c
be60: 34 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  4 VALUES(1, 2, 3
be70: 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65  )"          1.te
be80: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 32 20 22  st_efkey_29 22 "
be90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56  INSERT INTO c5 V
bea0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
beb0: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
bec0: 65 66 6b 65 79 5f 32 39 20 32 32 20 22 49 4e 53  efkey_29 22 "INS
bed0: 45 52 54 20 49 4e 54 4f 20 63 36 20 56 41 4c 55  ERT INTO c6 VALU
bee0: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
bef0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bf00: 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54  ey_29 22 "INSERT
bf10: 20 49 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28   INTO c7 VALUES(
bf20: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
bf30: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
bf40: 32 39 20 32 33 20 22 43 4f 4d 4d 49 54 22 20 20  29 23 "COMMIT"  
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bf80: 32 34 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  24 "INSERT INTO 
bf90: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 2c  parent VALUES(1,
bfa0: 20 32 2c 20 33 29 22 20 20 20 20 20 20 30 0a 74   2, 3)"      0.t
bfb0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 35 20  est_efkey_29 25 
bfc0: 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20  "COMMIT"        
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 20 20 20 20 30 0a 0a 74 65 73            0..tes
bff0: 74 5f 65 66 6b 65 79 5f 32 39 20 32 36 20 22 42  t_efkey_29 26 "B
c000: 45 47 49 4e 22 20 20 20 20 20 20 20 20 20 20 20  EGIN"           
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
c030: 66 6b 65 79 5f 32 39 20 32 37 20 22 55 50 44 41  fkey_29 27 "UPDA
c040: 54 45 20 63 31 20 53 45 54 20 61 20 3d 20 31 30  TE c1 SET a = 10
c050: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c060: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c070: 79 5f 32 39 20 32 38 20 22 55 50 44 41 54 45 20  y_29 28 "UPDATE 
c080: 63 32 20 53 45 54 20 61 20 3d 20 31 30 22 20 20  c2 SET a = 10"  
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c0b0: 39 20 32 39 20 22 55 50 44 41 54 45 20 63 33 20  9 29 "UPDATE c3 
c0c0: 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20  SET a = 10"     
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c0e0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33  .test_efkey_29 3
c0f0: 30 20 22 55 50 44 41 54 45 20 63 34 20 53 45 54  0 "UPDATE c4 SET
c100: 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20   a = 10"        
c110: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c120: 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 31 20 22  st_efkey_29 31 "
c130: 55 50 44 41 54 45 20 63 35 20 53 45 54 20 61 20  UPDATE c5 SET a 
c140: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c150: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c160: 65 66 6b 65 79 5f 32 39 20 33 31 20 22 55 50 44  efkey_29 31 "UPD
c170: 41 54 45 20 63 36 20 53 45 54 20 61 20 3d 20 31  ATE c6 SET a = 1
c180: 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
c190: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c1a0: 65 79 5f 32 39 20 33 31 20 22 55 50 44 41 54 45  ey_29 31 "UPDATE
c1b0: 20 63 37 20 53 45 54 20 61 20 3d 20 31 30 22 20   c7 SET a = 10" 
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
c1e0: 32 39 20 33 32 20 22 43 4f 4d 4d 49 54 22 20 20  29 32 "COMMIT"  
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c220: 33 33 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20  33 "ROLLBACK"   
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 0a               0..
c250: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
c260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
c2a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 34 39  DENCE-OF: R-2449
c2b0: 39 2d 35 37 30 37 31 0a 23 0a 23 20 54 65 73 74  9-57071.#.# Test
c2c0: 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d   an example from
c2d0: 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d   foreignkeys.htm
c2e0: 6c 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  l dealing with a
c2f0: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
c300: 6e 20 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72 61  n .# key constra
c310: 69 6e 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  int..#.do_test e
c320: 5f 66 6b 65 79 2d 33 35 2e 31 20 7b 0a 20 20 64  _fkey-35.1 {.  d
c330: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
c340: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
c350: 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74 69  REATE TABLE arti
c360: 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73 74  st(.      artist
c370: 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50 52  id    INTEGER PR
c380: 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20  IMARY KEY, .    
c390: 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45    artistname  TE
c3a0: 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  XT.    );.    CR
c3b0: 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b  EATE TABLE track
c3c0: 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64 20  (.      trackid 
c3d0: 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20      INTEGER,.   
c3e0: 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54     trackname   T
c3f0: 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63  EXT, .      trac
c400: 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 20  kartist INTEGER 
c410: 52 45 46 45 52 45 4e 43 45 53 20 61 72 74 69 73  REFERENCES artis
c420: 74 28 61 72 74 69 73 74 69 64 29 20 44 45 46 45  t(artistid) DEFE
c430: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
c440: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
c450: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
c460: 74 20 65 5f 66 6b 65 79 2d 33 35 2e 32 20 7b 0a  t e_fkey-35.2 {.
c470: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
c480: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
c490: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
c4a0: 41 4c 55 45 53 28 31 2c 20 27 57 68 69 74 65 20  ALUES(1, 'White 
c4b0: 43 68 72 69 73 74 6d 61 73 27 2c 20 35 29 3b 0a  Christmas', 5);.
c4c0: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 43    }.  catchsql C
c4d0: 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65  OMMIT.} {1 {fore
c4e0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
c4f0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
c500: 65 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e 33 20  est e_fkey-35.3 
c510: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
c520: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72    INSERT INTO ar
c530: 74 69 73 74 20 56 41 4c 55 45 53 28 35 2c 20 27  tist VALUES(5, '
c540: 42 69 6e 67 20 43 72 6f 73 62 79 27 29 3b 0a 20  Bing Crosby');. 
c550: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
c560: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c5b0: 23 20 56 65 72 69 66 79 20 74 68 61 74 20 61 20  # Verify that a 
c5c0: 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74  nested savepoint
c5d0: 20 6d 61 79 20 62 65 20 72 65 6c 65 61 73 65 64   may be released
c5e0: 20 77 69 74 68 6f 75 74 20 73 61 74 69 73 66 79   without satisfy
c5f0: 69 6e 67 20 0a 23 20 64 65 66 65 72 72 65 64 20  ing .# deferred 
c600: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
c610: 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49  traints..#.# EVI
c620: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 32  DENCE-OF: R-0722
c630: 33 2d 34 38 33 32 33 20 41 20 6e 65 73 74 65 64  3-48323 A nested
c640: 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
c650: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 0a 23 20  action may be.# 
c660: 52 45 4c 45 41 53 45 64 20 77 68 69 6c 65 20 74  RELEASEd while t
c670: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
c680: 6e 20 61 20 73 74 61 74 65 20 74 68 61 74 20 64  n a state that d
c690: 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20  oes not satisfy 
c6a0: 61 0a 23 20 64 65 66 65 72 72 65 64 20 66 6f 72  a.# deferred for
c6b0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
c6c0: 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  int..#.drop_all_
c6d0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
c6e0: 5f 66 6b 65 79 2d 33 36 2e 31 20 7b 0a 20 20 65  _fkey-36.1 {.  e
c6f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
c700: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
c710: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
c720: 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74    b REFERENCES t
c730: 31 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  1 DEFERRABLE INI
c740: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
c750: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
c760: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
c770: 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 1);.    INSE
c780: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
c790: 53 28 32 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(2, 2);.    INS
c7a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
c7b0: 45 53 28 33 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  ES(3, 3);.  }.} 
c7c0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
c7d0: 79 2d 33 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-36.2 {.  execs
c7e0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
c7f0: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
c800: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  one;.        INS
c810: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
c820: 45 53 28 34 2c 20 35 29 3b 0a 20 20 20 20 20 20  ES(4, 5);.      
c830: 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d  RELEASE one;.  }
c840: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
c850: 66 6b 65 79 2d 33 36 2e 33 20 7b 0a 20 20 63 61  fkey-36.3 {.  ca
c860: 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  tchsql COMMIT.} 
c870: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
c880: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
c890: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
c8a0: 65 79 2d 33 36 2e 34 20 7b 0a 20 20 65 78 65 63  ey-36.4 {.  exec
c8b0: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
c8c0: 20 74 31 20 53 45 54 20 61 20 3d 20 35 20 57 48   t1 SET a = 5 WH
c8d0: 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 43  ERE a = 4;.    C
c8e0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
c8f0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
c940: 68 65 63 6b 20 74 68 61 74 20 61 20 74 72 61 6e  heck that a tran
c950: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
c960: 74 20 28 61 6e 20 6f 75 74 65 72 6d 6f 73 74 20  t (an outermost 
c970: 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64  savepoint opened
c980: 20 77 68 65 6e 0a 23 20 74 68 65 20 64 61 74 61   when.# the data
c990: 62 61 73 65 20 77 61 73 20 69 6e 20 61 75 74 6f  base was in auto
c9a0: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 29 20 63 61  -commit mode) ca
c9b0: 6e 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65 64  nnot be released
c9c0: 20 77 69 74 68 6f 75 74 0a 23 20 73 61 74 69 73   without.# satis
c9d0: 66 79 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  fying deferred f
c9e0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
c9f0: 72 61 69 6e 74 73 2e 20 49 74 20 6d 61 79 20 62  raints. It may b
ca00: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23  e rolled back..#
ca10: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ca20: 52 2d 34 34 32 39 35 2d 31 33 38 32 33 20 41 20  R-44295-13823 A 
ca30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
ca40: 70 6f 69 6e 74 20 28 61 20 6e 6f 6e 2d 6e 65 73  point (a non-nes
ca50: 74 65 64 0a 23 20 73 61 76 65 70 6f 69 6e 74 20  ted.# savepoint 
ca60: 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
ca70: 77 68 69 6c 65 20 74 68 65 72 65 20 77 61 73 20  while there was 
ca80: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6e  not currently an
ca90: 20 6f 70 65 6e 0a 23 20 74 72 61 6e 73 61 63 74   open.# transact
caa0: 69 6f 6e 29 2c 20 6f 6e 20 74 68 65 20 6f 74 68  ion), on the oth
cab0: 65 72 20 68 61 6e 64 2c 20 69 73 20 73 75 62 6a  er hand, is subj
cac0: 65 63 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ect to the same 
cad0: 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 23 20 61  restrictions.# a
cae0: 73 20 61 20 43 4f 4d 4d 49 54 20 2d 20 61 74 74  s a COMMIT - att
caf0: 65 6d 70 74 69 6e 67 20 74 6f 20 52 45 4c 45 41  empting to RELEA
cb00: 53 45 20 69 74 20 77 68 69 6c 65 20 74 68 65 20  SE it while the 
cb10: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 73  database is in s
cb20: 75 63 68 20 61 0a 23 20 73 74 61 74 65 20 77 69  uch a.# state wi
cb30: 6c 6c 20 66 61 69 6c 2e 0a 23 0a 64 6f 5f 74 65  ll fail..#.do_te
cb40: 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 31 20 7b  st e_fkey-37.1 {
cb50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
cb60: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
cb70: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
cb80: 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  two;.        INS
cb90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
cba0: 45 53 28 36 2c 20 37 29 3b 0a 20 20 20 20 20 20  ES(6, 7);.      
cbb0: 52 45 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d  RELEASE two;.  }
cbc0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
cbd0: 66 6b 65 79 2d 33 37 2e 32 20 7b 0a 20 20 63 61  fkey-37.2 {.  ca
cbe0: 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20  tchsql {RELEASE 
cbf0: 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  one}.} {1 {forei
cc00: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
cc10: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
cc20: 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 33 20 7b  st e_fkey-37.3 {
cc30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
cc40: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
cc50: 20 61 20 3d 20 37 20 57 48 45 52 45 20 61 20 3d   a = 7 WHERE a =
cc60: 20 36 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20   6;.    RELEASE 
cc70: 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  one;.  }.} {}.do
cc80: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e  _test e_fkey-37.
cc90: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
cca0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
ccb0: 65 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  e;.      SAVEPOI
ccc0: 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20  NT two;.        
ccd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cce0: 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20  ALUES(9, 10);.  
ccf0: 20 20 20 20 52 45 4c 45 41 53 45 20 74 77 6f 3b      RELEASE two;
cd00: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
cd10: 74 20 65 5f 66 6b 65 79 2d 33 37 2e 35 20 7b 0a  t e_fkey-37.5 {.
cd20: 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45    catchsql {RELE
cd30: 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 66  ASE one}.} {1 {f
cd40: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
cd50: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
cd60: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37  o_test e_fkey-37
cd70: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
cd80: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 20  ROLLBACK TO one 
cd90: 3b 20 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d  ; RELEASE one}.}
cda0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cdf0: 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
ce00: 20 43 4f 4d 4d 49 54 20 6f 70 65 72 61 74 69 6f   COMMIT operatio
ce10: 6e 20 66 61 69 6c 73 20 64 75 65 20 74 6f 20 64  n fails due to d
ce20: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
ce30: 6b 65 79 20 0a 23 20 63 6f 6e 73 74 72 61 69 6e  key .# constrain
ce40: 74 73 2c 20 61 6e 79 20 6e 65 73 74 65 64 20 73  ts, any nested s
ce50: 61 76 65 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e  avepoints remain
ce60: 20 6f 70 65 6e 2e 0a 23 0a 23 20 45 56 49 44 45   open..#.# EVIDE
ce70: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 37 33 36 2d  NCE-OF: R-37736-
ce80: 34 32 36 31 36 20 49 66 20 61 20 43 4f 4d 4d 49  42616 If a COMMI
ce90: 54 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  T statement (or 
cea0: 74 68 65 20 52 45 4c 45 41 53 45 20 6f 66 20 61  the RELEASE of a
ceb0: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 53  .# transaction S
cec0: 41 56 45 50 4f 49 4e 54 29 20 66 61 69 6c 73 20  AVEPOINT) fails 
ced0: 62 65 63 61 75 73 65 20 74 68 65 20 64 61 74 61  because the data
cee0: 62 61 73 65 20 69 73 20 63 75 72 72 65 6e 74 6c  base is currentl
cef0: 79 20 69 6e 20 61 0a 23 20 73 74 61 74 65 20 74  y in a.# state t
cf00: 68 61 74 20 76 69 6f 6c 61 74 65 73 20 61 20 64  hat violates a d
cf10: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
cf20: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  key constraint a
cf30: 6e 64 20 74 68 65 72 65 20 61 72 65 0a 23 20 63  nd there are.# c
cf40: 75 72 72 65 6e 74 6c 79 20 6e 65 73 74 65 64 20  urrently nested 
cf50: 73 61 76 65 70 6f 69 6e 74 73 2c 20 74 68 65 20  savepoints, the 
cf60: 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74  nested savepoint
cf70: 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23  s remain open..#
cf80: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
cf90: 33 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  38.1 {.  execsql
cfa0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
cfb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3e 33 3b  OM t1 WHERE a>3;
cfc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
cfd0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
cfe0: 31 20 32 20 32 20 33 20 33 7d 0a 64 6f 5f 74 65  1 2 2 3 3}.do_te
cff0: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 32 20 7b  st e_fkey-38.2 {
d000: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d010: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
d020: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d030: 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 20  UES(4, 4);.     
d040: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
d050: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
d060: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
d070: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c   6);.        SEL
d080: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
d090: 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20   }.} {1 1 2 2 3 
d0a0: 33 20 34 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65  3 4 4 5 6}.do_te
d0b0: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 33 20 7b  st e_fkey-38.3 {
d0c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
d0d0: 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  IT.} {1 {foreign
d0e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
d0f0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
d100: 20 65 5f 66 6b 65 79 2d 33 38 2e 34 20 7b 0a 20   e_fkey-38.4 {. 
d110: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52   execsql {.    R
d120: 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a  OLLBACK TO one;.
d130: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
d140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
d150: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32  ;.  }.} {1 1 2 2
d160: 20 33 20 33 20 34 20 34 7d 0a 0a 64 6f 5f 74 65   3 3 4 4}..do_te
d170: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 35 20 7b  st e_fkey-38.5 {
d180: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d190: 20 53 41 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20   SAVEPOINT a;.  
d1a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d1b0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b  t1 VALUES(5, 5);
d1c0: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
d1d0: 20 62 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45   b;.        INSE
d1e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d1f0: 53 28 36 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  S(6, 7);.       
d200: 20 53 41 56 45 50 4f 49 4e 54 20 63 3b 0a 20 20   SAVEPOINT c;.  
d210: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
d220: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
d230: 20 38 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   8);.  }.} {}.do
d240: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e  _test e_fkey-38.
d250: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
d260: 52 45 4c 45 41 53 45 20 61 7d 0a 7d 20 7b 31 20  RELEASE a}.} {1 
d270: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
d280: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
d290: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d2a0: 33 38 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  38.7 {.  execsql
d2b0: 20 20 7b 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63    {ROLLBACK TO c
d2c0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45  }.  catchsql {RE
d2d0: 4c 45 41 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 66  LEASE a}.} {1 {f
d2e0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
d2f0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
d300: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d310: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 20  .8 {.  execsql  
d320: 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  {.    ROLLBACK T
d330: 4f 20 62 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  O b;.    RELEASE
d340: 20 61 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   a;.    SELECT *
d350: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d360: 7b 31 20 31 20 32 20 32 20 33 20 33 20 34 20 34  {1 1 2 2 3 3 4 4
d370: 20 35 20 35 7d 0a 0a 23 23 23 23 23 23 23 23 23   5 5}..#########
d380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d3a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d3b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d3c0: 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34  ##.### SECTION 4
d3d0: 2e 33 3a 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e  .3: ON DELETE an
d3e0: 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69  d ON UPDATE Acti
d3f0: 6f 6e 73 0a 23 23 23 23 23 23 23 23 23 23 23 23  ons.############
d400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
d440: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
d450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
d490: 73 74 20 74 68 61 74 20 63 6f 6e 66 69 67 75 72  st that configur
d4a0: 65 64 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64  ed ON DELETE and
d4b0: 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
d4c0: 6e 73 20 74 61 6b 65 20 70 6c 61 63 65 20 77 68  ns take place wh
d4d0: 65 6e 0a 23 20 64 65 6c 65 74 69 6e 67 20 6f 72  en.# deleting or
d4e0: 20 6d 6f 64 69 66 79 69 6e 67 20 72 6f 77 73 20   modifying rows 
d4f0: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  of the parent ta
d500: 62 6c 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ble, respectivel
d510: 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  y..#.# EVIDENCE-
d520: 4f 46 3a 20 52 2d 34 38 32 37 30 2d 34 34 32 38  OF: R-48270-4428
d530: 32 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 4f 4e  2 Foreign key ON
d540: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
d550: 50 44 41 54 45 20 63 6c 61 75 73 65 73 0a 23 20  PDATE clauses.# 
d560: 61 72 65 20 75 73 65 64 20 74 6f 20 63 6f 6e 66  are used to conf
d570: 69 67 75 72 65 20 61 63 74 69 6f 6e 73 20 74 68  igure actions th
d580: 61 74 20 74 61 6b 65 20 70 6c 61 63 65 20 77 68  at take place wh
d590: 65 6e 20 64 65 6c 65 74 69 6e 67 20 72 6f 77 73  en deleting rows
d5a0: 20 66 72 6f 6d 0a 23 20 74 68 65 20 70 61 72 65   from.# the pare
d5b0: 6e 74 20 74 61 62 6c 65 20 28 4f 4e 20 44 45 4c  nt table (ON DEL
d5c0: 45 54 45 29 2c 20 6f 72 20 6d 6f 64 69 66 79 69  ETE), or modifyi
d5d0: 6e 67 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  ng the parent ke
d5e0: 79 20 76 61 6c 75 65 73 20 6f 66 0a 23 20 65 78  y values of.# ex
d5f0: 69 73 74 69 6e 67 20 72 6f 77 73 20 28 4f 4e 20  isting rows (ON 
d600: 55 50 44 41 54 45 29 2e 0a 23 0a 23 20 54 65 73  UPDATE)..#.# Tes
d610: 74 20 74 68 61 74 20 61 20 73 69 6e 67 6c 65 20  t that a single 
d620: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61  FK constraint ma
d630: 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
d640: 20 61 63 74 69 6f 6e 73 20 63 6f 6e 66 69 67 75   actions configu
d650: 72 65 64 0a 23 20 66 6f 72 20 4f 4e 20 44 45 4c  red.# for ON DEL
d660: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
d670: 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  E..#.# EVIDENCE-
d680: 4f 46 3a 20 52 2d 34 38 31 32 34 2d 36 33 32 32  OF: R-48124-6322
d690: 35 20 41 20 73 69 6e 67 6c 65 20 66 6f 72 65 69  5 A single forei
d6a0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
d6b0: 74 20 6d 61 79 20 68 61 76 65 0a 23 20 64 69 66  t may have.# dif
d6c0: 66 65 72 65 6e 74 20 61 63 74 69 6f 6e 73 20 63  ferent actions c
d6d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 4f 4e  onfigured for ON
d6e0: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
d6f0: 50 44 41 54 45 2e 0a 23 0a 64 6f 5f 74 65 73 74  PDATE..#.do_test
d700: 20 65 5f 66 6b 65 79 2d 33 39 2e 31 20 7b 0a 20   e_fkey-39.1 {. 
d710: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
d720: 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c  REATE TABLE p(a,
d730: 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20   b PRIMARY KEY, 
d740: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
d750: 41 42 4c 45 20 63 31 28 64 2c 20 65 2c 20 66 20  ABLE c1(d, e, f 
d760: 44 45 46 41 55 4c 54 20 27 6b 30 27 20 52 45 46  DEFAULT 'k0' REF
d770: 45 52 45 4e 43 45 53 20 70 20 0a 20 20 20 20 20  ERENCES p .     
d780: 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44   ON UPDATE SET D
d790: 45 46 41 55 4c 54 0a 20 20 20 20 20 20 4f 4e 20  EFAULT.      ON 
d7a0: 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a  DELETE SET NULL.
d7b0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45      );..    INSE
d7c0: 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53  RT INTO p VALUES
d7d0: 28 30 2c 20 27 6b 30 27 2c 20 27 27 29 3b 0a 20  (0, 'k0', '');. 
d7e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
d7f0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6b 31 27 2c   VALUES(1, 'k1',
d800: 20 27 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'I');.    INSER
d810: 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
d820: 32 2c 20 27 6b 32 27 2c 20 27 49 49 27 29 3b 0a  2, 'k2', 'II');.
d830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d840: 70 20 56 41 4c 55 45 53 28 33 2c 20 27 6b 33 27  p VALUES(3, 'k3'
d850: 2c 20 27 49 49 49 27 29 3b 0a 0a 20 20 20 20 49  , 'III');..    I
d860: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
d870: 4c 55 45 53 28 31 2c 20 27 78 78 27 2c 20 27 6b  LUES(1, 'xx', 'k
d880: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
d890: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32  INTO c1 VALUES(2
d8a0: 2c 20 27 78 78 27 2c 20 27 6b 32 27 29 3b 0a 20  , 'xx', 'k2');. 
d8b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
d8c0: 31 20 56 41 4c 55 45 53 28 33 2c 20 27 78 78 27  1 VALUES(3, 'xx'
d8d0: 2c 20 27 6b 33 27 29 3b 0a 20 20 7d 0a 7d 20 7b  , 'k3');.  }.} {
d8e0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
d8f0: 2d 33 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -39.2 {.  execsq
d900: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70  l {.    UPDATE p
d910: 20 53 45 54 20 62 20 3d 20 27 6b 34 27 20 57 48   SET b = 'k4' WH
d920: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 53  ERE a = 1;.    S
d930: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b  ELECT * FROM c1;
d940: 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20  .  }.} {1 xx k0 
d950: 32 20 78 78 20 6b 32 20 33 20 78 78 20 6b 33 7d  2 xx k2 3 xx k3}
d960: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d970: 33 39 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  39.3 {.  execsql
d980: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
d990: 4f 4d 20 70 20 57 48 45 52 45 20 61 20 3d 20 32  OM p WHERE a = 2
d9a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
d9b0: 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM c1;.  }.} {1
d9c0: 20 78 78 20 6b 30 20 32 20 78 78 20 7b 7d 20 33   xx k0 2 xx {} 3
d9d0: 20 78 78 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20   xx k3}.do_test 
d9e0: 65 5f 66 6b 65 79 2d 33 39 2e 34 20 7b 0a 20 20  e_fkey-39.4 {.  
d9f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
da00: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
da10: 58 20 70 69 20 4f 4e 20 70 28 63 29 3b 0a 20 20  X pi ON p(c);.  
da20: 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70    REPLACE INTO p
da30: 20 56 41 4c 55 45 53 28 35 2c 20 27 6b 35 27 2c   VALUES(5, 'k5',
da40: 20 27 49 49 49 27 29 3b 0a 20 20 20 20 53 45 4c   'III');.    SEL
da50: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20  ECT * FROM c1;. 
da60: 20 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20   }.} {1 xx k0 2 
da70: 78 78 20 7b 7d 20 33 20 78 78 20 7b 7d 7d 0a 0a  xx {} 3 xx {}}..
da80: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
da90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
daa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 61 63  ----------.# Eac
dad0: 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  h foreign key in
dae0: 20 74 68 65 20 73 79 73 74 65 6d 20 68 61 73 20   the system has 
daf0: 61 6e 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  an ON UPDATE and
db00: 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
db10: 6e 2c 0a 23 20 65 69 74 68 65 72 20 22 4e 4f 20  n,.# either "NO 
db20: 41 43 54 49 4f 4e 22 2c 20 22 52 45 53 54 52 49  ACTION", "RESTRI
db30: 43 54 22 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c  CT", "SET NULL",
db40: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 20 6f   "SET DEFAULT" o
db50: 72 20 22 43 41 53 43 41 44 45 22 2e 0a 23 0a 23  r "CASCADE"..#.#
db60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
db70: 33 33 33 32 36 2d 34 35 32 35 32 20 54 68 65 20  33326-45252 The 
db80: 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
db90: 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 0a 23   UPDATE action.#
dba0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dbb0: 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65   each foreign ke
dbc0: 79 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  y in an SQLite d
dbd0: 61 74 61 62 61 73 65 20 69 73 20 6f 6e 65 20 6f  atabase is one o
dbe0: 66 20 22 4e 4f 0a 23 20 41 43 54 49 4f 4e 22 2c  f "NO.# ACTION",
dbf0: 20 22 52 45 53 54 52 49 43 54 22 2c 20 22 53 45   "RESTRICT", "SE
dc00: 54 20 4e 55 4c 4c 22 2c 20 22 53 45 54 20 44 45  T NULL", "SET DE
dc10: 46 41 55 4c 54 22 20 6f 72 20 22 43 41 53 43 41  FAULT" or "CASCA
dc20: 44 45 22 2e 0a 23 0a 23 20 49 66 20 6e 6f 6e 65  DE"..#.# If none
dc30: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 65 78   is specified ex
dc40: 70 6c 69 63 69 74 6c 79 2c 20 22 4e 4f 20 41 43  plicitly, "NO AC
dc50: 54 49 4f 4e 22 20 69 73 20 74 68 65 20 64 65 66  TION" is the def
dc60: 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ault..#.# EVIDEN
dc70: 43 45 2d 4f 46 3a 20 52 2d 31 39 38 30 33 2d 34  CE-OF: R-19803-4
dc80: 35 38 38 34 20 49 66 20 61 6e 20 61 63 74 69 6f  5884 If an actio
dc90: 6e 20 69 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  n is not explici
dca0: 74 6c 79 20 73 70 65 63 69 66 69 65 64 2c 0a 23  tly specified,.#
dcb0: 20 69 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20   it defaults to 
dcc0: 22 4e 4f 20 41 43 54 49 4f 4e 22 2e 0a 23 20 0a  "NO ACTION"..# .
dcd0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
dce0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
dcf0: 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.1 {.  execsql 
dd00: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
dd10: 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
dd20: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
dd30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
dd40: 69 6c 64 31 28 61 2c 20 0a 20 20 20 20 20 20 62  ild1(a, .      b
dd50: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
dd60: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20  nt ON UPDATE NO 
dd70: 41 43 54 49 4f 4e 20 4f 4e 20 44 45 4c 45 54 45  ACTION ON DELETE
dd80: 20 52 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b   RESTRICT.    );
dd90: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dda0: 45 20 63 68 69 6c 64 32 28 61 2c 20 0a 20 20 20  E child2(a, .   
ddb0: 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20     b REFERENCES 
ddc0: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
ddd0: 20 52 45 53 54 52 49 43 54 20 4f 4e 20 44 45 4c   RESTRICT ON DEL
dde0: 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20  ETE SET NULL.   
ddf0: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
de00: 41 42 4c 45 20 63 68 69 6c 64 33 28 61 2c 20 0a  ABLE child3(a, .
de10: 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e 43        b REFERENC
de20: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
de30: 41 54 45 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20  ATE SET NULL ON 
de40: 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55  DELETE SET DEFAU
de50: 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  LT.    );.    CR
de60: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
de70: 34 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45  4(a, .      b RE
de80: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
de90: 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45  ON UPDATE SET DE
dea0: 46 41 55 4c 54 20 4f 4e 20 44 45 4c 45 54 45 20  FAULT ON DELETE 
deb0: 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a  CASCADE.    );..
dec0: 20 20 20 20 2d 2d 20 43 72 65 61 74 65 20 73 6f      -- Create so
ded0: 6d 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  me foreign keys 
dee0: 74 68 61 74 20 75 73 65 20 74 68 65 20 64 65 66  that use the def
def0: 61 75 6c 74 20 61 63 74 69 6f 6e 20 2d 20 22 4e  ault action - "N
df00: 4f 20 41 43 54 49 4f 4e 22 0a 20 20 20 20 43 52  O ACTION".    CR
df10: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
df20: 35 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  5(a, b REFERENCE
df30: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
df40: 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
df50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
df60: 69 6c 64 36 28 61 2c 20 62 20 52 45 46 45 52 45  ild6(a, b REFERE
df70: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
df80: 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b  ELETE RESTRICT);
df90: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dfa0: 45 20 63 68 69 6c 64 37 28 61 2c 20 62 20 52 45  E child7(a, b RE
dfb0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
dfc0: 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54  ON DELETE NO ACT
dfd0: 49 4f 4e 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ION);.    CREATE
dfe0: 20 54 41 42 4c 45 20 63 68 69 6c 64 38 28 61 2c   TABLE child8(a,
dff0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e000: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e  rent ON UPDATE N
e010: 4f 20 41 43 54 49 4f 4e 29 3b 0a 20 20 7d 0a 7d  O ACTION);.  }.}
e020: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
e030: 20 7a 54 61 62 20 6c 52 65 73 7d 20 7b 0a 20 20   zTab lRes} {.  
e040: 32 20 63 68 69 6c 64 31 20 7b 30 20 30 20 70 61  2 child1 {0 0 pa
e050: 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43  rent b {} {NO AC
e060: 54 49 4f 4e 7d 20 52 45 53 54 52 49 43 54 20 4e  TION} RESTRICT N
e070: 4f 4e 45 7d 0a 20 20 33 20 63 68 69 6c 64 32 20  ONE}.  3 child2 
e080: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e090: 20 52 45 53 54 52 49 43 54 20 7b 53 45 54 20 4e   RESTRICT {SET N
e0a0: 55 4c 4c 7d 20 4e 4f 4e 45 7d 0a 20 20 34 20 63  ULL} NONE}.  4 c
e0b0: 68 69 6c 64 33 20 7b 30 20 30 20 70 61 72 65 6e  hild3 {0 0 paren
e0c0: 74 20 62 20 7b 7d 20 7b 53 45 54 20 4e 55 4c 4c  t b {} {SET NULL
e0d0: 7d 20 7b 53 45 54 20 44 45 46 41 55 4c 54 7d 20  } {SET DEFAULT} 
e0e0: 4e 4f 4e 45 7d 0a 20 20 35 20 63 68 69 6c 64 34  NONE}.  5 child4
e0f0: 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b   {0 0 parent b {
e100: 7d 20 7b 53 45 54 20 44 45 46 41 55 4c 54 7d 20  } {SET DEFAULT} 
e110: 43 41 53 43 41 44 45 20 4e 4f 4e 45 7d 0a 20 20  CASCADE NONE}.  
e120: 36 20 63 68 69 6c 64 35 20 7b 30 20 30 20 70 61  6 child5 {0 0 pa
e130: 72 65 6e 74 20 62 20 7b 7d 20 43 41 53 43 41 44  rent b {} CASCAD
e140: 45 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f  E {NO ACTION} NO
e150: 4e 45 7d 0a 20 20 37 20 63 68 69 6c 64 36 20 7b  NE}.  7 child6 {
e160: 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20  0 0 parent b {} 
e170: 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53 54  {NO ACTION} REST
e180: 52 49 43 54 20 4e 4f 4e 45 7d 0a 20 20 38 20 63  RICT NONE}.  8 c
e190: 68 69 6c 64 37 20 7b 30 20 30 20 70 61 72 65 6e  hild7 {0 0 paren
e1a0: 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f  t b {} {NO ACTIO
e1b0: 4e 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e  N} {NO ACTION} N
e1c0: 4f 4e 45 7d 0a 20 20 39 20 63 68 69 6c 64 38 20  ONE}.  9 child8 
e1d0: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e1e0: 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f   {NO ACTION} {NO
e1f0: 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 7d   ACTION} NONE}.}
e200: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   {.  do_test e_f
e210: 6b 65 79 2d 34 30 2e 24 74 6e 20 7b 20 65 78 65  key-40.$tn { exe
e220: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 66 6f 72  csql "PRAGMA for
e230: 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 24 7a  eign_key_list($z
e240: 54 61 62 29 22 20 7d 20 24 6c 52 65 73 0a 7d 0a  Tab)" } $lRes.}.
e250: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
e260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
e2a0: 73 74 20 74 68 61 74 20 22 4e 4f 20 41 43 54 49  st that "NO ACTI
e2b0: 4f 4e 22 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ON" means that n
e2c0: 6f 74 68 69 6e 67 20 68 61 70 70 65 6e 73 20 74  othing happens t
e2d0: 6f 20 61 20 63 68 69 6c 64 20 72 6f 77 20 77 68  o a child row wh
e2e0: 65 6e 0a 23 20 69 74 27 73 20 70 61 72 65 6e 74  en.# it's parent
e2f0: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 20   row is updated 
e300: 6f 72 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20  or deleted..#.# 
e310: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
e320: 39 39 37 31 2d 35 34 39 37 36 20 43 6f 6e 66 69  9971-54976 Confi
e330: 67 75 72 69 6e 67 20 22 4e 4f 20 41 43 54 49 4f  guring "NO ACTIO
e340: 4e 22 20 6d 65 61 6e 73 20 6a 75 73 74 20 74 68  N" means just th
e350: 61 74 3a 0a 23 20 77 68 65 6e 20 61 20 70 61 72  at:.# when a par
e360: 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f 64 69 66  ent key is modif
e370: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ied or deleted f
e380: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
e390: 2c 20 6e 6f 20 73 70 65 63 69 61 6c 0a 23 20 61  , no special.# a
e3a0: 63 74 69 6f 6e 20 69 73 20 74 61 6b 65 6e 2e 0a  ction is taken..
e3b0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
e3c0: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
e3d0: 2d 34 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -41.1 {.  execsq
e3e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
e3f0: 41 42 4c 45 20 70 61 72 65 6e 74 28 70 31 2c 20  ABLE parent(p1, 
e400: 70 32 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  p2, PRIMARY KEY(
e410: 70 31 2c 20 70 32 29 29 3b 0a 20 20 20 20 43 52  p1, p2));.    CR
e420: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
e430: 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20 20  (c1, c2, .      
e440: 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 31 2c 20  FOREIGN KEY(c1, 
e450: 63 32 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  c2) REFERENCES p
e460: 61 72 65 6e 74 0a 20 20 20 20 20 20 4f 4e 20 55  arent.      ON U
e470: 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a  PDATE NO ACTION.
e480: 20 20 20 20 20 20 4f 4e 20 44 45 4c 45 54 45 20        ON DELETE 
e490: 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20  NO ACTION.      
e4a0: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
e4b0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
e4c0: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
e4d0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
e4e0: 45 53 28 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20  ES('j', 'k');.  
e4f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
e500: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6c 27 2c  rent VALUES('l',
e510: 20 27 6d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'm');.    INSER
e520: 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c  T INTO child VAL
e530: 55 45 53 28 27 6a 27 2c 20 27 6b 27 29 3b 0a 20  UES('j', 'k');. 
e540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
e550: 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6c 27 2c  hild VALUES('l',
e560: 20 27 6d 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a   'm');.  }.} {}.
e570: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
e580: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
e590: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
e5a0: 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
e5b0: 20 53 45 54 20 70 31 3d 27 6b 27 20 57 48 45 52   SET p1='k' WHER
e5c0: 45 20 70 31 3d 27 6a 27 3b 0a 20 20 20 20 20 20  E p1='j';.      
e5d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
e5e0: 6e 74 20 57 48 45 52 45 20 70 31 3d 27 6c 27 3b  nt WHERE p1='l';
e5f0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
e600: 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a  FROM child;.  }.
e610: 7d 20 7b 6a 20 6b 20 6c 20 6d 7d 0a 64 6f 5f 74  } {j k l m}.do_t
e620: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 33 20  est e_fkey-41.3 
e630: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  {.  catchsql COM
e640: 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  MIT.} {1 {foreig
e650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
e660: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
e670: 74 20 65 5f 66 6b 65 79 2d 34 31 2e 34 20 7b 0a  t e_fkey-41.4 {.
e680: 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
e690: 43 4b 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  CK.} {}..#------
e6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6e0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
e6f0: 22 52 45 53 54 52 49 43 54 22 20 6d 65 61 6e 73  "RESTRICT" means
e700: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
e710: 20 69 73 20 70 72 6f 68 69 62 69 74 65 64 20 66   is prohibited f
e720: 72 6f 6d 20 64 65 6c 65 74 69 6e 67 0a 23 20 6f  rom deleting.# o
e730: 72 20 75 70 64 61 74 69 6e 67 20 61 20 70 61 72  r updating a par
e740: 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 77 68  ent table row wh
e750: 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20  en there exists 
e760: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c  one or more chil
e770: 64 20 6b 65 79 73 0a 23 20 6d 61 70 70 65 64 20  d keys.# mapped 
e780: 74 6f 20 69 74 2e 0a 23 0a 23 20 45 56 49 44 45  to it..#.# EVIDE
e790: 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 37 32 2d  NCE-OF: R-04272-
e7a0: 33 38 36 35 33 20 54 68 65 20 22 52 45 53 54 52  38653 The "RESTR
e7b0: 49 43 54 22 20 61 63 74 69 6f 6e 20 6d 65 61 6e  ICT" action mean
e7c0: 73 20 74 68 61 74 20 74 68 65 0a 23 20 61 70 70  s that the.# app
e7d0: 6c 69 63 61 74 69 6f 6e 20 69 73 20 70 72 6f 68  lication is proh
e7e0: 69 62 69 74 65 64 20 66 72 6f 6d 20 64 65 6c 65  ibited from dele
e7f0: 74 69 6e 67 20 28 66 6f 72 20 4f 4e 20 44 45 4c  ting (for ON DEL
e800: 45 54 45 20 52 45 53 54 52 49 43 54 29 20 6f 72  ETE RESTRICT) or
e810: 0a 23 20 6d 6f 64 69 66 79 69 6e 67 20 28 66 6f  .# modifying (fo
e820: 72 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54  r ON UPDATE REST
e830: 52 49 43 54 29 20 61 20 70 61 72 65 6e 74 20 6b  RICT) a parent k
e840: 65 79 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  ey when there ex
e850: 69 73 74 73 20 6f 6e 65 0a 23 20 6f 72 20 6d 6f  ists one.# or mo
e860: 72 65 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 61  re child keys ma
e870: 70 70 65 64 20 74 6f 20 69 74 2e 0a 23 0a 64 72  pped to it..#.dr
e880: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
e890: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e  _test e_fkey-41.
e8a0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
e8b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e8c0: 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 3b   parent(p1, p2);
e8d0: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
e8e0: 55 45 20 49 4e 44 45 58 20 70 61 72 65 6e 74 5f  UE INDEX parent_
e8f0: 69 20 4f 4e 20 70 61 72 65 6e 74 28 70 31 2c 20  i ON parent(p1, 
e900: 70 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  p2);.    CREATE 
e910: 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63 31 2c  TABLE child1(c1,
e920: 20 63 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45   c2, .      FORE
e930: 49 47 4e 20 4b 45 59 28 63 32 2c 20 63 31 29 20  IGN KEY(c2, c1) 
e940: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
e950: 74 28 70 31 2c 20 70 32 29 20 4f 4e 20 44 45 4c  t(p1, p2) ON DEL
e960: 45 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20  ETE RESTRICT.   
e970: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
e980: 41 42 4c 45 20 63 68 69 6c 64 32 28 63 31 2c 20  ABLE child2(c1, 
e990: 63 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49  c2, .      FOREI
e9a0: 47 4e 20 4b 45 59 28 63 32 2c 20 63 31 29 20 52  GN KEY(c2, c1) R
e9b0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e9c0: 28 70 31 2c 20 70 32 29 20 4f 4e 20 55 50 44 41  (p1, p2) ON UPDA
e9d0: 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20 20  TE RESTRICT.    
e9e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
e9f0: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20  est e_fkey-41.2 
ea00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ea10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
ea20: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 61 27 2c  rent VALUES('a',
ea30: 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
ea40: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
ea50: 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a  LUES('c', 'd');.
ea60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ea70: 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 62  child1 VALUES('b
ea80: 27 2c 20 27 61 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'a');.    INS
ea90: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
eaa0: 56 41 4c 55 45 53 28 27 64 27 2c 20 27 63 27 29  VALUES('d', 'c')
eab0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
eac0: 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b  st e_fkey-41.3 {
ead0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
eae0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
eaf0: 20 57 48 45 52 45 20 70 31 20 3d 20 27 61 27 20   WHERE p1 = 'a' 
eb00: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
eb10: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
eb20: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
eb30: 65 5f 66 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20  e_fkey-41.4 {.  
eb40: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
eb50: 45 20 70 61 72 65 6e 74 20 53 45 54 20 70 32 20  E parent SET p2 
eb60: 3d 20 27 65 27 20 57 48 45 52 45 20 70 31 20 3d  = 'e' WHERE p1 =
eb70: 20 27 63 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72   'c' }.} {1 {for
eb80: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
eb90: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d  int failed}}..#-
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
ebf0: 74 68 61 74 20 52 45 53 54 52 49 43 54 20 69 73  that RESTRICT is
ec00: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
ec10: 65 6e 74 20 66 72 6f 6d 20 4e 4f 20 41 43 54 49  ent from NO ACTI
ec20: 4f 4e 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  ON for IMMEDIATE
ec30: 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  .# constraints, 
ec40: 69 6e 20 74 68 61 74 20 69 74 20 69 73 20 65 6e  in that it is en
ec50: 66 6f 72 63 65 64 20 69 6d 6d 65 64 69 61 74 65  forced immediate
ec60: 6c 79 2c 20 6e 6f 74 20 61 74 20 74 68 65 20 65  ly, not at the e
ec70: 6e 64 20 6f 66 20 74 68 65 20 0a 23 20 73 74 61  nd of the .# sta
ec80: 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44  tement..#.# EVID
ec90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 39 37  ENCE-OF: R-37997
eca0: 2d 34 32 31 38 37 20 54 68 65 20 64 69 66 66 65  -42187 The diffe
ecb0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
ecc0: 65 20 65 66 66 65 63 74 20 6f 66 20 61 0a 23 20  e effect of a.# 
ecd0: 52 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20  RESTRICT action 
ece0: 61 6e 64 20 6e 6f 72 6d 61 6c 20 66 6f 72 65 69  and normal forei
ecf0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
ed00: 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 69 73  t enforcement is
ed10: 20 74 68 61 74 0a 23 20 74 68 65 20 52 45 53 54   that.# the REST
ed20: 52 49 43 54 20 61 63 74 69 6f 6e 20 70 72 6f 63  RICT action proc
ed30: 65 73 73 69 6e 67 20 68 61 70 70 65 6e 73 20 61  essing happens a
ed40: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
ed50: 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 0a 23  eld is updated.#
ed60: 20 2d 20 6e 6f 74 20 61 74 20 74 68 65 20 65 6e   - not at the en
ed70: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
ed80: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
ed90: 20 77 6f 75 6c 64 20 77 69 74 68 20 61 6e 0a 23   would with an.#
eda0: 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74   immediate const
edb0: 72 61 69 6e 74 2c 20 6f 72 20 61 74 20 74 68 65  raint, or at the
edc0: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72   end of the curr
edd0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
ede0: 61 73 20 69 74 0a 23 20 77 6f 75 6c 64 20 77 69  as it.# would wi
edf0: 74 68 20 61 20 64 65 66 65 72 72 65 64 20 63 6f  th a deferred co
ee00: 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 72 6f 70  nstraint..#.drop
ee10: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
ee20: 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 31 20  est e_fkey-42.1 
ee30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ee40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
ee50: 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20  arent(x PRIMARY 
ee60: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
ee70: 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20   TABLE child1(c 
ee80: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
ee90: 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54  t ON UPDATE REST
eea0: 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54  RICT);.    CREAT
eeb0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63  E TABLE child2(c
eec0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
eed0: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20  nt ON UPDATE NO 
eee0: 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e  ACTION);..    IN
eef0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
ef00: 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b   VALUES('key1');
ef10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ef20: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
ef30: 6b 65 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45  key2');.    INSE
ef40: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56  RT INTO child1 V
ef50: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
ef60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
ef70: 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65  hild2 VALUES('ke
ef80: 79 32 27 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  y2');..    CREAT
ef90: 45 20 54 52 49 47 47 45 52 20 70 61 72 65 6e 74  E TRIGGER parent
efa0: 5f 74 20 41 46 54 45 52 20 55 50 44 41 54 45 20  _t AFTER UPDATE 
efb0: 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a  ON parent BEGIN.
efc0: 20 20 20 20 20 20 55 50 44 41 54 45 20 63 68 69        UPDATE chi
efd0: 6c 64 31 20 73 65 74 20 63 20 3d 20 6e 65 77 2e  ld1 set c = new.
efe0: 78 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e  x WHERE c = old.
eff0: 78 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  x;.      UPDATE 
f000: 63 68 69 6c 64 32 20 73 65 74 20 63 20 3d 20 6e  child2 set c = n
f010: 65 77 2e 78 20 57 48 45 52 45 20 63 20 3d 20 6f  ew.x WHERE c = o
f020: 6c 64 2e 78 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ld.x;.    END;. 
f030: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
f040: 65 5f 66 6b 65 79 2d 34 32 2e 32 20 7b 0a 20 20  e_fkey-42.2 {.  
f050: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
f060: 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
f070: 20 27 6b 65 79 20 6f 6e 65 27 20 57 48 45 52 45   'key one' WHERE
f080: 20 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20   x = 'key1' }.} 
f090: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
f0a0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
f0b0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
f0c0: 65 79 2d 34 32 2e 33 20 7b 0a 20 20 65 78 65 63  ey-42.3 {.  exec
f0d0: 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54  sql { .    UPDAT
f0e0: 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
f0f0: 20 27 6b 65 79 20 74 77 6f 27 20 57 48 45 52 45   'key two' WHERE
f100: 20 78 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20   x = 'key2';.   
f110: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
f120: 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 6b  hild2;.  }.} {{k
f130: 65 79 20 74 77 6f 7d 7d 0a 0a 64 72 6f 70 5f 61  ey two}}..drop_a
f140: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
f150: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 34 20 7b 0a  t e_fkey-42.4 {.
f160: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
f180: 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
f190: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
f1a0: 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45  ABLE child1(c RE
f1b0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
f1c0: 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
f1d0: 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  CT);.    CREATE 
f1e0: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52  TABLE child2(c R
f1f0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
f200: 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43   ON DELETE NO AC
f210: 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45  TION);..    INSE
f220: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f230: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
f240: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f250: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f260: 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y2');.    INSERT
f270: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
f280: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f290: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f2a0: 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ld2 VALUES('key2
f2b0: 27 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ');..    CREATE 
f2c0: 54 52 49 47 47 45 52 20 70 61 72 65 6e 74 5f 74  TRIGGER parent_t
f2d0: 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e   AFTER DELETE ON
f2e0: 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20   parent BEGIN.  
f2f0: 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64      UPDATE child
f300: 31 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57  1 SET c = NULL W
f310: 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a  HERE c = old.x;.
f320: 20 20 20 20 20 20 55 50 44 41 54 45 20 63 68 69        UPDATE chi
f330: 6c 64 32 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c  ld2 SET c = NULL
f340: 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78   WHERE c = old.x
f350: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
f360: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
f370: 65 79 2d 34 32 2e 35 20 7b 0a 20 20 63 61 74 63  ey-42.5 {.  catc
f380: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
f390: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
f3a0: 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b  x = 'key1' }.} {
f3b0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
f3c0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
f3d0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
f3e0: 79 2d 34 32 2e 36 20 7b 0a 20 20 65 78 65 63 73  y-42.6 {.  execs
f3f0: 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45  ql { .    DELETE
f400: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
f410: 52 45 20 78 20 3d 20 27 6b 65 79 32 27 3b 0a 20  RE x = 'key2';. 
f420: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
f430: 20 63 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b   child2;.  }.} {
f440: 7b 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  {}}..drop_all_ta
f450: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
f460: 6b 65 79 2d 34 32 2e 37 20 7b 0a 20 20 65 78 65  key-42.7 {.  exe
f470: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
f480: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
f490: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
f4a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f4b0: 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e  child1(c REFEREN
f4c0: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45  CES parent ON DE
f4d0: 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a  LETE RESTRICT);.
f4e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f4f0: 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52 45   child2(c REFERE
f500: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
f510: 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  ELETE NO ACTION)
f520: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
f530: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
f540: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
f550: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
f560: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f570: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f580: 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27   child1 VALUES('
f590: 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
f5a0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56  RT INTO child2 V
f5b0: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
f5c0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
f5d0: 65 5f 66 6b 65 79 2d 34 32 2e 38 20 7b 0a 20 20  e_fkey-42.8 {.  
f5e0: 63 61 74 63 68 73 71 6c 20 7b 20 52 45 50 4c 41  catchsql { REPLA
f5f0: 43 45 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  CE INTO parent V
f600: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 20 7d 0a  ALUES('key1') }.
f610: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
f620: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
f630: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
f640: 66 6b 65 79 2d 34 32 2e 39 20 7b 0a 20 20 65 78  fkey-42.9 {.  ex
f650: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 52 45 50  ecsql { .    REP
f660: 4c 41 43 45 20 49 4e 54 4f 20 70 61 72 65 6e 74  LACE INTO parent
f670: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f680: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
f690: 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d  OM child2;.  }.}
f6a0: 20 7b 6b 65 79 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   {key2}..#------
f6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6f0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
f700: 52 45 53 54 52 49 43 54 20 69 73 20 65 6e 66 6f  RESTRICT is enfo
f710: 72 63 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rced immediately
f720: 2c 20 65 76 65 6e 20 66 6f 72 20 61 20 44 45 46  , even for a DEF
f730: 45 52 52 45 44 20 63 6f 6e 73 74 72 61 69 6e 74  ERRED constraint
f740: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
f750: 46 3a 20 52 2d 32 34 31 37 39 2d 36 30 35 32 33  F: R-24179-60523
f760: 20 45 76 65 6e 20 69 66 20 74 68 65 20 66 6f 72   Even if the for
f770: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
f780: 69 6e 74 20 69 74 20 69 73 0a 23 20 61 74 74 61  int it is.# atta
f790: 63 68 65 64 20 74 6f 20 69 73 20 64 65 66 65 72  ched to is defer
f7a0: 72 65 64 2c 20 63 6f 6e 66 69 67 75 72 69 6e 67  red, configuring
f7b0: 20 61 20 52 45 53 54 52 49 43 54 20 61 63 74 69   a RESTRICT acti
f7c0: 6f 6e 20 63 61 75 73 65 73 20 53 51 4c 69 74 65  on causes SQLite
f7d0: 0a 23 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  .# to return an 
f7e0: 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
f7f0: 79 20 69 66 20 61 20 70 61 72 65 6e 74 20 6b 65  y if a parent ke
f800: 79 20 77 69 74 68 20 64 65 70 65 6e 64 65 6e 74  y with dependent
f810: 20 63 68 69 6c 64 0a 23 20 6b 65 79 73 20 69 73   child.# keys is
f820: 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69   deleted or modi
f830: 66 69 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  fied..#.drop_all
f840: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
f850: 65 5f 66 6b 65 79 2d 34 33 2e 31 20 7b 0a 20 20  e_fkey-43.1 {.  
f860: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
f870: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
f880: 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  t(x PRIMARY KEY)
f890: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f8a0: 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45  LE child1(c REFE
f8b0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
f8c0: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
f8d0: 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c  .      DEFERRABL
f8e0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
f8f0: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20  RRED.    );.    
f900: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f910: 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld2(c REFERENCES
f920: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
f930: 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20  E NO ACTION.    
f940: 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49    DEFERRABLE INI
f950: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
f960: 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45      );..    INSE
f970: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f980: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
f990: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f9a0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f9b0: 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y2');.    INSERT
f9c0: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
f9d0: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f9e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f9f0: 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ld2 VALUES('key2
fa00: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
fa10: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
fa20: 65 5f 66 6b 65 79 2d 34 33 2e 32 20 7b 0a 20 20  e_fkey-43.2 {.  
fa30: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
fa40: 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
fa50: 20 27 6b 65 79 20 6f 6e 65 27 20 57 48 45 52 45   'key one' WHERE
fa60: 20 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20   x = 'key1' }.} 
fa70: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
fa80: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
fa90: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
faa0: 65 79 2d 34 33 2e 33 20 7b 0a 20 20 65 78 65 63  ey-43.3 {.  exec
fab0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72  sql { UPDATE par
fac0: 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79  ent SET x = 'key
fad0: 20 74 77 6f 27 20 57 48 45 52 45 20 78 20 3d 20   two' WHERE x = 
fae0: 27 6b 65 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f  'key2' }.} {}.do
faf0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
fb00: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43  4 {.  catchsql C
fb10: 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65  OMMIT.} {1 {fore
fb20: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
fb30: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
fb40: 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 35 20  est e_fkey-43.5 
fb50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
fb60: 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 32 20    UPDATE child2 
fb70: 53 45 54 20 63 20 3d 20 27 6b 65 79 20 74 77 6f  SET c = 'key two
fb80: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
fb90: 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f 70 5f 61 6c   }.} {}..drop_al
fba0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
fbb0: 20 65 5f 66 6b 65 79 2d 34 33 2e 36 20 7b 0a 20   e_fkey-43.6 {. 
fbc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
fbd0: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
fbe0: 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(x PRIMARY KEY
fbf0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
fc00: 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46  BLE child1(c REF
fc10: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
fc20: 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
fc30: 54 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42  T.      DEFERRAB
fc40: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
fc50: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20  ERRED.    );.   
fc60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
fc70: 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45  ild2(c REFERENCE
fc80: 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45  S parent ON DELE
fc90: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20  TE NO ACTION.   
fca0: 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e     DEFERRABLE IN
fcb0: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
fcc0: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53  .    );..    INS
fcd0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
fce0: 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a  VALUES('key1');.
fcf0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fd00: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
fd10: 65 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey2');.    INSER
fd20: 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41  T INTO child1 VA
fd30: 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20  LUES('key1');.  
fd40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
fd50: 69 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79  ild2 VALUES('key
fd60: 32 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  2');.    BEGIN;.
fd70: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
fd80: 20 65 5f 66 6b 65 79 2d 34 33 2e 37 20 7b 0a 20   e_fkey-43.7 {. 
fd90: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
fda0: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
fdb0: 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20  HERE x = 'key1' 
fdc0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
fdd0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
fde0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
fdf0: 65 5f 66 6b 65 79 2d 34 33 2e 38 20 7b 0a 20 20  e_fkey-43.8 {.  
fe00: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
fe10: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
fe20: 52 45 20 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a  RE x = 'key2' }.
fe30: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
fe40: 6b 65 79 2d 34 33 2e 39 20 7b 0a 20 20 63 61 74  key-43.9 {.  cat
fe50: 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  chsql COMMIT.} {
fe60: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
fe70: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
fe80: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
fe90: 79 2d 34 33 2e 31 30 20 7b 0a 20 20 65 78 65 63  y-43.10 {.  exec
fea0: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
feb0: 20 63 68 69 6c 64 32 20 53 45 54 20 63 20 3d 20   child2 SET c = 
fec0: 4e 55 4c 4c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  NULL;.    COMMIT
fed0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  ;.  }.} {}..#---
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff20: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45  ------.# Test SE
ff30: 54 20 4e 55 4c 4c 20 61 63 74 69 6f 6e 73 2e 0a  T NULL actions..
ff40: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
ff50: 20 52 2d 30 33 33 35 33 2d 30 35 33 32 37 20 49   R-03353-05327 I
ff60: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
ff70: 20 61 63 74 69 6f 6e 20 69 73 20 22 53 45 54 20   action is "SET 
ff80: 4e 55 4c 4c 22 2c 0a 23 20 74 68 65 6e 20 77 68  NULL",.# then wh
ff90: 65 6e 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20  en a parent key 
ffa0: 69 73 20 64 65 6c 65 74 65 64 20 28 66 6f 72 20  is deleted (for 
ffb0: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
ffc0: 4c 4c 29 20 6f 72 20 6d 6f 64 69 66 69 65 64 0a  LL) or modified.
ffd0: 23 20 28 66 6f 72 20 4f 4e 20 55 50 44 41 54 45  # (for ON UPDATE
ffe0: 20 53 45 54 20 4e 55 4c 4c 29 2c 20 74 68 65 20   SET NULL), the 
fff0: 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
10000 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e  s of all rows in
10010 20 74 68 65 0a 23 20 63 68 69 6c 64 20 74 61 62   the.# child tab
10020 6c 65 20 74 68 61 74 20 6d 61 70 70 65 64 20 74  le that mapped t
10030 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  o the parent key
10040 20 61 72 65 20 73 65 74 20 74 6f 20 63 6f 6e 74   are set to cont
10050 61 69 6e 20 53 51 4c 20 4e 55 4c 4c 0a 23 20 76  ain SQL NULL.# v
10060 61 6c 75 65 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c  alues..#.drop_al
10070 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
10080 20 65 5f 66 6b 65 79 2d 34 34 2e 31 20 7b 0a 20   e_fkey-44.1 {. 
10090 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
100a0 52 45 41 54 45 20 54 41 42 4c 45 20 70 41 28 78  REATE TABLE pA(x
100b0 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
100c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
100d0 63 41 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  cA(c REFERENCES 
100e0 70 41 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54  pA ON DELETE SET
100f0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41   NULL);.    CREA
10100 54 45 20 54 41 42 4c 45 20 63 42 28 63 20 52 45  TE TABLE cB(c RE
10110 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 55  FERENCES pA ON U
10120 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b  PDATE SET NULL);
10130 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
10140 4f 20 70 41 20 56 41 4c 55 45 53 28 58 27 41 42  O pA VALUES(X'AB
10150 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  CD');.    INSERT
10160 20 49 4e 54 4f 20 70 41 20 56 41 4c 55 45 53 28   INTO pA VALUES(
10170 58 27 31 32 33 34 27 29 3b 0a 20 20 20 20 49 4e  X'1234');.    IN
10180 53 45 52 54 20 49 4e 54 4f 20 63 41 20 56 41 4c  SERT INTO cA VAL
10190 55 45 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20  UES(X'ABCD');.  
101a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 42    INSERT INTO cB
101b0 20 56 41 4c 55 45 53 28 58 27 31 32 33 34 27 29   VALUES(X'1234')
101c0 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
101d0 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 32 20 7b  st e_fkey-44.2 {
101e0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
101f0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 41 20   DELETE FROM pA 
10200 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b  WHERE rowid = 1;
10210 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74  .    SELECT quot
10220 65 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20  e(x) FROM pA;.  
10230 7d 0a 7d 20 7b 58 27 31 32 33 34 27 7d 0a 64 6f  }.} {X'1234'}.do
10240 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e  _test e_fkey-44.
10250 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
10260 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65      SELECT quote
10270 28 63 29 20 46 52 4f 4d 20 63 41 3b 0a 20 20 7d  (c) FROM cA;.  }
10280 0a 7d 20 7b 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73  .} {NULL}.do_tes
10290 74 20 65 5f 66 6b 65 79 2d 34 34 2e 34 20 7b 0a  t e_fkey-44.4 {.
102a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
102b0 55 50 44 41 54 45 20 70 41 20 53 45 54 20 78 20  UPDATE pA SET x 
102c0 3d 20 58 27 38 37 36 35 27 20 57 48 45 52 45 20  = X'8765' WHERE 
102d0 72 6f 77 69 64 20 3d 20 32 3b 0a 20 20 20 20 53  rowid = 2;.    S
102e0 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20 46  ELECT quote(x) F
102f0 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58  ROM pA;.  }.} {X
10300 27 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74 20  '8765'}.do_test 
10310 65 5f 66 6b 65 79 2d 34 34 2e 35 20 7b 0a 20 20  e_fkey-44.5 {.  
10320 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10330 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63   quote(c) FROM c
10340 42 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a 0a 23 2d  B }.} {NULL}..#-
10350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10390 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
103a0 53 45 54 20 44 45 46 41 55 4c 54 20 61 63 74 69  SET DEFAULT acti
103b0 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ons..#.# EVIDENC
103c0 45 2d 4f 46 3a 20 52 2d 34 33 30 35 34 2d 35 34  E-OF: R-43054-54
103d0 38 33 32 20 54 68 65 20 22 53 45 54 20 44 45 46  832 The "SET DEF
103e0 41 55 4c 54 22 20 61 63 74 69 6f 6e 73 20 61 72  AULT" actions ar
103f0 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 23 20 22  e similar to.# "
10400 53 45 54 20 4e 55 4c 4c 22 2c 20 65 78 63 65 70  SET NULL", excep
10410 74 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  t that each of t
10420 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c  he child key col
10430 75 6d 6e 73 20 69 73 20 73 65 74 20 74 6f 0a 23  umns is set to.#
10440 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6c   contain the col
10450 75 6d 6e 73 20 64 65 66 61 75 6c 74 20 76 61 6c  umns default val
10460 75 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  ue instead of NU
10470 4c 4c 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  LL..#.drop_all_t
10480 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
10490 66 6b 65 79 2d 34 35 2e 31 20 7b 0a 20 20 65 78  fkey-45.1 {.  ex
104a0 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
104b0 54 45 20 54 41 42 4c 45 20 70 41 28 78 20 50 52  TE TABLE pA(x PR
104c0 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
104d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 41 28  CREATE TABLE cA(
104e0 63 20 44 45 46 41 55 4c 54 20 58 27 30 30 30 30  c DEFAULT X'0000
104f0 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 41 20  ' REFERENCES pA 
10500 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
10510 46 41 55 4c 54 29 3b 0a 20 20 20 20 43 52 45 41  FAULT);.    CREA
10520 54 45 20 54 41 42 4c 45 20 63 42 28 63 20 44 45  TE TABLE cB(c DE
10530 46 41 55 4c 54 20 58 27 39 39 39 39 27 20 52 45  FAULT X'9999' RE
10540 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 55  FERENCES pA ON U
10550 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c  PDATE SET DEFAUL
10560 54 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  T);..    INSERT 
10570 49 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78  INTO pA(rowid, x
10580 29 20 56 41 4c 55 45 53 28 31 2c 20 58 27 30 30  ) VALUES(1, X'00
10590 30 30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00');.    INSERT
105a0 20 49 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20   INTO pA(rowid, 
105b0 78 29 20 56 41 4c 55 45 53 28 32 2c 20 58 27 39  x) VALUES(2, X'9
105c0 39 39 39 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  999');.    INSER
105d0 54 20 49 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c  T INTO pA(rowid,
105e0 20 78 29 20 56 41 4c 55 45 53 28 33 2c 20 58 27   x) VALUES(3, X'
105f0 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45  ABCD');.    INSE
10600 52 54 20 49 4e 54 4f 20 70 41 28 72 6f 77 69 64  RT INTO pA(rowid
10610 2c 20 78 29 20 56 41 4c 55 45 53 28 34 2c 20 58  , x) VALUES(4, X
10620 27 31 32 33 34 27 29 3b 0a 0a 20 20 20 20 49 4e  '1234');..    IN
10630 53 45 52 54 20 49 4e 54 4f 20 63 41 20 56 41 4c  SERT INTO cA VAL
10640 55 45 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20  UES(X'ABCD');.  
10650 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 42    INSERT INTO cB
10660 20 56 41 4c 55 45 53 28 58 27 31 32 33 34 27 29   VALUES(X'1234')
10670 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
10680 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 32 20 7b  st e_fkey-45.2 {
10690 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
106a0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 41 20   DELETE FROM pA 
106b0 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 33 3b  WHERE rowid = 3;
106c0 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74  .    SELECT quot
106d0 65 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20  e(x) FROM pA;.  
106e0 7d 0a 7d 20 7b 58 27 30 30 30 30 27 20 58 27 39  }.} {X'0000' X'9
106f0 39 39 39 27 20 58 27 31 32 33 34 27 7d 0a 64 6f  999' X'1234'}.do
10700 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e  _test e_fkey-45.
10710 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
10720 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20  SELECT quote(c) 
10730 46 52 4f 4d 20 63 41 20 7d 0a 7d 20 7b 58 27 30  FROM cA }.} {X'0
10740 30 30 30 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  000'}.do_test e_
10750 66 6b 65 79 2d 34 35 2e 34 20 7b 0a 20 20 65 78  fkey-45.4 {.  ex
10760 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
10770 54 45 20 70 41 20 53 45 54 20 78 20 3d 20 58 27  TE pA SET x = X'
10780 38 37 36 35 27 20 57 48 45 52 45 20 72 6f 77 69  8765' WHERE rowi
10790 64 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43  d = 4;.    SELEC
107a0 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20  T quote(x) FROM 
107b0 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 30 30 30  pA;.  }.} {X'000
107c0 30 27 20 58 27 39 39 39 39 27 20 58 27 38 37 36  0' X'9999' X'876
107d0 35 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  5'}.do_test e_fk
107e0 65 79 2d 34 35 2e 35 20 7b 0a 20 20 65 78 65 63  ey-45.5 {.  exec
107f0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f  sql { SELECT quo
10800 74 65 28 63 29 20 46 52 4f 4d 20 63 42 20 7d 0a  te(c) FROM cB }.
10810 7d 20 7b 58 27 39 39 39 39 27 7d 0a 0a 23 2d 2d  } {X'9999'}..#--
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10860 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 4f  -------.# Test O
10870 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
10880 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56   actions..#.# EV
10890 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33  IDENCE-OF: R-613
108a0 37 36 2d 35 37 32 36 37 20 41 20 22 43 41 53 43  76-57267 A "CASC
108b0 41 44 45 22 20 61 63 74 69 6f 6e 20 70 72 6f 70  ADE" action prop
108c0 61 67 61 74 65 73 20 74 68 65 20 64 65 6c 65 74  agates the delet
108d0 65 20 6f 72 0a 23 20 75 70 64 61 74 65 20 6f 70  e or.# update op
108e0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70  eration on the p
108f0 61 72 65 6e 74 20 6b 65 79 20 74 6f 20 65 61 63  arent key to eac
10900 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c  h dependent chil
10910 64 20 6b 65 79 2e 0a 23 0a 23 20 45 56 49 44 45  d key..#.# EVIDE
10920 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 38 30 39 2d  NCE-OF: R-61809-
10930 36 32 32 30 37 20 46 6f 72 20 61 6e 20 22 4f 4e  62207 For an "ON
10940 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 22   DELETE CASCADE"
10950 20 61 63 74 69 6f 6e 2c 20 74 68 69 73 0a 23 20   action, this.# 
10960 6d 65 61 6e 73 20 74 68 61 74 20 65 61 63 68 20  means that each 
10970 72 6f 77 20 69 6e 20 74 68 65 20 63 68 69 6c 64  row in the child
10980 20 74 61 62 6c 65 20 74 68 61 74 20 77 61 73 20   table that was 
10990 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
109a0 74 68 65 0a 23 20 64 65 6c 65 74 65 64 20 70 61  the.# deleted pa
109b0 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 73 6f  rent row is also
109c0 20 64 65 6c 65 74 65 64 2e 0a 23 0a 64 72 6f 70   deleted..#.drop
109d0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
109e0 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 31 20  est e_fkey-46.1 
109f0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10a00 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
10a10 31 28 61 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  1(a, b UNIQUE);.
10a20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10a30 20 63 31 28 63 20 52 45 46 45 52 45 4e 43 45 53   c1(c REFERENCES
10a40 20 70 31 28 62 29 20 4f 4e 20 44 45 4c 45 54 45   p1(b) ON DELETE
10a50 20 43 41 53 43 41 44 45 2c 20 64 29 3b 0a 20 20   CASCADE, d);.  
10a60 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
10a70 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
10a80 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
10a90 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 34  INTO p1 VALUES(4
10aa0 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 4);.    INSERT
10ab0 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
10ac0 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 5);.    INSER
10ad0 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
10ae0 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20  (NULL, NULL);.  
10af0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
10b00 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
10b10 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10b20 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a  1 VALUES(5, 5);.
10b30 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10b40 28 2a 29 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  (*) FROM c1;.  }
10b50 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {3}.do_test e
10b60 5f 66 6b 65 79 2d 34 36 2e 32 20 7b 0a 20 20 65  _fkey-46.2 {.  e
10b70 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
10b80 45 54 45 20 46 52 4f 4d 20 70 31 20 57 48 45 52  ETE FROM p1 WHER
10b90 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c  E a = 4;.    SEL
10ba0 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31  ECT d, c FROM c1
10bb0 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 35  ;.  }.} {{} {} 5
10bc0 20 35 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   5}.do_test e_fk
10bd0 65 79 2d 34 36 2e 33 20 7b 0a 20 20 65 78 65 63  ey-46.3 {.  exec
10be0 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
10bf0 20 46 52 4f 4d 20 70 31 3b 0a 20 20 20 20 53 45   FROM p1;.    SE
10c00 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63  LECT d, c FROM c
10c10 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d  1;.  }.} {{} {}}
10c20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10c30 34 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  46.4 {.  execsql
10c40 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
10c50 20 70 31 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d   p1 }.} {}...#--
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ca0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 4f  -------.# Test O
10cb0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
10cc0 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56   actions..#.# EV
10cd0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 38  IDENCE-OF: R-138
10ce0 37 37 2d 36 34 35 34 32 20 46 6f 72 20 61 6e 20  77-64542 For an 
10cf0 22 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41  "ON UPDATE CASCA
10d00 44 45 22 20 61 63 74 69 6f 6e 2c 20 69 74 20 6d  DE" action, it m
10d10 65 61 6e 73 0a 23 20 74 68 61 74 20 74 68 65 20  eans.# that the 
10d20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
10d30 20 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74 20   each dependent 
10d40 63 68 69 6c 64 20 6b 65 79 20 61 72 65 20 6d 6f  child key are mo
10d50 64 69 66 69 65 64 20 74 6f 0a 23 20 6d 61 74 63  dified to.# matc
10d60 68 20 74 68 65 20 6e 65 77 20 70 61 72 65 6e 74  h the new parent
10d70 20 6b 65 79 20 76 61 6c 75 65 73 2e 0a 23 0a 23   key values..#.#
10d80 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10d90 36 31 33 37 36 2d 35 37 32 36 37 20 41 20 22 43  61376-57267 A "C
10da0 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 20 70  ASCADE" action p
10db0 72 6f 70 61 67 61 74 65 73 20 74 68 65 20 64 65  ropagates the de
10dc0 6c 65 74 65 20 6f 72 0a 23 20 75 70 64 61 74 65  lete or.# update
10dd0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
10de0 65 20 70 61 72 65 6e 74 20 6b 65 79 20 74 6f 20  e parent key to 
10df0 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74 20 63  each dependent c
10e00 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 64 72 6f 70  hild key..#.drop
10e10 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
10e20 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 31 20  est e_fkey-47.1 
10e30 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10e40 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
10e50 31 28 61 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  1(a, b UNIQUE);.
10e60 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10e70 20 63 31 28 63 20 52 45 46 45 52 45 4e 43 45 53   c1(c REFERENCES
10e80 20 70 31 28 62 29 20 4f 4e 20 55 50 44 41 54 45   p1(b) ON UPDATE
10e90 20 43 41 53 43 41 44 45 2c 20 64 29 3b 0a 20 20   CASCADE, d);.  
10ea0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
10eb0 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
10ec0 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
10ed0 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 34  INTO p1 VALUES(4
10ee0 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 4);.    INSERT
10ef0 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
10f00 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 5);.    INSER
10f10 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
10f20 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20  (NULL, NULL);.  
10f30 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
10f40 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
10f50 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10f60 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a  1 VALUES(5, 5);.
10f70 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
10f80 28 2a 29 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  (*) FROM c1;.  }
10f90 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {3}.do_test e
10fa0 5f 66 6b 65 79 2d 34 37 2e 32 20 7b 0a 20 20 65  _fkey-47.2 {.  e
10fb0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
10fc0 41 54 45 20 70 31 20 53 45 54 20 62 20 3d 20 31  ATE p1 SET b = 1
10fd0 30 20 57 48 45 52 45 20 62 20 3d 20 35 3b 0a 20  0 WHERE b = 5;. 
10fe0 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46     SELECT d, c F
10ff0 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b  ROM c1;.  }.} {{
11000 7d 20 7b 7d 20 34 20 34 20 35 20 31 30 7d 0a 64  } {} 4 4 5 10}.d
11010 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 37  o_test e_fkey-47
11020 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
11030 0a 20 20 20 20 55 50 44 41 54 45 20 70 31 20 53  .    UPDATE p1 S
11040 45 54 20 62 20 3d 20 31 31 20 57 48 45 52 45 20  ET b = 11 WHERE 
11050 62 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43  b = 4;.    SELEC
11060 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a  T d, c FROM c1;.
11070 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31    }.} {{} {} 4 1
11080 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20  1 5 10}.do_test 
11090 65 5f 66 6b 65 79 2d 34 37 2e 34 20 7b 0a 20 20  e_fkey-47.4 {.  
110a0 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55  execsql { .    U
110b0 50 44 41 54 45 20 70 31 20 53 45 54 20 62 20 3d  PDATE p1 SET b =
110c0 20 36 20 57 48 45 52 45 20 62 20 49 53 20 4e 55   6 WHERE b IS NU
110d0 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64  LL;.    SELECT d
110e0 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  , c FROM c1;.  }
110f0 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31 31 20 35  .} {{} {} 4 11 5
11100 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   10}.do_test e_f
11110 6b 65 79 2d 34 36 2e 35 20 7b 0a 20 20 65 78 65  key-46.5 {.  exe
11120 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
11130 46 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b 7b 7d 20  FROM p1 }.} {{} 
11140 36 20 34 20 31 31 20 35 20 31 30 7d 0a 0a 23 2d  6 4 11 5 10}..#-
11150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11190 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
111a0 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 35 38 2d  NCE-OF: R-65058-
111b0 35 37 31 35 38 0a 23 0a 23 20 54 65 73 74 20 61  57158.#.# Test a
111c0 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74  n example from t
111d0 68 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e  he "ON DELETE an
111e0 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69  d ON UPDATE Acti
111f0 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23 20  ons" section .# 
11200 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68  of foreignkeys.h
11210 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  tml..#.drop_all_
11220 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
11230 5f 66 6b 65 79 2d 34 38 2e 31 20 7b 0a 20 20 65  _fkey-48.1 {.  e
11240 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
11250 41 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74  ATE TABLE artist
11260 28 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64  (.      artistid
11270 20 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d      INTEGER PRIM
11280 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20  ARY KEY, .      
11290 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54  artistname  TEXT
112a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
112b0 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a  TE TABLE track(.
112c0 20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20        trackid   
112d0 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20    INTEGER,.     
112e0 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
112f0 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
11300 72 74 69 73 74 20 49 4e 54 45 47 45 52 20 52 45  rtist INTEGER RE
11310 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
11320 61 72 74 69 73 74 69 64 29 20 4f 4e 20 55 50 44  artistid) ON UPD
11330 41 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20  ATE CASCADE.    
11340 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
11350 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
11360 53 28 31 2c 20 27 44 65 61 6e 20 4d 61 72 74 69  S(1, 'Dean Marti
11370 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  n');.    INSERT 
11380 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
11390 45 53 28 32 2c 20 27 46 72 61 6e 6b 20 53 69 6e  ES(2, 'Frank Sin
113a0 61 74 72 61 27 29 3b 0a 20 20 20 20 49 4e 53 45  atra');.    INSE
113b0 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
113c0 4c 55 45 53 28 31 31 2c 20 27 54 68 61 74 27 27  LUES(11, 'That''
113d0 73 20 41 6d 6f 72 65 27 2c 20 31 29 3b 0a 20 20  s Amore', 1);.  
113e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72    INSERT INTO tr
113f0 61 63 6b 20 56 41 4c 55 45 53 28 31 32 2c 20 27  ack VALUES(12, '
11400 43 68 72 69 73 74 6d 61 73 20 42 6c 75 65 73 27  Christmas Blues'
11410 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
11420 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
11430 45 53 28 31 33 2c 20 27 4d 79 20 57 61 79 27 2c  ES(13, 'My Way',
11440 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   2);.  }.} {}.do
11450 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e  _test e_fkey-48.
11460 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
11470 20 20 20 20 55 50 44 41 54 45 20 61 72 74 69 73      UPDATE artis
11480 74 20 53 45 54 20 61 72 74 69 73 74 69 64 20 3d  t SET artistid =
11490 20 31 30 30 20 57 48 45 52 45 20 61 72 74 69 73   100 WHERE artis
114a0 74 6e 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61  tname = 'Dean Ma
114b0 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  rtin';.  }.} {}.
114c0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
114d0 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
114e0 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
114f0 61 72 74 69 73 74 20 7d 0a 7d 20 7b 32 20 7b 46  artist }.} {2 {F
11500 72 61 6e 6b 20 53 69 6e 61 74 72 61 7d 20 31 30  rank Sinatra} 10
11510 30 20 7b 44 65 61 6e 20 4d 61 72 74 69 6e 7d 7d  0 {Dean Martin}}
11520 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11530 34 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  48.4 {.  execsql
11540 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
11550 20 74 72 61 63 6b 20 7d 0a 7d 20 7b 31 31 20 7b   track }.} {11 {
11560 54 68 61 74 27 73 20 41 6d 6f 72 65 7d 20 31 30  That's Amore} 10
11570 30 20 31 32 20 7b 43 68 72 69 73 74 6d 61 73 20  0 12 {Christmas 
11580 42 6c 75 65 73 7d 20 31 30 30 20 31 33 20 7b 4d  Blues} 100 13 {M
11590 79 20 57 61 79 7d 20 32 7d 0a 0a 0a 23 2d 2d 2d  y Way} 2}...#---
115a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115e0 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20  ------.# Verify 
115f0 74 68 61 74 20 61 64 64 69 6e 67 20 61 6e 20 46  that adding an F
11600 4b 20 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  K action does no
11610 74 20 61 62 73 6f 6c 76 65 20 74 68 65 20 75 73  t absolve the us
11620 65 72 20 6f 66 20 74 68 65 20 0a 23 20 72 65 71  er of the .# req
11630 75 69 72 65 6d 65 6e 74 20 6e 6f 74 20 74 6f 20  uirement not to 
11640 76 69 6f 6c 61 74 65 20 74 68 65 20 66 6f 72 65  violate the fore
11650 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
11660 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  nt..#.# EVIDENCE
11670 2d 4f 46 3a 20 52 2d 35 33 39 36 38 2d 35 31 36  -OF: R-53968-516
11680 34 32 20 43 6f 6e 66 69 67 75 72 69 6e 67 20 61  42 Configuring a
11690 6e 20 4f 4e 20 55 50 44 41 54 45 20 6f 72 20 4f  n ON UPDATE or O
116a0 4e 20 44 45 4c 45 54 45 0a 23 20 61 63 74 69 6f  N DELETE.# actio
116b0 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 65 61 6e 20  n does not mean 
116c0 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
116d0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
116e0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
116f0 0a 23 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  .# be satisfied.
11700 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
11710 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
11720 79 2d 34 39 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-49.1 {.  execs
11730 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
11740 54 41 42 4c 45 20 70 61 72 65 6e 74 28 61 20 43  TABLE parent(a C
11750 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 62  OLLATE nocase, b
11760 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
11770 28 63 2c 20 61 29 29 3b 0a 20 20 20 20 43 52 45  (c, a));.    CRE
11780 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
11790 64 20 44 45 46 41 55 4c 54 20 27 61 27 2c 20 65  d DEFAULT 'a', e
117a0 2c 20 66 20 44 45 46 41 55 4c 54 20 27 63 27 2c  , f DEFAULT 'c',
117b0 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
117c0 45 59 28 66 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(f, d) REFEREN
117d0 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
117e0 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  DATE SET DEFAULT
117f0 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53  .    );..    INS
11800 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
11810 56 41 4c 55 45 53 28 27 41 27 2c 20 27 62 27 2c  VALUES('A', 'b',
11820 20 27 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'c');.    INSER
11830 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
11840 4c 55 45 53 28 27 4f 4e 45 27 2c 20 27 74 77 6f  LUES('ONE', 'two
11850 27 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20  ', 'three');.   
11860 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
11870 6c 64 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c  ld VALUES('one',
11880 20 27 74 77 6f 27 2c 20 27 74 68 72 65 65 27 29   'two', 'three')
11890 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
118a0 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 32 20 7b  st e_fkey-49.2 {
118b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
118c0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
118d0 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
118e0 61 20 3d 20 27 27 20 57 48 45 52 45 20 61 20 3d  a = '' WHERE a =
118f0 20 27 6f 4e 65 27 3b 0a 20 20 20 20 20 20 53 45   'oNe';.      SE
11900 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c  LECT * FROM chil
11910 64 3b 0a 20 20 7d 0a 7d 20 7b 61 20 74 77 6f 20  d;.  }.} {a two 
11920 63 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  c}.do_test e_fke
11930 79 2d 34 39 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-49.3 {.  execs
11940 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
11950 4b 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  K;.    DELETE FR
11960 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
11970 61 20 3d 20 27 41 27 3b 0a 20 20 20 20 53 45 4c  a = 'A';.    SEL
11980 45 43 54 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e  ECT * FROM paren
11990 74 3b 0a 20 20 7d 0a 7d 20 7b 4f 4e 45 20 74 77  t;.  }.} {ONE tw
119a0 6f 20 74 68 72 65 65 7d 0a 64 6f 5f 74 65 73 74  o three}.do_test
119b0 20 65 5f 66 6b 65 79 2d 34 39 2e 34 20 7b 0a 20   e_fkey-49.4 {. 
119c0 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
119d0 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 61 20  TE parent SET a 
119e0 3d 20 27 27 20 57 48 45 52 45 20 61 20 3d 20 27  = '' WHERE a = '
119f0 6f 4e 65 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  oNe' }.} {1 {for
11a00 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
11a10 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23  int failed}}...#
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
11a70 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 38 35 36  ENCE-OF: R-11856
11a80 2d 31 39 38 33 36 0a 23 0a 23 20 54 65 73 74 20  -19836.#.# Test 
11a90 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20  an example from 
11aa0 74 68 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61  the "ON DELETE a
11ab0 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74  nd ON UPDATE Act
11ac0 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23  ions" section .#
11ad0 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e   of foreignkeys.
11ae0 68 74 6d 6c 2e 20 54 68 69 73 20 65 78 61 6d 70  html. This examp
11af0 6c 65 20 73 68 6f 77 73 20 74 68 61 74 20 61 64  le shows that ad
11b00 64 69 6e 67 20 61 6e 20 22 4f 4e 20 44 45 4c 45  ding an "ON DELE
11b10 54 45 20 44 45 46 41 55 4c 54 22 0a 23 20 63 6c  TE DEFAULT".# cl
11b20 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 61 62  ause does not ab
11b30 72 6f 67 61 74 65 20 74 68 65 20 6e 65 65 64 20  rogate the need 
11b40 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 66  to satisfy the f
11b50 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
11b60 72 61 69 6e 74 0a 23 20 28 52 2d 32 38 32 32 30  raint.# (R-28220
11b70 2d 34 36 36 39 34 29 2e 0a 23 0a 23 20 45 56 49  -46694)..#.# EVI
11b80 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 32 32  DENCE-OF: R-2822
11b90 30 2d 34 36 36 39 34 20 46 6f 72 20 65 78 61 6d  0-46694 For exam
11ba0 70 6c 65 2c 20 69 66 20 61 6e 20 22 4f 4e 20 44  ple, if an "ON D
11bb0 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c  ELETE SET DEFAUL
11bc0 54 22 0a 23 20 61 63 74 69 6f 6e 20 69 73 20 63  T".# action is c
11bd0 6f 6e 66 69 67 75 72 65 64 2c 20 62 75 74 20 74  onfigured, but t
11be0 68 65 72 65 20 69 73 20 6e 6f 20 72 6f 77 20 69  here is no row i
11bf0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
11c00 6c 65 20 74 68 61 74 0a 23 20 63 6f 72 72 65 73  le that.# corres
11c10 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 65 66  ponds to the def
11c20 61 75 6c 74 20 76 61 6c 75 65 73 20 6f 66 20 74  ault values of t
11c30 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c  he child key col
11c40 75 6d 6e 73 2c 20 64 65 6c 65 74 69 6e 67 20 61  umns, deleting a
11c50 0a 23 20 70 61 72 65 6e 74 20 6b 65 79 20 77 68  .# parent key wh
11c60 69 6c 65 20 64 65 70 65 6e 64 65 6e 74 20 63 68  ile dependent ch
11c70 69 6c 64 20 6b 65 79 73 20 65 78 69 73 74 20 73  ild keys exist s
11c80 74 69 6c 6c 20 63 61 75 73 65 73 20 61 20 66 6f  till causes a fo
11c90 72 65 69 67 6e 20 6b 65 79 0a 23 20 76 69 6f 6c  reign key.# viol
11ca0 61 74 69 6f 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c  ation..#.drop_al
11cb0 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
11cc0 20 65 5f 66 6b 65 79 2d 35 30 2e 31 20 7b 0a 20   e_fkey-50.1 {. 
11cd0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
11ce0 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74 69  REATE TABLE arti
11cf0 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73 74  st(.      artist
11d00 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50 52  id    INTEGER PR
11d10 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20  IMARY KEY, .    
11d20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45    artistname  TE
11d30 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  XT.    );.    CR
11d40 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b  EATE TABLE track
11d50 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64 20  (.      trackid 
11d60 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20      INTEGER,.   
11d70 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54     trackname   T
11d80 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63  EXT, .      trac
11d90 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 20  kartist INTEGER 
11da0 44 45 46 41 55 4c 54 20 30 20 52 45 46 45 52 45  DEFAULT 0 REFERE
11db0 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
11dc0 73 74 69 64 29 20 4f 4e 20 44 45 4c 45 54 45 20  stid) ON DELETE 
11dd0 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20  SET DEFAULT.    
11de0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11df0 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
11e00 28 33 2c 20 27 53 61 6d 6d 79 20 44 61 76 69 73  (3, 'Sammy Davis
11e10 20 4a 72 2e 27 29 3b 0a 20 20 20 20 49 4e 53 45   Jr.');.    INSE
11e20 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
11e30 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e 20 42 6f  LUES(14, 'Mr. Bo
11e40 6a 61 6e 67 6c 65 73 27 2c 20 33 29 3b 0a 20 20  jangles', 3);.  
11e50 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
11e60 5f 66 6b 65 79 2d 35 30 2e 32 20 7b 0a 20 20 63  _fkey-50.2 {.  c
11e70 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
11e80 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
11e90 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20  RE artistname = 
11ea0 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e  'Sammy Davis Jr.
11eb0 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ' }.} {1 {foreig
11ec0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
11ed0 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
11ee0 74 20 65 5f 66 6b 65 79 2d 35 30 2e 33 20 7b 0a  t e_fkey-50.3 {.
11ef0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11f00 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
11f10 73 74 20 56 41 4c 55 45 53 28 30 2c 20 27 55 6e  st VALUES(0, 'Un
11f20 6b 6e 6f 77 6e 20 41 72 74 69 73 74 27 29 3b 0a  known Artist');.
11f30 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
11f40 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74  artist WHERE art
11f50 69 73 74 6e 61 6d 65 20 3d 20 27 53 61 6d 6d 79  istname = 'Sammy
11f60 20 44 61 76 69 73 20 4a 72 2e 27 3b 0a 20 20 7d   Davis Jr.';.  }
11f70 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
11f80 66 6b 65 79 2d 35 30 2e 34 20 7b 0a 20 20 65 78  fkey-50.4 {.  ex
11f90 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
11fa0 20 46 52 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d   FROM artist }.}
11fb0 20 7b 30 20 7b 55 6e 6b 6e 6f 77 6e 20 41 72 74   {0 {Unknown Art
11fc0 69 73 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  ist}}.do_test e_
11fd0 66 6b 65 79 2d 35 30 2e 35 20 7b 0a 20 20 65 78  fkey-50.5 {.  ex
11fe0 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
11ff0 20 46 52 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20   FROM track }.} 
12000 7b 31 34 20 7b 4d 72 2e 20 42 6f 6a 61 6e 67 6c  {14 {Mr. Bojangl
12010 65 73 7d 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  es} 0}..#-------
12020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12060 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
12070 3a 20 52 2d 30 39 35 36 34 2d 32 32 31 37 30 0a  : R-09564-22170.
12080 23 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 74  #.# Check that t
12090 68 65 20 6f 72 64 65 72 20 6f 66 20 73 74 65 70  he order of step
120a0 73 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 6f  s in an UPDATE o
120b0 72 20 44 45 4c 45 54 45 20 6f 6e 20 61 20 70 61  r DELETE on a pa
120c0 72 65 6e 74 20 0a 23 20 74 61 62 6c 65 20 69 73  rent .# table is
120d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23   as follows:.#.#
120e0 20 20 20 31 2e 20 45 78 65 63 75 74 65 20 61 70     1. Execute ap
120f0 70 6c 69 63 61 62 6c 65 20 42 45 46 4f 52 45 20  plicable BEFORE 
12100 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
12110 2c 0a 23 20 20 20 32 2e 20 43 68 65 63 6b 20 6c  ,.#   2. Check l
12120 6f 63 61 6c 20 28 6e 6f 6e 20 66 6f 72 65 69 67  ocal (non foreig
12130 6e 20 6b 65 79 29 20 63 6f 6e 73 74 72 61 69 6e  n key) constrain
12140 74 73 2c 0a 23 20 20 20 33 2e 20 55 70 64 61 74  ts,.#   3. Updat
12150 65 20 6f 72 20 64 65 6c 65 74 65 20 74 68 65 20  e or delete the 
12160 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e  row in the paren
12170 74 20 74 61 62 6c 65 2c 0a 23 20 20 20 34 2e 20  t table,.#   4. 
12180 50 65 72 66 6f 72 6d 20 61 6e 79 20 72 65 71 75  Perform any requ
12190 69 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ired foreign key
121a0 20 61 63 74 69 6f 6e 73 2c 0a 23 20 20 20 35 2e   actions,.#   5.
121b0 20 45 78 65 63 75 74 65 20 61 70 70 6c 69 63 61   Execute applica
121c0 62 6c 65 20 41 46 54 45 52 20 74 72 69 67 67 65  ble AFTER trigge
121d0 72 20 70 72 6f 67 72 61 6d 73 2e 20 0a 23 0a 64  r programs. .#.d
121e0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
121f0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 31  o_test e_fkey-51
12200 2e 31 20 7b 0a 20 20 70 72 6f 63 20 6d 61 78 70  .1 {.  proc maxp
12210 61 72 65 6e 74 20 7b 61 72 67 73 7d 20 7b 20 64  arent {args} { d
12220 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 61  b one {SELECT ma
12230 78 28 78 29 20 46 52 4f 4d 20 70 61 72 65 6e 74  x(x) FROM parent
12240 7d 20 7d 0a 20 20 64 62 20 66 75 6e 63 20 6d 61  } }.  db func ma
12250 78 70 61 72 65 6e 74 20 6d 61 78 70 61 72 65 6e  xparent maxparen
12260 74 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  t..  execsql {. 
12270 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12280 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59  parent(x PRIMARY
12290 20 4b 45 59 29 3b 0a 0a 20 20 20 20 43 52 45 41   KEY);..    CREA
122a0 54 45 20 54 52 49 47 47 45 52 20 62 75 20 42 45  TE TRIGGER bu BE
122b0 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 70  FORE UPDATE ON p
122c0 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20  arent BEGIN.    
122d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
122e0 72 65 6e 74 20 56 41 4c 55 45 53 28 6e 65 77 2e  rent VALUES(new.
122f0 78 2d 6f 6c 64 2e 78 29 3b 0a 20 20 20 20 45 4e  x-old.x);.    EN
12300 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  D;.    CREATE TA
12310 42 4c 45 20 63 68 69 6c 64 28 0a 20 20 20 20 20  BLE child(.     
12320 20 61 20 44 45 46 41 55 4c 54 20 28 6d 61 78 70   a DEFAULT (maxp
12330 61 72 65 6e 74 28 29 29 20 52 45 46 45 52 45 4e  arent()) REFEREN
12340 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
12350 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  DATE SET DEFAULT
12360 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
12370 54 45 20 54 52 49 47 47 45 52 20 61 75 20 41 46  TE TRIGGER au AF
12380 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 70 61  TER UPDATE ON pa
12390 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20  rent BEGIN.     
123a0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
123b0 65 6e 74 20 56 41 4c 55 45 53 28 6e 65 77 2e 78  ent VALUES(new.x
123c0 2b 6f 6c 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44  +old.x);.    END
123d0 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
123e0 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
123f0 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (1);.    INSERT 
12400 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45  INTO child VALUE
12410 53 28 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  S(1);.  }.} {}.d
12420 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 31  o_test e_fkey-51
12430 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
12440 0a 20 20 20 20 55 50 44 41 54 45 20 70 61 72 65  .    UPDATE pare
12450 6e 74 20 53 45 54 20 78 20 3d 20 32 32 3b 0a 20  nt SET x = 22;. 
12460 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
12470 20 70 61 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c   parent UNION AL
12480 4c 20 53 45 4c 45 43 54 20 27 78 78 78 27 20 55  L SELECT 'xxx' U
12490 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
124a0 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20  a FROM child;.  
124b0 7d 0a 7d 20 7b 32 32 20 32 31 20 32 33 20 78 78  }.} {22 21 23 xx
124c0 78 20 32 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  x 22}.do_test e_
124d0 66 6b 65 79 2d 35 31 2e 33 20 7b 0a 20 20 65 78  fkey-51.3 {.  ex
124e0 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
124f0 54 45 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20  TE FROM child;. 
12500 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
12510 61 72 65 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52  arent;.    INSER
12520 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
12530 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20 20 49 4e  LUES(-1);.    IN
12540 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20  SERT INTO child 
12550 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20 20  VALUES(-1);.    
12560 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
12570 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20 53 45  T x = 22;.    SE
12580 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61 72 65  LECT * FROM pare
12590 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  nt UNION ALL SEL
125a0 45 43 54 20 27 78 78 78 27 20 55 4e 49 4f 4e 20  ECT 'xxx' UNION 
125b0 41 4c 4c 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ALL SELECT a FRO
125c0 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b  M child;.  }.} {
125d0 32 32 20 32 33 20 32 31 20 78 78 78 20 32 33 7d  22 23 21 xxx 23}
125e0 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12630 56 65 72 69 66 79 20 74 68 61 74 20 4f 4e 20 55  Verify that ON U
12640 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20 6f 6e  PDATE actions on
12650 6c 79 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65  ly actually take
12660 20 70 6c 61 63 65 20 69 66 20 74 68 65 20 70 61   place if the pa
12670 72 65 6e 74 20 6b 65 79 0a 23 20 69 73 20 73 65  rent key.# is se
12680 74 20 74 6f 20 61 20 6e 65 77 20 76 61 6c 75 65  t to a new value
12690 20 74 68 61 74 20 69 73 20 64 69 73 74 69 6e 63   that is distinc
126a0 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20 76  t from the old v
126b0 61 6c 75 65 2e 20 54 68 65 20 64 65 66 61 75 6c  alue. The defaul
126c0 74 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  t.# collation se
126d0 71 75 65 6e 63 65 20 61 6e 64 20 61 66 66 69 6e  quence and affin
126e0 69 74 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  ity are used to 
126f0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
12700 20 6e 65 77 20 76 61 6c 75 65 0a 23 20 69 73 20   new value.# is 
12710 27 64 69 73 74 69 6e 63 74 27 20 66 72 6f 6d 20  'distinct' from 
12720 74 68 65 20 6f 6c 64 20 6f 72 20 6e 6f 74 2e 0a  the old or not..
12730 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
12740 20 52 2d 32 37 33 38 33 2d 31 30 32 34 36 20 41   R-27383-10246 A
12750 6e 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  n ON UPDATE acti
12760 6f 6e 20 69 73 20 6f 6e 6c 79 20 74 61 6b 65 6e  on is only taken
12770 20 69 66 20 74 68 65 0a 23 20 76 61 6c 75 65 73   if the.# values
12780 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   of the parent k
12790 65 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  ey are modified 
127a0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
127b0 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 76 61 6c  parent key.# val
127c0 75 65 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  ues are not equa
127d0 6c 20 74 6f 20 74 68 65 20 6f 6c 64 2e 0a 23 0a  l to the old..#.
127e0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
127f0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12800 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
12810 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
12820 4c 45 20 7a 65 75 73 28 61 20 49 4e 54 45 47 45  LE zeus(a INTEGE
12830 52 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  R COLLATE NOCASE
12840 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
12850 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45  (a, b));.    CRE
12860 41 54 45 20 54 41 42 4c 45 20 61 70 6f 6c 6c 6f  ATE TABLE apollo
12870 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f  (c, d, .      FO
12880 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
12890 52 45 46 45 52 45 4e 43 45 53 20 7a 65 75 73 20  REFERENCES zeus 
128a0 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
128b0 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  E.    );.    INS
128c0 45 52 54 20 49 4e 54 4f 20 7a 65 75 73 20 56 41  ERT INTO zeus VA
128d0 4c 55 45 53 28 27 61 62 63 27 2c 20 27 78 79 7a  LUES('abc', 'xyz
128e0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
128f0 4e 54 4f 20 61 70 6f 6c 6c 6f 20 56 41 4c 55 45  NTO apollo VALUE
12900 53 28 27 41 42 43 27 2c 20 27 78 79 7a 27 29 3b  S('ABC', 'xyz');
12910 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
12920 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73  .    UPDATE zeus
12930 20 53 45 54 20 61 20 3d 20 27 61 42 63 27 3b 0a   SET a = 'aBc';.
12940 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12950 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20  M apollo;.  }.} 
12960 7b 41 42 43 20 78 79 7a 7d 0a 64 6f 5f 74 65 73  {ABC xyz}.do_tes
12970 74 20 65 5f 66 6b 65 79 2d 35 32 2e 32 20 7b 0a  t e_fkey-52.2 {.
12980 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12990 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20  UPDATE zeus SET 
129a0 61 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20  a = 1, b = 1;.  
129b0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
129c0 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 31  apollo;.  }.} {1
129d0 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
129e0 65 79 2d 35 32 2e 33 20 7b 0a 20 20 65 78 65 63  ey-52.3 {.  exec
129f0 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12a00 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20 31 2c   zeus SET a = 1,
12a10 20 62 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   b = 1;.    SELE
12a20 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c  CT typeof(c), c,
12a30 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52   typeof(d), d FR
12a40 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12a50 20 7b 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65   {integer 1 inte
12a60 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65  ger 1}.do_test e
12a70 5f 66 6b 65 79 2d 35 32 2e 34 20 7b 0a 20 20 65  _fkey-52.4 {.  e
12a80 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
12a90 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d  ATE zeus SET a =
12aa0 20 27 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54   '1';.    SELECT
12ab0 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74   typeof(c), c, t
12ac0 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d  ypeof(d), d FROM
12ad0 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b   apollo;.  }.} {
12ae0 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67 65  integer 1 intege
12af0 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  r 1}.do_test e_f
12b00 6b 65 79 2d 35 32 2e 35 20 7b 0a 20 20 65 78 65  key-52.5 {.  exe
12b10 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12b20 45 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 27  E zeus SET b = '
12b30 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  1';.    SELECT t
12b40 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70  ypeof(c), c, typ
12b50 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61  eof(d), d FROM a
12b60 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  pollo;.  }.} {in
12b70 74 65 67 65 72 20 31 20 74 65 78 74 20 31 7d 0a  teger 1 text 1}.
12b80 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12b90 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
12ba0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75  {.    UPDATE zeu
12bb0 73 20 53 45 54 20 62 20 3d 20 4e 55 4c 4c 3b 0a  s SET b = NULL;.
12bc0 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
12bd0 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28  f(c), c, typeof(
12be0 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c  d), d FROM apoll
12bf0 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  o;.  }.} {intege
12c00 72 20 31 20 6e 75 6c 6c 20 7b 7d 7d 0a 0a 23 2d  r 1 null {}}..#-
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
12c60 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 31 32 39 2d  NCE-OF: R-35129-
12c70 35 38 31 34 31 0a 23 0a 23 20 54 65 73 74 20 61  58141.#.# Test a
12c80 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74  n example from t
12c90 68 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e  he "ON DELETE an
12ca0 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69  d ON UPDATE Acti
12cb0 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23 20  ons" section .# 
12cc0 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68  of foreignkeys.h
12cd0 74 6d 6c 2e 20 54 68 69 73 20 65 78 61 6d 70 6c  tml. This exampl
12ce0 65 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74  e demonstrates t
12cf0 68 61 74 20 4f 4e 20 55 50 44 41 54 45 20 61 63  hat ON UPDATE ac
12d00 74 69 6f 6e 73 0a 23 20 6f 6e 6c 79 20 74 61 6b  tions.# only tak
12d10 65 20 70 6c 61 63 65 20 69 66 20 61 74 20 6c 65  e place if at le
12d20 61 73 74 20 6f 6e 65 20 70 61 72 65 6e 74 20 6b  ast one parent k
12d30 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 73 65 74  ey column is set
12d40 20 74 6f 20 61 20 76 61 6c 75 65 20 0a 23 20 74   to a value .# t
12d50 68 61 74 20 69 73 20 64 69 73 74 69 6e 63 74 20  hat is distinct 
12d60 66 72 6f 6d 20 69 74 73 20 70 72 65 76 69 6f 75  from its previou
12d70 73 20 76 61 6c 75 65 2e 0a 23 0a 64 72 6f 70 5f  s value..#.drop_
12d80 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
12d90 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 31 20 7b  st e_fkey-53.1 {
12da0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12db0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
12dc0 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b  rent(x PRIMARY K
12dd0 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
12de0 54 41 42 4c 45 20 63 68 69 6c 64 28 79 20 52 45  TABLE child(y RE
12df0 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
12e00 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55  ON UPDATE SET NU
12e10 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
12e20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
12e30 45 53 28 27 6b 65 79 27 29 3b 0a 20 20 20 20 49  ES('key');.    I
12e40 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
12e50 20 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a   VALUES('key');.
12e60 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
12e70 20 65 5f 66 6b 65 79 2d 35 33 2e 32 20 7b 0a 20   e_fkey-53.2 {. 
12e80 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
12e90 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
12ea0 20 78 20 3d 20 27 6b 65 79 27 3b 0a 20 20 20 20   x = 'key';.    
12eb0 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c  SELECT IFNULL(y,
12ec0 20 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68   'null') FROM ch
12ed0 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79 7d  ild;.  }.} {key}
12ee0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
12ef0 35 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  53.3 {.  execsql
12f00 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61   {.    UPDATE pa
12f10 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
12f20 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  y2';.    SELECT 
12f30 49 46 4e 55 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27  IFNULL(y, 'null'
12f40 29 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20  ) FROM child;.  
12f50 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 23 23 23  }.} {null}..####
12f60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fa0 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
12fb0 49 4f 4e 20 35 3a 20 43 52 45 41 54 45 2c 20 41  ION 5: CREATE, A
12fc0 4c 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54 41  LTER and DROP TA
12fd0 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 0a 23 23 23  BLE commands.###
12fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12ff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13020 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
13080 20 70 61 72 65 6e 74 20 6b 65 79 73 20 61 72 65   parent keys are
13090 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65   not checked whe
130a0 6e 20 74 61 62 6c 65 73 20 61 72 65 20 63 72 65  n tables are cre
130b0 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ated..#.# EVIDEN
130c0 43 45 2d 4f 46 3a 20 52 2d 33 36 30 31 38 2d 32  CE-OF: R-36018-2
130d0 31 37 35 35 20 54 68 65 20 70 61 72 65 6e 74 20  1755 The parent 
130e0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  key definitions 
130f0 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23  of foreign key.#
13100 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
13110 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65   not checked whe
13120 6e 20 61 20 74 61 62 6c 65 20 69 73 20 63 72 65  n a table is cre
13130 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ated..#.# EVIDEN
13140 43 45 2d 4f 46 3a 20 52 2d 32 35 33 38 34 2d 33  CE-OF: R-25384-3
13150 39 33 33 37 20 54 68 65 72 65 20 69 73 20 6e 6f  9337 There is no
13160 74 68 69 6e 67 20 73 74 6f 70 70 69 6e 67 20 74  thing stopping t
13170 68 65 20 75 73 65 72 20 66 72 6f 6d 0a 23 20 63  he user from.# c
13180 72 65 61 74 69 6e 67 20 61 20 66 6f 72 65 69 67  reating a foreig
13190 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
131a0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
131b0 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 74  a parent table t
131c0 68 61 74 0a 23 20 64 6f 65 73 20 6e 6f 74 20 65  hat.# does not e
131d0 78 69 73 74 2c 20 6f 72 20 74 6f 20 70 61 72 65  xist, or to pare
131e0 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 74  nt key columns t
131f0 68 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  hat do not exist
13200 20 6f 72 20 61 72 65 20 6e 6f 74 0a 23 20 63 6f   or are not.# co
13210 6c 6c 65 63 74 69 76 65 6c 79 20 62 6f 75 6e 64  llectively bound
13220 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
13230 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
13240 74 72 61 69 6e 74 2e 0a 23 0a 23 20 43 68 69 6c  traint..#.# Chil
13250 64 20 6b 65 79 73 20 61 72 65 20 63 68 65 63 6b  d keys are check
13260 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c  ed to ensure all
13270 20 63 6f 6d 70 6f 6e 65 6e 74 20 63 6f 6c 75 6d   component colum
13280 6e 73 20 65 78 69 73 74 2e 20 49 66 20 70 61 72  ns exist. If par
13290 65 6e 74 0a 23 20 6b 65 79 20 63 6f 6c 75 6d 6e  ent.# key column
132a0 73 20 61 72 65 20 65 78 70 6c 69 63 69 74 6c 79  s are explicitly
132b0 20 73 70 65 63 69 66 69 65 64 2c 20 53 51 4c 69   specified, SQLi
132c0 74 65 20 63 68 65 63 6b 73 20 74 6f 20 6d 61 6b  te checks to mak
132d0 65 20 73 75 72 65 20 74 68 65 72 65 0a 23 20 61  e sure there.# a
132e0 72 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  re the same numb
132f0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13300 20 74 68 65 20 63 68 69 6c 64 20 61 6e 64 20 70   the child and p
13310 61 72 65 6e 74 20 6b 65 79 73 2e 20 28 54 4f 44  arent keys. (TOD
13320 4f 3a 20 54 68 69 73 0a 23 20 69 73 20 74 65 73  O: This.# is tes
13330 74 65 64 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ted but does not
13340 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61   correspond to a
13350 6e 79 20 74 65 73 74 61 62 6c 65 20 73 74 61 74  ny testable stat
13360 65 6d 65 6e 74 2e 29 0a 23 0a 23 20 41 6c 73 6f  ement.).#.# Also
13370 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20 61   test that the a
13380 62 6f 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  bove statements 
13390 61 72 65 20 74 72 75 65 20 72 65 67 61 72 64 6c  are true regardl
133a0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
133b0 72 20 6e 6f 74 0a 23 20 66 6f 72 65 69 67 6e 20  r not.# foreign 
133c0 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64  keys are enabled
133d0 3a 20 20 22 41 20 43 52 45 41 54 45 20 54 41 42  :  "A CREATE TAB
133e0 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61  LE command opera
133f0 74 65 73 20 74 68 65 20 73 61 6d 65 20 77 68 65  tes the same whe
13400 74 68 65 72 0a 23 20 6f 72 20 6e 6f 74 20 66 6f  ther.# or not fo
13410 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
13420 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
13430 64 2e 22 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  d.".#.# EVIDENCE
13440 2d 4f 46 3a 20 52 2d 30 38 39 30 38 2d 32 33 34  -OF: R-08908-234
13450 33 39 20 41 20 43 52 45 41 54 45 20 54 41 42 4c  39 A CREATE TABL
13460 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74  E command operat
13470 65 73 20 74 68 65 20 73 61 6d 65 0a 23 20 77 68  es the same.# wh
13480 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f 72  ether or not for
13490 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
134a0 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ints are enabled
134b0 2e 0a 23 20 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ..# .foreach {tn
134c0 20 7a 43 72 65 61 74 65 54 62 6c 20 6c 52 65 73   zCreateTbl lRes
134d0 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45 20  } {.  1 "CREATE 
134e0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52 45  TABLE t1(a, b RE
134f0 46 45 52 45 4e 43 45 53 20 74 31 29 22 20 20 20  FERENCES t1)"   
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13520 20 20 32 20 22 43 52 45 41 54 45 20 54 41 42 4c    2 "CREATE TABL
13530 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45  E t1(a, b REFERE
13540 4e 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20  NCES t2)"       
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 33 20       {0 {}}.  3 
13570 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13580 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13590 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
135a0 45 53 20 74 31 29 22 20 20 20 20 20 20 20 20 20  ES t1)"         
135b0 20 7b 30 20 7b 7d 7d 0a 20 20 34 20 22 43 52 45   {0 {}}.  4 "CRE
135c0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
135d0 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
135e0 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
135f0 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  2)"          {0 
13600 7b 7d 7d 0a 20 20 35 20 22 43 52 45 41 54 45 20  {}}.  5 "CREATE 
13610 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
13620 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
13630 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20  REFERENCES t2)" 
13640 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13650 20 20 36 20 22 43 52 45 41 54 45 20 54 41 42 4c    6 "CREATE TABL
13660 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13670 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13680 52 45 4e 43 45 53 20 74 32 28 6e 2c 64 29 29 22  RENCES t2(n,d))"
13690 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 37 20       {0 {}}.  7 
136a0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
136b0 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
136c0 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
136d0 45 53 20 74 31 28 61 2c 62 29 29 22 20 20 20 20  ES t1(a,b))"    
136e0 20 7b 30 20 7b 7d 7d 0a 0a 20 20 41 20 22 43 52   {0 {}}..  A "CR
136f0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
13700 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
13710 63 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  c,b) REFERENCES 
13720 74 32 29 22 20 20 20 20 20 20 20 20 20 20 0a 20  t2)"          . 
13730 20 20 20 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20      {1 {unknown 
13740 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f  column "c" in fo
13750 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
13760 74 69 6f 6e 7d 7d 0a 20 20 42 20 22 43 52 45 41  tion}}.  B "CREA
13770 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
13780 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
13790 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  b) REFERENCES t2
137a0 28 64 29 29 22 20 20 20 20 20 20 20 20 20 20 0a  (d))"          .
137b0 20 20 20 20 20 7b 31 20 7b 6e 75 6d 62 65 72 20       {1 {number 
137c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
137d0 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
137e0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
137f0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
13800 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
13810 20 74 61 62 6c 65 7d 7d 0a 7d 20 7b 0a 20 20 64   table}}.} {.  d
13820 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 34  o_test e_fkey-54
13830 2e 24 74 6e 2e 6f 66 66 20 7b 0a 20 20 20 20 64  .$tn.off {.    d
13840 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
13850 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47     execsql {PRAG
13860 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
13870 3d 20 4f 46 46 7d 0a 20 20 20 20 63 61 74 63 68  = OFF}.    catch
13880 73 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a  sql $zCreateTbl.
13890 20 20 7d 20 24 6c 52 65 73 0a 20 20 64 6f 5f 74    } $lRes.  do_t
138a0 65 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24 74  est e_fkey-54.$t
138b0 6e 2e 6f 6e 20 7b 0a 20 20 20 20 64 72 6f 70 5f  n.on {.    drop_
138c0 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65  all_tables.    e
138d0 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
138e0 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
138f0 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 24  }.    catchsql $
13900 7a 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20 24  zCreateTbl.  } $
13910 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lRes.}..#-------
13920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13960 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
13970 3a 20 52 2d 34 37 39 35 32 2d 36 32 34 39 38 20  : R-47952-62498 
13980 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
13990 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 22 41  le to use the "A
139a0 4c 54 45 52 20 54 41 42 4c 45 0a 23 20 2e 2e 2e  LTER TABLE.# ...
139b0 20 41 44 44 20 43 4f 4c 55 4d 4e 22 20 73 79 6e   ADD COLUMN" syn
139c0 74 61 78 20 74 6f 20 61 64 64 20 61 20 63 6f 6c  tax to add a col
139d0 75 6d 6e 20 74 68 61 74 20 69 6e 63 6c 75 64 65  umn that include
139e0 73 20 61 20 52 45 46 45 52 45 4e 43 45 53 0a 23  s a REFERENCES.#
139f0 20 63 6c 61 75 73 65 2c 20 75 6e 6c 65 73 73 20   clause, unless 
13a00 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
13a10 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f 6c  e of the new col
13a20 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 20 41 74 74  umn is NULL. Att
13a30 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 64 6f 20  empting.# to do 
13a40 73 6f 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  so returns an er
13a50 72 6f 72 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74  ror..#.proc test
13a60 5f 65 66 6b 65 79 5f 36 20 7b 74 6e 20 7a 41 6c  _efkey_6 {tn zAl
13a70 74 65 72 20 69 73 45 72 72 6f 72 7d 20 7b 0a 20  ter isError} {. 
13a80 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
13a90 20 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   ..  do_test e_f
13aa0 6b 65 79 2d 35 36 2e 24 74 6e 2e 31 20 22 0a 20  key-56.$tn.1 ". 
13ab0 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45     execsql { CRE
13ac0 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c  ATE TABLE tbl(a,
13ad0 20 62 29 20 7d 0a 20 20 20 20 5b 6c 69 73 74 20   b) }.    [list 
13ae0 63 61 74 63 68 73 71 6c 20 24 7a 41 6c 74 65 72  catchsql $zAlter
13af0 5d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b  ].  " [lindex {{
13b00 30 20 7b 7d 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74  0 {}} {1 {Cannot
13b10 20 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45   add a REFERENCE
13b20 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f  S column with no
13b30 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76  n-NULL default v
13b40 61 6c 75 65 7d 7d 7d 20 24 69 73 45 72 72 6f 72  alue}}} $isError
13b50 5d 0a 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79  ]..}..test_efkey
13b60 5f 36 20 31 20 22 41 4c 54 45 52 20 54 41 42 4c  _6 1 "ALTER TABL
13b70 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e  E tbl ADD COLUMN
13b80 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 78 78   c REFERENCES xx
13b90 22 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  " 0.test_efkey_6
13ba0 20 32 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20   2 "ALTER TABLE 
13bb0 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63  tbl ADD COLUMN c
13bc0 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45   DEFAULT NULL RE
13bd0 46 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a 74  FERENCES xx" 0.t
13be0 65 73 74 5f 65 66 6b 65 79 5f 36 20 33 20 22 41  est_efkey_6 3 "A
13bf0 4c 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20 41  LTER TABLE tbl A
13c00 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41  DD COLUMN c DEFA
13c10 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45 53  ULT 0 REFERENCES
13c20 20 78 78 22 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   xx" 1..#-------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c70 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 41  --.# Test that A
13c80 4c 54 45 52 20 54 41 42 4c 45 20 61 64 6a 75 73  LTER TABLE adjus
13c90 74 73 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c  ts REFERENCES cl
13ca0 61 75 73 65 73 20 77 68 65 6e 20 74 68 65 20 70  auses when the p
13cb0 61 72 65 6e 74 20 74 61 62 6c 65 0a 23 20 69 73  arent table.# is
13cc0 20 52 45 4e 41 4d 45 44 2e 0a 23 0a 23 20 45 56   RENAMED..#.# EV
13cd0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 30  IDENCE-OF: R-470
13ce0 38 30 2d 30 32 30 36 39 20 49 66 20 61 6e 20 22  80-02069 If an "
13cf0 41 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20  ALTER TABLE ... 
13d00 52 45 4e 41 4d 45 20 54 4f 22 20 63 6f 6d 6d 61  RENAME TO" comma
13d10 6e 64 0a 23 20 69 73 20 75 73 65 64 20 74 6f 20  nd.# is used to 
13d20 72 65 6e 61 6d 65 20 61 20 74 61 62 6c 65 20 74  rename a table t
13d30 68 61 74 20 69 73 20 74 68 65 20 70 61 72 65 6e  hat is the paren
13d40 74 20 74 61 62 6c 65 20 6f 66 20 6f 6e 65 20 6f  t table of one o
13d50 72 20 6d 6f 72 65 0a 23 20 66 6f 72 65 69 67 6e  r more.# foreign
13d60 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
13d70 2c 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  , the definition
13d80 73 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  s of the foreign
13d90 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e   key.# constrain
13da0 74 73 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  ts are modified 
13db0 74 6f 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  to refer to the 
13dc0 70 61 72 65 6e 74 20 74 61 62 6c 65 20 62 79 20  parent table by 
13dd0 69 74 73 20 6e 65 77 20 6e 61 6d 65 0a 23 0a 23  its new name.#.#
13de0 20 54 65 73 74 20 74 68 61 74 20 74 68 65 73 65   Test that these
13df0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 61 72 65   adjustments are
13e00 20 76 69 73 69 62 6c 65 20 69 6e 20 74 68 65 20   visible in the 
13e10 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
13e20 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ble..#.# EVIDENC
13e30 45 2d 4f 46 3a 20 52 2d 36 33 38 32 37 2d 35 34  E-OF: R-63827-54
13e40 37 37 34 20 54 68 65 20 74 65 78 74 20 6f 66 20  774 The text of 
13e50 74 68 65 20 63 68 69 6c 64 20 43 52 45 41 54 45  the child CREATE
13e60 20 54 41 42 4c 45 0a 23 20 73 74 61 74 65 6d 65   TABLE.# stateme
13e70 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  nt or statements
13e80 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
13e90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
13ea0 6c 65 20 61 72 65 20 6d 6f 64 69 66 69 65 64 0a  le are modified.
13eb0 23 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  # to reflect the
13ec0 20 6e 65 77 20 70 61 72 65 6e 74 20 74 61 62 6c   new parent tabl
13ed0 65 20 6e 61 6d 65 2e 0a 23 0a 64 6f 5f 74 65 73  e name..#.do_tes
13ee0 74 20 65 5f 66 6b 65 79 2d 35 36 2e 31 20 7b 0a  t e_fkey-56.1 {.
13ef0 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
13f00 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
13f10 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 27    CREATE TABLE '
13f20 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
13f30 27 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 27  '(a REFERENCES '
13f40 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
13f50 27 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  ', b, PRIMARY KE
13f60 59 28 62 29 29 3b 0a 0a 20 20 20 20 43 52 45 41  Y(b));..    CREA
13f70 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64  TE TABLE c1(c, d
13f80 20 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31   REFERENCES 'p 1
13f90 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f   "parent one"' O
13fa0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
13fb0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
13fc0 42 4c 45 20 63 32 28 65 2c 20 66 2c 20 46 4f 52  BLE c2(e, f, FOR
13fd0 45 49 47 4e 20 4b 45 59 28 66 29 20 52 45 46 45  EIGN KEY(f) REFE
13fe0 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72  RENCES 'p 1 "par
13ff0 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44  ent one"' ON UPD
14000 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20  ATE CASCADE);.  
14010 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14020 33 28 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20  3(e, 'f col 2', 
14030 46 4f 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63  FOREIGN KEY('f c
14040 6f 6c 20 32 27 29 20 52 45 46 45 52 45 4e 43 45  ol 2') REFERENCE
14050 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f  S 'p 1 "parent o
14060 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43  ne"' ON UPDATE C
14070 41 53 43 41 44 45 29 3b 0a 0a 20 20 20 20 49 4e  ASCADE);..    IN
14080 53 45 52 54 20 49 4e 54 4f 20 27 70 20 31 20 22  SERT INTO 'p 1 "
14090 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 56 41 4c  parent one"' VAL
140a0 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49  UES(1, 1);.    I
140b0 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
140c0 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20  LUES(1, 1);.    
140d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
140e0 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20  ALUES(1, 1);.   
140f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
14100 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 0a 20  VALUES(1, 1);.. 
14110 20 20 20 2d 2d 20 43 52 45 41 54 45 20 54 41 42     -- CREATE TAB
14120 4c 45 20 71 28 61 2c 20 62 2c 20 50 52 49 4d 41  LE q(a, b, PRIMA
14130 52 59 20 4b 45 59 28 62 29 29 3b 0a 20 20 7d 0a  RY KEY(b));.  }.
14140 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
14150 6b 65 79 2d 35 36 2e 32 20 7b 0a 20 20 65 78 65  key-56.2 {.  exe
14160 63 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  csql { ALTER TAB
14170 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  LE 'p 1 "parent 
14180 6f 6e 65 22 27 20 52 45 4e 41 4d 45 20 54 4f 20  one"' RENAME TO 
14190 70 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  p }.} {}.do_test
141a0 20 65 5f 66 6b 65 79 2d 35 36 2e 33 20 7b 0a 20   e_fkey-56.3 {. 
141b0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
141c0 50 44 41 54 45 20 70 20 53 45 54 20 61 20 3d 20  PDATE p SET a = 
141d0 27 78 78 78 27 2c 20 62 20 3d 20 27 78 78 78 27  'xxx', b = 'xxx'
141e0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
141f0 52 4f 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45 43  ROM p;.    SELEC
14200 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 20  T * FROM c1;.   
14210 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
14220 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
14230 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 7d 20 7b  FROM c3;.  }.} {
14240 78 78 78 20 78 78 78 20 31 20 78 78 78 20 31 20  xxx xxx 1 xxx 1 
14250 78 78 78 20 31 20 78 78 78 7d 0a 64 6f 5f 74 65  xxx 1 xxx}.do_te
14260 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 34 20 7b  st e_fkey-56.4 {
14270 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
14280 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
14290 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
142a0 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d   type = 'table'}
142b0 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  .} [list        
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
14300 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   {CREATE TABLE "
14310 70 22 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  p"(a REFERENCES 
14320 22 70 22 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  "p", b, PRIMARY 
14330 4b 45 59 28 62 29 29 7d 20 20 20 20 20 20 20 20  KEY(b))}        
14340 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b             \.  {
14350 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
14360 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20  c, d REFERENCES 
14370 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41  "p" ON UPDATE CA
14380 53 43 41 44 45 29 7d 20 20 20 20 20 20 20 20 20  SCADE)}         
14390 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52           \.  {CR
143a0 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 65 2c  EATE TABLE c2(e,
143b0 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   f, FOREIGN KEY(
143c0 66 29 20 52 45 46 45 52 45 4e 43 45 53 20 22 70  f) REFERENCES "p
143d0 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  " ON UPDATE CASC
143e0 41 44 45 29 7d 20 20 5c 0a 20 20 7b 43 52 45 41  ADE)}  \.  {CREA
143f0 54 45 20 54 41 42 4c 45 20 63 33 28 65 2c 20 27  TE TABLE c3(e, '
14400 66 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45 49 47  f col 2', FOREIG
14410 4e 20 4b 45 59 28 27 66 20 63 6f 6c 20 32 27 29  N KEY('f col 2')
14420 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 20   REFERENCES "p" 
14430 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
14440 45 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d 2d  E)} \.]..#------
14450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14490 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
144a0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f   a DROP TABLE do
144b0 65 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44  es an implicit D
144c0 45 4c 45 54 45 20 46 52 4f 4d 2e 20 57 68 69 63  ELETE FROM. Whic
144d0 68 20 64 6f 65 73 20 6e 6f 74 0a 23 20 63 61 75  h does not.# cau
144e0 73 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20  se any triggers 
144f0 74 6f 20 66 69 72 65 2c 20 62 75 74 20 64 6f 65  to fire, but doe
14500 73 20 66 69 72 65 20 66 6f 72 65 69 67 6e 20 6b  s fire foreign k
14510 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20  ey actions..#.# 
14520 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
14530 34 32 30 38 2d 32 33 39 38 36 20 49 66 20 66 6f  4208-23986 If fo
14540 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14550 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
14560 64 20 77 68 65 6e 0a 23 20 69 74 20 69 73 20 70  d when.# it is p
14570 72 65 70 61 72 65 64 2c 20 74 68 65 20 44 52 4f  repared, the DRO
14580 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20  P TABLE command 
14590 70 65 72 66 6f 72 6d 73 20 61 6e 20 69 6d 70 6c  performs an impl
145a0 69 63 69 74 20 44 45 4c 45 54 45 20 74 6f 0a 23  icit DELETE to.#
145b0 20 72 65 6d 6f 76 65 20 61 6c 6c 20 72 6f 77 73   remove all rows
145c0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
145d0 62 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67 20  before dropping 
145e0 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  it..#.# EVIDENCE
145f0 2d 4f 46 3a 20 52 2d 31 31 30 37 38 2d 30 33 39  -OF: R-11078-039
14600 34 35 20 54 68 65 20 69 6d 70 6c 69 63 69 74 20  45 The implicit 
14610 44 45 4c 45 54 45 20 64 6f 65 73 20 6e 6f 74 20  DELETE does not 
14620 63 61 75 73 65 20 61 6e 79 20 53 51 4c 0a 23 20  cause any SQL.# 
14630 74 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65  triggers to fire
14640 2c 20 62 75 74 20 6d 61 79 20 69 6e 76 6f 6b 65  , but may invoke
14650 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
14660 69 6f 6e 73 20 6f 72 20 63 6f 6e 73 74 72 61 69  ions or constrai
14670 6e 74 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 73 2e  nt.# violations.
14680 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
14690 79 2d 35 37 2e 31 20 7b 0a 20 20 64 72 6f 70 5f  y-57.1 {.  drop_
146a0 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
146b0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
146c0 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20  E TABLE p(a, b, 
146d0 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
146e0 29 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ));..    CREATE 
146f0 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46  TABLE c1(c, d, F
14700 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14710 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14720 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
14730 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14740 42 4c 45 20 63 32 28 63 2c 20 64 2c 20 46 4f 52  BLE c2(c, d, FOR
14750 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
14760 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44  EFERENCES p ON D
14770 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c  ELETE SET DEFAUL
14780 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
14790 41 42 4c 45 20 63 33 28 63 2c 20 64 2c 20 46 4f  ABLE c3(c, d, FO
147a0 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
147b0 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
147c0 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b  DELETE CASCADE);
147d0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
147e0 45 20 63 34 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c4(c, d, FOREI
147f0 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
14800 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14810 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20  ETE RESTRICT);. 
14820 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14830 63 35 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c5(c, d, FOREIGN
14840 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
14850 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54  ENCES p ON DELET
14860 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20  E NO ACTION);.. 
14870 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14880 63 36 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20  c6(c, d, .      
14890 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
148a0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  ) REFERENCES p O
148b0 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
148c0 54 20 0a 20 20 20 20 20 20 44 45 46 45 52 52 41  T .      DEFERRA
148d0 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
148e0 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
148f0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14900 37 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46  7(c, d, .      F
14910 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14920 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14930 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f   DELETE NO ACTIO
14940 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42  N.      DEFERRAB
14950 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
14960 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20  ERRED.    );..  
14970 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c    CREATE TABLE l
14980 6f 67 28 6d 73 67 29 3b 0a 20 20 20 20 43 52 45  og(msg);.    CRE
14990 41 54 45 20 54 52 49 47 47 45 52 20 74 74 20 41  ATE TRIGGER tt A
149a0 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70  FTER DELETE ON p
149b0 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
149c0 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
149d0 55 45 53 28 27 64 65 6c 65 74 65 20 27 20 7c 7c  UES('delete ' ||
149e0 20 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20 20   old.rowid);.   
149f0 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a   END;.  }.} {}..
14a00 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14a10 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
14a20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
14a30 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20  O p VALUES('a', 
14a40 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'b');.    INSERT
14a50 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
14a60 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49  'a', 'b');.    I
14a70 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
14a80 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
14a90 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14aa0 63 33 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  c3 VALUES('a', '
14ab0 62 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  b');.    BEGIN;.
14ac0 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
14ad0 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   p;.      SELECT
14ae0 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   * FROM c1;.  }.
14af0 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  } {{} {}}.do_tes
14b00 74 20 65 5f 66 6b 65 79 2d 35 37 2e 33 20 7b 0a  t e_fkey-57.3 {.
14b10 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
14b20 43 54 20 2a 20 46 52 4f 4d 20 63 32 20 7d 0a 7d  CT * FROM c2 }.}
14b30 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74   {{} {}}.do_test
14b40 20 65 5f 66 6b 65 79 2d 35 37 2e 34 20 7b 0a 20   e_fkey-57.4 {. 
14b50 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
14b60 54 20 2a 20 46 52 4f 4d 20 63 33 20 7d 0a 7d 20  T * FROM c3 }.} 
14b70 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
14b80 79 2d 35 37 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-57.5 {.  execs
14b90 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
14ba0 4f 4d 20 6c 6f 67 20 7d 0a 7d 20 7b 7d 0a 64 6f  OM log }.} {}.do
14bb0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e  _test e_fkey-57.
14bc0 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52 4f  6 {.  execsql RO
14bd0 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f 74  LLBACK.} {}.do_t
14be0 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 37 20  est e_fkey-57.7 
14bf0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
14c00 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
14c10 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20 20  ELETE FROM p;.  
14c20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
14c30 4d 20 6c 6f 67 3b 0a 20 20 20 20 52 4f 4c 4c 42  M log;.    ROLLB
14c40 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 64 65 6c  ACK;.  }.} {{del
14c50 65 74 65 20 31 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ete 1}}..#------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ca0 2d 2d 2d 0a 23 20 49 66 20 61 6e 20 49 4d 4d 45  ---.# If an IMME
14cb0 44 49 41 54 45 20 66 6f 72 65 69 67 6e 20 6b 65  DIATE foreign ke
14cc0 79 20 66 61 69 6c 73 20 61 73 20 61 20 72 65 73  y fails as a res
14cd0 75 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ult of a DROP TA
14ce0 42 4c 45 2c 20 74 68 65 0a 23 20 44 52 4f 50 20  BLE, the.# DROP 
14cf0 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 66 61  TABLE command fa
14d00 69 6c 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ils..#.# EVIDENC
14d10 45 2d 4f 46 3a 20 52 2d 33 32 37 36 38 2d 34 37  E-OF: R-32768-47
14d20 39 32 35 20 49 66 20 61 6e 20 69 6d 6d 65 64 69  925 If an immedi
14d30 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
14d40 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20  constraint is.# 
14d50 76 69 6f 6c 61 74 65 64 2c 20 74 68 65 20 44 52  violated, the DR
14d60 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
14d70 6e 74 20 66 61 69 6c 73 20 61 6e 64 20 74 68 65  nt fails and the
14d80 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 64 72   table is not dr
14d90 6f 70 70 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  opped..#.do_test
14da0 20 65 5f 66 6b 65 79 2d 35 38 2e 31 20 7b 0a 20   e_fkey-58.1 {. 
14db0 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
14dc0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 3b 0a  DELETE FROM c1;.
14dd0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
14de0 63 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  c2;.    DELETE F
14df0 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 20 20 65 78  ROM c3;.  }.  ex
14e00 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
14e10 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27 61  NTO c5 VALUES('a
14e20 27 2c 20 27 62 27 29 20 7d 0a 20 20 63 61 74 63  ', 'b') }.  catc
14e30 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  hsql { DROP TABL
14e40 45 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  E p }.} {1 {fore
14e50 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
14e60 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
14e70 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 32 20  est e_fkey-58.2 
14e80 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
14e90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 20 7d 0a  LECT * FROM p }.
14ea0 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20  } {a b}.do_test 
14eb0 65 5f 66 6b 65 79 2d 35 38 2e 33 20 7b 0a 20 20  e_fkey-58.3 {.  
14ec0 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42  catchsql {.    B
14ed0 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50  EGIN;.      DROP
14ee0 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20   TABLE p;.  }.} 
14ef0 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
14f00 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
14f10 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
14f20 65 79 2d 35 38 2e 34 20 7b 0a 20 20 65 78 65 63  ey-58.4 {.  exec
14f30 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
14f40 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53   * FROM p;.    S
14f50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 35 3b  ELECT * FROM c5;
14f60 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
14f70 20 7d 0a 7d 20 7b 61 20 62 20 61 20 62 7d 0a 0a   }.} {a b a b}..
14f80 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20  ----------.# If 
14fd0 61 20 44 45 46 45 52 52 45 44 20 66 6f 72 65 69  a DEFERRED forei
14fe0 67 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20  gn key fails as 
14ff0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52  a result of a DR
15000 4f 50 20 54 41 42 4c 45 2c 20 61 74 74 65 6d 70  OP TABLE, attemp
15010 74 69 6e 67 0a 23 20 74 6f 20 63 6f 6d 6d 69 74  ting.# to commit
15020 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15030 20 66 61 69 6c 73 20 75 6e 6c 65 73 73 20 74 68   fails unless th
15040 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 66  e violation is f
15050 69 78 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ixed..#.# EVIDEN
15060 43 45 2d 4f 46 3a 20 52 2d 30 35 39 30 33 2d 30  CE-OF: R-05903-0
15070 38 34 36 30 20 49 66 20 61 20 64 65 66 65 72 72  8460 If a deferr
15080 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
15090 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20 76  onstraint is.# v
150a0 69 6f 6c 61 74 65 64 2c 20 74 68 65 6e 20 61 6e  iolated, then an
150b0 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
150c0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
150d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6f 6d   attempts to com
150e0 6d 69 74 0a 23 20 74 68 65 20 74 72 61 6e 73 61  mit.# the transa
150f0 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 6f 72  ction if the for
15100 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
15110 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 73  int violations s
15120 74 69 6c 6c 20 65 78 69 73 74 0a 23 20 61 74 20  till exist.# at 
15130 74 68 61 74 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f  that point..#.do
15140 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e  _test e_fkey-59.
15150 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
15160 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
15170 20 63 31 20 3b 20 44 45 4c 45 54 45 20 46 52 4f   c1 ; DELETE FRO
15180 4d 20 63 32 20 3b 20 44 45 4c 45 54 45 20 46 52  M c2 ; DELETE FR
15190 4f 4d 20 63 33 20 3b 0a 20 20 20 20 44 45 4c 45  OM c3 ;.    DELE
151a0 54 45 20 46 52 4f 4d 20 63 34 20 3b 20 44 45 4c  TE FROM c4 ; DEL
151b0 45 54 45 20 46 52 4f 4d 20 63 35 20 3b 20 44 45  ETE FROM c5 ; DE
151c0 4c 45 54 45 20 46 52 4f 4d 20 63 36 20 3b 0a 20  LETE FROM c6 ;. 
151d0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
151e0 37 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  7 .  }.} {}.do_t
151f0 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 32 20  est e_fkey-59.2 
15200 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
15210 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c  SERT INTO c7 VAL
15220 55 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a  UES('a', 'b') }.
15230 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15240 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f  BEGIN;.      DRO
15250 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d  P TABLE p;.  }.}
15260 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
15270 65 79 2d 35 39 2e 33 20 7b 0a 20 20 63 61 74 63  ey-59.3 {.  catc
15280 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
15290 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
152a0 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
152b0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
152c0 2d 35 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -59.4 {.  execsq
152d0 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
152e0 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59   p(a, b, PRIMARY
152f0 20 4b 45 59 28 61 2c 20 62 29 29 20 7d 0a 20 20   KEY(a, b)) }.  
15300 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
15310 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
15320 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
15330 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
15340 66 6b 65 79 2d 35 39 2e 35 20 7b 0a 20 20 65 78  fkey-59.5 {.  ex
15350 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
15360 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27  NTO p VALUES('a'
15370 2c 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63 73  , 'b') }.  execs
15380 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
15390 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 6e 79  ----------.# Any
153e0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
153f0 73 6d 61 74 63 68 22 20 65 72 72 6f 72 73 20 65  smatch" errors e
15400 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
15410 20 72 75 6e 6e 69 6e 67 20 61 6e 20 69 6d 70 6c   running an impl
15420 69 63 69 74 0a 23 20 22 44 45 4c 45 54 45 20 46  icit.# "DELETE F
15430 52 4f 4d 20 74 62 6c 22 20 61 72 65 20 69 67 6e  ROM tbl" are ign
15440 6f 72 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ored..#.# EVIDEN
15450 43 45 2d 4f 46 3a 20 52 2d 35 37 32 34 32 2d 33  CE-OF: R-57242-3
15460 37 30 30 35 20 41 6e 79 20 22 66 6f 72 65 69 67  7005 Any "foreig
15470 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 20  n key mismatch" 
15480 65 72 72 6f 72 73 0a 23 20 65 6e 63 6f 75 6e 74  errors.# encount
15490 65 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ered as part of 
154a0 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45  an implicit DELE
154b0 54 45 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  TE are ignored..
154c0 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
154d0 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
154e0 2d 36 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -60.1 {.  execsq
154f0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66  l {.    PRAGMA f
15500 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
15510 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  F;..    CREATE T
15520 41 42 4c 45 20 70 28 61 20 50 52 49 4d 41 52 59  ABLE p(a PRIMARY
15530 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
15540 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29 3b  ES nosuchtable);
15550 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
15560 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c1(c, d, FOREI
15570 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
15580 45 52 45 4e 43 45 53 20 61 29 3b 0a 20 20 20 20  ERENCES a);.    
15590 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
155a0 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 62  c REFERENCES p(b
155b0 29 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54  ), d);.    CREAT
155c0 45 20 54 41 42 4c 45 20 63 33 28 63 20 52 45 46  E TABLE c3(c REF
155d0 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
155e0 45 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 64 29  ETE SET NULL, d)
155f0 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
15600 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20 32  TO p VALUES(1, 2
15610 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
15620 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20  TO c1 VALUES(1, 
15630 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
15640 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c  NTO c2 VALUES(1,
15650 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
15660 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31  INTO c3 VALUES(1
15670 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 2);.  }.} {}.d
15680 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30  o_test e_fkey-60
15690 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
156a0 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
156b0 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 20 20 63 61  keys = ON }.  ca
156c0 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
156d0 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 6e  FROM p }.} {1 {n
156e0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61  o such table: ma
156f0 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d  in.nosuchtable}}
15700 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15710 36 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.3 {.  execsql
15720 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
15730 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70      DROP TABLE p
15740 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
15750 20 46 52 4f 4d 20 63 33 3b 0a 20 20 20 20 52 4f   FROM c3;.    RO
15760 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b  LLBACK;.  }.} {{
15770 7d 20 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } 2}.do_test e_f
15780 6b 65 79 2d 36 30 2e 34 20 7b 0a 20 20 65 78 65  key-60.4 {.  exe
15790 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41  csql { CREATE TA
157a0 42 4c 45 20 6e 6f 73 75 63 68 74 61 62 6c 65 28  BLE nosuchtable(
157b0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 7d  x PRIMARY KEY) }
157c0 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
157d0 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20  LETE FROM p }.} 
157e0 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
157f0 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65  mismatch}}.do_te
15800 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 35 20 7b  st e_fkey-60.5 {
15810 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f  .  execsql { DRO
15820 50 20 54 41 42 4c 45 20 63 31 20 7d 0a 20 20 63  P TABLE c1 }.  c
15830 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
15840 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b   FROM p }.} {1 {
15850 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
15860 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  atch}}.do_test e
15870 5f 66 6b 65 79 2d 36 30 2e 36 20 7b 0a 20 20 65  _fkey-60.6 {.  e
15880 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  xecsql { DROP TA
15890 42 4c 45 20 63 32 20 7d 0a 20 20 65 78 65 63 73  BLE c2 }.  execs
158a0 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
158b0 20 70 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d   p }.} {}..#----
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
15910 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 65  t the special be
15920 68 61 76 69 6f 75 72 73 20 6f 66 20 41 4c 54 45  haviours of ALTE
15930 52 20 61 6e 64 20 44 52 4f 50 20 54 41 42 4c 45  R and DROP TABLE
15940 20 61 72 65 20 6f 6e 6c 79 0a 23 20 61 63 74 69   are only.# acti
15950 76 61 74 65 64 20 77 68 65 6e 20 66 6f 72 65 69  vated when forei
15960 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e 61 62  gn keys are enab
15970 6c 65 64 2e 20 53 70 65 63 69 61 6c 20 62 65 68  led. Special beh
15980 61 76 69 6f 75 72 73 20 61 72 65 3a 0a 23 0a 23  aviours are:.#.#
15990 20 20 20 31 2e 20 41 44 44 20 43 4f 4c 55 4d 4e     1. ADD COLUMN
159a0 20 6e 6f 74 20 61 6c 6c 6f 77 69 6e 67 20 61 20   not allowing a 
159b0 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73  REFERENCES claus
159c0 65 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c  e with a non-NUL
159d0 4c 20 0a 23 20 20 20 20 20 20 64 65 66 61 75 6c  L .#      defaul
159e0 74 20 76 61 6c 75 65 2e 0a 23 20 20 20 32 2e 20  t value..#   2. 
159f0 4d 6f 64 69 66 79 69 6e 67 20 66 6f 72 65 69 67  Modifying foreig
15a00 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
15a10 73 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74 20  s when a parent 
15a20 74 61 62 6c 65 20 69 73 20 52 45 4e 41 4d 45 64  table is RENAMEd
15a30 2e 0a 23 20 20 20 33 2e 20 52 75 6e 6e 69 6e 67  ..#   3. Running
15a40 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c   an implicit DEL
15a50 45 54 45 20 46 52 4f 4d 20 63 6f 6d 6d 61 6e 64  ETE FROM command
15a60 20 61 73 20 70 61 72 74 20 6f 66 20 44 52 4f 50   as part of DROP
15a70 20 54 41 42 4c 45 2e 0a 23 0a 23 20 45 56 49 44   TABLE..#.# EVID
15a80 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 31 34 32  ENCE-OF: R-54142
15a90 2d 34 31 33 34 36 20 54 68 65 20 70 72 6f 70 65  -41346 The prope
15aa0 72 74 69 65 73 20 6f 66 20 74 68 65 20 44 52 4f  rties of the DRO
15ab0 50 20 54 41 42 4c 45 20 61 6e 64 20 41 4c 54 45  P TABLE and ALTE
15ac0 52 0a 23 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  R.# TABLE comman
15ad0 64 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ds described abo
15ae0 76 65 20 6f 6e 6c 79 20 61 70 70 6c 79 20 69 66  ve only apply if
15af0 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72   foreign keys ar
15b00 65 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 64 6f 5f  e enabled..#.do_
15b10 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 31  test e_fkey-61.1
15b20 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
15b30 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
15b40 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
15b50 74 31 28 61 2c 20 62 29 20 7d 0a 20 20 63 61 74  t1(a, b) }.  cat
15b60 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41  chsql { ALTER TA
15b70 42 4c 45 20 74 31 20 41 44 44 20 43 4f 4c 55 4d  BLE t1 ADD COLUM
15b80 4e 20 63 20 44 45 46 41 55 4c 54 20 27 78 78 78  N c DEFAULT 'xxx
15b90 27 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 20  ' REFERENCES t2 
15ba0 7d 0a 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61  }.} {1 {Cannot a
15bb0 64 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20  dd a REFERENCES 
15bc0 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d  column with non-
15bd0 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c  NULL default val
15be0 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ue}}.do_test e_f
15bf0 6b 65 79 2d 36 31 2e 31 2e 32 20 7b 0a 20 20 65  key-61.1.2 {.  e
15c00 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
15c10 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
15c20 46 46 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  FF }.  execsql {
15c30 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20   ALTER TABLE t1 
15c40 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46  ADD COLUMN c DEF
15c50 41 55 4c 54 20 27 78 78 78 27 20 52 45 46 45 52  AULT 'xxx' REFER
15c60 45 4e 43 45 53 20 74 32 20 7d 0a 20 20 65 78 65  ENCES t2 }.  exe
15c70 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 71  csql { SELECT sq
15c80 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
15c90 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20  ster WHERE name 
15ca0 3d 20 27 74 31 27 20 7d 0a 7d 20 7b 7b 43 52 45  = 't1' }.} {{CRE
15cb0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
15cc0 62 2c 20 63 20 44 45 46 41 55 4c 54 20 27 78 78  b, c DEFAULT 'xx
15cd0 78 27 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  x' REFERENCES t2
15ce0 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  )}}.do_test e_fk
15cf0 65 79 2d 36 31 2e 31 2e 33 20 7b 0a 20 20 65 78  ey-61.1.3 {.  ex
15d00 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66  ecsql { PRAGMA f
15d10 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
15d20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
15d30 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 31 20 7b   e_fkey-61.2.1 {
15d40 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
15d50 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
15d60 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
15d70 70 28 61 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  p(a UNIQUE);.   
15d80 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28   CREATE TABLE c(
15d90 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61  b REFERENCES p(a
15da0 29 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ));.    BEGIN;. 
15db0 20 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45       ALTER TABLE
15dc0 20 70 20 52 45 4e 41 4d 45 20 54 4f 20 70 61 72   p RENAME TO par
15dd0 65 6e 74 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ent;.      SELEC
15de0 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
15df0 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
15e00 61 6d 65 20 3d 20 27 63 27 3b 0a 20 20 20 20 52  ame = 'c';.    R
15e10 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
15e20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  {CREATE TABLE c(
15e30 62 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 61  b REFERENCES "pa
15e40 72 65 6e 74 22 28 61 29 29 7d 7d 0a 64 6f 5f 74  rent"(a))}}.do_t
15e50 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e  est e_fkey-61.2.
15e60 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
15e70 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
15e80 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20  gn_keys = OFF;. 
15e90 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 70     ALTER TABLE p
15ea0 20 52 45 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e   RENAME TO paren
15eb0 74 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71  t;.    SELECT sq
15ec0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
15ed0 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20  ster WHERE name 
15ee0 3d 20 27 63 27 3b 0a 20 20 7d 0a 7d 20 7b 7b 43  = 'c';.  }.} {{C
15ef0 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 62 20  REATE TABLE c(b 
15f00 52 45 46 45 52 45 4e 43 45 53 20 70 28 61 29 29  REFERENCES p(a))
15f10 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
15f20 79 2d 36 31 2e 32 2e 33 20 7b 0a 20 20 65 78 65  y-61.2.3 {.  exe
15f30 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
15f40 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20  reign_keys = ON 
15f50 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
15f60 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 31 20 7b 0a  e_fkey-61.3.1 {.
15f70 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
15f80 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
15f90 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
15fa0 28 61 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  (a UNIQUE);.    
15fb0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 62  CREATE TABLE c(b
15fc0 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61 29   REFERENCES p(a)
15fd0 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e   ON DELETE SET N
15fe0 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
15ff0 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27   INTO p VALUES('
16000 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  x');.    INSERT 
16010 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 78  INTO c VALUES('x
16020 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
16030 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
16040 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  p;.      SELECT 
16050 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 52 4f  * FROM c;.    RO
16060 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b  LLBACK;.  }.} {{
16070 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
16080 79 2d 36 31 2e 33 2e 32 20 7b 0a 20 20 65 78 65  y-61.3.2 {.  exe
16090 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
160a0 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
160b0 20 4f 46 46 3b 0a 20 20 20 20 44 52 4f 50 20 54   OFF;.    DROP T
160c0 41 42 4c 45 20 70 3b 0a 20 20 20 20 53 45 4c 45  ABLE p;.    SELE
160d0 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 7d  CT * FROM c;.  }
160e0 0a 7d 20 7b 78 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {x}.do_test e
160f0 5f 66 6b 65 79 2d 36 31 2e 33 2e 33 20 7b 0a 20  _fkey-61.3.3 {. 
16100 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
16110 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
16120 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23   ON }.} {}..####
16130 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16150 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16170 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
16180 49 4f 4e 20 36 3a 20 4c 69 6d 69 74 73 20 61 6e  ION 6: Limits an
16190 64 20 55 6e 73 75 70 70 6f 72 74 65 64 20 46 65  d Unsupported Fe
161a0 61 74 75 72 65 73 0a 23 23 23 23 23 23 23 23 23  atures.#########
161b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
161c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
161d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
161e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
161f0 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ##..#-----------
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
16240 20 54 65 73 74 20 74 68 61 74 20 4d 41 54 43 48   Test that MATCH
16250 20 63 6c 61 75 73 65 73 20 61 72 65 20 70 61 72   clauses are par
16260 73 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65 20  sed, but SQLite 
16270 74 72 65 61 74 73 20 65 76 65 72 79 20 66 6f 72  treats every for
16280 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74  eign key.# const
16290 72 61 69 6e 74 20 61 73 20 69 66 20 69 74 20 77  raint as if it w
162a0 65 72 65 20 22 4d 41 54 43 48 20 53 49 4d 50 4c  ere "MATCH SIMPL
162b0 45 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  E"..#.# EVIDENCE
162c0 2d 4f 46 3a 20 52 2d 32 34 37 32 38 2d 31 33 32  -OF: R-24728-132
162d0 33 30 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  30 SQLite parses
162e0 20 4d 41 54 43 48 20 63 6c 61 75 73 65 73 20 28   MATCH clauses (
162f0 69 2e 65 2e 20 64 6f 65 73 20 6e 6f 74 0a 23 20  i.e. does not.# 
16300 72 65 70 6f 72 74 20 61 20 73 79 6e 74 61 78 20  report a syntax 
16310 65 72 72 6f 72 20 69 66 20 79 6f 75 20 73 70 65  error if you spe
16320 63 69 66 79 20 6f 6e 65 29 2c 20 62 75 74 20 64  cify one), but d
16330 6f 65 73 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20  oes not enforce 
16340 74 68 65 6d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  them..#.# EVIDEN
16350 43 45 2d 4f 46 3a 20 52 2d 32 34 34 35 30 2d 34  CE-OF: R-24450-4
16360 36 31 37 34 20 41 6c 6c 20 66 6f 72 65 69 67 6e  6174 All foreign
16370 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
16380 20 69 6e 20 53 51 4c 69 74 65 20 61 72 65 0a 23   in SQLite are.#
16390 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 4d   handled as if M
163a0 41 54 43 48 20 53 49 4d 50 4c 45 20 77 65 72 65  ATCH SIMPLE were
163b0 20 73 70 65 63 69 66 69 65 64 2e 0a 23 0a 66 6f   specified..#.fo
163c0 72 65 61 63 68 20 7a 4d 61 74 63 68 20 5b 6c 69  reach zMatch [li
163d0 73 74 20 53 49 4d 50 4c 45 20 50 41 52 54 49 41  st SIMPLE PARTIA
163e0 4c 20 46 55 4c 4c 20 53 69 6d 70 6c 65 20 70 61  L FULL Simple pa
163f0 72 54 49 41 4c 20 46 75 4c 4c 20 5d 20 7b 0a 20  rTIAL FuLL ] {. 
16400 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
16410 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
16420 79 2d 36 32 2e 24 7a 4d 61 74 63 68 2e 31 20 7b  y-62.$zMatch.1 {
16430 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
16440 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
16450 45 20 70 28 61 2c 20 62 2c 20 63 2c 20 50 52 49  E p(a, b, c, PRI
16460 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b  MARY KEY(b, c));
16470 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
16480 42 4c 45 20 63 28 64 2c 20 65 2c 20 66 2c 20 46  BLE c(d, e, f, F
16490 4f 52 45 49 47 4e 20 4b 45 59 28 65 2c 20 66 29  OREIGN KEY(e, f)
164a0 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4d 41   REFERENCES p MA
164b0 54 43 48 20 24 7a 4d 61 74 63 68 29 3b 0a 20 20  TCH $zMatch);.  
164c0 20 20 22 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    ".  } {}.  do_
164d0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 24  test e_fkey-62.$
164e0 7a 4d 61 74 63 68 2e 32 20 7b 0a 20 20 20 20 65  zMatch.2 {.    e
164f0 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
16500 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c  INTO p VALUES(1,
16510 20 32 2c 20 33 29 20 20 20 20 20 20 20 20 20 7d   2, 3)         }
16520 0a 0a 20 20 20 20 23 20 4d 41 54 43 48 20 53 49  ..    # MATCH SI
16530 4d 50 4c 45 20 62 65 68 61 76 69 6f 75 72 3a 20  MPLE behaviour: 
16540 41 6c 6c 6f 77 20 61 6e 79 20 63 68 69 6c 64 20  Allow any child 
16550 6b 65 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  key that contain
16560 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20  s one or more.  
16570 20 20 23 20 4e 55 4c 4c 20 76 61 6c 75 65 20 74    # NULL value t
16580 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 4e  o be inserted. N
16590 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 64  on-NULL values d
165a0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
165b0 70 20 74 6f 20 61 6e 79 0a 20 20 20 20 23 20 70  p to any.    # p
165c0 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73  arent key values
165d0 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20 61 74 20  , so long as at 
165e0 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 20  least one field 
165f0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
16600 20 69 73 0a 20 20 20 20 23 20 4e 55 4c 4c 2e 0a   is.    # NULL..
16610 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
16620 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
16630 45 53 28 27 77 27 2c 20 32 2c 20 33 29 20 20 20  ES('w', 2, 3)   
16640 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
16650 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
16660 63 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 78  c VALUES('x', 'x
16670 27 2c 20 4e 55 4c 4c 29 20 20 7d 0a 20 20 20 20  ', NULL)  }.    
16680 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
16690 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
166a0 79 27 2c 20 4e 55 4c 4c 2c 20 27 78 27 29 20 20  y', NULL, 'x')  
166b0 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
166c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
166d0 4c 55 45 53 28 27 7a 27 2c 20 4e 55 4c 4c 2c 20  LUES('z', NULL, 
166e0 4e 55 4c 4c 29 20 7d 0a 0a 20 20 20 20 23 20 43  NULL) }..    # C
166f0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 46 4b  heck that the FK
16700 20 69 73 20 65 6e 66 6f 72 63 65 64 20 70 72 6f   is enforced pro
16710 70 65 72 6c 79 20 69 66 20 74 68 65 72 65 20 61  perly if there a
16720 72 65 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  re no NULL value
16730 73 20 0a 20 20 20 20 23 20 69 6e 20 74 68 65 20  s .    # in the 
16740 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
16750 73 2e 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  s..    catchsql 
16760 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20  { INSERT INTO c 
16770 56 41 4c 55 45 53 28 27 61 27 2c 20 32 2c 20 34  VALUES('a', 2, 4
16780 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65  ) }.  } {1 {fore
16790 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
167a0 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23  nt failed}}.}..#
167b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
16800 20 74 68 61 74 20 53 51 4c 69 74 65 20 64 6f 65   that SQLite doe
16810 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
16820 65 20 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54  e SET CONSTRAINT
16830 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 6e 64 0a   statement. And.
16840 23 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73  # that it is pos
16850 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
16860 62 6f 74 68 20 69 6d 6d 65 64 69 61 74 65 20 61  both immediate a
16870 6e 64 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  nd deferred cons
16880 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49  traints..#.# EVI
16890 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 35 39  DENCE-OF: R-2159
168a0 39 2d 31 36 30 33 38 20 49 6e 20 53 51 4c 69 74  9-16038 In SQLit
168b0 65 2c 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  e, a foreign key
168c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23   constraint is.#
168d0 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 6d 61 72   permanently mar
168e0 6b 65 64 20 61 73 20 64 65 66 65 72 72 65 64 20  ked as deferred 
168f0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 77 68 65  or immediate whe
16900 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
16910 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
16920 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
16930 79 2d 36 32 2e 31 20 7b 0a 20 20 63 61 74 63 68  y-62.1 {.  catch
16940 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52  sql { SET CONSTR
16950 41 49 4e 54 53 20 41 4c 4c 20 49 4d 4d 45 44 49  AINTS ALL IMMEDI
16960 41 54 45 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72  ATE }.} {1 {near
16970 20 22 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65   "SET": syntax e
16980 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  rror}}.do_test e
16990 5f 66 6b 65 79 2d 36 32 2e 32 20 7b 0a 20 20 63  _fkey-62.2 {.  c
169a0 61 74 63 68 73 71 6c 20 7b 20 53 45 54 20 43 4f  atchsql { SET CO
169b0 4e 53 54 52 41 49 4e 54 53 20 41 4c 4c 20 44 45  NSTRAINTS ALL DE
169c0 46 45 52 52 45 44 20 7d 0a 7d 20 7b 31 20 7b 6e  FERRED }.} {1 {n
169d0 65 61 72 20 22 53 45 54 22 3a 20 73 79 6e 74 61  ear "SET": synta
169e0 78 20 65 72 72 6f 72 7d 7d 0a 0a 64 6f 5f 74 65  x error}}..do_te
169f0 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 33 20 7b  st e_fkey-62.3 {
16a00 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16a10 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
16a20 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
16a30 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
16a40 45 41 54 45 20 54 41 42 4c 45 20 63 64 28 63 2c  EATE TABLE cd(c,
16a50 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
16a60 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
16a70 45 52 45 4e 43 45 53 20 70 20 44 45 46 45 52 52  ERENCES p DEFERR
16a80 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
16a90 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20 43 52  EFERRED);.    CR
16aa0 45 41 54 45 20 54 41 42 4c 45 20 63 69 28 63 2c  EATE TABLE ci(c,
16ab0 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
16ac0 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
16ad0 45 52 45 4e 43 45 53 20 70 20 44 45 46 45 52 52  ERENCES p DEFERR
16ae0 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49  ABLE INITIALLY I
16af0 4d 4d 45 44 49 41 54 45 29 3b 0a 20 20 20 20 42  MMEDIATE);.    B
16b00 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  EGIN;.  }.} {}.d
16b10 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16b20 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .4 {.  catchsql 
16b30 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 69  { INSERT INTO ci
16b40 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27   VALUES('x', 'y'
16b50 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
16b60 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
16b70 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
16b80 74 20 65 5f 66 6b 65 79 2d 36 32 2e 35 20 7b 0a  t e_fkey-62.5 {.
16b90 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16ba0 45 52 54 20 49 4e 54 4f 20 63 64 20 56 41 4c 55  ERT INTO cd VALU
16bb0 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d  ES('x', 'y') }.}
16bc0 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
16bd0 65 5f 66 6b 65 79 2d 36 32 2e 36 20 7b 0a 20 20  e_fkey-62.6 {.  
16be0 63 61 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49  catchsql { COMMI
16bf0 54 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  T }.} {1 {foreig
16c00 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
16c10 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
16c20 74 20 65 5f 66 6b 65 79 2d 36 32 2e 37 20 7b 0a  t e_fkey-62.7 {.
16c30 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
16c40 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 64 3b   DELETE FROM cd;
16c50 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
16c60 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
16c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16cb0 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68  -.# Test that th
16cc0 65 20 6d 61 78 69 6d 75 6d 20 72 65 63 75 72 73  e maximum recurs
16cd0 69 6f 6e 20 64 65 70 74 68 20 6f 66 20 66 6f 72  ion depth of for
16ce0 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20  eign key action 
16cf0 70 72 6f 67 72 61 6d 73 20 69 73 0a 23 20 67 6f  programs is.# go
16d00 76 65 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  verned by the SQ
16d10 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
16d20 5f 44 45 50 54 48 20 61 6e 64 20 53 51 4c 49 54  _DEPTH and SQLIT
16d30 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
16d40 44 45 50 54 48 0a 23 20 73 65 74 74 69 6e 67 73  DEPTH.# settings
16d50 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
16d60 46 3a 20 52 2d 34 32 32 36 34 2d 33 30 35 30 33  F: R-42264-30503
16d70 20 54 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f   The SQLITE_MAX_
16d80 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 61 6e  TRIGGER_DEPTH an
16d90 64 0a 23 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  d.# SQLITE_LIMIT
16da0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 73  _TRIGGER_DEPTH s
16db0 65 74 74 69 6e 67 73 20 64 65 74 65 72 6d 69 6e  ettings determin
16dc0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  e the maximum al
16dd0 6c 6f 77 61 62 6c 65 0a 23 20 64 65 70 74 68 20  lowable.# depth 
16de0 6f 66 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  of trigger progr
16df0 61 6d 20 72 65 63 75 72 73 69 6f 6e 2e 20 46 6f  am recursion. Fo
16e00 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
16e10 66 20 74 68 65 73 65 20 6c 69 6d 69 74 73 2c 0a  f these limits,.
16e20 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63  # foreign key ac
16e30 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  tions are consid
16e40 65 72 65 64 20 74 72 69 67 67 65 72 20 70 72 6f  ered trigger pro
16e50 67 72 61 6d 73 2e 0a 23 0a 70 72 6f 63 20 74 65  grams..#.proc te
16e60 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
16e70 75 72 73 69 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b  ursion {limit} {
16e80 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
16e90 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  es.  execsql { .
16ea0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
16eb0 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61  REATE TABLE t0(a
16ec0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
16ed0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
16ee0 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78 30 27  O t0 VALUES('x0'
16ef0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 66  , NULL);.  }.  f
16f00 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69  or {set i 1} {$i
16f10 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63   <= $limit} {inc
16f20 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
16f30 71 6c 20 22 0a 20 20 20 20 20 20 43 52 45 41 54  ql ".      CREAT
16f40 45 20 54 41 42 4c 45 20 74 24 69 20 28 0a 20 20  E TABLE t$i (.  
16f50 20 20 20 20 20 20 61 20 50 52 49 4d 41 52 59 20        a PRIMARY 
16f60 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
16f70 53 20 74 5b 65 78 70 72 20 24 69 2d 31 5d 20 4f  S t[expr $i-1] O
16f80 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
16f90 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
16fa0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20  INSERT INTO t$i 
16fb0 56 41 4c 55 45 53 28 27 78 24 69 27 2c 20 27 78  VALUES('x$i', 'x
16fc0 5b 65 78 70 72 20 24 69 2d 31 5d 27 29 3b 0a 20  [expr $i-1]');. 
16fd0 20 20 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73     ".  }.  execs
16fe0 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63  ql COMMIT.  catc
16ff0 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54  hsql ".    DELET
17000 45 20 46 52 4f 4d 20 74 30 3b 0a 20 20 20 20 53  E FROM t0;.    S
17010 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
17020 52 4f 4d 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22  ROM t$limit;.  "
17030 0a 7d 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f  .}.proc test_on_
17040 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e  update_recursion
17050 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f   {limit} {.  dro
17060 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
17070 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
17080 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
17090 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
170a0 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
170b0 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55  ERT INTO t0 VALU
170c0 45 53 28 27 78 78 78 27 29 3b 0a 20 20 7d 0a 20  ES('xxx');.  }. 
170d0 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b   for {set i 1} {
170e0 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69  $i <= $limit} {i
170f0 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74  ncr i} {.    set
17100 20 6a 20 5b 65 78 70 72 20 24 69 2d 31 5d 0a 0a   j [expr $i-1]..
17110 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
17120 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
17130 20 74 24 69 20 28 61 20 50 52 49 4d 41 52 59 20   t$i (a PRIMARY 
17140 4b 45 59 20 52 45 46 45 52 45 4e 43 45 53 20 74  KEY REFERENCES t
17150 24 6a 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  $j ON UPDATE CAS
17160 43 41 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53  CADE);.      INS
17170 45 52 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c  ERT INTO t$i VAL
17180 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20 20 20  UES('xxx');.    
17190 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ".  }.  execsql 
171a0 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71  COMMIT.  catchsq
171b0 6c 20 22 0a 20 20 20 20 55 50 44 41 54 45 20 74  l ".    UPDATE t
171c0 30 20 53 45 54 20 61 20 3d 20 27 79 79 79 27 3b  0 SET a = 'yyy';
171d0 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 4f 54 20  .    SELECT NOT 
171e0 28 61 3d 27 79 79 79 27 29 20 46 52 4f 4d 20 74  (a='yyy') FROM t
171f0 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 0a 64  $limit;.  ".}..d
17200 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17210 2e 31 2e 31 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .1.1 {.  test_on
17220 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f  _delete_recursio
17230 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  n $SQLITE_MAX_TR
17240 49 47 47 45 52 5f 44 45 50 54 48 0a 7d 20 7b 30  IGGER_DEPTH.} {0
17250 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   0}.do_test e_fk
17260 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20 74 65  ey-63.1.2 {.  te
17270 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
17280 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51  ursion [expr $SQ
17290 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
172a0 5f 44 45 50 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b  _DEPTH+1].} {1 {
172b0 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
172c0 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
172d0 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  sion}}.do_test e
172e0 5f 66 6b 65 79 2d 36 33 2e 31 2e 33 20 7b 0a 20  _fkey-63.1.3 {. 
172f0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64   sqlite3_limit d
17300 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  b SQLITE_LIMIT_T
17310 52 49 47 47 45 52 5f 44 45 50 54 48 20 35 0a 20  RIGGER_DEPTH 5. 
17320 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f   test_on_delete_
17330 72 65 63 75 72 73 69 6f 6e 20 35 0a 7d 20 7b 30  recursion 5.} {0
17340 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   0}.do_test e_fk
17350 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20 74 65  ey-63.1.4 {.  te
17360 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
17370 75 72 73 69 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74  ursion 6.} {1 {t
17380 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
17390 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
173a0 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  ion}}.do_test e_
173b0 66 6b 65 79 2d 36 33 2e 31 2e 35 20 7b 0a 20 20  fkey-63.1.5 {.  
173c0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62  sqlite3_limit db
173d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
173e0 49 47 47 45 52 5f 44 45 50 54 48 20 31 30 30 30  IGGER_DEPTH 1000
173f0 30 30 30 0a 7d 20 7b 35 7d 0a 64 6f 5f 74 65 73  000.} {5}.do_tes
17400 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 31 20  t e_fkey-63.2.1 
17410 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61  {.  test_on_upda
17420 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51  te_recursion $SQ
17430 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
17440 5f 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d 0a 64  _DEPTH.} {0 0}.d
17450 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17460 2e 32 2e 32 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .2.2 {.  test_on
17470 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f  _update_recursio
17480 6e 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  n [expr $SQLITE_
17490 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
174a0 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d  H+1].} {1 {too m
174b0 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
174c0 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
174d0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
174e0 2d 36 33 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69  -63.2.3 {.  sqli
174f0 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te3_limit db SQL
17500 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
17510 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65 73 74  R_DEPTH 5.  test
17520 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72  _on_update_recur
17530 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d 0a 64  sion 5.} {0 0}.d
17540 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17550 2e 32 2e 34 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .2.4 {.  test_on
17560 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f  _update_recursio
17570 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61  n 6.} {1 {too ma
17580 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
17590 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d  gger recursion}}
175a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
175b0 36 33 2e 32 2e 35 20 7b 0a 20 20 73 71 6c 69 74  63.2.5 {.  sqlit
175c0 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49  e3_limit db SQLI
175d0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
175e0 5f 44 45 50 54 48 20 31 30 30 30 30 30 30 0a 7d  _DEPTH 1000000.}
175f0 20 7b 35 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {5}..#---------
17600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17640 0a 23 20 54 68 65 20 73 65 74 74 69 6e 67 20 6f  .# The setting o
17650 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 5f  f the recursive_
17660 74 72 69 67 67 65 72 73 20 70 72 61 67 6d 61 20  triggers pragma 
17670 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
17680 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20 61 63  foreign.# key ac
17690 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  tions..#.# EVIDE
176a0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 37 36 39 2d  NCE-OF: R-51769-
176b0 33 32 37 33 30 20 54 68 65 20 50 52 41 47 4d 41  32730 The PRAGMA
176c0 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
176d0 65 72 73 20 73 65 74 74 69 6e 67 20 64 6f 65 73  ers setting does
176e0 0a 23 20 6e 6f 74 20 6e 6f 74 20 61 66 66 65 63  .# not not affec
176f0 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
17700 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  of foreign key a
17710 63 74 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65 61 63  ctions..#.foreac
17720 68 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  h recursive_trig
17730 67 65 72 73 5f 73 65 74 74 69 6e 67 20 5b 6c 69  gers_setting [li
17740 73 74 20 30 20 31 20 4f 4e 20 4f 46 46 5d 20 7b  st 0 1 ON OFF] {
17750 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
17760 65 73 0a 20 20 65 78 65 63 73 71 6c 20 22 50 52  es.  execsql "PR
17770 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
17780 72 69 67 67 65 72 73 20 3d 20 24 72 65 63 75 72  riggers = $recur
17790 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65  sive_triggers_se
177a0 74 74 69 6e 67 22 0a 0a 20 20 64 6f 5f 74 65 73  tting"..  do_tes
177b0 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72 65 63  t e_fkey-64.$rec
177c0 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f  ursive_triggers_
177d0 73 65 74 74 69 6e 67 2e 31 20 7b 0a 20 20 20 20  setting.1 {.    
177e0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
177f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
17800 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
17810 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f   REFERENCES t1 O
17820 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
17830 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
17840 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
17850 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49  , NULL);.      I
17860 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
17870 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20 20  LUES(2, 1);.    
17880 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17890 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b 0a 20   VALUES(3, 2);. 
178a0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
178b0 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 33 29   t1 VALUES(4, 3)
178c0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
178d0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
178e0 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   4);.      SELEC
178f0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
17900 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 35  t1;.    }.  } {5
17910 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17920 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65  ey-64.$recursive
17930 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e  _triggers_settin
17940 67 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  g.2 {.    execsq
17950 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
17960 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
17970 45 20 61 20 3d 20 31 20 7d 0a 20 20 7d 20 7b 31  E a = 1 }.  } {1
17980 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17990 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65  ey-64.$recursive
179a0 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e  _triggers_settin
179b0 67 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  g.3 {.    execsq
179c0 6c 20 7b 20 0a 20 20 20 20 20 20 44 45 4c 45 54  l { .      DELET
179d0 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
179e0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c  a = 1;.      SEL
179f0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17a00 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
17a10 7b 30 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  {0}.}..finish_te
17a20 73 74 0a                                         st.