/ Hex Artifact Content
Login

Artifact 89a2ff734a33693b997534eff90724573948be7b:


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 20 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73  t (~1000000 rows
8290: 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 43 41  )} .  0 0 0 {SCA
82a0: 4e 20 54 41 42 4c 45 20 74 72 61 63 6b 20 28 7e  N TABLE track (~
82b0: 31 30 30 30 30 30 20 72 6f 77 73 29 7d 0a 7d 0a  100000 rows)}.}.
82c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
82d0: 65 5f 66 6b 65 79 2d 32 35 2e 33 20 7b 0a 20 20  e_fkey-25.3 {.  
82e0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
82f0: 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 45 58 50 4c  eys = ON;.  EXPL
8300: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44  AIN QUERY PLAN D
8310: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
8320: 74 20 57 48 45 52 45 20 31 3b 0a 7d 20 7b 0a 20  t WHERE 1;.} {. 
8330: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
8340: 4c 45 20 61 72 74 69 73 74 20 28 7e 31 30 30 30  LE artist (~1000
8350: 30 30 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20  000 rows)} .  0 
8360: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
8370: 74 72 61 63 6b 20 28 7e 31 30 30 30 30 30 20 72  track (~100000 r
8380: 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  ows)}.}.do_test 
8390: 65 5f 66 6b 65 79 2d 32 35 2e 34 20 7b 0a 20 20  e_fkey-25.4 {.  
83a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
83b0: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
83c0: 20 56 41 4c 55 45 53 28 35 2c 20 27 61 72 74 69   VALUES(5, 'arti
83d0: 73 74 20 35 27 29 3b 0a 20 20 20 20 49 4e 53 45  st 5');.    INSE
83e0: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
83f0: 41 4c 55 45 53 28 36 2c 20 27 61 72 74 69 73 74  ALUES(6, 'artist
8400: 20 36 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   6');.    INSERT
8410: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
8420: 55 45 53 28 37 2c 20 27 61 72 74 69 73 74 20 37  UES(7, 'artist 7
8430: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
8440: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
8450: 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 35  (1, 'track 1', 5
8460: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8470: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
8480: 32 2c 20 27 74 72 61 63 6b 20 32 27 2c 20 36 29  2, 'track 2', 6)
8490: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
84a0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 35 20  est e_fkey-25.5 
84b0: 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20  {.  concat \.   
84c0: 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45   [execsql { SELE
84d0: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72  CT rowid FROM tr
84e0: 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61  ack WHERE tracka
84f0: 72 74 69 73 74 20 3d 20 35 20 7d 5d 20 20 20 5c  rtist = 5 }]   \
8500: 0a 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b  .    [catchsql {
8510: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
8520: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
8530: 69 64 20 3d 20 35 20 7d 5d 0a 7d 20 7b 31 20 31  id = 5 }].} {1 1
8540: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
8550: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
8560: 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }..do_test e_fke
8570: 79 2d 32 35 2e 36 20 7b 0a 20 20 63 6f 6e 63 61  y-25.6 {.  conca
8580: 74 20 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c  t \.    [execsql
8590: 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20   { SELECT rowid 
85a0: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
85b0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 37   trackartist = 7
85c0: 20 7d 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74   }]   \.    [cat
85d0: 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
85e0: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
85f0: 20 61 72 74 69 73 74 69 64 20 3d 20 37 20 7d 5d   artistid = 7 }]
8600: 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65  .} {0 {}}..do_te
8610: 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 37 20 7b  st e_fkey-25.7 {
8620: 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20  .  concat \.    
8630: 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  [execsql { SELEC
8640: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61  T rowid FROM tra
8650: 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72  ck WHERE trackar
8660: 74 69 73 74 20 3d 20 36 20 7d 5d 20 20 20 5c 0a  tist = 6 }]   \.
8670: 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20      [catchsql { 
8680: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
8690: 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69  st WHERE artisti
86a0: 64 20 3d 20 36 20 7d 5d 0a 7d 20 7b 32 20 31 20  d = 6 }].} {2 1 
86b0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
86c0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
86d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
8720: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
8730: 39 33 36 2d 31 30 30 34 34 20 4f 72 2c 20 6d 6f  936-10044 Or, mo
8740: 72 65 20 67 65 6e 65 72 61 6c 6c 79 3a 0a 23 20  re generally:.# 
8750: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
8760: 4d 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20  M <child-table> 
8770: 57 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79  WHERE <child-key
8780: 3e 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f  > = :parent_key_
8790: 76 61 6c 75 65 0a 23 0a 23 20 54 65 73 74 20 74  value.#.# Test t
87a0: 68 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69  hat when a row i
87b0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  s deleted from t
87c0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
87d0: 6f 66 20 61 6e 20 46 4b 20 0a 23 20 63 6f 6e 73  of an FK .# cons
87e0: 74 72 61 69 6e 74 2c 20 74 68 65 20 63 68 69 6c  traint, the chil
87f0: 64 20 74 61 62 6c 65 20 69 73 20 71 75 65 72 69  d table is queri
8800: 65 64 20 66 6f 72 20 6f 72 70 68 61 6e 65 64 20  ed for orphaned 
8810: 72 6f 77 73 2e 20 54 68 65 0a 23 20 71 75 65 72  rows. The.# quer
8820: 79 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  y is equivalent 
8830: 74 6f 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43 54  to:.#.#   SELECT
8840: 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69   rowid FROM <chi
8850: 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20  ld-table> WHERE 
8860: 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70  <child-key> = :p
8870: 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a  arent_key_value.
8880: 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68  #.# Also test th
8890: 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73  at when a row is
88a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
88b0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c  he parent table,
88c0: 20 6f 72 20 77 68 65 6e 20 74 68 65 20 0a 23 20   or when the .# 
88d0: 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65  parent key value
88e0: 73 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  s of an existing
88f0: 20 72 6f 77 20 61 72 65 20 6d 6f 64 69 66 69 65   row are modifie
8900: 64 2c 20 61 20 71 75 65 72 79 20 65 71 75 69 76  d, a query equiv
8910: 61 6c 65 6e 74 0a 23 20 74 6f 20 74 68 65 20 66  alent.# to the f
8920: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 70 6c 61 6e  ollowing is plan
8930: 6e 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ned. In some cas
8940: 65 73 20 69 74 20 69 73 20 6e 6f 74 20 65 78 65  es it is not exe
8950: 63 75 74 65 64 2c 20 62 75 74 20 69 74 0a 23 20  cuted, but it.# 
8960: 69 73 20 61 6c 77 61 79 73 20 70 6c 61 6e 6e 65  is always planne
8970: 64 2e 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20  d..#.#   SELECT 
8980: 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c  rowid FROM <chil
8990: 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c  d-table> WHERE <
89a0: 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61  child-key> = :pa
89b0: 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23  rent_key_value.#
89c0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
89d0: 52 2d 36 31 36 31 36 2d 34 36 37 30 30 20 53 69  R-61616-46700 Si
89e0: 6d 69 6c 61 72 20 71 75 65 72 69 65 73 20 6d 61  milar queries ma
89f0: 79 20 62 65 20 72 75 6e 20 69 66 20 74 68 65 20  y be run if the 
8a00: 63 6f 6e 74 65 6e 74 0a 23 20 6f 66 20 74 68 65  content.# of the
8a10: 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6d   parent key is m
8a20: 6f 64 69 66 69 65 64 20 6f 72 20 61 20 6e 65 77  odified or a new
8a30: 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
8a40: 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
8a50: 0a 23 20 74 61 62 6c 65 2e 0a 23 0a 23 0a 64 72  .# table..#.#.dr
8a60: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
8a70: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e  _test e_fkey-26.
8a80: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
8a90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
8aa0: 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  ent(x, y, UNIQUE
8ab0: 28 79 2c 20 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66  (y, x)) }.} {}.f
8ac0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
8ad0: 7b 0a 20 20 32 20 7b 20 0a 20 20 20 20 43 52 45  {.  2 { .    CRE
8ae0: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
8af0: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
8b00: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
8b10: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29  ES parent(x, y))
8b20: 0a 20 20 7d 0a 20 20 33 20 7b 20 0a 20 20 20 20  .  }.  3 { .    
8b30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
8b40: 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  ld(a, b, FOREIGN
8b50: 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52   KEY(a, b) REFER
8b60: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20  ENCES parent(x, 
8b70: 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  y));.    CREATE 
8b80: 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20  INDEX childi ON 
8b90: 63 68 69 6c 64 28 61 2c 20 62 29 3b 0a 20 20 7d  child(a, b);.  }
8ba0: 0a 20 20 34 20 7b 20 0a 20 20 20 20 43 52 45 41  .  4 { .    CREA
8bb0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61  TE TABLE child(a
8bc0: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
8bd0: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
8be0: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b  S parent(x, y));
8bf0: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
8c00: 55 45 20 49 4e 44 45 58 20 63 68 69 6c 64 69 20  UE INDEX childi 
8c10: 4f 4e 20 63 68 69 6c 64 28 62 2c 20 61 29 3b 0a  ON child(b, a);.
8c20: 20 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71    }.} {.  execsq
8c30: 6c 20 24 73 71 6c 0a 0a 20 20 65 78 65 63 73 71  l $sql..  execsq
8c40: 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69 67  l {PRAGMA foreig
8c50: 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20  n_keys = OFF}.  
8c60: 73 65 74 20 64 65 6c 65 74 65 20 5b 63 6f 6e 63  set delete [conc
8c70: 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20  at \.      [eqp 
8c80: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
8c90: 65 6e 74 20 57 48 45 52 45 20 31 22 5d 20 5c 0a  ent WHERE 1"] \.
8ca0: 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45        [eqp "SELE
8cb0: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68  CT rowid FROM ch
8cc0: 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20  ild WHERE a = ? 
8cd0: 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a  AND b = ?"].  ].
8ce0: 20 20 73 65 74 20 75 70 64 61 74 65 20 5b 63 6f    set update [co
8cf0: 6e 63 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71  ncat \.      [eq
8d00: 70 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  p "UPDATE parent
8d10: 20 53 45 54 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20   SET x=?, y=?"] 
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 20 5c 0a  ? AND b = ?"] \.
8d60: 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45        [eqp "SELE
8d70: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68  CT rowid FROM ch
8d80: 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20  ild WHERE a = ? 
8d90: 41 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a  AND b = ?"].  ].
8da0: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
8db0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
8dc0: 20 4f 4e 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20   ON}..  do_test 
8dd0: 65 5f 66 6b 65 79 2d 32 36 2e 24 74 6e 2e 31 20  e_fkey-26.$tn.1 
8de0: 7b 20 65 71 70 20 22 44 45 4c 45 54 45 20 46 52  { eqp "DELETE FR
8df0: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
8e00: 31 22 20 7d 20 24 64 65 6c 65 74 65 0a 20 20 64  1" } $delete.  d
8e10: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36  o_test e_fkey-26
8e20: 2e 24 74 6e 2e 32 20 7b 20 65 71 70 20 22 55 50  .$tn.2 { eqp "UP
8e30: 44 41 54 45 20 70 61 72 65 6e 74 20 73 65 74 20  DATE parent set 
8e40: 78 3d 3f 2c 20 79 3d 3f 22 20 7d 20 24 75 70 64  x=?, y=?" } $upd
8e50: 61 74 65 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  ate..  execsql {
8e60: 44 52 4f 50 20 54 41 42 4c 45 20 63 68 69 6c 64  DROP TABLE child
8e70: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8ec0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8ed0: 2d 31 34 35 35 33 2d 33 34 30 31 33 0a 23 0a 23  -14553-34013.#.#
8ee0: 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c   Test the exampl
8ef0: 65 20 73 63 68 65 6d 61 20 61 74 20 74 68 65 20  e schema at the 
8f00: 65 6e 64 20 6f 66 20 73 65 63 74 69 6f 6e 20 33  end of section 3
8f10: 2e 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74  . Also test that
8f20: 20 69 73 0a 23 20 69 73 20 22 65 66 66 69 63 69   is.# is "effici
8f30: 65 6e 74 22 2e 20 49 6e 20 74 68 69 73 20 63 61  ent". In this ca
8f40: 73 65 20 22 65 66 66 69 63 69 65 6e 74 22 20 6d  se "efficient" m
8f50: 65 61 6e 73 20 74 68 61 74 20 66 6f 72 65 69 67  eans that foreig
8f60: 6e 20 6b 65 79 0a 23 20 72 65 6c 61 74 65 64 20  n key.# related 
8f70: 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68  operations on th
8f80: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64  e parent table d
8f90: 6f 20 6e 6f 74 20 70 72 6f 76 6f 6b 65 20 6c 69  o not provoke li
8fa0: 6e 65 61 72 20 73 63 61 6e 73 2e 0a 23 0a 64 72  near scans..#.dr
8fb0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
8fc0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e  _test e_fkey-27.
8fd0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
8fe0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8ff0: 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61   artist(.      a
9000: 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47  rtistid    INTEG
9010: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
9020: 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d  .      artistnam
9030: 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20  e  TEXT.    );. 
9040: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9050: 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61  track(.      tra
9060: 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52  ckid     INTEGER
9070: 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d  ,.      tracknam
9080: 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
9090: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
90a0: 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53 20  EGER REFERENCES 
90b0: 61 72 74 69 73 74 0a 20 20 20 20 29 3b 0a 20 20  artist.    );.  
90c0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
90d0: 72 61 63 6b 69 6e 64 65 78 20 4f 4e 20 74 72 61  rackindex ON tra
90e0: 63 6b 28 74 72 61 63 6b 61 72 74 69 73 74 29 3b  ck(trackartist);
90f0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
9100: 74 20 65 5f 66 6b 65 79 2d 32 37 2e 32 20 7b 0a  t e_fkey-27.2 {.
9110: 20 20 65 71 70 20 7b 20 49 4e 53 45 52 54 20 49    eqp { INSERT I
9120: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
9130: 53 28 3f 2c 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64  S(?, ?) }.} {}.d
9140: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9150: 5f 66 6b 65 79 2d 32 37 2e 33 20 7b 0a 20 20 45  _fkey-27.3 {.  E
9160: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9170: 4e 20 55 50 44 41 54 45 20 61 72 74 69 73 74 20  N UPDATE artist 
9180: 53 45 54 20 61 72 74 69 73 74 69 64 20 3d 20 3f  SET artistid = ?
9190: 2c 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 3f  , artistname = ?
91a0: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
91b0: 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74 20  AN TABLE artist 
91c0: 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d  (~1000000 rows)}
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 20 28 7e  rackartist=?) (~
9220: 31 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 30  10 rows)} .  0 0
9230: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
9240: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f 56   track USING COV
9250: 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61 63  ERING INDEX trac
9260: 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72 74  kindex (trackart
9270: 69 73 74 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73  ist=?) (~10 rows
9280: 29 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  )}.}.do_execsql_
9290: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 34  test e_fkey-27.4
92a0: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
92b0: 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20 46  RY PLAN DELETE F
92c0: 52 4f 4d 20 61 72 74 69 73 74 0a 7d 20 7b 0a 20  ROM artist.} {. 
92d0: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
92e0: 4c 45 20 61 72 74 69 73 74 20 28 7e 31 30 30 30  LE artist (~1000
92f0: 30 30 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20  000 rows)} .  0 
9300: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
9310: 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f  E track USING CO
9320: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61  VERING INDEX tra
9330: 63 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72  ckindex (trackar
9340: 74 69 73 74 3d 3f 29 20 28 7e 31 30 20 72 6f 77  tist=?) (~10 row
9350: 73 29 7d 0a 7d 0a 0a 0a 23 23 23 23 23 23 23 23  s)}.}...########
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 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
93b0: 34 2e 31 3a 20 43 6f 6d 70 6f 73 69 74 65 20 46  4.1: Composite F
93c0: 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74  oreign Key Const
93d0: 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23  raints.#########
93e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9420: 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ##..#-----------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9470: 20 43 68 65 63 6b 20 74 68 61 74 20 70 61 72 65   Check that pare
9480: 6e 74 20 61 6e 64 20 63 68 69 6c 64 20 6b 65 79  nt and child key
9490: 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  s must have the 
94a0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63  same number of c
94b0: 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45 56 49 44  olumns..#.# EVID
94c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 30 36 32  ENCE-OF: R-41062
94d0: 2d 33 34 34 33 31 20 50 61 72 65 6e 74 20 61 6e  -34431 Parent an
94e0: 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 75 73  d child keys mus
94f0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
9500: 23 20 63 61 72 64 69 6e 61 6c 69 74 79 2e 0a 23  # cardinality..#
9510: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c  .foreach {tn sql
9520: 20 65 72 72 7d 20 7b 0a 20 20 31 20 22 43 52 45   err} {.  1 "CRE
9530: 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52  ATE TABLE c(jj R
9540: 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 20 79  EFERENCES p(x, y
9550: 29 29 22 20 0a 20 20 20 20 7b 66 6f 72 65 69 67  ))" .    {foreig
9560: 6e 20 6b 65 79 20 6f 6e 20 6a 6a 20 73 68 6f 75  n key on jj shou
9570: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
9580: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
9590: 74 61 62 6c 65 20 70 7d 0a 0a 20 20 32 20 22 43  table p}..  2 "C
95a0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a  REATE TABLE c(jj
95b0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 29 29   REFERENCES p())
95c0: 22 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79 6e  " {near ")": syn
95d0: 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 33 20  tax error}..  3 
95e0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  "CREATE TABLE c(
95f0: 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  jj, FOREIGN KEY(
9600: 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  jj) REFERENCES p
9610: 28 78 2c 20 79 29 29 22 20 0a 20 20 20 20 7b 6e  (x, y))" .    {n
9620: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9630: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
9640: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
9650: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9660: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
9670: 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20  renced table}.. 
9680: 20 34 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   4 "CREATE TABLE
9690: 20 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b   c(jj, FOREIGN K
96a0: 45 59 28 6a 6a 29 20 52 45 46 45 52 45 4e 43 45  EY(jj) REFERENCE
96b0: 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65  S p())" .    {ne
96c0: 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65  ar ")": syntax e
96d0: 72 72 6f 72 7d 0a 0a 20 20 35 20 22 43 52 45 41  rror}..  5 "CREA
96e0: 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a  TE TABLE c(ii, j
96f0: 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  j, FOREIGN KEY(j
9700: 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43 45  j, ii) REFERENCE
9710: 53 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65  S p())" .    {ne
9720: 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65  ar ")": syntax e
9730: 72 72 6f 72 7d 0a 0a 20 20 36 20 22 43 52 45 41  rror}..  6 "CREA
9740: 54 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a  TE TABLE c(ii, j
9750: 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  j, FOREIGN KEY(j
9760: 6a 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43 45  j, ii) REFERENCE
9770: 53 20 70 28 78 29 29 22 20 0a 20 20 20 20 7b 6e  S p(x))" .    {n
9780: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9790: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
97a0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
97b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
97c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
97d0: 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20  renced table}.. 
97e0: 20 37 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   7 "CREATE TABLE
97f0: 20 63 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49   c(ii, jj, FOREI
9800: 47 4e 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52  GN KEY(jj, ii) R
9810: 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 79 2c  EFERENCES p(x,y,
9820: 7a 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65  z))" .    {numbe
9830: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9840: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
9850: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
9860: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9870: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
9880: 65 64 20 74 61 62 6c 65 7d 0a 7d 20 7b 0a 20 20  ed table}.} {.  
9890: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
98a0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
98b0: 2d 32 38 2e 24 74 6e 20 5b 6c 69 73 74 20 63 61  -28.$tn [list ca
98c0: 74 63 68 73 71 6c 20 24 73 71 6c 5d 20 5b 6c 69  tchsql $sql] [li
98d0: 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a 64 6f 5f  st 1 $err].}.do_
98e0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 38  test e_fkey-28.8
98f0: 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
9900: 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  bles.  execsql {
9910: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9920: 45 20 70 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E p(x PRIMARY KE
9930: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
9940: 41 42 4c 45 20 63 28 61 2c 20 62 2c 20 46 4f 52  ABLE c(a, b, FOR
9950: 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45  EIGN KEY(a,b) RE
9960: 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d  FERENCES p);.  }
9970: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c  .  catchsql {DEL
9980: 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31  ETE FROM p}.} {1
9990: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
99a0: 73 6d 61 74 63 68 20 2d 20 22 63 22 20 72 65 66  smatch - "c" ref
99b0: 65 72 65 6e 63 69 6e 67 20 22 70 22 7d 7d 0a 64  erencing "p"}}.d
99c0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38  o_test e_fkey-28
99d0: 2e 39 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .9 {.  drop_all_
99e0: 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
99f0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
9a00: 42 4c 45 20 70 28 78 2c 20 79 2c 20 50 52 49 4d  BLE p(x, y, PRIM
9a10: 41 52 59 20 4b 45 59 28 78 2c 79 29 29 3b 0a 20  ARY KEY(x,y));. 
9a20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9a30: 63 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(a REFERENCES p
9a40: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
9a50: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  l {DELETE FROM p
9a60: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
9a70: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
9a80: 63 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  c" referencing "
9a90: 70 22 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  p"}}...#--------
9aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ae0: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
9af0: 20 52 2d 32 34 36 37 36 2d 30 39 38 35 39 0a 23   R-24676-09859.#
9b00: 0a 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d  .# Test the exam
9b10: 70 6c 65 20 73 63 68 65 6d 61 20 69 6e 20 74 68  ple schema in th
9b20: 65 20 22 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72  e "Composite For
9b30: 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61  eign Key Constra
9b40: 69 6e 74 73 22 20 0a 23 20 73 65 63 74 69 6f 6e  ints" .# section
9b50: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..#.do_test e_fk
9b60: 65 79 2d 32 39 2e 31 20 7b 0a 20 20 65 78 65 63  ey-29.1 {.  exec
9b70: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
9b80: 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a 20 20   TABLE album(.  
9b90: 20 20 20 20 61 6c 62 75 6d 61 72 74 69 73 74 20      albumartist 
9ba0: 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c 62 75  TEXT,.      albu
9bb0: 6d 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20  mname TEXT,.    
9bc0: 20 20 61 6c 62 75 6d 63 6f 76 65 72 20 42 49 4e    albumcover BIN
9bd0: 41 52 59 2c 0a 20 20 20 20 20 20 50 52 49 4d 41  ARY,.      PRIMA
9be0: 52 59 20 4b 45 59 28 61 6c 62 75 6d 61 72 74 69  RY KEY(albumarti
9bf0: 73 74 2c 20 61 6c 62 75 6d 6e 61 6d 65 29 0a 20  st, albumname). 
9c00: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
9c10: 20 54 41 42 4c 45 20 73 6f 6e 67 28 0a 20 20 20   TABLE song(.   
9c20: 20 20 20 73 6f 6e 67 69 64 20 49 4e 54 45 47 45     songid INTEGE
9c30: 52 2c 0a 20 20 20 20 20 20 73 6f 6e 67 61 72 74  R,.      songart
9c40: 69 73 74 20 54 45 58 54 2c 0a 20 20 20 20 20 20  ist TEXT,.      
9c50: 73 6f 6e 67 61 6c 62 75 6d 20 54 45 58 54 2c 0a  songalbum TEXT,.
9c60: 20 20 20 20 20 20 73 6f 6e 67 6e 61 6d 65 20 54        songname T
9c70: 45 58 54 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  EXT,.      FOREI
9c80: 47 4e 20 4b 45 59 28 73 6f 6e 67 61 72 74 69 73  GN KEY(songartis
9c90: 74 2c 20 73 6f 6e 67 61 6c 62 75 6d 29 20 52 45  t, songalbum) RE
9ca0: 46 45 52 45 4e 43 45 53 20 61 6c 62 75 6d 28 61  FERENCES album(a
9cb0: 6c 62 75 6d 61 72 74 69 73 74 2c 61 6c 62 75 6d  lbumartist,album
9cc0: 6e 61 6d 65 29 0a 20 20 20 20 29 3b 0a 20 20 7d  name).    );.  }
9cd0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  .} {}..do_test e
9ce0: 5f 66 6b 65 79 2d 32 39 2e 32 20 7b 0a 20 20 65  _fkey-29.2 {.  e
9cf0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
9d00: 45 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56  ERT INTO album V
9d10: 41 4c 55 45 53 28 27 45 6c 76 69 73 20 50 72 65  ALUES('Elvis Pre
9d20: 73 6c 65 79 27 2c 20 27 45 6c 76 69 73 27 27 20  sley', 'Elvis'' 
9d30: 43 68 72 69 73 74 6d 61 73 20 41 6c 62 75 6d 27  Christmas Album'
9d40: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
9d50: 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41  ERT INTO song VA
9d60: 4c 55 45 53 28 0a 20 20 20 20 20 20 31 2c 20 27  LUES(.      1, '
9d70: 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27 2c 20  Elvis Presley', 
9d80: 27 45 6c 76 69 73 27 27 20 43 68 72 69 73 74 6d  'Elvis'' Christm
9d90: 61 73 20 41 6c 62 75 6d 27 2c 20 27 48 65 72 65  as Album', 'Here
9da0: 20 43 6f 6d 65 73 20 53 61 6e 74 61 20 43 6c 61   Comes Santa Cla
9db0: 75 73 65 27 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  use'.    );.  }.
9dc0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
9dd0: 6b 65 79 2d 32 39 2e 33 20 7b 0a 20 20 63 61 74  key-29.3 {.  cat
9de0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
9df0: 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c  RT INTO song VAL
9e00: 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20 50 72  UES(2, 'Elvis Pr
9e10: 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73 20 49  esley', 'Elvis I
9e20: 73 20 42 61 63 6b 21 27 2c 20 27 46 65 76 65 72  s Back!', 'Fever
9e30: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f  ');.  }.} {1 {fo
9e40: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
9e50: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 0a  aint failed}}...
9e60: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
9e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
9eb0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36 32  DENCE-OF: R-3362
9ec0: 36 2d 34 38 34 31 38 20 49 6e 20 53 51 4c 69 74  6-48418 In SQLit
9ed0: 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
9ee0: 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d   child key colum
9ef0: 6e 73 0a 23 20 28 69 6e 20 74 68 69 73 20 63 61  ns.# (in this ca
9f00: 73 65 20 73 6f 6e 67 61 72 74 69 73 74 20 61 6e  se songartist an
9f10: 64 20 73 6f 6e 67 61 6c 62 75 6d 29 20 61 72 65  d songalbum) are
9f20: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 72   NULL, then ther
9f30: 65 20 69 73 20 6e 6f 0a 23 20 72 65 71 75 69 72  e is no.# requir
9f40: 65 6d 65 6e 74 20 66 6f 72 20 61 20 63 6f 72 72  ement for a corr
9f50: 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 20 69 6e  esponding row in
9f60: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
9f70: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  e..#.do_test e_f
9f80: 6b 65 79 2d 33 30 2e 31 20 7b 0a 20 20 65 78 65  key-30.1 {.  exe
9f90: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
9fa0: 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55  T INTO song VALU
9fb0: 45 53 28 32 2c 20 27 45 6c 76 69 73 20 50 72 65  ES(2, 'Elvis Pre
9fc0: 73 6c 65 79 27 2c 20 4e 55 4c 4c 2c 20 27 46 65  sley', NULL, 'Fe
9fd0: 76 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ver');.    INSER
9fe0: 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55  T INTO song VALU
9ff0: 45 53 28 33 2c 20 4e 55 4c 4c 2c 20 27 45 6c 76  ES(3, NULL, 'Elv
a000: 69 73 20 49 73 20 42 61 63 6b 27 2c 20 27 53 6f  is Is Back', 'So
a010: 6c 64 69 65 72 20 42 6f 79 27 29 3b 0a 20 20 7d  ldier Boy');.  }
a020: 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23  .} {}..#########
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 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34  ##.### SECTION 4
a080: 2e 32 3a 20 44 65 66 65 72 72 65 64 20 46 6f 72  .2: Deferred For
a090: 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61  eign Key Constra
a0a0: 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23 23  ints.###########
a0b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0f0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
a140: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73 74  est that if a st
a150: 61 74 65 6d 65 6e 74 20 76 69 6f 6c 61 74 65 73  atement violates
a160: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 46 4b   an immediate FK
a170: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 61 6e 64   constraint, and
a180: 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20   the.# database 
a190: 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
a1a0: 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61 69   the FK constrai
a1b0: 6e 74 20 6f 6e 63 65 20 61 6c 6c 20 65 66 66 65  nt once all effe
a1c0: 63 74 73 20 6f 66 20 74 68 65 0a 23 20 73 74 61  cts of the.# sta
a1d0: 74 65 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e  tement have been
a1e0: 20 61 70 70 6c 69 65 64 2c 20 61 6e 20 65 72 72   applied, an err
a1f0: 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 61  or is reported a
a200: 6e 64 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  nd the effects o
a210: 66 0a 23 20 74 68 65 20 73 74 61 74 65 6d 65 6e  f.# the statemen
a220: 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23  t rolled back..#
a230: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
a240: 52 2d 30 39 33 32 33 2d 33 30 34 37 30 20 49 66  R-09323-30470 If
a250: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64   a statement mod
a260: 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  ifies the conten
a270: 74 73 20 6f 66 20 74 68 65 0a 23 20 64 61 74 61  ts of the.# data
a280: 62 61 73 65 20 73 6f 20 74 68 61 74 20 61 6e 20  base so that an 
a290: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
a2a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a2b0: 20 69 73 20 69 6e 20 76 69 6f 6c 61 74 69 6f 6e   is in violation
a2c0: 0a 23 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  .# at the conclu
a2d0: 73 69 6f 6e 20 74 68 65 20 73 74 61 74 65 6d 65  sion the stateme
a2e0: 6e 74 2c 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  nt, an exception
a2f0: 20 69 73 20 74 68 72 6f 77 6e 20 61 6e 64 20 74   is thrown and t
a300: 68 65 0a 23 20 65 66 66 65 63 74 73 20 6f 66 20  he.# effects of 
a310: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 72  the statement ar
a320: 65 20 72 65 76 65 72 74 65 64 2e 0a 23 0a 64 72  e reverted..#.dr
a330: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
a340: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e  _test e_fkey-31.
a350: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
a360: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a370: 20 6b 69 6e 67 28 61 2c 20 62 2c 20 50 52 49 4d   king(a, b, PRIM
a380: 41 52 59 20 4b 45 59 28 61 29 29 3b 0a 20 20 20  ARY KEY(a));.   
a390: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 72   CREATE TABLE pr
a3a0: 69 6e 63 65 28 63 20 52 45 46 45 52 45 4e 43 45  ince(c REFERENCE
a3b0: 53 20 6b 69 6e 67 2c 20 64 29 3b 0a 20 20 7d 0a  S king, d);.  }.
a3c0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  } {}..do_test e_
a3d0: 66 6b 65 79 2d 33 31 2e 32 20 7b 0a 20 20 23 20  fkey-31.2 {.  # 
a3e0: 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d  Execute a statem
a3f0: 65 6e 74 20 74 68 61 74 20 76 69 6f 6c 61 74 65  ent that violate
a400: 73 20 74 68 65 20 69 6d 6d 65 64 69 61 74 65 20  s the immediate 
a410: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  FK constraint.. 
a420: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
a430: 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56  RT INTO prince V
a440: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20  ALUES(1, 2) }.} 
a450: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
a460: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a470: 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66  d}}..do_test e_f
a480: 6b 65 79 2d 33 31 2e 33 20 7b 0a 20 20 23 20 54  key-31.3 {.  # T
a490: 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20 61 20  his time, use a 
a4a0: 74 72 69 67 67 65 72 20 74 6f 20 66 69 78 20 74  trigger to fix t
a4b0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  he constraint vi
a4c0: 6f 6c 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74  olation before t
a4d0: 68 65 0a 20 20 23 20 73 74 61 74 65 6d 65 6e 74  he.  # statement
a4e0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78   has finished ex
a4f0: 65 63 75 74 69 6e 67 2e 20 54 68 65 6e 20 65 78  ecuting. Then ex
a500: 65 63 75 74 65 20 74 68 65 20 73 61 6d 65 20 73  ecute the same s
a510: 74 61 74 65 6d 65 6e 74 20 61 73 0a 20 20 23 20  tatement as.  # 
a520: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
a530: 74 65 73 74 20 63 61 73 65 2e 20 54 68 69 73 20  test case. This 
a540: 74 69 6d 65 2c 20 6e 6f 20 65 72 72 6f 72 2e 0a  time, no error..
a550: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a560: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6b  CREATE TRIGGER k
a570: 74 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  t AFTER INSERT O
a580: 4e 20 70 72 69 6e 63 65 20 57 48 45 4e 0a 20 20  N prince WHEN.  
a590: 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20 28      NOT EXISTS (
a5a0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 6b 69  SELECT a FROM ki
a5b0: 6e 67 20 57 48 45 52 45 20 61 20 3d 20 6e 65 77  ng WHERE a = new
a5c0: 2e 63 29 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  .c).    BEGIN.  
a5d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a5e0: 6b 69 6e 67 20 56 41 4c 55 45 53 28 6e 65 77 2e  king VALUES(new.
a5f0: 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 45 4e  c, NULL);.    EN
a600: 44 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  D.  }.  execsql 
a610: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72  { INSERT INTO pr
a620: 69 6e 63 65 20 56 41 4c 55 45 53 28 31 2c 20 32  ince VALUES(1, 2
a630: 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74  ) }.} {}..# Test
a640: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6e 67 20   that operating 
a650: 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 63  inside a transac
a660: 74 69 6f 6e 20 6d 61 6b 65 73 20 6e 6f 20 64 69  tion makes no di
a670: 66 66 65 72 65 6e 63 65 20 74 6f 20 0a 23 20 69  fference to .# i
a680: 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61  mmediate constra
a690: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 68 61  int violation ha
a6a0: 6e 64 6c 69 6e 67 2e 0a 64 6f 5f 74 65 73 74 20  ndling..do_test 
a6b0: 65 5f 66 6b 65 79 2d 33 31 2e 34 20 7b 0a 20 20  e_fkey-31.4 {.  
a6c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
a6d0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
a6e0: 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c 55  INTO prince VALU
a6f0: 45 53 28 32 2c 20 33 29 3b 0a 20 20 20 20 44 52  ES(2, 3);.    DR
a700: 4f 50 20 54 52 49 47 47 45 52 20 6b 74 3b 0a 20  OP TRIGGER kt;. 
a710: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
a720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e  INSERT INTO prin
a730: 63 65 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  ce VALUES(3, 4) 
a740: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
a750: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
a760: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
a770: 65 5f 66 6b 65 79 2d 33 31 2e 35 20 7b 0a 20 20  e_fkey-31.5 {.  
a780: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f  execsql {.    CO
a790: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54  MMIT;.    SELECT
a7a0: 20 2a 20 46 52 4f 4d 20 6b 69 6e 67 3b 0a 20 20   * FROM king;.  
a7b0: 7d 0a 7d 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a  }.} {1 {} 2 {}}.
a7c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
a810: 73 74 20 74 68 61 74 20 69 66 20 61 20 64 65 66  st that if a def
a820: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
a830: 20 69 73 20 76 69 6f 6c 61 74 65 64 20 77 69 74   is violated wit
a840: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
a850: 6e 2c 0a 23 20 6e 6f 74 68 69 6e 67 20 68 61 70  n,.# nothing hap
a860: 70 65 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  pens immediately
a870: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
a880: 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
a890: 70 65 72 73 69 73 74 0a 23 20 69 6e 20 61 20 73  persist.# in a s
a8a0: 74 61 74 65 20 74 68 61 74 20 64 6f 65 73 20 6e  tate that does n
a8b0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 46  ot satisfy the F
a8c0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 48 6f  K constraint. Ho
a8d0: 77 65 76 65 72 20 61 74 74 65 6d 70 74 73 0a 23  wever attempts.#
a8e0: 20 74 6f 20 43 4f 4d 4d 49 54 20 74 68 65 20 74   to COMMIT the t
a8f0: 72 61 6e 73 61 63 74 69 6f 6e 20 66 61 69 6c 20  ransaction fail 
a900: 75 6e 74 69 6c 20 74 68 65 20 46 4b 20 63 6f 6e  until the FK con
a910: 73 74 72 61 69 6e 74 20 69 73 20 73 61 74 69 73  straint is satis
a920: 66 69 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  fied..#.# EVIDEN
a930: 43 45 2d 4f 46 3a 20 52 2d 34 39 31 37 38 2d 32  CE-OF: R-49178-2
a940: 31 33 35 38 20 42 79 20 63 6f 6e 74 72 61 73 74  1358 By contrast
a950: 2c 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  , if a statement
a960: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 23 20   modifies the.# 
a970: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
a980: 64 61 74 61 62 61 73 65 20 73 75 63 68 20 74 68  database such th
a990: 61 74 20 61 20 64 65 66 65 72 72 65 64 20 66 6f  at a deferred fo
a9a0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a9b0: 61 69 6e 74 0a 23 20 69 73 20 76 69 6f 6c 61 74  aint.# is violat
a9c0: 65 64 2c 20 74 68 65 20 76 69 6f 6c 61 74 69 6f  ed, the violatio
a9d0: 6e 20 69 73 20 6e 6f 74 20 72 65 70 6f 72 74 65  n is not reporte
a9e0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 23  d immediately..#
a9f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
aa00: 52 2d 33 39 36 39 32 2d 31 32 34 38 38 20 44 65  R-39692-12488 De
aa10: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
aa20: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ey constraints a
aa30: 72 65 20 6e 6f 74 0a 23 20 63 68 65 63 6b 65 64  re not.# checked
aa40: 20 75 6e 74 69 6c 20 74 68 65 20 74 72 61 6e 73   until the trans
aa50: 61 63 74 69 6f 6e 20 74 72 69 65 73 20 74 6f 20  action tries to 
aa60: 43 4f 4d 4d 49 54 2e 0a 23 0a 23 20 45 56 49 44  COMMIT..#.# EVID
aa70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 31 34 37  ENCE-OF: R-55147
aa80: 2d 34 37 36 36 34 20 46 6f 72 20 61 73 20 6c 6f  -47664 For as lo
aa90: 6e 67 20 61 73 20 74 68 65 20 75 73 65 72 20 68  ng as the user h
aaa0: 61 73 20 61 6e 20 6f 70 65 6e 0a 23 20 74 72 61  as an open.# tra
aab0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 64 61  nsaction, the da
aac0: 74 61 62 61 73 65 20 69 73 20 61 6c 6c 6f 77 65  tabase is allowe
aad0: 64 20 74 6f 20 65 78 69 73 74 20 69 6e 20 61 20  d to exist in a 
aae0: 73 74 61 74 65 20 74 68 61 74 20 76 69 6f 6c 61  state that viola
aaf0: 74 65 73 0a 23 20 61 6e 79 20 6e 75 6d 62 65 72  tes.# any number
ab00: 20 6f 66 20 64 65 66 65 72 72 65 64 20 66 6f 72   of deferred for
ab10: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
ab20: 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ints..#.# EVIDEN
ab30: 43 45 2d 4f 46 3a 20 52 2d 32 39 36 30 34 2d 33  CE-OF: R-29604-3
ab40: 30 33 39 35 20 48 6f 77 65 76 65 72 2c 20 43 4f  0395 However, CO
ab50: 4d 4d 49 54 20 77 69 6c 6c 20 66 61 69 6c 20 61  MMIT will fail a
ab60: 73 20 6c 6f 6e 67 20 61 73 0a 23 20 66 6f 72 65  s long as.# fore
ab70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
ab80: 6e 74 73 20 72 65 6d 61 69 6e 20 69 6e 20 76 69  nts remain in vi
ab90: 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 70 72 6f 63 20  olation..#.proc 
aba0: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 7b 74  test_efkey_34 {t
abb0: 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b  n isError sql} {
abc0: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
abd0: 79 2d 33 32 2e 24 74 6e 20 22 0a 20 20 20 20 63  y-32.$tn ".    c
abe0: 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20  atchsql {$sql}. 
abf0: 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b   " [lindex {{0 {
ac00: 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  }} {1 {foreign k
ac10: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
ac20: 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72  iled}}} $isError
ac30: 5d 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ].}.drop_all_tab
ac40: 6c 65 73 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f  les..test_efkey_
ac50: 33 34 20 20 31 20 30 20 7b 0a 20 20 43 52 45 41  34  1 0 {.  CREA
ac60: 54 45 20 54 41 42 4c 45 20 6c 6c 28 6b 20 50 52  TE TABLE ll(k PR
ac70: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 43 52  IMARY KEY);.  CR
ac80: 45 41 54 45 20 54 41 42 4c 45 20 6b 6b 28 63 20  EATE TABLE kk(c 
ac90: 52 45 46 45 52 45 4e 43 45 53 20 6c 6c 20 44 45  REFERENCES ll DE
aca0: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
acb0: 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a 7d 0a  LY DEFERRED);.}.
acc0: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 32  test_efkey_34  2
acd0: 20 30 20 22 42 45 47 49 4e 22 0a 74 65 73 74 5f   0 "BEGIN".test_
ace0: 65 66 6b 65 79 5f 33 34 20 20 33 20 30 20 20 20  efkey_34  3 0   
acf0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6b 20  "INSERT INTO kk 
ad00: 56 41 4c 55 45 53 28 35 29 22 0a 74 65 73 74 5f  VALUES(5)".test_
ad10: 65 66 6b 65 79 5f 33 34 20 20 34 20 30 20 20 20  efkey_34  4 0   
ad20: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6b 20  "INSERT INTO kk 
ad30: 56 41 4c 55 45 53 28 31 30 29 22 0a 74 65 73 74  VALUES(10)".test
ad40: 5f 65 66 6b 65 79 5f 33 34 20 20 35 20 31 20 22  _efkey_34  5 1 "
ad50: 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66 6b  COMMIT".test_efk
ad60: 65 79 5f 33 34 20 20 36 20 30 20 20 20 22 49 4e  ey_34  6 0   "IN
ad70: 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41 4c  SERT INTO ll VAL
ad80: 55 45 53 28 31 30 29 22 0a 74 65 73 74 5f 65 66  UES(10)".test_ef
ad90: 6b 65 79 5f 33 34 20 20 37 20 31 20 22 43 4f 4d  key_34  7 1 "COM
ada0: 4d 49 54 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  MIT".test_efkey_
adb0: 33 34 20 20 38 20 30 20 20 20 22 49 4e 53 45 52  34  8 0   "INSER
adc0: 54 20 49 4e 54 4f 20 6c 6c 20 56 41 4c 55 45 53  T INTO ll VALUES
add0: 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  (5)".test_efkey_
ade0: 33 34 20 20 39 20 30 20 22 43 4f 4d 4d 49 54 22  34  9 0 "COMMIT"
adf0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57  ------------.# W
ae40: 68 65 6e 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  hen not running 
ae50: 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 63  inside a transac
ae60: 74 69 6f 6e 2c 20 61 20 64 65 66 65 72 72 65 64  tion, a deferred
ae70: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
ae80: 69 6d 69 6c 61 72 0a 23 20 74 6f 20 61 6e 20 69  imilar.# to an i
ae90: 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61  mmediate constra
aea0: 69 6e 74 20 28 76 69 6f 6c 61 74 69 6f 6e 73 20  int (violations 
aeb0: 61 72 65 20 72 65 70 6f 72 74 65 64 20 69 6d 6d  are reported imm
aec0: 65 64 69 61 74 65 6c 79 29 2e 0a 23 0a 23 20 45  ediately)..#.# E
aed0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36  VIDENCE-OF: R-56
aee0: 38 34 34 2d 36 31 37 30 35 20 49 66 20 74 68 65  844-61705 If the
aef0: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
af00: 6e 74 20 69 73 20 6e 6f 74 20 69 6e 73 69 64 65  nt is not inside
af10: 20 61 6e 0a 23 20 65 78 70 6c 69 63 69 74 20 74   an.# explicit t
af20: 72 61 6e 73 61 63 74 69 6f 6e 20 28 61 20 42 45  ransaction (a BE
af30: 47 49 4e 2f 43 4f 4d 4d 49 54 2f 52 4f 4c 4c 42  GIN/COMMIT/ROLLB
af40: 41 43 4b 20 62 6c 6f 63 6b 29 2c 20 74 68 65 6e  ACK block), then
af50: 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a 23 20 74   an implicit.# t
af60: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
af70: 6d 6d 69 74 74 65 64 20 61 73 20 73 6f 6f 6e 20  mmitted as soon 
af80: 61 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  as the statement
af90: 20 68 61 73 20 66 69 6e 69 73 68 65 64 0a 23 20   has finished.# 
afa0: 65 78 65 63 75 74 69 6e 67 2e 20 49 6e 20 74 68  executing. In th
afb0: 69 73 20 63 61 73 65 20 64 65 66 65 72 72 65 64  is case deferred
afc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 65 68   constraints beh
afd0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a  ave the same as.
afe0: 23 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73  # immediate cons
aff0: 74 72 61 69 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f  traints..#.drop_
b000: 61 6c 6c 5f 74 61 62 6c 65 73 0a 70 72 6f 63 20  all_tables.proc 
b010: 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 7b 74  test_efkey_35 {t
b020: 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b  n isError sql} {
b030: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
b040: 79 2d 33 33 2e 24 74 6e 20 22 0a 20 20 20 20 63  y-33.$tn ".    c
b050: 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20  atchsql {$sql}. 
b060: 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b   " [lindex {{0 {
b070: 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  }} {1 {foreign k
b080: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
b090: 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72  iled}}} $isError
b0a0: 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ].}.do_test e_fk
b0b0: 65 79 2d 33 33 2e 31 20 7b 0a 20 20 65 78 65 63  ey-33.1 {.  exec
b0c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
b0d0: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 2c   TABLE parent(x,
b0e0: 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   y);.    CREATE 
b0f0: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 69 20  UNIQUE INDEX pi 
b100: 4f 4e 20 70 61 72 65 6e 74 28 78 2c 20 79 29 3b  ON parent(x, y);
b110: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b120: 45 20 63 68 69 6c 64 28 61 2c 20 62 2c 0a 20 20  E child(a, b,.  
b130: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
b140: 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  a, b) REFERENCES
b150: 20 70 61 72 65 6e 74 28 78 2c 20 79 29 20 44 45   parent(x, y) DE
b160: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
b170: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
b180: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 74 65 73 74  );.  }.} {}.test
b190: 5f 65 66 6b 65 79 5f 33 35 20 32 20 31 20 22 49  _efkey_35 2 1 "I
b1a0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
b1b0: 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79    VALUES('x', 'y
b1c0: 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33  ')".test_efkey_3
b1d0: 35 20 33 20 30 20 22 49 4e 53 45 52 54 20 49 4e  5 3 0 "INSERT IN
b1e0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b1f0: 28 27 78 27 2c 20 27 79 27 29 22 0a 74 65 73 74  ('x', 'y')".test
b200: 5f 65 66 6b 65 79 5f 33 35 20 34 20 30 20 22 49  _efkey_35 4 0 "I
b210: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
b220: 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79    VALUES('x', 'y
b230: 27 29 22 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ')"...#---------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b290: 52 2d 31 32 37 38 32 2d 36 31 38 34 31 0a 23 0a  R-12782-61841.#.
b2a0: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 46  # Test that an F
b2b0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  K constraint is 
b2c0: 6d 61 64 65 20 64 65 66 65 72 72 65 64 20 62 79  made deferred by
b2d0: 20 61 64 64 69 6e 67 20 74 68 65 20 66 6f 6c 6c   adding the foll
b2e0: 6f 77 69 6e 67 0a 23 20 74 6f 20 74 68 65 20 64  owing.# to the d
b2f0: 65 66 69 6e 69 74 69 6f 6e 3a 0a 23 0a 23 20 20  efinition:.#.#  
b300: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b310: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 23  IALLY DEFERRED.#
b320: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b330: 52 2d 30 39 30 30 35 2d 32 38 37 39 31 0a 23 0a  R-09005-28791.#.
b340: 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74  # Also test that
b350: 20 61 64 64 69 6e 67 20 61 6e 79 20 6f 66 20 74   adding any of t
b360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20  he following to 
b370: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
b380: 66 69 6e 69 74 69 6f 6e 20 0a 23 20 6d 61 6b 65  finition .# make
b390: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
b3a0: 20 49 4d 4d 45 44 49 41 54 45 3a 0a 23 0a 23 20   IMMEDIATE:.#.# 
b3b0: 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45    NOT DEFERRABLE
b3c0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b3d0: 52 45 44 0a 23 20 20 20 4e 4f 54 20 44 45 46 45  RED.#   NOT DEFE
b3e0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b3f0: 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20 20 4e   IMMEDIATE.#   N
b400: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 0a 23 20  OT DEFERRABLE.# 
b410: 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49    DEFERRABLE INI
b420: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b430: 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c 45 0a  .#   DEFERRABLE.
b440: 23 0a 23 20 46 6f 72 65 69 67 6e 20 6b 65 79 73  #.# Foreign keys
b450: 20 61 72 65 20 49 4d 4d 45 44 49 41 54 45 20 62   are IMMEDIATE b
b460: 79 20 64 65 66 61 75 6c 74 20 28 69 66 20 74 68  y default (if th
b470: 65 72 65 20 69 73 20 6e 6f 20 44 45 46 45 52 52  ere is no DEFERR
b480: 41 42 4c 45 20 6f 72 20 4e 4f 54 0a 23 20 44 45  ABLE or NOT.# DE
b490: 46 45 52 52 41 42 4c 45 20 63 6c 61 75 73 65 29  FERRABLE clause)
b4a0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
b4b0: 46 3a 20 52 2d 33 35 32 39 30 2d 31 36 34 36 30  F: R-35290-16460
b4c0: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   Foreign key con
b4d0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 69 6d 6d  straints are imm
b4e0: 65 64 69 61 74 65 20 62 79 0a 23 20 64 65 66 61  ediate by.# defa
b4f0: 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ult..#.# EVIDENC
b500: 45 2d 4f 46 3a 20 52 2d 33 30 33 32 33 2d 32 31  E-OF: R-30323-21
b510: 39 31 37 20 45 61 63 68 20 66 6f 72 65 69 67 6e  917 Each foreign
b520: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
b530: 69 6e 20 53 51 4c 69 74 65 20 69 73 0a 23 20 63  in SQLite is.# c
b540: 6c 61 73 73 69 66 69 65 64 20 61 73 20 65 69 74  lassified as eit
b550: 68 65 72 20 69 6d 6d 65 64 69 61 74 65 20 6f 72  her immediate or
b560: 20 64 65 66 65 72 72 65 64 2e 0a 23 0a 64 72 6f   deferred..#.dro
b570: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
b580: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 34 2e 31  test e_fkey-34.1
b590: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
b5a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b5b0: 70 61 72 65 6e 74 28 78 2c 20 79 2c 20 7a 2c 20  parent(x, y, z, 
b5c0: 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 79 2c  PRIMARY KEY(x,y,
b5d0: 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  z));.    CREATE 
b5e0: 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20 63  TABLE c1(a, b, c
b5f0: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
b600: 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46  KEY(a, b, c) REF
b610: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4e  ERENCES parent N
b620: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  OT DEFERRABLE IN
b630: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b640: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
b650: 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62  TE TABLE c2(a, b
b660: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b670: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b680: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b690: 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  t NOT DEFERRABLE
b6a0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
b6b0: 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  IATE.    );.    
b6c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
b6d0: 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46  a, b, c,.      F
b6e0: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c  OREIGN KEY(a, b,
b6f0: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
b700: 61 72 65 6e 74 20 4e 4f 54 20 44 45 46 45 52 52  arent NOT DEFERR
b710: 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ABLE.    );.    
b720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 34 28  CREATE TABLE c4(
b730: 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46  a, b, c,.      F
b740: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c  OREIGN KEY(a, b,
b750: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
b760: 61 72 65 6e 74 20 44 45 46 45 52 52 41 42 4c 45  arent DEFERRABLE
b770: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
b780: 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  IATE.    );.    
b790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28  CREATE TABLE c5(
b7a0: 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46  a, b, c,.      F
b7b0: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c  OREIGN KEY(a, b,
b7c0: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
b7d0: 61 72 65 6e 74 20 44 45 46 45 52 52 41 42 4c 45  arent DEFERRABLE
b7e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
b7f0: 54 45 20 54 41 42 4c 45 20 63 36 28 61 2c 20 62  TE TABLE c6(a, b
b800: 2c 20 63 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , c, FOREIGN KEY
b810: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b820: 4e 43 45 53 20 70 61 72 65 6e 74 29 3b 0a 0a 20  NCES parent);.. 
b830: 20 20 20 2d 2d 20 54 68 69 73 20 46 4b 20 63 6f     -- This FK co
b840: 6e 73 74 72 61 69 6e 74 20 69 73 20 74 68 65 20  nstraint is the 
b850: 6f 6e 6c 79 20 64 65 66 65 72 72 61 62 6c 65 20  only deferrable 
b860: 6f 6e 65 2e 0a 20 20 20 20 43 52 45 41 54 45 20  one..    CREATE 
b870: 54 41 42 4c 45 20 63 37 28 61 2c 20 62 2c 20 63  TABLE c7(a, b, c
b880: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
b890: 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46  KEY(a, b, c) REF
b8a0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 44  ERENCES parent D
b8b0: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
b8c0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
b8d0: 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
b8e0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b8f0: 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27  ES('a', 'b', 'c'
b900: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b910: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b920: 28 27 64 27 2c 20 27 65 27 2c 20 27 66 27 29 3b  ('d', 'e', 'f');
b930: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b940: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
b950: 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b 0a 20  g', 'h', 'i');. 
b960: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b970: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6a 27  arent VALUES('j'
b980: 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20  , 'k', 'l');.   
b990: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
b9a0: 65 6e 74 20 56 41 4c 55 45 53 28 27 6d 27 2c 20  ent VALUES('m', 
b9b0: 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20 20 49  'n', 'o');.    I
b9c0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
b9d0: 74 20 56 41 4c 55 45 53 28 27 70 27 2c 20 27 71  t VALUES('p', 'q
b9e0: 27 2c 20 27 72 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'r');.    INS
b9f0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
ba00: 56 41 4c 55 45 53 28 27 73 27 2c 20 27 74 27 2c  VALUES('s', 't',
ba10: 20 27 75 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45   'u');..    INSE
ba20: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
ba30: 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27 29  S('a', 'b', 'c')
ba40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ba50: 4f 20 63 32 20 56 41 4c 55 45 53 28 27 64 27 2c  O c2 VALUES('d',
ba60: 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 20 20   'e', 'f');.    
ba70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56  INSERT INTO c3 V
ba80: 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27 2c 20  ALUES('g', 'h', 
ba90: 27 69 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'i');.    INSERT
baa0: 20 49 4e 54 4f 20 63 34 20 56 41 4c 55 45 53 28   INTO c4 VALUES(
bab0: 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a  'j', 'k', 'l');.
bac0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bad0: 63 35 20 56 41 4c 55 45 53 28 27 6d 27 2c 20 27  c5 VALUES('m', '
bae0: 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20 20 49 4e  n', 'o');.    IN
baf0: 53 45 52 54 20 49 4e 54 4f 20 63 36 20 56 41 4c  SERT INTO c6 VAL
bb00: 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20 27 72  UES('p', 'q', 'r
bb10: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
bb20: 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28 27 73  NTO c7 VALUES('s
bb30: 27 2c 20 27 74 27 2c 20 27 75 27 29 3b 0a 20 20  ', 't', 'u');.  
bb40: 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 74 65 73  }.} {}..proc tes
bb50: 74 5f 65 66 6b 65 79 5f 32 39 20 7b 74 6e 20 73  t_efkey_29 {tn s
bb60: 71 6c 20 69 73 45 72 72 6f 72 7d 20 7b 0a 20 20  ql isError} {.  
bb70: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
bb80: 34 2e 24 74 6e 20 22 63 61 74 63 68 73 71 6c 20  4.$tn "catchsql 
bb90: 7b 24 73 71 6c 7d 22 20 5b 0a 20 20 20 20 6c 69  {$sql}" [.    li
bba0: 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20  ndex {{0 {}} {1 
bbb0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
bbc0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
bbd0: 7d 20 24 69 73 45 72 72 6f 72 0a 20 20 5d 0a 7d  } $isError.  ].}
bbe0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
bbf0: 32 20 22 42 45 47 49 4e 22 20 20 20 20 20 20 20  2 "BEGIN"       
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74 65              0.te
bc20: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 33 20 22  st_efkey_29  3 "
bc30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
bc40: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 61 27  nt WHERE x = 'a'
bc50: 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f  "        1.test_
bc60: 65 66 6b 65 79 5f 32 39 20 20 34 20 22 44 45 4c  efkey_29  4 "DEL
bc70: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
bc80: 57 48 45 52 45 20 78 20 3d 20 27 64 27 22 20 20  WHERE x = 'd'"  
bc90: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bca0: 65 79 5f 32 39 20 20 35 20 22 44 45 4c 45 54 45  ey_29  5 "DELETE
bcb0: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
bcc0: 52 45 20 78 20 3d 20 27 67 27 22 20 20 20 20 20  RE x = 'g'"     
bcd0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
bce0: 32 39 20 20 36 20 22 44 45 4c 45 54 45 20 46 52  29  6 "DELETE FR
bcf0: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
bd00: 78 20 3d 20 27 6a 27 22 20 20 20 20 20 20 20 20  x = 'j'"        
bd10: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bd20: 20 37 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   7 "DELETE FROM 
bd30: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
bd40: 20 27 6d 27 22 20 20 20 20 20 20 20 20 31 0a 74   'm'"        1.t
bd50: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 38 20  est_efkey_29  8 
bd60: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
bd70: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 70  ent WHERE x = 'p
bd80: 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74  '"        1.test
bd90: 5f 65 66 6b 65 79 5f 32 39 20 20 39 20 22 44 45  _efkey_29  9 "DE
bda0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
bdb0: 20 57 48 45 52 45 20 78 20 3d 20 27 73 27 22 20   WHERE x = 's'" 
bdc0: 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66         0.test_ef
bdd0: 6b 65 79 5f 32 39 20 31 30 20 22 43 4f 4d 4d 49  key_29 10 "COMMI
bde0: 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T"              
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
be10: 5f 32 39 20 31 31 20 22 52 4f 4c 4c 42 41 43 4b  _29 11 "ROLLBACK
be20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32   0..test_efkey_2
be50: 39 20 20 39 20 22 42 45 47 49 4e 22 20 20 20 20  9  9 "BEGIN"    
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
be80: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
be90: 30 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  0 "UPDATE parent
bea0: 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45   SET z = 'z' WHE
beb0: 52 45 20 7a 20 3d 20 27 63 27 22 20 31 0a 74 65  RE z = 'c'" 1.te
bec0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 31 20 22  st_efkey_29 11 "
bed0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
bee0: 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20  T z = 'z' WHERE 
bef0: 7a 20 3d 20 27 66 27 22 20 31 0a 74 65 73 74 5f  z = 'f'" 1.test_
bf00: 65 66 6b 65 79 5f 32 39 20 31 32 20 22 55 50 44  efkey_29 12 "UPD
bf10: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
bf20: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bf30: 20 27 69 27 22 20 31 0a 74 65 73 74 5f 65 66 6b   'i'" 1.test_efk
bf40: 65 79 5f 32 39 20 31 33 20 22 55 50 44 41 54 45  ey_29 13 "UPDATE
bf50: 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20   parent SET z = 
bf60: 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 6c  'z' WHERE z = 'l
bf70: 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '" 1.test_efkey_
bf80: 32 39 20 31 34 20 22 55 50 44 41 54 45 20 70 61  29 14 "UPDATE pa
bf90: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
bfa0: 20 57 48 45 52 45 20 7a 20 3d 20 27 6f 27 22 20   WHERE z = 'o'" 
bfb0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bfc0: 31 35 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  15 "UPDATE paren
bfd0: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
bfe0: 45 52 45 20 7a 20 3d 20 27 72 27 22 20 31 0a 74  ERE z = 'r'" 1.t
bff0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 36 20  est_efkey_29 16 
c000: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
c010: 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45  ET z = 'z' WHERE
c020: 20 7a 20 3d 20 27 75 27 22 20 30 0a 74 65 73 74   z = 'u'" 0.test
c030: 5f 65 66 6b 65 79 5f 32 39 20 31 37 20 22 43 4f  _efkey_29 17 "CO
c040: 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20  MMIT"           
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c070: 6b 65 79 5f 32 39 20 31 38 20 22 52 4f 4c 4c 42  key_29 18 "ROLLB
c080: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65      0..test_efke
c0b0: 79 5f 32 39 20 31 37 20 22 42 45 47 49 4e 22 20  y_29 17 "BEGIN" 
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
c0f0: 39 20 31 38 20 22 49 4e 53 45 52 54 20 49 4e 54  9 18 "INSERT INT
c100: 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O c1 VALUES(1, 2
c110: 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31  , 3)"          1
c120: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
c130: 39 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  9 "INSERT INTO c
c140: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  2 VALUES(1, 2, 3
c150: 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65  )"          1.te
c160: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 30 20 22  st_efkey_29 20 "
c170: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56  INSERT INTO c3 V
c180: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
c190: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c1a0: 65 66 6b 65 79 5f 32 39 20 32 31 20 22 49 4e 53  efkey_29 21 "INS
c1b0: 45 52 54 20 49 4e 54 4f 20 63 34 20 56 41 4c 55  ERT INTO c4 VALU
c1c0: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
c1d0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c1e0: 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54  ey_29 22 "INSERT
c1f0: 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28   INTO c5 VALUES(
c200: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
c210: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c220: 32 39 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e  29 22 "INSERT IN
c230: 54 4f 20 63 36 20 56 41 4c 55 45 53 28 31 2c 20  TO c6 VALUES(1, 
c240: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
c250: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c260: 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  22 "INSERT INTO 
c270: 63 37 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c7 VALUES(1, 2, 
c280: 33 29 22 20 20 20 20 20 20 20 20 20 20 30 0a 74  3)"          0.t
c290: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 33 20  est_efkey_29 23 
c2a0: 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20  "COMMIT"        
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c2d0: 5f 65 66 6b 65 79 5f 32 39 20 32 34 20 22 49 4e  _efkey_29 24 "IN
c2e0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
c2f0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
c300: 22 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66  "      0.test_ef
c310: 6b 65 79 5f 32 39 20 32 35 20 22 43 4f 4d 4d 49  key_29 25 "COMMI
c320: 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T"              
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65      0..test_efke
c350: 79 5f 32 39 20 32 36 20 22 42 45 47 49 4e 22 20  y_29 26 "BEGIN" 
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
c390: 39 20 32 37 20 22 55 50 44 41 54 45 20 63 31 20  9 27 "UPDATE c1 
c3a0: 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20  SET a = 10"     
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c3c0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
c3d0: 38 20 22 55 50 44 41 54 45 20 63 32 20 53 45 54  8 "UPDATE c2 SET
c3e0: 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20   a = 10"        
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c400: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 39 20 22  st_efkey_29 29 "
c410: 55 50 44 41 54 45 20 63 33 20 53 45 54 20 61 20  UPDATE c3 SET a 
c420: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c430: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c440: 65 66 6b 65 79 5f 32 39 20 33 30 20 22 55 50 44  efkey_29 30 "UPD
c450: 41 54 45 20 63 34 20 53 45 54 20 61 20 3d 20 31  ATE c4 SET a = 1
c460: 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
c470: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c480: 65 79 5f 32 39 20 33 31 20 22 55 50 44 41 54 45  ey_29 31 "UPDATE
c490: 20 63 35 20 53 45 54 20 61 20 3d 20 31 30 22 20   c5 SET a = 10" 
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c4c0: 32 39 20 33 31 20 22 55 50 44 41 54 45 20 63 36  29 31 "UPDATE c6
c4d0: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c500: 33 31 20 22 55 50 44 41 54 45 20 63 37 20 53 45  31 "UPDATE c7 SE
c510: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74               0.t
c530: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 32 20  est_efkey_29 32 
c540: 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20  "COMMIT"        
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c570: 5f 65 66 6b 65 79 5f 32 39 20 33 33 20 22 52 4f  _efkey_29 33 "RO
c580: 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20  LLBACK"         
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 30 0a 0a 23 2d 2d 2d 2d 2d         0..#-----
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
c600: 4f 46 3a 20 52 2d 32 34 34 39 39 2d 35 37 30 37  OF: R-24499-5707
c610: 31 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78  1.#.# Test an ex
c620: 61 6d 70 6c 65 20 66 72 6f 6d 20 66 6f 72 65 69  ample from forei
c630: 67 6e 6b 65 79 73 2e 68 74 6d 6c 20 64 65 61 6c  gnkeys.html deal
c640: 69 6e 67 20 77 69 74 68 20 61 20 64 65 66 65 72  ing with a defer
c650: 72 65 64 20 66 6f 72 65 69 67 6e 20 0a 23 20 6b  red foreign .# k
c660: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23  ey constraint..#
c670: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
c680: 33 35 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  35.1 {.  drop_al
c690: 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73  l_tables.  execs
c6a0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
c6b0: 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
c6c0: 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
c6d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c6e0: 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
c6f0: 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
c700: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
c710: 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
c720: 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
c730: 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61  TEGER,.      tra
c740: 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
c750: 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
c760: 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  t INTEGER REFERE
c770: 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
c780: 73 74 69 64 29 20 44 45 46 45 52 52 41 42 4c 45  stid) DEFERRABLE
c790: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
c7a0: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  RED.    );.  }.}
c7b0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
c7c0: 65 79 2d 33 35 2e 32 20 7b 0a 20 20 65 78 65 63  ey-35.2 {.  exec
c7d0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
c7e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
c7f0: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
c800: 31 2c 20 27 57 68 69 74 65 20 43 68 72 69 73 74  1, 'White Christ
c810: 6d 61 73 27 2c 20 35 29 3b 0a 20 20 7d 0a 20 20  mas', 5);.  }.  
c820: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
c830: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
c840: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
c850: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
c860: 66 6b 65 79 2d 33 35 2e 33 20 7b 0a 20 20 65 78  fkey-35.3 {.  ex
c870: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
c880: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
c890: 41 4c 55 45 53 28 35 2c 20 27 42 69 6e 67 20 43  ALUES(5, 'Bing C
c8a0: 72 6f 73 62 79 27 29 3b 0a 20 20 20 20 43 4f 4d  rosby');.    COM
c8b0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  MIT;.  }.} {}..#
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
c910: 66 79 20 74 68 61 74 20 61 20 6e 65 73 74 65 64  fy that a nested
c920: 20 73 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 62   savepoint may b
c930: 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f  e released witho
c940: 75 74 20 73 61 74 69 73 66 79 69 6e 67 20 0a 23  ut satisfying .#
c950: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
c960: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
c970: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
c980: 4f 46 3a 20 52 2d 30 37 32 32 33 2d 34 38 33 32  OF: R-07223-4832
c990: 33 20 41 20 6e 65 73 74 65 64 20 73 61 76 65 70  3 A nested savep
c9a0: 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
c9b0: 20 6d 61 79 20 62 65 0a 23 20 52 45 4c 45 41 53   may be.# RELEAS
c9c0: 45 64 20 77 68 69 6c 65 20 74 68 65 20 64 61 74  Ed while the dat
c9d0: 61 62 61 73 65 20 69 73 20 69 6e 20 61 20 73 74  abase is in a st
c9e0: 61 74 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ate that does no
c9f0: 74 20 73 61 74 69 73 66 79 20 61 0a 23 20 64 65  t satisfy a.# de
ca00: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
ca10: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23  ey constraint..#
ca20: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
ca30: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ca40: 33 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  36.1 {.  execsql
ca50: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
ca60: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
ca70: 20 4b 45 59 2c 0a 20 20 20 20 20 20 62 20 52 45   KEY,.      b RE
ca80: 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 45  FERENCES t1 DEFE
ca90: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
caa0: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
cab0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
cac0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29   t1 VALUES(1, 1)
cad0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
cae0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32  O t1 VALUES(2, 2
caf0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
cb00: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
cb10: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  3);.  }.} {}.do_
cb20: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 32  test e_fkey-36.2
cb30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
cb40: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
cb50: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
cb60: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
cb70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
cb80: 35 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41 53  5);.      RELEAS
cb90: 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  E one;.  }.} {}.
cba0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
cbb0: 36 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  6.3 {.  catchsql
cbc0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f   COMMIT.} {1 {fo
cbd0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
cbe0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
cbf0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e  _test e_fkey-36.
cc00: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
cc10: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
cc20: 54 20 61 20 3d 20 35 20 57 48 45 52 45 20 61 20  T a = 5 WHERE a 
cc30: 3d 20 34 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  = 4;.    COMMIT;
cc40: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d  .  }.} {}...#---
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74  ------.# Check t
cca0: 68 61 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hat a transactio
ccb0: 6e 20 73 61 76 65 70 6f 69 6e 74 20 28 61 6e 20  n savepoint (an 
ccc0: 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
ccd0: 69 6e 74 20 6f 70 65 6e 65 64 20 77 68 65 6e 0a  int opened when.
cce0: 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  # the database w
ccf0: 61 73 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  as in auto-commi
cd00: 74 20 6d 6f 64 65 29 20 63 61 6e 6e 6f 74 20 62  t mode) cannot b
cd10: 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f  e released witho
cd20: 75 74 0a 23 20 73 61 74 69 73 66 79 69 6e 67 20  ut.# satisfying 
cd30: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
cd40: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
cd50: 2e 20 49 74 20 6d 61 79 20 62 65 20 72 6f 6c 6c  . It may be roll
cd60: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45 56 49  ed back..#.# EVI
cd70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 32 39  DENCE-OF: R-4429
cd80: 35 2d 31 33 38 32 33 20 41 20 74 72 61 6e 73 61  5-13823 A transa
cd90: 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
cda0: 28 61 20 6e 6f 6e 2d 6e 65 73 74 65 64 0a 23 20  (a non-nested.# 
cdb0: 73 61 76 65 70 6f 69 6e 74 20 74 68 61 74 20 77  savepoint that w
cdc0: 61 73 20 6f 70 65 6e 65 64 20 77 68 69 6c 65 20  as opened while 
cdd0: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 63 75  there was not cu
cde0: 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65 6e 0a  rrently an open.
cdf0: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  # transaction), 
ce00: 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  on the other han
ce10: 64 2c 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  d, is subject to
ce20: 20 74 68 65 20 73 61 6d 65 20 72 65 73 74 72 69   the same restri
ce30: 63 74 69 6f 6e 73 0a 23 20 61 73 20 61 20 43 4f  ctions.# as a CO
ce40: 4d 4d 49 54 20 2d 20 61 74 74 65 6d 70 74 69 6e  MMIT - attemptin
ce50: 67 20 74 6f 20 52 45 4c 45 41 53 45 20 69 74 20  g to RELEASE it 
ce60: 77 68 69 6c 65 20 74 68 65 20 64 61 74 61 62 61  while the databa
ce70: 73 65 20 69 73 20 69 6e 20 73 75 63 68 20 61 0a  se is in such a.
ce80: 23 20 73 74 61 74 65 20 77 69 6c 6c 20 66 61 69  # state will fai
ce90: 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  l..#.do_test e_f
cea0: 6b 65 79 2d 33 37 2e 31 20 7b 0a 20 20 65 78 65  key-37.1 {.  exe
ceb0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
cec0: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
ced0: 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20  SAVEPOINT two;. 
cee0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
cef0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20  TO t1 VALUES(6, 
cf00: 37 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41 53  7);.      RELEAS
cf10: 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  E two;.  }.} {}.
cf20: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
cf30: 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  7.2 {.  catchsql
cf40: 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d   {RELEASE one}.}
cf50: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
cf60: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
cf70: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
cf80: 6b 65 79 2d 33 37 2e 33 20 7b 0a 20 20 65 78 65  key-37.3 {.  exe
cf90: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44  csql {.      UPD
cfa0: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 37  ATE t1 SET a = 7
cfb0: 20 57 48 45 52 45 20 61 20 3d 20 36 3b 0a 20 20   WHERE a = 6;.  
cfc0: 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20    RELEASE one;. 
cfd0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
cfe0: 65 5f 66 6b 65 79 2d 33 37 2e 34 20 7b 0a 20 20  e_fkey-37.4 {.  
cff0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41  execsql {.    SA
d000: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
d010: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f     SAVEPOINT two
d020: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
d030: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d040: 39 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 52 45  9, 10);.      RE
d050: 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d  LEASE two;.  }.}
d060: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
d070: 65 79 2d 33 37 2e 35 20 7b 0a 20 20 63 61 74 63  ey-37.5 {.  catc
d080: 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e  hsql {RELEASE on
d090: 65 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  e}.} {1 {foreign
d0a0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
d0b0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
d0c0: 20 65 5f 66 6b 65 79 2d 33 37 2e 36 20 7b 0a 20   e_fkey-37.6 {. 
d0d0: 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41   execsql {ROLLBA
d0e0: 43 4b 20 54 4f 20 6f 6e 65 20 3b 20 52 45 4c 45  CK TO one ; RELE
d0f0: 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 7d 0a 0a 23  ASE one}.} {}..#
d100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
d150: 20 74 68 61 74 20 69 66 20 61 20 43 4f 4d 4d 49   that if a COMMI
d160: 54 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  T operation fail
d170: 73 20 64 75 65 20 74 6f 20 64 65 66 65 72 72 65  s due to deferre
d180: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a 23  d foreign key .#
d190: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e   constraints, an
d1a0: 79 20 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69  y nested savepoi
d1b0: 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 2e  nts remain open.
d1c0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
d1d0: 3a 20 52 2d 33 37 37 33 36 2d 34 32 36 31 36 20  : R-37736-42616 
d1e0: 49 66 20 61 20 43 4f 4d 4d 49 54 20 73 74 61 74  If a COMMIT stat
d1f0: 65 6d 65 6e 74 20 28 6f 72 20 74 68 65 20 52 45  ement (or the RE
d200: 4c 45 41 53 45 20 6f 66 20 61 0a 23 20 74 72 61  LEASE of a.# tra
d210: 6e 73 61 63 74 69 6f 6e 20 53 41 56 45 50 4f 49  nsaction SAVEPOI
d220: 4e 54 29 20 66 61 69 6c 73 20 62 65 63 61 75 73  NT) fails becaus
d230: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
d240: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
d250: 0a 23 20 73 74 61 74 65 20 74 68 61 74 20 76 69  .# state that vi
d260: 6f 6c 61 74 65 73 20 61 20 64 65 66 65 72 72 65  olates a deferre
d270: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
d280: 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
d290: 72 65 20 61 72 65 0a 23 20 63 75 72 72 65 6e 74  re are.# current
d2a0: 6c 79 20 6e 65 73 74 65 64 20 73 61 76 65 70 6f  ly nested savepo
d2b0: 69 6e 74 73 2c 20 74 68 65 20 6e 65 73 74 65 64  ints, the nested
d2c0: 20 73 61 76 65 70 6f 69 6e 74 73 20 72 65 6d 61   savepoints rema
d2d0: 69 6e 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f 74 65  in open..#.do_te
d2e0: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 31 20 7b  st e_fkey-38.1 {
d2f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d300: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
d310: 57 48 45 52 45 20 61 3e 33 3b 0a 20 20 20 20 53  WHERE a>3;.    S
d320: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
d330: 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20  .  }.} {1 1 2 2 
d340: 33 20 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  3 3}.do_test e_f
d350: 6b 65 79 2d 33 38 2e 32 20 7b 0a 20 20 65 78 65  key-38.2 {.  exe
d360: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
d370: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
d380: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
d390: 20 34 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50   4);.      SAVEP
d3a0: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
d3b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d3c0: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20   VALUES(5, 6);. 
d3d0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
d3e0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
d3f0: 31 20 31 20 32 20 32 20 33 20 33 20 34 20 34 20  1 1 2 2 3 3 4 4 
d400: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  5 6}.do_test e_f
d410: 6b 65 79 2d 33 38 2e 33 20 7b 0a 20 20 63 61 74  key-38.3 {.  cat
d420: 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  chsql COMMIT.} {
d430: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
d440: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d450: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
d460: 79 2d 33 38 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-38.4 {.  execs
d470: 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  ql {.    ROLLBAC
d480: 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f  K TO one;.    CO
d490: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54  MMIT;.    SELECT
d4a0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
d4b0: 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 20 34  } {1 1 2 2 3 3 4
d4c0: 20 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66   4}..do_test e_f
d4d0: 6b 65 79 2d 33 38 2e 35 20 7b 0a 20 20 65 78 65  key-38.5 {.  exe
d4e0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
d4f0: 4f 49 4e 54 20 61 3b 0a 20 20 20 20 20 20 49 4e  OINT a;.      IN
d500: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d510: 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 20  UES(5, 5);.     
d520: 20 53 41 56 45 50 4f 49 4e 54 20 62 3b 0a 20 20   SAVEPOINT b;.  
d530: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
d540: 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20 37  O t1 VALUES(6, 7
d550: 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56 45 50  );.        SAVEP
d560: 4f 49 4e 54 20 63 3b 0a 20 20 20 20 20 20 20 20  OINT c;.        
d570: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d580: 20 56 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20   VALUES(7, 8);. 
d590: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
d5a0: 65 5f 66 6b 65 79 2d 33 38 2e 36 20 7b 0a 20 20  e_fkey-38.6 {.  
d5b0: 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53  catchsql {RELEAS
d5c0: 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  E a}.} {1 {forei
d5d0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
d5e0: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
d5f0: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 37 20 7b  st e_fkey-38.7 {
d600: 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 52 4f 4c  .  execsql  {ROL
d610: 4c 42 41 43 4b 20 54 4f 20 63 7d 0a 20 20 63 61  LBACK TO c}.  ca
d620: 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20  tchsql {RELEASE 
d630: 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  a}.} {1 {foreign
d640: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
d650: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
d660: 20 65 5f 66 6b 65 79 2d 33 38 2e 38 20 7b 0a 20   e_fkey-38.8 {. 
d670: 20 65 78 65 63 73 71 6c 20 20 7b 0a 20 20 20 20   execsql  {.    
d680: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 62 3b 0a 20  ROLLBACK TO b;. 
d690: 20 20 20 52 45 4c 45 41 53 45 20 61 3b 0a 20 20     RELEASE a;.  
d6a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
d6b0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32  t1;.  }.} {1 1 2
d6c0: 20 32 20 33 20 33 20 34 20 34 20 35 20 35 7d 0a   2 3 3 4 4 5 5}.
d6d0: 0a 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 23 23 0a 23 23 23  ############.###
d720: 20 53 45 43 54 49 4f 4e 20 34 2e 33 3a 20 4f 4e   SECTION 4.3: ON
d730: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
d740: 50 44 41 54 45 20 41 63 74 69 6f 6e 73 0a 23 23  PDATE Actions.##
d750: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d790: 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d  #########..#----
d7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7e0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
d7f0: 74 20 63 6f 6e 66 69 67 75 72 65 64 20 4f 4e 20  t configured ON 
d800: 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50  DELETE and ON UP
d810: 44 41 54 45 20 61 63 74 69 6f 6e 73 20 74 61 6b  DATE actions tak
d820: 65 20 70 6c 61 63 65 20 77 68 65 6e 0a 23 20 64  e place when.# d
d830: 65 6c 65 74 69 6e 67 20 6f 72 20 6d 6f 64 69 66  eleting or modif
d840: 79 69 6e 67 20 72 6f 77 73 20 6f 66 20 74 68 65  ying rows of the
d850: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 72   parent table, r
d860: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a 23  espectively..#.#
d870: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d880: 34 38 32 37 30 2d 34 34 32 38 32 20 46 6f 72 65  48270-44282 Fore
d890: 69 67 6e 20 6b 65 79 20 4f 4e 20 44 45 4c 45 54  ign key ON DELET
d8a0: 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
d8b0: 63 6c 61 75 73 65 73 0a 23 20 61 72 65 20 75 73  clauses.# are us
d8c0: 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20  ed to configure 
d8d0: 61 63 74 69 6f 6e 73 20 74 68 61 74 20 74 61 6b  actions that tak
d8e0: 65 20 70 6c 61 63 65 20 77 68 65 6e 20 64 65 6c  e place when del
d8f0: 65 74 69 6e 67 20 72 6f 77 73 20 66 72 6f 6d 0a  eting rows from.
d900: 23 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  # the parent tab
d910: 6c 65 20 28 4f 4e 20 44 45 4c 45 54 45 29 2c 20  le (ON DELETE), 
d920: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
d930: 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75   parent key valu
d940: 65 73 20 6f 66 0a 23 20 65 78 69 73 74 69 6e 67  es of.# existing
d950: 20 72 6f 77 73 20 28 4f 4e 20 55 50 44 41 54 45   rows (ON UPDATE
d960: 29 2e 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74  )..#.# Test that
d970: 20 61 20 73 69 6e 67 6c 65 20 46 4b 20 63 6f 6e   a single FK con
d980: 73 74 72 61 69 6e 74 20 6d 61 79 20 68 61 76 65  straint may have
d990: 20 64 69 66 66 65 72 65 6e 74 20 61 63 74 69 6f   different actio
d9a0: 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 23 20  ns configured.# 
d9b0: 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e  for ON DELETE an
d9c0: 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a 23  d ON UPDATE..#.#
d9d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d9e0: 34 38 31 32 34 2d 36 33 32 32 35 20 41 20 73 69  48124-63225 A si
d9f0: 6e 67 6c 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  ngle foreign key
da00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20   constraint may 
da10: 68 61 76 65 0a 23 20 64 69 66 66 65 72 65 6e 74  have.# different
da20: 20 61 63 74 69 6f 6e 73 20 63 6f 6e 66 69 67 75   actions configu
da30: 72 65 64 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54  red for ON DELET
da40: 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e  E and ON UPDATE.
da50: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
da60: 79 2d 33 39 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-39.1 {.  execs
da70: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
da80: 54 41 42 4c 45 20 70 28 61 2c 20 62 20 50 52 49  TABLE p(a, b PRI
da90: 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b 0a 20 20  MARY KEY, c);.  
daa0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
dab0: 31 28 64 2c 20 65 2c 20 66 20 44 45 46 41 55 4c  1(d, e, f DEFAUL
dac0: 54 20 27 6b 30 27 20 52 45 46 45 52 45 4e 43 45  T 'k0' REFERENCE
dad0: 53 20 70 20 0a 20 20 20 20 20 20 4f 4e 20 55 50  S p .      ON UP
dae0: 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  DATE SET DEFAULT
daf0: 0a 20 20 20 20 20 20 4f 4e 20 44 45 4c 45 54 45  .      ON DELETE
db00: 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b   SET NULL.    );
db10: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
db20: 4f 20 70 20 56 41 4c 55 45 53 28 30 2c 20 27 6b  O p VALUES(0, 'k
db30: 30 27 2c 20 27 27 29 3b 0a 20 20 20 20 49 4e 53  0', '');.    INS
db40: 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45  ERT INTO p VALUE
db50: 53 28 31 2c 20 27 6b 31 27 2c 20 27 49 27 29 3b  S(1, 'k1', 'I');
db60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
db70: 20 70 20 56 41 4c 55 45 53 28 32 2c 20 27 6b 32   p VALUES(2, 'k2
db80: 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 49 4e  ', 'II');.    IN
db90: 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
dba0: 45 53 28 33 2c 20 27 6b 33 27 2c 20 27 49 49 49  ES(3, 'k3', 'III
dbb0: 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  ');..    INSERT 
dbc0: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31  INTO c1 VALUES(1
dbd0: 2c 20 27 78 78 27 2c 20 27 6b 31 27 29 3b 0a 20  , 'xx', 'k1');. 
dbe0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
dbf0: 31 20 56 41 4c 55 45 53 28 32 2c 20 27 78 78 27  1 VALUES(2, 'xx'
dc00: 2c 20 27 6b 32 27 29 3b 0a 20 20 20 20 49 4e 53  , 'k2');.    INS
dc10: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
dc20: 45 53 28 33 2c 20 27 78 78 27 2c 20 27 6b 33 27  ES(3, 'xx', 'k3'
dc30: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
dc40: 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 32 20  est e_fkey-39.2 
dc50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
dc60: 20 20 55 50 44 41 54 45 20 70 20 53 45 54 20 62    UPDATE p SET b
dc70: 20 3d 20 27 6b 34 27 20 57 48 45 52 45 20 61 20   = 'k4' WHERE a 
dc80: 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 1;.    SELECT 
dc90: 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  * FROM c1;.  }.}
dca0: 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20 6b   {1 xx k0 2 xx k
dcb0: 32 20 33 20 78 78 20 6b 33 7d 0a 64 6f 5f 74 65  2 3 xx k3}.do_te
dcc0: 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 33 20 7b  st e_fkey-39.3 {
dcd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
dce0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 57   DELETE FROM p W
dcf0: 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20 20  HERE a = 2;.    
dd00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31  SELECT * FROM c1
dd10: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20 6b 30  ;.  }.} {1 xx k0
dd20: 20 32 20 78 78 20 7b 7d 20 33 20 78 78 20 6b 33   2 xx {} 3 xx k3
dd30: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
dd40: 2d 33 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -39.4 {.  execsq
dd50: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 55  l {.    CREATE U
dd60: 4e 49 51 55 45 20 49 4e 44 45 58 20 70 69 20 4f  NIQUE INDEX pi O
dd70: 4e 20 70 28 63 29 3b 0a 20 20 20 20 52 45 50 4c  N p(c);.    REPL
dd80: 41 43 45 20 49 4e 54 4f 20 70 20 56 41 4c 55 45  ACE INTO p VALUE
dd90: 53 28 35 2c 20 27 6b 35 27 2c 20 27 49 49 49 27  S(5, 'k5', 'III'
dda0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
ddb0: 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
ddc0: 31 20 78 78 20 6b 30 20 32 20 78 78 20 7b 7d 20  1 xx k0 2 xx {} 
ddd0: 33 20 78 78 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  3 xx {}}..#-----
dde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de20: 2d 2d 2d 2d 0a 23 20 45 61 63 68 20 66 6f 72 65  ----.# Each fore
de30: 69 67 6e 20 6b 65 79 20 69 6e 20 74 68 65 20 73  ign key in the s
de40: 79 73 74 65 6d 20 68 61 73 20 61 6e 20 4f 4e 20  ystem has an ON 
de50: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 44 45  UPDATE and ON DE
de60: 4c 45 54 45 20 61 63 74 69 6f 6e 2c 0a 23 20 65  LETE action,.# e
de70: 69 74 68 65 72 20 22 4e 4f 20 41 43 54 49 4f 4e  ither "NO ACTION
de80: 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c 20 22  ", "RESTRICT", "
de90: 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53 45 54 20  SET NULL", "SET 
dea0: 44 45 46 41 55 4c 54 22 20 6f 72 20 22 43 41 53  DEFAULT" or "CAS
deb0: 43 41 44 45 22 2e 0a 23 0a 23 20 45 56 49 44 45  CADE"..#.# EVIDE
dec0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 33 32 36 2d  NCE-OF: R-33326-
ded0: 34 35 32 35 32 20 54 68 65 20 4f 4e 20 44 45 4c  45252 The ON DEL
dee0: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
def0: 45 20 61 63 74 69 6f 6e 0a 23 20 61 73 73 6f 63  E action.# assoc
df00: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
df10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 20 61  foreign key in a
df20: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
df30: 65 20 69 73 20 6f 6e 65 20 6f 66 20 22 4e 4f 0a  e is one of "NO.
df40: 23 20 41 43 54 49 4f 4e 22 2c 20 22 52 45 53 54  # ACTION", "REST
df50: 52 49 43 54 22 2c 20 22 53 45 54 20 4e 55 4c 4c  RICT", "SET NULL
df60: 22 2c 20 22 53 45 54 20 44 45 46 41 55 4c 54 22  ", "SET DEFAULT"
df70: 20 6f 72 20 22 43 41 53 43 41 44 45 22 2e 0a 23   or "CASCADE"..#
df80: 0a 23 20 49 66 20 6e 6f 6e 65 20 69 73 20 73 70  .# If none is sp
df90: 65 63 69 66 69 65 64 20 65 78 70 6c 69 63 69 74  ecified explicit
dfa0: 6c 79 2c 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20  ly, "NO ACTION" 
dfb0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  is the default..
dfc0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
dfd0: 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34 20 49   R-19803-45884 I
dfe0: 66 20 61 6e 20 61 63 74 69 6f 6e 20 69 73 20 6e  f an action is n
dff0: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ot explicitly sp
e000: 65 63 69 66 69 65 64 2c 0a 23 20 69 74 20 64 65  ecified,.# it de
e010: 66 61 75 6c 74 73 20 74 6f 20 22 4e 4f 20 41 43  faults to "NO AC
e020: 54 49 4f 4e 22 2e 0a 23 20 0a 64 72 6f 70 5f 61  TION"..# .drop_a
e030: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
e040: 74 20 65 5f 66 6b 65 79 2d 34 30 2e 31 20 7b 0a  t e_fkey-40.1 {.
e050: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e060: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
e070: 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
e080: 59 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, y);.    CREAT
e090: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 61  E TABLE child1(a
e0a0: 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45 52  , .      b REFER
e0b0: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
e0c0: 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e  UPDATE NO ACTION
e0d0: 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52   ON DELETE RESTR
e0e0: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  ICT.    );.    C
e0f0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e100: 64 32 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52  d2(a, .      b R
e110: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e120: 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54 52   ON UPDATE RESTR
e130: 49 43 54 20 4f 4e 20 44 45 4c 45 54 45 20 53 45  ICT ON DELETE SE
e140: 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20  T NULL.    );.  
e150: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
e160: 68 69 6c 64 33 28 61 2c 20 0a 20 20 20 20 20 20  hild3(a, .      
e170: 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  b REFERENCES par
e180: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
e190: 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c 45 54 45  T NULL ON DELETE
e1a0: 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
e1b0: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
e1c0: 41 42 4c 45 20 63 68 69 6c 64 34 28 61 2c 20 0a  ABLE child4(a, .
e1d0: 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e 43        b REFERENC
e1e0: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
e1f0: 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 20  ATE SET DEFAULT 
e200: 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44  ON DELETE CASCAD
e210: 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2d 2d  E.    );..    --
e220: 20 43 72 65 61 74 65 20 73 6f 6d 65 20 66 6f 72   Create some for
e230: 65 69 67 6e 20 6b 65 79 73 20 74 68 61 74 20 75  eign keys that u
e240: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  se the default a
e250: 63 74 69 6f 6e 20 2d 20 22 4e 4f 20 41 43 54 49  ction - "NO ACTI
e260: 4f 4e 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  ON".    CREATE T
e270: 41 42 4c 45 20 63 68 69 6c 64 35 28 61 2c 20 62  ABLE child5(a, b
e280: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
e290: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  nt ON UPDATE CAS
e2a0: 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54  CADE);.    CREAT
e2b0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28 61  E TABLE child6(a
e2c0: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  , b REFERENCES p
e2d0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
e2e0: 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
e2f0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e300: 64 37 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43  d7(a, b REFERENC
e310: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c  ES parent ON DEL
e320: 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a  ETE NO ACTION);.
e330: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e340: 20 63 68 69 6c 64 38 28 61 2c 20 62 20 52 45 46   child8(a, b REF
e350: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
e360: 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49  N UPDATE NO ACTI
e370: 4f 4e 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66  ON);.  }.} {}..f
e380: 6f 72 65 61 63 68 20 7b 74 6e 20 7a 54 61 62 20  oreach {tn zTab 
e390: 6c 52 65 73 7d 20 7b 0a 20 20 32 20 63 68 69 6c  lRes} {.  2 chil
e3a0: 64 31 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62  d1 {0 0 parent b
e3b0: 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20   {} {NO ACTION} 
e3c0: 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d 0a 20  RESTRICT NONE}. 
e3d0: 20 33 20 63 68 69 6c 64 32 20 7b 30 20 30 20 70   3 child2 {0 0 p
e3e0: 61 72 65 6e 74 20 62 20 7b 7d 20 52 45 53 54 52  arent b {} RESTR
e3f0: 49 43 54 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 4e  ICT {SET NULL} N
e400: 4f 4e 45 7d 0a 20 20 34 20 63 68 69 6c 64 33 20  ONE}.  4 child3 
e410: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e420: 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 7b 53 45 54   {SET NULL} {SET
e430: 20 44 45 46 41 55 4c 54 7d 20 4e 4f 4e 45 7d 0a   DEFAULT} NONE}.
e440: 20 20 35 20 63 68 69 6c 64 34 20 7b 30 20 30 20    5 child4 {0 0 
e450: 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53 45 54  parent b {} {SET
e460: 20 44 45 46 41 55 4c 54 7d 20 43 41 53 43 41 44   DEFAULT} CASCAD
e470: 45 20 4e 4f 4e 45 7d 0a 20 20 36 20 63 68 69 6c  E NONE}.  6 chil
e480: 64 35 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62  d5 {0 0 parent b
e490: 20 7b 7d 20 43 41 53 43 41 44 45 20 7b 4e 4f 20   {} CASCADE {NO 
e4a0: 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20  ACTION} NONE}.  
e4b0: 37 20 63 68 69 6c 64 36 20 7b 30 20 30 20 70 61  7 child6 {0 0 pa
e4c0: 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43  rent b {} {NO AC
e4d0: 54 49 4f 4e 7d 20 52 45 53 54 52 49 43 54 20 4e  TION} RESTRICT N
e4e0: 4f 4e 45 7d 0a 20 20 38 20 63 68 69 6c 64 37 20  ONE}.  8 child7 
e4f0: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e500: 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f   {NO ACTION} {NO
e510: 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20   ACTION} NONE}. 
e520: 20 39 20 63 68 69 6c 64 38 20 7b 30 20 30 20 70   9 child8 {0 0 p
e530: 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41  arent b {} {NO A
e540: 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54 49 4f  CTION} {NO ACTIO
e550: 4e 7d 20 4e 4f 4e 45 7d 0a 7d 20 7b 0a 20 20 64  N} NONE}.} {.  d
e560: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 30  o_test e_fkey-40
e570: 2e 24 74 6e 20 7b 20 65 78 65 63 73 71 6c 20 22  .$tn { execsql "
e580: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
e590: 65 79 5f 6c 69 73 74 28 24 7a 54 61 62 29 22 20  ey_list($zTab)" 
e5a0: 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d  } $lRes.}..#----
e5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5f0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
e600: 74 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 6d 65  t "NO ACTION" me
e610: 61 6e 73 20 74 68 61 74 20 6e 6f 74 68 69 6e 67  ans that nothing
e620: 20 68 61 70 70 65 6e 73 20 74 6f 20 61 20 63 68   happens to a ch
e630: 69 6c 64 20 72 6f 77 20 77 68 65 6e 0a 23 20 69  ild row when.# i
e640: 74 27 73 20 70 61 72 65 6e 74 20 72 6f 77 20 69  t's parent row i
e650: 73 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  s updated or del
e660: 65 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  eted..#.# EVIDEN
e670: 43 45 2d 4f 46 3a 20 52 2d 31 39 39 37 31 2d 35  CE-OF: R-19971-5
e680: 34 39 37 36 20 43 6f 6e 66 69 67 75 72 69 6e 67  4976 Configuring
e690: 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 6d 65 61   "NO ACTION" mea
e6a0: 6e 73 20 6a 75 73 74 20 74 68 61 74 3a 0a 23 20  ns just that:.# 
e6b0: 77 68 65 6e 20 61 20 70 61 72 65 6e 74 20 6b 65  when a parent ke
e6c0: 79 20 69 73 20 6d 6f 64 69 66 69 65 64 20 6f 72  y is modified or
e6d0: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
e6e0: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 73  e database, no s
e6f0: 70 65 63 69 61 6c 0a 23 20 61 63 74 69 6f 6e 20  pecial.# action 
e700: 69 73 20 74 61 6b 65 6e 2e 0a 23 0a 64 72 6f 70  is taken..#.drop
e710: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
e720: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20  est e_fkey-41.1 
e730: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
e740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
e750: 61 72 65 6e 74 28 70 31 2c 20 70 32 2c 20 50 52  arent(p1, p2, PR
e760: 49 4d 41 52 59 20 4b 45 59 28 70 31 2c 20 70 32  IMARY KEY(p1, p2
e770: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
e780: 41 42 4c 45 20 63 68 69 6c 64 28 63 31 2c 20 63  ABLE child(c1, c
e790: 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47  2, .      FOREIG
e7a0: 4e 20 4b 45 59 28 63 31 2c 20 63 32 29 20 52 45  N KEY(c1, c2) RE
e7b0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 0a  FERENCES parent.
e7c0: 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54 45 20        ON UPDATE 
e7d0: 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20  NO ACTION.      
e7e0: 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54  ON DELETE NO ACT
e7f0: 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52  ION.      DEFERR
e800: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
e810: 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20  EFERRED.    );. 
e820: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
e830: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6a 27  arent VALUES('j'
e840: 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'k');.    INSE
e850: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
e860: 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27 29 3b  ALUES('l', 'm');
e870: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e880: 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6a   child VALUES('j
e890: 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'k');.    INS
e8a0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56  ERT INTO child V
e8b0: 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27 29 3b  ALUES('l', 'm');
e8c0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
e8d0: 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a  t e_fkey-41.2 {.
e8e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e8f0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
e900: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 70  ATE parent SET p
e910: 31 3d 27 6b 27 20 57 48 45 52 45 20 70 31 3d 27  1='k' WHERE p1='
e920: 6a 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  j';.      DELETE
e930: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
e940: 52 45 20 70 31 3d 27 6c 27 3b 0a 20 20 20 20 20  RE p1='l';.     
e950: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
e960: 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6a 20 6b  hild;.  }.} {j k
e970: 20 6c 20 6d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f   l m}.do_test e_
e980: 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20 63 61  fkey-41.3 {.  ca
e990: 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  tchsql COMMIT.} 
e9a0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
e9b0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
e9c0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
e9d0: 65 79 2d 34 31 2e 34 20 7b 0a 20 20 65 78 65 63  ey-41.4 {.  exec
e9e0: 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b  sql ROLLBACK.} {
e9f0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
ea40: 54 65 73 74 20 74 68 61 74 20 22 52 45 53 54 52  Test that "RESTR
ea50: 49 43 54 22 20 6d 65 61 6e 73 20 74 68 65 20 61  ICT" means the a
ea60: 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 70 72  pplication is pr
ea70: 6f 68 69 62 69 74 65 64 20 66 72 6f 6d 20 64 65  ohibited from de
ea80: 6c 65 74 69 6e 67 0a 23 20 6f 72 20 75 70 64 61  leting.# or upda
ea90: 74 69 6e 67 20 61 20 70 61 72 65 6e 74 20 74 61  ting a parent ta
eaa0: 62 6c 65 20 72 6f 77 20 77 68 65 6e 20 74 68 65  ble row when the
eab0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72  re exists one or
eac0: 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b 65 79 73   more child keys
ead0: 0a 23 20 6d 61 70 70 65 64 20 74 6f 20 69 74 2e  .# mapped to it.
eae0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
eaf0: 3a 20 52 2d 30 34 32 37 32 2d 33 38 36 35 33 20  : R-04272-38653 
eb00: 54 68 65 20 22 52 45 53 54 52 49 43 54 22 20 61  The "RESTRICT" a
eb10: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
eb20: 20 74 68 65 0a 23 20 61 70 70 6c 69 63 61 74 69   the.# applicati
eb30: 6f 6e 20 69 73 20 70 72 6f 68 69 62 69 74 65 64  on is prohibited
eb40: 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20 28   from deleting (
eb50: 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  for ON DELETE RE
eb60: 53 54 52 49 43 54 29 20 6f 72 0a 23 20 6d 6f 64  STRICT) or.# mod
eb70: 69 66 79 69 6e 67 20 28 66 6f 72 20 4f 4e 20 55  ifying (for ON U
eb80: 50 44 41 54 45 20 52 45 53 54 52 49 43 54 29 20  PDATE RESTRICT) 
eb90: 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77 68 65  a parent key whe
eba0: 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  n there exists o
ebb0: 6e 65 0a 23 20 6f 72 20 6d 6f 72 65 20 63 68 69  ne.# or more chi
ebc0: 6c 64 20 6b 65 79 73 20 6d 61 70 70 65 64 20 74  ld keys mapped t
ebd0: 6f 20 69 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  o it..#.drop_all
ebe0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
ebf0: 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20 20  e_fkey-41.1 {.  
ec00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
ec10: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
ec20: 74 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 43  t(p1, p2);.    C
ec30: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
ec40: 45 58 20 70 61 72 65 6e 74 5f 69 20 4f 4e 20 70  EX parent_i ON p
ec50: 61 72 65 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20  arent(p1, p2);. 
ec60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ec70: 63 68 69 6c 64 31 28 63 31 2c 20 63 32 2c 20 0a  child1(c1, c2, .
ec80: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
ec90: 59 28 63 32 2c 20 63 31 29 20 52 45 46 45 52 45  Y(c2, c1) REFERE
eca0: 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31 2c 20  NCES parent(p1, 
ecb0: 70 32 29 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  p2) ON DELETE RE
ecc0: 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  STRICT.    );.  
ecd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
ece0: 68 69 6c 64 32 28 63 31 2c 20 63 32 2c 20 0a 20  hild2(c1, c2, . 
ecf0: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
ed00: 28 63 32 2c 20 63 31 29 20 52 45 46 45 52 45 4e  (c2, c1) REFEREN
ed10: 43 45 53 20 70 61 72 65 6e 74 28 70 31 2c 20 70  CES parent(p1, p
ed20: 32 29 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53  2) ON UPDATE RES
ed30: 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 7d  TRICT.    );.  }
ed40: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
ed50: 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65 78  fkey-41.2 {.  ex
ed60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
ed70: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
ed80: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
ed90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
eda0: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
edb0: 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 49 4e  c', 'd');.    IN
edc0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31  SERT INTO child1
edd0: 20 56 41 4c 55 45 53 28 27 62 27 2c 20 27 61 27   VALUES('b', 'a'
ede0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
edf0: 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
ee00: 28 27 64 27 2c 20 27 63 27 29 3b 0a 20 20 7d 0a  ('d', 'c');.  }.
ee10: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
ee20: 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20 63 61 74  key-41.3 {.  cat
ee30: 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
ee40: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
ee50: 20 70 31 20 3d 20 27 61 27 20 7d 0a 7d 20 7b 31   p1 = 'a' }.} {1
ee60: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
ee70: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
ee80: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
ee90: 2d 34 31 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -41.4 {.  catchs
eea0: 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65  ql { UPDATE pare
eeb0: 6e 74 20 53 45 54 20 70 32 20 3d 20 27 65 27 20  nt SET p2 = 'e' 
eec0: 57 48 45 52 45 20 70 31 20 3d 20 27 63 27 20 7d  WHERE p1 = 'c' }
eed0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
eee0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
eef0: 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  iled}}..#-------
ef00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef40: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 52  --.# Test that R
ef50: 45 53 54 52 49 43 54 20 69 73 20 73 6c 69 67 68  ESTRICT is sligh
ef60: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 66 72  tly different fr
ef70: 6f 6d 20 4e 4f 20 41 43 54 49 4f 4e 20 66 6f 72  om NO ACTION for
ef80: 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 63 6f 6e   IMMEDIATE.# con
ef90: 73 74 72 61 69 6e 74 73 2c 20 69 6e 20 74 68 61  straints, in tha
efa0: 74 20 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64  t it is enforced
efb0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 6e 6f   immediately, no
efc0: 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
efd0: 74 68 65 20 0a 23 20 73 74 61 74 65 6d 65 6e 74  the .# statement
efe0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
eff0: 46 3a 20 52 2d 33 37 39 39 37 2d 34 32 31 38 37  F: R-37997-42187
f000: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
f010: 62 65 74 77 65 65 6e 20 74 68 65 20 65 66 66 65  between the effe
f020: 63 74 20 6f 66 20 61 0a 23 20 52 45 53 54 52 49  ct of a.# RESTRI
f030: 43 54 20 61 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  CT action and no
f040: 72 6d 61 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79  rmal foreign key
f050: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f   constraint enfo
f060: 72 63 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  rcement is that.
f070: 23 20 74 68 65 20 52 45 53 54 52 49 43 54 20 61  # the RESTRICT a
f080: 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  ction processing
f090: 20 68 61 70 70 65 6e 73 20 61 73 20 73 6f 6f 6e   happens as soon
f0a0: 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 69 73   as the field is
f0b0: 20 75 70 64 61 74 65 64 0a 23 20 2d 20 6e 6f 74   updated.# - not
f0c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
f0d0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
f0e0: 6d 65 6e 74 20 61 73 20 69 74 20 77 6f 75 6c 64  ment as it would
f0f0: 20 77 69 74 68 20 61 6e 0a 23 20 69 6d 6d 65 64   with an.# immed
f100: 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 2c  iate constraint,
f110: 20 6f 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f   or at the end o
f120: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
f130: 61 6e 73 61 63 74 69 6f 6e 20 61 73 20 69 74 0a  ansaction as it.
f140: 23 20 77 6f 75 6c 64 20 77 69 74 68 20 61 20 64  # would with a d
f150: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
f160: 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  nt..#.drop_all_t
f170: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
f180: 66 6b 65 79 2d 34 32 2e 31 20 7b 0a 20 20 65 78  fkey-42.1 {.  ex
f190: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
f1a0: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
f1b0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
f1c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f1d0: 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45   child1(c REFERE
f1e0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
f1f0: 50 44 41 54 45 20 52 45 53 54 52 49 43 54 29 3b  PDATE RESTRICT);
f200: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f210: 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52  E child2(c REFER
f220: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
f230: 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e  UPDATE NO ACTION
f240: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
f250: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f260: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
f270: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
f280: 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  t VALUES('key2')
f290: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f2a0: 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28  O child1 VALUES(
f2b0: 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
f2c0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
f2d0: 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
f2e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
f2f0: 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41 46 54  GER parent_t AFT
f300: 45 52 20 55 50 44 41 54 45 20 4f 4e 20 70 61 72  ER UPDATE ON par
f310: 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20  ent BEGIN.      
f320: 55 50 44 41 54 45 20 63 68 69 6c 64 31 20 73 65  UPDATE child1 se
f330: 74 20 63 20 3d 20 6e 65 77 2e 78 20 57 48 45 52  t c = new.x WHER
f340: 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20  E c = old.x;.   
f350: 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 32     UPDATE child2
f360: 20 73 65 74 20 63 20 3d 20 6e 65 77 2e 78 20 57   set c = new.x W
f370: 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a  HERE c = old.x;.
f380: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b      END;.  }.} {
f390: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
f3a0: 2d 34 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -42.2 {.  catchs
f3b0: 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65  ql { UPDATE pare
f3c0: 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79 20  nt SET x = 'key 
f3d0: 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d 20 27  one' WHERE x = '
f3e0: 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f  key1' }.} {1 {fo
f3f0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
f400: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
f410: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f420: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
f430: 0a 20 20 20 20 55 50 44 41 54 45 20 70 61 72 65  .    UPDATE pare
f440: 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79 20  nt SET x = 'key 
f450: 74 77 6f 27 20 57 48 45 52 45 20 78 20 3d 20 27  two' WHERE x = '
f460: 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43  key2';.    SELEC
f470: 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b  T * FROM child2;
f480: 0a 20 20 7d 0a 7d 20 7b 7b 6b 65 79 20 74 77 6f  .  }.} {{key two
f490: 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  }}..drop_all_tab
f4a0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
f4b0: 65 79 2d 34 32 2e 34 20 7b 0a 20 20 65 78 65 63  ey-42.4 {.  exec
f4c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
f4d0: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20   TABLE parent(x 
f4e0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
f4f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
f500: 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43  hild1(c REFERENC
f510: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c  ES parent ON DEL
f520: 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20  ETE RESTRICT);. 
f530: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f540: 63 68 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e  child2(c REFEREN
f550: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45  CES parent ON DE
f560: 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b  LETE NO ACTION);
f570: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
f580: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
f590: 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
f5a0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
f5b0: 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
f5c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f5d0: 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b  child1 VALUES('k
f5e0: 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey1');.    INSER
f5f0: 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41  T INTO child2 VA
f600: 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 0a 20  LUES('key2');.. 
f610: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
f620: 52 20 70 61 72 65 6e 74 5f 74 20 41 46 54 45 52  R parent_t AFTER
f630: 20 44 45 4c 45 54 45 20 4f 4e 20 70 61 72 65 6e   DELETE ON paren
f640: 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50  t BEGIN.      UP
f650: 44 41 54 45 20 63 68 69 6c 64 31 20 53 45 54 20  DATE child1 SET 
f660: 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 63  c = NULL WHERE c
f670: 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20   = old.x;.      
f680: 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 53 45  UPDATE child2 SE
f690: 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45  T c = NULL WHERE
f6a0: 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20   c = old.x;.    
f6b0: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  END;.  }.} {}.do
f6c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f6d0: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
f6e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72   DELETE FROM par
f6f0: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b  ent WHERE x = 'k
f700: 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  ey1' }.} {1 {for
f710: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
f720: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
f730: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 36  test e_fkey-42.6
f740: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
f750: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
f760: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
f770: 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c   'key2';.    SEL
f780: 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64  ECT * FROM child
f790: 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 64  2;.  }.} {{}}..d
f7a0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
f7b0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f7c0: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
f7d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f7e0: 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
f7f0: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
f800: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
f810: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
f820: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52  rent ON DELETE R
f830: 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43 52  ESTRICT);.    CR
f840: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
f850: 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  2(c REFERENCES p
f860: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
f870: 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20  NO ACTION);..   
f880: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
f890: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ent VALUES('key1
f8a0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f8b0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f8c0: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49  S('key2');.    I
f8d0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
f8e0: 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29  1 VALUES('key1')
f8f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f900: 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28  O child2 VALUES(
f910: 27 6b 65 79 32 27 29 3b 0a 20 20 7d 0a 7d 20 7b  'key2');.  }.} {
f920: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
f930: 2d 34 32 2e 38 20 7b 0a 20 20 63 61 74 63 68 73  -42.8 {.  catchs
f940: 71 6c 20 7b 20 52 45 50 4c 41 43 45 20 49 4e 54  ql { REPLACE INT
f950: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
f960: 27 6b 65 79 31 27 29 20 7d 0a 7d 20 7b 31 20 7b  'key1') }.} {1 {
f970: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f980: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
f990: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f9a0: 32 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.9 {.  execsql 
f9b0: 7b 20 0a 20 20 20 20 52 45 50 4c 41 43 45 20 49  { .    REPLACE I
f9c0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f9d0: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 53  S('key2');.    S
f9e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69  ELECT * FROM chi
f9f0: 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79 32  ld2;.  }.} {key2
fa00: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
fa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
fa50: 54 65 73 74 20 74 68 61 74 20 52 45 53 54 52 49  Test that RESTRI
fa60: 43 54 20 69 73 20 65 6e 66 6f 72 63 65 64 20 69  CT is enforced i
fa70: 6d 6d 65 64 69 61 74 65 6c 79 2c 20 65 76 65 6e  mmediately, even
fa80: 20 66 6f 72 20 61 20 44 45 46 45 52 52 45 44 20   for a DEFERRED 
fa90: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20  constraint..#.# 
faa0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
fab0: 34 31 37 39 2d 36 30 35 32 33 20 45 76 65 6e 20  4179-60523 Even 
fac0: 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  if the foreign k
fad0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 74  ey constraint it
fae0: 20 69 73 0a 23 20 61 74 74 61 63 68 65 64 20 74   is.# attached t
faf0: 6f 20 69 73 20 64 65 66 65 72 72 65 64 2c 20 63  o is deferred, c
fb00: 6f 6e 66 69 67 75 72 69 6e 67 20 61 20 52 45 53  onfiguring a RES
fb10: 54 52 49 43 54 20 61 63 74 69 6f 6e 20 63 61 75  TRICT action cau
fb20: 73 65 73 20 53 51 4c 69 74 65 0a 23 20 74 6f 20  ses SQLite.# to 
fb30: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
fb40: 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 61  immediately if a
fb50: 20 70 61 72 65 6e 74 20 6b 65 79 20 77 69 74 68   parent key with
fb60: 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64   dependent child
fb70: 0a 23 20 6b 65 79 73 20 69 73 20 64 65 6c 65 74  .# keys is delet
fb80: 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 0a  ed or modified..
fb90: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
fba0: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
fbb0: 2d 34 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -43.1 {.  execsq
fbc0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
fbd0: 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52  ABLE parent(x PR
fbe0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
fbf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
fc00: 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld1(c REFERENCES
fc10: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
fc20: 45 20 52 45 53 54 52 49 43 54 0a 20 20 20 20 20  E RESTRICT.     
fc30: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
fc40: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
fc50: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
fc60: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20   TABLE child2(c 
fc70: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
fc80: 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41  t ON UPDATE NO A
fc90: 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45  CTION.      DEFE
fca0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
fcb0: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
fcc0: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
fcd0: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
fce0: 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
fcf0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
fd00: 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
fd10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fd20: 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b  child1 VALUES('k
fd30: 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey1');.    INSER
fd40: 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41  T INTO child2 VA
fd50: 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20  LUES('key2');.  
fd60: 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b    BEGIN;.  }.} {
fd70: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
fd80: 2d 34 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -43.2 {.  catchs
fd90: 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65  ql { UPDATE pare
fda0: 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79 20  nt SET x = 'key 
fdb0: 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d 20 27  one' WHERE x = '
fdc0: 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f  key1' }.} {1 {fo
fdd0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
fde0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
fdf0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
fe00: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
fe10: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
fe20: 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f 27 20  T x = 'key two' 
fe30: 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32 27  WHERE x = 'key2'
fe40: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
fe50: 65 5f 66 6b 65 79 2d 34 33 2e 34 20 7b 0a 20 20  e_fkey-43.4 {.  
fe60: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
fe70: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
fe80: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
fe90: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
fea0: 66 6b 65 79 2d 34 33 2e 35 20 7b 0a 20 20 65 78  fkey-43.5 {.  ex
feb0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
fec0: 54 45 20 63 68 69 6c 64 32 20 53 45 54 20 63 20  TE child2 SET c 
fed0: 3d 20 27 6b 65 79 20 74 77 6f 27 3b 0a 20 20 20  = 'key two';.   
fee0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
fef0: 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  }..drop_all_tabl
ff00: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
ff10: 79 2d 34 33 2e 36 20 7b 0a 20 20 65 78 65 63 73  y-43.6 {.  execs
ff20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
ff30: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50  TABLE parent(x P
ff40: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
ff50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
ff60: 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45  ild1(c REFERENCE
ff70: 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45  S parent ON DELE
ff80: 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20 20  TE RESTRICT.    
ff90: 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49    DEFERRABLE INI
ffa0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
ffb0: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
ffc0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63  E TABLE child2(c
ffd0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
ffe0: 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20  nt ON DELETE NO 
fff0: 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46  ACTION.      DEF
10000 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
10010 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
10020 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
10030 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
10040 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
10050 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
10060 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
10070 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10080 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27   child1 VALUES('
10090 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
100a0 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56  RT INTO child2 V
100b0 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
100c0 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20     BEGIN;.  }.} 
100d0 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
100e0 79 2d 34 33 2e 37 20 7b 0a 20 20 63 61 74 63 68  y-43.7 {.  catch
100f0 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
10100 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
10110 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31   = 'key1' }.} {1
10120 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
10130 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
10140 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10150 2d 34 33 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  -43.8 {.  execsq
10160 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
10170 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
10180 20 27 6b 65 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64   'key2' }.} {}.d
10190 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
101a0 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .9 {.  catchsql 
101b0 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72  COMMIT.} {1 {for
101c0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
101d0 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
101e0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 31  test e_fkey-43.1
101f0 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
10200 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64      UPDATE child
10210 32 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c 3b 0a  2 SET c = NULL;.
10220 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
10230 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10280 0a 23 20 54 65 73 74 20 53 45 54 20 4e 55 4c 4c  .# Test SET NULL
10290 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56   actions..#.# EV
102a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 33  IDENCE-OF: R-033
102b0 35 33 2d 30 35 33 32 37 20 49 66 20 74 68 65 20  53-05327 If the 
102c0 63 6f 6e 66 69 67 75 72 65 64 20 61 63 74 69 6f  configured actio
102d0 6e 20 69 73 20 22 53 45 54 20 4e 55 4c 4c 22 2c  n is "SET NULL",
102e0 0a 23 20 74 68 65 6e 20 77 68 65 6e 20 61 20 70  .# then when a p
102f0 61 72 65 6e 74 20 6b 65 79 20 69 73 20 64 65 6c  arent key is del
10300 65 74 65 64 20 28 66 6f 72 20 4f 4e 20 44 45 4c  eted (for ON DEL
10310 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 20 6f 72  ETE SET NULL) or
10320 20 6d 6f 64 69 66 69 65 64 0a 23 20 28 66 6f 72   modified.# (for
10330 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e   ON UPDATE SET N
10340 55 4c 4c 29 2c 20 74 68 65 20 63 68 69 6c 64 20  ULL), the child 
10350 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  key columns of a
10360 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 23  ll rows in the.#
10370 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74 68 61   child table tha
10380 74 20 6d 61 70 70 65 64 20 74 6f 20 74 68 65 20  t mapped to the 
10390 70 61 72 65 6e 74 20 6b 65 79 20 61 72 65 20 73  parent key are s
103a0 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 53 51  et to contain SQ
103b0 4c 20 4e 55 4c 4c 0a 23 20 76 61 6c 75 65 73 2e  L NULL.# values.
103c0 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
103d0 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
103e0 79 2d 34 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-44.1 {.  execs
103f0 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
10400 54 41 42 4c 45 20 70 41 28 78 20 50 52 49 4d 41  TABLE pA(x PRIMA
10410 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
10420 41 54 45 20 54 41 42 4c 45 20 63 41 28 63 20 52  ATE TABLE cA(c R
10430 45 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20  EFERENCES pA ON 
10440 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29  DELETE SET NULL)
10450 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
10460 4c 45 20 63 42 28 63 20 52 45 46 45 52 45 4e 43  LE cB(c REFERENC
10470 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54 45 20  ES pA ON UPDATE 
10480 53 45 54 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  SET NULL);..    
10490 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 20 56  INSERT INTO pA V
104a0 41 4c 55 45 53 28 58 27 41 42 43 44 27 29 3b 0a  ALUES(X'ABCD');.
104b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
104c0 70 41 20 56 41 4c 55 45 53 28 58 27 31 32 33 34  pA VALUES(X'1234
104d0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
104e0 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28 58 27  NTO cA VALUES(X'
104f0 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45  ABCD');.    INSE
10500 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c 55 45  RT INTO cB VALUE
10510 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20 7d 0a  S(X'1234');.  }.
10520 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
10530 6b 65 79 2d 34 34 2e 32 20 7b 0a 20 20 65 78 65  key-44.2 {.  exe
10540 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
10550 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52 45 20  E FROM pA WHERE 
10560 72 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 53  rowid = 1;.    S
10570 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20 46  ELECT quote(x) F
10580 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58  ROM pA;.  }.} {X
10590 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73 74 20  '1234'}.do_test 
105a0 65 5f 66 6b 65 79 2d 34 34 2e 33 20 7b 0a 20 20  e_fkey-44.3 {.  
105b0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
105c0 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46 52  LECT quote(c) FR
105d0 4f 4d 20 63 41 3b 0a 20 20 7d 0a 7d 20 7b 4e 55  OM cA;.  }.} {NU
105e0 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  LL}.do_test e_fk
105f0 65 79 2d 34 34 2e 34 20 7b 0a 20 20 65 78 65 63  ey-44.4 {.  exec
10600 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
10610 20 70 41 20 53 45 54 20 78 20 3d 20 58 27 38 37   pA SET x = X'87
10620 36 35 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  65' WHERE rowid 
10630 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 2;.    SELECT 
10640 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41  quote(x) FROM pA
10650 3b 0a 20 20 7d 0a 7d 20 7b 58 27 38 37 36 35 27  ;.  }.} {X'8765'
10660 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10670 2d 34 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -44.5 {.  execsq
10680 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65  l { SELECT quote
10690 28 63 29 20 46 52 4f 4d 20 63 42 20 7d 0a 7d 20  (c) FROM cB }.} 
106a0 7b 4e 55 4c 4c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {NULL}..#-------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106f0 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20 44 45  --.# Test SET DE
10700 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e 0a 23  FAULT actions..#
10710 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10720 52 2d 34 33 30 35 34 2d 35 34 38 33 32 20 54 68  R-43054-54832 Th
10730 65 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 20  e "SET DEFAULT" 
10740 61 63 74 69 6f 6e 73 20 61 72 65 20 73 69 6d 69  actions are simi
10750 6c 61 72 20 74 6f 0a 23 20 22 53 45 54 20 4e 55  lar to.# "SET NU
10760 4c 4c 22 2c 20 65 78 63 65 70 74 20 74 68 61 74  LL", except that
10770 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
10780 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  ld key columns i
10790 73 20 73 65 74 20 74 6f 0a 23 20 63 6f 6e 74 61  s set to.# conta
107a0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 64  in the columns d
107b0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69 6e 73  efault value ins
107c0 74 65 61 64 20 6f 66 20 4e 55 4c 4c 2e 0a 23 0a  tead of NULL..#.
107d0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
107e0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
107f0 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
10800 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10810 4c 45 20 70 41 28 78 20 50 52 49 4d 41 52 59 20  LE pA(x PRIMARY 
10820 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
10830 20 54 41 42 4c 45 20 63 41 28 63 20 44 45 46 41   TABLE cA(c DEFA
10840 55 4c 54 20 58 27 30 30 30 30 27 20 52 45 46 45  ULT X'0000' REFE
10850 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 44 45 4c  RENCES pA ON DEL
10860 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 29  ETE SET DEFAULT)
10870 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
10880 4c 45 20 63 42 28 63 20 44 45 46 41 55 4c 54 20  LE cB(c DEFAULT 
10890 58 27 39 39 39 39 27 20 52 45 46 45 52 45 4e 43  X'9999' REFERENC
108a0 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54 45 20  ES pA ON UPDATE 
108b0 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 0a 20  SET DEFAULT);.. 
108c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
108d0 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55  A(rowid, x) VALU
108e0 45 53 28 31 2c 20 58 27 30 30 30 30 27 29 3b 0a  ES(1, X'0000');.
108f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10900 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c  pA(rowid, x) VAL
10910 55 45 53 28 32 2c 20 58 27 39 39 39 39 27 29 3b  UES(2, X'9999');
10920 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10930 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41   pA(rowid, x) VA
10940 4c 55 45 53 28 33 2c 20 58 27 41 42 43 44 27 29  LUES(3, X'ABCD')
10950 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10960 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56  O pA(rowid, x) V
10970 41 4c 55 45 53 28 34 2c 20 58 27 31 32 33 34 27  ALUES(4, X'1234'
10980 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
10990 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28 58 27  NTO cA VALUES(X'
109a0 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45  ABCD');.    INSE
109b0 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c 55 45  RT INTO cB VALUE
109c0 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20 7d 0a  S(X'1234');.  }.
109d0 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
109e0 6b 65 79 2d 34 35 2e 32 20 7b 0a 20 20 65 78 65  key-45.2 {.  exe
109f0 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
10a00 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52 45 20  E FROM pA WHERE 
10a10 72 6f 77 69 64 20 3d 20 33 3b 0a 20 20 20 20 53  rowid = 3;.    S
10a20 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20 46  ELECT quote(x) F
10a30 52 4f 4d 20 70 41 20 4f 52 44 45 52 20 42 59 20  ROM pA ORDER BY 
10a40 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b 58 27  rowid;.  }.} {X'
10a50 30 30 30 30 27 20 58 27 39 39 39 39 27 20 58 27  0000' X'9999' X'
10a60 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73 74 20 65  1234'}.do_test e
10a70 5f 66 6b 65 79 2d 34 35 2e 33 20 7b 0a 20 20 65  _fkey-45.3 {.  e
10a80 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
10a90 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63 41  quote(c) FROM cA
10aa0 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27 7d 0a 64   }.} {X'0000'}.d
10ab0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 35  o_test e_fkey-45
10ac0 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
10ad0 0a 20 20 20 20 55 50 44 41 54 45 20 70 41 20 53  .    UPDATE pA S
10ae0 45 54 20 78 20 3d 20 58 27 38 37 36 35 27 20 57  ET x = X'8765' W
10af0 48 45 52 45 20 72 6f 77 69 64 20 3d 20 34 3b 0a  HERE rowid = 4;.
10b00 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65      SELECT quote
10b10 28 78 29 20 46 52 4f 4d 20 70 41 20 4f 52 44 45  (x) FROM pA ORDE
10b20 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d 0a  R BY rowid;.  }.
10b30 7d 20 7b 58 27 30 30 30 30 27 20 58 27 39 39 39  } {X'0000' X'999
10b40 39 27 20 58 27 38 37 36 35 27 7d 0a 64 6f 5f 74  9' X'8765'}.do_t
10b50 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 35 20  est e_fkey-45.5 
10b60 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
10b70 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46 52  LECT quote(c) FR
10b80 4f 4d 20 63 42 20 7d 0a 7d 20 7b 58 27 39 39 39  OM cB }.} {X'999
10b90 39 27 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  9'}..#----------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10be0 23 20 54 65 73 74 20 4f 4e 20 44 45 4c 45 54 45  # Test ON DELETE
10bf0 20 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e 73   CASCADE actions
10c00 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
10c10 46 3a 20 52 2d 36 31 33 37 36 2d 35 37 32 36 37  F: R-61376-57267
10c20 20 41 20 22 43 41 53 43 41 44 45 22 20 61 63 74   A "CASCADE" act
10c30 69 6f 6e 20 70 72 6f 70 61 67 61 74 65 73 20 74  ion propagates t
10c40 68 65 20 64 65 6c 65 74 65 20 6f 72 0a 23 20 75  he delete or.# u
10c50 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  pdate operation 
10c60 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  on the parent ke
10c70 79 20 74 6f 20 65 61 63 68 20 64 65 70 65 6e 64  y to each depend
10c80 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23  ent child key..#
10c90 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10ca0 52 2d 36 31 38 30 39 2d 36 32 32 30 37 20 46 6f  R-61809-62207 Fo
10cb0 72 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20  r an "ON DELETE 
10cc0 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 2c  CASCADE" action,
10cd0 20 74 68 69 73 0a 23 20 6d 65 61 6e 73 20 74 68   this.# means th
10ce0 61 74 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  at each row in t
10cf0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74  he child table t
10d00 68 61 74 20 77 61 73 20 61 73 73 6f 63 69 61 74  hat was associat
10d10 65 64 20 77 69 74 68 20 74 68 65 0a 23 20 64 65  ed with the.# de
10d20 6c 65 74 65 64 20 70 61 72 65 6e 74 20 72 6f 77  leted parent row
10d30 20 69 73 20 61 6c 73 6f 20 64 65 6c 65 74 65 64   is also deleted
10d40 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
10d50 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
10d60 65 79 2d 34 36 2e 31 20 7b 0a 20 20 65 78 65 63  ey-46.1 {.  exec
10d70 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
10d80 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 20 55   TABLE p1(a, b U
10d90 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
10da0 54 45 20 54 41 42 4c 45 20 63 31 28 63 20 52 45  TE TABLE c1(c RE
10db0 46 45 52 45 4e 43 45 53 20 70 31 28 62 29 20 4f  FERENCES p1(b) O
10dc0 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
10dd0 2c 20 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , d);.    INSERT
10de0 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
10df0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  NULL, NULL);.   
10e00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20   INSERT INTO p1 
10e10 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20 20  VALUES(4, 4);.  
10e20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
10e30 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20   VALUES(5, 5);. 
10e40 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10e50 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e  1 VALUES(NULL, N
10e60 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
10e70 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
10e80 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  4, 4);.    INSER
10e90 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
10ea0 28 35 2c 20 35 29 3b 0a 20 20 20 20 53 45 4c 45  (5, 5);.    SELE
10eb0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
10ec0 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64   c1;.  }.} {3}.d
10ed0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36  o_test e_fkey-46
10ee0 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
10ef0 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
10f00 20 70 31 20 57 48 45 52 45 20 61 20 3d 20 34 3b   p1 WHERE a = 4;
10f10 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63  .    SELECT d, c
10f20 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20   FROM c1;.  }.} 
10f30 7b 7b 7d 20 7b 7d 20 35 20 35 7d 0a 64 6f 5f 74  {{} {} 5 5}.do_t
10f40 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 33 20  est e_fkey-46.3 
10f50 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10f60 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 31    DELETE FROM p1
10f70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20  ;.    SELECT d, 
10f80 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  c FROM c1;.  }.}
10f90 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74   {{} {}}.do_test
10fa0 20 65 5f 66 6b 65 79 2d 34 36 2e 34 20 7b 0a 20   e_fkey-46.4 {. 
10fb0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
10fc0 54 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d 20  T * FROM p1 }.} 
10fd0 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}...#----------
10fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11020 23 20 54 65 73 74 20 4f 4e 20 55 50 44 41 54 45  # Test ON UPDATE
11030 20 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e 73   CASCADE actions
11040 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
11050 46 3a 20 52 2d 31 33 38 37 37 2d 36 34 35 34 32  F: R-13877-64542
11060 20 46 6f 72 20 61 6e 20 22 4f 4e 20 55 50 44 41   For an "ON UPDA
11070 54 45 20 43 41 53 43 41 44 45 22 20 61 63 74 69  TE CASCADE" acti
11080 6f 6e 2c 20 69 74 20 6d 65 61 6e 73 0a 23 20 74  on, it means.# t
11090 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  hat the values s
110a0 74 6f 72 65 64 20 69 6e 20 65 61 63 68 20 64 65  tored in each de
110b0 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65  pendent child ke
110c0 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 74  y are modified t
110d0 6f 0a 23 20 6d 61 74 63 68 20 74 68 65 20 6e 65  o.# match the ne
110e0 77 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c  w parent key val
110f0 75 65 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ues..#.# EVIDENC
11100 45 2d 4f 46 3a 20 52 2d 36 31 33 37 36 2d 35 37  E-OF: R-61376-57
11110 32 36 37 20 41 20 22 43 41 53 43 41 44 45 22 20  267 A "CASCADE" 
11120 61 63 74 69 6f 6e 20 70 72 6f 70 61 67 61 74 65  action propagate
11130 73 20 74 68 65 20 64 65 6c 65 74 65 20 6f 72 0a  s the delete or.
11140 23 20 75 70 64 61 74 65 20 6f 70 65 72 61 74 69  # update operati
11150 6f 6e 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  on on the parent
11160 20 6b 65 79 20 74 6f 20 65 61 63 68 20 64 65 70   key to each dep
11170 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65 79  endent child key
11180 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
11190 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
111a0 65 79 2d 34 37 2e 31 20 7b 0a 20 20 65 78 65 63  ey-47.1 {.  exec
111b0 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
111c0 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 20 55   TABLE p1(a, b U
111d0 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
111e0 54 45 20 54 41 42 4c 45 20 63 31 28 63 20 52 45  TE TABLE c1(c RE
111f0 46 45 52 45 4e 43 45 53 20 70 31 28 62 29 20 4f  FERENCES p1(b) O
11200 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
11210 2c 20 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , d);.    INSERT
11220 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
11230 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  NULL, NULL);.   
11240 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20   INSERT INTO p1 
11250 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20 20  VALUES(4, 4);.  
11260 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
11270 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20   VALUES(5, 5);. 
11280 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
11290 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e  1 VALUES(NULL, N
112a0 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
112b0 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
112c0 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  4, 4);.    INSER
112d0 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
112e0 28 35 2c 20 35 29 3b 0a 20 20 20 20 53 45 4c 45  (5, 5);.    SELE
112f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
11300 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64   c1;.  }.} {3}.d
11310 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 37  o_test e_fkey-47
11320 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
11330 0a 20 20 20 20 55 50 44 41 54 45 20 70 31 20 53  .    UPDATE p1 S
11340 45 54 20 62 20 3d 20 31 30 20 57 48 45 52 45 20  ET b = 10 WHERE 
11350 62 20 3d 20 35 3b 0a 20 20 20 20 53 45 4c 45 43  b = 5;.    SELEC
11360 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a  T d, c FROM c1;.
11370 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 34    }.} {{} {} 4 4
11380 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65   5 10}.do_test e
11390 5f 66 6b 65 79 2d 34 37 2e 33 20 7b 0a 20 20 65  _fkey-47.3 {.  e
113a0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
113b0 41 54 45 20 70 31 20 53 45 54 20 62 20 3d 20 31  ATE p1 SET b = 1
113c0 31 20 57 48 45 52 45 20 62 20 3d 20 34 3b 0a 20  1 WHERE b = 4;. 
113d0 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46     SELECT d, c F
113e0 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b  ROM c1;.  }.} {{
113f0 7d 20 7b 7d 20 34 20 31 31 20 35 20 31 30 7d 0a  } {} 4 11 5 10}.
11400 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
11410 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.4 {.  execsql 
11420 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 70 31  { .    UPDATE p1
11430 20 53 45 54 20 62 20 3d 20 36 20 57 48 45 52 45   SET b = 6 WHERE
11440 20 62 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 20 20   b IS NULL;.    
11450 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d  SELECT d, c FROM
11460 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b   c1;.  }.} {{} {
11470 7d 20 34 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f  } 4 11 5 10}.do_
11480 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 35  test e_fkey-46.5
11490 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
114a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 31 20  ELECT * FROM p1 
114b0 7d 0a 7d 20 7b 7b 7d 20 36 20 34 20 31 31 20 35  }.} {{} 6 4 11 5
114c0 20 31 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   10}..#---------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11510 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
11520 52 2d 36 35 30 35 38 2d 35 37 31 35 38 0a 23 0a  R-65058-57158.#.
11530 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c  # Test an exampl
11540 65 20 66 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44  e from the "ON D
11550 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44  ELETE and ON UPD
11560 41 54 45 20 41 63 74 69 6f 6e 73 22 20 73 65 63  ATE Actions" sec
11570 74 69 6f 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69  tion .# of forei
11580 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64  gnkeys.html..#.d
11590 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
115a0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38  o_test e_fkey-48
115b0 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
115c0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
115d0 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20  E artist(.      
115e0 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45  artistid    INTE
115f0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
11600 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61   .      artistna
11610 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a  me  TEXT.    );.
11620 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11630 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72   track(.      tr
11640 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45  ackid     INTEGE
11650 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61  R,.      trackna
11660 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20  me   TEXT, .    
11670 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e    trackartist IN
11680 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53  TEGER REFERENCES
11690 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
116a0 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  ) ON UPDATE CASC
116b0 41 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  ADE.    );..    
116c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
116d0 73 74 20 56 41 4c 55 45 53 28 31 2c 20 27 44 65  st VALUES(1, 'De
116e0 61 6e 20 4d 61 72 74 69 6e 27 29 3b 0a 20 20 20  an Martin');.   
116f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74   INSERT INTO art
11700 69 73 74 20 56 41 4c 55 45 53 28 32 2c 20 27 46  ist VALUES(2, 'F
11710 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 29 3b 0a  rank Sinatra');.
11720 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11730 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 31 2c  track VALUES(11,
11740 20 27 54 68 61 74 27 27 73 20 41 6d 6f 72 65 27   'That''s Amore'
11750 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
11760 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
11770 45 53 28 31 32 2c 20 27 43 68 72 69 73 74 6d 61  ES(12, 'Christma
11780 73 20 42 6c 75 65 73 27 2c 20 31 29 3b 0a 20 20  s Blues', 1);.  
11790 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72    INSERT INTO tr
117a0 61 63 6b 20 56 41 4c 55 45 53 28 31 33 2c 20 27  ack VALUES(13, '
117b0 4d 79 20 57 61 79 27 2c 20 32 29 3b 0a 20 20 7d  My Way', 2);.  }
117c0 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
117d0 66 6b 65 79 2d 34 38 2e 32 20 7b 0a 20 20 65 78  fkey-48.2 {.  ex
117e0 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
117f0 54 45 20 61 72 74 69 73 74 20 53 45 54 20 61 72  TE artist SET ar
11800 74 69 73 74 69 64 20 3d 20 31 30 30 20 57 48 45  tistid = 100 WHE
11810 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20  RE artistname = 
11820 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20  'Dean Martin';. 
11830 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
11840 65 5f 66 6b 65 79 2d 34 38 2e 33 20 7b 0a 20 20  e_fkey-48.3 {.  
11850 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
11860 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20 7d   * FROM artist }
11870 0a 7d 20 7b 32 20 7b 46 72 61 6e 6b 20 53 69 6e  .} {2 {Frank Sin
11880 61 74 72 61 7d 20 31 30 30 20 7b 44 65 61 6e 20  atra} 100 {Dean 
11890 4d 61 72 74 69 6e 7d 7d 0a 64 6f 5f 74 65 73 74  Martin}}.do_test
118a0 20 65 5f 66 6b 65 79 2d 34 38 2e 34 20 7b 0a 20   e_fkey-48.4 {. 
118b0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
118c0 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b 20 7d  T * FROM track }
118d0 0a 7d 20 7b 31 31 20 7b 54 68 61 74 27 73 20 41  .} {11 {That's A
118e0 6d 6f 72 65 7d 20 31 30 30 20 31 32 20 7b 43 68  more} 100 12 {Ch
118f0 72 69 73 74 6d 61 73 20 42 6c 75 65 73 7d 20 31  ristmas Blues} 1
11900 30 30 20 31 33 20 7b 4d 79 20 57 61 79 7d 20 32  00 13 {My Way} 2
11910 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11960 20 56 65 72 69 66 79 20 74 68 61 74 20 61 64 64   Verify that add
11970 69 6e 67 20 61 6e 20 46 4b 20 61 63 74 69 6f 6e  ing an FK action
11980 20 64 6f 65 73 20 6e 6f 74 20 61 62 73 6f 6c 76   does not absolv
11990 65 20 74 68 65 20 75 73 65 72 20 6f 66 20 74 68  e the user of th
119a0 65 20 0a 23 20 72 65 71 75 69 72 65 6d 65 6e 74  e .# requirement
119b0 20 6e 6f 74 20 74 6f 20 76 69 6f 6c 61 74 65 20   not to violate 
119c0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
119d0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20  constraint..#.# 
119e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
119f0 33 39 36 38 2d 35 31 36 34 32 20 43 6f 6e 66 69  3968-51642 Confi
11a00 67 75 72 69 6e 67 20 61 6e 20 4f 4e 20 55 50 44  guring an ON UPD
11a10 41 54 45 20 6f 72 20 4f 4e 20 44 45 4c 45 54 45  ATE or ON DELETE
11a20 0a 23 20 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  .# action does n
11a30 6f 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ot mean that the
11a40 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
11a50 73 74 72 61 69 6e 74 20 64 6f 65 73 20 6e 6f 74  straint does not
11a60 20 6e 65 65 64 20 74 6f 0a 23 20 62 65 20 73 61   need to.# be sa
11a70 74 69 73 66 69 65 64 2e 0a 23 0a 64 72 6f 70 5f  tisfied..#.drop_
11a80 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
11a90 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 31 20 7b  st e_fkey-49.1 {
11aa0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11ab0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
11ac0 72 65 6e 74 28 61 20 43 4f 4c 4c 41 54 45 20 6e  rent(a COLLATE n
11ad0 6f 63 61 73 65 2c 20 62 2c 20 63 2c 20 50 52 49  ocase, b, c, PRI
11ae0 4d 41 52 59 20 4b 45 59 28 63 2c 20 61 29 29 3b  MARY KEY(c, a));
11af0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11b00 45 20 63 68 69 6c 64 28 64 20 44 45 46 41 55 4c  E child(d DEFAUL
11b10 54 20 27 61 27 2c 20 65 2c 20 66 20 44 45 46 41  T 'a', e, f DEFA
11b20 55 4c 54 20 27 63 27 2c 0a 20 20 20 20 20 20 46  ULT 'c',.      F
11b30 4f 52 45 49 47 4e 20 4b 45 59 28 66 2c 20 64 29  OREIGN KEY(f, d)
11b40 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
11b50 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54  nt ON UPDATE SET
11b60 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a   DEFAULT.    );.
11b70 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11b80 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
11b90 41 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20  A', 'b', 'c');. 
11ba0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
11bb0 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 4f 4e  arent VALUES('ON
11bc0 45 27 2c 20 27 74 77 6f 27 2c 20 27 74 68 72 65  E', 'two', 'thre
11bd0 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
11be0 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45  INTO child VALUE
11bf0 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27 2c 20  S('one', 'two', 
11c00 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a 7d 20  'three');.  }.} 
11c10 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
11c20 79 2d 34 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-49.2 {.  execs
11c30 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
11c40 20 20 20 20 20 20 55 50 44 41 54 45 20 70 61 72        UPDATE par
11c50 65 6e 74 20 53 45 54 20 61 20 3d 20 27 27 20 57  ent SET a = '' W
11c60 48 45 52 45 20 61 20 3d 20 27 6f 4e 65 27 3b 0a  HERE a = 'oNe';.
11c70 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
11c80 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d  ROM child;.  }.}
11c90 20 7b 61 20 74 77 6f 20 63 7d 0a 64 6f 5f 74 65   {a two c}.do_te
11ca0 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 33 20 7b  st e_fkey-49.3 {
11cb0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11cc0 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 44   ROLLBACK;.    D
11cd0 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
11ce0 74 20 57 48 45 52 45 20 61 20 3d 20 27 41 27 3b  t WHERE a = 'A';
11cf0 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
11d00 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20 7d 0a 7d  OM parent;.  }.}
11d10 20 7b 4f 4e 45 20 74 77 6f 20 74 68 72 65 65 7d   {ONE two three}
11d20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11d30 34 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  49.4 {.  catchsq
11d40 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e  l { UPDATE paren
11d50 74 20 53 45 54 20 61 20 3d 20 27 27 20 57 48 45  t SET a = '' WHE
11d60 52 45 20 61 20 3d 20 27 6f 4e 65 27 20 7d 0a 7d  RE a = 'oNe' }.}
11d70 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
11d80 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
11d90 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ed}}...#--------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
11df0 20 52 2d 31 31 38 35 36 2d 31 39 38 33 36 0a 23   R-11856-19836.#
11e00 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70  .# Test an examp
11e10 6c 65 20 66 72 6f 6d 20 74 68 65 20 22 4f 4e 20  le from the "ON 
11e20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50  DELETE and ON UP
11e30 44 41 54 45 20 41 63 74 69 6f 6e 73 22 20 73 65  DATE Actions" se
11e40 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66 6f 72 65  ction .# of fore
11e50 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 54 68  ignkeys.html. Th
11e60 69 73 20 65 78 61 6d 70 6c 65 20 73 68 6f 77 73  is example shows
11e70 20 74 68 61 74 20 61 64 64 69 6e 67 20 61 6e 20   that adding an 
11e80 22 4f 4e 20 44 45 4c 45 54 45 20 44 45 46 41 55  "ON DELETE DEFAU
11e90 4c 54 22 0a 23 20 63 6c 61 75 73 65 20 64 6f 65  LT".# clause doe
11ea0 73 20 6e 6f 74 20 61 62 72 6f 67 61 74 65 20 74  s not abrogate t
11eb0 68 65 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  he need to satis
11ec0 66 79 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  fy the foreign k
11ed0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20  ey constraint.# 
11ee0 28 52 2d 32 38 32 32 30 2d 34 36 36 39 34 29 2e  (R-28220-46694).
11ef0 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
11f00 3a 20 52 2d 32 38 32 32 30 2d 34 36 36 39 34 20  : R-28220-46694 
11f10 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
11f20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20 53 45  an "ON DELETE SE
11f30 54 20 44 45 46 41 55 4c 54 22 0a 23 20 61 63 74  T DEFAULT".# act
11f40 69 6f 6e 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ion is configure
11f50 64 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  d, but there is 
11f60 6e 6f 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61  no row in the pa
11f70 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a  rent table that.
11f80 23 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  # corresponds to
11f90 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
11fa0 75 65 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ues of the child
11fb0 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 64 65   key columns, de
11fc0 6c 65 74 69 6e 67 20 61 0a 23 20 70 61 72 65 6e  leting a.# paren
11fd0 74 20 6b 65 79 20 77 68 69 6c 65 20 64 65 70 65  t key while depe
11fe0 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 73  ndent child keys
11ff0 20 65 78 69 73 74 20 73 74 69 6c 6c 20 63 61 75   exist still cau
12000 73 65 73 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  ses a foreign ke
12010 79 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23  y.# violation..#
12020 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
12030 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
12040 35 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  50.1 {.  execsql
12050 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
12060 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20 20  BLE artist(.    
12070 20 20 61 72 74 69 73 74 69 64 20 20 20 20 49 4e    artistid    IN
12080 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12090 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73 74  Y, .      artist
120a0 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29  name  TEXT.    )
120b0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
120c0 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20  LE track(.      
120d0 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45  trackid     INTE
120e0 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b  GER,.      track
120f0 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20  name   TEXT, .  
12100 20 20 20 20 74 72 61 63 6b 61 72 74 69 73 74 20      trackartist 
12110 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
12120 30 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  0 REFERENCES art
12130 69 73 74 28 61 72 74 69 73 74 69 64 29 20 4f 4e  ist(artistid) ON
12140 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41   DELETE SET DEFA
12150 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 49  ULT.    );.    I
12160 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73  NSERT INTO artis
12170 74 20 56 41 4c 55 45 53 28 33 2c 20 27 53 61 6d  t VALUES(3, 'Sam
12180 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 29 3b 0a  my Davis Jr.');.
12190 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
121a0 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34 2c  track VALUES(14,
121b0 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27   'Mr. Bojangles'
121c0 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 3);.  }.} {}.d
121d0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30  o_test e_fkey-50
121e0 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
121f0 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72  { DELETE FROM ar
12200 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
12210 74 6e 61 6d 65 20 3d 20 27 53 61 6d 6d 79 20 44  tname = 'Sammy D
12220 61 76 69 73 20 4a 72 2e 27 20 7d 0a 7d 20 7b 31  avis Jr.' }.} {1
12230 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
12240 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
12250 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
12260 2d 35 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -50.3 {.  execsq
12270 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
12280 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
12290 53 28 30 2c 20 27 55 6e 6b 6e 6f 77 6e 20 41 72  S(0, 'Unknown Ar
122a0 74 69 73 74 27 29 3b 0a 20 20 20 20 44 45 4c 45  tist');.    DELE
122b0 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
122c0 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20  HERE artistname 
122d0 3d 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a  = 'Sammy Davis J
122e0 72 2e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  r.';.  }.} {}.do
122f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e  _test e_fkey-50.
12300 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
12310 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 72  SELECT * FROM ar
12320 74 69 73 74 20 7d 0a 7d 20 7b 30 20 7b 55 6e 6b  tist }.} {0 {Unk
12330 6e 6f 77 6e 20 41 72 74 69 73 74 7d 7d 0a 64 6f  nown Artist}}.do
12340 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e  _test e_fkey-50.
12350 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
12360 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 72  SELECT * FROM tr
12370 61 63 6b 20 7d 0a 7d 20 7b 31 34 20 7b 4d 72 2e  ack }.} {14 {Mr.
12380 20 42 6f 6a 61 6e 67 6c 65 73 7d 20 30 7d 0a 0a   Bojangles} 0}..
12390 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
123a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
123e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 35 36  DENCE-OF: R-0956
123f0 34 2d 32 32 31 37 30 0a 23 0a 23 20 43 68 65 63  4-22170.#.# Chec
12400 6b 20 74 68 61 74 20 74 68 65 20 6f 72 64 65 72  k that the order
12410 20 6f 66 20 73 74 65 70 73 20 69 6e 20 61 6e 20   of steps in an 
12420 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
12430 20 6f 6e 20 61 20 70 61 72 65 6e 74 20 0a 23 20   on a parent .# 
12440 74 61 62 6c 65 20 69 73 20 61 73 20 66 6f 6c 6c  table is as foll
12450 6f 77 73 3a 0a 23 0a 23 20 20 20 31 2e 20 45 78  ows:.#.#   1. Ex
12460 65 63 75 74 65 20 61 70 70 6c 69 63 61 62 6c 65  ecute applicable
12470 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20   BEFORE trigger 
12480 70 72 6f 67 72 61 6d 73 2c 0a 23 20 20 20 32 2e  programs,.#   2.
12490 20 43 68 65 63 6b 20 6c 6f 63 61 6c 20 28 6e 6f   Check local (no
124a0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 29 20 63  n foreign key) c
124b0 6f 6e 73 74 72 61 69 6e 74 73 2c 0a 23 20 20 20  onstraints,.#   
124c0 33 2e 20 55 70 64 61 74 65 20 6f 72 20 64 65 6c  3. Update or del
124d0 65 74 65 20 74 68 65 20 72 6f 77 20 69 6e 20 74  ete the row in t
124e0 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c  he parent table,
124f0 0a 23 20 20 20 34 2e 20 50 65 72 66 6f 72 6d 20  .#   4. Perform 
12500 61 6e 79 20 72 65 71 75 69 72 65 64 20 66 6f 72  any required for
12510 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73  eign key actions
12520 2c 0a 23 20 20 20 35 2e 20 45 78 65 63 75 74 65  ,.#   5. Execute
12530 20 61 70 70 6c 69 63 61 62 6c 65 20 41 46 54 45   applicable AFTE
12540 52 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  R trigger progra
12550 6d 73 2e 20 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ms. .#.drop_all_
12560 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
12570 5f 66 6b 65 79 2d 35 31 2e 31 20 7b 0a 20 20 70  _fkey-51.1 {.  p
12580 72 6f 63 20 6d 61 78 70 61 72 65 6e 74 20 7b 61  roc maxparent {a
12590 72 67 73 7d 20 7b 20 64 62 20 6f 6e 65 20 7b 53  rgs} { db one {S
125a0 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
125b0 4d 20 70 61 72 65 6e 74 7d 20 7d 0a 20 20 64 62  M parent} }.  db
125c0 20 66 75 6e 63 20 6d 61 78 70 61 72 65 6e 74 20   func maxparent 
125d0 6d 61 78 70 61 72 65 6e 74 0a 0a 20 20 65 78 65  maxparent..  exe
125e0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
125f0 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
12600 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 0a   PRIMARY KEY);..
12610 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
12620 45 52 20 62 75 20 42 45 46 4f 52 45 20 55 50 44  ER bu BEFORE UPD
12630 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45  ATE ON parent BE
12640 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
12650 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
12660 55 45 53 28 6e 65 77 2e 78 2d 6f 6c 64 2e 78 29  UES(new.x-old.x)
12670 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
12680 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
12690 64 28 0a 20 20 20 20 20 20 61 20 44 45 46 41 55  d(.      a DEFAU
126a0 4c 54 20 28 6d 61 78 70 61 72 65 6e 74 28 29 29  LT (maxparent())
126b0 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
126c0 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54  nt ON UPDATE SET
126d0 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a   DEFAULT.    );.
126e0 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
126f0 45 52 20 61 75 20 41 46 54 45 52 20 55 50 44 41  ER au AFTER UPDA
12700 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45 47  TE ON parent BEG
12710 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
12720 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
12730 45 53 28 6e 65 77 2e 78 2b 6f 6c 64 2e 78 29 3b  ES(new.x+old.x);
12740 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 49  .    END;..    I
12750 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
12760 74 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20  t VALUES(1);.   
12770 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
12780 6c 64 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  ld VALUES(1);.  
12790 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
127a0 5f 66 6b 65 79 2d 35 31 2e 32 20 7b 0a 20 20 65  _fkey-51.2 {.  e
127b0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
127c0 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78  ATE parent SET x
127d0 20 3d 20 32 32 3b 0a 20 20 20 20 53 45 4c 45 43   = 22;.    SELEC
127e0 54 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  T * FROM parent 
127f0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b 20  ORDER BY rowid; 
12800 53 45 4c 45 43 54 20 27 78 78 78 27 20 3b 20 53  SELECT 'xxx' ; S
12810 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 63 68 69  ELECT a FROM chi
12820 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32 32 20 32 31  ld;.  }.} {22 21
12830 20 32 33 20 78 78 78 20 32 32 7d 0a 64 6f 5f 74   23 xxx 22}.do_t
12840 65 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 33 20  est e_fkey-51.3 
12850 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12860 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68    DELETE FROM ch
12870 69 6c 64 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  ild;.    DELETE 
12880 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20 20  FROM parent;.   
12890 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
128a0 65 6e 74 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a  ent VALUES(-1);.
128b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
128c0 63 68 69 6c 64 20 56 41 4c 55 45 53 28 2d 31 29  child VALUES(-1)
128d0 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61 72  ;.    UPDATE par
128e0 65 6e 74 20 53 45 54 20 78 20 3d 20 32 32 3b 0a  ent SET x = 22;.
128f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12900 4d 20 70 61 72 65 6e 74 20 4f 52 44 45 52 20 42  M parent ORDER B
12910 59 20 72 6f 77 69 64 3b 20 53 45 4c 45 43 54 20  Y rowid; SELECT 
12920 27 78 78 78 27 20 3b 20 53 45 4c 45 43 54 20 61  'xxx' ; SELECT a
12930 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d   FROM child;.  }
12940 0a 7d 20 7b 32 32 20 32 33 20 32 31 20 78 78 78  .} {22 23 21 xxx
12950 20 32 33 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   23}...#--------
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129a0 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  -.# Verify that 
129b0 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
129c0 73 20 6f 6e 6c 79 20 61 63 74 75 61 6c 6c 79 20  s only actually 
129d0 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20 74 68  take place if th
129e0 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 69  e parent key.# i
129f0 73 20 73 65 74 20 74 6f 20 61 20 6e 65 77 20 76  s set to a new v
12a00 61 6c 75 65 20 74 68 61 74 20 69 73 20 64 69 73  alue that is dis
12a10 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20 6f  tinct from the o
12a20 6c 64 20 76 61 6c 75 65 2e 20 54 68 65 20 64 65  ld value. The de
12a30 66 61 75 6c 74 0a 23 20 63 6f 6c 6c 61 74 69 6f  fault.# collatio
12a40 6e 20 73 65 71 75 65 6e 63 65 20 61 6e 64 20 61  n sequence and a
12a50 66 66 69 6e 69 74 79 20 61 72 65 20 75 73 65 64  ffinity are used
12a60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
12a70 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 0a 23   the new value.#
12a80 20 69 73 20 27 64 69 73 74 69 6e 63 74 27 20 66   is 'distinct' f
12a90 72 6f 6d 20 74 68 65 20 6f 6c 64 20 6f 72 20 6e  rom the old or n
12aa0 6f 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ot..#.# EVIDENCE
12ab0 2d 4f 46 3a 20 52 2d 32 37 33 38 33 2d 31 30 32  -OF: R-27383-102
12ac0 34 36 20 41 6e 20 4f 4e 20 55 50 44 41 54 45 20  46 An ON UPDATE 
12ad0 61 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 74  action is only t
12ae0 61 6b 65 6e 20 69 66 20 74 68 65 0a 23 20 76 61  aken if the.# va
12af0 6c 75 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  lues of the pare
12b00 6e 74 20 6b 65 79 20 61 72 65 20 6d 6f 64 69 66  nt key are modif
12b10 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
12b20 6e 65 77 20 70 61 72 65 6e 74 20 6b 65 79 0a 23  new parent key.#
12b30 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
12b40 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6c 64  equal to the old
12b50 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
12b60 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
12b70 65 79 2d 35 32 2e 31 20 7b 0a 20 20 65 78 65 63  ey-52.1 {.  exec
12b80 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
12b90 20 54 41 42 4c 45 20 7a 65 75 73 28 61 20 49 4e   TABLE zeus(a IN
12ba0 54 45 47 45 52 20 43 4f 4c 4c 41 54 45 20 4e 4f  TEGER COLLATE NO
12bb0 43 41 53 45 2c 20 62 2c 20 50 52 49 4d 41 52 59  CASE, b, PRIMARY
12bc0 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
12bd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 70   CREATE TABLE ap
12be0 6f 6c 6c 6f 28 63 2c 20 64 2c 20 0a 20 20 20 20  ollo(c, d, .    
12bf0 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c    FOREIGN KEY(c,
12c00 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 7a   d) REFERENCES z
12c10 65 75 73 20 4f 4e 20 55 50 44 41 54 45 20 43 41  eus ON UPDATE CA
12c20 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20 20 20  SCADE.    );.   
12c30 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 65 75   INSERT INTO zeu
12c40 73 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20  s VALUES('abc', 
12c50 27 78 79 7a 27 29 3b 0a 20 20 20 20 49 4e 53 45  'xyz');.    INSE
12c60 52 54 20 49 4e 54 4f 20 61 70 6f 6c 6c 6f 20 56  RT INTO apollo V
12c70 41 4c 55 45 53 28 27 41 42 43 27 2c 20 27 78 79  ALUES('ABC', 'xy
12c80 7a 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  z');.  }.  execs
12c90 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12ca0 7a 65 75 73 20 53 45 54 20 61 20 3d 20 27 61 42  zeus SET a = 'aB
12cb0 63 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  c';.    SELECT *
12cc0 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20   FROM apollo;.  
12cd0 7d 0a 7d 20 7b 41 42 43 20 78 79 7a 7d 0a 64 6f  }.} {ABC xyz}.do
12ce0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e  _test e_fkey-52.
12cf0 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
12d00 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73 20      UPDATE zeus 
12d10 53 45 54 20 61 20 3d 20 31 2c 20 62 20 3d 20 31  SET a = 1, b = 1
12d20 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
12d30 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a  ROM apollo;.  }.
12d40 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {1 1}.do_test 
12d50 65 5f 66 6b 65 79 2d 35 32 2e 33 20 7b 0a 20 20  e_fkey-52.3 {.  
12d60 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
12d70 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20  DATE zeus SET a 
12d80 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20 20  = 1, b = 1;.    
12d90 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29  SELECT typeof(c)
12da0 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20  , c, typeof(d), 
12db0 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20  d FROM apollo;. 
12dc0 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20   }.} {integer 1 
12dd0 69 6e 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65  integer 1}.do_te
12de0 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 34 20 7b  st e_fkey-52.4 {
12df0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12e00 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54   UPDATE zeus SET
12e10 20 61 20 3d 20 27 31 27 3b 0a 20 20 20 20 53 45   a = '1';.    SE
12e20 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20  LECT typeof(c), 
12e30 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20  c, typeof(d), d 
12e40 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d  FROM apollo;.  }
12e50 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20 69 6e  .} {integer 1 in
12e60 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74  teger 1}.do_test
12e70 20 65 5f 66 6b 65 79 2d 35 32 2e 35 20 7b 0a 20   e_fkey-52.5 {. 
12e80 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
12e90 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 62  PDATE zeus SET b
12ea0 20 3d 20 27 31 27 3b 0a 20 20 20 20 53 45 4c 45   = '1';.    SELE
12eb0 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c  CT typeof(c), c,
12ec0 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52   typeof(d), d FR
12ed0 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12ee0 20 7b 69 6e 74 65 67 65 72 20 31 20 74 65 78 74   {integer 1 text
12ef0 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
12f00 65 79 2d 35 32 2e 36 20 7b 0a 20 20 65 78 65 63  ey-52.6 {.  exec
12f10 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12f20 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 4e 55   zeus SET b = NU
12f30 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  LL;.    SELECT t
12f40 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70  ypeof(c), c, typ
12f50 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61  eof(d), d FROM a
12f60 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  pollo;.  }.} {in
12f70 74 65 67 65 72 20 31 20 6e 75 6c 6c 20 7b 7d 7d  teger 1 null {}}
12f80 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
12fd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35  VIDENCE-OF: R-35
12fe0 31 32 39 2d 35 38 31 34 31 0a 23 0a 23 20 54 65  129-58141.#.# Te
12ff0 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
13000 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54  om the "ON DELET
13010 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
13020 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e  Actions" section
13030 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65   .# of foreignke
13040 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65 78  ys.html. This ex
13050 61 6d 70 6c 65 20 64 65 6d 6f 6e 73 74 72 61 74  ample demonstrat
13060 65 73 20 74 68 61 74 20 4f 4e 20 55 50 44 41 54  es that ON UPDAT
13070 45 20 61 63 74 69 6f 6e 73 0a 23 20 6f 6e 6c 79  E actions.# only
13080 20 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20 61   take place if a
13090 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 72 65  t least one pare
130a0 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  nt key column is
130b0 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
130c0 0a 23 20 74 68 61 74 20 69 73 20 64 69 73 74 69  .# that is disti
130d0 6e 63 74 20 66 72 6f 6d 20 69 74 73 20 70 72 65  nct from its pre
130e0 76 69 6f 75 73 20 76 61 6c 75 65 2e 0a 23 0a 64  vious value..#.d
130f0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
13100 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33  o_test e_fkey-53
13110 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
13120 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
13130 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
13140 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
13150 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
13160 79 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  y REFERENCES par
13170 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
13180 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  T NULL);.    INS
13190 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
131a0 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a 20  VALUES('key');. 
131b0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
131c0 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6b 65 79  hild VALUES('key
131d0 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
131e0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 32  test e_fkey-53.2
131f0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
13200 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
13210 20 53 45 54 20 78 20 3d 20 27 6b 65 79 27 3b 0a   SET x = 'key';.
13220 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c      SELECT IFNUL
13230 4c 28 79 2c 20 27 6e 75 6c 6c 27 29 20 46 52 4f  L(y, 'null') FRO
13240 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b  M child;.  }.} {
13250 6b 65 79 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  key}.do_test e_f
13260 6b 65 79 2d 35 33 2e 33 20 7b 0a 20 20 65 78 65  key-53.3 {.  exe
13270 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
13280 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
13290 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c   'key2';.    SEL
132a0 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20 27 6e  ECT IFNULL(y, 'n
132b0 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69 6c 64  ull') FROM child
132c0 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a  ;.  }.} {null}..
132d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
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 0a 23 23 23 20  ###########.### 
13320 53 45 43 54 49 4f 4e 20 35 3a 20 43 52 45 41 54  SECTION 5: CREAT
13330 45 2c 20 41 4c 54 45 52 20 61 6e 64 20 44 52 4f  E, ALTER and DRO
13340 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73  P TABLE commands
13350 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
13360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13390 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
133f0 74 68 61 74 20 70 61 72 65 6e 74 20 6b 65 79 73  that parent keys
13400 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65 64   are not checked
13410 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72 65   when tables are
13420 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45 56   created..#.# EV
13430 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 30  IDENCE-OF: R-360
13440 31 38 2d 32 31 37 35 35 20 54 68 65 20 70 61 72  18-21755 The par
13450 65 6e 74 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ent key definiti
13460 6f 6e 73 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b  ons of foreign k
13470 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73  ey.# constraints
13480 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65 64   are not checked
13490 20 77 68 65 6e 20 61 20 74 61 62 6c 65 20 69 73   when a table is
134a0 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45 56   created..#.# EV
134b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 33  IDENCE-OF: R-253
134c0 38 34 2d 33 39 33 33 37 20 54 68 65 72 65 20 69  84-39337 There i
134d0 73 20 6e 6f 74 68 69 6e 67 20 73 74 6f 70 70 69  s nothing stoppi
134e0 6e 67 20 74 68 65 20 75 73 65 72 20 66 72 6f 6d  ng the user from
134f0 0a 23 20 63 72 65 61 74 69 6e 67 20 61 20 66 6f  .# creating a fo
13500 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
13510 74 69 6f 6e 20 74 68 61 74 20 72 65 66 65 72 73  tion that refers
13520 20 74 6f 20 61 20 70 61 72 65 6e 74 20 74 61 62   to a parent tab
13530 6c 65 20 74 68 61 74 0a 23 20 64 6f 65 73 20 6e  le that.# does n
13540 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 74 6f 20  ot exist, or to 
13550 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
13560 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  ns that do not e
13570 78 69 73 74 20 6f 72 20 61 72 65 20 6e 6f 74 0a  xist or are not.
13580 23 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 62  # collectively b
13590 6f 75 6e 64 20 62 79 20 61 20 50 52 49 4d 41 52  ound by a PRIMAR
135a0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
135b0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20  constraint..#.# 
135c0 43 68 69 6c 64 20 6b 65 79 73 20 61 72 65 20 63  Child keys are c
135d0 68 65 63 6b 65 64 20 74 6f 20 65 6e 73 75 72 65  hecked to ensure
135e0 20 61 6c 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20 63   all component c
135f0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 2e 20 49 66  olumns exist. If
13600 20 70 61 72 65 6e 74 0a 23 20 6b 65 79 20 63 6f   parent.# key co
13610 6c 75 6d 6e 73 20 61 72 65 20 65 78 70 6c 69 63  lumns are explic
13620 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2c 20  itly specified, 
13630 53 51 4c 69 74 65 20 63 68 65 63 6b 73 20 74 6f  SQLite checks to
13640 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
13650 0a 23 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  .# are the same 
13660 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
13670 73 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 61  s in the child a
13680 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 73 2e 20  nd parent keys. 
13690 28 54 4f 44 4f 3a 20 54 68 69 73 0a 23 20 69 73  (TODO: This.# is
136a0 20 74 65 73 74 65 64 20 62 75 74 20 64 6f 65 73   tested but does
136b0 20 6e 6f 74 20 63 6f 72 72 65 73 70 6f 6e 64 20   not correspond 
136c0 74 6f 20 61 6e 79 20 74 65 73 74 61 62 6c 65 20  to any testable 
136d0 73 74 61 74 65 6d 65 6e 74 2e 29 0a 23 0a 23 20  statement.).#.# 
136e0 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 74  Also test that t
136f0 68 65 20 61 62 6f 76 65 20 73 74 61 74 65 6d 65  he above stateme
13700 6e 74 73 20 61 72 65 20 74 72 75 65 20 72 65 67  nts are true reg
13710 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
13720 65 72 20 6f 72 20 6e 6f 74 0a 23 20 66 6f 72 65  er or not.# fore
13730 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e 61  ign keys are ena
13740 62 6c 65 64 3a 20 20 22 41 20 43 52 45 41 54 45  bled:  "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 20 77 68 65 74 68 65 72 0a 23 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 22 0a 23 0a 23 20 45 56 49 44  abled.".#.# EVID
137b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 39 30 38  ENCE-OF: R-08908
137c0 2d 32 33 34 33 39 20 41 20 43 52 45 41 54 45 20  -23439 A CREATE 
137d0 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70  TABLE command op
137e0 65 72 61 74 65 73 20 74 68 65 20 73 61 6d 65 0a  erates the same.
137f0 23 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  # whether or not
13800 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
13810 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e 61  straints are ena
13820 62 6c 65 64 2e 0a 23 20 0a 66 6f 72 65 61 63 68  bled..# .foreach
13830 20 7b 74 6e 20 7a 43 72 65 61 74 65 54 62 6c 20   {tn zCreateTbl 
13840 6c 52 65 73 7d 20 7b 0a 20 20 31 20 22 43 52 45  lRes} {.  1 "CRE
13850 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13860 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
13870 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30 20               {0 
13890 7b 7d 7d 0a 20 20 32 20 22 43 52 45 41 54 45 20  {}}.  2 "CREATE 
138a0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52 45  TABLE t1(a, b RE
138b0 46 45 52 45 4e 43 45 53 20 74 32 29 22 20 20 20  FERENCES t2)"   
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
138e0 20 20 33 20 22 43 52 45 41 54 45 20 54 41 42 4c    3 "CREATE TABL
138f0 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13900 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13910 52 45 4e 43 45 53 20 74 31 29 22 20 20 20 20 20  RENCES t1)"     
13920 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 20       {0 {}}.  4 
13930 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13940 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13950 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
13960 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20 20  ES t2)"         
13970 20 7b 30 20 7b 7d 7d 0a 20 20 35 20 22 43 52 45   {0 {}}.  5 "CRE
13980 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13990 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
139a0 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
139b0 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  2)"          {0 
139c0 7b 7d 7d 0a 20 20 36 20 22 43 52 45 41 54 45 20  {}}.  6 "CREATE 
139d0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
139e0 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
139f0 52 45 46 45 52 45 4e 43 45 53 20 74 32 28 6e 2c  REFERENCES t2(n,
13a00 64 29 29 22 20 20 20 20 20 7b 30 20 7b 7d 7d 0a  d))"     {0 {}}.
13a10 20 20 37 20 22 43 52 45 41 54 45 20 54 41 42 4c    7 "CREATE TABL
13a20 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13a30 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13a40 52 45 4e 43 45 53 20 74 31 28 61 2c 62 29 29 22  RENCES t1(a,b))"
13a50 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 41       {0 {}}..  A
13a60 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
13a70 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  1(a, b, FOREIGN 
13a80 4b 45 59 28 63 2c 62 29 20 52 45 46 45 52 45 4e  KEY(c,b) REFEREN
13a90 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20  CES t2)"        
13aa0 20 20 0a 20 20 20 20 20 7b 31 20 7b 75 6e 6b 6e    .     {1 {unkn
13ab0 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69  own column "c" i
13ac0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
13ad0 66 69 6e 69 74 69 6f 6e 7d 7d 0a 20 20 42 20 22  finition}}.  B "
13ae0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
13af0 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
13b00 59 28 63 2c 62 29 20 52 45 46 45 52 45 4e 43 45  Y(c,b) REFERENCE
13b10 53 20 74 32 28 64 29 29 22 20 20 20 20 20 20 20  S t2(d))"       
13b20 20 20 20 0a 20 20 20 20 20 7b 31 20 7b 6e 75 6d     .     {1 {num
13b30 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
13b40 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
13b50 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
13b60 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
13b70 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
13b80 6e 63 65 64 20 74 61 62 6c 65 7d 7d 0a 7d 20 7b  nced table}}.} {
13b90 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
13ba0 79 2d 35 34 2e 24 74 6e 2e 6f 66 66 20 7b 0a 20  y-54.$tn.off {. 
13bb0 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c     drop_all_tabl
13bc0 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  es.    execsql {
13bd0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
13be0 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 20 20 63  eys = OFF}.    c
13bf0 61 74 63 68 73 71 6c 20 24 7a 43 72 65 61 74 65  atchsql $zCreate
13c00 54 62 6c 0a 20 20 7d 20 24 6c 52 65 73 0a 20 20  Tbl.  } $lRes.  
13c10 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
13c20 34 2e 24 74 6e 2e 6f 6e 20 7b 0a 20 20 20 20 64  4.$tn.on {.    d
13c30 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
13c40 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47     execsql {PRAG
13c50 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
13c60 3d 20 4f 4e 7d 0a 20 20 20 20 63 61 74 63 68 73  = ON}.    catchs
13c70 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a 20  ql $zCreateTbl. 
13c80 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d   } $lRes.}..#---
13c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cd0 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
13ce0 45 2d 4f 46 3a 20 52 2d 34 37 39 35 32 2d 36 32  E-OF: R-47952-62
13cf0 34 39 38 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  498 It is not po
13d00 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
13d10 65 20 22 41 4c 54 45 52 20 54 41 42 4c 45 0a 23  e "ALTER TABLE.#
13d20 20 2e 2e 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 22   ... ADD COLUMN"
13d30 20 73 79 6e 74 61 78 20 74 6f 20 61 64 64 20 61   syntax to add a
13d40 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6e 63   column that inc
13d50 6c 75 64 65 73 20 61 20 52 45 46 45 52 45 4e 43  ludes a REFERENC
13d60 45 53 0a 23 20 63 6c 61 75 73 65 2c 20 75 6e 6c  ES.# clause, unl
13d70 65 73 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  ess the default 
13d80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65 77  value of the new
13d90 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
13da0 20 41 74 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f   Attempting.# to
13db0 20 64 6f 20 73 6f 20 72 65 74 75 72 6e 73 20 61   do so returns a
13dc0 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 72 6f 63 20  n error..#.proc 
13dd0 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 7b 74 6e  test_efkey_6 {tn
13de0 20 7a 41 6c 74 65 72 20 69 73 45 72 72 6f 72 7d   zAlter isError}
13df0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
13e00 62 6c 65 73 20 0a 0a 20 20 64 6f 5f 74 65 73 74  bles ..  do_test
13e10 20 65 5f 66 6b 65 79 2d 35 36 2e 24 74 6e 2e 31   e_fkey-56.$tn.1
13e20 20 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   ".    execsql {
13e30 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
13e40 6c 28 61 2c 20 62 29 20 7d 0a 20 20 20 20 5b 6c  l(a, b) }.    [l
13e50 69 73 74 20 63 61 74 63 68 73 71 6c 20 24 7a 41  ist catchsql $zA
13e60 6c 74 65 72 5d 0a 20 20 22 20 5b 6c 69 6e 64 65  lter].  " [linde
13e70 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 43 61  x {{0 {}} {1 {Ca
13e80 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
13e90 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
13ea0 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
13eb0 6c 74 20 76 61 6c 75 65 7d 7d 7d 20 24 69 73 45  lt value}}} $isE
13ec0 72 72 6f 72 5d 0a 0a 7d 0a 0a 74 65 73 74 5f 65  rror]..}..test_e
13ed0 66 6b 65 79 5f 36 20 31 20 22 41 4c 54 45 52 20  fkey_6 1 "ALTER 
13ee0 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43 4f  TABLE tbl ADD CO
13ef0 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43 45  LUMN c REFERENCE
13f00 53 20 78 78 22 20 30 0a 74 65 73 74 5f 65 66 6b  S xx" 0.test_efk
13f10 65 79 5f 36 20 32 20 22 41 4c 54 45 52 20 54 41  ey_6 2 "ALTER TA
13f20 42 4c 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55  BLE tbl ADD COLU
13f30 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 4e 55 4c  MN c DEFAULT NUL
13f40 4c 20 52 45 46 45 52 45 4e 43 45 53 20 78 78 22  L REFERENCES xx"
13f50 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 20   0.test_efkey_6 
13f60 33 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  3 "ALTER TABLE t
13f70 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  bl ADD COLUMN c 
13f80 44 45 46 41 55 4c 54 20 30 20 52 45 46 45 52 45  DEFAULT 0 REFERE
13f90 4e 43 45 53 20 78 78 22 20 31 0a 0a 23 2d 2d 2d  NCES xx" 1..#---
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
13ff0 61 74 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61  at ALTER TABLE a
14000 64 6a 75 73 74 73 20 52 45 46 45 52 45 4e 43 45  djusts REFERENCE
14010 53 20 63 6c 61 75 73 65 73 20 77 68 65 6e 20 74  S clauses when t
14020 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 0a  he parent table.
14030 23 20 69 73 20 52 45 4e 41 4d 45 44 2e 0a 23 0a  # is RENAMED..#.
14040 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
14050 2d 34 37 30 38 30 2d 30 32 30 36 39 20 49 66 20  -47080-02069 If 
14060 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  an "ALTER TABLE 
14070 2e 2e 2e 20 52 45 4e 41 4d 45 20 54 4f 22 20 63  ... RENAME TO" c
14080 6f 6d 6d 61 6e 64 0a 23 20 69 73 20 75 73 65 64  ommand.# is used
14090 20 74 6f 20 72 65 6e 61 6d 65 20 61 20 74 61 62   to rename a tab
140a0 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20 70  le that is the p
140b0 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 6f  arent table of o
140c0 6e 65 20 6f 72 20 6d 6f 72 65 0a 23 20 66 6f 72  ne or more.# for
140d0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
140e0 69 6e 74 73 2c 20 74 68 65 20 64 65 66 69 6e 69  ints, the defini
140f0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  tions of the for
14100 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74  eign key.# const
14110 72 61 69 6e 74 73 20 61 72 65 20 6d 6f 64 69 66  raints are modif
14120 69 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  ied to refer to 
14130 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
14140 20 62 79 20 69 74 73 20 6e 65 77 20 6e 61 6d 65   by its new name
14150 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  .#.# Test that t
14160 68 65 73 65 20 61 64 6a 75 73 74 6d 65 6e 74 73  hese adjustments
14170 20 61 72 65 20 76 69 73 69 62 6c 65 20 69 6e 20   are visible 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 2e 0a 23 0a 23 20 45 56 49  r table..#.# EVI
141a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 38 32  DENCE-OF: R-6382
141b0 37 2d 35 34 37 37 34 20 54 68 65 20 74 65 78 74  7-54774 The text
141c0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 43 52   of the child CR
141d0 45 41 54 45 20 54 41 42 4c 45 0a 23 20 73 74 61  EATE TABLE.# sta
141e0 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65 6d  tement or statem
141f0 65 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ents stored in t
14200 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14210 20 74 61 62 6c 65 20 61 72 65 20 6d 6f 64 69 66   table are modif
14220 69 65 64 0a 23 20 74 6f 20 72 65 66 6c 65 63 74  ied.# to reflect
14230 20 74 68 65 20 6e 65 77 20 70 61 72 65 6e 74 20   the new parent 
14240 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 23 0a 64 6f  table name..#.do
14250 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e  _test e_fkey-56.
14260 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  1 {.  drop_all_t
14270 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
14280 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
14290 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  LE 'p 1 "parent 
142a0 6f 6e 65 22 27 28 61 20 52 45 46 45 52 45 4e 43  one"'(a REFERENC
142b0 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  ES 'p 1 "parent 
142c0 6f 6e 65 22 27 2c 20 62 2c 20 50 52 49 4d 41 52  one"', b, PRIMAR
142d0 59 20 4b 45 59 28 62 29 29 3b 0a 0a 20 20 20 20  Y KEY(b));..    
142e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
142f0 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20  c, d REFERENCES 
14300 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65  'p 1 "parent one
14310 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  "' ON UPDATE CAS
14320 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54  CADE);.    CREAT
14330 45 20 54 41 42 4c 45 20 63 32 28 65 2c 20 66 2c  E TABLE c2(e, f,
14340 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 29 20   FOREIGN KEY(f) 
14350 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20  REFERENCES 'p 1 
14360 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e  "parent one"' ON
14370 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
14380 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14390 4c 45 20 63 33 28 65 2c 20 27 66 20 63 6f 6c 20  LE c3(e, 'f col 
143a0 32 27 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  2', FOREIGN KEY(
143b0 27 66 20 63 6f 6c 20 32 27 29 20 52 45 46 45 52  'f col 2') REFER
143c0 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72 65  ENCES 'p 1 "pare
143d0 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41  nt one"' ON UPDA
143e0 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a 20 20  TE CASCADE);..  
143f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 70    INSERT INTO 'p
14400 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
14410 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20   VALUES(1, 1);. 
14420 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
14430 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a  1 VALUES(1, 1);.
14440 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14450 63 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b  c2 VALUES(1, 1);
14460 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
14470 20 63 33 20 56 41 4c 55 45 53 28 31 2c 20 31 29   c3 VALUES(1, 1)
14480 3b 0a 0a 20 20 20 20 2d 2d 20 43 52 45 41 54 45  ;..    -- CREATE
14490 20 54 41 42 4c 45 20 71 28 61 2c 20 62 2c 20 50   TABLE q(a, b, P
144a0 52 49 4d 41 52 59 20 4b 45 59 28 62 29 29 3b 0a  RIMARY KEY(b));.
144b0 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
144c0 20 65 5f 66 6b 65 79 2d 35 36 2e 32 20 7b 0a 20   e_fkey-56.2 {. 
144d0 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45 52   execsql { ALTER
144e0 20 54 41 42 4c 45 20 27 70 20 31 20 22 70 61 72   TABLE 'p 1 "par
144f0 65 6e 74 20 6f 6e 65 22 27 20 52 45 4e 41 4d 45  ent one"' RENAME
14500 20 54 4f 20 70 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   TO p }.} {}.do_
14510 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 33  test e_fkey-56.3
14520 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
14530 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54 20     UPDATE p SET 
14540 61 20 3d 20 27 78 78 78 27 2c 20 62 20 3d 20 27  a = 'xxx', b = '
14550 78 78 78 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  xxx';.    SELECT
14560 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53   * FROM p;.    S
14570 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b  ELECT * FROM c1;
14580 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
14590 4f 4d 20 63 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM c2;.    SELEC
145a0 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d  T * FROM c3;.  }
145b0 0a 7d 20 7b 78 78 78 20 78 78 78 20 31 20 78 78  .} {xxx xxx 1 xx
145c0 78 20 31 20 78 78 78 20 31 20 78 78 78 7d 0a 64  x 1 xxx 1 xxx}.d
145d0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36  o_test e_fkey-56
145e0 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
145f0 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
14600 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
14610 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
14620 6c 65 27 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20  le'}.} [list    
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42   \.  {CREATE TAB
14680 4c 45 20 22 70 22 28 61 20 52 45 46 45 52 45 4e  LE "p"(a REFEREN
14690 43 45 53 20 22 70 22 2c 20 62 2c 20 50 52 49 4d  CES "p", b, PRIM
146a0 41 52 59 20 4b 45 59 28 62 29 29 7d 20 20 20 20  ARY KEY(b))}    
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
146c0 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  .  {CREATE TABLE
146d0 20 63 31 28 63 2c 20 64 20 52 45 46 45 52 45 4e   c1(c, d REFEREN
146e0 43 45 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54  CES "p" ON UPDAT
146f0 45 20 43 41 53 43 41 44 45 29 7d 20 20 20 20 20  E CASCADE)}     
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
14710 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   {CREATE TABLE c
14720 32 28 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20  2(e, f, FOREIGN 
14730 4b 45 59 28 66 29 20 52 45 46 45 52 45 4e 43 45  KEY(f) REFERENCE
14740 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20  S "p" ON UPDATE 
14750 43 41 53 43 41 44 45 29 7d 20 20 5c 0a 20 20 7b  CASCADE)}  \.  {
14760 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
14770 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20 46 4f  e, 'f col 2', FO
14780 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63 6f 6c  REIGN KEY('f col
14790 20 32 27 29 20 52 45 46 45 52 45 4e 43 45 53 20   2') REFERENCES 
147a0 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41  "p" ON UPDATE CA
147b0 53 43 41 44 45 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d  SCADE)} \.]..#--
147c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14800 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
14810 74 68 61 74 20 61 20 44 52 4f 50 20 54 41 42 4c  that a DROP TABL
14820 45 20 64 6f 65 73 20 61 6e 20 69 6d 70 6c 69 63  E does an implic
14830 69 74 20 44 45 4c 45 54 45 20 46 52 4f 4d 2e 20  it DELETE FROM. 
14840 57 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 0a 23  Which does not.#
14850 20 63 61 75 73 65 20 61 6e 79 20 74 72 69 67 67   cause any trigg
14860 65 72 73 20 74 6f 20 66 69 72 65 2c 20 62 75 74  ers to fire, but
14870 20 64 6f 65 73 20 66 69 72 65 20 66 6f 72 65 69   does fire forei
14880 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a  gn key actions..
14890 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
148a0 20 52 2d 31 34 32 30 38 2d 32 33 39 38 36 20 49   R-14208-23986 I
148b0 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  f foreign key co
148c0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e  nstraints are en
148d0 61 62 6c 65 64 20 77 68 65 6e 0a 23 20 69 74 20  abled when.# it 
148e0 69 73 20 70 72 65 70 61 72 65 64 2c 20 74 68 65  is prepared, the
148f0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
14900 61 6e 64 20 70 65 72 66 6f 72 6d 73 20 61 6e 20  and performs an 
14910 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20  implicit DELETE 
14920 74 6f 0a 23 20 72 65 6d 6f 76 65 20 61 6c 6c 20  to.# remove all 
14930 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 74 61  rows from the ta
14940 62 6c 65 20 62 65 66 6f 72 65 20 64 72 6f 70 70  ble before dropp
14950 69 6e 67 20 69 74 2e 0a 23 0a 23 20 45 56 49 44  ing it..#.# EVID
14960 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 30 37 38  ENCE-OF: R-11078
14970 2d 30 33 39 34 35 20 54 68 65 20 69 6d 70 6c 69  -03945 The impli
14980 63 69 74 20 44 45 4c 45 54 45 20 64 6f 65 73 20  cit DELETE does 
14990 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 53 51  not cause any SQ
149a0 4c 0a 23 20 74 72 69 67 67 65 72 73 20 74 6f 20  L.# triggers to 
149b0 66 69 72 65 2c 20 62 75 74 20 6d 61 79 20 69 6e  fire, but may in
149c0 76 6f 6b 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  voke foreign key
149d0 20 61 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6e 73   actions or cons
149e0 74 72 61 69 6e 74 0a 23 20 76 69 6f 6c 61 74 69  traint.# violati
149f0 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ons..#.do_test e
14a00 5f 66 6b 65 79 2d 35 37 2e 31 20 7b 0a 20 20 64  _fkey-57.1 {.  d
14a10 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
14a20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
14a30 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c  REATE TABLE p(a,
14a40 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
14a50 61 2c 20 62 29 29 3b 0a 0a 20 20 20 20 43 52 45  a, b));..    CRE
14a60 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
14a70 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
14a80 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14a90 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  p ON DELETE SET 
14aa0 4e 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41 54  NULL);.    CREAT
14ab0 45 20 54 41 42 4c 45 20 63 32 28 63 2c 20 64 2c  E TABLE c2(c, d,
14ac0 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
14ad0 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
14ae0 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
14af0 46 41 55 4c 54 29 3b 0a 20 20 20 20 43 52 45 41  FAULT);.    CREA
14b00 54 45 20 54 41 42 4c 45 20 63 33 28 63 2c 20 64  TE TABLE c3(c, d
14b10 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
14b20 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
14b30 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
14b40 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  DE);.    CREATE 
14b50 54 41 42 4c 45 20 63 34 28 63 2c 20 64 2c 20 46  TABLE c4(c, d, F
14b60 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14b70 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14b80 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
14b90 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14ba0 42 4c 45 20 63 35 28 63 2c 20 64 2c 20 46 4f 52  BLE c5(c, d, FOR
14bb0 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
14bc0 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44  EFERENCES p ON D
14bd0 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  ELETE NO ACTION)
14be0 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
14bf0 42 4c 45 20 63 36 28 63 2c 20 64 2c 20 0a 20 20  BLE c6(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 52 45 53   p ON DELETE RES
14c30 54 52 49 43 54 20 0a 20 20 20 20 20 20 44 45 46  TRICT .      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 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14c70 4c 45 20 63 37 28 63 2c 20 64 2c 20 0a 20 20 20  LE c7(c, d, .   
14c80 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63     FOREIGN KEY(c
14c90 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14ca0 70 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41  p ON DELETE NO A
14cb0 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45  CTION.      DEFE
14cc0 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
14cd0 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
14ce0 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
14cf0 4c 45 20 6c 6f 67 28 6d 73 67 29 3b 0a 20 20 20  LE log(msg);.   
14d00 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
14d10 74 74 20 41 46 54 45 52 20 44 45 4c 45 54 45 20  tt AFTER DELETE 
14d20 4f 4e 20 70 20 42 45 47 49 4e 0a 20 20 20 20 20  ON p BEGIN.     
14d30 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
14d40 20 56 41 4c 55 45 53 28 27 64 65 6c 65 74 65 20   VALUES('delete 
14d50 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 29 3b  ' || old.rowid);
14d60 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
14d70 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
14d80 65 79 2d 35 37 2e 32 20 7b 0a 20 20 65 78 65 63  ey-57.2 {.  exec
14d90 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
14da0 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27   INTO p VALUES('
14db0 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e  a', 'b');.    IN
14dc0 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
14dd0 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
14de0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
14df0 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  2 VALUES('a', 'b
14e00 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
14e10 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 27 61  NTO c3 VALUES('a
14e20 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 42 45 47  ', 'b');.    BEG
14e30 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  IN;.      DROP T
14e40 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45  ABLE p;.      SE
14e50 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a  LECT * FROM c1;.
14e60 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f    }.} {{} {}}.do
14e70 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e  _test e_fkey-57.
14e80 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
14e90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 32  SELECT * FROM c2
14ea0 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f   }.} {{} {}}.do_
14eb0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 34  test e_fkey-57.4
14ec0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
14ed0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33 20  ELECT * FROM c3 
14ee0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
14ef0 5f 66 6b 65 79 2d 35 37 2e 35 20 7b 0a 20 20 65  _fkey-57.5 {.  e
14f00 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
14f10 2a 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 7d 20 7b  * FROM log }.} {
14f20 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
14f30 2d 35 37 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -57.6 {.  execsq
14f40 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a  l ROLLBACK.} {}.
14f50 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14f60 37 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.7 {.  execsql 
14f70 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
14f80 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
14f90 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
14fa0 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 52   FROM log;.    R
14fb0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
14fc0 7b 64 65 6c 65 74 65 20 31 7d 7d 0a 0a 23 2d 2d  {delete 1}}..#--
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15010 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 6e 20  -------.# If an 
15020 49 4d 4d 45 44 49 41 54 45 20 66 6f 72 65 69 67  IMMEDIATE foreig
15030 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20 61  n key fails as a
15040 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52 4f   result of a DRO
15050 50 20 54 41 42 4c 45 2c 20 74 68 65 0a 23 20 44  P TABLE, the.# D
15060 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
15070 64 20 66 61 69 6c 73 2e 0a 23 0a 23 20 45 56 49  d fails..#.# EVI
15080 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32 37 36  DENCE-OF: R-3276
15090 38 2d 34 37 39 32 35 20 49 66 20 61 6e 20 69 6d  8-47925 If an im
150a0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
150b0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
150c0 73 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74 68  s.# violated, th
150d0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  e DROP TABLE sta
150e0 74 65 6d 65 6e 74 20 66 61 69 6c 73 20 61 6e 64  tement fails and
150f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
15100 74 20 64 72 6f 70 70 65 64 2e 0a 23 0a 64 6f 5f  t dropped..#.do_
15110 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 31  test e_fkey-58.1
15120 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
15130 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
15140 63 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  c1;.    DELETE F
15150 52 4f 4d 20 63 32 3b 0a 20 20 20 20 44 45 4c 45  ROM c2;.    DELE
15160 54 45 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a  TE FROM c3;.  }.
15170 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
15180 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45  RT INTO c5 VALUE
15190 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20  S('a', 'b') }.  
151a0 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
151b0 54 41 42 4c 45 20 70 20 7d 0a 7d 20 7b 31 20 7b  TABLE p }.} {1 {
151c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
151d0 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
151e0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
151f0 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.2 {.  execsql 
15200 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
15210 70 20 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74  p }.} {a b}.do_t
15220 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 33 20  est e_fkey-58.3 
15230 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
15240 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
15250 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
15260 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
15270 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
15280 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
15290 65 5f 66 6b 65 79 2d 35 38 2e 34 20 7b 0a 20 20  e_fkey-58.4 {.  
152a0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
152b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 3b 0a 20  LECT * FROM p;. 
152c0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
152d0 20 63 35 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   c5;.    ROLLBAC
152e0 4b 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20 61 20  K;.  }.} {a b a 
152f0 62 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  b}..#-----------
15300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
15340 20 49 66 20 61 20 44 45 46 45 52 52 45 44 20 66   If a DEFERRED f
15350 6f 72 65 69 67 6e 20 6b 65 79 20 66 61 69 6c 73  oreign key fails
15360 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15370 61 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 61 74  a DROP TABLE, at
15380 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 63 6f  tempting.# to co
15390 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
153a0 74 69 6f 6e 20 66 61 69 6c 73 20 75 6e 6c 65 73  tion fails unles
153b0 73 20 74 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20  s the violation 
153c0 69 73 20 66 69 78 65 64 2e 0a 23 0a 23 20 45 56  is fixed..#.# EV
153d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 39  IDENCE-OF: R-059
153e0 30 33 2d 30 38 34 36 30 20 49 66 20 61 20 64 65  03-08460 If a de
153f0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
15400 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ey constraint is
15410 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74 68 65  .# violated, the
15420 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  n an error is re
15430 70 6f 72 74 65 64 20 77 68 65 6e 20 74 68 65 20  ported when the 
15440 75 73 65 72 20 61 74 74 65 6d 70 74 73 20 74 6f  user attempts to
15450 20 63 6f 6d 6d 69 74 0a 23 20 74 68 65 20 74 72   commit.# the tr
15460 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
15470 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
15480 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
15490 6e 73 20 73 74 69 6c 6c 20 65 78 69 73 74 0a 23  ns still exist.#
154a0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
154b0 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
154c0 2d 35 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -59.1 {.  execsq
154d0 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20  l { .    DELETE 
154e0 46 52 4f 4d 20 63 31 20 3b 20 44 45 4c 45 54 45  FROM c1 ; DELETE
154f0 20 46 52 4f 4d 20 63 32 20 3b 20 44 45 4c 45 54   FROM c2 ; DELET
15500 45 20 46 52 4f 4d 20 63 33 20 3b 0a 20 20 20 20  E FROM c3 ;.    
15510 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 34 20 3b  DELETE FROM c4 ;
15520 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 35 20   DELETE FROM c5 
15530 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 36  ; DELETE FROM c6
15540 20 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   ;.    DELETE FR
15550 4f 4d 20 63 37 20 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM c7 .  }.} {}.
15560 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
15570 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
15580 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 37  { INSERT INTO c7
15590 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
155a0 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ) }.  execsql {.
155b0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
155c0 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20   DROP TABLE p;. 
155d0 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
155e0 65 5f 66 6b 65 79 2d 35 39 2e 33 20 7b 0a 20 20  e_fkey-59.3 {.  
155f0 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
15600 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
15610 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
15620 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
15630 66 6b 65 79 2d 35 39 2e 34 20 7b 0a 20 20 65 78  fkey-59.4 {.  ex
15640 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
15650 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52 49  ABLE p(a, b, PRI
15660 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 20  MARY KEY(a, b)) 
15670 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  }.  catchsql COM
15680 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  MIT.} {1 {foreig
15690 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
156a0 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
156b0 74 20 65 5f 66 6b 65 79 2d 35 39 2e 35 20 7b 0a  t e_fkey-59.5 {.
156c0 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
156d0 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53  RT INTO p VALUES
156e0 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20 65  ('a', 'b') }.  e
156f0 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
15700 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
15750 20 41 6e 79 20 22 66 6f 72 65 69 67 6e 20 6b 65   Any "foreign ke
15760 79 20 6d 69 73 6d 61 74 63 68 22 20 65 72 72 6f  y mismatch" erro
15770 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  rs encountered w
15780 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 61 6e 20  hile running an 
15790 69 6d 70 6c 69 63 69 74 0a 23 20 22 44 45 4c 45  implicit.# "DELE
157a0 54 45 20 46 52 4f 4d 20 74 62 6c 22 20 61 72 65  TE FROM tbl" are
157b0 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 23 20 45 56   ignored..#.# EV
157c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 32  IDENCE-OF: R-572
157d0 34 32 2d 33 37 30 30 35 20 41 6e 79 20 22 66 6f  42-37005 Any "fo
157e0 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
157f0 63 68 22 20 65 72 72 6f 72 73 0a 23 20 65 6e 63  ch" errors.# enc
15800 6f 75 6e 74 65 72 65 64 20 61 73 20 70 61 72 74  ountered as part
15810 20 6f 66 20 61 6e 20 69 6d 70 6c 69 63 69 74 20   of an implicit 
15820 44 45 4c 45 54 45 20 61 72 65 20 69 67 6e 6f 72  DELETE are ignor
15830 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
15840 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
15850 66 6b 65 79 2d 36 30 2e 31 20 7b 0a 20 20 65 78  fkey-60.1 {.  ex
15860 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
15870 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
15880 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43 52 45 41  = OFF;..    CREA
15890 54 45 20 54 41 42 4c 45 20 70 28 61 20 50 52 49  TE TABLE p(a PRI
158a0 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
158b0 52 45 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62  RENCES nosuchtab
158c0 6c 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  le);.    CREATE 
158d0 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46  TABLE c1(c, d, F
158e0 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
158f0 20 52 45 46 45 52 45 4e 43 45 53 20 61 29 3b 0a   REFERENCES a);.
15900 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
15910 20 63 32 28 63 20 52 45 46 45 52 45 4e 43 45 53   c2(c REFERENCES
15920 20 70 28 62 29 2c 20 64 29 3b 0a 20 20 20 20 43   p(b), d);.    C
15930 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 63  REATE TABLE c3(c
15940 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
15950 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
15960 2c 20 64 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  , d);..    INSER
15970 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
15980 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
15990 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
159a0 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
159b0 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
159c0 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
159d0 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
159e0 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20  ES(1, 2);.  }.} 
159f0 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
15a00 79 2d 36 30 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-60.2 {.  execs
15a10 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  ql { PRAGMA fore
15a20 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a  ign_keys = ON }.
15a30 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
15a40 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b  ETE FROM p }.} {
15a50 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
15a60 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62  : main.nosuchtab
15a70 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  le}}.do_test e_f
15a80 6b 65 79 2d 36 30 2e 33 20 7b 0a 20 20 65 78 65  key-60.3 {.  exe
15a90 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
15aa0 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
15ab0 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  LE p;.      SELE
15ac0 43 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a 20 20  CT * FROM c3;.  
15ad0 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
15ae0 7d 20 7b 7b 7d 20 32 7d 0a 64 6f 5f 74 65 73 74  } {{} 2}.do_test
15af0 20 65 5f 66 6b 65 79 2d 36 30 2e 34 20 7b 0a 20   e_fkey-60.4 {. 
15b00 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
15b10 45 20 54 41 42 4c 45 20 6e 6f 73 75 63 68 74 61  E TABLE nosuchta
15b20 62 6c 65 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ble(x PRIMARY KE
15b30 59 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  Y) }.  catchsql 
15b40 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20  { DELETE FROM p 
15b50 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
15b60 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
15b70 63 32 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20  c2" referencing 
15b80 22 70 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  "p"}}.do_test e_
15b90 66 6b 65 79 2d 36 30 2e 35 20 7b 0a 20 20 65 78  fkey-60.5 {.  ex
15ba0 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  ecsql { DROP TAB
15bb0 4c 45 20 63 31 20 7d 0a 20 20 63 61 74 63 68 73  LE c1 }.  catchs
15bc0 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
15bd0 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   p }.} {1 {forei
15be0 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
15bf0 2d 20 22 63 32 22 20 72 65 66 65 72 65 6e 63 69  - "c2" referenci
15c00 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74 65 73 74  ng "p"}}.do_test
15c10 20 65 5f 66 6b 65 79 2d 36 30 2e 36 20 7b 0a 20   e_fkey-60.6 {. 
15c20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20   execsql { DROP 
15c30 54 41 42 4c 45 20 63 32 20 7d 0a 20 20 65 78 65  TABLE c2 }.  exe
15c40 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  csql { DELETE FR
15c50 4f 4d 20 70 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d  OM p }.} {}..#--
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
15cb0 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  hat the special 
15cc0 62 65 68 61 76 69 6f 75 72 73 20 6f 66 20 41 4c  behaviours of AL
15cd0 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54 41 42  TER and DROP TAB
15ce0 4c 45 20 61 72 65 20 6f 6e 6c 79 0a 23 20 61 63  LE are only.# ac
15cf0 74 69 76 61 74 65 64 20 77 68 65 6e 20 66 6f 72  tivated when for
15d00 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e  eign keys are en
15d10 61 62 6c 65 64 2e 20 53 70 65 63 69 61 6c 20 62  abled. Special b
15d20 65 68 61 76 69 6f 75 72 73 20 61 72 65 3a 0a 23  ehaviours are:.#
15d30 0a 23 20 20 20 31 2e 20 41 44 44 20 43 4f 4c 55  .#   1. ADD COLU
15d40 4d 4e 20 6e 6f 74 20 61 6c 6c 6f 77 69 6e 67 20  MN not allowing 
15d50 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61  a REFERENCES cla
15d60 75 73 65 20 77 69 74 68 20 61 20 6e 6f 6e 2d 4e  use with a non-N
15d70 55 4c 4c 20 0a 23 20 20 20 20 20 20 64 65 66 61  ULL .#      defa
15d80 75 6c 74 20 76 61 6c 75 65 2e 0a 23 20 20 20 32  ult value..#   2
15d90 2e 20 4d 6f 64 69 66 79 69 6e 67 20 66 6f 72 65  . Modifying fore
15da0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15db0 6f 6e 73 20 77 68 65 6e 20 61 20 70 61 72 65 6e  ons when a paren
15dc0 74 20 74 61 62 6c 65 20 69 73 20 52 45 4e 41 4d  t table is RENAM
15dd0 45 64 2e 0a 23 20 20 20 33 2e 20 52 75 6e 6e 69  Ed..#   3. Runni
15de0 6e 67 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44  ng an implicit D
15df0 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6d 6d 61  ELETE FROM comma
15e00 6e 64 20 61 73 20 70 61 72 74 20 6f 66 20 44 52  nd as part of DR
15e10 4f 50 20 54 41 42 4c 45 2e 0a 23 0a 23 20 45 56  OP TABLE..#.# EV
15e20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 31  IDENCE-OF: R-541
15e30 34 32 2d 34 31 33 34 36 20 54 68 65 20 70 72 6f  42-41346 The pro
15e40 70 65 72 74 69 65 73 20 6f 66 20 74 68 65 20 44  perties of the D
15e50 52 4f 50 20 54 41 42 4c 45 20 61 6e 64 20 41 4c  ROP TABLE and AL
15e60 54 45 52 0a 23 20 54 41 42 4c 45 20 63 6f 6d 6d  TER.# TABLE comm
15e70 61 6e 64 73 20 64 65 73 63 72 69 62 65 64 20 61  ands described a
15e80 62 6f 76 65 20 6f 6e 6c 79 20 61 70 70 6c 79 20  bove only apply 
15e90 69 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  if foreign keys 
15ea0 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 64  are enabled..#.d
15eb0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
15ec0 2e 31 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  .1.1 {.  drop_al
15ed0 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73  l_tables.  execs
15ee0 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
15ef0 45 20 74 31 28 61 2c 20 62 29 20 7d 0a 20 20 63  E t1(a, b) }.  c
15f00 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20  atchsql { ALTER 
15f10 54 41 42 4c 45 20 74 31 20 41 44 44 20 43 4f 4c  TABLE t1 ADD COL
15f20 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 27 78  UMN c DEFAULT 'x
15f30 78 78 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xx' REFERENCES t
15f40 32 20 7d 0a 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74  2 }.} {1 {Cannot
15f50 20 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45   add a REFERENCE
15f60 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f  S column with no
15f70 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76  n-NULL default v
15f80 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  alue}}.do_test e
15f90 5f 66 6b 65 79 2d 36 31 2e 31 2e 32 20 7b 0a 20  _fkey-61.1.2 {. 
15fa0 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
15fb0 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
15fc0 20 4f 46 46 20 7d 0a 20 20 65 78 65 63 73 71 6c   OFF }.  execsql
15fd0 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
15fe0 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44  1 ADD COLUMN c D
15ff0 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45 46  EFAULT 'xxx' REF
16000 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 20 20 65  ERENCES t2 }.  e
16010 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
16020 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
16030 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
16040 65 20 3d 20 27 74 31 27 20 7d 0a 7d 20 7b 7b 43  e = 't1' }.} {{C
16050 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
16060 2c 20 62 2c 20 63 20 44 45 46 41 55 4c 54 20 27  , b, c DEFAULT '
16070 78 78 78 27 20 52 45 46 45 52 45 4e 43 45 53 20  xxx' REFERENCES 
16080 74 32 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  t2)}}.do_test e_
16090 66 6b 65 79 2d 36 31 2e 31 2e 33 20 7b 0a 20 20  fkey-61.1.3 {.  
160a0 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
160b0 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
160c0 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  ON }.} {}..do_te
160d0 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 31  st e_fkey-61.2.1
160e0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
160f0 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  bles.  execsql {
16100 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
16110 45 20 70 28 61 20 55 4e 49 51 55 45 29 3b 0a 20  E p(a UNIQUE);. 
16120 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16130 63 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(b REFERENCES p
16140 28 61 29 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  (a));.    BEGIN;
16150 0a 20 20 20 20 20 20 41 4c 54 45 52 20 54 41 42  .      ALTER TAB
16160 4c 45 20 70 20 52 45 4e 41 4d 45 20 54 4f 20 70  LE p RENAME TO p
16170 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 53 45 4c  arent;.      SEL
16180 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
16190 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
161a0 20 6e 61 6d 65 20 3d 20 27 63 27 3b 0a 20 20 20   name = 'c';.   
161b0 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
161c0 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20   {{CREATE TABLE 
161d0 63 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 22  c(b REFERENCES "
161e0 70 61 72 65 6e 74 22 28 61 29 29 7d 7d 0a 64 6f  parent"(a))}}.do
161f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
16200 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
16210 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  {.    PRAGMA for
16220 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
16230 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45  .    ALTER TABLE
16240 20 70 20 52 45 4e 41 4d 45 20 54 4f 20 70 61 72   p RENAME TO par
16250 65 6e 74 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ent;.    SELECT 
16260 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
16270 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
16280 65 20 3d 20 27 63 27 3b 0a 20 20 7d 0a 7d 20 7b  e = 'c';.  }.} {
16290 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  {CREATE TABLE c(
162a0 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61  b REFERENCES p(a
162b0 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ))}}.do_test e_f
162c0 6b 65 79 2d 36 31 2e 32 2e 33 20 7b 0a 20 20 65  key-61.2.3 {.  e
162d0 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
162e0 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
162f0 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  N }.} {}..do_tes
16300 74 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 31 20  t e_fkey-61.3.1 
16310 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
16320 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  les.  execsql {.
16330 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16340 20 70 28 61 20 55 4e 49 51 55 45 29 3b 0a 20 20   p(a UNIQUE);.  
16350 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
16360 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  (b REFERENCES p(
16370 61 29 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54  a) ON DELETE SET
16380 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45   NULL);.    INSE
16390 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53  RT INTO p VALUES
163a0 28 27 78 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('x');.    INSER
163b0 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28  T INTO c VALUES(
163c0 27 78 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  'x');.    BEGIN;
163d0 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
163e0 45 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  E p;.      SELEC
163f0 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20  T * FROM c;.    
16400 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
16410 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  {{}}.do_test e_f
16420 6b 65 79 2d 36 31 2e 33 2e 32 20 7b 0a 20 20 65  key-61.3.2 {.  e
16430 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
16440 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
16450 20 3d 20 4f 46 46 3b 0a 20 20 20 20 44 52 4f 50   = OFF;.    DROP
16460 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 53 45   TABLE p;.    SE
16470 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20  LECT * FROM c;. 
16480 20 7d 0a 7d 20 7b 78 7d 0a 64 6f 5f 74 65 73 74   }.} {x}.do_test
16490 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 33 20 7b   e_fkey-61.3.3 {
164a0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
164b0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
164c0 20 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 23 23   = ON }.} {}..##
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 23 23 23 23 23 23 0a 23 23 23 20 53 45  #########.### SE
16520 43 54 49 4f 4e 20 36 3a 20 4c 69 6d 69 74 73 20  CTION 6: Limits 
16530 61 6e 64 20 55 6e 73 75 70 70 6f 72 74 65 64 20  and Unsupported 
16540 46 65 61 74 75 72 65 73 0a 23 23 23 23 23 23 23  Features.#######
16550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16590 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
165a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
165e0 0a 23 20 54 65 73 74 20 74 68 61 74 20 4d 41 54  .# Test that MAT
165f0 43 48 20 63 6c 61 75 73 65 73 20 61 72 65 20 70  CH clauses are p
16600 61 72 73 65 64 2c 20 62 75 74 20 53 51 4c 69 74  arsed, but SQLit
16610 65 20 74 72 65 61 74 73 20 65 76 65 72 79 20 66  e treats every f
16620 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e  oreign key.# con
16630 73 74 72 61 69 6e 74 20 61 73 20 69 66 20 69 74  straint as if it
16640 20 77 65 72 65 20 22 4d 41 54 43 48 20 53 49 4d   were "MATCH SIM
16650 50 4c 45 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e  PLE"..#.# EVIDEN
16660 43 45 2d 4f 46 3a 20 52 2d 32 34 37 32 38 2d 31  CE-OF: R-24728-1
16670 33 32 33 30 20 53 51 4c 69 74 65 20 70 61 72 73  3230 SQLite pars
16680 65 73 20 4d 41 54 43 48 20 63 6c 61 75 73 65 73  es MATCH clauses
16690 20 28 69 2e 65 2e 20 64 6f 65 73 20 6e 6f 74 0a   (i.e. does not.
166a0 23 20 72 65 70 6f 72 74 20 61 20 73 79 6e 74 61  # report a synta
166b0 78 20 65 72 72 6f 72 20 69 66 20 79 6f 75 20 73  x error if you s
166c0 70 65 63 69 66 79 20 6f 6e 65 29 2c 20 62 75 74  pecify one), but
166d0 20 64 6f 65 73 20 6e 6f 74 20 65 6e 66 6f 72 63   does not enforc
166e0 65 20 74 68 65 6d 2e 0a 23 0a 23 20 45 56 49 44  e them..#.# EVID
166f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 34 35 30  ENCE-OF: R-24450
16700 2d 34 36 31 37 34 20 41 6c 6c 20 66 6f 72 65 69  -46174 All forei
16710 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
16720 74 73 20 69 6e 20 53 51 4c 69 74 65 20 61 72 65  ts in SQLite are
16730 0a 23 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  .# handled as if
16740 20 4d 41 54 43 48 20 53 49 4d 50 4c 45 20 77 65   MATCH SIMPLE we
16750 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 23 0a  re specified..#.
16760 66 6f 72 65 61 63 68 20 7a 4d 61 74 63 68 20 5b  foreach zMatch [
16770 6c 69 73 74 20 53 49 4d 50 4c 45 20 50 41 52 54  list SIMPLE PART
16780 49 41 4c 20 46 55 4c 4c 20 53 69 6d 70 6c 65 20  IAL FULL Simple 
16790 70 61 72 54 49 41 4c 20 46 75 4c 4c 20 5d 20 7b  parTIAL FuLL ] {
167a0 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
167b0 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  es.  do_test e_f
167c0 6b 65 79 2d 36 32 2e 24 7a 4d 61 74 63 68 2e 31  key-62.$zMatch.1
167d0 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
167e0 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
167f0 42 4c 45 20 70 28 61 2c 20 62 2c 20 63 2c 20 50  BLE p(a, b, c, P
16800 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29  RIMARY KEY(b, c)
16810 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
16820 54 41 42 4c 45 20 63 28 64 2c 20 65 2c 20 66 2c  TABLE c(d, e, f,
16830 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 65 2c 20   FOREIGN KEY(e, 
16840 66 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  f) REFERENCES p 
16850 4d 41 54 43 48 20 24 7a 4d 61 74 63 68 29 3b 0a  MATCH $zMatch);.
16860 20 20 20 20 22 0a 20 20 7d 20 7b 7d 0a 20 20 64      ".  } {}.  d
16870 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16880 2e 24 7a 4d 61 74 63 68 2e 32 20 7b 0a 20 20 20  .$zMatch.2 {.   
16890 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
168a0 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
168b0 31 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20 20  1, 2, 3)        
168c0 20 7d 0a 0a 20 20 20 20 23 20 4d 41 54 43 48 20   }..    # MATCH 
168d0 53 49 4d 50 4c 45 20 62 65 68 61 76 69 6f 75 72  SIMPLE behaviour
168e0 3a 20 41 6c 6c 6f 77 20 61 6e 79 20 63 68 69 6c  : Allow any chil
168f0 64 20 6b 65 79 20 74 68 61 74 20 63 6f 6e 74 61  d key that conta
16900 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
16910 20 20 20 20 23 20 4e 55 4c 4c 20 76 61 6c 75 65      # NULL value
16920 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
16930 20 4e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73   Non-NULL values
16940 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
16950 6d 61 70 20 74 6f 20 61 6e 79 0a 20 20 20 20 23  map to any.    #
16960 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75   parent key valu
16970 65 73 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20 61  es, so long as a
16980 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65 6c  t least one fiel
16990 64 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  d of the child k
169a0 65 79 20 69 73 0a 20 20 20 20 23 20 4e 55 4c 4c  ey is.    # NULL
169b0 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ..    execsql { 
169c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
169d0 4c 55 45 53 28 27 77 27 2c 20 32 2c 20 33 29 20  LUES('w', 2, 3) 
169e0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63        }.    exec
169f0 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
16a00 4f 20 63 20 56 41 4c 55 45 53 28 27 78 27 2c 20  O c VALUES('x', 
16a10 27 78 27 2c 20 4e 55 4c 4c 29 20 20 7d 0a 20 20  'x', NULL)  }.  
16a20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
16a30 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
16a40 28 27 79 27 2c 20 4e 55 4c 4c 2c 20 27 78 27 29  ('y', NULL, 'x')
16a50 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
16a60 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20  { INSERT INTO c 
16a70 56 41 4c 55 45 53 28 27 7a 27 2c 20 4e 55 4c 4c  VALUES('z', NULL
16a80 2c 20 4e 55 4c 4c 29 20 7d 0a 0a 20 20 20 20 23  , NULL) }..    #
16a90 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
16aa0 46 4b 20 69 73 20 65 6e 66 6f 72 63 65 64 20 70  FK is enforced p
16ab0 72 6f 70 65 72 6c 79 20 69 66 20 74 68 65 72 65  roperly if there
16ac0 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c   are no NULL val
16ad0 75 65 73 20 0a 20 20 20 20 23 20 69 6e 20 74 68  ues .    # in th
16ae0 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75  e child key colu
16af0 6d 6e 73 2e 0a 20 20 20 20 63 61 74 63 68 73 71  mns..    catchsq
16b00 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
16b10 63 20 56 41 4c 55 45 53 28 27 61 27 2c 20 32 2c  c VALUES('a', 2,
16b20 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f   4) }.  } {1 {fo
16b30 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
16b40 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a  aint failed}}.}.
16b50 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
16ba0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 64  st that SQLite d
16bb0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
16bc0 74 68 65 20 53 45 54 20 43 4f 4e 53 54 52 41 49  the SET CONSTRAI
16bd0 4e 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 6e  NT statement. An
16be0 64 0a 23 20 74 68 61 74 20 69 74 20 69 73 20 70  d.# that it is p
16bf0 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
16c00 65 20 62 6f 74 68 20 69 6d 6d 65 64 69 61 74 65  e both immediate
16c10 20 61 6e 64 20 64 65 66 65 72 72 65 64 20 63 6f   and deferred co
16c20 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45  nstraints..#.# E
16c30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31  VIDENCE-OF: R-21
16c40 35 39 39 2d 31 36 30 33 38 20 49 6e 20 53 51 4c  599-16038 In SQL
16c50 69 74 65 2c 20 61 20 66 6f 72 65 69 67 6e 20 6b  ite, a foreign k
16c60 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ey constraint is
16c70 0a 23 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 6d  .# permanently m
16c80 61 72 6b 65 64 20 61 73 20 64 65 66 65 72 72 65  arked as deferre
16c90 64 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 77  d or immediate w
16ca0 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
16cb0 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
16cc0 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
16cd0 6b 65 79 2d 36 32 2e 31 20 7b 0a 20 20 63 61 74  key-62.1 {.  cat
16ce0 63 68 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53  chsql { SET CONS
16cf0 54 52 41 49 4e 54 53 20 41 4c 4c 20 49 4d 4d 45  TRAINTS ALL IMME
16d00 44 49 41 54 45 20 7d 0a 7d 20 7b 31 20 7b 6e 65  DIATE }.} {1 {ne
16d10 61 72 20 22 53 45 54 22 3a 20 73 79 6e 74 61 78  ar "SET": syntax
16d20 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74   error}}.do_test
16d30 20 65 5f 66 6b 65 79 2d 36 32 2e 32 20 7b 0a 20   e_fkey-62.2 {. 
16d40 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 54 20   catchsql { SET 
16d50 43 4f 4e 53 54 52 41 49 4e 54 53 20 41 4c 4c 20  CONSTRAINTS ALL 
16d60 44 45 46 45 52 52 45 44 20 7d 0a 7d 20 7b 31 20  DEFERRED }.} {1 
16d70 7b 6e 65 61 72 20 22 53 45 54 22 3a 20 73 79 6e  {near "SET": syn
16d80 74 61 78 20 65 72 72 6f 72 7d 7d 0a 0a 64 6f 5f  tax error}}..do_
16d90 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 33  test e_fkey-62.3
16da0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
16db0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16dc0 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  p(a, b, PRIMARY 
16dd0 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20  KEY(a, b));.    
16de0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 64 28  CREATE TABLE cd(
16df0 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52  c, d, .      FOR
16e00 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
16e10 45 46 45 52 45 4e 43 45 53 20 70 20 44 45 46 45  EFERENCES p DEFE
16e20 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
16e30 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20   DEFERRED);.    
16e40 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 69 28  CREATE TABLE ci(
16e50 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52  c, d, .      FOR
16e60 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
16e70 45 46 45 52 45 4e 43 45 53 20 70 20 44 45 46 45  EFERENCES p DEFE
16e80 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
16e90 20 49 4d 4d 45 44 49 41 54 45 29 3b 0a 20 20 20   IMMEDIATE);.   
16ea0 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d   BEGIN;.  }.} {}
16eb0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
16ec0 36 32 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  62.4 {.  catchsq
16ed0 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
16ee0 63 69 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27  ci VALUES('x', '
16ef0 79 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  y') }.} {1 {fore
16f00 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
16f10 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
16f20 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 35 20  est e_fkey-62.5 
16f30 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
16f40 4e 53 45 52 54 20 49 4e 54 4f 20 63 64 20 56 41  NSERT INTO cd VA
16f50 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d  LUES('x', 'y') }
16f60 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
16f70 74 20 65 5f 66 6b 65 79 2d 36 32 2e 36 20 7b 0a  t e_fkey-62.6 {.
16f80 20 20 63 61 74 63 68 73 71 6c 20 7b 20 43 4f 4d    catchsql { COM
16f90 4d 49 54 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  MIT }.} {1 {fore
16fa0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
16fb0 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
16fc0 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 37 20  est e_fkey-62.7 
16fd0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
16fe0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
16ff0 64 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  d;.    COMMIT;. 
17000 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
17060 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 63 75  the maximum recu
17070 72 73 69 6f 6e 20 64 65 70 74 68 20 6f 66 20 66  rsion depth of f
17080 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f  oreign key actio
17090 6e 20 70 72 6f 67 72 61 6d 73 20 69 73 0a 23 20  n programs is.# 
170a0 67 6f 76 65 72 6e 65 64 20 62 79 20 74 68 65 20  governed by the 
170b0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
170c0 45 52 5f 44 45 50 54 48 20 61 6e 64 20 53 51 4c  ER_DEPTH and SQL
170d0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
170e0 52 5f 44 45 50 54 48 0a 23 20 73 65 74 74 69 6e  R_DEPTH.# settin
170f0 67 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  gs..#.# EVIDENCE
17100 2d 4f 46 3a 20 52 2d 34 32 32 36 34 2d 33 30 35  -OF: R-42264-305
17110 30 33 20 54 68 65 20 53 51 4c 49 54 45 5f 4d 41  03 The SQLITE_MA
17120 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
17130 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4c 49 4d  and.# SQLITE_LIM
17140 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
17150 20 73 65 74 74 69 6e 67 73 20 64 65 74 65 72 6d   settings determ
17160 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
17170 61 6c 6c 6f 77 61 62 6c 65 0a 23 20 64 65 70 74  allowable.# dept
17180 68 20 6f 66 20 74 72 69 67 67 65 72 20 70 72 6f  h of trigger pro
17190 67 72 61 6d 20 72 65 63 75 72 73 69 6f 6e 2e 20  gram recursion. 
171a0 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
171b0 20 6f 66 20 74 68 65 73 65 20 6c 69 6d 69 74 73   of these limits
171c0 2c 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ,.# foreign key 
171d0 61 63 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73  actions are cons
171e0 69 64 65 72 65 64 20 74 72 69 67 67 65 72 20 70  idered trigger p
171f0 72 6f 67 72 61 6d 73 2e 0a 23 0a 70 72 6f 63 20  rograms..#.proc 
17200 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
17210 65 63 75 72 73 69 6f 6e 20 7b 6c 69 6d 69 74 7d  ecursion {limit}
17220 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
17230 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  bles.  execsql {
17240 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
17250 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30   CREATE TABLE t0
17260 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
17270 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
17280 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78  NTO t0 VALUES('x
17290 30 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20  0', NULL);.  }. 
172a0 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b   for {set i 1} {
172b0 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69  $i <= $limit} {i
172c0 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
172d0 63 73 71 6c 20 22 0a 20 20 20 20 20 20 43 52 45  csql ".      CRE
172e0 41 54 45 20 54 41 42 4c 45 20 74 24 69 20 28 0a  ATE TABLE t$i (.
172f0 20 20 20 20 20 20 20 20 61 20 50 52 49 4d 41 52          a PRIMAR
17300 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
17310 43 45 53 20 74 5b 65 78 70 72 20 24 69 2d 31 5d  CES t[expr $i-1]
17320 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
17330 44 45 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  DE.      );.    
17340 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 24    INSERT INTO t$
17350 69 20 56 41 4c 55 45 53 28 27 78 24 69 27 2c 20  i VALUES('x$i', 
17360 27 78 5b 65 78 70 72 20 24 69 2d 31 5d 27 29 3b  'x[expr $i-1]');
17370 0a 20 20 20 20 22 0a 20 20 7d 0a 20 20 65 78 65  .    ".  }.  exe
17380 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61  csql COMMIT.  ca
17390 74 63 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c  tchsql ".    DEL
173a0 45 54 45 20 46 52 4f 4d 20 74 30 3b 0a 20 20 20  ETE FROM t0;.   
173b0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
173c0 20 46 52 4f 4d 20 74 24 6c 69 6d 69 74 3b 0a 20   FROM t$limit;. 
173d0 20 22 0a 7d 0a 70 72 6f 63 20 74 65 73 74 5f 6f   ".}.proc test_o
173e0 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69  n_update_recursi
173f0 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64  on {limit} {.  d
17400 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
17410 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
17420 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
17430 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52 49  E TABLE t0(a PRI
17440 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49  MARY KEY);.    I
17450 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41  NSERT INTO t0 VA
17460 4c 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20 7d  LUES('xxx');.  }
17470 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d  .  for {set i 1}
17480 20 7b 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20   {$i <= $limit} 
17490 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73  {incr i} {.    s
174a0 65 74 20 6a 20 5b 65 78 70 72 20 24 69 2d 31 5d  et j [expr $i-1]
174b0 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a  ..    execsql ".
174c0 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
174d0 4c 45 20 74 24 69 20 28 61 20 50 52 49 4d 41 52  LE t$i (a PRIMAR
174e0 59 20 4b 45 59 20 52 45 46 45 52 45 4e 43 45 53  Y KEY REFERENCES
174f0 20 74 24 6a 20 4f 4e 20 55 50 44 41 54 45 20 43   t$j ON UPDATE C
17500 41 53 43 41 44 45 29 3b 0a 20 20 20 20 20 20 49  ASCADE);.      I
17510 4e 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20 56  NSERT INTO t$i V
17520 41 4c 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20  ALUES('xxx');.  
17530 20 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71    ".  }.  execsq
17540 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68  l COMMIT.  catch
17550 73 71 6c 20 22 0a 20 20 20 20 55 50 44 41 54 45  sql ".    UPDATE
17560 20 74 30 20 53 45 54 20 61 20 3d 20 27 79 79 79   t0 SET a = 'yyy
17570 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 4e 4f  ';.    SELECT NO
17580 54 20 28 61 3d 27 79 79 79 27 29 20 46 52 4f 4d  T (a='yyy') FROM
17590 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a   t$limit;.  ".}.
175a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
175b0 36 33 2e 31 2e 31 20 7b 0a 20 20 74 65 73 74 5f  63.1.1 {.  test_
175c0 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73  on_delete_recurs
175d0 69 6f 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  ion $SQLITE_MAX_
175e0 54 52 49 47 47 45 52 5f 44 45 50 54 48 0a 7d 20  TRIGGER_DEPTH.} 
175f0 7b 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  {0 0}.do_test e_
17600 66 6b 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20  fkey-63.1.2 {.  
17610 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
17620 65 63 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24  ecursion [expr $
17630 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
17640 45 52 5f 44 45 50 54 48 2b 31 5d 0a 7d 20 7b 31  ER_DEPTH+1].} {1
17650 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   {too many level
17660 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
17670 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74  ursion}}.do_test
17680 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 33 20 7b   e_fkey-63.1.3 {
17690 0a 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  .  sqlite3_limit
176a0 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54   db SQLITE_LIMIT
176b0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 35  _TRIGGER_DEPTH 5
176c0 0a 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74  .  test_on_delet
176d0 65 5f 72 65 63 75 72 73 69 6f 6e 20 35 0a 7d 20  e_recursion 5.} 
176e0 7b 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  {0 0}.do_test e_
176f0 66 6b 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20  fkey-63.1.4 {.  
17700 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
17710 65 63 75 72 73 69 6f 6e 20 36 0a 7d 20 7b 31 20  ecursion 6.} {1 
17720 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73  {too many levels
17730 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75   of trigger recu
17740 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20  rsion}}.do_test 
17750 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 35 20 7b 0a  e_fkey-63.1.5 {.
17760 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
17770 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  db SQLITE_LIMIT_
17780 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 31 30  TRIGGER_DEPTH 10
17790 30 30 30 30 30 0a 7d 20 7b 35 7d 0a 64 6f 5f 74  00000.} {5}.do_t
177a0 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e  est e_fkey-63.2.
177b0 31 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75 70  1 {.  test_on_up
177c0 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24  date_recursion $
177d0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
177e0 45 52 5f 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d  ER_DEPTH.} {0 0}
177f0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
17800 36 33 2e 32 2e 32 20 7b 0a 20 20 74 65 73 74 5f  63.2.2 {.  test_
17810 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73  on_update_recurs
17820 69 6f 6e 20 5b 65 78 70 72 20 24 53 51 4c 49 54  ion [expr $SQLIT
17830 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
17840 50 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f  PTH+1].} {1 {too
17850 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
17860 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
17870 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  n}}.do_test e_fk
17880 65 79 2d 36 33 2e 32 2e 33 20 7b 0a 20 20 73 71  ey-63.2.3 {.  sq
17890 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53  lite3_limit db S
178a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
178b0 47 45 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65  GER_DEPTH 5.  te
178c0 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63  st_on_update_rec
178d0 75 72 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d  ursion 5.} {0 0}
178e0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
178f0 36 33 2e 32 2e 34 20 7b 0a 20 20 74 65 73 74 5f  63.2.4 {.  test_
17900 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73  on_update_recurs
17910 69 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20  ion 6.} {1 {too 
17920 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
17930 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
17940 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
17950 79 2d 36 33 2e 32 2e 35 20 7b 0a 20 20 73 71 6c  y-63.2.5 {.  sql
17960 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51  ite3_limit db SQ
17970 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
17980 45 52 5f 44 45 50 54 48 20 31 30 30 30 30 30 30  ER_DEPTH 1000000
17990 0a 7d 20 7b 35 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .} {5}..#-------
179a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
179b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
179c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
179d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
179e0 2d 2d 0a 23 20 54 68 65 20 73 65 74 74 69 6e 67  --.# The setting
179f0 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
17a00 65 5f 74 72 69 67 67 65 72 73 20 70 72 61 67 6d  e_triggers pragm
17a10 61 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  a does not affec
17a20 74 20 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20  t foreign.# key 
17a30 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49  actions..#.# EVI
17a40 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 37 36  DENCE-OF: R-5176
17a50 39 2d 33 32 37 33 30 20 54 68 65 20 50 52 41 47  9-32730 The PRAG
17a60 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
17a70 67 67 65 72 73 20 73 65 74 74 69 6e 67 20 64 6f  ggers setting do
17a80 65 73 0a 23 20 6e 6f 74 20 6e 6f 74 20 61 66 66  es.# not not aff
17a90 65 63 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ect the operatio
17aa0 6e 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  n of foreign key
17ab0 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65   actions..#.fore
17ac0 61 63 68 20 72 65 63 75 72 73 69 76 65 5f 74 72  ach recursive_tr
17ad0 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 20 5b  iggers_setting [
17ae0 6c 69 73 74 20 30 20 31 20 4f 4e 20 4f 46 46 5d  list 0 1 ON OFF]
17af0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
17b00 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 22  bles.  execsql "
17b10 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
17b20 5f 74 72 69 67 67 65 72 73 20 3d 20 24 72 65 63  _triggers = $rec
17b30 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f  ursive_triggers_
17b40 73 65 74 74 69 6e 67 22 0a 0a 20 20 64 6f 5f 74  setting"..  do_t
17b50 65 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72  est e_fkey-64.$r
17b60 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
17b70 73 5f 73 65 74 74 69 6e 67 2e 31 20 7b 0a 20 20  s_setting.1 {.  
17b80 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
17b90 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
17ba0 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
17bb0 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
17bc0 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
17bd0 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  DE);.      INSER
17be0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
17bf0 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  (1, NULL);.     
17c00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
17c10 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20  VALUES(2, 1);.  
17c20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17c30 74 31 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b  t1 VALUES(3, 2);
17c40 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17c50 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
17c60 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  3);.      INSERT
17c70 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17c80 35 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c  5, 4);.      SEL
17c90 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17ca0 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
17cb0 7b 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {5}.  do_test e_
17cc0 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17cd0 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17ce0 69 6e 67 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  ing.2 {.    exec
17cf0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
17d00 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48  nt(*) FROM t1 WH
17d10 45 52 45 20 61 20 3d 20 31 20 7d 0a 20 20 7d 20  ERE a = 1 }.  } 
17d20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {1}.  do_test e_
17d30 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17d40 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17d50 69 6e 67 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  ing.3 {.    exec
17d60 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45 4c  sql { .      DEL
17d70 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
17d80 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53  E a = 1;.      S
17d90 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
17da0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
17db0 7d 20 7b 30 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  } {0}.}..finish_
17dc0 74 65 73 74 0a                                   test.