/ Hex Artifact Content
Login

Artifact 17cfb40002d165299681f39aac0cb5890c359935:


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 2f  index {{0 {}} {/
4fc0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
4fd0: 69 73 6d 61 74 63 68 20 2d 20 22 2e 2a 22 20 72  ismatch - ".*" r
4fe0: 65 66 65 72 65 6e 63 69 6e 67 20 22 2e 2a 22 7d  eferencing ".*"}
4ff0: 2f 7d 7d 20 5c 0a 20 20 20 20 20 24 69 73 45 72  /}} \.     $isEr
5000: 72 6f 72 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65  ror].}.test_efke
5010: 79 5f 35 37 20 32 20 30 20 7b 20 43 52 45 41 54  y_57 2 0 { CREAT
5020: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
5030: 4d 41 52 59 20 4b 45 59 29 20 7d 0a 74 65 73 74  MARY KEY) }.test
5040: 5f 65 66 6b 65 79 5f 35 37 20 33 20 30 20 7b 20  _efkey_57 3 0 { 
5050: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5060: 78 20 55 4e 49 51 55 45 29 20 7d 0a 74 65 73 74  x UNIQUE) }.test
5070: 5f 65 66 6b 65 79 5f 35 37 20 34 20 30 20 7b 20  _efkey_57 4 0 { 
5080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5090: 78 29 3b 20 43 52 45 41 54 45 20 55 4e 49 51 55  x); CREATE UNIQU
50a0: 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74  E INDEX t1i ON t
50b0: 31 28 78 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65  1(x) }.test_efke
50c0: 79 5f 35 37 20 35 20 31 20 7b 20 0a 20 20 43 52  y_57 5 1 { .  CR
50d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
50e0: 3b 20 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51  ; .  CREATE UNIQ
50f0: 55 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20  UE INDEX t1i ON 
5100: 74 31 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  t1(x COLLATE noc
5110: 61 73 65 29 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b  ase);.}.test_efk
5120: 65 79 5f 35 37 20 36 20 31 20 7b 20 43 52 45 41  ey_57 6 1 { CREA
5130: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d  TE TABLE t1(x) }
5140: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 37  .test_efkey_57 7
5150: 20 31 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c   1 { CREATE TABL
5160: 45 20 74 31 28 78 2c 20 79 2c 20 50 52 49 4d 41  E t1(x, y, PRIMA
5170: 52 59 20 4b 45 59 28 78 2c 20 79 29 29 20 7d 0a  RY KEY(x, y)) }.
5180: 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 38 20  test_efkey_57 8 
5190: 31 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  1 { CREATE TABLE
51a0: 20 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45   t1(x, y, UNIQUE
51b0: 28 78 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f 65  (x, y)) }.test_e
51c0: 66 6b 65 79 5f 35 37 20 39 20 31 20 7b 20 0a 20  fkey_57 9 1 { . 
51d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
51e0: 28 78 2c 20 79 29 3b 20 0a 20 20 43 52 45 41 54  (x, y); .  CREAT
51f0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74  E UNIQUE INDEX t
5200: 31 69 20 4f 4e 20 74 31 28 78 2c 20 79 29 3b 0a  1i ON t1(x, y);.
5210: 7d 0a 0a 0a 23 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 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5260: 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
5270: 73 20 61 6e 20 65 78 61 6d 70 6c 65 20 69 6e 20  s an example in 
5280: 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c  foreignkeys.html
5290: 2e 20 53 65 76 65 72 61 6c 20 74 65 73 74 61 62  . Several testab
52a0: 6c 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20  le.# statements 
52b0: 72 65 66 65 72 20 74 6f 20 74 68 69 73 20 65 78  refer to this ex
52c0: 61 6d 70 6c 65 2c 20 61 73 20 66 6f 6c 6c 6f 77  ample, as follow
52d0: 73 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  s.#.# EVIDENCE-O
52e0: 46 3a 20 52 2d 32 37 34 38 34 2d 30 31 34 36 37  F: R-27484-01467
52f0: 0a 23 0a 23 20 46 4b 20 43 6f 6e 73 74 72 61 69  .#.# FK Constrai
5300: 6e 74 73 20 6f 6e 20 63 68 69 6c 64 31 2c 20 63  nts on child1, c
5310: 68 69 6c 64 32 20 61 6e 64 20 63 68 69 6c 64 33  hild2 and child3
5320: 20 61 72 65 20 4f 6b 2e 0a 23 0a 23 20 50 72 6f   are Ok..#.# Pro
5330: 62 6c 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20  blem with FK on 
5340: 63 68 69 6c 64 34 3a 0a 23 0a 23 20 45 56 49 44  child4:.#.# EVID
5350: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 30 33 39  ENCE-OF: R-51039
5360: 2d 34 34 38 34 30 20 54 68 65 20 66 6f 72 65 69  -44840 The forei
5370: 67 6e 20 6b 65 79 20 64 65 63 6c 61 72 65 64 20  gn key declared 
5380: 61 73 20 70 61 72 74 20 6f 66 20 74 61 62 6c 65  as part of table
5390: 0a 23 20 63 68 69 6c 64 34 20 69 73 20 61 6e 20  .# child4 is an 
53a0: 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 65 76  error because ev
53b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 70 61  en though the pa
53c0: 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  rent key column 
53d0: 69 73 0a 23 20 69 6e 64 65 78 65 64 2c 20 74 68  is.# indexed, th
53e0: 65 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 55  e index is not U
53f0: 4e 49 51 55 45 2e 0a 23 0a 23 20 50 72 6f 62 6c  NIQUE..#.# Probl
5400: 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68  em with FK on ch
5410: 69 6c 64 35 3a 0a 23 0a 23 20 45 56 49 44 45 4e  ild5:.#.# EVIDEN
5420: 43 45 2d 4f 46 3a 20 52 2d 30 31 30 36 30 2d 34  CE-OF: R-01060-4
5430: 38 37 38 38 20 54 68 65 20 66 6f 72 65 69 67 6e  8788 The foreign
5440: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 20 63   key for table c
5450: 68 69 6c 64 35 20 69 73 20 61 6e 0a 23 20 65 72  hild5 is an.# er
5460: 72 6f 72 20 62 65 63 61 75 73 65 20 65 76 65 6e  ror because even
5470: 20 74 68 6f 75 67 68 20 74 68 65 20 70 61 72 65   though the pare
5480: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 68 61  nt key column ha
5490: 73 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  s a unique index
54a0: 2c 0a 23 20 74 68 65 20 69 6e 64 65 78 20 75 73  ,.# the index us
54b0: 65 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  es a different c
54c0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
54d0: 65 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77  e..#.# Problem w
54e0: 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 36  ith FK on child6
54f0: 20 61 6e 64 20 63 68 69 6c 64 37 3a 0a 23 0a 23   and child7:.#.#
5500: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5510: 36 33 30 38 38 2d 33 37 34 36 39 20 54 61 62 6c  63088-37469 Tabl
5520: 65 73 20 63 68 69 6c 64 36 20 61 6e 64 20 63 68  es child6 and ch
5530: 69 6c 64 37 20 61 72 65 20 69 6e 63 6f 72 72 65  ild7 are incorre
5540: 63 74 0a 23 20 62 65 63 61 75 73 65 20 77 68 69  ct.# because whi
5550: 6c 65 20 62 6f 74 68 20 68 61 76 65 20 55 4e 49  le both have UNI
5560: 51 55 45 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  QUE indices on t
5570: 68 65 69 72 20 70 61 72 65 6e 74 20 6b 65 79 73  heir parent keys
5580: 2c 20 74 68 65 20 6b 65 79 73 0a 23 20 61 72 65  , the keys.# are
5590: 20 6e 6f 74 20 61 6e 20 65 78 61 63 74 20 6d 61   not an exact ma
55a0: 74 63 68 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  tch to the colum
55b0: 6e 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55  ns of a single U
55c0: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64  NIQUE index..#.d
55d0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
55e0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39  o_test e_fkey-19
55f0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5600: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5610: 45 20 70 61 72 65 6e 74 28 61 20 50 52 49 4d 41  E parent(a PRIMA
5620: 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
5630: 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29 3b 0a 20  , c, d, e, f);. 
5640: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
5650: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 70 61 72   INDEX i1 ON par
5660: 65 6e 74 28 63 2c 20 64 29 3b 0a 20 20 20 20 43  ent(c, d);.    C
5670: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
5680: 4e 20 70 61 72 65 6e 74 28 65 29 3b 0a 20 20 20  N parent(e);.   
5690: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
56a0: 4e 44 45 58 20 69 33 20 4f 4e 20 70 61 72 65 6e  NDEX i3 ON paren
56b0: 74 28 66 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  t(f COLLATE noca
56c0: 73 65 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  se);..    CREATE
56d0: 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 66 2c   TABLE child1(f,
56e0: 20 67 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   g REFERENCES pa
56f0: 72 65 6e 74 28 61 29 29 3b 20 20 20 20 20 20 20  rent(a));       
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 2d 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45  -- Ok.    CREATE
5720: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 68 2c   TABLE child2(h,
5730: 20 69 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   i REFERENCES pa
5740: 72 65 6e 74 28 62 29 29 3b 20 20 20 20 20 20 20  rent(b));       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 2d 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45  -- Ok.    CREATE
5770: 20 54 41 42 4c 45 20 63 68 69 6c 64 33 28 6a 2c   TABLE child3(j,
5780: 20 6b 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   k, FOREIGN KEY(
5790: 6a 2c 20 6b 29 20 52 45 46 45 52 45 4e 43 45 53  j, k) REFERENCES
57a0: 20 70 61 72 65 6e 74 28 63 2c 20 64 29 29 3b 20   parent(c, d)); 
57b0: 2d 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45  -- Ok.    CREATE
57c0: 20 54 41 42 4c 45 20 63 68 69 6c 64 34 28 6c 2c   TABLE child4(l,
57d0: 20 6d 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   m REFERENCES pa
57e0: 72 65 6e 74 28 65 29 29 3b 20 20 20 20 20 20 20  rent(e));       
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54  -- Err.    CREAT
5810: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28 6e  E TABLE child5(n
5820: 2c 20 6f 20 52 45 46 45 52 45 4e 43 45 53 20 70  , o REFERENCES p
5830: 61 72 65 6e 74 28 66 29 29 3b 20 20 20 20 20 20  arent(f));      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41   -- Err.    CREA
5860: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28  TE TABLE child6(
5870: 70 2c 20 71 2c 20 46 4f 52 45 49 47 4e 20 4b 45  p, q, FOREIGN KE
5880: 59 28 70 2c 71 29 20 52 45 46 45 52 45 4e 43 45  Y(p,q) REFERENCE
5890: 53 20 70 61 72 65 6e 74 28 62 2c 20 63 29 29 3b  S parent(b, c));
58a0: 20 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45    -- Err.    CRE
58b0: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37  ATE TABLE child7
58c0: 28 72 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (r REFERENCES pa
58d0: 72 65 6e 74 28 63 29 29 3b 20 20 20 20 20 20 20  rent(c));       
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20     -- Err.  }.} 
5900: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
5910: 79 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-19.2 {.  execs
5920: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
5930: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
5940: 45 53 28 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35  ES(1, 2, 3, 4, 5
5950: 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 6);.    INSERT
5960: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
5970: 55 45 53 28 27 78 78 78 27 2c 20 31 29 3b 0a 20  UES('xxx', 1);. 
5980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
5990: 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27 78 78  hild2 VALUES('xx
59a0: 78 27 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  x', 2);.    INSE
59b0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 33 20 56  RT INTO child3 V
59c0: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d  ALUES(3, 4);.  }
59d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
59e0: 66 6b 65 79 2d 31 39 2e 32 20 7b 0a 20 20 63 61  fkey-19.2 {.  ca
59f0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
5a00: 49 4e 54 4f 20 63 68 69 6c 64 34 20 56 41 4c 55  INTO child4 VALU
5a10: 45 53 28 27 78 78 78 27 2c 20 35 29 20 7d 0a 7d  ES('xxx', 5) }.}
5a20: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
5a30: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69   mismatch - "chi
5a40: 6c 64 34 22 20 72 65 66 65 72 65 6e 63 69 6e 67  ld4" referencing
5a50: 20 22 70 61 72 65 6e 74 22 7d 7d 0a 64 6f 5f 74   "parent"}}.do_t
5a60: 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 33 20  est e_fkey-19.3 
5a70: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
5a80: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
5a90: 35 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20  5 VALUES('xxx', 
5aa0: 36 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  6) }.} {1 {forei
5ab0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
5ac0: 2d 20 22 63 68 69 6c 64 35 22 20 72 65 66 65 72  - "child5" refer
5ad0: 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 22 7d  encing "parent"}
5ae0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
5af0: 2d 31 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -19.4 {.  catchs
5b00: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
5b10: 20 63 68 69 6c 64 36 20 56 41 4c 55 45 53 28 32   child6 VALUES(2
5b20: 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 3) }.} {1 {for
5b30: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
5b40: 68 20 2d 20 22 63 68 69 6c 64 36 22 20 72 65 66  h - "child6" ref
5b50: 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74  erencing "parent
5b60: 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  "}}.do_test e_fk
5b70: 65 79 2d 31 39 2e 35 20 7b 0a 20 20 63 61 74 63  ey-19.5 {.  catc
5b80: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
5b90: 54 4f 20 63 68 69 6c 64 37 20 56 41 4c 55 45 53  TO child7 VALUES
5ba0: 28 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  (3) }.} {1 {fore
5bb0: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
5bc0: 20 2d 20 22 63 68 69 6c 64 37 22 20 72 65 66 65   - "child7" refe
5bd0: 72 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 22  rencing "parent"
5be0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5c30: 20 54 65 73 74 20 65 72 72 6f 72 73 20 69 6e 20   Test errors in 
5c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
5c50: 65 6d 61 20 74 68 61 74 20 61 72 65 20 64 65 74  ema that are det
5c60: 65 63 74 65 64 20 77 68 69 6c 65 20 70 72 65 70  ected while prep
5c70: 61 72 69 6e 67 0a 23 20 44 4d 4c 20 73 74 61 74  aring.# DML stat
5c80: 65 6d 65 6e 74 73 2e 20 54 68 65 20 65 72 72 6f  ements. The erro
5c90: 72 20 74 65 78 74 20 66 6f 72 20 74 68 65 73 65  r text for these
5ca0: 20 6d 65 73 73 61 67 65 73 20 61 6c 77 61 79 73   messages always
5cb0: 20 6d 61 74 63 68 65 73 20 0a 23 20 65 69 74 68   matches .# eith
5cc0: 65 72 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  er "foreign key 
5cd0: 6d 69 73 6d 61 74 63 68 22 20 6f 72 20 22 6e 6f  mismatch" or "no
5ce0: 20 73 75 63 68 20 74 61 62 6c 65 2a 22 20 28 75   such table*" (u
5cf0: 73 69 6e 67 20 5b 73 74 72 69 6e 67 20 6d 61 74  sing [string mat
5d00: 63 68 5d 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ch])..#.# EVIDEN
5d10: 43 45 2d 4f 46 3a 20 52 2d 34 35 34 38 38 2d 30  CE-OF: R-45488-0
5d20: 38 35 30 34 20 49 66 20 74 68 65 20 64 61 74 61  8504 If the data
5d30: 62 61 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74  base schema cont
5d40: 61 69 6e 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  ains foreign key
5d50: 0a 23 20 65 72 72 6f 72 73 20 74 68 61 74 20 72  .# errors that r
5d60: 65 71 75 69 72 65 20 6c 6f 6f 6b 69 6e 67 20 61  equire looking a
5d70: 74 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  t more than one 
5d80: 74 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  table definition
5d90: 20 74 6f 0a 23 20 69 64 65 6e 74 69 66 79 2c 20   to.# identify, 
5da0: 74 68 65 6e 20 74 68 6f 73 65 20 65 72 72 6f 72  then those error
5db0: 73 20 61 72 65 20 6e 6f 74 20 64 65 74 65 63 74  s are not detect
5dc0: 65 64 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  ed when the tabl
5dd0: 65 73 20 61 72 65 0a 23 20 63 72 65 61 74 65 64  es are.# created
5de0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
5df0: 46 3a 20 52 2d 34 38 33 39 31 2d 33 38 34 37 32  F: R-48391-38472
5e00: 20 49 6e 73 74 65 61 64 2c 20 73 75 63 68 20 65   Instead, such e
5e10: 72 72 6f 72 73 20 70 72 65 76 65 6e 74 20 74 68  rrors prevent th
5e20: 65 0a 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  e.# application 
5e30: 66 72 6f 6d 20 70 72 65 70 61 72 69 6e 67 20 53  from preparing S
5e40: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  QL statements th
5e50: 61 74 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f  at modify the co
5e60: 6e 74 65 6e 74 20 6f 66 0a 23 20 74 68 65 20 63  ntent of.# the c
5e70: 68 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74  hild or parent t
5e80: 61 62 6c 65 73 20 69 6e 20 77 61 79 73 20 74 68  ables in ways th
5e90: 61 74 20 75 73 65 20 74 68 65 20 66 6f 72 65 69  at use the forei
5ea0: 67 6e 20 6b 65 79 73 2e 0a 23 0a 23 20 45 56 49  gn keys..#.# EVI
5eb0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 31 30  DENCE-OF: R-0310
5ec0: 38 2d 36 33 36 35 39 20 54 68 65 20 45 6e 67 6c  8-63659 The Engl
5ed0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
5ee0: 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 23  or message for.#
5ef0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c   foreign key DML
5f00: 20 65 72 72 6f 72 73 20 69 73 20 75 73 75 61 6c   errors is usual
5f10: 6c 79 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  ly "foreign key 
5f20: 6d 69 73 6d 61 74 63 68 22 20 62 75 74 20 63 61  mismatch" but ca
5f30: 6e 20 61 6c 73 6f 0a 23 20 62 65 20 22 6e 6f 20  n also.# be "no 
5f40: 73 75 63 68 20 74 61 62 6c 65 22 20 69 66 20 74  such table" if t
5f50: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
5f60: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
5f70: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5f80: 20 52 2d 36 30 37 38 31 2d 32 36 35 37 36 20 46   R-60781-26576 F
5f90: 6f 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65  oreign key DML e
5fa0: 72 72 6f 72 73 20 61 72 65 20 6d 61 79 20 62 65  rrors are may be
5fb0: 20 72 65 70 6f 72 74 65 64 0a 23 20 69 66 3a 20   reported.# if: 
5fc0: 54 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  The parent table
5fd0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
5fe0: 20 6f 72 20 54 68 65 20 70 61 72 65 6e 74 20 6b   or The parent k
5ff0: 65 79 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64  ey columns named
6000: 0a 23 20 69 6e 20 74 68 65 20 66 6f 72 65 69 67  .# in the foreig
6010: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
6020: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f   do not exist, o
6030: 72 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79  r The parent key
6040: 20 63 6f 6c 75 6d 6e 73 0a 23 20 6e 61 6d 65 64   columns.# named
6050: 20 69 6e 20 74 68 65 20 66 6f 72 65 69 67 6e 20   in the foreign 
6060: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  key constraint a
6070: 72 65 20 6e 6f 74 20 74 68 65 20 70 72 69 6d 61  re not the prima
6080: 72 79 20 6b 65 79 20 6f 66 20 74 68 65 0a 23 20  ry key of the.# 
6090: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64  parent table and
60a0: 20 61 72 65 20 6e 6f 74 20 73 75 62 6a 65 63 74   are not subject
60b0: 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 6f 6e   to a unique con
60c0: 73 74 72 61 69 6e 74 20 75 73 69 6e 67 0a 23 20  straint using.# 
60d0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
60e0: 63 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ce specified in 
60f0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6100: 2c 20 6f 72 20 54 68 65 20 63 68 69 6c 64 20 74  , or The child t
6110: 61 62 6c 65 0a 23 20 72 65 66 65 72 65 6e 63 65  able.# reference
6120: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
6130: 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  y of the parent 
6140: 77 69 74 68 6f 75 74 20 73 70 65 63 69 66 79 69  without specifyi
6150: 6e 67 20 74 68 65 0a 23 20 70 72 69 6d 61 72 79  ng the.# primary
6160: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
6170: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6180: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
6190: 6e 73 20 69 6e 20 74 68 65 0a 23 20 70 61 72 65  ns in the.# pare
61a0: 6e 74 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20  nt do not match 
61b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
61c0: 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ild key columns.
61d0: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
61e0: 79 2d 32 30 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-20.1 {.  execs
61f0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
6200: 54 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52  TABLE c1(c REFER
6210: 45 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62 6c  ENCES nosuchtabl
6220: 65 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  e, d);..    CREA
6230: 54 45 20 54 41 42 4c 45 20 70 32 28 61 2c 20 62  TE TABLE p2(a, b
6240: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
6250: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6260: 45 20 63 32 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c2(c, d, FOREI
6270: 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
6280: 45 52 45 4e 43 45 53 20 70 32 28 61 2c 20 78 29  ERENCES p2(a, x)
6290: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
62a0: 41 42 4c 45 20 70 33 28 61 20 50 52 49 4d 41 52  ABLE p3(a PRIMAR
62b0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
62c0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 63  REATE TABLE c3(c
62d0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 33 28 62   REFERENCES p3(b
62e0: 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  ), d);..    CREA
62f0: 54 45 20 54 41 42 4c 45 20 70 34 28 61 20 50 52  TE TABLE p4(a PR
6300: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
6310: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
6320: 20 49 4e 44 45 58 20 70 34 69 20 4f 4e 20 70 34   INDEX p4i ON p4
6330: 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (b COLLATE nocas
6340: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  e);.    CREATE T
6350: 41 42 4c 45 20 63 34 28 63 20 52 45 46 45 52 45  ABLE c4(c REFERE
6360: 4e 43 45 53 20 70 34 28 62 29 2c 20 64 29 3b 0a  NCES p4(b), d);.
6370: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6380: 45 20 70 35 28 61 20 50 52 49 4d 41 52 59 20 4b  E p5(a PRIMARY K
6390: 45 59 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f  EY, b COLLATE no
63a0: 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54  case);.    CREAT
63b0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70  E UNIQUE INDEX p
63c0: 35 69 20 4f 4e 20 70 35 28 62 20 43 4f 4c 4c 41  5i ON p5(b COLLA
63d0: 54 45 20 62 69 6e 61 72 79 29 3b 0a 20 20 20 20  TE binary);.    
63e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28  CREATE TABLE c5(
63f0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 35 28  c REFERENCES p5(
6400: 62 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45  b), d);..    CRE
6410: 41 54 45 20 54 41 42 4c 45 20 70 36 28 61 20 50  ATE TABLE p6(a P
6420: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
6430: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6440: 20 63 36 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c6(c, d, FOREIG
6450: 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
6460: 52 45 4e 43 45 53 20 70 36 29 3b 0a 0a 20 20 20  RENCES p6);..   
6470: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 37   CREATE TABLE p7
6480: 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  (a, b, PRIMARY K
6490: 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43  EY(a, b));.    C
64a0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 63  REATE TABLE c7(c
64b0: 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20 70  , d REFERENCES p
64c0: 37 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f  7);.  }.} {}..fo
64d0: 72 65 61 63 68 20 7b 74 6e 20 74 62 6c 20 70 74  reach {tn tbl pt
64e0: 62 6c 20 65 72 72 7d 20 7b 0a 20 20 32 20 63 31  bl err} {.  2 c1
64f0: 20 7b 7d 20 22 6e 6f 20 73 75 63 68 20 74 61 62   {} "no such tab
6500: 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74  le: main.nosucht
6510: 61 62 6c 65 22 0a 20 20 33 20 63 32 20 70 32 20  able".  3 c2 p2 
6520: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
6530: 6d 61 74 63 68 20 2d 20 5c 22 63 32 5c 22 20 72  match - \"c2\" r
6540: 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 32 5c  eferencing \"p2\
6550: 22 22 0a 20 20 34 20 63 33 20 70 33 20 22 66 6f  "".  4 c3 p3 "fo
6560: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6570: 63 68 20 2d 20 5c 22 63 33 5c 22 20 72 65 66 65  ch - \"c3\" refe
6580: 72 65 6e 63 69 6e 67 20 5c 22 70 33 5c 22 22 0a  rencing \"p3\"".
6590: 20 20 35 20 63 34 20 70 34 20 22 66 6f 72 65 69    5 c4 p4 "forei
65a0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
65b0: 2d 20 5c 22 63 34 5c 22 20 72 65 66 65 72 65 6e  - \"c4\" referen
65c0: 63 69 6e 67 20 5c 22 70 34 5c 22 22 0a 20 20 36  cing \"p4\"".  6
65d0: 20 63 35 20 70 35 20 22 66 6f 72 65 69 67 6e 20   c5 p5 "foreign 
65e0: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c  key mismatch - \
65f0: 22 63 35 5c 22 20 72 65 66 65 72 65 6e 63 69 6e  "c5\" referencin
6600: 67 20 5c 22 70 35 5c 22 22 0a 20 20 37 20 63 36  g \"p5\"".  7 c6
6610: 20 70 36 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p6 "foreign key
6620: 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 36   mismatch - \"c6
6630: 5c 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c  \" referencing \
6640: 22 70 36 5c 22 22 0a 20 20 38 20 63 37 20 70 37  "p6\"".  8 c7 p7
6650: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
6660: 73 6d 61 74 63 68 20 2d 20 5c 22 63 37 5c 22 20  smatch - \"c7\" 
6670: 72 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 37  referencing \"p7
6680: 5c 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  \"".} {.  do_tes
6690: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
66a0: 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  1 {.    catchsql
66b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74   "INSERT INTO $t
66c0: 62 6c 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  bl VALUES('a', '
66d0: 62 27 29 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31  b')".  } [list 1
66e0: 20 24 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73 74   $err].  do_test
66f0: 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 32   e_fkey-20.$tn.2
6700: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
6710: 22 55 50 44 41 54 45 20 24 74 62 6c 20 53 45 54  "UPDATE $tbl SET
6720: 20 63 20 3d 20 3f 2c 20 64 20 3d 20 3f 22 0a 20   c = ?, d = ?". 
6730: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d   } [list 1 $err]
6740: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
6750: 79 2d 32 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  y-20.$tn.3 {.   
6760: 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52   catchsql "INSER
6770: 54 20 49 4e 54 4f 20 24 74 62 6c 20 53 45 4c 45  T INTO $tbl SELE
6780: 43 54 20 3f 2c 20 3f 22 0a 20 20 7d 20 5b 6c 69  CT ?, ?".  } [li
6790: 73 74 20 31 20 24 65 72 72 5d 0a 0a 20 20 69 66  st 1 $err]..  if
67a0: 20 7b 24 70 74 62 6c 20 6e 65 20 22 22 7d 20 7b   {$ptbl ne ""} {
67b0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  .    do_test e_f
67c0: 6b 65 79 2d 32 30 2e 24 74 6e 2e 34 20 7b 0a 20  key-20.$tn.4 {. 
67d0: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 44       catchsql "D
67e0: 45 4c 45 54 45 20 46 52 4f 4d 20 24 70 74 62 6c  ELETE FROM $ptbl
67f0: 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20  ".    } [list 1 
6800: 24 65 72 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73  $err].    do_tes
6810: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
6820: 35 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  5 {.      catchs
6830: 71 6c 20 22 55 50 44 41 54 45 20 24 70 74 62 6c  ql "UPDATE $ptbl
6840: 20 53 45 54 20 61 20 3d 20 3f 2c 20 62 20 3d 20   SET a = ?, b = 
6850: 3f 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31  ?".    } [list 1
6860: 20 24 65 72 72 5d 0a 20 20 20 20 64 6f 5f 74 65   $err].    do_te
6870: 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e  st e_fkey-20.$tn
6880: 2e 36 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68  .6 {.      catch
6890: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
68a0: 20 24 70 74 62 6c 20 53 45 4c 45 43 54 20 3f 2c   $ptbl SELECT ?,
68b0: 20 3f 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20   ?".    } [list 
68c0: 31 20 24 65 72 72 5d 0a 20 20 7d 0a 7d 0a 0a 23  1 $err].  }.}..#
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
6920: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 33 35 33  ENCE-OF: R-19353
6930: 2d 34 33 36 34 33 0a 23 0a 23 20 54 65 73 74 20  -43643.#.# Test 
6940: 74 68 65 20 65 78 61 6d 70 6c 65 20 6f 66 20 66  the example of f
6950: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6960: 74 63 68 20 65 72 72 6f 72 73 20 63 61 75 73 65  tch errors cause
6970: 64 20 62 79 20 69 6d 70 6c 69 63 69 74 6c 79 0a  d by implicitly.
6980: 23 20 6d 61 70 70 69 6e 67 20 61 20 63 68 69 6c  # mapping a chil
6990: 64 20 6b 65 79 20 74 6f 20 74 68 65 20 70 72 69  d key to the pri
69a0: 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20  mary key of the 
69b0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 77 68 65  parent table whe
69c0: 6e 20 74 68 65 0a 23 20 63 68 69 6c 64 20 6b 65  n the.# child ke
69d0: 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  y consists of a 
69e0: 64 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72  different number
69f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74   of columns to t
6a00: 68 61 74 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  hat primary key.
6a10: 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  .# .drop_all_tab
6a20: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
6a30: 65 79 2d 32 31 2e 31 20 7b 0a 20 20 65 78 65 63  ey-21.1 {.  exec
6a40: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
6a50: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 32 28 61   TABLE parent2(a
6a60: 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
6a70: 28 61 2c 62 29 29 3b 0a 0a 20 20 20 20 43 52 45  (a,b));..    CRE
6a80: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 38  ATE TABLE child8
6a90: 28 78 2c 20 79 2c 20 46 4f 52 45 49 47 4e 20 4b  (x, y, FOREIGN K
6aa0: 45 59 28 78 2c 79 29 20 52 45 46 45 52 45 4e 43  EY(x,y) REFERENC
6ab0: 45 53 20 70 61 72 65 6e 74 32 29 3b 20 20 20 20  ES parent2);    
6ac0: 20 2d 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54   -- Ok.    CREAT
6ad0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 39 28 78  E TABLE child9(x
6ae0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
6af0: 6e 74 32 29 3b 20 20 20 20 20 20 20 20 20 20 20  nt2);           
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
6b10: 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45  - Err.    CREATE
6b20: 20 54 41 42 4c 45 20 63 68 69 6c 64 31 30 28 78   TABLE child10(x
6b30: 2c 79 2c 7a 2c 20 46 4f 52 45 49 47 4e 20 4b 45  ,y,z, FOREIGN KE
6b40: 59 28 78 2c 79 2c 7a 29 20 52 45 46 45 52 45 4e  Y(x,y,z) REFEREN
6b50: 43 45 53 20 70 61 72 65 6e 74 32 29 3b 20 2d 2d  CES parent2); --
6b60: 20 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   Err.  }.} {}.do
6b70: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6b80: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
6b90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6ba0: 70 61 72 65 6e 74 32 20 56 41 4c 55 45 53 28 27  parent2 VALUES('
6bb0: 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 49  I', 'II');.    I
6bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
6bd0: 38 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49  8 VALUES('I', 'I
6be0: 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  I');.  }.} {}.do
6bf0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6c00: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
6c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
6c20: 6c 64 39 20 56 41 4c 55 45 53 28 27 49 27 29 20  ld9 VALUES('I') 
6c30: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
6c40: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
6c50: 63 68 69 6c 64 39 22 20 72 65 66 65 72 65 6e 63  child9" referenc
6c60: 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a  ing "parent2"}}.
6c70: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
6c80: 31 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.4 {.  catchsql
6c90: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
6ca0: 68 69 6c 64 39 20 56 41 4c 55 45 53 28 27 49 49  hild9 VALUES('II
6cb0: 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  ') }.} {1 {forei
6cc0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
6cd0: 2d 20 22 63 68 69 6c 64 39 22 20 72 65 66 65 72  - "child9" refer
6ce0: 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22  encing "parent2"
6cf0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
6d00: 79 2d 32 31 2e 35 20 7b 0a 20 20 63 61 74 63 68  y-21.5 {.  catch
6d10: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
6d20: 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45 53 28  O child9 VALUES(
6d30: 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  NULL) }.} {1 {fo
6d40: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6d50: 63 68 20 2d 20 22 63 68 69 6c 64 39 22 20 72 65  ch - "child9" re
6d60: 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65 6e  ferencing "paren
6d70: 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  t2"}}.do_test e_
6d80: 66 6b 65 79 2d 32 31 2e 36 20 7b 0a 20 20 63 61  fkey-21.6 {.  ca
6d90: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6da0: 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41 4c  INTO child10 VAL
6db0: 55 45 53 28 27 49 27 2c 20 27 49 49 27 2c 20 27  UES('I', 'II', '
6dc0: 49 49 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  III') }.} {1 {fo
6dd0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6de0: 63 68 20 2d 20 22 63 68 69 6c 64 31 30 22 20 72  ch - "child10" r
6df0: 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65  eferencing "pare
6e00: 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  nt2"}}.do_test e
6e10: 5f 66 6b 65 79 2d 32 31 2e 37 20 7b 0a 20 20 63  _fkey-21.7 {.  c
6e20: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
6e30: 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41   INTO child10 VA
6e40: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a  LUES(1, 2, 3) }.
6e50: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
6e60: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68  y mismatch - "ch
6e70: 69 6c 64 31 30 22 20 72 65 66 65 72 65 6e 63 69  ild10" referenci
6e80: 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a 64  ng "parent2"}}.d
6e90: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31  o_test e_fkey-21
6ea0: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
6eb0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68  { INSERT INTO ch
6ec0: 69 6c 64 31 30 20 56 41 4c 55 45 53 28 4e 55 4c  ild10 VALUES(NUL
6ed0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d  L, NULL, NULL) }
6ee0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
6ef0: 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63  ey mismatch - "c
6f00: 68 69 6c 64 31 30 22 20 72 65 66 65 72 65 6e 63  hild10" referenc
6f10: 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a  ing "parent2"}}.
6f20: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
6f70: 73 74 20 65 72 72 6f 72 73 20 74 68 61 74 20 61  st errors that a
6f80: 72 65 20 72 65 70 6f 72 74 65 64 20 77 68 65 6e  re reported when
6f90: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 63 68   creating the ch
6fa0: 69 6c 64 20 74 61 62 6c 65 2e 20 0a 23 20 53 70  ild table. .# Sp
6fb0: 65 63 69 66 69 63 61 6c 6c 79 3a 0a 23 0a 23 20  ecifically:.#.# 
6fc0: 20 20 2a 20 64 69 66 66 65 72 65 6e 74 20 6e 75    * different nu
6fd0: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 61 6e  mber of child an
6fe0: 64 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  d parent key col
6ff0: 75 6d 6e 73 2c 20 61 6e 64 0a 23 20 20 20 2a 20  umns, and.#   * 
7000: 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 73 20 74 68  child columns th
7010: 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2e  at do not exist.
7020: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
7030: 3a 20 52 2d 32 33 36 38 32 2d 35 39 38 32 30 20  : R-23682-59820 
7040: 42 79 20 63 6f 6e 74 72 61 73 74 2c 20 69 66 20  By contrast, if 
7050: 66 6f 72 65 69 67 6e 20 6b 65 79 20 65 72 72 6f  foreign key erro
7060: 72 73 20 63 61 6e 20 62 65 0a 23 20 72 65 63 6f  rs can be.# reco
7070: 67 6e 69 7a 65 64 20 73 69 6d 70 6c 79 20 62 79  gnized simply by
7080: 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20   looking at the 
7090: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
70a0: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e  e child table an
70b0: 64 0a 23 20 77 69 74 68 6f 75 74 20 68 61 76 69  d.# without havi
70c0: 6e 67 20 74 6f 20 63 6f 6e 73 75 6c 74 20 74 68  ng to consult th
70d0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64  e parent table d
70e0: 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 6e 20  efinition, then 
70f0: 74 68 65 20 43 52 45 41 54 45 0a 23 20 54 41 42  the CREATE.# TAB
7100: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  LE statement for
7110: 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
7120: 20 66 61 69 6c 73 2e 0a 23 0a 23 20 54 68 65 73   fails..#.# Thes
7130: 65 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70  e errors are rep
7140: 6f 72 74 65 64 20 77 68 65 74 68 65 72 20 6f 72  orted whether or
7150: 20 6e 6f 74 20 46 4b 20 73 75 70 70 6f 72 74 20   not FK support 
7160: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 23 20  is enabled..#.# 
7170: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
7180: 33 38 38 33 2d 32 38 38 33 33 20 46 6f 72 65 69  3883-28833 Forei
7190: 67 6e 20 6b 65 79 20 44 44 4c 20 65 72 72 6f 72  gn key DDL error
71a0: 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 0a 23  s are reported.#
71b0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
71c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f  hether or not fo
71d0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
71e0: 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
71f0: 64 20 77 68 65 6e 0a 23 20 74 68 65 20 74 61 62  d when.# the tab
7200: 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23  le is created..#
7210: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
7220: 0a 66 6f 72 65 61 63 68 20 66 6b 20 5b 6c 69 73  .foreach fk [lis
7230: 74 20 4f 46 46 20 4f 4e 5d 20 7b 0a 20 20 65 78  t OFF ON] {.  ex
7240: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 66 6f  ecsql "PRAGMA fo
7250: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 24 66 6b  reign_keys = $fk
7260: 22 0a 20 20 73 65 74 20 69 20 30 0a 20 20 66 6f  ".  set i 0.  fo
7270: 72 65 61 63 68 20 7b 73 71 6c 20 65 72 72 6f 72  reach {sql error
7280: 7d 20 7b 0a 20 20 20 20 22 43 52 45 41 54 45 20  } {.    "CREATE 
7290: 54 41 42 4c 45 20 63 68 69 6c 64 31 28 61 2c 20  TABLE child1(a, 
72a0: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
72b0: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
72c0: 70 28 63 29 29 22 0a 20 20 20 20 20 20 7b 6e 75  p(c))".      {nu
72d0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
72e0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
72f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
7300: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7310: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
7320: 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 20 20 20  enced table}.   
7330: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
7340: 68 69 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52 45  hild2(a, b, FORE
7350: 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45  IGN KEY(a, b) RE
7360: 46 45 52 45 4e 43 45 53 20 70 28 63 2c 20 64 2c  FERENCES p(c, d,
7370: 20 65 29 29 22 0a 20 20 20 20 20 20 7b 6e 75 6d   e))".      {num
7380: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
7390: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
73a0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
73b0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
73c0: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
73d0: 6e 63 65 64 20 74 61 62 6c 65 7d 0a 20 20 20 20  nced table}.    
73e0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68  "CREATE TABLE ch
73f0: 69 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49  ild2(a, b, FOREI
7400: 47 4e 20 4b 45 59 28 61 2c 20 63 29 20 52 45 46  GN KEY(a, c) REF
7410: 45 52 45 4e 43 45 53 20 70 28 63 2c 20 64 29 29  ERENCES p(c, d))
7420: 22 0a 20 20 20 20 20 20 7b 75 6e 6b 6e 6f 77 6e  ".      {unknown
7430: 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66   column "c" in f
7440: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
7450: 69 74 69 6f 6e 7d 0a 20 20 20 20 22 43 52 45 41  ition}.    "CREA
7460: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
7470: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7480: 59 28 63 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(c, b) REFERENC
7490: 45 53 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20  ES p(c, d))".   
74a0: 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     {unknown colu
74b0: 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67  mn "c" in foreig
74c0: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
74d0: 7d 0a 20 20 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  }.  } {.    do_t
74e0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 32 2e 24 66  est e_fkey-22.$f
74f0: 6b 2e 5b 69 6e 63 72 20 69 5d 20 7b 0a 20 20 20  k.[incr i] {.   
7500: 20 20 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c     catchsql $sql
7510: 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 24  .    } [list 1 $
7520: 65 72 72 6f 72 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d  error].  }.}..#-
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
7580: 74 68 61 74 20 61 20 52 45 46 45 52 45 4e 43 49  that a REFERENCI
7590: 4e 47 20 63 6c 61 75 73 65 20 74 68 61 74 20 64  NG clause that d
75a0: 6f 65 73 20 6e 6f 74 20 73 70 65 63 69 66 79 20  oes not specify 
75b0: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
75c0: 6e 73 0a 23 20 69 6d 70 6c 69 63 69 74 6c 79 20  ns.# implicitly 
75d0: 6d 61 70 73 20 74 6f 20 74 68 65 20 70 72 69 6d  maps to the prim
75e0: 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70  ary key of the p
75f0: 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 23  arent table..#.#
7600: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7610: 34 33 38 37 39 2d 30 38 30 32 35 20 41 74 74 61  43879-08025 Atta
7620: 63 68 69 6e 67 20 61 20 22 52 45 46 45 52 45 4e  ching a "REFEREN
7630: 43 45 53 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c  CES <parent-tabl
7640: 65 3e 22 0a 23 20 63 6c 61 75 73 65 20 74 6f 20  e>".# clause to 
7650: 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
7660: 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 66 6f  ion creates a fo
7670: 72 65 69 67 6e 0a 23 20 6b 65 79 20 63 6f 6e 73  reign.# key cons
7680: 74 72 61 69 6e 74 20 74 68 61 74 20 6d 61 70 73  traint that maps
7690: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   the column to t
76a0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f  he primary key o
76b0: 66 0a 23 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c  f.# <parent-tabl
76c0: 65 3e 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 65  e>..# .do_test e
76d0: 5f 66 6b 65 79 2d 32 33 2e 31 20 7b 0a 20 20 65  _fkey-23.1 {.  e
76e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
76f0: 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 2c 20  ATE TABLE p1(a, 
7700: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
7710: 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , b));.    CREAT
7720: 45 20 54 41 42 4c 45 20 70 32 28 61 2c 20 62 20  E TABLE p2(a, b 
7730: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
7740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
7750: 31 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20  1(c, d, FOREIGN 
7760: 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45  KEY(c, d) REFERE
7770: 4e 43 45 53 20 70 31 29 3b 0a 20 20 20 20 43 52  NCES p1);.    CR
7780: 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c  EATE TABLE c2(a,
7790: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 32   b REFERENCES p2
77a0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63  );.  }.} {}.proc
77b0: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 7b   test_efkey_60 {
77c0: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
77d0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
77e0: 65 79 2d 32 33 2e 24 74 6e 20 22 0a 20 20 20 20  ey-23.$tn ".    
77f0: 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a  catchsql {$sql}.
7800: 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20    " [lindex {{0 
7810: 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  {}} {1 {foreign 
7820: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
7830: 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f  ailed}}} $isErro
7840: 72 5d 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79  r].}..test_efkey
7850: 5f 36 30 20 32 20 31 20 22 49 4e 53 45 52 54 20  _60 2 1 "INSERT 
7860: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32  INTO c1 VALUES(2
7870: 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65  39, 231)".test_e
7880: 66 6b 65 79 5f 36 30 20 33 20 30 20 22 49 4e 53  fkey_60 3 0 "INS
7890: 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
78a0: 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65  ES(239, 231)".te
78b0: 73 74 5f 65 66 6b 65 79 5f 36 30 20 34 20 30 20  st_efkey_60 4 0 
78c0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20  "INSERT INTO c1 
78d0: 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29  VALUES(239, 231)
78e0: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20  ".test_efkey_60 
78f0: 35 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  5 1 "INSERT INTO
7900: 20 63 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20   c2 VALUES(239, 
7910: 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  231)".test_efkey
7920: 5f 36 30 20 36 20 30 20 22 49 4e 53 45 52 54 20  _60 6 0 "INSERT 
7930: 49 4e 54 4f 20 70 32 20 56 41 4c 55 45 53 28 32  INTO p2 VALUES(2
7940: 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65  39, 231)".test_e
7950: 66 6b 65 79 5f 36 30 20 37 20 30 20 22 49 4e 53  fkey_60 7 0 "INS
7960: 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55  ERT INTO c2 VALU
7970: 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a 0a 23  ES(239, 231)"..#
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
79d0: 20 74 68 61 74 20 61 6e 20 69 6e 64 65 78 20 6f   that an index o
79e0: 6e 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 6b  n on the child k
79f0: 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e  ey columns of an
7a00: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23   FK constraint.#
7a10: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 23 0a   is optional..#.
7a20: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7a30: 2d 31 35 34 31 37 2d 32 38 30 31 34 20 49 6e 64  -15417-28014 Ind
7a40: 69 63 65 73 20 61 72 65 20 6e 6f 74 20 72 65 71  ices are not req
7a50: 75 69 72 65 64 20 66 6f 72 20 63 68 69 6c 64 20  uired for child 
7a60: 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 0a 23 0a  key.# columns.#.
7a70: 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74  # Also test that
7a80: 20 69 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20   if an index is 
7a90: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 65 20 63  created on the c
7aa0: 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  hild key columns
7ab0: 2c 20 69 74 20 64 6f 65 73 0a 23 20 6e 6f 74 20  , it does.# not 
7ac0: 6d 61 6b 65 20 61 20 64 69 66 66 65 72 65 6e 63  make a differenc
7ad0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
7ae0: 20 69 74 20 69 73 20 61 20 55 4e 49 51 55 45 20   it is a UNIQUE 
7af0: 69 6e 64 65 78 2e 0a 23 0a 23 20 45 56 49 44 45  index..#.# EVIDE
7b00: 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 37 34 31 2d  NCE-OF: R-15741-
7b10: 35 30 38 39 33 20 54 68 65 20 63 68 69 6c 64 20  50893 The child 
7b20: 6b 65 79 20 69 6e 64 65 78 20 64 6f 65 73 20 6e  key index does n
7b30: 6f 74 20 68 61 76 65 20 74 6f 20 62 65 0a 23 20  ot have to be.# 
7b40: 28 61 6e 64 20 75 73 75 61 6c 6c 79 20 77 69 6c  (and usually wil
7b50: 6c 20 6e 6f 74 20 62 65 29 20 61 20 55 4e 49 51  l not be) a UNIQ
7b60: 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70  UE index..#.drop
7b70: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
7b80: 65 73 74 20 65 5f 66 6b 65 79 2d 32 34 2e 31 20  est e_fkey-24.1 
7b90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7ba0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
7bb0: 61 72 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51  arent(x, y, UNIQ
7bc0: 55 45 28 79 2c 20 78 29 29 3b 0a 20 20 20 20 43  UE(y, x));.    C
7bd0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61  REATE TABLE c1(a
7be0: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
7bf0: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
7c00: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b  S parent(x, y));
7c10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7c20: 45 20 63 32 28 61 2c 20 62 2c 20 46 4f 52 45 49  E c2(a, b, FOREI
7c30: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
7c40: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
7c50: 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , y));.    CREAT
7c60: 45 20 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c  E TABLE c3(a, b,
7c70: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
7c80: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  b) REFERENCES pa
7c90: 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20  rent(x, y));.   
7ca0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 32   CREATE INDEX c2
7cb0: 69 20 4f 4e 20 63 32 28 61 2c 20 62 29 3b 0a 20  i ON c2(a, b);. 
7cc0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
7cd0: 20 49 4e 44 45 58 20 63 33 69 20 4f 4e 20 63 32   INDEX c3i ON c2
7ce0: 28 62 2c 20 61 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (b, a);.  }.} {}
7cf0: 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79  .proc test_efkey
7d00: 5f 36 31 20 7b 74 6e 20 69 73 45 72 72 6f 72 20  _61 {tn isError 
7d10: 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  sql} {.  do_test
7d20: 20 65 5f 66 6b 65 79 2d 32 34 2e 24 74 6e 20 22   e_fkey-24.$tn "
7d30: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24  .    catchsql {$
7d40: 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78  sql}.  " [lindex
7d50: 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72   {{0 {}} {1 {for
7d60: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
7d70: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69  int failed}}} $i
7d80: 73 45 72 72 6f 72 5d 0a 7d 0a 66 6f 72 65 61 63  sError].}.foreac
7d90: 68 20 7b 74 6e 20 63 7d 20 5b 6c 69 73 74 20 32  h {tn c} [list 2
7da0: 20 63 31 20 33 20 63 32 20 34 20 63 33 5d 20 7b   c1 3 c2 4 c3] {
7db0: 0a 20 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31  .  test_efkey_61
7dc0: 20 24 74 6e 2e 31 20 31 20 22 49 4e 53 45 52 54   $tn.1 1 "INSERT
7dd0: 20 49 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28   INTO $c VALUES(
7de0: 31 2c 20 32 29 22 0a 20 20 74 65 73 74 5f 65 66  1, 2)".  test_ef
7df0: 6b 65 79 5f 36 31 20 24 74 6e 2e 32 20 30 20 22  key_61 $tn.2 0 "
7e00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
7e10: 6e 74 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  nt VALUES(1, 2)"
7e20: 0a 20 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31  .  test_efkey_61
7e30: 20 24 74 6e 2e 33 20 30 20 22 49 4e 53 45 52 54   $tn.3 0 "INSERT
7e40: 20 49 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28   INTO $c VALUES(
7e50: 31 2c 20 32 29 22 0a 0a 20 20 65 78 65 63 73 71  1, 2)"..  execsq
7e60: 6c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 24  l "DELETE FROM $
7e70: 63 20 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  c ; DELETE FROM 
7e80: 70 61 72 65 6e 74 22 0a 7d 0a 0a 23 2d 2d 2d 2d  parent".}..#----
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
7ee0: 2d 4f 46 3a 20 52 2d 30 30 32 37 39 2d 35 32 32  -OF: R-00279-522
7ef0: 38 33 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65  83.#.# Test an e
7f00: 78 61 6d 70 6c 65 20 73 68 6f 77 69 6e 67 20 74  xample showing t
7f10: 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69  hat when a row i
7f20: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  s deleted from t
7f30: 68 65 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62  he parent .# tab
7f40: 6c 65 2c 20 74 68 65 20 63 68 69 6c 64 20 74 61  le, the child ta
7f50: 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66  ble is queried f
7f60: 6f 72 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 73  or orphaned rows
7f70: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23   as follows:.#.#
7f80: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20     SELECT rowid 
7f90: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
7fa0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 3f   trackartist = ?
7fb0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
7fc0: 3a 20 52 2d 32 33 33 30 32 2d 33 30 39 35 36 20  : R-23302-30956 
7fd0: 49 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 72  If this SELECT r
7fe0: 65 74 75 72 6e 73 20 61 6e 79 20 72 6f 77 73 20  eturns any rows 
7ff0: 61 74 20 61 6c 6c 2c 0a 23 20 74 68 65 6e 20 53  at all,.# then S
8000: 51 4c 69 74 65 20 63 6f 6e 63 6c 75 64 65 73 20  QLite concludes 
8010: 74 68 61 74 20 64 65 6c 65 74 69 6e 67 20 74 68  that deleting th
8020: 65 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 70  e row from the p
8030: 61 72 65 6e 74 20 74 61 62 6c 65 0a 23 20 77 6f  arent table.# wo
8040: 75 6c 64 20 76 69 6f 6c 61 74 65 20 74 68 65 20  uld violate the 
8050: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
8060: 74 72 61 69 6e 74 20 61 6e 64 20 72 65 74 75 72  traint and retur
8070: 6e 73 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64  ns an error..#.d
8080: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35  o_test e_fkey-25
8090: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
80a0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
80b0: 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20  E artist(.      
80c0: 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45  artistid    INTE
80d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
80e0: 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61   .      artistna
80f0: 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a  me  TEXT.    );.
8100: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8110: 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72   track(.      tr
8120: 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45  ackid     INTEGE
8130: 52 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 6e  R, .      trackn
8140: 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20  ame   TEXT, .   
8150: 20 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49     trackartist I
8160: 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 46 4f  NTEGER,.      FO
8170: 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61  REIGN KEY(tracka
8180: 72 74 69 73 74 29 20 52 45 46 45 52 45 4e 43 45  rtist) REFERENCE
8190: 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
81a0: 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  d).    );.  }.} 
81b0: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
81c0: 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 32 20 7b  st e_fkey-25.2 {
81d0: 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  .  PRAGMA foreig
81e0: 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20  n_keys = OFF;.  
81f0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8200: 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  AN DELETE FROM a
8210: 72 74 69 73 74 20 57 48 45 52 45 20 31 3b 0a 20  rtist WHERE 1;. 
8220: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
8230: 4c 41 4e 20 53 45 4c 45 43 54 20 72 6f 77 69 64  LAN SELECT rowid
8240: 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52   FROM track WHER
8250: 45 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20  E trackartist = 
8260: 3f 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  ?;.} {.  0 0 0 {
8270: 53 43 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73  SCAN TABLE artis
8280: 74 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 43 41  t} .  0 0 0 {SCA
8290: 4e 20 54 41 42 4c 45 20 74 72 61 63 6b 7d 0a 7d  N TABLE track}.}
82a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
82b0: 20 65 5f 66 6b 65 79 2d 32 35 2e 33 20 7b 0a 20   e_fkey-25.3 {. 
82c0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
82d0: 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 45 58 50  keys = ON;.  EXP
82e0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
82f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
8300: 73 74 20 57 48 45 52 45 20 31 3b 0a 7d 20 7b 0a  st WHERE 1;.} {.
8310: 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41    0 0 0 {SCAN TA
8320: 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20 20 30  BLE artist} .  0
8330: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
8340: 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f 74 65 73   track}.}.do_tes
8350: 74 20 65 5f 66 6b 65 79 2d 32 35 2e 34 20 7b 0a  t e_fkey-25.4 {.
8360: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8370: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
8380: 73 74 20 56 41 4c 55 45 53 28 35 2c 20 27 61 72  st VALUES(5, 'ar
8390: 74 69 73 74 20 35 27 29 3b 0a 20 20 20 20 49 4e  tist 5');.    IN
83a0: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
83b0: 20 56 41 4c 55 45 53 28 36 2c 20 27 61 72 74 69   VALUES(6, 'arti
83c0: 73 74 20 36 27 29 3b 0a 20 20 20 20 49 4e 53 45  st 6');.    INSE
83d0: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
83e0: 41 4c 55 45 53 28 37 2c 20 27 61 72 74 69 73 74  ALUES(7, 'artist
83f0: 20 37 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   7');.    INSERT
8400: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
8410: 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c  ES(1, 'track 1',
8420: 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   5);.    INSERT 
8430: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
8440: 53 28 32 2c 20 27 74 72 61 63 6b 20 32 27 2c 20  S(2, 'track 2', 
8450: 36 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  6);.  }.} {}..do
8460: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e  _test e_fkey-25.
8470: 35 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20  5 {.  concat \. 
8480: 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45     [execsql { SE
8490: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
84a0: 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63  track WHERE trac
84b0: 6b 61 72 74 69 73 74 20 3d 20 35 20 7d 5d 20 20  kartist = 5 }]  
84c0: 20 5c 0a 20 20 20 20 5b 63 61 74 63 68 73 71 6c   \.    [catchsql
84d0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61   { DELETE FROM a
84e0: 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
84f0: 73 74 69 64 20 3d 20 35 20 7d 5d 0a 7d 20 7b 31  stid = 5 }].} {1
8500: 20 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20   1 {foreign key 
8510: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
8520: 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66  d}}..do_test e_f
8530: 6b 65 79 2d 32 35 2e 36 20 7b 0a 20 20 63 6f 6e  key-25.6 {.  con
8540: 63 61 74 20 5c 0a 20 20 20 20 5b 65 78 65 63 73  cat \.    [execs
8550: 71 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69  ql { SELECT rowi
8560: 64 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45  d FROM track WHE
8570: 52 45 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d  RE trackartist =
8580: 20 37 20 7d 5d 20 20 20 5c 0a 20 20 20 20 5b 63   7 }]   \.    [c
8590: 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
85a0: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
85b0: 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 37 20  RE artistid = 7 
85c0: 7d 5d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f  }].} {0 {}}..do_
85d0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 37  test e_fkey-25.7
85e0: 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20   {.  concat \.  
85f0: 20 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c    [execsql { SEL
8600: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
8610: 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b  rack WHERE track
8620: 61 72 74 69 73 74 20 3d 20 36 20 7d 5d 20 20 20  artist = 6 }]   
8630: 5c 0a 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20  \.    [catchsql 
8640: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72  { DELETE FROM ar
8650: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
8660: 74 69 64 20 3d 20 36 20 7d 5d 0a 7d 20 7b 32 20  tid = 6 }].} {2 
8670: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
8680: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
8690: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
86e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
86f0: 34 37 39 33 36 2d 31 30 30 34 34 20 4f 72 2c 20  47936-10044 Or, 
8700: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 6c 79 3a 0a  more generally:.
8710: 23 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46  # SELECT rowid F
8720: 52 4f 4d 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65  ROM <child-table
8730: 3e 20 57 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b  > WHERE <child-k
8740: 65 79 3e 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65  ey> = :parent_ke
8750: 79 5f 76 61 6c 75 65 0a 23 0a 23 20 54 65 73 74  y_value.#.# Test
8760: 20 74 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77   that when a row
8770: 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
8780: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
8790: 65 20 6f 66 20 61 6e 20 46 4b 20 0a 23 20 63 6f  e of an FK .# co
87a0: 6e 73 74 72 61 69 6e 74 2c 20 74 68 65 20 63 68  nstraint, the ch
87b0: 69 6c 64 20 74 61 62 6c 65 20 69 73 20 71 75 65  ild table is que
87c0: 72 69 65 64 20 66 6f 72 20 6f 72 70 68 61 6e 65  ried for orphane
87d0: 64 20 72 6f 77 73 2e 20 54 68 65 0a 23 20 71 75  d rows. The.# qu
87e0: 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ery is equivalen
87f0: 74 20 74 6f 3a 0a 23 0a 23 20 20 20 53 45 4c 45  t to:.#.#   SELE
8800: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63  CT rowid FROM <c
8810: 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52  hild-table> WHER
8820: 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20  E <child-key> = 
8830: 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75  :parent_key_valu
8840: 65 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20  e.#.# Also test 
8850: 74 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20  that when a row 
8860: 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  is inserted into
8870: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
8880: 65 2c 20 6f 72 20 77 68 65 6e 20 74 68 65 20 0a  e, or when the .
8890: 23 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c  # parent key val
88a0: 75 65 73 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ues of an existi
88b0: 6e 67 20 72 6f 77 20 61 72 65 20 6d 6f 64 69 66  ng row are modif
88c0: 69 65 64 2c 20 61 20 71 75 65 72 79 20 65 71 75  ied, a query equ
88d0: 69 76 61 6c 65 6e 74 0a 23 20 74 6f 20 74 68 65  ivalent.# to the
88e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 70 6c   following is pl
88f0: 61 6e 6e 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63  anned. In some c
8900: 61 73 65 73 20 69 74 20 69 73 20 6e 6f 74 20 65  ases it is not e
8910: 78 65 63 75 74 65 64 2c 20 62 75 74 20 69 74 0a  xecuted, but it.
8920: 23 20 69 73 20 61 6c 77 61 79 73 20 70 6c 61 6e  # is always plan
8930: 6e 65 64 2e 0a 23 0a 23 20 20 20 53 45 4c 45 43  ned..#.#   SELEC
8940: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68  T rowid FROM <ch
8950: 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45  ild-table> WHERE
8960: 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a   <child-key> = :
8970: 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65  parent_key_value
8980: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
8990: 3a 20 52 2d 36 31 36 31 36 2d 34 36 37 30 30 20  : R-61616-46700 
89a0: 53 69 6d 69 6c 61 72 20 71 75 65 72 69 65 73 20  Similar queries 
89b0: 6d 61 79 20 62 65 20 72 75 6e 20 69 66 20 74 68  may be run if th
89c0: 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6f 66 20 74  e content.# of t
89d0: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73  he parent key is
89e0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 61 20 6e   modified or a n
89f0: 65 77 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  ew row is insert
8a00: 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ed into the pare
8a10: 6e 74 0a 23 20 74 61 62 6c 65 2e 0a 23 0a 23 0a  nt.# table..#.#.
8a20: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
8a30: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8a40: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
8a50: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70  { CREATE TABLE p
8a60: 61 72 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51  arent(x, y, UNIQ
8a70: 55 45 28 79 2c 20 78 29 29 20 7d 0a 7d 20 7b 7d  UE(y, x)) }.} {}
8a80: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c  .foreach {tn sql
8a90: 7d 20 7b 0a 20 20 32 20 7b 20 0a 20 20 20 20 43  } {.  2 { .    C
8aa0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
8ab0: 64 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  d(a, b, FOREIGN 
8ac0: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
8ad0: 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79  NCES parent(x, y
8ae0: 29 29 0a 20 20 7d 0a 20 20 33 20 7b 20 0a 20 20  )).  }.  3 { .  
8af0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
8b00: 68 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49  hild(a, b, FOREI
8b10: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
8b20: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
8b30: 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , y));.    CREAT
8b40: 45 20 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f  E INDEX childi O
8b50: 4e 20 63 68 69 6c 64 28 61 2c 20 62 29 3b 0a 20  N child(a, b);. 
8b60: 20 7d 0a 20 20 34 20 7b 20 0a 20 20 20 20 43 52   }.  4 { .    CR
8b70: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
8b80: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
8b90: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
8ba0: 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29  CES parent(x, y)
8bb0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  );.    CREATE UN
8bc0: 49 51 55 45 20 49 4e 44 45 58 20 63 68 69 6c 64  IQUE INDEX child
8bd0: 69 20 4f 4e 20 63 68 69 6c 64 28 62 2c 20 61 29  i ON child(b, a)
8be0: 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63  ;.  }.} {.  exec
8bf0: 73 71 6c 20 24 73 71 6c 0a 0a 20 20 65 78 65 63  sql $sql..  exec
8c00: 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65  sql {PRAGMA fore
8c10: 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 7d 0a  ign_keys = OFF}.
8c20: 20 20 73 65 74 20 64 65 6c 65 74 65 20 5b 63 6f    set delete [co
8c30: 6e 63 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71  ncat \.      [eq
8c40: 70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  p "DELETE FROM p
8c50: 61 72 65 6e 74 20 57 48 45 52 45 20 31 22 5d 20  arent WHERE 1"] 
8c60: 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53 45  \.      [eqp "SE
8c70: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
8c80: 63 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20  child WHERE a = 
8c90: 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20  ? AND b = ?"].  
8ca0: 5d 0a 20 20 73 65 74 20 75 70 64 61 74 65 20 5b  ].  set update [
8cb0: 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 20 20 5b  concat \.      [
8cc0: 65 71 70 20 22 55 50 44 41 54 45 20 70 61 72 65  eqp "UPDATE pare
8cd0: 6e 74 20 53 45 54 20 78 3d 3f 2c 20 79 3d 3f 22  nt SET x=?, y=?"
8ce0: 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22  ] \.      [eqp "
8cf0: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
8d00: 4d 20 63 68 69 6c 64 20 57 48 45 52 45 20 61 20  M child WHERE a 
8d10: 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d 20  = ? AND b = ?"] 
8d20: 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53 45  \.      [eqp "SE
8d30: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
8d40: 63 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20  child WHERE a = 
8d50: 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20  ? AND b = ?"].  
8d60: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  ].  execsql {PRA
8d70: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
8d80: 20 3d 20 4f 4e 7d 0a 0a 20 20 64 6f 5f 74 65 73   = ON}..  do_tes
8d90: 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24 74 6e 2e  t e_fkey-26.$tn.
8da0: 31 20 7b 20 65 71 70 20 22 44 45 4c 45 54 45 20  1 { eqp "DELETE 
8db0: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
8dc0: 45 20 31 22 20 7d 20 24 64 65 6c 65 74 65 0a 20  E 1" } $delete. 
8dd0: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
8de0: 32 36 2e 24 74 6e 2e 32 20 7b 20 65 71 70 20 22  26.$tn.2 { eqp "
8df0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 73 65  UPDATE parent se
8e00: 74 20 78 3d 3f 2c 20 79 3d 3f 22 20 7d 20 24 75  t x=?, y=?" } $u
8e10: 70 64 61 74 65 0a 0a 20 20 65 78 65 63 73 71 6c  pdate..  execsql
8e20: 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 63 68 69   {DROP TABLE chi
8e30: 6c 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ld}.}..#--------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
8e90: 20 52 2d 31 34 35 35 33 2d 33 34 30 31 33 0a 23   R-14553-34013.#
8ea0: 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d  .# Test the exam
8eb0: 70 6c 65 20 73 63 68 65 6d 61 20 61 74 20 74 68  ple schema at th
8ec0: 65 20 65 6e 64 20 6f 66 20 73 65 63 74 69 6f 6e  e end of section
8ed0: 20 33 2e 20 41 6c 73 6f 20 74 65 73 74 20 74 68   3. Also test th
8ee0: 61 74 20 69 73 0a 23 20 69 73 20 22 65 66 66 69  at is.# is "effi
8ef0: 63 69 65 6e 74 22 2e 20 49 6e 20 74 68 69 73 20  cient". In this 
8f00: 63 61 73 65 20 22 65 66 66 69 63 69 65 6e 74 22  case "efficient"
8f10: 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6f 72 65   means that fore
8f20: 69 67 6e 20 6b 65 79 0a 23 20 72 65 6c 61 74 65  ign key.# relate
8f30: 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  d operations on 
8f40: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
8f50: 20 64 6f 20 6e 6f 74 20 70 72 6f 76 6f 6b 65 20   do not provoke 
8f60: 6c 69 6e 65 61 72 20 73 63 61 6e 73 2e 0a 23 0a  linear scans..#.
8f70: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
8f80: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8f90: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
8fa0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
8fb0: 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20  LE artist(.     
8fc0: 20 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54   artistid    INT
8fd0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8fe0: 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e  , .      artistn
8ff0: 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b  ame  TEXT.    );
9000: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9010: 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74  E track(.      t
9020: 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47  rackid     INTEG
9030: 45 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e  ER,.      trackn
9040: 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20  ame   TEXT, .   
9050: 20 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49     trackartist I
9060: 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45  NTEGER REFERENCE
9070: 53 20 61 72 74 69 73 74 0a 20 20 20 20 29 3b 0a  S artist.    );.
9080: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
9090: 20 74 72 61 63 6b 69 6e 64 65 78 20 4f 4e 20 74   trackindex ON t
90a0: 72 61 63 6b 28 74 72 61 63 6b 61 72 74 69 73 74  rack(trackartist
90b0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
90c0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 32 20  est e_fkey-27.2 
90d0: 7b 0a 20 20 65 71 70 20 7b 20 49 4e 53 45 52 54  {.  eqp { INSERT
90e0: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
90f0: 55 45 53 28 3f 2c 20 3f 29 20 7d 0a 7d 20 7b 7d  UES(?, ?) }.} {}
9100: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9110: 20 65 5f 66 6b 65 79 2d 32 37 2e 33 20 7b 0a 20   e_fkey-27.3 {. 
9120: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
9130: 4c 41 4e 20 55 50 44 41 54 45 20 61 72 74 69 73  LAN UPDATE artis
9140: 74 20 53 45 54 20 61 72 74 69 73 74 69 64 20 3d  t SET artistid =
9150: 20 3f 2c 20 61 72 74 69 73 74 6e 61 6d 65 20 3d   ?, artistname =
9160: 20 3f 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b   ?.} {.  0 0 0 {
9170: 53 43 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73  SCAN TABLE artis
9180: 74 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41  t} .  0 0 0 {SEA
9190: 52 43 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20  RCH TABLE track 
91a0: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
91b0: 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20  NDEX trackindex 
91c0: 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d  (trackartist=?)}
91d0: 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43   .  0 0 0 {SEARC
91e0: 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53  H TABLE track US
91f0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
9200: 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20 28 74  EX trackindex (t
9210: 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d 0a 7d  rackartist=?)}.}
9220: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9230: 20 65 5f 66 6b 65 79 2d 32 37 2e 34 20 7b 0a 20   e_fkey-27.4 {. 
9240: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
9250: 4c 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  LAN DELETE FROM 
9260: 61 72 74 69 73 74 0a 7d 20 7b 0a 20 20 30 20 30  artist.} {.  0 0
9270: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61   0 {SCAN TABLE a
9280: 72 74 69 73 74 7d 20 0a 20 20 30 20 30 20 30 20  rtist} .  0 0 0 
9290: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 72  {SEARCH TABLE tr
92a0: 61 63 6b 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ack USING COVERI
92b0: 4e 47 20 49 4e 44 45 58 20 74 72 61 63 6b 69 6e  NG INDEX trackin
92c0: 64 65 78 20 28 74 72 61 63 6b 61 72 74 69 73 74  dex (trackartist
92d0: 3d 3f 29 7d 0a 7d 0a 0a 0a 23 23 23 23 23 23 23  =?)}.}...#######
92e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9320: 23 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e  ####.### SECTION
9330: 20 34 2e 31 3a 20 43 6f 6d 70 6f 73 69 74 65 20   4.1: Composite 
9340: 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73  Foreign Key Cons
9350: 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23  traints.########
9360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93a0: 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ###..#----------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
93f0: 23 20 43 68 65 63 6b 20 74 68 61 74 20 70 61 72  # Check that par
9400: 65 6e 74 20 61 6e 64 20 63 68 69 6c 64 20 6b 65  ent and child ke
9410: 79 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ys must have the
9420: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
9430: 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45 56 49  columns..#.# EVI
9440: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 30 36  DENCE-OF: R-4106
9450: 32 2d 33 34 34 33 31 20 50 61 72 65 6e 74 20 61  2-34431 Parent a
9460: 6e 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 75  nd child keys mu
9470: 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
9480: 0a 23 20 63 61 72 64 69 6e 61 6c 69 74 79 2e 0a  .# cardinality..
9490: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  #.foreach {tn sq
94a0: 6c 20 65 72 72 7d 20 7b 0a 20 20 31 20 22 43 52  l err} {.  1 "CR
94b0: 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20  EATE TABLE c(jj 
94c0: 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 20  REFERENCES p(x, 
94d0: 79 29 29 22 20 0a 20 20 20 20 7b 66 6f 72 65 69  y))" .    {forei
94e0: 67 6e 20 6b 65 79 20 6f 6e 20 6a 6a 20 73 68 6f  gn key on jj sho
94f0: 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
9500: 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
9510: 20 74 61 62 6c 65 20 70 7d 0a 0a 20 20 32 20 22   table p}..  2 "
9520: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a  CREATE TABLE c(j
9530: 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 29  j REFERENCES p()
9540: 29 22 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79  )" {near ")": sy
9550: 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 33  ntax error}..  3
9560: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
9570: 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  (jj, FOREIGN KEY
9580: 28 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20  (jj) REFERENCES 
9590: 70 28 78 2c 20 79 29 29 22 20 0a 20 20 20 20 7b  p(x, y))" .    {
95a0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
95b0: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
95c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
95d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
95e0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
95f0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a  erenced table}..
9600: 20 20 34 20 22 43 52 45 41 54 45 20 54 41 42 4c    4 "CREATE TABL
9610: 45 20 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20  E c(jj, FOREIGN 
9620: 4b 45 59 28 6a 6a 29 20 52 45 46 45 52 45 4e 43  KEY(jj) REFERENC
9630: 45 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e  ES p())" .    {n
9640: 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20  ear ")": syntax 
9650: 65 72 72 6f 72 7d 0a 0a 20 20 35 20 22 43 52 45  error}..  5 "CRE
9660: 41 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20  ATE TABLE c(ii, 
9670: 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  jj, FOREIGN KEY(
9680: 6a 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43  jj, ii) REFERENC
9690: 45 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e  ES p())" .    {n
96a0: 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20  ear ")": syntax 
96b0: 65 72 72 6f 72 7d 0a 0a 20 20 36 20 22 43 52 45  error}..  6 "CRE
96c0: 41 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20  ATE TABLE c(ii, 
96d0: 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  jj, FOREIGN KEY(
96e0: 6a 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43  jj, ii) REFERENC
96f0: 45 53 20 70 28 78 29 29 22 20 0a 20 20 20 20 7b  ES p(x))" .    {
9700: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9710: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
9720: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9730: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
9740: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
9750: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a  erenced table}..
9760: 20 20 37 20 22 43 52 45 41 54 45 20 54 41 42 4c    7 "CREATE TABL
9770: 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45  E c(ii, jj, FORE
9780: 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20  IGN KEY(jj, ii) 
9790: 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 79  REFERENCES p(x,y
97a0: 2c 7a 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62  ,z))" .    {numb
97b0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
97c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
97d0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
97e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
97f0: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
9800: 63 65 64 20 74 61 62 6c 65 7d 0a 7d 20 7b 0a 20  ced table}.} {. 
9810: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
9820: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
9830: 79 2d 32 38 2e 24 74 6e 20 5b 6c 69 73 74 20 63  y-28.$tn [list c
9840: 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 20 5b 6c  atchsql $sql] [l
9850: 69 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a 64 6f  ist 1 $err].}.do
9860: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e  _test e_fkey-28.
9870: 38 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  8 {.  drop_all_t
9880: 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
9890: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
98a0: 4c 45 20 70 28 78 20 50 52 49 4d 41 52 59 20 4b  LE p(x PRIMARY K
98b0: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
98c0: 54 41 42 4c 45 20 63 28 61 2c 20 62 2c 20 46 4f  TABLE c(a, b, FO
98d0: 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52  REIGN KEY(a,b) R
98e0: 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20 20  EFERENCES p);.  
98f0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45  }.  catchsql {DE
9900: 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b  LETE FROM p}.} {
9910: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
9920: 69 73 6d 61 74 63 68 20 2d 20 22 63 22 20 72 65  ismatch - "c" re
9930: 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d 7d 0a  ferencing "p"}}.
9940: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
9950: 38 2e 39 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  8.9 {.  drop_all
9960: 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71  _tables.  execsq
9970: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
9980: 41 42 4c 45 20 70 28 78 2c 20 79 2c 20 50 52 49  ABLE p(x, y, PRI
9990: 4d 41 52 59 20 4b 45 59 28 78 2c 79 29 29 3b 0a  MARY KEY(x,y));.
99a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
99b0: 20 63 28 61 20 52 45 46 45 52 45 4e 43 45 53 20   c(a REFERENCES 
99c0: 70 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  p);.  }.  catchs
99d0: 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql {DELETE FROM 
99e0: 70 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  p}.} {1 {foreign
99f0: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
9a00: 22 63 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20  "c" referencing 
9a10: 22 70 22 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  "p"}}...#-------
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a60: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
9a70: 3a 20 52 2d 32 34 36 37 36 2d 30 39 38 35 39 0a  : R-24676-09859.
9a80: 23 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61  #.# Test the exa
9a90: 6d 70 6c 65 20 73 63 68 65 6d 61 20 69 6e 20 74  mple schema in t
9aa0: 68 65 20 22 43 6f 6d 70 6f 73 69 74 65 20 46 6f  he "Composite Fo
9ab0: 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72  reign Key Constr
9ac0: 61 69 6e 74 73 22 20 0a 23 20 73 65 63 74 69 6f  aints" .# sectio
9ad0: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  n..#.do_test e_f
9ae0: 6b 65 79 2d 32 39 2e 31 20 7b 0a 20 20 65 78 65  key-29.1 {.  exe
9af0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
9b00: 45 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a 20  E TABLE album(. 
9b10: 20 20 20 20 20 61 6c 62 75 6d 61 72 74 69 73 74       albumartist
9b20: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c 62   TEXT,.      alb
9b30: 75 6d 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20  umname TEXT,.   
9b40: 20 20 20 61 6c 62 75 6d 63 6f 76 65 72 20 42 49     albumcover BI
9b50: 4e 41 52 59 2c 0a 20 20 20 20 20 20 50 52 49 4d  NARY,.      PRIM
9b60: 41 52 59 20 4b 45 59 28 61 6c 62 75 6d 61 72 74  ARY KEY(albumart
9b70: 69 73 74 2c 20 61 6c 62 75 6d 6e 61 6d 65 29 0a  ist, albumname).
9b80: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
9b90: 45 20 54 41 42 4c 45 20 73 6f 6e 67 28 0a 20 20  E TABLE song(.  
9ba0: 20 20 20 20 73 6f 6e 67 69 64 20 49 4e 54 45 47      songid INTEG
9bb0: 45 52 2c 0a 20 20 20 20 20 20 73 6f 6e 67 61 72  ER,.      songar
9bc0: 74 69 73 74 20 54 45 58 54 2c 0a 20 20 20 20 20  tist TEXT,.     
9bd0: 20 73 6f 6e 67 61 6c 62 75 6d 20 54 45 58 54 2c   songalbum TEXT,
9be0: 0a 20 20 20 20 20 20 73 6f 6e 67 6e 61 6d 65 20  .      songname 
9bf0: 54 45 58 54 2c 0a 20 20 20 20 20 20 46 4f 52 45  TEXT,.      FORE
9c00: 49 47 4e 20 4b 45 59 28 73 6f 6e 67 61 72 74 69  IGN KEY(songarti
9c10: 73 74 2c 20 73 6f 6e 67 61 6c 62 75 6d 29 20 52  st, songalbum) R
9c20: 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75 6d 28  EFERENCES album(
9c30: 61 6c 62 75 6d 61 72 74 69 73 74 2c 61 6c 62 75  albumartist,albu
9c40: 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b 0a 20 20  mname).    );.  
9c50: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
9c60: 65 5f 66 6b 65 79 2d 32 39 2e 32 20 7b 0a 20 20  e_fkey-29.2 {.  
9c70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
9c80: 53 45 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20  SERT INTO album 
9c90: 56 41 4c 55 45 53 28 27 45 6c 76 69 73 20 50 72  VALUES('Elvis Pr
9ca0: 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73 27 27  esley', 'Elvis''
9cb0: 20 43 68 72 69 73 74 6d 61 73 20 41 6c 62 75 6d   Christmas Album
9cc0: 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  ', NULL);.    IN
9cd0: 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56  SERT INTO song V
9ce0: 41 4c 55 45 53 28 0a 20 20 20 20 20 20 31 2c 20  ALUES(.      1, 
9cf0: 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27 2c  'Elvis Presley',
9d00: 20 27 45 6c 76 69 73 27 27 20 43 68 72 69 73 74   'Elvis'' Christ
9d10: 6d 61 73 20 41 6c 62 75 6d 27 2c 20 27 48 65 72  mas Album', 'Her
9d20: 65 20 43 6f 6d 65 73 20 53 61 6e 74 61 20 43 6c  e Comes Santa Cl
9d30: 61 75 73 65 27 0a 20 20 20 20 29 3b 0a 20 20 7d  ause'.    );.  }
9d40: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
9d50: 66 6b 65 79 2d 32 39 2e 33 20 7b 0a 20 20 63 61  fkey-29.3 {.  ca
9d60: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
9d70: 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41  ERT INTO song VA
9d80: 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20 50  LUES(2, 'Elvis P
9d90: 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73 20  resley', 'Elvis 
9da0: 49 73 20 42 61 63 6b 21 27 2c 20 27 46 65 76 65  Is Back!', 'Feve
9db0: 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66  r');.  }.} {1 {f
9dc0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
9dd0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
9de0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
9e30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36  IDENCE-OF: R-336
9e40: 32 36 2d 34 38 34 31 38 20 49 6e 20 53 51 4c 69  26-48418 In SQLi
9e50: 74 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  te, if any of th
9e60: 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75  e child key colu
9e70: 6d 6e 73 0a 23 20 28 69 6e 20 74 68 69 73 20 63  mns.# (in this c
9e80: 61 73 65 20 73 6f 6e 67 61 72 74 69 73 74 20 61  ase songartist a
9e90: 6e 64 20 73 6f 6e 67 61 6c 62 75 6d 29 20 61 72  nd songalbum) ar
9ea0: 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  e NULL, then the
9eb0: 72 65 20 69 73 20 6e 6f 0a 23 20 72 65 71 75 69  re is no.# requi
9ec0: 72 65 6d 65 6e 74 20 66 6f 72 20 61 20 63 6f 72  rement for a cor
9ed0: 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 20 69  responding row i
9ee0: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
9ef0: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  le..#.do_test e_
9f00: 66 6b 65 79 2d 33 30 2e 31 20 7b 0a 20 20 65 78  fkey-30.1 {.  ex
9f10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
9f20: 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c  RT INTO song VAL
9f30: 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20 50 72  UES(2, 'Elvis Pr
9f40: 65 73 6c 65 79 27 2c 20 4e 55 4c 4c 2c 20 27 46  esley', NULL, 'F
9f50: 65 76 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45  ever');.    INSE
9f60: 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c  RT INTO song VAL
9f70: 55 45 53 28 33 2c 20 4e 55 4c 4c 2c 20 27 45 6c  UES(3, NULL, 'El
9f80: 76 69 73 20 49 73 20 42 61 63 6b 27 2c 20 27 53  vis Is Back', 'S
9f90: 6f 6c 64 69 65 72 20 42 6f 79 27 29 3b 0a 20 20  oldier Boy');.  
9fa0: 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23  }.} {}..########
9fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ff0: 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
a000: 34 2e 32 3a 20 44 65 66 65 72 72 65 64 20 46 6f  4.2: Deferred Fo
a010: 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72  reign Key Constr
a020: 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23  aints.##########
a030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a070: 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #..#------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
a0c0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73  Test that if a s
a0d0: 74 61 74 65 6d 65 6e 74 20 76 69 6f 6c 61 74 65  tatement violate
a0e0: 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 46  s an immediate F
a0f0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 61 6e  K constraint, an
a100: 64 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65  d the.# database
a110: 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66   does not satisf
a120: 79 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61  y the FK constra
a130: 69 6e 74 20 6f 6e 63 65 20 61 6c 6c 20 65 66 66  int once all eff
a140: 65 63 74 73 20 6f 66 20 74 68 65 0a 23 20 73 74  ects of the.# st
a150: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 62 65 65  atement have bee
a160: 6e 20 61 70 70 6c 69 65 64 2c 20 61 6e 20 65 72  n applied, an er
a170: 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20  ror is reported 
a180: 61 6e 64 20 74 68 65 20 65 66 66 65 63 74 73 20  and the effects 
a190: 6f 66 0a 23 20 74 68 65 20 73 74 61 74 65 6d 65  of.# the stateme
a1a0: 6e 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  nt rolled back..
a1b0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
a1c0: 20 52 2d 30 39 33 32 33 2d 33 30 34 37 30 20 49   R-09323-30470 I
a1d0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f  f a statement mo
a1e0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
a1f0: 6e 74 73 20 6f 66 20 74 68 65 0a 23 20 64 61 74  nts of the.# dat
a200: 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 61 6e  abase so that an
a210: 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
a220: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
a230: 74 20 69 73 20 69 6e 20 76 69 6f 6c 61 74 69 6f  t is in violatio
a240: 6e 0a 23 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  n.# at the concl
a250: 75 73 69 6f 6e 20 74 68 65 20 73 74 61 74 65 6d  usion the statem
a260: 65 6e 74 2c 20 61 6e 20 65 78 63 65 70 74 69 6f  ent, an exceptio
a270: 6e 20 69 73 20 74 68 72 6f 77 6e 20 61 6e 64 20  n is thrown and 
a280: 74 68 65 0a 23 20 65 66 66 65 63 74 73 20 6f 66  the.# effects of
a290: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
a2a0: 72 65 20 72 65 76 65 72 74 65 64 2e 0a 23 0a 64  re reverted..#.d
a2b0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
a2c0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 31  o_test e_fkey-31
a2d0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
a2e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a2f0: 45 20 6b 69 6e 67 28 61 2c 20 62 2c 20 50 52 49  E king(a, b, PRI
a300: 4d 41 52 59 20 4b 45 59 28 61 29 29 3b 0a 20 20  MARY KEY(a));.  
a310: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
a320: 72 69 6e 63 65 28 63 20 52 45 46 45 52 45 4e 43  rince(c REFERENC
a330: 45 53 20 6b 69 6e 67 2c 20 64 29 3b 0a 20 20 7d  ES king, d);.  }
a340: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  .} {}..do_test e
a350: 5f 66 6b 65 79 2d 33 31 2e 32 20 7b 0a 20 20 23  _fkey-31.2 {.  #
a360: 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
a370: 6d 65 6e 74 20 74 68 61 74 20 76 69 6f 6c 61 74  ment that violat
a380: 65 73 20 74 68 65 20 69 6d 6d 65 64 69 61 74 65  es the immediate
a390: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a   FK constraint..
a3a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
a3b0: 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20  ERT INTO prince 
a3c0: 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d  VALUES(1, 2) }.}
a3d0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
a3e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
a3f0: 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  ed}}..do_test e_
a400: 66 6b 65 79 2d 33 31 2e 33 20 7b 0a 20 20 23 20  fkey-31.3 {.  # 
a410: 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20 61  This time, use a
a420: 20 74 72 69 67 67 65 72 20 74 6f 20 66 69 78 20   trigger to fix 
a430: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  the constraint v
a440: 69 6f 6c 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  iolation before 
a450: 74 68 65 0a 20 20 23 20 73 74 61 74 65 6d 65 6e  the.  # statemen
a460: 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 65  t has finished e
a470: 78 65 63 75 74 69 6e 67 2e 20 54 68 65 6e 20 65  xecuting. Then e
a480: 78 65 63 75 74 65 20 74 68 65 20 73 61 6d 65 20  xecute the same 
a490: 73 74 61 74 65 6d 65 6e 74 20 61 73 0a 20 20 23  statement as.  #
a4a0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
a4b0: 20 74 65 73 74 20 63 61 73 65 2e 20 54 68 69 73   test case. This
a4c0: 20 74 69 6d 65 2c 20 6e 6f 20 65 72 72 6f 72 2e   time, no error.
a4d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a4e0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
a4f0: 6b 74 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  kt AFTER INSERT 
a500: 4f 4e 20 70 72 69 6e 63 65 20 57 48 45 4e 0a 20  ON prince WHEN. 
a510: 20 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20       NOT EXISTS 
a520: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6b  (SELECT a FROM k
a530: 69 6e 67 20 57 48 45 52 45 20 61 20 3d 20 6e 65  ing WHERE a = ne
a540: 77 2e 63 29 0a 20 20 20 20 42 45 47 49 4e 0a 20  w.c).    BEGIN. 
a550: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a560: 20 6b 69 6e 67 20 56 41 4c 55 45 53 28 6e 65 77   king VALUES(new
a570: 2e 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 45  .c, NULL);.    E
a580: 4e 44 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  ND.  }.  execsql
a590: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70   { INSERT INTO p
a5a0: 72 69 6e 63 65 20 56 41 4c 55 45 53 28 31 2c 20  rince VALUES(1, 
a5b0: 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73  2) }.} {}..# Tes
a5c0: 74 20 74 68 61 74 20 6f 70 65 72 61 74 69 6e 67  t that operating
a5d0: 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61   inside a transa
a5e0: 63 74 69 6f 6e 20 6d 61 6b 65 73 20 6e 6f 20 64  ction makes no d
a5f0: 69 66 66 65 72 65 6e 63 65 20 74 6f 20 0a 23 20  ifference to .# 
a600: 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72  immediate constr
a610: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 68  aint violation h
a620: 61 6e 64 6c 69 6e 67 2e 0a 64 6f 5f 74 65 73 74  andling..do_test
a630: 20 65 5f 66 6b 65 79 2d 33 31 2e 34 20 7b 0a 20   e_fkey-31.4 {. 
a640: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
a650: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
a660: 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c   INTO prince VAL
a670: 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 20 20 44  UES(2, 3);.    D
a680: 52 4f 50 20 54 52 49 47 47 45 52 20 6b 74 3b 0a  ROP TRIGGER kt;.
a690: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
a6a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69   INSERT INTO pri
a6b0: 6e 63 65 20 56 41 4c 55 45 53 28 33 2c 20 34 29  nce VALUES(3, 4)
a6c0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
a6d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a6e0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
a6f0: 20 65 5f 66 6b 65 79 2d 33 31 2e 35 20 7b 0a 20   e_fkey-31.5 {. 
a700: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
a710: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
a720: 54 20 2a 20 46 52 4f 4d 20 6b 69 6e 67 3b 0a 20  T * FROM king;. 
a730: 20 7d 0a 7d 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d   }.} {1 {} 2 {}}
a740: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
a750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
a790: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 64 65  est that if a de
a7a0: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
a7b0: 74 20 69 73 20 76 69 6f 6c 61 74 65 64 20 77 69  t is violated wi
a7c0: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
a7d0: 6f 6e 2c 0a 23 20 6e 6f 74 68 69 6e 67 20 68 61  on,.# nothing ha
a7e0: 70 70 65 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c  ppens immediatel
a7f0: 79 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  y and the databa
a800: 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  se is allowed to
a810: 20 70 65 72 73 69 73 74 0a 23 20 69 6e 20 61 20   persist.# in a 
a820: 73 74 61 74 65 20 74 68 61 74 20 64 6f 65 73 20  state that does 
a830: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
a840: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 48  FK constraint. H
a850: 6f 77 65 76 65 72 20 61 74 74 65 6d 70 74 73 0a  owever attempts.
a860: 23 20 74 6f 20 43 4f 4d 4d 49 54 20 74 68 65 20  # to COMMIT the 
a870: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 61 69 6c  transaction fail
a880: 20 75 6e 74 69 6c 20 74 68 65 20 46 4b 20 63 6f   until the FK co
a890: 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61 74 69  nstraint is sati
a8a0: 73 66 69 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  sfied..#.# EVIDE
a8b0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 31 37 38 2d  NCE-OF: R-49178-
a8c0: 32 31 33 35 38 20 42 79 20 63 6f 6e 74 72 61 73  21358 By contras
a8d0: 74 2c 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  t, if a statemen
a8e0: 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 23  t modifies the.#
a8f0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
a900: 20 64 61 74 61 62 61 73 65 20 73 75 63 68 20 74   database such t
a910: 68 61 74 20 61 20 64 65 66 65 72 72 65 64 20 66  hat a deferred f
a920: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a930: 72 61 69 6e 74 0a 23 20 69 73 20 76 69 6f 6c 61  raint.# is viola
a940: 74 65 64 2c 20 74 68 65 20 76 69 6f 6c 61 74 69  ted, the violati
a950: 6f 6e 20 69 73 20 6e 6f 74 20 72 65 70 6f 72 74  on is not report
a960: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
a970: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
a980: 20 52 2d 33 39 36 39 32 2d 31 32 34 38 38 20 44   R-39692-12488 D
a990: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
a9a0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
a9b0: 61 72 65 20 6e 6f 74 0a 23 20 63 68 65 63 6b 65  are not.# checke
a9c0: 64 20 75 6e 74 69 6c 20 74 68 65 20 74 72 61 6e  d until the tran
a9d0: 73 61 63 74 69 6f 6e 20 74 72 69 65 73 20 74 6f  saction tries to
a9e0: 20 43 4f 4d 4d 49 54 2e 0a 23 0a 23 20 45 56 49   COMMIT..#.# EVI
a9f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 31 34  DENCE-OF: R-5514
aa00: 37 2d 34 37 36 36 34 20 46 6f 72 20 61 73 20 6c  7-47664 For as l
aa10: 6f 6e 67 20 61 73 20 74 68 65 20 75 73 65 72 20  ong as the user 
aa20: 68 61 73 20 61 6e 20 6f 70 65 6e 0a 23 20 74 72  has an open.# tr
aa30: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 64  ansaction, the d
aa40: 61 74 61 62 61 73 65 20 69 73 20 61 6c 6c 6f 77  atabase is allow
aa50: 65 64 20 74 6f 20 65 78 69 73 74 20 69 6e 20 61  ed to exist in a
aa60: 20 73 74 61 74 65 20 74 68 61 74 20 76 69 6f 6c   state that viol
aa70: 61 74 65 73 0a 23 20 61 6e 79 20 6e 75 6d 62 65  ates.# any numbe
aa80: 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 66 6f  r of deferred fo
aa90: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
aaa0: 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45  aints..#.# EVIDE
aab0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 36 30 34 2d  NCE-OF: R-29604-
aac0: 33 30 33 39 35 20 48 6f 77 65 76 65 72 2c 20 43  30395 However, C
aad0: 4f 4d 4d 49 54 20 77 69 6c 6c 20 66 61 69 6c 20  OMMIT will fail 
aae0: 61 73 20 6c 6f 6e 67 20 61 73 0a 23 20 66 6f 72  as long as.# for
aaf0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
ab00: 69 6e 74 73 20 72 65 6d 61 69 6e 20 69 6e 20 76  ints remain in v
ab10: 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 70 72 6f 63  iolation..#.proc
ab20: 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 7b   test_efkey_34 {
ab30: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
ab40: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
ab50: 65 79 2d 33 32 2e 24 74 6e 20 22 0a 20 20 20 20  ey-32.$tn ".    
ab60: 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a  catchsql {$sql}.
ab70: 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20    " [lindex {{0 
ab80: 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  {}} {1 {foreign 
ab90: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
aba0: 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f  ailed}}} $isErro
abb0: 72 5d 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  r].}.drop_all_ta
abc0: 62 6c 65 73 0a 0a 74 65 73 74 5f 65 66 6b 65 79  bles..test_efkey
abd0: 5f 33 34 20 20 31 20 30 20 7b 0a 20 20 43 52 45  _34  1 0 {.  CRE
abe0: 41 54 45 20 54 41 42 4c 45 20 6c 6c 28 6b 20 50  ATE TABLE ll(k P
abf0: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 43  RIMARY KEY);.  C
ac00: 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6b 28 63  REATE TABLE kk(c
ac10: 20 52 45 46 45 52 45 4e 43 45 53 20 6c 6c 20 44   REFERENCES ll D
ac20: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
ac30: 4c 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a 7d  LLY DEFERRED);.}
ac40: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
ac50: 32 20 30 20 22 42 45 47 49 4e 22 0a 74 65 73 74  2 0 "BEGIN".test
ac60: 5f 65 66 6b 65 79 5f 33 34 20 20 33 20 30 20 20  _efkey_34  3 0  
ac70: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6b   "INSERT INTO kk
ac80: 20 56 41 4c 55 45 53 28 35 29 22 0a 74 65 73 74   VALUES(5)".test
ac90: 5f 65 66 6b 65 79 5f 33 34 20 20 34 20 30 20 20  _efkey_34  4 0  
aca0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6b   "INSERT INTO kk
acb0: 20 56 41 4c 55 45 53 28 31 30 29 22 0a 74 65 73   VALUES(10)".tes
acc0: 74 5f 65 66 6b 65 79 5f 33 34 20 20 35 20 31 20  t_efkey_34  5 1 
acd0: 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66  "COMMIT".test_ef
ace0: 6b 65 79 5f 33 34 20 20 36 20 30 20 20 20 22 49  key_34  6 0   "I
acf0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41  NSERT INTO ll VA
ad00: 4c 55 45 53 28 31 30 29 22 0a 74 65 73 74 5f 65  LUES(10)".test_e
ad10: 66 6b 65 79 5f 33 34 20 20 37 20 31 20 22 43 4f  fkey_34  7 1 "CO
ad20: 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66 6b 65 79  MMIT".test_efkey
ad30: 5f 33 34 20 20 38 20 30 20 20 20 22 49 4e 53 45  _34  8 0   "INSE
ad40: 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41 4c 55 45  RT INTO ll VALUE
ad50: 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  S(5)".test_efkey
ad60: 5f 33 34 20 20 39 20 30 20 22 43 4f 4d 4d 49 54  _34  9 0 "COMMIT
ad70: 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "..#------------
ad80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
adc0: 57 68 65 6e 20 6e 6f 74 20 72 75 6e 6e 69 6e 67  When not running
add0: 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61   inside a transa
ade0: 63 74 69 6f 6e 2c 20 61 20 64 65 66 65 72 72 65  ction, a deferre
adf0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  d constraint is 
ae00: 73 69 6d 69 6c 61 72 0a 23 20 74 6f 20 61 6e 20  similar.# to an 
ae10: 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72  immediate constr
ae20: 61 69 6e 74 20 28 76 69 6f 6c 61 74 69 6f 6e 73  aint (violations
ae30: 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 69 6d   are reported im
ae40: 6d 65 64 69 61 74 65 6c 79 29 2e 0a 23 0a 23 20  mediately)..#.# 
ae50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
ae60: 36 38 34 34 2d 36 31 37 30 35 20 49 66 20 74 68  6844-61705 If th
ae70: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
ae80: 65 6e 74 20 69 73 20 6e 6f 74 20 69 6e 73 69 64  ent is not insid
ae90: 65 20 61 6e 0a 23 20 65 78 70 6c 69 63 69 74 20  e an.# explicit 
aea0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 61 20 42  transaction (a B
aeb0: 45 47 49 4e 2f 43 4f 4d 4d 49 54 2f 52 4f 4c 4c  EGIN/COMMIT/ROLL
aec0: 42 41 43 4b 20 62 6c 6f 63 6b 29 2c 20 74 68 65  BACK block), the
aed0: 6e 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a 23 20  n an implicit.# 
aee0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
aef0: 6f 6d 6d 69 74 74 65 64 20 61 73 20 73 6f 6f 6e  ommitted as soon
af00: 20 61 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e   as the statemen
af10: 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 0a 23  t has finished.#
af20: 20 65 78 65 63 75 74 69 6e 67 2e 20 49 6e 20 74   executing. In t
af30: 68 69 73 20 63 61 73 65 20 64 65 66 65 72 72 65  his case deferre
af40: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 65  d constraints be
af50: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 61 73  have the same as
af60: 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e  .# immediate con
af70: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64 72 6f 70  straints..#.drop
af80: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 70 72 6f 63  _all_tables.proc
af90: 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 7b   test_efkey_35 {
afa0: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
afb0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
afc0: 65 79 2d 33 33 2e 24 74 6e 20 22 0a 20 20 20 20  ey-33.$tn ".    
afd0: 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a  catchsql {$sql}.
afe0: 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20    " [lindex {{0 
aff0: 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  {}} {1 {foreign 
b000: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
b010: 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f  ailed}}} $isErro
b020: 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  r].}.do_test e_f
b030: 6b 65 79 2d 33 33 2e 31 20 7b 0a 20 20 65 78 65  key-33.1 {.  exe
b040: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
b050: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
b060: 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , y);.    CREATE
b070: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 69   UNIQUE INDEX pi
b080: 20 4f 4e 20 70 61 72 65 6e 74 28 78 2c 20 79 29   ON parent(x, y)
b090: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b0a0: 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c 0a 20  LE child(a, b,. 
b0b0: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b0c0: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
b0d0: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 20 44  S parent(x, y) D
b0e0: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
b0f0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
b100: 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 74 65 73   );.  }.} {}.tes
b110: 74 5f 65 66 6b 65 79 5f 33 35 20 32 20 31 20 22  t_efkey_35 2 1 "
b120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
b130: 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27  d  VALUES('x', '
b140: 79 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  y')".test_efkey_
b150: 33 35 20 33 20 30 20 22 49 4e 53 45 52 54 20 49  35 3 0 "INSERT I
b160: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
b170: 53 28 27 78 27 2c 20 27 79 27 29 22 0a 74 65 73  S('x', 'y')".tes
b180: 74 5f 65 66 6b 65 79 5f 33 35 20 34 20 30 20 22  t_efkey_35 4 0 "
b190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
b1a0: 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27  d  VALUES('x', '
b1b0: 79 27 29 22 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  y')"...#--------
b1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
b210: 20 52 2d 31 32 37 38 32 2d 36 31 38 34 31 0a 23   R-12782-61841.#
b220: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20  .# Test that an 
b230: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  FK constraint is
b240: 20 6d 61 64 65 20 64 65 66 65 72 72 65 64 20 62   made deferred b
b250: 79 20 61 64 64 69 6e 67 20 74 68 65 20 66 6f 6c  y adding the fol
b260: 6c 6f 77 69 6e 67 0a 23 20 74 6f 20 74 68 65 20  lowing.# to the 
b270: 64 65 66 69 6e 69 74 69 6f 6e 3a 0a 23 0a 23 20  definition:.#.# 
b280: 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49    DEFERRABLE INI
b290: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
b2a0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
b2b0: 20 52 2d 30 39 30 30 35 2d 32 38 37 39 31 0a 23   R-09005-28791.#
b2c0: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
b2d0: 74 20 61 64 64 69 6e 67 20 61 6e 79 20 6f 66 20  t adding any of 
b2e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f  the following to
b2f0: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
b300: 65 66 69 6e 69 74 69 6f 6e 20 0a 23 20 6d 61 6b  efinition .# mak
b310: 65 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  es the constrain
b320: 74 20 49 4d 4d 45 44 49 41 54 45 3a 0a 23 0a 23  t IMMEDIATE:.#.#
b330: 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c     NOT DEFERRABL
b340: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
b350: 52 52 45 44 0a 23 20 20 20 4e 4f 54 20 44 45 46  RRED.#   NOT DEF
b360: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
b370: 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20 20  Y IMMEDIATE.#   
b380: 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 0a 23  NOT DEFERRABLE.#
b390: 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e     DEFERRABLE IN
b3a0: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b3b0: 45 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c 45  E.#   DEFERRABLE
b3c0: 0a 23 0a 23 20 46 6f 72 65 69 67 6e 20 6b 65 79  .#.# Foreign key
b3d0: 73 20 61 72 65 20 49 4d 4d 45 44 49 41 54 45 20  s are IMMEDIATE 
b3e0: 62 79 20 64 65 66 61 75 6c 74 20 28 69 66 20 74  by default (if t
b3f0: 68 65 72 65 20 69 73 20 6e 6f 20 44 45 46 45 52  here is no DEFER
b400: 52 41 42 4c 45 20 6f 72 20 4e 4f 54 0a 23 20 44  RABLE or NOT.# D
b410: 45 46 45 52 52 41 42 4c 45 20 63 6c 61 75 73 65  EFERRABLE clause
b420: 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  )..#.# EVIDENCE-
b430: 4f 46 3a 20 52 2d 33 35 32 39 30 2d 31 36 34 36  OF: R-35290-1646
b440: 30 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  0 Foreign key co
b450: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 69 6d  nstraints are im
b460: 6d 65 64 69 61 74 65 20 62 79 0a 23 20 64 65 66  mediate by.# def
b470: 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ault..#.# EVIDEN
b480: 43 45 2d 4f 46 3a 20 52 2d 33 30 33 32 33 2d 32  CE-OF: R-30323-2
b490: 31 39 31 37 20 45 61 63 68 20 66 6f 72 65 69 67  1917 Each foreig
b4a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
b4b0: 20 69 6e 20 53 51 4c 69 74 65 20 69 73 0a 23 20   in SQLite is.# 
b4c0: 63 6c 61 73 73 69 66 69 65 64 20 61 73 20 65 69  classified as ei
b4d0: 74 68 65 72 20 69 6d 6d 65 64 69 61 74 65 20 6f  ther immediate o
b4e0: 72 20 64 65 66 65 72 72 65 64 2e 0a 23 0a 64 72  r deferred..#.dr
b4f0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
b500: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 34 2e  _test e_fkey-34.
b510: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
b520: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b530: 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20 7a 2c   parent(x, y, z,
b540: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 79   PRIMARY KEY(x,y
b550: 2c 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ,z));.    CREATE
b560: 20 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20   TABLE c1(a, b, 
b570: 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  c,.      FOREIGN
b580: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b590: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
b5a0: 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 49  NOT DEFERRABLE I
b5b0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
b5c0: 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  D.    );.    CRE
b5d0: 41 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20  ATE TABLE c2(a, 
b5e0: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b5f0: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b600: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b610: 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c  nt NOT DEFERRABL
b620: 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  E INITIALLY IMME
b630: 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20  DIATE.    );.   
b640: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33   CREATE TABLE c3
b650: 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20  (a, b, c,.      
b660: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
b670: 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20  , c) REFERENCES 
b680: 70 61 72 65 6e 74 20 4e 4f 54 20 44 45 46 45 52  parent NOT DEFER
b690: 52 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20 20  RABLE.    );.   
b6a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 34   CREATE TABLE c4
b6b0: 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20  (a, b, c,.      
b6c0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
b6d0: 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20  , c) REFERENCES 
b6e0: 70 61 72 65 6e 74 20 44 45 46 45 52 52 41 42 4c  parent DEFERRABL
b6f0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  E INITIALLY IMME
b700: 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20  DIATE.    );.   
b710: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 35   CREATE TABLE c5
b720: 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20  (a, b, c,.      
b730: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
b740: 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20  , c) REFERENCES 
b750: 70 61 72 65 6e 74 20 44 45 46 45 52 52 41 42 4c  parent DEFERRABL
b760: 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  E.    );.    CRE
b770: 41 54 45 20 54 41 42 4c 45 20 63 36 28 61 2c 20  ATE TABLE c6(a, 
b780: 62 2c 20 63 2c 20 46 4f 52 45 49 47 4e 20 4b 45  b, c, FOREIGN KE
b790: 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52  Y(a, b, c) REFER
b7a0: 45 4e 43 45 53 20 70 61 72 65 6e 74 29 3b 0a 0a  ENCES parent);..
b7b0: 20 20 20 20 2d 2d 20 54 68 69 73 20 46 4b 20 63      -- This FK c
b7c0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 74 68 65  onstraint is the
b7d0: 20 6f 6e 6c 79 20 64 65 66 65 72 72 61 62 6c 65   only deferrable
b7e0: 20 6f 6e 65 2e 0a 20 20 20 20 43 52 45 41 54 45   one..    CREATE
b7f0: 20 54 41 42 4c 45 20 63 37 28 61 2c 20 62 2c 20   TABLE c7(a, b, 
b800: 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  c,.      FOREIGN
b810: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b820: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
b830: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b840: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
b850: 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54    );..    INSERT
b860: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
b870: 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63  UES('a', 'b', 'c
b880: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
b890: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
b8a0: 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66 27 29  S('d', 'e', 'f')
b8b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b8c0: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
b8d0: 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b 0a  'g', 'h', 'i');.
b8e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b8f0: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6a  parent VALUES('j
b900: 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20  ', 'k', 'l');.  
b910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
b920: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6d 27 2c  rent VALUES('m',
b930: 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20 20   'n', 'o');.    
b940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
b950: 6e 74 20 56 41 4c 55 45 53 28 27 70 27 2c 20 27  nt VALUES('p', '
b960: 71 27 2c 20 27 72 27 29 3b 0a 20 20 20 20 49 4e  q', 'r');.    IN
b970: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
b980: 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27 74 27   VALUES('s', 't'
b990: 2c 20 27 75 27 29 3b 0a 0a 20 20 20 20 49 4e 53  , 'u');..    INS
b9a0: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
b9b0: 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27  ES('a', 'b', 'c'
b9c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b9d0: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 27 64 27  TO c2 VALUES('d'
b9e0: 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 20  , 'e', 'f');.   
b9f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
ba00: 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27 2c  VALUES('g', 'h',
ba10: 20 27 69 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'i');.    INSER
ba20: 54 20 49 4e 54 4f 20 63 34 20 56 41 4c 55 45 53  T INTO c4 VALUES
ba30: 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b  ('j', 'k', 'l');
ba40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ba50: 20 63 35 20 56 41 4c 55 45 53 28 27 6d 27 2c 20   c5 VALUES('m', 
ba60: 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20 20 49  'n', 'o');.    I
ba70: 4e 53 45 52 54 20 49 4e 54 4f 20 63 36 20 56 41  NSERT INTO c6 VA
ba80: 4c 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20 27  LUES('p', 'q', '
ba90: 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  r');.    INSERT 
baa0: 49 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28 27  INTO c7 VALUES('
bab0: 73 27 2c 20 27 74 27 2c 20 27 75 27 29 3b 0a 20  s', 't', 'u');. 
bac0: 20 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 74 65   }.} {}..proc te
bad0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 7b 74 6e 20  st_efkey_29 {tn 
bae0: 73 71 6c 20 69 73 45 72 72 6f 72 7d 20 7b 0a 20  sql isError} {. 
baf0: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
bb00: 33 34 2e 24 74 6e 20 22 63 61 74 63 68 73 71 6c  34.$tn "catchsql
bb10: 20 7b 24 73 71 6c 7d 22 20 5b 0a 20 20 20 20 6c   {$sql}" [.    l
bb20: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
bb30: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
bb40: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
bb50: 7d 7d 20 24 69 73 45 72 72 6f 72 0a 20 20 5d 0a  }} $isError.  ].
bb60: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  }.test_efkey_29 
bb70: 20 32 20 22 42 45 47 49 4e 22 20 20 20 20 20 20   2 "BEGIN"      
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74               0.t
bba0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 33 20  est_efkey_29  3 
bbb0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
bbc0: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 61  ent WHERE x = 'a
bbd0: 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74  '"        1.test
bbe0: 5f 65 66 6b 65 79 5f 32 39 20 20 34 20 22 44 45  _efkey_29  4 "DE
bbf0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
bc00: 20 57 48 45 52 45 20 78 20 3d 20 27 64 27 22 20   WHERE x = 'd'" 
bc10: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
bc20: 6b 65 79 5f 32 39 20 20 35 20 22 44 45 4c 45 54  key_29  5 "DELET
bc30: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
bc40: 45 52 45 20 78 20 3d 20 27 67 27 22 20 20 20 20  ERE x = 'g'"    
bc50: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
bc60: 5f 32 39 20 20 36 20 22 44 45 4c 45 54 45 20 46  _29  6 "DELETE F
bc70: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
bc80: 20 78 20 3d 20 27 6a 27 22 20 20 20 20 20 20 20   x = 'j'"       
bc90: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bca0: 20 20 37 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    7 "DELETE FROM
bcb0: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
bcc0: 3d 20 27 6d 27 22 20 20 20 20 20 20 20 20 31 0a  = 'm'"        1.
bcd0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 38  test_efkey_29  8
bce0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
bcf0: 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
bd00: 70 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73  p'"        1.tes
bd10: 74 5f 65 66 6b 65 79 5f 32 39 20 20 39 20 22 44  t_efkey_29  9 "D
bd20: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
bd30: 74 20 57 48 45 52 45 20 78 20 3d 20 27 73 27 22  t WHERE x = 's'"
bd40: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
bd50: 66 6b 65 79 5f 32 39 20 31 30 20 22 43 4f 4d 4d  fkey_29 10 "COMM
bd60: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IT"             
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
bd90: 79 5f 32 39 20 31 31 20 22 52 4f 4c 4c 42 41 43  y_29 11 "ROLLBAC
bda0: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f    0..test_efkey_
bdd0: 32 39 20 20 39 20 22 42 45 47 49 4e 22 20 20 20  29  9 "BEGIN"   
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  0.test_efkey_29 
be10: 31 30 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  10 "UPDATE paren
be20: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
be30: 45 52 45 20 7a 20 3d 20 27 63 27 22 20 31 0a 74  ERE z = 'c'" 1.t
be40: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 31 20  est_efkey_29 11 
be50: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
be60: 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45  ET z = 'z' WHERE
be70: 20 7a 20 3d 20 27 66 27 22 20 31 0a 74 65 73 74   z = 'f'" 1.test
be80: 5f 65 66 6b 65 79 5f 32 39 20 31 32 20 22 55 50  _efkey_29 12 "UP
be90: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
bea0: 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20  z = 'z' WHERE z 
beb0: 3d 20 27 69 27 22 20 31 0a 74 65 73 74 5f 65 66  = 'i'" 1.test_ef
bec0: 6b 65 79 5f 32 39 20 31 33 20 22 55 50 44 41 54  key_29 13 "UPDAT
bed0: 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d  E parent SET z =
bee0: 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27   'z' WHERE z = '
bef0: 6c 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79  l'" 1.test_efkey
bf00: 5f 32 39 20 31 34 20 22 55 50 44 41 54 45 20 70  _29 14 "UPDATE p
bf10: 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a  arent SET z = 'z
bf20: 27 20 57 48 45 52 45 20 7a 20 3d 20 27 6f 27 22  ' WHERE z = 'o'"
bf30: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bf40: 20 31 35 20 22 55 50 44 41 54 45 20 70 61 72 65   15 "UPDATE pare
bf50: 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57  nt SET z = 'z' W
bf60: 48 45 52 45 20 7a 20 3d 20 27 72 27 22 20 31 0a  HERE z = 'r'" 1.
bf70: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 36  test_efkey_29 16
bf80: 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20   "UPDATE parent 
bf90: 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52  SET z = 'z' WHER
bfa0: 45 20 7a 20 3d 20 27 75 27 22 20 30 0a 74 65 73  E z = 'u'" 0.tes
bfb0: 74 5f 65 66 6b 65 79 5f 32 39 20 31 37 20 22 43  t_efkey_29 17 "C
bfc0: 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20  OMMIT"          
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 31 0a 74 65 73 74 5f 65          1.test_e
bff0: 66 6b 65 79 5f 32 39 20 31 38 20 22 52 4f 4c 4c  fkey_29 18 "ROLL
c000: 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20  BACK"           
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b       0..test_efk
c030: 65 79 5f 32 39 20 31 37 20 22 42 45 47 49 4e 22  ey_29 17 "BEGIN"
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
c070: 32 39 20 31 38 20 22 49 4e 53 45 52 54 20 49 4e  29 18 "INSERT IN
c080: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20  TO c1 VALUES(1, 
c090: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
c0a0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c0b0: 31 39 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  19 "INSERT INTO 
c0c0: 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c2 VALUES(1, 2, 
c0d0: 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74  3)"          1.t
c0e0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 30 20  est_efkey_29 20 
c0f0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20  "INSERT INTO c3 
c100: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22  VALUES(1, 2, 3)"
c110: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c120: 5f 65 66 6b 65 79 5f 32 39 20 32 31 20 22 49 4e  _efkey_29 21 "IN
c130: 53 45 52 54 20 49 4e 54 4f 20 63 34 20 56 41 4c  SERT INTO c4 VAL
c140: 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20  UES(1, 2, 3)"   
c150: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c160: 6b 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52  key_29 22 "INSER
c170: 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45 53  T INTO c5 VALUES
c180: 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20  (1, 2, 3)"      
c190: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c1a0: 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54 20 49  _29 22 "INSERT I
c1b0: 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28 31 2c  NTO c6 VALUES(1,
c1c0: 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20   2, 3)"         
c1d0: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
c1e0: 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   22 "INSERT INTO
c1f0: 20 63 37 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   c7 VALUES(1, 2,
c200: 20 33 29 22 20 20 20 20 20 20 20 20 20 20 30 0a   3)"          0.
c210: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 33  test_efkey_29 23
c220: 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20   "COMMIT"       
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 31 0a 74 65 73             1.tes
c250: 74 5f 65 66 6b 65 79 5f 32 39 20 32 34 20 22 49  t_efkey_29 24 "I
c260: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
c270: 74 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  t VALUES(1, 2, 3
c280: 29 22 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65  )"      0.test_e
c290: 66 6b 65 79 5f 32 39 20 32 35 20 22 43 4f 4d 4d  fkey_29 25 "COMM
c2a0: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IT"             
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b       0..test_efk
c2d0: 65 79 5f 32 39 20 32 36 20 22 42 45 47 49 4e 22  ey_29 26 "BEGIN"
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
c310: 32 39 20 32 37 20 22 55 50 44 41 54 45 20 63 31  29 27 "UPDATE c1
c320: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c350: 32 38 20 22 55 50 44 41 54 45 20 63 32 20 53 45  28 "UPDATE c2 SE
c360: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
c380: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 39 20  est_efkey_29 29 
c390: 22 55 50 44 41 54 45 20 63 33 20 53 45 54 20 61  "UPDATE c3 SET a
c3a0: 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20   = 10"          
c3b0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c3c0: 5f 65 66 6b 65 79 5f 32 39 20 33 30 20 22 55 50  _efkey_29 30 "UP
c3d0: 44 41 54 45 20 63 34 20 53 45 54 20 61 20 3d 20  DATE c4 SET a = 
c3e0: 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20  10"             
c3f0: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c400: 6b 65 79 5f 32 39 20 33 31 20 22 55 50 44 41 54  key_29 31 "UPDAT
c410: 45 20 63 35 20 53 45 54 20 61 20 3d 20 31 30 22  E c5 SET a = 10"
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c440: 5f 32 39 20 33 31 20 22 55 50 44 41 54 45 20 63  _29 31 "UPDATE c
c450: 36 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20  6 SET a = 10"   
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
c480: 20 33 31 20 22 55 50 44 41 54 45 20 63 37 20 53   31 "UPDATE c7 S
c490: 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20  ET a = 10"      
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
c4b0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 32  test_efkey_29 32
c4c0: 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20   "COMMIT"       
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73             1.tes
c4f0: 74 5f 65 66 6b 65 79 5f 32 39 20 33 33 20 22 52  t_efkey_29 33 "R
c500: 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20  OLLBACK"        
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 30 0a 0a 23 2d 2d 2d 2d          0..#----
c530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c570: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
c580: 2d 4f 46 3a 20 52 2d 32 34 34 39 39 2d 35 37 30  -OF: R-24499-570
c590: 37 31 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65  71.#.# Test an e
c5a0: 78 61 6d 70 6c 65 20 66 72 6f 6d 20 66 6f 72 65  xample from fore
c5b0: 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 20 64 65 61  ignkeys.html dea
c5c0: 6c 69 6e 67 20 77 69 74 68 20 61 20 64 65 66 65  ling with a defe
c5d0: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 0a 23 20  rred foreign .# 
c5e0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  key constraint..
c5f0: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
c600: 2d 33 35 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61  -35.1 {.  drop_a
c610: 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63  ll_tables.  exec
c620: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
c630: 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
c640: 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
c650: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c660: 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
c670: 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
c680: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
c690: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
c6a0: 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
c6b0: 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72  NTEGER,.      tr
c6c0: 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20  ackname   TEXT, 
c6d0: 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69  .      trackarti
c6e0: 73 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52  st INTEGER REFER
c6f0: 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74  ENCES artist(art
c700: 69 73 74 69 64 29 20 44 45 46 45 52 52 41 42 4c  istid) DEFERRABL
c710: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
c720: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  RRED.    );.  }.
c730: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
c740: 6b 65 79 2d 33 35 2e 32 20 7b 0a 20 20 65 78 65  key-35.2 {.  exe
c750: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
c760: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
c770: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
c780: 28 31 2c 20 27 57 68 69 74 65 20 43 68 72 69 73  (1, 'White Chris
c790: 74 6d 61 73 27 2c 20 35 29 3b 0a 20 20 7d 0a 20  tmas', 5);.  }. 
c7a0: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
c7b0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
c7c0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
c7d0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
c7e0: 5f 66 6b 65 79 2d 33 35 2e 33 20 7b 0a 20 20 65  _fkey-35.3 {.  e
c7f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
c800: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
c810: 56 41 4c 55 45 53 28 35 2c 20 27 42 69 6e 67 20  VALUES(5, 'Bing 
c820: 43 72 6f 73 62 79 27 29 3b 0a 20 20 20 20 43 4f  Crosby');.    CO
c830: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
c840: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72  ----------.# Ver
c890: 69 66 79 20 74 68 61 74 20 61 20 6e 65 73 74 65  ify that a neste
c8a0: 64 20 73 61 76 65 70 6f 69 6e 74 20 6d 61 79 20  d savepoint may 
c8b0: 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
c8c0: 6f 75 74 20 73 61 74 69 73 66 79 69 6e 67 20 0a  out satisfying .
c8d0: 23 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  # deferred forei
c8e0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
c8f0: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
c900: 2d 4f 46 3a 20 52 2d 30 37 32 32 33 2d 34 38 33  -OF: R-07223-483
c910: 32 33 20 41 20 6e 65 73 74 65 64 20 73 61 76 65  23 A nested save
c920: 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
c930: 6e 20 6d 61 79 20 62 65 0a 23 20 52 45 4c 45 41  n may be.# RELEA
c940: 53 45 64 20 77 68 69 6c 65 20 74 68 65 20 64 61  SEd while the da
c950: 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 20 73  tabase is in a s
c960: 74 61 74 65 20 74 68 61 74 20 64 6f 65 73 20 6e  tate that does n
c970: 6f 74 20 73 61 74 69 73 66 79 20 61 0a 23 20 64  ot satisfy a.# d
c980: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
c990: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  key constraint..
c9a0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
c9b0: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
c9c0: 2d 33 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -36.1 {.  execsq
c9d0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
c9e0: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
c9f0: 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 62 20 52  Y KEY,.      b R
ca00: 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46  EFERENCES t1 DEF
ca10: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
ca20: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
ca30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ca40: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31  O t1 VALUES(1, 1
ca50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ca60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
ca70: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
ca80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
ca90: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   3);.  }.} {}.do
caa0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e  _test e_fkey-36.
cab0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
cac0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
cad0: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
cae0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
caf0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
cb00: 20 35 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41   5);.      RELEA
cb10: 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b 7d  SE one;.  }.} {}
cb20: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
cb30: 33 36 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  36.3 {.  catchsq
cb40: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66  l COMMIT.} {1 {f
cb50: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
cb60: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
cb70: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36  o_test e_fkey-36
cb80: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
cb90: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
cba0: 45 54 20 61 20 3d 20 35 20 57 48 45 52 45 20 61  ET a = 5 WHERE a
cbb0: 20 3d 20 34 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   = 4;.    COMMIT
cbc0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d  ;.  }.} {}...#--
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
cc20: 74 68 61 74 20 61 20 74 72 61 6e 73 61 63 74 69  that a transacti
cc30: 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 28 61 6e  on savepoint (an
cc40: 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
cc50: 6f 69 6e 74 20 6f 70 65 6e 65 64 20 77 68 65 6e  oint opened when
cc60: 0a 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20  .# the database 
cc70: 77 61 73 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d  was in auto-comm
cc80: 69 74 20 6d 6f 64 65 29 20 63 61 6e 6e 6f 74 20  it mode) cannot 
cc90: 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
cca0: 6f 75 74 0a 23 20 73 61 74 69 73 66 79 69 6e 67  out.# satisfying
ccb0: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
ccc0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
ccd0: 73 2e 20 49 74 20 6d 61 79 20 62 65 20 72 6f 6c  s. It may be rol
cce0: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45 56  led back..#.# EV
ccf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 32  IDENCE-OF: R-442
cd00: 39 35 2d 31 33 38 32 33 20 41 20 74 72 61 6e 73  95-13823 A trans
cd10: 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
cd20: 20 28 61 20 6e 6f 6e 2d 6e 65 73 74 65 64 0a 23   (a non-nested.#
cd30: 20 73 61 76 65 70 6f 69 6e 74 20 74 68 61 74 20   savepoint that 
cd40: 77 61 73 20 6f 70 65 6e 65 64 20 77 68 69 6c 65  was opened while
cd50: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 63   there was not c
cd60: 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65 6e  urrently an open
cd70: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  .# transaction),
cd80: 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
cd90: 6e 64 2c 20 69 73 20 73 75 62 6a 65 63 74 20 74  nd, is subject t
cda0: 6f 20 74 68 65 20 73 61 6d 65 20 72 65 73 74 72  o the same restr
cdb0: 69 63 74 69 6f 6e 73 0a 23 20 61 73 20 61 20 43  ictions.# as a C
cdc0: 4f 4d 4d 49 54 20 2d 20 61 74 74 65 6d 70 74 69  OMMIT - attempti
cdd0: 6e 67 20 74 6f 20 52 45 4c 45 41 53 45 20 69 74  ng to RELEASE it
cde0: 20 77 68 69 6c 65 20 74 68 65 20 64 61 74 61 62   while the datab
cdf0: 61 73 65 20 69 73 20 69 6e 20 73 75 63 68 20 61  ase is in such a
ce00: 0a 23 20 73 74 61 74 65 20 77 69 6c 6c 20 66 61  .# state will fa
ce10: 69 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  il..#.do_test e_
ce20: 66 6b 65 79 2d 33 37 2e 31 20 7b 0a 20 20 65 78  fkey-37.1 {.  ex
ce30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  ecsql {.    SAVE
ce40: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
ce50: 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a   SAVEPOINT two;.
ce60: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
ce70: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c  NTO t1 VALUES(6,
ce80: 20 37 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41   7);.      RELEA
ce90: 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d  SE two;.  }.} {}
cea0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ceb0: 33 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  37.2 {.  catchsq
cec0: 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a  l {RELEASE one}.
ced0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
cee0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
cef0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
cf00: 66 6b 65 79 2d 33 37 2e 33 20 7b 0a 20 20 65 78  fkey-37.3 {.  ex
cf10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50  ecsql {.      UP
cf20: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
cf30: 37 20 57 48 45 52 45 20 61 20 3d 20 36 3b 0a 20  7 WHERE a = 6;. 
cf40: 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a     RELEASE one;.
cf50: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
cf60: 20 65 5f 66 6b 65 79 2d 33 37 2e 34 20 7b 0a 20   e_fkey-37.4 {. 
cf70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
cf80: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
cf90: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77      SAVEPOINT tw
cfa0: 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  o;.        INSER
cfb0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
cfc0: 28 39 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 52  (9, 10);.      R
cfd0: 45 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d 0a  ELEASE two;.  }.
cfe0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
cff0: 6b 65 79 2d 33 37 2e 35 20 7b 0a 20 20 63 61 74  key-37.5 {.  cat
d000: 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 6f  chsql {RELEASE o
d010: 6e 65 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ne}.} {1 {foreig
d020: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
d030: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
d040: 74 20 65 5f 66 6b 65 79 2d 33 37 2e 36 20 7b 0a  t e_fkey-37.6 {.
d050: 20 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42    execsql {ROLLB
d060: 41 43 4b 20 54 4f 20 6f 6e 65 20 3b 20 52 45 4c  ACK TO one ; REL
d070: 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 7d 0a 0a  EASE one}.} {}..
d080: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
d0d0: 74 20 74 68 61 74 20 69 66 20 61 20 43 4f 4d 4d  t that if a COMM
d0e0: 49 54 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  IT operation fai
d0f0: 6c 73 20 64 75 65 20 74 6f 20 64 65 66 65 72 72  ls due to deferr
d100: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a  ed foreign key .
d110: 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61  # constraints, a
d120: 6e 79 20 6e 65 73 74 65 64 20 73 61 76 65 70 6f  ny nested savepo
d130: 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  ints remain open
d140: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
d150: 46 3a 20 52 2d 33 37 37 33 36 2d 34 32 36 31 36  F: R-37736-42616
d160: 20 49 66 20 61 20 43 4f 4d 4d 49 54 20 73 74 61   If a COMMIT sta
d170: 74 65 6d 65 6e 74 20 28 6f 72 20 74 68 65 20 52  tement (or the R
d180: 45 4c 45 41 53 45 20 6f 66 20 61 0a 23 20 74 72  ELEASE of a.# tr
d190: 61 6e 73 61 63 74 69 6f 6e 20 53 41 56 45 50 4f  ansaction SAVEPO
d1a0: 49 4e 54 29 20 66 61 69 6c 73 20 62 65 63 61 75  INT) fails becau
d1b0: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  se the database 
d1c0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
d1d0: 61 0a 23 20 73 74 61 74 65 20 74 68 61 74 20 76  a.# state that v
d1e0: 69 6f 6c 61 74 65 73 20 61 20 64 65 66 65 72 72  iolates a deferr
d1f0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
d200: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
d210: 65 72 65 20 61 72 65 0a 23 20 63 75 72 72 65 6e  ere are.# curren
d220: 74 6c 79 20 6e 65 73 74 65 64 20 73 61 76 65 70  tly nested savep
d230: 6f 69 6e 74 73 2c 20 74 68 65 20 6e 65 73 74 65  oints, the neste
d240: 64 20 73 61 76 65 70 6f 69 6e 74 73 20 72 65 6d  d savepoints rem
d250: 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f 74  ain open..#.do_t
d260: 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 31 20  est e_fkey-38.1 
d270: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d280: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
d290: 20 57 48 45 52 45 20 61 3e 33 3b 0a 20 20 20 20   WHERE a>3;.    
d2a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
d2b0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32  ;.  }.} {1 1 2 2
d2c0: 20 33 20 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f   3 3}.do_test e_
d2d0: 66 6b 65 79 2d 33 38 2e 32 20 7b 0a 20 20 65 78  fkey-38.2 {.  ex
d2e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
d2f0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
d300: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
d310: 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 41 56 45  , 4);.      SAVE
d320: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
d330: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d340: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a  1 VALUES(5, 6);.
d350: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
d360: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d370: 7b 31 20 31 20 32 20 32 20 33 20 33 20 34 20 34  {1 1 2 2 3 3 4 4
d380: 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 65 5f   5 6}.do_test e_
d390: 66 6b 65 79 2d 33 38 2e 33 20 7b 0a 20 20 63 61  fkey-38.3 {.  ca
d3a0: 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  tchsql COMMIT.} 
d3b0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
d3c0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d3d0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
d3e0: 65 79 2d 33 38 2e 34 20 7b 0a 20 20 65 78 65 63  ey-38.4 {.  exec
d3f0: 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  sql {.    ROLLBA
d400: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43  CK TO one;.    C
d410: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
d420: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
d430: 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 20  .} {1 1 2 2 3 3 
d440: 34 20 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  4 4}..do_test e_
d450: 66 6b 65 79 2d 33 38 2e 35 20 7b 0a 20 20 65 78  fkey-38.5 {.  ex
d460: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45  ecsql {.    SAVE
d470: 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20 20 20 49  POINT a;.      I
d480: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d490: 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
d4a0: 20 20 53 41 56 45 50 4f 49 4e 54 20 62 3b 0a 20    SAVEPOINT b;. 
d4b0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
d4c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20  TO t1 VALUES(6, 
d4d0: 37 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56 45  7);.        SAVE
d4e0: 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20 20 20 20  POINT c;.       
d4f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d500: 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a  1 VALUES(7, 8);.
d510: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d520: 20 65 5f 66 6b 65 79 2d 33 38 2e 36 20 7b 0a 20   e_fkey-38.6 {. 
d530: 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41   catchsql {RELEA
d540: 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  SE a}.} {1 {fore
d550: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
d560: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
d570: 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 37 20  est e_fkey-38.7 
d580: 7b 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 52 4f  {.  execsql  {RO
d590: 4c 4c 42 41 43 4b 20 54 4f 20 63 7d 0a 20 20 63  LLBACK TO c}.  c
d5a0: 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45  atchsql {RELEASE
d5b0: 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67   a}.} {1 {foreig
d5c0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
d5d0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
d5e0: 74 20 65 5f 66 6b 65 79 2d 33 38 2e 38 20 7b 0a  t e_fkey-38.8 {.
d5f0: 20 20 65 78 65 63 73 71 6c 20 20 7b 0a 20 20 20    execsql  {.   
d600: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 62 3b 0a   ROLLBACK TO b;.
d610: 20 20 20 20 52 45 4c 45 41 53 45 20 61 3b 0a 20      RELEASE a;. 
d620: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
d630: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20   t1;.  }.} {1 1 
d640: 32 20 32 20 33 20 33 20 34 20 34 20 35 20 35 7d  2 2 3 3 4 4 5 5}
d650: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
d660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d690: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
d6a0: 23 20 53 45 43 54 49 4f 4e 20 34 2e 33 3a 20 4f  # SECTION 4.3: O
d6b0: 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20  N DELETE and ON 
d6c0: 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 0a 23  UPDATE Actions.#
d6d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d710: 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d  ##########..#---
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
d770: 61 74 20 63 6f 6e 66 69 67 75 72 65 64 20 4f 4e  at configured ON
d780: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
d790: 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20 74 61  PDATE actions ta
d7a0: 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 0a 23 20  ke place when.# 
d7b0: 64 65 6c 65 74 69 6e 67 20 6f 72 20 6d 6f 64 69  deleting or modi
d7c0: 66 79 69 6e 67 20 72 6f 77 73 20 6f 66 20 74 68  fying rows of th
d7d0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20  e parent table, 
d7e0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a  respectively..#.
d7f0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d800: 2d 34 38 32 37 30 2d 34 34 32 38 32 20 46 6f 72  -48270-44282 For
d810: 65 69 67 6e 20 6b 65 79 20 4f 4e 20 44 45 4c 45  eign key ON DELE
d820: 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
d830: 20 63 6c 61 75 73 65 73 0a 23 20 61 72 65 20 75   clauses.# are u
d840: 73 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  sed to configure
d850: 20 61 63 74 69 6f 6e 73 20 74 68 61 74 20 74 61   actions that ta
d860: 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 20 64 65  ke place when de
d870: 6c 65 74 69 6e 67 20 72 6f 77 73 20 66 72 6f 6d  leting rows from
d880: 0a 23 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  .# the parent ta
d890: 62 6c 65 20 28 4f 4e 20 44 45 4c 45 54 45 29 2c  ble (ON DELETE),
d8a0: 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   or modifying th
d8b0: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c  e parent key val
d8c0: 75 65 73 20 6f 66 0a 23 20 65 78 69 73 74 69 6e  ues of.# existin
d8d0: 67 20 72 6f 77 73 20 28 4f 4e 20 55 50 44 41 54  g rows (ON UPDAT
d8e0: 45 29 2e 0a 23 0a 23 20 54 65 73 74 20 74 68 61  E)..#.# Test tha
d8f0: 74 20 61 20 73 69 6e 67 6c 65 20 46 4b 20 63 6f  t a single FK co
d900: 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 68 61 76  nstraint may hav
d910: 65 20 64 69 66 66 65 72 65 6e 74 20 61 63 74 69  e different acti
d920: 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 23  ons configured.#
d930: 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61   for ON DELETE a
d940: 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a  nd ON UPDATE..#.
d950: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d960: 2d 34 38 31 32 34 2d 36 33 32 32 35 20 41 20 73  -48124-63225 A s
d970: 69 6e 67 6c 65 20 66 6f 72 65 69 67 6e 20 6b 65  ingle foreign ke
d980: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79  y constraint may
d990: 20 68 61 76 65 0a 23 20 64 69 66 66 65 72 65 6e   have.# differen
d9a0: 74 20 61 63 74 69 6f 6e 73 20 63 6f 6e 66 69 67  t actions config
d9b0: 75 72 65 64 20 66 6f 72 20 4f 4e 20 44 45 4c 45  ured for ON DELE
d9c0: 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
d9d0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..#.do_test e_fk
d9e0: 65 79 2d 33 39 2e 31 20 7b 0a 20 20 65 78 65 63  ey-39.1 {.  exec
d9f0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
da00: 20 54 41 42 4c 45 20 70 28 61 2c 20 62 20 50 52   TABLE p(a, b PR
da10: 49 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b 0a 20  IMARY KEY, c);. 
da20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
da30: 63 31 28 64 2c 20 65 2c 20 66 20 44 45 46 41 55  c1(d, e, f DEFAU
da40: 4c 54 20 27 6b 30 27 20 52 45 46 45 52 45 4e 43  LT 'k0' REFERENC
da50: 45 53 20 70 20 0a 20 20 20 20 20 20 4f 4e 20 55  ES p .      ON U
da60: 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c  PDATE SET DEFAUL
da70: 54 0a 20 20 20 20 20 20 4f 4e 20 44 45 4c 45 54  T.      ON DELET
da80: 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29  E SET NULL.    )
da90: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
daa0: 54 4f 20 70 20 56 41 4c 55 45 53 28 30 2c 20 27  TO p VALUES(0, '
dab0: 6b 30 27 2c 20 27 27 29 3b 0a 20 20 20 20 49 4e  k0', '');.    IN
dac0: 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
dad0: 45 53 28 31 2c 20 27 6b 31 27 2c 20 27 49 27 29  ES(1, 'k1', 'I')
dae0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
daf0: 4f 20 70 20 56 41 4c 55 45 53 28 32 2c 20 27 6b  O p VALUES(2, 'k
db00: 32 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 49  2', 'II');.    I
db10: 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c  NSERT INTO p VAL
db20: 55 45 53 28 33 2c 20 27 6b 33 27 2c 20 27 49 49  UES(3, 'k3', 'II
db30: 49 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  I');..    INSERT
db40: 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
db50: 31 2c 20 27 78 78 27 2c 20 27 6b 31 27 29 3b 0a  1, 'xx', 'k1');.
db60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
db70: 63 31 20 56 41 4c 55 45 53 28 32 2c 20 27 78 78  c1 VALUES(2, 'xx
db80: 27 2c 20 27 6b 32 27 29 3b 0a 20 20 20 20 49 4e  ', 'k2');.    IN
db90: 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
dba0: 55 45 53 28 33 2c 20 27 78 78 27 2c 20 27 6b 33  UES(3, 'xx', 'k3
dbb0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
dbc0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 32  test e_fkey-39.2
dbd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
dbe0: 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54 20     UPDATE p SET 
dbf0: 62 20 3d 20 27 6b 34 27 20 57 48 45 52 45 20 61  b = 'k4' WHERE a
dc00: 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
dc10: 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   * FROM c1;.  }.
dc20: 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20  } {1 xx k0 2 xx 
dc30: 6b 32 20 33 20 78 78 20 6b 33 7d 0a 64 6f 5f 74  k2 3 xx k3}.do_t
dc40: 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 33 20  est e_fkey-39.3 
dc50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
dc60: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20    DELETE FROM p 
dc70: 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20  WHERE a = 2;.   
dc80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
dc90: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20 6b  1;.  }.} {1 xx k
dca0: 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78 20 6b  0 2 xx {} 3 xx k
dcb0: 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  3}.do_test e_fke
dcc0: 79 2d 33 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-39.4 {.  execs
dcd0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
dce0: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 69 20  UNIQUE INDEX pi 
dcf0: 4f 4e 20 70 28 63 29 3b 0a 20 20 20 20 52 45 50  ON p(c);.    REP
dd00: 4c 41 43 45 20 49 4e 54 4f 20 70 20 56 41 4c 55  LACE INTO p VALU
dd10: 45 53 28 35 2c 20 27 6b 35 27 2c 20 27 49 49 49  ES(5, 'k5', 'III
dd20: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  ');.    SELECT *
dd30: 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20   FROM c1;.  }.} 
dd40: 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20 7b 7d  {1 xx k0 2 xx {}
dd50: 20 33 20 78 78 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d   3 xx {}}..#----
dd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 0a 23 20 45 61 63 68 20 66 6f 72  -----.# Each for
ddb0: 65 69 67 6e 20 6b 65 79 20 69 6e 20 74 68 65 20  eign key in the 
ddc0: 73 79 73 74 65 6d 20 68 61 73 20 61 6e 20 4f 4e  system has an ON
ddd0: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 44   UPDATE and ON D
dde0: 45 4c 45 54 45 20 61 63 74 69 6f 6e 2c 0a 23 20  ELETE action,.# 
ddf0: 65 69 74 68 65 72 20 22 4e 4f 20 41 43 54 49 4f  either "NO ACTIO
de00: 4e 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c 20  N", "RESTRICT", 
de10: 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53 45 54  "SET NULL", "SET
de20: 20 44 45 46 41 55 4c 54 22 20 6f 72 20 22 43 41   DEFAULT" or "CA
de30: 53 43 41 44 45 22 2e 0a 23 0a 23 20 45 56 49 44  SCADE"..#.# EVID
de40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 33 32 36  ENCE-OF: R-33326
de50: 2d 34 35 32 35 32 20 54 68 65 20 4f 4e 20 44 45  -45252 The ON DE
de60: 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41  LETE and ON UPDA
de70: 54 45 20 61 63 74 69 6f 6e 0a 23 20 61 73 73 6f  TE action.# asso
de80: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
de90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 20   foreign key in 
dea0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
deb0: 73 65 20 69 73 20 6f 6e 65 20 6f 66 20 22 4e 4f  se is one of "NO
dec0: 0a 23 20 41 43 54 49 4f 4e 22 2c 20 22 52 45 53  .# ACTION", "RES
ded0: 54 52 49 43 54 22 2c 20 22 53 45 54 20 4e 55 4c  TRICT", "SET NUL
dee0: 4c 22 2c 20 22 53 45 54 20 44 45 46 41 55 4c 54  L", "SET DEFAULT
def0: 22 20 6f 72 20 22 43 41 53 43 41 44 45 22 2e 0a  " or "CASCADE"..
df00: 23 0a 23 20 49 66 20 6e 6f 6e 65 20 69 73 20 73  #.# If none is s
df10: 70 65 63 69 66 69 65 64 20 65 78 70 6c 69 63 69  pecified explici
df20: 74 6c 79 2c 20 22 4e 4f 20 41 43 54 49 4f 4e 22  tly, "NO ACTION"
df30: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
df40: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
df50: 3a 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34 20  : R-19803-45884 
df60: 49 66 20 61 6e 20 61 63 74 69 6f 6e 20 69 73 20  If an action is 
df70: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
df80: 70 65 63 69 66 69 65 64 2c 0a 23 20 69 74 20 64  pecified,.# it d
df90: 65 66 61 75 6c 74 73 20 74 6f 20 22 4e 4f 20 41  efaults to "NO A
dfa0: 43 54 49 4f 4e 22 2e 0a 23 20 0a 64 72 6f 70 5f  CTION"..# .drop_
dfb0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
dfc0: 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e 31 20 7b  st e_fkey-40.1 {
dfd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
dfe0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
dff0: 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b  rent(x PRIMARY K
e000: 45 59 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41  EY, y);.    CREA
e010: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28  TE TABLE child1(
e020: 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45  a, .      b REFE
e030: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
e040: 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f   UPDATE NO ACTIO
e050: 4e 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54  N ON DELETE REST
e060: 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  RICT.    );.    
e070: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
e080: 6c 64 32 28 61 2c 20 0a 20 20 20 20 20 20 62 20  ld2(a, .      b 
e090: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
e0a0: 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54  t ON UPDATE REST
e0b0: 52 49 43 54 20 4f 4e 20 44 45 4c 45 54 45 20 53  RICT ON DELETE S
e0c0: 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20  ET NULL.    );. 
e0d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e0e0: 63 68 69 6c 64 33 28 61 2c 20 0a 20 20 20 20 20  child3(a, .     
e0f0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e100: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53  rent ON UPDATE S
e110: 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c 45 54  ET NULL ON DELET
e120: 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20  E SET DEFAULT.  
e130: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
e140: 54 41 42 4c 45 20 63 68 69 6c 64 34 28 61 2c 20  TABLE child4(a, 
e150: 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e  .      b REFEREN
e160: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
e170: 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  DATE SET DEFAULT
e180: 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
e190: 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2d  DE.    );..    -
e1a0: 2d 20 43 72 65 61 74 65 20 73 6f 6d 65 20 66 6f  - Create some fo
e1b0: 72 65 69 67 6e 20 6b 65 79 73 20 74 68 61 74 20  reign keys that 
e1c0: 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  use the default 
e1d0: 61 63 74 69 6f 6e 20 2d 20 22 4e 4f 20 41 43 54  action - "NO ACT
e1e0: 49 4f 4e 22 0a 20 20 20 20 43 52 45 41 54 45 20  ION".    CREATE 
e1f0: 54 41 42 4c 45 20 63 68 69 6c 64 35 28 61 2c 20  TABLE child5(a, 
e200: 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  b REFERENCES par
e210: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41  ent ON UPDATE CA
e220: 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41  SCADE);.    CREA
e230: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28  TE TABLE child6(
e240: 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  a, b REFERENCES 
e250: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
e260: 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20   RESTRICT);.    
e270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
e280: 6c 64 37 28 61 2c 20 62 20 52 45 46 45 52 45 4e  ld7(a, b REFEREN
e290: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45  CES parent ON DE
e2a0: 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b  LETE NO ACTION);
e2b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e2c0: 45 20 63 68 69 6c 64 38 28 61 2c 20 62 20 52 45  E child8(a, b RE
e2d0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
e2e0: 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54  ON UPDATE NO ACT
e2f0: 49 4f 4e 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  ION);.  }.} {}..
e300: 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a 54 61 62  foreach {tn zTab
e310: 20 6c 52 65 73 7d 20 7b 0a 20 20 32 20 63 68 69   lRes} {.  2 chi
e320: 6c 64 31 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld1 {0 0 parent 
e330: 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d  b {} {NO ACTION}
e340: 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d 0a   RESTRICT NONE}.
e350: 20 20 33 20 63 68 69 6c 64 32 20 7b 30 20 30 20    3 child2 {0 0 
e360: 70 61 72 65 6e 74 20 62 20 7b 7d 20 52 45 53 54  parent b {} REST
e370: 52 49 43 54 20 7b 53 45 54 20 4e 55 4c 4c 7d 20  RICT {SET NULL} 
e380: 4e 4f 4e 45 7d 0a 20 20 34 20 63 68 69 6c 64 33  NONE}.  4 child3
e390: 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b   {0 0 parent b {
e3a0: 7d 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 7b 53 45  } {SET NULL} {SE
e3b0: 54 20 44 45 46 41 55 4c 54 7d 20 4e 4f 4e 45 7d  T DEFAULT} NONE}
e3c0: 0a 20 20 35 20 63 68 69 6c 64 34 20 7b 30 20 30  .  5 child4 {0 0
e3d0: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53 45   parent b {} {SE
e3e0: 54 20 44 45 46 41 55 4c 54 7d 20 43 41 53 43 41  T DEFAULT} CASCA
e3f0: 44 45 20 4e 4f 4e 45 7d 0a 20 20 36 20 63 68 69  DE NONE}.  6 chi
e400: 6c 64 35 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld5 {0 0 parent 
e410: 62 20 7b 7d 20 43 41 53 43 41 44 45 20 7b 4e 4f  b {} CASCADE {NO
e420: 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20   ACTION} NONE}. 
e430: 20 37 20 63 68 69 6c 64 36 20 7b 30 20 30 20 70   7 child6 {0 0 p
e440: 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41  arent b {} {NO A
e450: 43 54 49 4f 4e 7d 20 52 45 53 54 52 49 43 54 20  CTION} RESTRICT 
e460: 4e 4f 4e 45 7d 0a 20 20 38 20 63 68 69 6c 64 37  NONE}.  8 child7
e470: 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b   {0 0 parent b {
e480: 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e  } {NO ACTION} {N
e490: 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a  O ACTION} NONE}.
e4a0: 20 20 39 20 63 68 69 6c 64 38 20 7b 30 20 30 20    9 child8 {0 0 
e4b0: 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20  parent b {} {NO 
e4c0: 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54 49  ACTION} {NO ACTI
e4d0: 4f 4e 7d 20 4e 4f 4e 45 7d 0a 7d 20 7b 0a 20 20  ON} NONE}.} {.  
e4e0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
e4f0: 30 2e 24 74 6e 20 7b 20 65 78 65 63 73 71 6c 20  0.$tn { execsql 
e500: 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
e510: 6b 65 79 5f 6c 69 73 74 28 24 7a 54 61 62 29 22  key_list($zTab)"
e520: 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d   } $lRes.}..#---
e530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e570: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
e580: 61 74 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 6d  at "NO ACTION" m
e590: 65 61 6e 73 20 74 68 61 74 20 6e 6f 74 68 69 6e  eans that nothin
e5a0: 67 20 68 61 70 70 65 6e 73 20 74 6f 20 61 20 63  g happens to a c
e5b0: 68 69 6c 64 20 72 6f 77 20 77 68 65 6e 0a 23 20  hild row when.# 
e5c0: 69 74 27 73 20 70 61 72 65 6e 74 20 72 6f 77 20  it's parent row 
e5d0: 69 73 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  is updated or de
e5e0: 6c 65 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  leted..#.# EVIDE
e5f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 37 31 2d  NCE-OF: R-19971-
e600: 35 34 39 37 36 20 43 6f 6e 66 69 67 75 72 69 6e  54976 Configurin
e610: 67 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 6d 65  g "NO ACTION" me
e620: 61 6e 73 20 6a 75 73 74 20 74 68 61 74 3a 0a 23  ans just that:.#
e630: 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74 20 6b   when a parent k
e640: 65 79 20 69 73 20 6d 6f 64 69 66 69 65 64 20 6f  ey is modified o
e650: 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
e660: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
e670: 73 70 65 63 69 61 6c 0a 23 20 61 63 74 69 6f 6e  special.# action
e680: 20 69 73 20 74 61 6b 65 6e 2e 0a 23 0a 64 72 6f   is taken..#.dro
e690: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
e6a0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 31  test e_fkey-41.1
e6b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e6c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e6d0: 70 61 72 65 6e 74 28 70 31 2c 20 70 32 2c 20 50  parent(p1, p2, P
e6e0: 52 49 4d 41 52 59 20 4b 45 59 28 70 31 2c 20 70  RIMARY KEY(p1, p
e6f0: 32 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  2));.    CREATE 
e700: 54 41 42 4c 45 20 63 68 69 6c 64 28 63 31 2c 20  TABLE child(c1, 
e710: 63 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49  c2, .      FOREI
e720: 47 4e 20 4b 45 59 28 63 31 2c 20 63 32 29 20 52  GN KEY(c1, c2) R
e730: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e740: 0a 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54 45  .      ON UPDATE
e750: 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20   NO ACTION.     
e760: 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43   ON DELETE NO AC
e770: 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52  TION.      DEFER
e780: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
e790: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
e7a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e7b0: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6a  parent VALUES('j
e7c0: 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'k');.    INS
e7d0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
e7e0: 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27 29  VALUES('l', 'm')
e7f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e800: 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27  O child VALUES('
e810: 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49 4e  j', 'k');.    IN
e820: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20  SERT INTO child 
e830: 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27 29  VALUES('l', 'm')
e840: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
e850: 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20 7b  st e_fkey-41.2 {
e860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e870: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
e880: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
e890: 70 31 3d 27 6b 27 20 57 48 45 52 45 20 70 31 3d  p1='k' WHERE p1=
e8a0: 27 6a 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  'j';.      DELET
e8b0: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
e8c0: 45 52 45 20 70 31 3d 27 6c 27 3b 0a 20 20 20 20  ERE p1='l';.    
e8d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e8e0: 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6a 20  child;.  }.} {j 
e8f0: 6b 20 6c 20 6d 7d 0a 64 6f 5f 74 65 73 74 20 65  k l m}.do_test e
e900: 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20 63  _fkey-41.3 {.  c
e910: 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  atchsql COMMIT.}
e920: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
e930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
e940: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
e950: 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20 65 78 65  key-41.4 {.  exe
e960: 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20  csql ROLLBACK.} 
e970: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
e980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
e9c0: 20 54 65 73 74 20 74 68 61 74 20 22 52 45 53 54   Test that "REST
e9d0: 52 49 43 54 22 20 6d 65 61 6e 73 20 74 68 65 20  RICT" means the 
e9e0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 70  application is p
e9f0: 72 6f 68 69 62 69 74 65 64 20 66 72 6f 6d 20 64  rohibited from d
ea00: 65 6c 65 74 69 6e 67 0a 23 20 6f 72 20 75 70 64  eleting.# or upd
ea10: 61 74 69 6e 67 20 61 20 70 61 72 65 6e 74 20 74  ating a parent t
ea20: 61 62 6c 65 20 72 6f 77 20 77 68 65 6e 20 74 68  able row when th
ea30: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
ea40: 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b 65 79  r more child key
ea50: 73 0a 23 20 6d 61 70 70 65 64 20 74 6f 20 69 74  s.# mapped to it
ea60: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
ea70: 46 3a 20 52 2d 30 34 32 37 32 2d 33 38 36 35 33  F: R-04272-38653
ea80: 20 54 68 65 20 22 52 45 53 54 52 49 43 54 22 20   The "RESTRICT" 
ea90: 61 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  action means tha
eaa0: 74 20 74 68 65 0a 23 20 61 70 70 6c 69 63 61 74  t the.# applicat
eab0: 69 6f 6e 20 69 73 20 70 72 6f 68 69 62 69 74 65  ion is prohibite
eac0: 64 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20  d from deleting 
ead0: 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 52  (for ON DELETE R
eae0: 45 53 54 52 49 43 54 29 20 6f 72 0a 23 20 6d 6f  ESTRICT) or.# mo
eaf0: 64 69 66 79 69 6e 67 20 28 66 6f 72 20 4f 4e 20  difying (for ON 
eb00: 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54 29  UPDATE RESTRICT)
eb10: 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77 68   a parent key wh
eb20: 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20  en there exists 
eb30: 6f 6e 65 0a 23 20 6f 72 20 6d 6f 72 65 20 63 68  one.# or more ch
eb40: 69 6c 64 20 6b 65 79 73 20 6d 61 70 70 65 64 20  ild keys mapped 
eb50: 74 6f 20 69 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c  to it..#.drop_al
eb60: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
eb70: 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20   e_fkey-41.1 {. 
eb80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
eb90: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
eba0: 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20  nt(p1, p2);.    
ebb0: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
ebc0: 44 45 58 20 70 61 72 65 6e 74 5f 69 20 4f 4e 20  DEX parent_i ON 
ebd0: 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 3b 0a  parent(p1, p2);.
ebe0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
ebf0: 20 63 68 69 6c 64 31 28 63 31 2c 20 63 32 2c 20   child1(c1, c2, 
ec00: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
ec10: 45 59 28 63 32 2c 20 63 31 29 20 52 45 46 45 52  EY(c2, c1) REFER
ec20: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31 2c  ENCES parent(p1,
ec30: 20 70 32 29 20 4f 4e 20 44 45 4c 45 54 45 20 52   p2) ON DELETE R
ec40: 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20  ESTRICT.    );. 
ec50: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ec60: 63 68 69 6c 64 32 28 63 31 2c 20 63 32 2c 20 0a  child2(c1, c2, .
ec70: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
ec80: 59 28 63 32 2c 20 63 31 29 20 52 45 46 45 52 45  Y(c2, c1) REFERE
ec90: 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31 2c 20  NCES parent(p1, 
eca0: 70 32 29 20 4f 4e 20 55 50 44 41 54 45 20 52 45  p2) ON UPDATE RE
ecb0: 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  STRICT.    );.  
ecc0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
ecd0: 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65  _fkey-41.2 {.  e
ece0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
ecf0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
ed00: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
ed10: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ed20: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
ed30: 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 49  'c', 'd');.    I
ed40: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
ed50: 31 20 56 41 4c 55 45 53 28 27 62 27 2c 20 27 61  1 VALUES('b', 'a
ed60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
ed70: 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
ed80: 53 28 27 64 27 2c 20 27 63 27 29 3b 0a 20 20 7d  S('d', 'c');.  }
ed90: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
eda0: 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20 63 61  fkey-41.3 {.  ca
edb0: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
edc0: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
edd0: 45 20 70 31 20 3d 20 27 61 27 20 7d 0a 7d 20 7b  E p1 = 'a' }.} {
ede0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
edf0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
ee00: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
ee10: 79 2d 34 31 2e 34 20 7b 0a 20 20 63 61 74 63 68  y-41.4 {.  catch
ee20: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72  sql { UPDATE par
ee30: 65 6e 74 20 53 45 54 20 70 32 20 3d 20 27 65 27  ent SET p2 = 'e'
ee40: 20 57 48 45 52 45 20 70 31 20 3d 20 27 63 27 20   WHERE p1 = 'c' 
ee50: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
ee60: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
ee70: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eec0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
eed0: 52 45 53 54 52 49 43 54 20 69 73 20 73 6c 69 67  RESTRICT is slig
eee0: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 66  htly different f
eef0: 72 6f 6d 20 4e 4f 20 41 43 54 49 4f 4e 20 66 6f  rom NO ACTION fo
ef00: 72 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 63 6f  r IMMEDIATE.# co
ef10: 6e 73 74 72 61 69 6e 74 73 2c 20 69 6e 20 74 68  nstraints, in th
ef20: 61 74 20 69 74 20 69 73 20 65 6e 66 6f 72 63 65  at it is enforce
ef30: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 6e  d immediately, n
ef40: 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ot at the end of
ef50: 20 74 68 65 20 0a 23 20 73 74 61 74 65 6d 65 6e   the .# statemen
ef60: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
ef70: 4f 46 3a 20 52 2d 33 37 39 39 37 2d 34 32 31 38  OF: R-37997-4218
ef80: 37 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  7 The difference
ef90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 66 66   between the eff
efa0: 65 63 74 20 6f 66 20 61 0a 23 20 52 45 53 54 52  ect of a.# RESTR
efb0: 49 43 54 20 61 63 74 69 6f 6e 20 61 6e 64 20 6e  ICT action and n
efc0: 6f 72 6d 61 6c 20 66 6f 72 65 69 67 6e 20 6b 65  ormal foreign ke
efd0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y constraint enf
efe0: 6f 72 63 65 6d 65 6e 74 20 69 73 20 74 68 61 74  orcement is that
eff0: 0a 23 20 74 68 65 20 52 45 53 54 52 49 43 54 20  .# the RESTRICT 
f000: 61 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 69 6e  action processin
f010: 67 20 68 61 70 70 65 6e 73 20 61 73 20 73 6f 6f  g happens as soo
f020: 6e 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 69  n as the field i
f030: 73 20 75 70 64 61 74 65 64 0a 23 20 2d 20 6e 6f  s updated.# - no
f040: 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
f050: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
f060: 65 6d 65 6e 74 20 61 73 20 69 74 20 77 6f 75 6c  ement as it woul
f070: 64 20 77 69 74 68 20 61 6e 0a 23 20 69 6d 6d 65  d with an.# imme
f080: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
f090: 2c 20 6f 72 20 61 74 20 74 68 65 20 65 6e 64 20  , or at the end 
f0a0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
f0b0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 73 20 69 74  ransaction as it
f0c0: 0a 23 20 77 6f 75 6c 64 20 77 69 74 68 20 61 20  .# would with a 
f0d0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
f0e0: 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  int..#.drop_all_
f0f0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
f100: 5f 66 6b 65 79 2d 34 32 2e 31 20 7b 0a 20 20 65  _fkey-42.1 {.  e
f110: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
f120: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
f130: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
f140: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f150: 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52  E child1(c REFER
f160: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
f170: 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54 29  UPDATE RESTRICT)
f180: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f190: 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45  LE child2(c REFE
f1a0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
f1b0: 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f   UPDATE NO ACTIO
f1c0: 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  N);..    INSERT 
f1d0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f1e0: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
f1f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
f200: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  nt VALUES('key2'
f210: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f220: 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53  TO child1 VALUES
f230: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
f240: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32  SERT INTO child2
f250: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f260: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ..    CREATE TRI
f270: 47 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41 46  GGER parent_t AF
f280: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 70 61  TER UPDATE ON pa
f290: 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20  rent BEGIN.     
f2a0: 20 55 50 44 41 54 45 20 63 68 69 6c 64 31 20 73   UPDATE child1 s
f2b0: 65 74 20 63 20 3d 20 6e 65 77 2e 78 20 57 48 45  et c = new.x WHE
f2c0: 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20  RE c = old.x;.  
f2d0: 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64      UPDATE child
f2e0: 32 20 73 65 74 20 63 20 3d 20 6e 65 77 2e 78 20  2 set c = new.x 
f2f0: 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b  WHERE c = old.x;
f300: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
f310: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
f320: 79 2d 34 32 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-42.2 {.  catch
f330: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72  sql { UPDATE par
f340: 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79  ent SET x = 'key
f350: 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d 20   one' WHERE x = 
f360: 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66  'key1' }.} {1 {f
f370: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
f380: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
f390: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f3a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
f3b0: 20 0a 20 20 20 20 55 50 44 41 54 45 20 70 61 72   .    UPDATE par
f3c0: 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79  ent SET x = 'key
f3d0: 20 74 77 6f 27 20 57 48 45 52 45 20 78 20 3d 20   two' WHERE x = 
f3e0: 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c 45  'key2';.    SELE
f3f0: 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32  CT * FROM child2
f400: 3b 0a 20 20 7d 0a 7d 20 7b 7b 6b 65 79 20 74 77  ;.  }.} {{key tw
f410: 6f 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  o}}..drop_all_ta
f420: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
f430: 6b 65 79 2d 34 32 2e 34 20 7b 0a 20 20 65 78 65  key-42.4 {.  exe
f440: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
f450: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
f460: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
f470: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f480: 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e  child1(c REFEREN
f490: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45  CES parent ON DE
f4a0: 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a  LETE RESTRICT);.
f4b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f4c0: 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52 45   child2(c REFERE
f4d0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
f4e0: 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  ELETE NO ACTION)
f4f0: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
f500: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
f510: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
f520: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
f530: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f540: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f550: 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27   child1 VALUES('
f560: 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
f570: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56  RT INTO child2 V
f580: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 0a  ALUES('key2');..
f590: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
f5a0: 45 52 20 70 61 72 65 6e 74 5f 74 20 41 46 54 45  ER parent_t AFTE
f5b0: 52 20 44 45 4c 45 54 45 20 4f 4e 20 70 61 72 65  R DELETE ON pare
f5c0: 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  nt BEGIN.      U
f5d0: 50 44 41 54 45 20 63 68 69 6c 64 31 20 53 45 54  PDATE child1 SET
f5e0: 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20   c = NULL WHERE 
f5f0: 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 20  c = old.x;.     
f600: 20 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 53   UPDATE child2 S
f610: 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52  ET c = NULL WHER
f620: 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20  E c = old.x;.   
f630: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
f640: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f650: 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .5 {.  catchsql 
f660: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61  { DELETE FROM pa
f670: 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
f680: 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f  key1' }.} {1 {fo
f690: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
f6a0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
f6b0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f6c0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  6 {.  execsql { 
f6d0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
f6e0: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
f6f0: 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45  = 'key2';.    SE
f700: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c  LECT * FROM chil
f710: 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a  d2;.  }.} {{}}..
f720: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
f730: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f740: 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.7 {.  execsql 
f750: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
f760: 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
f770: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
f780: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
f790: 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(c REFERENCES p
f7a0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
f7b0: 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
f7c0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
f7d0: 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d2(c REFERENCES 
f7e0: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
f7f0: 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20   NO ACTION);..  
f800: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
f810: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f820: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
f830: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f840: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
f850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
f860: 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  d1 VALUES('key1'
f870: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f880: 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
f890: 28 27 6b 65 79 32 27 29 3b 0a 20 20 7d 0a 7d 20  ('key2');.  }.} 
f8a0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
f8b0: 79 2d 34 32 2e 38 20 7b 0a 20 20 63 61 74 63 68  y-42.8 {.  catch
f8c0: 73 71 6c 20 7b 20 52 45 50 4c 41 43 45 20 49 4e  sql { REPLACE IN
f8d0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
f8e0: 28 27 6b 65 79 31 27 29 20 7d 0a 7d 20 7b 31 20  ('key1') }.} {1 
f8f0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
f900: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
f910: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f920: 34 32 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.9 {.  execsql
f930: 20 7b 20 0a 20 20 20 20 52 45 50 4c 41 43 45 20   { .    REPLACE 
f940: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f950: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
f960: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68  SELECT * FROM ch
f970: 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79  ild2;.  }.} {key
f980: 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}..#-----------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
f9d0: 20 54 65 73 74 20 74 68 61 74 20 52 45 53 54 52   Test that RESTR
f9e0: 49 43 54 20 69 73 20 65 6e 66 6f 72 63 65 64 20  ICT is enforced 
f9f0: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 65 76 65  immediately, eve
fa00: 6e 20 66 6f 72 20 61 20 44 45 46 45 52 52 45 44  n for a DEFERRED
fa10: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23   constraint..#.#
fa20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa30: 32 34 31 37 39 2d 36 30 35 32 33 20 45 76 65 6e  24179-60523 Even
fa40: 20 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   if the foreign 
fa50: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
fa60: 74 20 69 73 0a 23 20 61 74 74 61 63 68 65 64 20  t is.# attached 
fa70: 74 6f 20 69 73 20 64 65 66 65 72 72 65 64 2c 20  to is deferred, 
fa80: 63 6f 6e 66 69 67 75 72 69 6e 67 20 61 20 52 45  configuring a RE
fa90: 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20 63 61  STRICT action ca
faa0: 75 73 65 73 20 53 51 4c 69 74 65 0a 23 20 74 6f  uses SQLite.# to
fab0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
fac0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
fad0: 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77 69 74  a parent key wit
fae0: 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c  h dependent chil
faf0: 64 0a 23 20 6b 65 79 73 20 69 73 20 64 65 6c 65  d.# keys is dele
fb00: 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e  ted or modified.
fb10: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
fb20: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
fb30: 79 2d 34 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-43.1 {.  execs
fb40: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
fb50: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50  TABLE parent(x P
fb60: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
fb70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
fb80: 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45  ild1(c REFERENCE
fb90: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
fba0: 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20 20  TE RESTRICT.    
fbb0: 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49    DEFERRABLE INI
fbc0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
fbd0: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
fbe0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63  E TABLE child2(c
fbf0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
fc00: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20  nt ON UPDATE NO 
fc10: 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46  ACTION.      DEF
fc20: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
fc30: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
fc40: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
fc50: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
fc60: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
fc70: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
fc80: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
fc90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fca0: 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27   child1 VALUES('
fcb0: 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
fcc0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56  RT INTO child2 V
fcd0: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
fce0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20     BEGIN;.  }.} 
fcf0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
fd00: 79 2d 34 33 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-43.2 {.  catch
fd10: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72  sql { UPDATE par
fd20: 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79  ent SET x = 'key
fd30: 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d 20   one' WHERE x = 
fd40: 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66  'key1' }.} {1 {f
fd50: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
fd60: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
fd70: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
fd80: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
fd90: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
fda0: 45 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f 27  ET x = 'key two'
fdb0: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32   WHERE x = 'key2
fdc0: 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  ' }.} {}.do_test
fdd0: 20 65 5f 66 6b 65 79 2d 34 33 2e 34 20 7b 0a 20   e_fkey-43.4 {. 
fde0: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
fdf0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
fe00: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
fe10: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
fe20: 5f 66 6b 65 79 2d 34 33 2e 35 20 7b 0a 20 20 65  _fkey-43.5 {.  e
fe30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
fe40: 41 54 45 20 63 68 69 6c 64 32 20 53 45 54 20 63  ATE child2 SET c
fe50: 20 3d 20 27 6b 65 79 20 74 77 6f 27 3b 0a 20 20   = 'key two';.  
fe60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
fe70: 7b 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {}..drop_all_tab
fe80: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
fe90: 65 79 2d 34 33 2e 36 20 7b 0a 20 20 65 78 65 63  ey-43.6 {.  exec
fea0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
feb0: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20   TABLE parent(x 
fec0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
fed0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
fee0: 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43  hild1(c REFERENC
fef0: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c  ES parent ON DEL
ff00: 45 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20  ETE RESTRICT.   
ff10: 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e     DEFERRABLE IN
ff20: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
ff30: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
ff40: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
ff50: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  c REFERENCES par
ff60: 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f  ent ON DELETE NO
ff70: 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45   ACTION.      DE
ff80: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
ff90: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
ffa0: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
ffb0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
ffc0: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
ffd0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
ffe0: 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  t VALUES('key2')
fff0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10000 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28  O child1 VALUES(
10010 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
10020 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
10030 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
10040 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d      BEGIN;.  }.}
10050 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
10060 65 79 2d 34 33 2e 37 20 7b 0a 20 20 63 61 74 63  ey-43.7 {.  catc
10070 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
10080 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
10090 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b  x = 'key1' }.} {
100a0 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
100b0 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
100c0 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
100d0 79 2d 34 33 2e 38 20 7b 0a 20 20 65 78 65 63 73  y-43.8 {.  execs
100e0 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
100f0 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
10100 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20 7b 7d 0a  = 'key2' }.} {}.
10110 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10120 33 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.9 {.  catchsql
10130 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f   COMMIT.} {1 {fo
10140 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
10150 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
10160 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
10170 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 {.  execsql {
10180 0a 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c  .    UPDATE chil
10190 64 32 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c 3b  d2 SET c = NULL;
101a0 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
101b0 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 0a 23 20 54 65 73 74 20 53 45 54 20 4e 55 4c  -.# Test SET NUL
10210 4c 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45  L actions..#.# E
10220 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
10230 33 35 33 2d 30 35 33 32 37 20 49 66 20 74 68 65  353-05327 If the
10240 20 63 6f 6e 66 69 67 75 72 65 64 20 61 63 74 69   configured acti
10250 6f 6e 20 69 73 20 22 53 45 54 20 4e 55 4c 4c 22  on is "SET NULL"
10260 2c 0a 23 20 74 68 65 6e 20 77 68 65 6e 20 61 20  ,.# then when a 
10270 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 64 65  parent key is de
10280 6c 65 74 65 64 20 28 66 6f 72 20 4f 4e 20 44 45  leted (for ON DE
10290 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 20 6f  LETE SET NULL) o
102a0 72 20 6d 6f 64 69 66 69 65 64 0a 23 20 28 66 6f  r modified.# (fo
102b0 72 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20  r ON UPDATE SET 
102c0 4e 55 4c 4c 29 2c 20 74 68 65 20 63 68 69 6c 64  NULL), the child
102d0 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   key columns of 
102e0 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  all rows in the.
102f0 23 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74 68  # child table th
10300 61 74 20 6d 61 70 70 65 64 20 74 6f 20 74 68 65  at mapped to the
10310 20 70 61 72 65 6e 74 20 6b 65 79 20 61 72 65 20   parent key are 
10320 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 53  set to contain S
10330 51 4c 20 4e 55 4c 4c 0a 23 20 76 61 6c 75 65 73  QL NULL.# values
10340 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
10350 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
10360 65 79 2d 34 34 2e 31 20 7b 0a 20 20 65 78 65 63  ey-44.1 {.  exec
10370 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
10380 20 54 41 42 4c 45 20 70 41 28 78 20 50 52 49 4d   TABLE pA(x PRIM
10390 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
103a0 45 41 54 45 20 54 41 42 4c 45 20 63 41 28 63 20  EATE TABLE cA(c 
103b0 52 45 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e  REFERENCES pA ON
103c0 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
103d0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
103e0 42 4c 45 20 63 42 28 63 20 52 45 46 45 52 45 4e  BLE cB(c REFEREN
103f0 43 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54 45  CES pA ON UPDATE
10400 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20   SET NULL);..   
10410 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 20   INSERT INTO pA 
10420 56 41 4c 55 45 53 28 58 27 41 42 43 44 27 29 3b  VALUES(X'ABCD');
10430 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10440 20 70 41 20 56 41 4c 55 45 53 28 58 27 31 32 33   pA VALUES(X'123
10450 34 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  4');.    INSERT 
10460 49 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28 58  INTO cA VALUES(X
10470 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53  'ABCD');.    INS
10480 45 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c 55  ERT INTO cB VALU
10490 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20 7d  ES(X'1234');.  }
104a0 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
104b0 66 6b 65 79 2d 34 34 2e 32 20 7b 0a 20 20 65 78  fkey-44.2 {.  ex
104c0 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
104d0 54 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52 45  TE FROM pA WHERE
104e0 20 72 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20   rowid = 1;.    
104f0 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
10500 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b  FROM pA;.  }.} {
10510 58 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73 74  X'1234'}.do_test
10520 20 65 5f 66 6b 65 79 2d 34 34 2e 33 20 7b 0a 20   e_fkey-44.3 {. 
10530 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
10540 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46  ELECT quote(c) F
10550 52 4f 4d 20 63 41 3b 0a 20 20 7d 0a 7d 20 7b 4e  ROM cA;.  }.} {N
10560 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ULL}.do_test e_f
10570 6b 65 79 2d 34 34 2e 34 20 7b 0a 20 20 65 78 65  key-44.4 {.  exe
10580 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
10590 45 20 70 41 20 53 45 54 20 78 20 3d 20 58 27 38  E pA SET x = X'8
105a0 37 36 35 27 20 57 48 45 52 45 20 72 6f 77 69 64  765' WHERE rowid
105b0 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 2;.    SELECT
105c0 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70   quote(x) FROM p
105d0 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 38 37 36 35  A;.  }.} {X'8765
105e0 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  '}.do_test e_fke
105f0 79 2d 34 34 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-44.5 {.  execs
10600 71 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74  ql { SELECT quot
10610 65 28 63 29 20 46 52 4f 4d 20 63 42 20 7d 0a 7d  e(c) FROM cB }.}
10620 20 7b 4e 55 4c 4c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   {NULL}..#------
10630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20 44  ---.# Test SET D
10680 45 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e 0a  EFAULT actions..
10690 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
106a0 20 52 2d 34 33 30 35 34 2d 35 34 38 33 32 20 54   R-43054-54832 T
106b0 68 65 20 22 53 45 54 20 44 45 46 41 55 4c 54 22  he "SET DEFAULT"
106c0 20 61 63 74 69 6f 6e 73 20 61 72 65 20 73 69 6d   actions are sim
106d0 69 6c 61 72 20 74 6f 0a 23 20 22 53 45 54 20 4e  ilar to.# "SET N
106e0 55 4c 4c 22 2c 20 65 78 63 65 70 74 20 74 68 61  ULL", except tha
106f0 74 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  t each of the ch
10700 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ild key columns 
10710 69 73 20 73 65 74 20 74 6f 0a 23 20 63 6f 6e 74  is set to.# cont
10720 61 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ain the columns 
10730 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69 6e  default value in
10740 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 2e 0a 23  stead of NULL..#
10750 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
10760 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10770 34 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  45.1 {.  execsql
10780 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
10790 42 4c 45 20 70 41 28 78 20 50 52 49 4d 41 52 59  BLE pA(x PRIMARY
107a0 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54   KEY);.    CREAT
107b0 45 20 54 41 42 4c 45 20 63 41 28 63 20 44 45 46  E TABLE cA(c DEF
107c0 41 55 4c 54 20 58 27 30 30 30 30 27 20 52 45 46  AULT X'0000' REF
107d0 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 44 45  ERENCES pA ON DE
107e0 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  LETE SET DEFAULT
107f0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
10800 42 4c 45 20 63 42 28 63 20 44 45 46 41 55 4c 54  BLE cB(c DEFAULT
10810 20 58 27 39 39 39 39 27 20 52 45 46 45 52 45 4e   X'9999' REFEREN
10820 43 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54 45  CES pA ON UPDATE
10830 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 0a   SET DEFAULT);..
10840 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10850 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c  pA(rowid, x) VAL
10860 55 45 53 28 31 2c 20 58 27 30 30 30 30 27 29 3b  UES(1, X'0000');
10870 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10880 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41   pA(rowid, x) VA
10890 4c 55 45 53 28 32 2c 20 58 27 39 39 39 39 27 29  LUES(2, X'9999')
108a0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
108b0 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56  O pA(rowid, x) V
108c0 41 4c 55 45 53 28 33 2c 20 58 27 41 42 43 44 27  ALUES(3, X'ABCD'
108d0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
108e0 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20  TO pA(rowid, x) 
108f0 56 41 4c 55 45 53 28 34 2c 20 58 27 31 32 33 34  VALUES(4, X'1234
10900 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  ');..    INSERT 
10910 49 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28 58  INTO cA VALUES(X
10920 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53  'ABCD');.    INS
10930 45 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c 55  ERT INTO cB VALU
10940 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20 7d  ES(X'1234');.  }
10950 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
10960 66 6b 65 79 2d 34 35 2e 32 20 7b 0a 20 20 65 78  fkey-45.2 {.  ex
10970 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
10980 54 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52 45  TE FROM pA WHERE
10990 20 72 6f 77 69 64 20 3d 20 33 3b 0a 20 20 20 20   rowid = 3;.    
109a0 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
109b0 46 52 4f 4d 20 70 41 20 4f 52 44 45 52 20 42 59  FROM pA ORDER BY
109c0 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b 58   rowid;.  }.} {X
109d0 27 30 30 30 30 27 20 58 27 39 39 39 39 27 20 58  '0000' X'9999' X
109e0 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73 74 20  '1234'}.do_test 
109f0 65 5f 66 6b 65 79 2d 34 35 2e 33 20 7b 0a 20 20  e_fkey-45.3 {.  
10a00 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10a10 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63   quote(c) FROM c
10a20 41 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27 7d 0a  A }.} {X'0000'}.
10a30 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10a40 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.4 {.  execsql 
10a50 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 41 20  {.    UPDATE pA 
10a60 53 45 54 20 78 20 3d 20 58 27 38 37 36 35 27 20  SET x = X'8765' 
10a70 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 34 3b  WHERE rowid = 4;
10a80 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74  .    SELECT quot
10a90 65 28 78 29 20 46 52 4f 4d 20 70 41 20 4f 52 44  e(x) FROM pA ORD
10aa0 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d  ER BY rowid;.  }
10ab0 0a 7d 20 7b 58 27 30 30 30 30 27 20 58 27 39 39  .} {X'0000' X'99
10ac0 39 39 27 20 58 27 38 37 36 35 27 7d 0a 64 6f 5f  99' X'8765'}.do_
10ad0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 35  test e_fkey-45.5
10ae0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
10af0 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46  ELECT quote(c) F
10b00 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 58 27 39 39  ROM cB }.} {X'99
10b10 39 39 27 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  99'}..#---------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 0a 23 20 54 65 73 74 20 4f 4e 20 44 45 4c 45 54  .# Test ON DELET
10b70 45 20 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e  E CASCADE action
10b80 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
10b90 4f 46 3a 20 52 2d 36 31 33 37 36 2d 35 37 32 36  OF: R-61376-5726
10ba0 37 20 41 20 22 43 41 53 43 41 44 45 22 20 61 63  7 A "CASCADE" ac
10bb0 74 69 6f 6e 20 70 72 6f 70 61 67 61 74 65 73 20  tion propagates 
10bc0 74 68 65 20 64 65 6c 65 74 65 20 6f 72 0a 23 20  the delete or.# 
10bd0 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e  update operation
10be0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b   on the parent k
10bf0 65 79 20 74 6f 20 65 61 63 68 20 64 65 70 65 6e  ey to each depen
10c00 64 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a  dent child key..
10c10 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
10c20 20 52 2d 36 31 38 30 39 2d 36 32 32 30 37 20 46   R-61809-62207 F
10c30 6f 72 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45  or an "ON DELETE
10c40 20 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e   CASCADE" action
10c50 2c 20 74 68 69 73 0a 23 20 6d 65 61 6e 73 20 74  , this.# means t
10c60 68 61 74 20 65 61 63 68 20 72 6f 77 20 69 6e 20  hat each row in 
10c70 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
10c80 74 68 61 74 20 77 61 73 20 61 73 73 6f 63 69 61  that was associa
10c90 74 65 64 20 77 69 74 68 20 74 68 65 0a 23 20 64  ted with the.# d
10ca0 65 6c 65 74 65 64 20 70 61 72 65 6e 74 20 72 6f  eleted parent ro
10cb0 77 20 69 73 20 61 6c 73 6f 20 64 65 6c 65 74 65  w is also delete
10cc0 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
10cd0 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
10ce0 6b 65 79 2d 34 36 2e 31 20 7b 0a 20 20 65 78 65  key-46.1 {.  exe
10cf0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
10d00 45 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 20  E TABLE p1(a, b 
10d10 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45  UNIQUE);.    CRE
10d20 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 20 52  ATE TABLE c1(c R
10d30 45 46 45 52 45 4e 43 45 53 20 70 31 28 62 29 20  EFERENCES p1(b) 
10d40 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44  ON DELETE CASCAD
10d50 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e 53 45 52  E, d);.    INSER
10d60 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53  T INTO p1 VALUES
10d70 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20  (NULL, NULL);.  
10d80 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
10d90 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
10da0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
10db0 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a  1 VALUES(5, 5);.
10dc0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10dd0 63 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  c1 VALUES(NULL, 
10de0 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52  NULL);.    INSER
10df0 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
10e00 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45  (4, 4);.    INSE
10e10 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
10e20 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 53 45 4c  S(5, 5);.    SEL
10e30 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
10e40 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a  M c1;.  }.} {3}.
10e50 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10e60 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
10e70 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
10e80 4d 20 70 31 20 57 48 45 52 45 20 61 20 3d 20 34  M p1 WHERE a = 4
10e90 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20  ;.    SELECT d, 
10ea0 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  c FROM c1;.  }.}
10eb0 20 7b 7b 7d 20 7b 7d 20 35 20 35 7d 0a 64 6f 5f   {{} {} 5 5}.do_
10ec0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 33  test e_fkey-46.3
10ed0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10ee0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
10ef0 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c  1;.    SELECT d,
10f00 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   c FROM c1;.  }.
10f10 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  } {{} {}}.do_tes
10f20 74 20 65 5f 66 6b 65 79 2d 34 36 2e 34 20 7b 0a  t e_fkey-46.4 {.
10f30 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
10f40 43 54 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d  CT * FROM p1 }.}
10f50 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}...#---------
10f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 0a 23 20 54 65 73 74 20 4f 4e 20 55 50 44 41 54  .# Test ON UPDAT
10fb0 45 20 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e  E CASCADE action
10fc0 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
10fd0 4f 46 3a 20 52 2d 31 33 38 37 37 2d 36 34 35 34  OF: R-13877-6454
10fe0 32 20 46 6f 72 20 61 6e 20 22 4f 4e 20 55 50 44  2 For an "ON UPD
10ff0 41 54 45 20 43 41 53 43 41 44 45 22 20 61 63 74  ATE CASCADE" act
11000 69 6f 6e 2c 20 69 74 20 6d 65 61 6e 73 0a 23 20  ion, it means.# 
11010 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
11020 73 74 6f 72 65 64 20 69 6e 20 65 61 63 68 20 64  stored in each d
11030 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b  ependent child k
11040 65 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  ey are modified 
11050 74 6f 0a 23 20 6d 61 74 63 68 20 74 68 65 20 6e  to.# match the n
11060 65 77 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61  ew parent key va
11070 6c 75 65 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  lues..#.# EVIDEN
11080 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37 36 2d 35  CE-OF: R-61376-5
11090 37 32 36 37 20 41 20 22 43 41 53 43 41 44 45 22  7267 A "CASCADE"
110a0 20 61 63 74 69 6f 6e 20 70 72 6f 70 61 67 61 74   action propagat
110b0 65 73 20 74 68 65 20 64 65 6c 65 74 65 20 6f 72  es the delete or
110c0 0a 23 20 75 70 64 61 74 65 20 6f 70 65 72 61 74  .# update operat
110d0 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ion on the paren
110e0 74 20 6b 65 79 20 74 6f 20 65 61 63 68 20 64 65  t key to each de
110f0 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65  pendent child ke
11100 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  y..#.drop_all_ta
11110 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
11120 6b 65 79 2d 34 37 2e 31 20 7b 0a 20 20 65 78 65  key-47.1 {.  exe
11130 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
11140 45 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 20  E TABLE p1(a, b 
11150 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45  UNIQUE);.    CRE
11160 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 20 52  ATE TABLE c1(c R
11170 45 46 45 52 45 4e 43 45 53 20 70 31 28 62 29 20  EFERENCES p1(b) 
11180 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
11190 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e 53 45 52  E, d);.    INSER
111a0 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53  T INTO p1 VALUES
111b0 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20  (NULL, NULL);.  
111c0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
111d0 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
111e0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
111f0 31 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a  1 VALUES(5, 5);.
11200 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11210 63 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  c1 VALUES(NULL, 
11220 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52  NULL);.    INSER
11230 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
11240 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45  (4, 4);.    INSE
11250 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
11260 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 53 45 4c  S(5, 5);.    SEL
11270 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
11280 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a  M c1;.  }.} {3}.
11290 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
112a0 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
112b0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 31 20  {.    UPDATE p1 
112c0 53 45 54 20 62 20 3d 20 31 30 20 57 48 45 52 45  SET b = 10 WHERE
112d0 20 62 20 3d 20 35 3b 0a 20 20 20 20 53 45 4c 45   b = 5;.    SELE
112e0 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b  CT d, c FROM c1;
112f0 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20  .  }.} {{} {} 4 
11300 34 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20  4 5 10}.do_test 
11310 65 5f 66 6b 65 79 2d 34 37 2e 33 20 7b 0a 20 20  e_fkey-47.3 {.  
11320 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
11330 44 41 54 45 20 70 31 20 53 45 54 20 62 20 3d 20  DATE p1 SET b = 
11340 31 31 20 57 48 45 52 45 20 62 20 3d 20 34 3b 0a  11 WHERE b = 4;.
11350 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20      SELECT d, c 
11360 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
11370 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20 31 30 7d  {} {} 4 11 5 10}
11380 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11390 34 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  47.4 {.  execsql
113a0 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 70   { .    UPDATE p
113b0 31 20 53 45 54 20 62 20 3d 20 36 20 57 48 45 52  1 SET b = 6 WHER
113c0 45 20 62 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20  E b IS NULL;.   
113d0 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
113e0 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  M c1;.  }.} {{} 
113f0 7b 7d 20 34 20 31 31 20 35 20 31 30 7d 0a 64 6f  {} 4 11 5 10}.do
11400 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e  _test e_fkey-46.
11410 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
11420 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 31  SELECT * FROM p1
11430 20 7d 0a 7d 20 7b 7b 7d 20 36 20 34 20 31 31 20   }.} {{} 6 4 11 
11440 35 20 31 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  5 10}..#--------
11450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11490 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
114a0 20 52 2d 36 35 30 35 38 2d 35 37 31 35 38 0a 23   R-65058-57158.#
114b0 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70  .# Test an examp
114c0 6c 65 20 66 72 6f 6d 20 74 68 65 20 22 4f 4e 20  le from the "ON 
114d0 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50  DELETE and ON UP
114e0 44 41 54 45 20 41 63 74 69 6f 6e 73 22 20 73 65  DATE Actions" se
114f0 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66 6f 72 65  ction .# of fore
11500 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a  ignkeys.html..#.
11510 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
11520 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
11530 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
11540 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
11550 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20  LE artist(.     
11560 20 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54   artistid    INT
11570 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11580 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e  , .      artistn
11590 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b  ame  TEXT.    );
115a0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
115b0 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74  E track(.      t
115c0 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47  rackid     INTEG
115d0 45 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e  ER,.      trackn
115e0 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20  ame   TEXT, .   
115f0 20 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49     trackartist I
11600 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45  NTEGER REFERENCE
11610 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
11620 64 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  d) ON UPDATE CAS
11630 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20  CADE.    );..   
11640 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74   INSERT INTO art
11650 69 73 74 20 56 41 4c 55 45 53 28 31 2c 20 27 44  ist VALUES(1, 'D
11660 65 61 6e 20 4d 61 72 74 69 6e 27 29 3b 0a 20 20  ean Martin');.  
11670 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72    INSERT INTO ar
11680 74 69 73 74 20 56 41 4c 55 45 53 28 32 2c 20 27  tist VALUES(2, '
11690 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 29 3b  Frank Sinatra');
116a0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
116b0 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 31   track VALUES(11
116c0 2c 20 27 54 68 61 74 27 27 73 20 41 6d 6f 72 65  , 'That''s Amore
116d0 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 1);.    INSER
116e0 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
116f0 55 45 53 28 31 32 2c 20 27 43 68 72 69 73 74 6d  UES(12, 'Christm
11700 61 73 20 42 6c 75 65 73 27 2c 20 31 29 3b 0a 20  as Blues', 1);. 
11710 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11720 72 61 63 6b 20 56 41 4c 55 45 53 28 31 33 2c 20  rack VALUES(13, 
11730 27 4d 79 20 57 61 79 27 2c 20 32 29 3b 0a 20 20  'My Way', 2);.  
11740 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
11750 5f 66 6b 65 79 2d 34 38 2e 32 20 7b 0a 20 20 65  _fkey-48.2 {.  e
11760 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
11770 41 54 45 20 61 72 74 69 73 74 20 53 45 54 20 61  ATE artist SET a
11780 72 74 69 73 74 69 64 20 3d 20 31 30 30 20 57 48  rtistid = 100 WH
11790 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d  ERE artistname =
117a0 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b 0a   'Dean Martin';.
117b0 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
117c0 20 65 5f 66 6b 65 79 2d 34 38 2e 33 20 7b 0a 20   e_fkey-48.3 {. 
117d0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
117e0 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20  T * FROM artist 
117f0 7d 0a 7d 20 7b 32 20 7b 46 72 61 6e 6b 20 53 69  }.} {2 {Frank Si
11800 6e 61 74 72 61 7d 20 31 30 30 20 7b 44 65 61 6e  natra} 100 {Dean
11810 20 4d 61 72 74 69 6e 7d 7d 0a 64 6f 5f 74 65 73   Martin}}.do_tes
11820 74 20 65 5f 66 6b 65 79 2d 34 38 2e 34 20 7b 0a  t e_fkey-48.4 {.
11830 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
11840 43 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b 20  CT * FROM track 
11850 7d 0a 7d 20 7b 31 31 20 7b 54 68 61 74 27 73 20  }.} {11 {That's 
11860 41 6d 6f 72 65 7d 20 31 30 30 20 31 32 20 7b 43  Amore} 100 12 {C
11870 68 72 69 73 74 6d 61 73 20 42 6c 75 65 73 7d 20  hristmas Blues} 
11880 31 30 30 20 31 33 20 7b 4d 79 20 57 61 79 7d 20  100 13 {My Way} 
11890 32 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  2}...#----------
118a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
118e0 23 20 56 65 72 69 66 79 20 74 68 61 74 20 61 64  # Verify that ad
118f0 64 69 6e 67 20 61 6e 20 46 4b 20 61 63 74 69 6f  ding an FK actio
11900 6e 20 64 6f 65 73 20 6e 6f 74 20 61 62 73 6f 6c  n does not absol
11910 76 65 20 74 68 65 20 75 73 65 72 20 6f 66 20 74  ve the user of t
11920 68 65 20 0a 23 20 72 65 71 75 69 72 65 6d 65 6e  he .# requiremen
11930 74 20 6e 6f 74 20 74 6f 20 76 69 6f 6c 61 74 65  t not to violate
11940 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
11950 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23   constraint..#.#
11960 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11970 35 33 39 36 38 2d 35 31 36 34 32 20 43 6f 6e 66  53968-51642 Conf
11980 69 67 75 72 69 6e 67 20 61 6e 20 4f 4e 20 55 50  iguring an ON UP
11990 44 41 54 45 20 6f 72 20 4f 4e 20 44 45 4c 45 54  DATE or ON DELET
119a0 45 0a 23 20 61 63 74 69 6f 6e 20 64 6f 65 73 20  E.# action does 
119b0 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68  not mean that th
119c0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
119d0 6e 73 74 72 61 69 6e 74 20 64 6f 65 73 20 6e 6f  nstraint does no
119e0 74 20 6e 65 65 64 20 74 6f 0a 23 20 62 65 20 73  t need to.# be s
119f0 61 74 69 73 66 69 65 64 2e 0a 23 0a 64 72 6f 70  atisfied..#.drop
11a00 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
11a10 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 31 20  est e_fkey-49.1 
11a20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11a30 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
11a40 61 72 65 6e 74 28 61 20 43 4f 4c 4c 41 54 45 20  arent(a COLLATE 
11a50 6e 6f 63 61 73 65 2c 20 62 2c 20 63 2c 20 50 52  nocase, b, c, PR
11a60 49 4d 41 52 59 20 4b 45 59 28 63 2c 20 61 29 29  IMARY KEY(c, a))
11a70 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
11a80 4c 45 20 63 68 69 6c 64 28 64 20 44 45 46 41 55  LE child(d DEFAU
11a90 4c 54 20 27 61 27 2c 20 65 2c 20 66 20 44 45 46  LT 'a', e, f DEF
11aa0 41 55 4c 54 20 27 63 27 2c 0a 20 20 20 20 20 20  AULT 'c',.      
11ab0 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 2c 20 64  FOREIGN KEY(f, d
11ac0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
11ad0 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
11ae0 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b  T DEFAULT.    );
11af0 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
11b00 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
11b10 27 41 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a  'A', 'b', 'c');.
11b20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11b30 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 4f  parent VALUES('O
11b40 4e 45 27 2c 20 27 74 77 6f 27 2c 20 27 74 68 72  NE', 'two', 'thr
11b50 65 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ee');.    INSERT
11b60 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55   INTO child VALU
11b70 45 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27 2c  ES('one', 'two',
11b80 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a 7d   'three');.  }.}
11b90 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
11ba0 65 79 2d 34 39 2e 32 20 7b 0a 20 20 65 78 65 63  ey-49.2 {.  exec
11bb0 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
11bc0 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 70 61  .      UPDATE pa
11bd0 72 65 6e 74 20 53 45 54 20 61 20 3d 20 27 27 20  rent SET a = '' 
11be0 57 48 45 52 45 20 61 20 3d 20 27 6f 4e 65 27 3b  WHERE a = 'oNe';
11bf0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
11c00 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a  FROM child;.  }.
11c10 7d 20 7b 61 20 74 77 6f 20 63 7d 0a 64 6f 5f 74  } {a two c}.do_t
11c20 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 33 20  est e_fkey-49.3 
11c30 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11c40 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
11c50 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
11c60 6e 74 20 57 48 45 52 45 20 61 20 3d 20 27 41 27  nt WHERE a = 'A'
11c70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
11c80 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20 7d 0a  ROM parent;.  }.
11c90 7d 20 7b 4f 4e 45 20 74 77 6f 20 74 68 72 65 65  } {ONE two three
11ca0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
11cb0 2d 34 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -49.4 {.  catchs
11cc0 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65  ql { UPDATE pare
11cd0 6e 74 20 53 45 54 20 61 20 3d 20 27 27 20 57 48  nt SET a = '' WH
11ce0 45 52 45 20 61 20 3d 20 27 6f 4e 65 27 20 7d 0a  ERE a = 'oNe' }.
11cf0 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
11d00 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
11d10 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  led}}...#-------
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
11d70 3a 20 52 2d 31 31 38 35 36 2d 31 39 38 33 36 0a  : R-11856-19836.
11d80 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d  #.# Test an exam
11d90 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 22 4f 4e  ple from the "ON
11da0 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
11db0 50 44 41 54 45 20 41 63 74 69 6f 6e 73 22 20 73  PDATE Actions" s
11dc0 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66 6f 72  ection .# of for
11dd0 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 54  eignkeys.html. T
11de0 68 69 73 20 65 78 61 6d 70 6c 65 20 73 68 6f 77  his example show
11df0 73 20 74 68 61 74 20 61 64 64 69 6e 67 20 61 6e  s that adding an
11e00 20 22 4f 4e 20 44 45 4c 45 54 45 20 44 45 46 41   "ON DELETE DEFA
11e10 55 4c 54 22 0a 23 20 63 6c 61 75 73 65 20 64 6f  ULT".# clause do
11e20 65 73 20 6e 6f 74 20 61 62 72 6f 67 61 74 65 20  es not abrogate 
11e30 74 68 65 20 6e 65 65 64 20 74 6f 20 73 61 74 69  the need to sati
11e40 73 66 79 20 74 68 65 20 66 6f 72 65 69 67 6e 20  sfy the foreign 
11e50 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23  key constraint.#
11e60 20 28 52 2d 32 38 32 32 30 2d 34 36 36 39 34 29   (R-28220-46694)
11e70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
11e80 46 3a 20 52 2d 32 38 32 32 30 2d 34 36 36 39 34  F: R-28220-46694
11e90 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
11ea0 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20 53   an "ON DELETE S
11eb0 45 54 20 44 45 46 41 55 4c 54 22 0a 23 20 61 63  ET DEFAULT".# ac
11ec0 74 69 6f 6e 20 69 73 20 63 6f 6e 66 69 67 75 72  tion is configur
11ed0 65 64 2c 20 62 75 74 20 74 68 65 72 65 20 69 73  ed, but there is
11ee0 20 6e 6f 20 72 6f 77 20 69 6e 20 74 68 65 20 70   no row in the p
11ef0 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  arent table that
11f00 0a 23 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  .# corresponds t
11f10 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  o the default va
11f20 6c 75 65 73 20 6f 66 20 74 68 65 20 63 68 69 6c  lues of the chil
11f30 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 64  d key columns, d
11f40 65 6c 65 74 69 6e 67 20 61 0a 23 20 70 61 72 65  eleting a.# pare
11f50 6e 74 20 6b 65 79 20 77 68 69 6c 65 20 64 65 70  nt key while dep
11f60 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65 79  endent child key
11f70 73 20 65 78 69 73 74 20 73 74 69 6c 6c 20 63 61  s exist still ca
11f80 75 73 65 73 20 61 20 66 6f 72 65 69 67 6e 20 6b  uses a foreign k
11f90 65 79 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  ey.# violation..
11fa0 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
11fb0 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
11fc0 2d 35 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -50.1 {.  execsq
11fd0 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
11fe0 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20  ABLE artist(.   
11ff0 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20 49     artistid    I
12000 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
12010 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73  EY, .      artis
12020 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20  tname  TEXT.    
12030 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
12040 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20  BLE track(.     
12050 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54   trackid     INT
12060 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61 63  EGER,.      trac
12070 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20  kname   TEXT, . 
12080 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73 74       trackartist
12090 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54   INTEGER DEFAULT
120a0 20 30 20 52 45 46 45 52 45 4e 43 45 53 20 61 72   0 REFERENCES ar
120b0 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20 4f  tist(artistid) O
120c0 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46  N DELETE SET DEF
120d0 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  AULT.    );.    
120e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
120f0 73 74 20 56 41 4c 55 45 53 28 33 2c 20 27 53 61  st VALUES(3, 'Sa
12100 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 29 3b  mmy Davis Jr.');
12110 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12120 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34   track VALUES(14
12130 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73  , 'Mr. Bojangles
12140 27 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ', 3);.  }.} {}.
12150 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12160 30 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  0.2 {.  catchsql
12170 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61   { DELETE FROM a
12180 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
12190 73 74 6e 61 6d 65 20 3d 20 27 53 61 6d 6d 79 20  stname = 'Sammy 
121a0 44 61 76 69 73 20 4a 72 2e 27 20 7d 0a 7d 20 7b  Davis Jr.' }.} {
121b0 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
121c0 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
121d0 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
121e0 79 2d 35 30 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-50.3 {.  execs
121f0 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
12200 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
12210 45 53 28 30 2c 20 27 55 6e 6b 6e 6f 77 6e 20 41  ES(0, 'Unknown A
12220 72 74 69 73 74 27 29 3b 0a 20 20 20 20 44 45 4c  rtist');.    DEL
12230 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
12240 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65  WHERE artistname
12250 20 3d 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20   = 'Sammy Davis 
12260 4a 72 2e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  Jr.';.  }.} {}.d
12270 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30  o_test e_fkey-50
12280 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
12290 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
122a0 72 74 69 73 74 20 7d 0a 7d 20 7b 30 20 7b 55 6e  rtist }.} {0 {Un
122b0 6b 6e 6f 77 6e 20 41 72 74 69 73 74 7d 7d 0a 64  known Artist}}.d
122c0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30  o_test e_fkey-50
122d0 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
122e0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
122f0 72 61 63 6b 20 7d 0a 7d 20 7b 31 34 20 7b 4d 72  rack }.} {14 {Mr
12300 2e 20 42 6f 6a 61 6e 67 6c 65 73 7d 20 30 7d 0a  . Bojangles} 0}.
12310 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
12320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
12360 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 35  IDENCE-OF: R-095
12370 36 34 2d 32 32 31 37 30 0a 23 0a 23 20 43 68 65  64-22170.#.# Che
12380 63 6b 20 74 68 61 74 20 74 68 65 20 6f 72 64 65  ck that the orde
12390 72 20 6f 66 20 73 74 65 70 73 20 69 6e 20 61 6e  r of steps in an
123a0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
123b0 45 20 6f 6e 20 61 20 70 61 72 65 6e 74 20 0a 23  E on a parent .#
123c0 20 74 61 62 6c 65 20 69 73 20 61 73 20 66 6f 6c   table is as fol
123d0 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 31 2e 20 45  lows:.#.#   1. E
123e0 78 65 63 75 74 65 20 61 70 70 6c 69 63 61 62 6c  xecute applicabl
123f0 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
12400 20 70 72 6f 67 72 61 6d 73 2c 0a 23 20 20 20 32   programs,.#   2
12410 2e 20 43 68 65 63 6b 20 6c 6f 63 61 6c 20 28 6e  . Check local (n
12420 6f 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 29 20  on foreign key) 
12430 63 6f 6e 73 74 72 61 69 6e 74 73 2c 0a 23 20 20  constraints,.#  
12440 20 33 2e 20 55 70 64 61 74 65 20 6f 72 20 64 65   3. Update or de
12450 6c 65 74 65 20 74 68 65 20 72 6f 77 20 69 6e 20  lete the row in 
12460 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
12470 2c 0a 23 20 20 20 34 2e 20 50 65 72 66 6f 72 6d  ,.#   4. Perform
12480 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 66 6f   any required fo
12490 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
124a0 73 2c 0a 23 20 20 20 35 2e 20 45 78 65 63 75 74  s,.#   5. Execut
124b0 65 20 61 70 70 6c 69 63 61 62 6c 65 20 41 46 54  e applicable AFT
124c0 45 52 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ER trigger progr
124d0 61 6d 73 2e 20 0a 23 0a 64 72 6f 70 5f 61 6c 6c  ams. .#.drop_all
124e0 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
124f0 65 5f 66 6b 65 79 2d 35 31 2e 31 20 7b 0a 20 20  e_fkey-51.1 {.  
12500 70 72 6f 63 20 6d 61 78 70 61 72 65 6e 74 20 7b  proc maxparent {
12510 61 72 67 73 7d 20 7b 20 64 62 20 6f 6e 65 20 7b  args} { db one {
12520 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
12530 4f 4d 20 70 61 72 65 6e 74 7d 20 7d 0a 20 20 64  OM parent} }.  d
12540 62 20 66 75 6e 63 20 6d 61 78 70 61 72 65 6e 74  b func maxparent
12550 20 6d 61 78 70 61 72 65 6e 74 0a 0a 20 20 65 78   maxparent..  ex
12560 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
12570 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
12580 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
12590 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
125a0 47 45 52 20 62 75 20 42 45 46 4f 52 45 20 55 50  GER bu BEFORE UP
125b0 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42  DATE ON parent B
125c0 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
125d0 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
125e0 4c 55 45 53 28 6e 65 77 2e 78 2d 6f 6c 64 2e 78  LUES(new.x-old.x
125f0 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
12600 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
12610 6c 64 28 0a 20 20 20 20 20 20 61 20 44 45 46 41  ld(.      a DEFA
12620 55 4c 54 20 28 6d 61 78 70 61 72 65 6e 74 28 29  ULT (maxparent()
12630 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
12640 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
12650 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b  T DEFAULT.    );
12660 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
12670 47 45 52 20 61 75 20 41 46 54 45 52 20 55 50 44  GER au AFTER UPD
12680 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45  ATE ON parent BE
12690 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
126a0 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
126b0 55 45 53 28 6e 65 77 2e 78 2b 6f 6c 64 2e 78 29  UES(new.x+old.x)
126c0 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20  ;.    END;..    
126d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
126e0 6e 74 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  nt VALUES(1);.  
126f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
12700 69 6c 64 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  ild VALUES(1);. 
12710 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
12720 65 5f 66 6b 65 79 2d 35 31 2e 32 20 7b 0a 20 20  e_fkey-51.2 {.  
12730 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
12740 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
12750 78 20 3d 20 32 32 3b 0a 20 20 20 20 53 45 4c 45  x = 22;.    SELE
12760 43 54 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74  CT * FROM parent
12770 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b   ORDER BY rowid;
12780 20 53 45 4c 45 43 54 20 27 78 78 78 27 20 3b 20   SELECT 'xxx' ; 
12790 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 63 68  SELECT a FROM ch
127a0 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32 32 20 32  ild;.  }.} {22 2
127b0 31 20 32 33 20 78 78 78 20 32 32 7d 0a 64 6f 5f  1 23 xxx 22}.do_
127c0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 33  test e_fkey-51.3
127d0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
127e0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
127f0 68 69 6c 64 3b 0a 20 20 20 20 44 45 4c 45 54 45  hild;.    DELETE
12800 20 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20   FROM parent;.  
12810 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
12820 72 65 6e 74 20 56 41 4c 55 45 53 28 2d 31 29 3b  rent VALUES(-1);
12830 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12840 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 2d 31   child VALUES(-1
12850 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61  );.    UPDATE pa
12860 72 65 6e 74 20 53 45 54 20 78 20 3d 20 32 32 3b  rent SET x = 22;
12870 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
12880 4f 4d 20 70 61 72 65 6e 74 20 4f 52 44 45 52 20  OM parent ORDER 
12890 42 59 20 72 6f 77 69 64 3b 20 53 45 4c 45 43 54  BY rowid; SELECT
128a0 20 27 78 78 78 27 20 3b 20 53 45 4c 45 43 54 20   'xxx' ; SELECT 
128b0 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20  a FROM child;.  
128c0 7d 0a 7d 20 7b 32 32 20 32 33 20 32 31 20 78 78  }.} {22 23 21 xx
128d0 78 20 32 33 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  x 23}...#-------
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12920 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  --.# Verify that
12930 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
12940 6e 73 20 6f 6e 6c 79 20 61 63 74 75 61 6c 6c 79  ns only actually
12950 20 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20 74   take place if t
12960 68 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20  he parent key.# 
12970 69 73 20 73 65 74 20 74 6f 20 61 20 6e 65 77 20  is set to a new 
12980 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 64 69  value that is di
12990 73 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20  stinct from the 
129a0 6f 6c 64 20 76 61 6c 75 65 2e 20 54 68 65 20 64  old value. The d
129b0 65 66 61 75 6c 74 0a 23 20 63 6f 6c 6c 61 74 69  efault.# collati
129c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 6e 64 20  on sequence and 
129d0 61 66 66 69 6e 69 74 79 20 61 72 65 20 75 73 65  affinity are use
129e0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
129f0 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 0a  f the new value.
12a00 23 20 69 73 20 27 64 69 73 74 69 6e 63 74 27 20  # is 'distinct' 
12a10 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20 6f 72 20  from the old or 
12a20 6e 6f 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  not..#.# EVIDENC
12a30 45 2d 4f 46 3a 20 52 2d 32 37 33 38 33 2d 31 30  E-OF: R-27383-10
12a40 32 34 36 20 41 6e 20 4f 4e 20 55 50 44 41 54 45  246 An ON UPDATE
12a50 20 61 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20   action is only 
12a60 74 61 6b 65 6e 20 69 66 20 74 68 65 0a 23 20 76  taken if the.# v
12a70 61 6c 75 65 73 20 6f 66 20 74 68 65 20 70 61 72  alues of the par
12a80 65 6e 74 20 6b 65 79 20 61 72 65 20 6d 6f 64 69  ent key are modi
12a90 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
12aa0 20 6e 65 77 20 70 61 72 65 6e 74 20 6b 65 79 0a   new parent key.
12ab0 23 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  # values are not
12ac0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6c   equal to the ol
12ad0 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
12ae0 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
12af0 6b 65 79 2d 35 32 2e 31 20 7b 0a 20 20 65 78 65  key-52.1 {.  exe
12b00 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
12b10 45 20 54 41 42 4c 45 20 7a 65 75 73 28 61 20 49  E TABLE zeus(a I
12b20 4e 54 45 47 45 52 20 43 4f 4c 4c 41 54 45 20 4e  NTEGER COLLATE N
12b30 4f 43 41 53 45 2c 20 62 2c 20 50 52 49 4d 41 52  OCASE, b, PRIMAR
12b40 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20  Y KEY(a, b));.  
12b50 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
12b60 70 6f 6c 6c 6f 28 63 2c 20 64 2c 20 0a 20 20 20  pollo(c, d, .   
12b70 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63     FOREIGN KEY(c
12b80 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
12b90 7a 65 75 73 20 4f 4e 20 55 50 44 41 54 45 20 43  zeus ON UPDATE C
12ba0 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20 20  ASCADE.    );.  
12bb0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 65    INSERT INTO ze
12bc0 75 73 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c  us VALUES('abc',
12bd0 20 27 78 79 7a 27 29 3b 0a 20 20 20 20 49 4e 53   'xyz');.    INS
12be0 45 52 54 20 49 4e 54 4f 20 61 70 6f 6c 6c 6f 20  ERT INTO apollo 
12bf0 56 41 4c 55 45 53 28 27 41 42 43 27 2c 20 27 78  VALUES('ABC', 'x
12c00 79 7a 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63  yz');.  }.  exec
12c10 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12c20 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20 27 61   zeus SET a = 'a
12c30 42 63 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  Bc';.    SELECT 
12c40 2a 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20  * FROM apollo;. 
12c50 20 7d 0a 7d 20 7b 41 42 43 20 78 79 7a 7d 0a 64   }.} {ABC xyz}.d
12c60 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32  o_test e_fkey-52
12c70 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
12c80 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73  .    UPDATE zeus
12c90 20 53 45 54 20 61 20 3d 20 31 2c 20 62 20 3d 20   SET a = 1, b = 
12ca0 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
12cb0 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d  FROM apollo;.  }
12cc0 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {1 1}.do_test
12cd0 20 65 5f 66 6b 65 79 2d 35 32 2e 33 20 7b 0a 20   e_fkey-52.3 {. 
12ce0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
12cf0 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 61  PDATE zeus SET a
12d00 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20   = 1, b = 1;.   
12d10 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63   SELECT typeof(c
12d20 29 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c  ), c, typeof(d),
12d30 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a   d FROM apollo;.
12d40 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31    }.} {integer 1
12d50 20 69 6e 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74   integer 1}.do_t
12d60 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 34 20  est e_fkey-52.4 
12d70 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12d80 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45    UPDATE zeus SE
12d90 54 20 61 20 3d 20 27 31 27 3b 0a 20 20 20 20 53  T a = '1';.    S
12da0 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c  ELECT typeof(c),
12db0 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20 64   c, typeof(d), d
12dc0 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20   FROM apollo;.  
12dd0 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20 69  }.} {integer 1 i
12de0 6e 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73  nteger 1}.do_tes
12df0 74 20 65 5f 66 6b 65 79 2d 35 32 2e 35 20 7b 0a  t e_fkey-52.5 {.
12e00 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12e10 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20  UPDATE zeus SET 
12e20 62 20 3d 20 27 31 27 3b 0a 20 20 20 20 53 45 4c  b = '1';.    SEL
12e30 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63  ECT typeof(c), c
12e40 2c 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46  , typeof(d), d F
12e50 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a  ROM apollo;.  }.
12e60 7d 20 7b 69 6e 74 65 67 65 72 20 31 20 74 65 78  } {integer 1 tex
12e70 74 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  t 1}.do_test e_f
12e80 6b 65 79 2d 35 32 2e 36 20 7b 0a 20 20 65 78 65  key-52.6 {.  exe
12e90 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12ea0 45 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 4e  E zeus SET b = N
12eb0 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ULL;.    SELECT 
12ec0 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79  typeof(c), c, ty
12ed0 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20  peof(d), d FROM 
12ee0 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69  apollo;.  }.} {i
12ef0 6e 74 65 67 65 72 20 31 20 6e 75 6c 6c 20 7b 7d  nteger 1 null {}
12f00 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12f50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
12f60 35 31 32 39 2d 35 38 31 34 31 0a 23 0a 23 20 54  5129-58141.#.# T
12f70 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66  est an example f
12f80 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45  rom the "ON DELE
12f90 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
12fa0 20 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f   Actions" sectio
12fb0 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b  n .# of foreignk
12fc0 65 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65  eys.html. This e
12fd0 78 61 6d 70 6c 65 20 64 65 6d 6f 6e 73 74 72 61  xample demonstra
12fe0 74 65 73 20 74 68 61 74 20 4f 4e 20 55 50 44 41  tes that ON UPDA
12ff0 54 45 20 61 63 74 69 6f 6e 73 0a 23 20 6f 6e 6c  TE actions.# onl
13000 79 20 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20  y take place if 
13010 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 72  at least one par
13020 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ent key column i
13030 73 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65  s set to a value
13040 20 0a 23 20 74 68 61 74 20 69 73 20 64 69 73 74   .# that is dist
13050 69 6e 63 74 20 66 72 6f 6d 20 69 74 73 20 70 72  inct from its pr
13060 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 0a 23 0a  evious value..#.
13070 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
13080 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
13090 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
130a0 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
130b0 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
130c0 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
130d0 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
130e0 28 79 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (y REFERENCES pa
130f0 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53  rent ON UPDATE S
13100 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  ET NULL);.    IN
13110 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
13120 20 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a   VALUES('key');.
13130 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13140 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6b 65  child VALUES('ke
13150 79 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  y');.  }.} {}.do
13160 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e  _test e_fkey-53.
13170 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
13180 20 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e      UPDATE paren
13190 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79 27 3b  t SET x = 'key';
131a0 0a 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55  .    SELECT IFNU
131b0 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27 29 20 46 52  LL(y, 'null') FR
131c0 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
131d0 7b 6b 65 79 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  {key}.do_test e_
131e0 66 6b 65 79 2d 35 33 2e 33 20 7b 0a 20 20 65 78  fkey-53.3 {.  ex
131f0 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
13200 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20  TE parent SET x 
13210 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45  = 'key2';.    SE
13220 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20 27  LECT IFNULL(y, '
13230 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69 6c  null') FROM chil
13240 64 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a  d;.  }.} {null}.
13250 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
13260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13290 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23  ############.###
132a0 20 53 45 43 54 49 4f 4e 20 35 3a 20 43 52 45 41   SECTION 5: CREA
132b0 54 45 2c 20 41 4c 54 45 52 20 61 6e 64 20 44 52  TE, ALTER and DR
132c0 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
132d0 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
132e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
132f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13310 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
13320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
13370 20 74 68 61 74 20 70 61 72 65 6e 74 20 6b 65 79   that parent key
13380 73 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65  s are not checke
13390 64 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72  d when tables ar
133a0 65 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45  e created..#.# E
133b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
133c0 30 31 38 2d 32 31 37 35 35 20 54 68 65 20 70 61  018-21755 The pa
133d0 72 65 6e 74 20 6b 65 79 20 64 65 66 69 6e 69 74  rent key definit
133e0 69 6f 6e 73 20 6f 66 20 66 6f 72 65 69 67 6e 20  ions of foreign 
133f0 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  key.# constraint
13400 73 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65  s are not checke
13410 64 20 77 68 65 6e 20 61 20 74 61 62 6c 65 20 69  d when a table i
13420 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45  s created..#.# E
13430 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
13440 33 38 34 2d 33 39 33 33 37 20 54 68 65 72 65 20  384-39337 There 
13450 69 73 20 6e 6f 74 68 69 6e 67 20 73 74 6f 70 70  is nothing stopp
13460 69 6e 67 20 74 68 65 20 75 73 65 72 20 66 72 6f  ing the user fro
13470 6d 0a 23 20 63 72 65 61 74 69 6e 67 20 61 20 66  m.# creating a f
13480 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
13490 69 74 69 6f 6e 20 74 68 61 74 20 72 65 66 65 72  ition that refer
134a0 73 20 74 6f 20 61 20 70 61 72 65 6e 74 20 74 61  s to a parent ta
134b0 62 6c 65 20 74 68 61 74 0a 23 20 64 6f 65 73 20  ble that.# does 
134c0 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 74 6f  not exist, or to
134d0 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75   parent key colu
134e0 6d 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  mns that do not 
134f0 65 78 69 73 74 20 6f 72 20 61 72 65 20 6e 6f 74  exist or are not
13500 0a 23 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  .# collectively 
13510 62 6f 75 6e 64 20 62 79 20 61 20 50 52 49 4d 41  bound by a PRIMA
13520 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
13530 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23   constraint..#.#
13540 20 43 68 69 6c 64 20 6b 65 79 73 20 61 72 65 20   Child keys are 
13550 63 68 65 63 6b 65 64 20 74 6f 20 65 6e 73 75 72  checked to ensur
13560 65 20 61 6c 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20  e all component 
13570 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 2e 20 49  columns exist. I
13580 66 20 70 61 72 65 6e 74 0a 23 20 6b 65 79 20 63  f parent.# key c
13590 6f 6c 75 6d 6e 73 20 61 72 65 20 65 78 70 6c 69  olumns are expli
135a0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2c  citly specified,
135b0 20 53 51 4c 69 74 65 20 63 68 65 63 6b 73 20 74   SQLite checks t
135c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72  o make sure ther
135d0 65 0a 23 20 61 72 65 20 74 68 65 20 73 61 6d 65  e.# are the same
135e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
135f0 6e 73 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20  ns in the child 
13600 61 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 73 2e  and parent keys.
13610 20 28 54 4f 44 4f 3a 20 54 68 69 73 0a 23 20 69   (TODO: This.# i
13620 73 20 74 65 73 74 65 64 20 62 75 74 20 64 6f 65  s tested but doe
13630 73 20 6e 6f 74 20 63 6f 72 72 65 73 70 6f 6e 64  s not correspond
13640 20 74 6f 20 61 6e 79 20 74 65 73 74 61 62 6c 65   to any testable
13650 20 73 74 61 74 65 6d 65 6e 74 2e 29 0a 23 0a 23   statement.).#.#
13660 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20   Also test that 
13670 74 68 65 20 61 62 6f 76 65 20 73 74 61 74 65 6d  the above statem
13680 65 6e 74 73 20 61 72 65 20 74 72 75 65 20 72 65  ents are true re
13690 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
136a0 68 65 72 20 6f 72 20 6e 6f 74 0a 23 20 66 6f 72  her or not.# for
136b0 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e  eign keys are en
136c0 61 62 6c 65 64 3a 20 20 22 41 20 43 52 45 41 54  abled:  "A CREAT
136d0 45 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20  E TABLE command 
136e0 6f 70 65 72 61 74 65 73 20 74 68 65 20 73 61 6d  operates the sam
136f0 65 20 77 68 65 74 68 65 72 0a 23 20 6f 72 20 6e  e whether.# or n
13700 6f 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ot foreign key c
13710 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65  onstraints are e
13720 6e 61 62 6c 65 64 2e 22 0a 23 0a 23 20 45 56 49  nabled.".#.# EVI
13730 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 39 30  DENCE-OF: R-0890
13740 38 2d 32 33 34 33 39 20 41 20 43 52 45 41 54 45  8-23439 A CREATE
13750 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f   TABLE command o
13760 70 65 72 61 74 65 73 20 74 68 65 20 73 61 6d 65  perates the same
13770 0a 23 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  .# whether or no
13780 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  t foreign key co
13790 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e  nstraints are en
137a0 61 62 6c 65 64 2e 0a 23 20 0a 66 6f 72 65 61 63  abled..# .foreac
137b0 68 20 7b 74 6e 20 7a 43 72 65 61 74 65 54 62 6c  h {tn zCreateTbl
137c0 20 6c 52 65 73 7d 20 7b 0a 20 20 31 20 22 43 52   lRes} {.  1 "CR
137d0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
137e0 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
137f0 29 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )"              
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30                {0
13810 20 7b 7d 7d 0a 20 20 32 20 22 43 52 45 41 54 45   {}}.  2 "CREATE
13820 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52   TABLE t1(a, b R
13830 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20 20  EFERENCES t2)"  
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d            {0 {}}
13860 0a 20 20 33 20 22 43 52 45 41 54 45 20 54 41 42  .  3 "CREATE TAB
13870 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45  LE t1(a, b, FORE
13880 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46  IGN KEY(a,b) REF
13890 45 52 45 4e 43 45 53 20 74 31 29 22 20 20 20 20  ERENCES t1)"    
138a0 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34        {0 {}}.  4
138b0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
138c0 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  1(a, b, FOREIGN 
138d0 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e  KEY(a,b) REFEREN
138e0 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20  CES t2)"        
138f0 20 20 7b 30 20 7b 7d 7d 0a 20 20 35 20 22 43 52    {0 {}}.  5 "CR
13900 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
13910 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
13920 61 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  a,b) REFERENCES 
13930 74 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30  t2)"          {0
13940 20 7b 7d 7d 0a 20 20 36 20 22 43 52 45 41 54 45   {}}.  6 "CREATE
13950 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
13960 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29  FOREIGN KEY(a,b)
13970 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 28 6e   REFERENCES t2(n
13980 2c 64 29 29 22 20 20 20 20 20 7b 30 20 7b 7d 7d  ,d))"     {0 {}}
13990 0a 20 20 37 20 22 43 52 45 41 54 45 20 54 41 42  .  7 "CREATE TAB
139a0 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45  LE t1(a, b, FORE
139b0 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46  IGN KEY(a,b) REF
139c0 45 52 45 4e 43 45 53 20 74 31 28 61 2c 62 29 29  ERENCES t1(a,b))
139d0 22 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20  "     {0 {}}..  
139e0 41 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  A "CREATE TABLE 
139f0 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  t1(a, b, FOREIGN
13a00 20 4b 45 59 28 63 2c 62 29 20 52 45 46 45 52 45   KEY(c,b) REFERE
13a10 4e 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20  NCES t2)"       
13a20 20 20 20 0a 20 20 20 20 20 7b 31 20 7b 75 6e 6b     .     {1 {unk
13a30 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20  nown column "c" 
13a40 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
13a50 65 66 69 6e 69 74 69 6f 6e 7d 7d 0a 20 20 42 20  efinition}}.  B 
13a60 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13a70 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13a80 45 59 28 63 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(c,b) REFERENC
13a90 45 53 20 74 32 28 64 29 29 22 20 20 20 20 20 20  ES t2(d))"      
13aa0 20 20 20 20 0a 20 20 20 20 20 7b 31 20 7b 6e 75      .     {1 {nu
13ab0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
13ac0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
13ad0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
13ae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
13af0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
13b00 65 6e 63 65 64 20 74 61 62 6c 65 7d 7d 0a 7d 20  enced table}}.} 
13b10 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
13b20 65 79 2d 35 34 2e 24 74 6e 2e 6f 66 66 20 7b 0a  ey-54.$tn.off {.
13b30 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62      drop_all_tab
13b40 6c 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c 20  les.    execsql 
13b50 7b 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  {PRAGMA foreign_
13b60 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 20 20  keys = OFF}.    
13b70 63 61 74 63 68 73 71 6c 20 24 7a 43 72 65 61 74  catchsql $zCreat
13b80 65 54 62 6c 0a 20 20 7d 20 24 6c 52 65 73 0a 20  eTbl.  } $lRes. 
13b90 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
13ba0 35 34 2e 24 74 6e 2e 6f 6e 20 7b 0a 20 20 20 20  54.$tn.on {.    
13bb0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
13bc0 20 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41      execsql {PRA
13bd0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
13be0 20 3d 20 4f 4e 7d 0a 20 20 20 20 63 61 74 63 68   = ON}.    catch
13bf0 73 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a  sql $zCreateTbl.
13c00 20 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d    } $lRes.}..#--
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
13c60 43 45 2d 4f 46 3a 20 52 2d 34 37 39 35 32 2d 36  CE-OF: R-47952-6
13c70 32 34 39 38 20 49 74 20 69 73 20 6e 6f 74 20 70  2498 It is not p
13c80 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74  ossible to use t
13c90 68 65 20 22 41 4c 54 45 52 20 54 41 42 4c 45 0a  he "ALTER TABLE.
13ca0 23 20 2e 2e 2e 20 41 44 44 20 43 4f 4c 55 4d 4e  # ... ADD COLUMN
13cb0 22 20 73 79 6e 74 61 78 20 74 6f 20 61 64 64 20  " syntax to add 
13cc0 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6e  a column that in
13cd0 63 6c 75 64 65 73 20 61 20 52 45 46 45 52 45 4e  cludes a REFEREN
13ce0 43 45 53 0a 23 20 63 6c 61 75 73 65 2c 20 75 6e  CES.# clause, un
13cf0 6c 65 73 73 20 74 68 65 20 64 65 66 61 75 6c 74  less the default
13d00 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65   value of the ne
13d10 77 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  w column is NULL
13d20 2e 20 41 74 74 65 6d 70 74 69 6e 67 0a 23 20 74  . Attempting.# t
13d30 6f 20 64 6f 20 73 6f 20 72 65 74 75 72 6e 73 20  o do so returns 
13d40 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 72 6f 63  an error..#.proc
13d50 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 7b 74   test_efkey_6 {t
13d60 6e 20 7a 41 6c 74 65 72 20 69 73 45 72 72 6f 72  n zAlter isError
13d70 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  } {.  drop_all_t
13d80 61 62 6c 65 73 20 0a 0a 20 20 64 6f 5f 74 65 73  ables ..  do_tes
13d90 74 20 65 5f 66 6b 65 79 2d 35 36 2e 24 74 6e 2e  t e_fkey-56.$tn.
13da0 31 20 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 ".    execsql 
13db0 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
13dc0 62 6c 28 61 2c 20 62 29 20 7d 0a 20 20 20 20 5b  bl(a, b) }.    [
13dd0 6c 69 73 74 20 63 61 74 63 68 73 71 6c 20 24 7a  list catchsql $z
13de0 41 6c 74 65 72 5d 0a 20 20 22 20 5b 6c 69 6e 64  Alter].  " [lind
13df0 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 43  ex {{0 {}} {1 {C
13e00 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45  annot add a REFE
13e10 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69  RENCES column wi
13e20 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61  th non-NULL defa
13e30 75 6c 74 20 76 61 6c 75 65 7d 7d 7d 20 24 69 73  ult value}}} $is
13e40 45 72 72 6f 72 5d 0a 0a 7d 0a 0a 74 65 73 74 5f  Error]..}..test_
13e50 65 66 6b 65 79 5f 36 20 31 20 22 41 4c 54 45 52  efkey_6 1 "ALTER
13e60 20 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43   TABLE tbl ADD C
13e70 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43  OLUMN c REFERENC
13e80 45 53 20 78 78 22 20 30 0a 74 65 73 74 5f 65 66  ES xx" 0.test_ef
13e90 6b 65 79 5f 36 20 32 20 22 41 4c 54 45 52 20 54  key_6 2 "ALTER T
13ea0 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43 4f 4c  ABLE tbl ADD COL
13eb0 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 4e 55  UMN c DEFAULT NU
13ec0 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20 78 78  LL REFERENCES xx
13ed0 22 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  " 0.test_efkey_6
13ee0 20 33 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20   3 "ALTER TABLE 
13ef0 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63  tbl ADD COLUMN c
13f00 20 44 45 46 41 55 4c 54 20 30 20 52 45 46 45 52   DEFAULT 0 REFER
13f10 45 4e 43 45 53 20 78 78 22 20 31 0a 0a 23 2d 2d  ENCES xx" 1..#--
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
13f70 68 61 74 20 41 4c 54 45 52 20 54 41 42 4c 45 20  hat ALTER TABLE 
13f80 61 64 6a 75 73 74 73 20 52 45 46 45 52 45 4e 43  adjusts REFERENC
13f90 45 53 20 63 6c 61 75 73 65 73 20 77 68 65 6e 20  ES clauses when 
13fa0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
13fb0 0a 23 20 69 73 20 52 45 4e 41 4d 45 44 2e 0a 23  .# is RENAMED..#
13fc0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
13fd0 52 2d 34 37 30 38 30 2d 30 32 30 36 39 20 49 66  R-47080-02069 If
13fe0 20 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c 45   an "ALTER TABLE
13ff0 20 2e 2e 2e 20 52 45 4e 41 4d 45 20 54 4f 22 20   ... RENAME TO" 
14000 63 6f 6d 6d 61 6e 64 0a 23 20 69 73 20 75 73 65  command.# is use
14010 64 20 74 6f 20 72 65 6e 61 6d 65 20 61 20 74 61  d to rename a ta
14020 62 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ble that is the 
14030 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  parent table of 
14040 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 23 20 66 6f  one or more.# fo
14050 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14060 61 69 6e 74 73 2c 20 74 68 65 20 64 65 66 69 6e  aints, the defin
14070 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  itions of the fo
14080 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73  reign key.# cons
14090 74 72 61 69 6e 74 73 20 61 72 65 20 6d 6f 64 69  traints are modi
140a0 66 69 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f  fied to refer to
140b0 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
140c0 65 20 62 79 20 69 74 73 20 6e 65 77 20 6e 61 6d  e by its new nam
140d0 65 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20  e.#.# Test that 
140e0 74 68 65 73 65 20 61 64 6a 75 73 74 6d 65 6e 74  these adjustment
140f0 73 20 61 72 65 20 76 69 73 69 62 6c 65 20 69 6e  s are visible in
14100 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
14110 65 72 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56  er table..#.# EV
14120 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 38  IDENCE-OF: R-638
14130 32 37 2d 35 34 37 37 34 20 54 68 65 20 74 65 78  27-54774 The tex
14140 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 43  t of the child C
14150 52 45 41 54 45 20 54 41 42 4c 45 0a 23 20 73 74  REATE TABLE.# st
14160 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65  atement or state
14170 6d 65 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20  ments stored in 
14180 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
14190 72 20 74 61 62 6c 65 20 61 72 65 20 6d 6f 64 69  r table are modi
141a0 66 69 65 64 0a 23 20 74 6f 20 72 65 66 6c 65 63  fied.# to reflec
141b0 74 20 74 68 65 20 6e 65 77 20 70 61 72 65 6e 74  t the new parent
141c0 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 23 0a 64   table name..#.d
141d0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36  o_test e_fkey-56
141e0 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
141f0 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
14200 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
14210 42 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74  BLE 'p 1 "parent
14220 20 6f 6e 65 22 27 28 61 20 52 45 46 45 52 45 4e   one"'(a REFEREN
14230 43 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74  CES 'p 1 "parent
14240 20 6f 6e 65 22 27 2c 20 62 2c 20 50 52 49 4d 41   one"', b, PRIMA
14250 52 59 20 4b 45 59 28 62 29 29 3b 0a 0a 20 20 20  RY KEY(b));..   
14260 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
14270 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53  (c, d REFERENCES
14280 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e   'p 1 "parent on
14290 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43 41  e"' ON UPDATE CA
142a0 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41  SCADE);.    CREA
142b0 54 45 20 54 41 42 4c 45 20 63 32 28 65 2c 20 66  TE TABLE c2(e, f
142c0 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 29  , FOREIGN KEY(f)
142d0 20 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31   REFERENCES 'p 1
142e0 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f   "parent one"' O
142f0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
14300 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14310 42 4c 45 20 63 33 28 65 2c 20 27 66 20 63 6f 6c  BLE c3(e, 'f col
14320 20 32 27 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59   2', FOREIGN KEY
14330 28 27 66 20 63 6f 6c 20 32 27 29 20 52 45 46 45  ('f col 2') REFE
14340 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72  RENCES 'p 1 "par
14350 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44  ent one"' ON UPD
14360 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a 20  ATE CASCADE);.. 
14370 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 27     INSERT INTO '
14380 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14390 27 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a  ' VALUES(1, 1);.
143a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
143b0 63 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b  c1 VALUES(1, 1);
143c0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
143d0 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29   c2 VALUES(1, 1)
143e0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
143f0 4f 20 63 33 20 56 41 4c 55 45 53 28 31 2c 20 31  O c3 VALUES(1, 1
14400 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 52 45 41 54  );..    -- CREAT
14410 45 20 54 41 42 4c 45 20 71 28 61 2c 20 62 2c 20  E TABLE q(a, b, 
14420 50 52 49 4d 41 52 59 20 4b 45 59 28 62 29 29 3b  PRIMARY KEY(b));
14430 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
14440 74 20 65 5f 66 6b 65 79 2d 35 36 2e 32 20 7b 0a  t e_fkey-56.2 {.
14450 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45    execsql { ALTE
14460 52 20 54 41 42 4c 45 20 27 70 20 31 20 22 70 61  R TABLE 'p 1 "pa
14470 72 65 6e 74 20 6f 6e 65 22 27 20 52 45 4e 41 4d  rent one"' RENAM
14480 45 20 54 4f 20 70 20 7d 0a 7d 20 7b 7d 0a 64 6f  E TO p }.} {}.do
14490 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e  _test e_fkey-56.
144a0 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
144b0 20 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54      UPDATE p SET
144c0 20 61 20 3d 20 27 78 78 78 27 2c 20 62 20 3d 20   a = 'xxx', b = 
144d0 27 78 78 78 27 3b 0a 20 20 20 20 53 45 4c 45 43  'xxx';.    SELEC
144e0 54 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20  T * FROM p;.    
144f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31  SELECT * FROM c1
14500 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
14510 52 4f 4d 20 63 32 3b 0a 20 20 20 20 53 45 4c 45  ROM c2;.    SELE
14520 43 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a 20 20  CT * FROM c3;.  
14530 7d 0a 7d 20 7b 78 78 78 20 78 78 78 20 31 20 78  }.} {xxx xxx 1 x
14540 78 78 20 31 20 78 78 78 20 31 20 78 78 78 7d 0a  xx 1 xxx 1 xxx}.
14550 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14560 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.4 {.  execsql 
14570 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f  { SELECT sql FRO
14580 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
14590 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61  WHERE type = 'ta
145a0 62 6c 65 27 7d 0a 7d 20 5b 6c 69 73 74 20 20 20  ble'}.} [list   
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54 41    \.  {CREATE TA
14600 42 4c 45 20 22 70 22 28 61 20 52 45 46 45 52 45  BLE "p"(a REFERE
14610 4e 43 45 53 20 22 70 22 2c 20 62 2c 20 50 52 49  NCES "p", b, PRI
14620 4d 41 52 59 20 4b 45 59 28 62 29 29 7d 20 20 20  MARY KEY(b))}   
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 5c 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c  \.  {CREATE TABL
14650 45 20 63 31 28 63 2c 20 64 20 52 45 46 45 52 45  E c1(c, d REFERE
14660 4e 43 45 53 20 22 70 22 20 4f 4e 20 55 50 44 41  NCES "p" ON UPDA
14670 54 45 20 43 41 53 43 41 44 45 29 7d 20 20 20 20  TE CASCADE)}    
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
14690 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20    {CREATE TABLE 
146a0 63 32 28 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e  c2(e, f, FOREIGN
146b0 20 4b 45 59 28 66 29 20 52 45 46 45 52 45 4e 43   KEY(f) REFERENC
146c0 45 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54 45  ES "p" ON UPDATE
146d0 20 43 41 53 43 41 44 45 29 7d 20 20 5c 0a 20 20   CASCADE)}  \.  
146e0 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33  {CREATE TABLE c3
146f0 28 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20 46  (e, 'f col 2', F
14700 4f 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63 6f  OREIGN KEY('f co
14710 6c 20 32 27 29 20 52 45 46 45 52 45 4e 43 45 53  l 2') REFERENCES
14720 20 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43   "p" ON UPDATE C
14730 41 53 43 41 44 45 29 7d 20 5c 0a 5d 0a 0a 23 2d  ASCADE)} \.]..#-
14740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
14790 20 74 68 61 74 20 61 20 44 52 4f 50 20 54 41 42   that a DROP TAB
147a0 4c 45 20 64 6f 65 73 20 61 6e 20 69 6d 70 6c 69  LE does an impli
147b0 63 69 74 20 44 45 4c 45 54 45 20 46 52 4f 4d 2e  cit DELETE FROM.
147c0 20 57 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 0a   Which does not.
147d0 23 20 63 61 75 73 65 20 61 6e 79 20 74 72 69 67  # cause any trig
147e0 67 65 72 73 20 74 6f 20 66 69 72 65 2c 20 62 75  gers to fire, bu
147f0 74 20 64 6f 65 73 20 66 69 72 65 20 66 6f 72 65  t does fire fore
14800 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e  ign key actions.
14810 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
14820 3a 20 52 2d 31 34 32 30 38 2d 32 33 39 38 36 20  : R-14208-23986 
14830 49 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  If foreign key c
14840 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65  onstraints are e
14850 6e 61 62 6c 65 64 20 77 68 65 6e 0a 23 20 69 74  nabled when.# it
14860 20 69 73 20 70 72 65 70 61 72 65 64 2c 20 74 68   is prepared, th
14870 65 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  e DROP TABLE com
14880 6d 61 6e 64 20 70 65 72 66 6f 72 6d 73 20 61 6e  mand performs an
14890 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45   implicit DELETE
148a0 20 74 6f 0a 23 20 72 65 6d 6f 76 65 20 61 6c 6c   to.# remove all
148b0 20 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 74   rows from the t
148c0 61 62 6c 65 20 62 65 66 6f 72 65 20 64 72 6f 70  able before drop
148d0 70 69 6e 67 20 69 74 2e 0a 23 0a 23 20 45 56 49  ping it..#.# EVI
148e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 30 37  DENCE-OF: R-1107
148f0 38 2d 30 33 39 34 35 20 54 68 65 20 69 6d 70 6c  8-03945 The impl
14900 69 63 69 74 20 44 45 4c 45 54 45 20 64 6f 65 73  icit DELETE does
14910 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 53   not cause any S
14920 51 4c 0a 23 20 74 72 69 67 67 65 72 73 20 74 6f  QL.# triggers to
14930 20 66 69 72 65 2c 20 62 75 74 20 6d 61 79 20 69   fire, but may i
14940 6e 76 6f 6b 65 20 66 6f 72 65 69 67 6e 20 6b 65  nvoke foreign ke
14950 79 20 61 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6e  y actions or con
14960 73 74 72 61 69 6e 74 0a 23 20 76 69 6f 6c 61 74  straint.# violat
14970 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ions..#.do_test 
14980 65 5f 66 6b 65 79 2d 35 37 2e 31 20 7b 0a 20 20  e_fkey-57.1 {.  
14990 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
149a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
149b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61  CREATE TABLE p(a
149c0 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
149d0 28 61 2c 20 62 29 29 3b 0a 0a 20 20 20 20 43 52  (a, b));..    CR
149e0 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c  EATE TABLE c1(c,
149f0 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   d, FOREIGN KEY(
14a00 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  c, d) REFERENCES
14a10 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54   p ON DELETE SET
14a20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41   NULL);.    CREA
14a30 54 45 20 54 41 42 4c 45 20 63 32 28 63 2c 20 64  TE TABLE c2(c, d
14a40 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
14a50 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
14a60 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44   ON DELETE SET D
14a70 45 46 41 55 4c 54 29 3b 0a 20 20 20 20 43 52 45  EFAULT);.    CRE
14a80 41 54 45 20 54 41 42 4c 45 20 63 33 28 63 2c 20  ATE TABLE c3(c, 
14a90 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
14aa0 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14ab0 70 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  p ON DELETE CASC
14ac0 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ADE);.    CREATE
14ad0 20 54 41 42 4c 45 20 63 34 28 63 2c 20 64 2c 20   TABLE c4(c, d, 
14ae0 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
14af0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  ) REFERENCES p O
14b00 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
14b10 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
14b20 41 42 4c 45 20 63 35 28 63 2c 20 64 2c 20 46 4f  ABLE c5(c, d, FO
14b30 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
14b40 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
14b50 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
14b60 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
14b70 41 42 4c 45 20 63 36 28 63 2c 20 64 2c 20 0a 20  ABLE c6(c, d, . 
14b80 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
14b90 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
14ba0 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  S p ON DELETE RE
14bb0 53 54 52 49 43 54 20 0a 20 20 20 20 20 20 44 45  STRICT .      DE
14bc0 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
14bd0 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
14be0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14bf0 42 4c 45 20 63 37 28 63 2c 20 64 2c 20 0a 20 20  BLE c7(c, d, .  
14c00 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
14c10 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  c, d) REFERENCES
14c20 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20   p ON DELETE NO 
14c30 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46  ACTION.      DEF
14c40 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
14c50 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
14c60 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
14c70 42 4c 45 20 6c 6f 67 28 6d 73 67 29 3b 0a 20 20  BLE log(msg);.  
14c80 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
14c90 20 74 74 20 41 46 54 45 52 20 44 45 4c 45 54 45   tt AFTER DELETE
14ca0 20 4f 4e 20 70 20 42 45 47 49 4e 0a 20 20 20 20   ON p BEGIN.    
14cb0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
14cc0 67 20 56 41 4c 55 45 53 28 27 64 65 6c 65 74 65  g VALUES('delete
14cd0 20 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 29   ' || old.rowid)
14ce0 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
14cf0 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}..do_test e_f
14d00 6b 65 79 2d 35 37 2e 32 20 7b 0a 20 20 65 78 65  key-57.2 {.  exe
14d10 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
14d20 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
14d30 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49  'a', 'b');.    I
14d40 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
14d50 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
14d60 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14d70 63 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  c2 VALUES('a', '
14d80 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
14d90 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 27  INTO c3 VALUES('
14da0 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 42 45  a', 'b');.    BE
14db0 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  GIN;.      DROP 
14dc0 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53  TABLE p;.      S
14dd0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b  ELECT * FROM c1;
14de0 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64  .  }.} {{} {}}.d
14df0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14e00 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
14e10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
14e20 32 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f  2 }.} {{} {}}.do
14e30 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e  _test e_fkey-57.
14e40 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
14e50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33  SELECT * FROM c3
14e60 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
14e70 65 5f 66 6b 65 79 2d 35 37 2e 35 20 7b 0a 20 20  e_fkey-57.5 {.  
14e80 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
14e90 20 2a 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 7d 20   * FROM log }.} 
14ea0 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
14eb0 79 2d 35 37 2e 36 20 7b 0a 20 20 65 78 65 63 73  y-57.6 {.  execs
14ec0 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d  ql ROLLBACK.} {}
14ed0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14ee0 35 37 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  57.7 {.  execsql
14ef0 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
14f00 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
14f10 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  p;.      SELECT 
14f20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20  * FROM log;.    
14f30 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
14f40 7b 7b 64 65 6c 65 74 65 20 31 7d 7d 0a 0a 23 2d  {{delete 1}}..#-
14f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 6e  --------.# If an
14fa0 20 49 4d 4d 45 44 49 41 54 45 20 66 6f 72 65 69   IMMEDIATE forei
14fb0 67 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20  gn key fails as 
14fc0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52  a result of a DR
14fd0 4f 50 20 54 41 42 4c 45 2c 20 74 68 65 0a 23 20  OP TABLE, the.# 
14fe0 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
14ff0 6e 64 20 66 61 69 6c 73 2e 0a 23 0a 23 20 45 56  nd fails..#.# EV
15000 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32 37  IDENCE-OF: R-327
15010 36 38 2d 34 37 39 32 35 20 49 66 20 61 6e 20 69  68-47925 If an i
15020 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
15030 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
15040 69 73 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74  is.# violated, t
15050 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74  he DROP TABLE st
15060 61 74 65 6d 65 6e 74 20 66 61 69 6c 73 20 61 6e  atement fails an
15070 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e  d the table is n
15080 6f 74 20 64 72 6f 70 70 65 64 2e 0a 23 0a 64 6f  ot dropped..#.do
15090 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e  _test e_fkey-58.
150a0 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
150b0 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
150c0 20 63 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20   c1;.    DELETE 
150d0 46 52 4f 4d 20 63 32 3b 0a 20 20 20 20 44 45 4c  FROM c2;.    DEL
150e0 45 54 45 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d  ETE FROM c3;.  }
150f0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
15100 45 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55  ERT INTO c5 VALU
15110 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20  ES('a', 'b') }. 
15120 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50   catchsql { DROP
15130 20 54 41 42 4c 45 20 70 20 7d 0a 7d 20 7b 31 20   TABLE p }.} {1 
15140 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
15150 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
15160 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15170 35 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  58.2 {.  execsql
15180 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
15190 20 70 20 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f   p }.} {a b}.do_
151a0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 33  test e_fkey-58.3
151b0 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
151c0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
151d0 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20   DROP TABLE p;. 
151e0 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
151f0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
15200 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
15210 20 65 5f 66 6b 65 79 2d 35 38 2e 34 20 7b 0a 20   e_fkey-58.4 {. 
15220 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
15230 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 3b 0a  ELECT * FROM p;.
15240 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
15250 4d 20 63 35 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M c5;.    ROLLBA
15260 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20 61  CK;.  }.} {a b a
15270 20 62 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   b}..#----------
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
152c0 23 20 49 66 20 61 20 44 45 46 45 52 52 45 44 20  # If a DEFERRED 
152d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 66 61 69 6c  foreign key fail
152e0 73 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  s as a result of
152f0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 61   a DROP TABLE, a
15300 74 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 63  ttempting.# to c
15310 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
15320 63 74 69 6f 6e 20 66 61 69 6c 73 20 75 6e 6c 65  ction fails unle
15330 73 73 20 74 68 65 20 76 69 6f 6c 61 74 69 6f 6e  ss the violation
15340 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 23 20 45   is fixed..#.# E
15350 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
15360 39 30 33 2d 30 38 34 36 30 20 49 66 20 61 20 64  903-08460 If a d
15370 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
15380 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
15390 73 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74 68  s.# violated, th
153a0 65 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  en an error is r
153b0 65 70 6f 72 74 65 64 20 77 68 65 6e 20 74 68 65  eported when the
153c0 20 75 73 65 72 20 61 74 74 65 6d 70 74 73 20 74   user attempts t
153d0 6f 20 63 6f 6d 6d 69 74 0a 23 20 74 68 65 20 74  o commit.# the t
153e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
153f0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
15400 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
15410 6f 6e 73 20 73 74 69 6c 6c 20 65 78 69 73 74 0a  ons still exist.
15420 23 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  # at that point.
15430 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
15440 79 2d 35 39 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-59.1 {.  execs
15450 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45  ql { .    DELETE
15460 20 46 52 4f 4d 20 63 31 20 3b 20 44 45 4c 45 54   FROM c1 ; DELET
15470 45 20 46 52 4f 4d 20 63 32 20 3b 20 44 45 4c 45  E FROM c2 ; DELE
15480 54 45 20 46 52 4f 4d 20 63 33 20 3b 0a 20 20 20  TE FROM c3 ;.   
15490 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 34 20   DELETE FROM c4 
154a0 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 35  ; DELETE FROM c5
154b0 20 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63   ; DELETE FROM c
154c0 36 20 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  6 ;.    DELETE F
154d0 52 4f 4d 20 63 37 20 0a 20 20 7d 0a 7d 20 7b 7d  ROM c7 .  }.} {}
154e0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
154f0 35 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  59.2 {.  execsql
15500 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
15510 37 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  7 VALUES('a', 'b
15520 27 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  ') }.  execsql {
15530 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
15540 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a    DROP TABLE p;.
15550 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
15560 20 65 5f 66 6b 65 79 2d 35 39 2e 33 20 7b 0a 20   e_fkey-59.3 {. 
15570 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
15580 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
15590 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
155a0 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
155b0 5f 66 6b 65 79 2d 35 39 2e 34 20 7b 0a 20 20 65  _fkey-59.4 {.  e
155c0 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
155d0 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52  TABLE p(a, b, PR
155e0 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
155f0 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f   }.  catchsql CO
15600 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  MMIT.} {1 {forei
15610 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
15620 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
15630 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 35 20 7b  st e_fkey-59.5 {
15640 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
15650 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45  ERT INTO p VALUE
15660 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20  S('a', 'b') }.  
15670 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
15680 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
156d0 23 20 41 6e 79 20 22 66 6f 72 65 69 67 6e 20 6b  # Any "foreign k
156e0 65 79 20 6d 69 73 6d 61 74 63 68 22 20 65 72 72  ey mismatch" err
156f0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
15700 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 61 6e  while running an
15710 20 69 6d 70 6c 69 63 69 74 0a 23 20 22 44 45 4c   implicit.# "DEL
15720 45 54 45 20 46 52 4f 4d 20 74 62 6c 22 20 61 72  ETE FROM tbl" ar
15730 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 23 20 45  e ignored..#.# E
15740 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
15750 32 34 32 2d 33 37 30 30 35 20 41 6e 79 20 22 66  242-37005 Any "f
15760 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
15770 74 63 68 22 20 65 72 72 6f 72 73 0a 23 20 65 6e  tch" errors.# en
15780 63 6f 75 6e 74 65 72 65 64 20 61 73 20 70 61 72  countered as par
15790 74 20 6f 66 20 61 6e 20 69 6d 70 6c 69 63 69 74  t of an implicit
157a0 20 44 45 4c 45 54 45 20 61 72 65 20 69 67 6e 6f   DELETE are igno
157b0 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  red..#.drop_all_
157c0 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
157d0 5f 66 6b 65 79 2d 36 30 2e 31 20 7b 0a 20 20 65  _fkey-60.1 {.  e
157e0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
157f0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
15800 20 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43 52 45   = OFF;..    CRE
15810 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 50 52  ATE TABLE p(a PR
15820 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
15830 45 52 45 4e 43 45 53 20 6e 6f 73 75 63 68 74 61  ERENCES nosuchta
15840 62 6c 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ble);.    CREATE
15850 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20   TABLE c1(c, d, 
15860 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
15870 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 29 3b  ) REFERENCES a);
15880 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
15890 45 20 63 32 28 63 20 52 45 46 45 52 45 4e 43 45  E c2(c REFERENCE
158a0 53 20 70 28 62 29 2c 20 64 29 3b 0a 20 20 20 20  S p(b), d);.    
158b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
158c0 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  c REFERENCES p O
158d0 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c  N DELETE SET NUL
158e0 4c 2c 20 64 29 3b 0a 0a 20 20 20 20 49 4e 53 45  L, d);..    INSE
158f0 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53  RT INTO p VALUES
15900 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
15910 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
15920 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
15930 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55  ERT INTO c2 VALU
15940 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
15950 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c  SERT INTO c3 VAL
15960 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d  UES(1, 2);.  }.}
15970 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
15980 65 79 2d 36 30 2e 32 20 7b 0a 20 20 65 78 65 63  ey-60.2 {.  exec
15990 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
159a0 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d  eign_keys = ON }
159b0 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
159c0 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20  LETE FROM p }.} 
159d0 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
159e0 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61  e: main.nosuchta
159f0 62 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  ble}}.do_test e_
15a00 66 6b 65 79 2d 36 30 2e 33 20 7b 0a 20 20 65 78  fkey-60.3 {.  ex
15a10 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
15a20 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  N;.      DROP TA
15a30 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45 4c  BLE p;.      SEL
15a40 45 43 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a 20  ECT * FROM c3;. 
15a50 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
15a60 0a 7d 20 7b 7b 7d 20 32 7d 0a 64 6f 5f 74 65 73  .} {{} 2}.do_tes
15a70 74 20 65 5f 66 6b 65 79 2d 36 30 2e 34 20 7b 0a  t e_fkey-60.4 {.
15a80 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
15a90 54 45 20 54 41 42 4c 45 20 6e 6f 73 75 63 68 74  TE TABLE nosucht
15aa0 61 62 6c 65 28 78 20 50 52 49 4d 41 52 59 20 4b  able(x PRIMARY K
15ab0 45 59 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  EY) }.  catchsql
15ac0 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
15ad0 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
15ae0 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
15af0 22 63 32 22 20 72 65 66 65 72 65 6e 63 69 6e 67  "c2" referencing
15b00 20 22 70 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65   "p"}}.do_test e
15b10 5f 66 6b 65 79 2d 36 30 2e 35 20 7b 0a 20 20 65  _fkey-60.5 {.  e
15b20 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  xecsql { DROP TA
15b30 42 4c 45 20 63 31 20 7d 0a 20 20 63 61 74 63 68  BLE c1 }.  catch
15b40 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
15b50 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  M p }.} {1 {fore
15b60 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
15b70 20 2d 20 22 63 32 22 20 72 65 66 65 72 65 6e 63   - "c2" referenc
15b80 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74 65 73  ing "p"}}.do_tes
15b90 74 20 65 5f 66 6b 65 79 2d 36 30 2e 36 20 7b 0a  t e_fkey-60.6 {.
15ba0 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50    execsql { DROP
15bb0 20 54 41 42 4c 45 20 63 32 20 7d 0a 20 20 65 78   TABLE c2 }.  ex
15bc0 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
15bd0 52 4f 4d 20 70 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  ROM p }.} {}..#-
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
15c30 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c  that the special
15c40 20 62 65 68 61 76 69 6f 72 73 20 6f 66 20 41 4c   behaviors of AL
15c50 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54 41 42  TER and DROP TAB
15c60 4c 45 20 61 72 65 20 6f 6e 6c 79 0a 23 20 61 63  LE are only.# ac
15c70 74 69 76 61 74 65 64 20 77 68 65 6e 20 66 6f 72  tivated when for
15c80 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e  eign keys are en
15c90 61 62 6c 65 64 2e 20 53 70 65 63 69 61 6c 20 62  abled. Special b
15ca0 65 68 61 76 69 6f 72 73 20 61 72 65 3a 0a 23 0a  ehaviors are:.#.
15cb0 23 20 20 20 31 2e 20 41 44 44 20 43 4f 4c 55 4d  #   1. ADD COLUM
15cc0 4e 20 6e 6f 74 20 61 6c 6c 6f 77 69 6e 67 20 61  N not allowing a
15cd0 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75   REFERENCES clau
15ce0 73 65 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e 55  se with a non-NU
15cf0 4c 4c 20 0a 23 20 20 20 20 20 20 64 65 66 61 75  LL .#      defau
15d00 6c 74 20 76 61 6c 75 65 2e 0a 23 20 20 20 32 2e  lt value..#   2.
15d10 20 4d 6f 64 69 66 79 69 6e 67 20 66 6f 72 65 69   Modifying forei
15d20 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15d30 6e 73 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74  ns when a parent
15d40 20 74 61 62 6c 65 20 69 73 20 52 45 4e 41 4d 45   table is RENAME
15d50 64 2e 0a 23 20 20 20 33 2e 20 52 75 6e 6e 69 6e  d..#   3. Runnin
15d60 67 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45  g an implicit DE
15d70 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6d 6d 61 6e  LETE FROM comman
15d80 64 20 61 73 20 70 61 72 74 20 6f 66 20 44 52 4f  d as part of DRO
15d90 50 20 54 41 42 4c 45 2e 0a 23 0a 23 20 45 56 49  P TABLE..#.# EVI
15da0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 31 34  DENCE-OF: R-5414
15db0 32 2d 34 31 33 34 36 20 54 68 65 20 70 72 6f 70  2-41346 The prop
15dc0 65 72 74 69 65 73 20 6f 66 20 74 68 65 20 44 52  erties of the DR
15dd0 4f 50 20 54 41 42 4c 45 20 61 6e 64 20 41 4c 54  OP TABLE and ALT
15de0 45 52 0a 23 20 54 41 42 4c 45 20 63 6f 6d 6d 61  ER.# TABLE comma
15df0 6e 64 73 20 64 65 73 63 72 69 62 65 64 20 61 62  nds described ab
15e00 6f 76 65 20 6f 6e 6c 79 20 61 70 70 6c 79 20 69  ove only apply i
15e10 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  f foreign keys a
15e20 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 64 6f  re enabled..#.do
15e30 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
15e40 31 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  1.1 {.  drop_all
15e50 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71  _tables.  execsq
15e60 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
15e70 20 74 31 28 61 2c 20 62 29 20 7d 0a 20 20 63 61   t1(a, b) }.  ca
15e80 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54  tchsql { ALTER T
15e90 41 42 4c 45 20 74 31 20 41 44 44 20 43 4f 4c 55  ABLE t1 ADD COLU
15ea0 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 27 78 78  MN c DEFAULT 'xx
15eb0 78 27 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  x' REFERENCES t2
15ec0 20 7d 0a 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20   }.} {1 {Cannot 
15ed0 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45 53  add a REFERENCES
15ee0 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e   column with non
15ef0 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61  -NULL default va
15f00 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  lue}}.do_test e_
15f10 66 6b 65 79 2d 36 31 2e 31 2e 32 20 7b 0a 20 20  fkey-61.1.2 {.  
15f20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
15f30 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
15f40 4f 46 46 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  OFF }.  execsql 
15f50 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31  { ALTER TABLE t1
15f60 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45   ADD COLUMN c DE
15f70 46 41 55 4c 54 20 27 78 78 78 27 20 52 45 46 45  FAULT 'xxx' REFE
15f80 52 45 4e 43 45 53 20 74 32 20 7d 0a 20 20 65 78  RENCES t2 }.  ex
15f90 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
15fa0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
15fb0 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
15fc0 20 3d 20 27 74 31 27 20 7d 0a 7d 20 7b 7b 43 52   = 't1' }.} {{CR
15fd0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
15fe0 20 62 2c 20 63 20 44 45 46 41 55 4c 54 20 27 78   b, c DEFAULT 'x
15ff0 78 78 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xx' REFERENCES t
16000 32 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  2)}}.do_test e_f
16010 6b 65 79 2d 36 31 2e 31 2e 33 20 7b 0a 20 20 65  key-61.1.3 {.  e
16020 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
16030 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
16040 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  N }.} {}..do_tes
16050 74 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 31 20  t e_fkey-61.2.1 
16060 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
16070 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  les.  execsql {.
16080 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16090 20 70 28 61 20 55 4e 49 51 55 45 29 3b 0a 20 20   p(a UNIQUE);.  
160a0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
160b0 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  (b REFERENCES p(
160c0 61 29 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  a));.    BEGIN;.
160d0 20 20 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c        ALTER TABL
160e0 45 20 70 20 52 45 4e 41 4d 45 20 54 4f 20 70 61  E p RENAME TO pa
160f0 72 65 6e 74 3b 0a 20 20 20 20 20 20 53 45 4c 45  rent;.      SELE
16100 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
16110 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
16120 6e 61 6d 65 20 3d 20 27 63 27 3b 0a 20 20 20 20  name = 'c';.    
16130 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
16140 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63  {{CREATE TABLE c
16150 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 22 70  (b REFERENCES "p
16160 61 72 65 6e 74 22 28 61 29 29 7d 7d 0a 64 6f 5f  arent"(a))}}.do_
16170 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 32  test e_fkey-61.2
16180 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
16190 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65  .    PRAGMA fore
161a0 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a  ign_keys = OFF;.
161b0 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20      ALTER TABLE 
161c0 70 20 52 45 4e 41 4d 45 20 54 4f 20 70 61 72 65  p RENAME TO pare
161d0 6e 74 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  nt;.    SELECT s
161e0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
161f0 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
16200 20 3d 20 27 63 27 3b 0a 20 20 7d 0a 7d 20 7b 7b   = 'c';.  }.} {{
16210 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 62  CREATE TABLE c(b
16220 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61 29   REFERENCES p(a)
16230 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  )}}.do_test e_fk
16240 65 79 2d 36 31 2e 32 2e 33 20 7b 0a 20 20 65 78  ey-61.2.3 {.  ex
16250 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66  ecsql { PRAGMA f
16260 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
16270 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
16280 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 31 20 7b   e_fkey-61.3.1 {
16290 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
162a0 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
162b0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
162c0 70 28 61 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  p(a UNIQUE);.   
162d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28   CREATE TABLE c(
162e0 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61  b REFERENCES p(a
162f0 29 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  ) ON DELETE SET 
16300 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52  NULL);.    INSER
16310 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
16320 27 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'x');.    INSERT
16330 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
16340 78 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  x');.    BEGIN;.
16350 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
16360 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   p;.      SELECT
16370 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 52   * FROM c;.    R
16380 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
16390 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}}.do_test e_fk
163a0 65 79 2d 36 31 2e 33 2e 32 20 7b 0a 20 20 65 78  ey-61.3.2 {.  ex
163b0 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
163c0 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
163d0 3d 20 4f 46 46 3b 0a 20 20 20 20 44 52 4f 50 20  = OFF;.    DROP 
163e0 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 53 45 4c  TABLE p;.    SEL
163f0 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
16400 7d 0a 7d 20 7b 78 7d 0a 64 6f 5f 74 65 73 74 20  }.} {x}.do_test 
16410 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 33 20 7b 0a  e_fkey-61.3.3 {.
16420 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
16430 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
16440 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23  = ON }.} {}..###
16450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16490 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43  ########.### SEC
164a0 54 49 4f 4e 20 36 3a 20 4c 69 6d 69 74 73 20 61  TION 6: Limits a
164b0 6e 64 20 55 6e 73 75 70 70 6f 72 74 65 64 20 46  nd Unsupported F
164c0 65 61 74 75 72 65 73 0a 23 23 23 23 23 23 23 23  eatures.########
164d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16510 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ###..#----------
16520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16560 23 20 54 65 73 74 20 74 68 61 74 20 4d 41 54 43  # Test that MATC
16570 48 20 63 6c 61 75 73 65 73 20 61 72 65 20 70 61  H clauses are pa
16580 72 73 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65  rsed, but SQLite
16590 20 74 72 65 61 74 73 20 65 76 65 72 79 20 66 6f   treats every fo
165a0 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73  reign key.# cons
165b0 74 72 61 69 6e 74 20 61 73 20 69 66 20 69 74 20  traint as if it 
165c0 77 65 72 65 20 22 4d 41 54 43 48 20 53 49 4d 50  were "MATCH SIMP
165d0 4c 45 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  LE"..#.# EVIDENC
165e0 45 2d 4f 46 3a 20 52 2d 32 34 37 32 38 2d 31 33  E-OF: R-24728-13
165f0 32 33 30 20 53 51 4c 69 74 65 20 70 61 72 73 65  230 SQLite parse
16600 73 20 4d 41 54 43 48 20 63 6c 61 75 73 65 73 20  s MATCH clauses 
16610 28 69 2e 65 2e 20 64 6f 65 73 20 6e 6f 74 0a 23  (i.e. does not.#
16620 20 72 65 70 6f 72 74 20 61 20 73 79 6e 74 61 78   report a syntax
16630 20 65 72 72 6f 72 20 69 66 20 79 6f 75 20 73 70   error if you sp
16640 65 63 69 66 79 20 6f 6e 65 29 2c 20 62 75 74 20  ecify one), but 
16650 64 6f 65 73 20 6e 6f 74 20 65 6e 66 6f 72 63 65  does not enforce
16660 20 74 68 65 6d 2e 0a 23 0a 23 20 45 56 49 44 45   them..#.# EVIDE
16670 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 34 35 30 2d  NCE-OF: R-24450-
16680 34 36 31 37 34 20 41 6c 6c 20 66 6f 72 65 69 67  46174 All foreig
16690 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
166a0 73 20 69 6e 20 53 51 4c 69 74 65 20 61 72 65 0a  s in SQLite are.
166b0 23 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  # handled as if 
166c0 4d 41 54 43 48 20 53 49 4d 50 4c 45 20 77 65 72  MATCH SIMPLE wer
166d0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 23 0a 66  e specified..#.f
166e0 6f 72 65 61 63 68 20 7a 4d 61 74 63 68 20 5b 6c  oreach zMatch [l
166f0 69 73 74 20 53 49 4d 50 4c 45 20 50 41 52 54 49  ist SIMPLE PARTI
16700 41 4c 20 46 55 4c 4c 20 53 69 6d 70 6c 65 20 70  AL FULL Simple p
16710 61 72 54 49 41 4c 20 46 75 4c 4c 20 5d 20 7b 0a  arTIAL FuLL ] {.
16720 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
16730 73 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  s.  do_test e_fk
16740 65 79 2d 36 32 2e 24 7a 4d 61 74 63 68 2e 31 20  ey-62.$zMatch.1 
16750 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a  {.    execsql ".
16760 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
16770 4c 45 20 70 28 61 2c 20 62 2c 20 63 2c 20 50 52  LE p(a, b, c, PR
16780 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
16790 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
167a0 41 42 4c 45 20 63 28 64 2c 20 65 2c 20 66 2c 20  ABLE c(d, e, f, 
167b0 46 4f 52 45 49 47 4e 20 4b 45 59 28 65 2c 20 66  FOREIGN KEY(e, f
167c0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4d  ) REFERENCES p M
167d0 41 54 43 48 20 24 7a 4d 61 74 63 68 29 3b 0a 20  ATCH $zMatch);. 
167e0 20 20 20 22 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     ".  } {}.  do
167f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16800 24 7a 4d 61 74 63 68 2e 32 20 7b 0a 20 20 20 20  $zMatch.2 {.    
16810 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
16820 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31   INTO p VALUES(1
16830 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20 20 20  , 2, 3)         
16840 7d 0a 0a 20 20 20 20 23 20 4d 41 54 43 48 20 53  }..    # MATCH S
16850 49 4d 50 4c 45 20 62 65 68 61 76 69 6f 72 3a 20  IMPLE behavior: 
16860 41 6c 6c 6f 77 20 61 6e 79 20 63 68 69 6c 64 20  Allow any child 
16870 6b 65 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  key that contain
16880 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20  s one or more.  
16890 20 20 23 20 4e 55 4c 4c 20 76 61 6c 75 65 20 74    # NULL value t
168a0 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 4e  o be inserted. N
168b0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 64  on-NULL values d
168c0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
168d0 70 20 74 6f 20 61 6e 79 0a 20 20 20 20 23 20 70  p to any.    # p
168e0 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73  arent key values
168f0 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20 61 74 20  , so long as at 
16900 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 20  least one field 
16910 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
16920 20 69 73 0a 20 20 20 20 23 20 4e 55 4c 4c 2e 0a   is.    # NULL..
16930 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
16940 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
16950 45 53 28 27 77 27 2c 20 32 2c 20 33 29 20 20 20  ES('w', 2, 3)   
16960 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
16970 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
16980 63 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 78  c VALUES('x', 'x
16990 27 2c 20 4e 55 4c 4c 29 20 20 7d 0a 20 20 20 20  ', NULL)  }.    
169a0 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
169b0 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
169c0 79 27 2c 20 4e 55 4c 4c 2c 20 27 78 27 29 20 20  y', NULL, 'x')  
169d0 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
169e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
169f0 4c 55 45 53 28 27 7a 27 2c 20 4e 55 4c 4c 2c 20  LUES('z', NULL, 
16a00 4e 55 4c 4c 29 20 7d 0a 0a 20 20 20 20 23 20 43  NULL) }..    # C
16a10 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 46 4b  heck that the FK
16a20 20 69 73 20 65 6e 66 6f 72 63 65 64 20 70 72 6f   is enforced pro
16a30 70 65 72 6c 79 20 69 66 20 74 68 65 72 65 20 61  perly if there a
16a40 72 65 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  re no NULL value
16a50 73 20 0a 20 20 20 20 23 20 69 6e 20 74 68 65 20  s .    # in the 
16a60 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
16a70 73 2e 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  s..    catchsql 
16a80 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20  { INSERT INTO c 
16a90 56 41 4c 55 45 53 28 27 61 27 2c 20 32 2c 20 34  VALUES('a', 2, 4
16aa0 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65  ) }.  } {1 {fore
16ab0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
16ac0 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23  nt failed}}.}..#
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
16b20 20 74 68 61 74 20 53 51 4c 69 74 65 20 64 6f 65   that SQLite doe
16b30 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
16b40 65 20 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54  e SET CONSTRAINT
16b50 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 6e 64 0a   statement. And.
16b60 23 20 74 68 61 74 20 69 74 20 69 73 20 70 6f 73  # that it is pos
16b70 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
16b80 62 6f 74 68 20 69 6d 6d 65 64 69 61 74 65 20 61  both immediate a
16b90 6e 64 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  nd deferred cons
16ba0 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49  traints..#.# EVI
16bb0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 35 39  DENCE-OF: R-2159
16bc0 39 2d 31 36 30 33 38 20 49 6e 20 53 51 4c 69 74  9-16038 In SQLit
16bd0 65 2c 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  e, a foreign key
16be0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23   constraint is.#
16bf0 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 6d 61 72   permanently mar
16c00 6b 65 64 20 61 73 20 64 65 66 65 72 72 65 64 20  ked as deferred 
16c10 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 77 68 65  or immediate whe
16c20 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
16c30 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
16c40 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
16c50 79 2d 36 32 2e 31 20 7b 0a 20 20 63 61 74 63 68  y-62.1 {.  catch
16c60 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52  sql { SET CONSTR
16c70 41 49 4e 54 53 20 41 4c 4c 20 49 4d 4d 45 44 49  AINTS ALL IMMEDI
16c80 41 54 45 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72  ATE }.} {1 {near
16c90 20 22 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65   "SET": syntax e
16ca0 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  rror}}.do_test e
16cb0 5f 66 6b 65 79 2d 36 32 2e 32 20 7b 0a 20 20 63  _fkey-62.2 {.  c
16cc0 61 74 63 68 73 71 6c 20 7b 20 53 45 54 20 43 4f  atchsql { SET CO
16cd0 4e 53 54 52 41 49 4e 54 53 20 41 4c 4c 20 44 45  NSTRAINTS ALL DE
16ce0 46 45 52 52 45 44 20 7d 0a 7d 20 7b 31 20 7b 6e  FERRED }.} {1 {n
16cf0 65 61 72 20 22 53 45 54 22 3a 20 73 79 6e 74 61  ear "SET": synta
16d00 78 20 65 72 72 6f 72 7d 7d 0a 0a 64 6f 5f 74 65  x error}}..do_te
16d10 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 33 20 7b  st e_fkey-62.3 {
16d20 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16d30 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
16d40 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
16d50 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
16d60 45 41 54 45 20 54 41 42 4c 45 20 63 64 28 63 2c  EATE TABLE cd(c,
16d70 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
16d80 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
16d90 45 52 45 4e 43 45 53 20 70 20 44 45 46 45 52 52  ERENCES p DEFERR
16da0 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
16db0 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20 43 52  EFERRED);.    CR
16dc0 45 41 54 45 20 54 41 42 4c 45 20 63 69 28 63 2c  EATE TABLE ci(c,
16dd0 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
16de0 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
16df0 45 52 45 4e 43 45 53 20 70 20 44 45 46 45 52 52  ERENCES p DEFERR
16e00 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49  ABLE INITIALLY I
16e10 4d 4d 45 44 49 41 54 45 29 3b 0a 20 20 20 20 42  MMEDIATE);.    B
16e20 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  EGIN;.  }.} {}.d
16e30 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16e40 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .4 {.  catchsql 
16e50 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 69  { INSERT INTO ci
16e60 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27   VALUES('x', 'y'
16e70 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
16e80 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
16e90 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
16ea0 74 20 65 5f 66 6b 65 79 2d 36 32 2e 35 20 7b 0a  t e_fkey-62.5 {.
16eb0 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16ec0 45 52 54 20 49 4e 54 4f 20 63 64 20 56 41 4c 55  ERT INTO cd VALU
16ed0 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d  ES('x', 'y') }.}
16ee0 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
16ef0 65 5f 66 6b 65 79 2d 36 32 2e 36 20 7b 0a 20 20  e_fkey-62.6 {.  
16f00 63 61 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49  catchsql { COMMI
16f10 54 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  T }.} {1 {foreig
16f20 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
16f30 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
16f40 74 20 65 5f 66 6b 65 79 2d 36 32 2e 37 20 7b 0a  t e_fkey-62.7 {.
16f50 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
16f60 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 64 3b   DELETE FROM cd;
16f70 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
16f80 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
16f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68  -.# Test that th
16fe0 65 20 6d 61 78 69 6d 75 6d 20 72 65 63 75 72 73  e maximum recurs
16ff0 69 6f 6e 20 64 65 70 74 68 20 6f 66 20 66 6f 72  ion depth of for
17000 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20  eign key action 
17010 70 72 6f 67 72 61 6d 73 20 69 73 0a 23 20 67 6f  programs is.# go
17020 76 65 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  verned by the SQ
17030 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
17040 5f 44 45 50 54 48 20 61 6e 64 20 53 51 4c 49 54  _DEPTH and SQLIT
17050 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
17060 44 45 50 54 48 0a 23 20 73 65 74 74 69 6e 67 73  DEPTH.# settings
17070 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
17080 46 3a 20 52 2d 34 32 32 36 34 2d 33 30 35 30 33  F: R-42264-30503
17090 20 54 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f   The SQLITE_MAX_
170a0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 61 6e  TRIGGER_DEPTH an
170b0 64 0a 23 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  d.# SQLITE_LIMIT
170c0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 73  _TRIGGER_DEPTH s
170d0 65 74 74 69 6e 67 73 20 64 65 74 65 72 6d 69 6e  ettings determin
170e0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  e the maximum al
170f0 6c 6f 77 61 62 6c 65 0a 23 20 64 65 70 74 68 20  lowable.# depth 
17100 6f 66 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  of trigger progr
17110 61 6d 20 72 65 63 75 72 73 69 6f 6e 2e 20 46 6f  am recursion. Fo
17120 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
17130 66 20 74 68 65 73 65 20 6c 69 6d 69 74 73 2c 0a  f these limits,.
17140 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63  # foreign key ac
17150 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  tions are consid
17160 65 72 65 64 20 74 72 69 67 67 65 72 20 70 72 6f  ered trigger pro
17170 67 72 61 6d 73 2e 0a 23 0a 70 72 6f 63 20 74 65  grams..#.proc te
17180 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
17190 75 72 73 69 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b  ursion {limit} {
171a0 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
171b0 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  es.  execsql { .
171c0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
171d0 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61  REATE TABLE t0(a
171e0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
171f0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
17200 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78 30 27  O t0 VALUES('x0'
17210 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 66  , NULL);.  }.  f
17220 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69  or {set i 1} {$i
17230 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63   <= $limit} {inc
17240 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
17250 71 6c 20 22 0a 20 20 20 20 20 20 43 52 45 41 54  ql ".      CREAT
17260 45 20 54 41 42 4c 45 20 74 24 69 20 28 0a 20 20  E TABLE t$i (.  
17270 20 20 20 20 20 20 61 20 50 52 49 4d 41 52 59 20        a PRIMARY 
17280 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
17290 53 20 74 5b 65 78 70 72 20 24 69 2d 31 5d 20 4f  S t[expr $i-1] O
172a0 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
172b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
172c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20  INSERT INTO t$i 
172d0 56 41 4c 55 45 53 28 27 78 24 69 27 2c 20 27 78  VALUES('x$i', 'x
172e0 5b 65 78 70 72 20 24 69 2d 31 5d 27 29 3b 0a 20  [expr $i-1]');. 
172f0 20 20 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73     ".  }.  execs
17300 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63  ql COMMIT.  catc
17310 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54  hsql ".    DELET
17320 45 20 46 52 4f 4d 20 74 30 3b 0a 20 20 20 20 53  E FROM t0;.    S
17330 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
17340 52 4f 4d 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22  ROM t$limit;.  "
17350 0a 7d 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f  .}.proc test_on_
17360 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e  update_recursion
17370 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f   {limit} {.  dro
17380 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
17390 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
173a0 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
173b0 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
173c0 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
173d0 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55  ERT INTO t0 VALU
173e0 45 53 28 27 78 78 78 27 29 3b 0a 20 20 7d 0a 20  ES('xxx');.  }. 
173f0 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b   for {set i 1} {
17400 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69  $i <= $limit} {i
17410 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74  ncr i} {.    set
17420 20 6a 20 5b 65 78 70 72 20 24 69 2d 31 5d 0a 0a   j [expr $i-1]..
17430 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
17440 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
17450 20 74 24 69 20 28 61 20 50 52 49 4d 41 52 59 20   t$i (a PRIMARY 
17460 4b 45 59 20 52 45 46 45 52 45 4e 43 45 53 20 74  KEY REFERENCES t
17470 24 6a 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  $j ON UPDATE CAS
17480 43 41 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53  CADE);.      INS
17490 45 52 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c  ERT INTO t$i VAL
174a0 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20 20 20  UES('xxx');.    
174b0 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ".  }.  execsql 
174c0 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71  COMMIT.  catchsq
174d0 6c 20 22 0a 20 20 20 20 55 50 44 41 54 45 20 74  l ".    UPDATE t
174e0 30 20 53 45 54 20 61 20 3d 20 27 79 79 79 27 3b  0 SET a = 'yyy';
174f0 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 4f 54 20  .    SELECT NOT 
17500 28 61 3d 27 79 79 79 27 29 20 46 52 4f 4d 20 74  (a='yyy') FROM t
17510 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 0a 64  $limit;.  ".}..d
17520 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17530 2e 31 2e 31 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .1.1 {.  test_on
17540 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f  _delete_recursio
17550 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  n $SQLITE_MAX_TR
17560 49 47 47 45 52 5f 44 45 50 54 48 0a 7d 20 7b 30  IGGER_DEPTH.} {0
17570 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   0}.do_test e_fk
17580 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20 74 65  ey-63.1.2 {.  te
17590 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
175a0 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51  ursion [expr $SQ
175b0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
175c0 5f 44 45 50 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b  _DEPTH+1].} {1 {
175d0 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
175e0 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
175f0 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  sion}}.do_test e
17600 5f 66 6b 65 79 2d 36 33 2e 31 2e 33 20 7b 0a 20  _fkey-63.1.3 {. 
17610 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64   sqlite3_limit d
17620 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  b SQLITE_LIMIT_T
17630 52 49 47 47 45 52 5f 44 45 50 54 48 20 35 0a 20  RIGGER_DEPTH 5. 
17640 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f   test_on_delete_
17650 72 65 63 75 72 73 69 6f 6e 20 35 0a 7d 20 7b 30  recursion 5.} {0
17660 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   0}.do_test e_fk
17670 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20 74 65  ey-63.1.4 {.  te
17680 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
17690 75 72 73 69 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74  ursion 6.} {1 {t
176a0 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
176b0 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
176c0 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  ion}}.do_test e_
176d0 66 6b 65 79 2d 36 33 2e 31 2e 35 20 7b 0a 20 20  fkey-63.1.5 {.  
176e0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62  sqlite3_limit db
176f0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
17700 49 47 47 45 52 5f 44 45 50 54 48 20 31 30 30 30  IGGER_DEPTH 1000
17710 30 30 30 0a 7d 20 7b 35 7d 0a 64 6f 5f 74 65 73  000.} {5}.do_tes
17720 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 31 20  t e_fkey-63.2.1 
17730 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61  {.  test_on_upda
17740 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51  te_recursion $SQ
17750 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
17760 5f 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d 0a 64  _DEPTH.} {0 0}.d
17770 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17780 2e 32 2e 32 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .2.2 {.  test_on
17790 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f  _update_recursio
177a0 6e 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  n [expr $SQLITE_
177b0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
177c0 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d  H+1].} {1 {too m
177d0 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
177e0 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
177f0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
17800 2d 36 33 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69  -63.2.3 {.  sqli
17810 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te3_limit db SQL
17820 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
17830 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65 73 74  R_DEPTH 5.  test
17840 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72  _on_update_recur
17850 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d 0a 64  sion 5.} {0 0}.d
17860 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17870 2e 32 2e 34 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .2.4 {.  test_on
17880 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f  _update_recursio
17890 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61  n 6.} {1 {too ma
178a0 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
178b0 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d  gger recursion}}
178c0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
178d0 36 33 2e 32 2e 35 20 7b 0a 20 20 73 71 6c 69 74  63.2.5 {.  sqlit
178e0 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49  e3_limit db SQLI
178f0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
17900 5f 44 45 50 54 48 20 31 30 30 30 30 30 30 0a 7d  _DEPTH 1000000.}
17910 20 7b 35 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {5}..#---------
17920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17960 0a 23 20 54 68 65 20 73 65 74 74 69 6e 67 20 6f  .# The setting o
17970 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 5f  f the recursive_
17980 74 72 69 67 67 65 72 73 20 70 72 61 67 6d 61 20  triggers pragma 
17990 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
179a0 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20 61 63  foreign.# key ac
179b0 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  tions..#.# EVIDE
179c0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 37 36 39 2d  NCE-OF: R-51769-
179d0 33 32 37 33 30 20 54 68 65 20 50 52 41 47 4d 41  32730 The PRAGMA
179e0 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
179f0 65 72 73 20 73 65 74 74 69 6e 67 20 64 6f 65 73  ers setting does
17a00 0a 23 20 6e 6f 74 20 6e 6f 74 20 61 66 66 65 63  .# not not affec
17a10 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
17a20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  of foreign key a
17a30 63 74 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65 61 63  ctions..#.foreac
17a40 68 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  h recursive_trig
17a50 67 65 72 73 5f 73 65 74 74 69 6e 67 20 5b 6c 69  gers_setting [li
17a60 73 74 20 30 20 31 20 4f 4e 20 4f 46 46 5d 20 7b  st 0 1 ON OFF] {
17a70 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
17a80 65 73 0a 20 20 65 78 65 63 73 71 6c 20 22 50 52  es.  execsql "PR
17a90 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
17aa0 72 69 67 67 65 72 73 20 3d 20 24 72 65 63 75 72  riggers = $recur
17ab0 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65  sive_triggers_se
17ac0 74 74 69 6e 67 22 0a 0a 20 20 64 6f 5f 74 65 73  tting"..  do_tes
17ad0 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72 65 63  t e_fkey-64.$rec
17ae0 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f  ursive_triggers_
17af0 73 65 74 74 69 6e 67 2e 31 20 7b 0a 20 20 20 20  setting.1 {.    
17b00 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
17b10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
17b20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
17b30 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f   REFERENCES t1 O
17b40 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
17b50 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
17b60 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
17b70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49  , NULL);.      I
17b80 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
17b90 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20 20  LUES(2, 1);.    
17ba0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17bb0 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b 0a 20   VALUES(3, 2);. 
17bc0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17bd0 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 33 29   t1 VALUES(4, 3)
17be0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
17bf0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
17c00 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   4);.      SELEC
17c10 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
17c20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 35  t1;.    }.  } {5
17c30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17c40 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65  ey-64.$recursive
17c50 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e  _triggers_settin
17c60 67 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  g.2 {.    execsq
17c70 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
17c80 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
17c90 45 20 61 20 3d 20 31 20 7d 0a 20 20 7d 20 7b 31  E a = 1 }.  } {1
17ca0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17cb0 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65  ey-64.$recursive
17cc0 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e  _triggers_settin
17cd0 67 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  g.3 {.    execsq
17ce0 6c 20 7b 20 0a 20 20 20 20 20 20 44 45 4c 45 54  l { .      DELET
17cf0 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
17d00 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c  a = 1;.      SEL
17d10 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17d20 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
17d30 7b 30 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  {0}.}..finish_te
17d40 73 74 0a                                         st.