/ Hex Artifact Content
Login

Artifact 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe:


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 0a 20 20  l {db db}} { .  
03e0: 75 70 6c 65 76 65 6c 20 5b 73 75 62 73 74 20 2d  uplevel [subst -
03f0: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a 20 20 20  nocommands {.   
0400: 20 73 65 74 20 65 71 70 72 65 73 20 5b 6c 69 73   set eqpres [lis
0410: 74 5d 0a 20 20 20 20 24 64 62 20 65 76 61 6c 20  t].    $db eval 
0420: 22 24 73 71 6c 22 20 7b 0a 20 20 20 20 20 20 6c  "$sql" {.      l
0430: 61 70 70 65 6e 64 20 65 71 70 72 65 73 20 5b 73  append eqpres [s
0440: 65 74 20 64 65 74 61 69 6c 5d 0a 20 20 20 20 7d  et detail].    }
0450: 0a 20 20 20 20 73 65 74 20 65 71 70 72 65 73 0a  .    set eqpres.
0460: 20 20 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f    }].}..proc do_
0470: 64 65 74 61 69 6c 5f 74 65 73 74 20 7b 74 6e 20  detail_test {tn 
0480: 73 71 6c 20 72 65 73 7d 20 7b 0a 20 20 73 65 74  sql res} {.  set
0490: 20 6e 6f 72 6d 61 6c 72 65 73 20 5b 6c 69 73 74   normalres [list
04a0: 20 7b 2a 7d 24 72 65 73 5d 0a 20 20 75 70 6c 65   {*}$res].  uple
04b0: 76 65 6c 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  vel [subst -noco
04c0: 6d 6d 61 6e 64 73 20 7b 0a 20 20 20 20 64 6f 5f  mmands {.    do_
04d0: 74 65 73 74 20 24 74 6e 20 7b 0a 20 20 20 20 20  test $tn {.     
04e0: 20 65 71 70 20 7b 20 24 73 71 6c 20 7d 0a 20 20   eqp { $sql }.  
04f0: 20 20 7d 20 7b 24 6e 6f 72 6d 61 6c 72 65 73 7d    } {$normalres}
0500: 0a 20 20 7d 5d 0a 7d 0a 0a 23 23 23 23 23 23 23  .  }].}..#######
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0550: 23 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e  ####.### SECTION
0560: 20 32 3a 20 45 6e 61 62 6c 69 6e 67 20 46 6f 72   2: Enabling For
0570: 65 69 67 6e 20 4b 65 79 20 53 75 70 70 6f 72 74  eign Key Support
0580: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
0590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
05a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
05b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
0620: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 37 31 30 2d  NCE-OF: R-33710-
0630: 35 36 33 34 34 20 49 6e 20 6f 72 64 65 72 20 74  56344 In order t
0640: 6f 20 75 73 65 20 66 6f 72 65 69 67 6e 20 6b 65  o use foreign ke
0650: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
0660: 0a 23 20 53 51 4c 69 74 65 2c 20 74 68 65 20 6c  .# SQLite, the l
0670: 69 62 72 61 72 79 20 6d 75 73 74 20 62 65 20 63  ibrary must be c
0680: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6e 65 69  ompiled with nei
0690: 74 68 65 72 0a 23 20 53 51 4c 49 54 45 5f 4f 4d  ther.# SQLITE_OM
06a0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 6f  IT_FOREIGN_KEY o
06b0: 72 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  r SQLITE_OMIT_TR
06c0: 49 47 47 45 52 20 64 65 66 69 6e 65 64 2e 0a 23  IGGER defined..#
06d0: 0a 69 66 63 61 70 61 62 6c 65 20 74 72 69 67 67  .ifcapable trigg
06e0: 65 72 26 26 66 6f 72 65 69 67 6e 6b 65 79 20 7b  er&&foreignkey {
06f0: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
0700: 79 2d 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  y-1 {.    execsq
0710: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
0720: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
0730: 4f 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ON;.      CREATE
0740: 20 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d 41   TABLE p(i PRIMA
0750: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 20 20 43  RY KEY);.      C
0760: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20  REATE TABLE c(j 
0770: 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
0780: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
0790: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
07a0: 54 4f 20 70 20 56 41 4c 55 45 53 28 27 68 65 6c  TO p VALUES('hel
07b0: 6c 6f 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  lo');.      INSE
07c0: 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
07d0: 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 20  ('hello');.     
07e0: 20 55 50 44 41 54 45 20 70 20 53 45 54 20 69 20   UPDATE p SET i 
07f0: 3d 20 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20 20  = 'world';.     
0800: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
0810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 6f 72  ;.    }.  } {wor
0820: 6c 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ld}.}..#--------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0870: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 65 66 66  -.# Test the eff
0880: 65 63 74 73 20 6f 66 20 64 65 66 69 6e 69 6e 67  ects of defining
0890: 20 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 62 75   OMIT_TRIGGER bu
08a0: 74 20 6e 6f 74 20 4f 4d 49 54 5f 46 4f 52 45 49  t not OMIT_FOREI
08b0: 47 4e 5f 4b 45 59 2e 0a 23 0a 23 20 45 56 49 44  GN_KEY..#.# EVID
08c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 30 31 30 39  ENCE-OF: R-10109
08d0: 2d 32 30 34 35 32 20 49 66 20 53 51 4c 49 54 45  -20452 If SQLITE
08e0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 69 73  _OMIT_TRIGGER is
08f0: 20 64 65 66 69 6e 65 64 20 62 75 74 0a 23 20 53   defined but.# S
0900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
0910: 47 4e 5f 4b 45 59 20 69 73 20 6e 6f 74 2c 20 74  GN_KEY is not, t
0920: 68 65 6e 20 53 51 4c 69 74 65 20 62 65 68 61 76  hen SQLite behav
0930: 65 73 20 61 73 20 69 74 20 64 69 64 20 70 72 69  es as it did pri
0940: 6f 72 20 74 6f 0a 23 20 76 65 72 73 69 6f 6e 20  or to.# version 
0950: 33 2e 36 2e 31 39 20 28 32 30 30 39 2d 31 30 2d  3.6.19 (2009-10-
0960: 31 34 29 20 2d 20 66 6f 72 65 69 67 6e 20 6b 65  14) - foreign ke
0970: 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 61 72  y definitions ar
0980: 65 20 70 61 72 73 65 64 20 61 6e 64 0a 23 20 6d  e parsed and.# m
0990: 61 79 20 62 65 20 71 75 65 72 69 65 64 20 75 73  ay be queried us
09a0: 69 6e 67 20 50 52 41 47 4d 41 20 66 6f 72 65 69  ing PRAGMA forei
09b0: 67 6e 5f 6b 65 79 5f 6c 69 73 74 2c 20 62 75 74  gn_key_list, but
09c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63   foreign key.# c
09d0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e  onstraints are n
09e0: 6f 74 20 65 6e 66 6f 72 63 65 64 2e 0a 23 0a 23  ot enforced..#.#
09f0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
0a00: 65 73 74 20 74 68 61 74 20 22 50 52 41 47 4d 41  est that "PRAGMA
0a10: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 69   foreign_keys" i
0a20: 73 20 61 20 6e 6f 2d 6f 70 20 69 6e 20 74 68 69  s a no-op in thi
0a30: 73 20 63 61 73 65 2e 0a 23 20 57 68 65 6e 20 75  s case..# When u
0a40: 73 69 6e 67 20 74 68 65 20 70 72 61 67 6d 61 20  sing the pragma 
0a50: 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72  to query the cur
0a60: 72 65 6e 74 20 73 65 74 74 69 6e 67 2c 20 30 20  rent setting, 0 
0a70: 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65  rows are returne
0a80: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
0a90: 4f 46 3a 20 52 2d 32 32 35 36 37 2d 34 34 30 33  OF: R-22567-4403
0aa0: 39 20 54 68 65 20 50 52 41 47 4d 41 20 66 6f 72  9 The PRAGMA for
0ab0: 65 69 67 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e  eign_keys comman
0ac0: 64 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 23 20 69  d is a no-op.# i
0ad0: 6e 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  n this configura
0ae0: 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e  tion..#.# EVIDEN
0af0: 43 45 2d 4f 46 3a 20 52 2d 34 31 37 38 34 2d 31  CE-OF: R-41784-1
0b00: 33 33 33 39 20 54 69 70 3a 20 49 66 20 74 68 65  3339 Tip: If the
0b10: 20 63 6f 6d 6d 61 6e 64 20 22 50 52 41 47 4d 41   command "PRAGMA
0b20: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 0a 23   foreign_keys".#
0b30: 20 72 65 74 75 72 6e 73 20 6e 6f 20 64 61 74 61   returns no data
0b40: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69   instead of a si
0b50: 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
0b60: 69 6e 67 20 22 30 22 20 6f 72 20 22 31 22 2c 20  ing "0" or "1", 
0b70: 74 68 65 6e 0a 23 20 74 68 65 20 76 65 72 73 69  then.# the versi
0b80: 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 79 6f 75  on of SQLite you
0b90: 20 61 72 65 20 75 73 69 6e 67 20 64 6f 65 73 20   are using does 
0ba0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 66 6f 72 65  not support fore
0bb0: 69 67 6e 20 6b 65 79 73 0a 23 20 28 65 69 74 68  ign keys.# (eith
0bc0: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
0bd0: 20 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 36 2e   older than 3.6.
0be0: 31 39 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  19 or because it
0bf0: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 23 20   was compiled.# 
0c00: 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54  with SQLITE_OMIT
0c10: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20  _FOREIGN_KEY or 
0c20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
0c30: 47 45 52 20 64 65 66 69 6e 65 64 29 2e 0a 23 0a  GER defined)..#.
0c40: 72 65 73 65 74 5f 64 62 0a 69 66 63 61 70 61 62  reset_db.ifcapab
0c50: 6c 65 20 21 74 72 69 67 67 65 72 26 26 66 6f 72  le !trigger&&for
0c60: 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74  eignkey {.  do_t
0c70: 65 73 74 20 65 5f 66 6b 65 79 2d 32 2e 31 20 7b  est e_fkey-2.1 {
0c80: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
0c90: 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65       PRAGMA fore
0ca0: 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20  ign_keys = ON;. 
0cb0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
0cc0: 45 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b 45  E p(i PRIMARY KE
0cd0: 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  Y);.      CREATE
0ce0: 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52   TABLE c(j REFER
0cf0: 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41 54  ENCES p ON UPDAT
0d00: 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20  E CASCADE);.    
0d10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
0d20: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b  VALUES('hello');
0d30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0d40: 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c  TO c VALUES('hel
0d50: 6c 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44 41  lo');.      UPDA
0d60: 54 45 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f  TE p SET i = 'wo
0d70: 72 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c 45  rld';.      SELE
0d80: 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20  CT * FROM c;.   
0d90: 20 7d 0a 20 20 7d 20 7b 68 65 6c 6c 6f 7d 0a 20   }.  } {hello}. 
0da0: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
0db0: 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.2 {.    execsq
0dc0: 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
0dd0: 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d  gn_key_list(c) }
0de0: 0a 20 20 7d 20 7b 30 20 30 20 70 20 6a 20 7b 7d  .  } {0 0 p j {}
0df0: 20 43 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54   CASCADE {NO ACT
0e00: 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 64 6f 5f  ION} NONE}.  do_
0e10: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 2e 33 20  test e_fkey-2.3 
0e20: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
0e30: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
0e40: 65 79 73 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a  eys }.  } {}.}..
0e50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0ea0: 73 74 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  st the effects o
0eb0: 66 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49 54 5f  f defining OMIT_
0ec0: 46 4f 52 45 49 47 4e 5f 4b 45 59 2e 0a 23 0a 23  FOREIGN_KEY..#.#
0ed0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
0ee0: 35 38 34 32 38 2d 33 36 36 36 30 20 49 66 20 4f  58428-36660 If O
0ef0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20  MIT_FOREIGN_KEY 
0f00: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
0f10: 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  .# foreign key d
0f20: 65 66 69 6e 69 74 69 6f 6e 73 20 63 61 6e 6e 6f  efinitions canno
0f30: 74 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64  t even be parsed
0f40: 20 28 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20   (attempting to 
0f50: 73 70 65 63 69 66 79 20 61 0a 23 20 66 6f 72 65  specify a.# fore
0f60: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
0f70: 6f 6e 20 69 73 20 61 20 73 79 6e 74 61 78 20 65  on is a syntax e
0f80: 72 72 6f 72 29 2e 0a 23 0a 23 20 53 70 65 63 69  rror)..#.# Speci
0f90: 66 69 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68  fically, test th
0fa0: 61 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  at foreign key c
0fb0: 6f 6e 73 74 72 61 69 6e 74 73 20 63 61 6e 6e 6f  onstraints canno
0fc0: 74 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64  t even be parsed
0fd0: 20 0a 23 20 69 6e 20 73 75 63 68 20 61 20 62 75   .# in such a bu
0fe0: 69 6c 64 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ild..#.reset_db.
0ff0: 69 66 63 61 70 61 62 6c 65 20 21 66 6f 72 65 69  ifcapable !forei
1000: 67 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65 73  gnkey {.  do_tes
1010: 74 20 65 5f 66 6b 65 79 2d 33 2e 31 20 7b 0a 20  t e_fkey-3.1 {. 
1020: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45     execsql { CRE
1030: 41 54 45 20 54 41 42 4c 45 20 70 28 69 20 50 52  ATE TABLE p(i PR
1040: 49 4d 41 52 59 20 4b 45 59 29 20 7d 0a 20 20 20  IMARY KEY) }.   
1050: 20 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41   catchsql { CREA
1060: 54 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46  TE TABLE c(j REF
1070: 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44  ERENCES p ON UPD
1080: 41 54 45 20 43 41 53 43 41 44 45 29 20 7d 0a 20  ATE CASCADE) }. 
1090: 20 7d 20 7b 31 20 7b 6e 65 61 72 20 22 4f 4e 22   } {1 {near "ON"
10a0: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d  : syntax error}}
10b0: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
10c0: 79 2d 33 2e 32 20 7b 0a 20 20 20 20 23 20 54 68  y-3.2 {.    # Th
10d0: 69 73 20 69 73 20 61 6c 6c 6f 77 65 64 2c 20 61  is is allowed, a
10e0: 73 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  s in this build,
10f0: 20 22 52 45 46 45 52 45 4e 43 45 53 22 20 69 73   "REFERENCES" is
1100: 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2e 0a   not a keyword..
1110: 20 20 20 20 23 20 54 68 65 20 64 65 63 6c 61 72      # The declar
1120: 65 64 20 64 61 74 61 74 79 70 65 20 6f 66 20 63  ed datatype of c
1130: 6f 6c 75 6d 6e 20 6a 20 69 73 20 22 52 45 46 45  olumn j is "REFE
1140: 52 45 4e 43 45 53 20 70 22 2e 0a 20 20 20 20 65  RENCES p"..    e
1150: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
1160: 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45  TABLE c(j REFERE
1170: 4e 43 45 53 20 70 29 20 7d 0a 20 20 7d 20 7b 7d  NCES p) }.  } {}
1180: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
1190: 79 2d 33 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  y-3.3 {.    exec
11a0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 62  sql { PRAGMA tab
11b0: 6c 65 5f 69 6e 66 6f 28 63 29 20 7d 0a 20 20 7d  le_info(c) }.  }
11c0: 20 7b 30 20 6a 20 7b 52 45 46 45 52 45 4e 43 45   {0 j {REFERENCE
11d0: 53 20 70 7d 20 30 20 7b 7d 20 30 7d 0a 20 20 64  S p} 0 {} 0}.  d
11e0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e  o_test e_fkey-3.
11f0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
1200: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
1210: 5f 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a 20  _key_list(c) }. 
1220: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
1230: 65 5f 66 6b 65 79 2d 33 2e 35 20 7b 0a 20 20 20  e_fkey-3.5 {.   
1240: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1250: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d  A foreign_keys }
1260: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 69 66 63 61 70  .  } {}.}..ifcap
1270: 61 62 6c 65 20 21 66 6f 72 65 69 67 6e 6b 65 79  able !foreignkey
1280: 7c 7c 21 74 72 69 67 67 65 72 20 7b 20 66 69 6e  ||!trigger { fin
1290: 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74 75 72  ish_test ; retur
12a0: 6e 20 7d 0a 72 65 73 65 74 5f 64 62 0a 0a 0a 23  n }.reset_db...#
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
1300: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 38 30  ENCE-OF: R-07280
1310: 2d 36 30 35 31 30 20 41 73 73 75 6d 69 6e 67 20  -60510 Assuming 
1320: 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  the library is c
1330: 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 23 20 66  ompiled with.# f
1340: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
1350: 72 61 69 6e 74 73 20 65 6e 61 62 6c 65 64 2c 20  raints enabled, 
1360: 69 74 20 6d 75 73 74 20 73 74 69 6c 6c 20 62 65  it must still be
1370: 20 65 6e 61 62 6c 65 64 20 62 79 20 74 68 65 0a   enabled by the.
1380: 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 74  # application at
1390: 20 72 75 6e 74 69 6d 65 2c 20 75 73 69 6e 67 20   runtime, using 
13a0: 74 68 65 20 50 52 41 47 4d 41 20 66 6f 72 65 69  the PRAGMA forei
13b0: 67 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64 2e  gn_keys command.
13c0: 0a 23 0a 23 20 54 68 69 73 20 61 6c 73 6f 20 74  .#.# This also t
13d0: 65 73 74 73 20 74 68 61 74 20 66 6f 72 65 69 67  ests that foreig
13e0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13f0: 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62  s are disabled b
1400: 79 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  y default..#.# E
1410: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
1420: 32 36 31 2d 33 39 37 30 32 20 46 6f 72 65 69 67  261-39702 Foreig
1430: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
1440: 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62  s are disabled b
1450: 79 0a 23 20 64 65 66 61 75 6c 74 20 28 66 6f 72  y.# default (for
1460: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
1470: 74 69 62 69 6c 69 74 79 29 2c 20 73 6f 20 6d 75  tibility), so mu
1480: 73 74 20 62 65 20 65 6e 61 62 6c 65 64 20 73 65  st be enabled se
1490: 70 61 72 61 74 65 6c 79 0a 23 20 66 6f 72 20 65  parately.# for e
14a0: 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ach database con
14b0: 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 72 6f 70 5f  nection..#.drop_
14c0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
14d0: 73 74 20 65 5f 66 6b 65 79 2d 34 2e 31 20 7b 0a  st e_fkey-4.1 {.
14e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 69  CREATE TABLE p(i
1500: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
1510: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1520: 63 28 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(j REFERENCES p
1530: 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
1540: 44 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  DE);.    INSERT 
1550: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 68  INTO p VALUES('h
1560: 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  ello');.    INSE
1570: 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
1580: 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 55  ('hello');.    U
1590: 50 44 41 54 45 20 70 20 53 45 54 20 69 20 3d 20  PDATE p SET i = 
15a0: 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20 53 45 4c  'world';.    SEL
15b0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
15c0: 7d 20 0a 7d 20 7b 68 65 6c 6c 6f 7d 0a 64 6f 5f  } .} {hello}.do_
15d0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 2e 32 20  test e_fkey-4.2 
15e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
15f0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 3b    DELETE FROM c;
1600: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
1610: 20 70 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66   p;.    PRAGMA f
1620: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
1630: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1640: 4f 20 70 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  O p VALUES('hell
1650: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
1660: 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68  INTO c VALUES('h
1670: 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 55 50 44 41  ello');.    UPDA
1680: 54 45 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f  TE p SET i = 'wo
1690: 72 6c 64 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  rld';.    SELECT
16a0: 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a   * FROM c;.  } .
16b0: 7d 20 7b 77 6f 72 6c 64 7d 0a 0a 23 2d 2d 2d 2d  } {world}..#----
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
1710: 2d 4f 46 3a 20 52 2d 30 38 30 31 33 2d 33 37 37  -OF: R-08013-377
1720: 33 37 20 54 68 65 20 61 70 70 6c 69 63 61 74 69  37 The applicati
1730: 6f 6e 20 63 61 6e 20 61 6c 73 6f 20 75 73 65 20  on can also use 
1740: 61 20 50 52 41 47 4d 41 0a 23 20 66 6f 72 65 69  a PRAGMA.# forei
1750: 67 6e 5f 6b 65 79 73 20 73 74 61 74 65 6d 65 6e  gn_keys statemen
1760: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
1770: 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  f foreign keys a
1780: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 23 20 65  re currently.# e
1790: 6e 61 62 6c 65 64 2e 0a 0a 23 0a 23 20 54 68 69  nabled...#.# Thi
17a0: 73 20 61 6c 73 6f 20 74 65 73 74 73 20 74 68 65  s also tests the
17b0: 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 69 6e   example code in
17c0: 20 73 65 63 74 69 6f 6e 20 32 20 6f 66 20 66 6f   section 2 of fo
17d0: 72 65 69 67 6e 6b 65 79 73 2e 69 6e 2e 0a 23 0a  reignkeys.in..#.
17e0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
17f0: 2d 31 31 32 35 35 2d 31 39 39 30 37 0a 23 20 0a  -11255-19907.# .
1800: 72 65 73 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74  reset_db.do_test
1810: 20 65 5f 66 6b 65 79 2d 35 2e 31 20 7b 0a 20 20   e_fkey-5.1 {.  
1820: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1830: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a   foreign_keys }.
1840: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {0}.do_test e_
1850: 66 6b 65 79 2d 35 2e 32 20 7b 0a 20 20 65 78 65  fkey-5.2 {.  exe
1860: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
1870: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
1880: 3d 20 4f 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41  = ON;.    PRAGMA
1890: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20   foreign_keys;. 
18a0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
18b0: 20 65 5f 66 6b 65 79 2d 35 2e 33 20 7b 0a 20 20   e_fkey-5.3 {.  
18c0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
18d0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
18e0: 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 50 52  ys = OFF;.    PR
18f0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1900: 73 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 23 2d  s;.  }.} {0}..#-
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1960: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
1970: 6f 73 73 69 62 6c 65 20 74 6f 20 65 6e 61 62 6c  ossible to enabl
1980: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 66 6f 72  e or disable for
1990: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
19a0: 0a 23 20 77 68 69 6c 65 20 6e 6f 74 20 69 6e 20  .# while not in 
19b0: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
19c0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
19d0: 46 3a 20 52 2d 34 36 36 34 39 2d 35 38 35 33 37  F: R-46649-58537
19e0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
19f0: 62 6c 65 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  ble to enable or
1a00: 20 64 69 73 61 62 6c 65 0a 23 20 66 6f 72 65 69   disable.# forei
1a10: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
1a20: 74 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ts in the middle
1a30: 20 6f 66 20 61 20 6d 75 6c 74 69 2d 73 74 61 74   of a multi-stat
1a40: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a50: 6e 0a 23 20 28 77 68 65 6e 20 53 51 4c 69 74 65  n.# (when SQLite
1a60: 20 69 73 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63   is not in autoc
1a70: 6f 6d 6d 69 74 20 6d 6f 64 65 29 2e 20 41 74 74  ommit mode). Att
1a80: 65 6d 70 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f  empting to do so
1a90: 20 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 74 75   does not.# retu
1aa0: 72 6e 20 61 6e 20 65 72 72 6f 72 3b 20 69 74 20  rn an error; it 
1ab0: 73 69 6d 70 6c 79 20 68 61 73 20 6e 6f 20 65 66  simply has no ef
1ac0: 66 65 63 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62  fect..#.reset_db
1ad0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
1ae0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
1af0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  {.    PRAGMA for
1b00: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
1b10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1b20: 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62 29   t1(a UNIQUE, b)
1b30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
1b40: 4c 45 20 74 32 28 63 2c 20 64 20 52 45 46 45 52  LE t2(c, d REFER
1b50: 45 4e 43 45 53 20 74 31 28 61 29 29 3b 0a 20 20  ENCES t1(a));.  
1b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1b70: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
1b80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1b90: 32 20 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a  2 VALUES(2, 1);.
1ba0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
1bb0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1bc0: 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 7d 0a  keys = OFF;.  }.
1bd0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1be0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1bf0: 31 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  1.  }.} {1 {FORE
1c00: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
1c10: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
1c20: 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e 32 20 7b  est e_fkey-6.2 {
1c30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
1c40: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
1c50: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
1c60: 20 65 5f 66 6b 65 79 2d 36 2e 33 20 7b 0a 20 20   e_fkey-6.3 {.  
1c70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f  execsql {.    CO
1c80: 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
1c90: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
1ca0: 4f 46 46 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  OFF;.    BEGIN;.
1cb0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
1cc0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
1cd0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
1ce0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47  M t1;.      PRAG
1cf0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b  MA foreign_keys;
1d00: 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  .  }.} {0}.do_te
1d10: 73 74 20 65 5f 66 6b 65 79 2d 36 2e 34 20 7b 0a  st e_fkey-6.4 {.
1d20: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
1d30: 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23  .} {}..#########
1d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d80: 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 31  ##.### SECTION 1
1d90: 3a 20 49 6e 74 72 6f 64 75 63 74 69 6f 6e 20 74  : Introduction t
1da0: 6f 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f  o Foreign Key Co
1db0: 6e 73 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23  nstraints.######
1dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e00: 23 23 23 23 23 0a 65 78 65 63 73 71 6c 20 22 50  #####.execsql "P
1e10: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
1e20: 79 73 20 3d 20 4f 4e 22 0a 0a 23 2d 2d 2d 2d 2d  ys = ON"..#-----
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68  ----.# Verify th
1e80: 61 74 20 74 68 65 20 73 79 6e 74 61 78 20 69 6e  at the syntax in
1e90: 20 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70   the first examp
1ea0: 6c 65 20 69 6e 20 73 65 63 74 69 6f 6e 20 31 20  le in section 1 
1eb0: 69 73 20 76 61 6c 69 64 2e 0a 23 0a 23 20 45 56  is valid..#.# EV
1ec0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 30  IDENCE-OF: R-040
1ed0: 34 32 2d 32 34 38 32 35 20 54 6f 20 64 6f 20 73  42-24825 To do s
1ee0: 6f 2c 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  o, a foreign key
1ef0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6d 61 79 20   definition may 
1f00: 62 65 0a 23 20 61 64 64 65 64 20 62 79 20 6d 6f  be.# added by mo
1f10: 64 69 66 79 69 6e 67 20 74 68 65 20 64 65 63 6c  difying the decl
1f20: 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  aration of the t
1f30: 72 61 63 6b 20 74 61 62 6c 65 20 74 6f 20 74 68  rack table to th
1f40: 65 0a 23 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 43  e.# following: C
1f50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
1f60: 6b 28 20 74 72 61 63 6b 69 64 20 49 4e 54 45 47  k( trackid INTEG
1f70: 45 52 2c 20 74 72 61 63 6b 6e 61 6d 65 20 54 45  ER, trackname TE
1f80: 58 54 2c 0a 23 20 74 72 61 63 6b 61 72 74 69 73  XT,.# trackartis
1f90: 74 20 49 4e 54 45 47 45 52 2c 20 46 4f 52 45 49  t INTEGER, FOREI
1fa0: 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69  GN KEY(trackarti
1fb0: 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 0a 23  st) REFERENCES.#
1fc0: 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
1fd0: 29 20 29 3b 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ) );.#.do_test e
1fe0: 5f 66 6b 65 79 2d 37 2e 31 20 7b 0a 20 20 65 78  _fkey-7.1 {.  ex
1ff0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
2000: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
2010: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
2020: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
2030: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
2040: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
2050: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
2060: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
2070: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
2080: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
2090: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
20a0: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
20b0: 72 74 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20  rtist INTEGER,. 
20c0: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
20d0: 28 74 72 61 63 6b 61 72 74 69 73 74 29 20 52 45  (trackartist) RE
20e0: 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
20f0: 61 72 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b  artistid).    );
2100: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2150: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
2160: 2d 4f 46 3a 20 52 2d 36 31 33 36 32 2d 33 32 30  -OF: R-61362-320
2170: 38 37 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f  87 Attempting to
2180: 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20 69 6e   insert a row in
2190: 74 6f 20 74 68 65 20 74 72 61 63 6b 0a 23 20 74  to the track.# t
21a0: 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  able that does n
21b0: 6f 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ot correspond to
21c0: 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68 65 20   any row in the 
21d0: 61 72 74 69 73 74 20 74 61 62 6c 65 20 77 69 6c  artist table wil
21e0: 6c 0a 23 20 66 61 69 6c 2c 0a 23 0a 64 6f 5f 74  l.# fail,.#.do_t
21f0: 65 73 74 20 65 5f 66 6b 65 79 2d 38 2e 31 20 7b  est e_fkey-8.1 {
2200: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
2210: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
2220: 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b  VALUES(1, 'track
2230: 20 31 27 2c 20 31 29 20 7d 0a 7d 20 7b 31 20 7b   1', 1) }.} {1 {
2240: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
2250: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
2260: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 38  do_test e_fkey-8
2270: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
2280: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74   INSERT INTO art
2290: 69 73 74 20 56 41 4c 55 45 53 28 32 2c 20 27 61  ist VALUES(2, 'a
22a0: 72 74 69 73 74 20 31 27 29 20 7d 0a 20 20 63 61  rtist 1') }.  ca
22b0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
22c0: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
22d0: 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20  S(1, 'track 1', 
22e0: 31 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  1) }.} {1 {FOREI
22f0: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
2300: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
2310: 73 74 20 65 5f 66 6b 65 79 2d 38 2e 32 20 7b 0a  st e_fkey-8.2 {.
2320: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
2330: 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
2340: 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31  LUES(1, 'track 1
2350: 27 2c 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  ', 2) }.} {}..#-
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d  --------.# Attem
23b0: 70 74 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  pting to delete 
23c0: 61 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 27  a row from the '
23d0: 61 72 74 69 73 74 27 20 74 61 62 6c 65 20 77 68  artist' table wh
23e0: 69 6c 65 20 74 68 65 72 65 20 61 72 65 20 0a 23  ile there are .#
23f0: 20 64 65 70 65 6e 64 65 6e 74 20 72 6f 77 73 20   dependent rows 
2400: 69 6e 20 74 68 65 20 74 72 61 63 6b 20 74 61 62  in the track tab
2410: 6c 65 20 61 6c 73 6f 20 66 61 69 6c 73 2e 0a 23  le also fails..#
2420: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2430: 52 2d 32 34 34 30 31 2d 35 32 34 30 30 20 61 73  R-24401-52400 as
2440: 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 69 6e 67   will attempting
2450: 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72 6f 77   to delete a row
2460: 20 66 72 6f 6d 20 74 68 65 0a 23 20 61 72 74 69   from the.# arti
2470: 73 74 20 74 61 62 6c 65 20 77 68 65 6e 20 74 68  st table when th
2480: 65 72 65 20 65 78 69 73 74 20 64 65 70 65 6e 64  ere exist depend
2490: 65 6e 74 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ent rows in the 
24a0: 74 72 61 63 6b 20 74 61 62 6c 65 0a 23 0a 64 6f  track table.#.do
24b0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 39 2e 31  _test e_fkey-9.1
24c0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
24d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
24e0: 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69  st WHERE artisti
24f0: 64 20 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 46 4f  d = 2 }.} {1 {FO
2500: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
2510: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
2520: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 39 2e 32  _test e_fkey-9.2
2530: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
2540: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2550: 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63  track WHERE trac
2560: 6b 61 72 74 69 73 74 20 3d 20 32 3b 0a 20 20 20  kartist = 2;.   
2570: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
2580: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
2590: 69 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 7b 7d  id = 2;.  }.} {}
25a0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
25b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49  ------------.# I
25f0: 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  f the foreign ke
2600: 79 20 63 6f 6c 75 6d 6e 20 28 74 72 61 63 6b 61  y column (tracka
2610: 72 74 69 73 74 29 20 69 6e 20 74 61 62 6c 65 20  rtist) in table 
2620: 27 74 72 61 63 6b 27 20 69 73 20 73 65 74 20 74  'track' is set t
2630: 6f 20 4e 55 4c 4c 2c 0a 23 20 74 68 65 72 65 20  o NULL,.# there 
2640: 69 73 20 6e 6f 20 72 65 71 75 69 72 65 6d 65 6e  is no requiremen
2650: 74 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67  t for a matching
2660: 20 72 6f 77 20 69 6e 20 74 68 65 20 27 61 72 74   row in the 'art
2670: 69 73 74 27 20 74 61 62 6c 65 2e 0a 23 0a 23 20  ist' table..#.# 
2680: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2690: 33 39 38 30 2d 34 38 38 35 39 20 54 68 65 72 65  3980-48859 There
26a0: 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
26b0: 6e 3a 20 69 66 20 74 68 65 20 66 6f 72 65 69 67  n: if the foreig
26c0: 6e 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 69  n key.# column i
26d0: 6e 20 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c  n the track tabl
26e0: 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  e is NULL, then 
26f0: 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  no corresponding
2700: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 23 20   entry in the.# 
2710: 61 72 74 69 73 74 20 74 61 62 6c 65 20 69 73 20  artist table is 
2720: 72 65 71 75 69 72 65 64 2e 0a 23 0a 64 6f 5f 74  required..#.do_t
2730: 65 73 74 20 65 5f 66 6b 65 79 2d 31 30 2e 31 20  est e_fkey-10.1 
2740: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72    INSERT INTO tr
2760: 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27 74  ack VALUES(1, 't
2770: 72 61 63 6b 20 31 27 2c 20 4e 55 4c 4c 29 3b 0a  rack 1', NULL);.
2780: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2790: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 32 2c 20  track VALUES(2, 
27a0: 27 74 72 61 63 6b 20 32 27 2c 20 4e 55 4c 4c 29  'track 2', NULL)
27b0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
27c0: 73 74 20 65 5f 66 6b 65 79 2d 31 30 2e 32 20 7b  st e_fkey-10.2 {
27d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
27e0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73  ECT * FROM artis
27f0: 74 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  t }.} {}.do_test
2800: 20 65 5f 66 6b 65 79 2d 31 30 2e 33 20 7b 0a 20   e_fkey-10.3 {. 
2810: 20 23 20 53 65 74 74 69 6e 67 20 74 68 65 20 74   # Setting the t
2820: 72 61 63 6b 69 64 20 74 6f 20 61 20 6e 6f 6e 2d  rackid to a non-
2830: 4e 55 4c 4c 20 76 61 6c 75 65 20 66 61 69 6c 73  NULL value fails
2840: 2c 20 6f 66 20 63 6f 75 72 73 65 2e 0a 20 20 63  , of course..  c
2850: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
2860: 20 74 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b   track SET track
2870: 61 72 74 69 73 74 20 3d 20 35 20 57 48 45 52 45  artist = 5 WHERE
2880: 20 74 72 61 63 6b 69 64 20 3d 20 31 20 7d 0a 7d   trackid = 1 }.}
2890: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
28a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
28b0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
28c0: 6b 65 79 2d 31 30 2e 34 20 7b 0a 20 20 65 78 65  key-10.4 {.  exe
28d0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
28e0: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
28f0: 4c 55 45 53 28 35 2c 20 27 61 72 74 69 73 74 20  LUES(5, 'artist 
2900: 35 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  5');.    UPDATE 
2910: 74 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61  track SET tracka
2920: 72 74 69 73 74 20 3d 20 35 20 57 48 45 52 45 20  rtist = 5 WHERE 
2930: 74 72 61 63 6b 69 64 20 3d 20 31 3b 0a 20 20 7d  trackid = 1;.  }
2940: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
2950: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
2960: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
2970: 3d 20 35 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  = 5}.} {1 {FOREI
2980: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
2990: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
29a0: 73 74 20 65 5f 66 6b 65 79 2d 31 30 2e 35 20 7b  st e_fkey-10.5 {
29b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
29c0: 20 20 55 50 44 41 54 45 20 74 72 61 63 6b 20 53    UPDATE track S
29d0: 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d  ET trackartist =
29e0: 20 4e 55 4c 4c 20 57 48 45 52 45 20 74 72 61 63   NULL WHERE trac
29f0: 6b 69 64 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c  kid = 1;.    DEL
2a00: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
2a10: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
2a20: 20 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d   5;.  }.} {}..#-
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
2a80: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  that the followi
2a90: 6e 67 20 69 73 20 74 72 75 65 20 66 6f 20 61 6c  ng is true fo al
2aa0: 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72  l rows in the tr
2ab0: 61 63 6b 20 74 61 62 6c 65 3a 0a 23 0a 23 20 20  ack table:.#.#  
2ac0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 53 20   trackartist IS 
2ad0: 4e 55 4c 4c 20 4f 52 20 0a 23 20 20 20 45 58 49  NULL OR .#   EXI
2ae0: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f  STS(SELECT 1 FRO
2af0: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
2b00: 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61 72 74  rtistid=trackart
2b10: 69 73 74 29 0a 23 0a 23 20 45 56 49 44 45 4e 43  ist).#.# EVIDENC
2b20: 45 2d 4f 46 3a 20 52 2d 35 32 34 38 36 2d 32 31  E-OF: R-52486-21
2b30: 33 35 32 20 45 78 70 72 65 73 73 65 64 20 69 6e  352 Expressed in
2b40: 20 53 51 4c 2c 20 74 68 69 73 20 6d 65 61 6e 73   SQL, this means
2b50: 20 74 68 61 74 20 66 6f 72 20 65 76 65 72 79 0a   that for every.
2b60: 23 20 72 6f 77 20 69 6e 20 74 68 65 20 74 72 61  # row in the tra
2b70: 63 6b 20 74 61 62 6c 65 2c 20 74 68 65 20 66 6f  ck table, the fo
2b80: 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
2b90: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
2ba0: 74 72 75 65 3a 0a 23 20 74 72 61 63 6b 61 72 74  true:.# trackart
2bb0: 69 73 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 45  ist IS NULL OR E
2bc0: 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46  XISTS(SELECT 1 F
2bd0: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
2be0: 0a 23 20 61 72 74 69 73 74 69 64 3d 74 72 61 63  .# artistid=trac
2bf0: 6b 61 72 74 69 73 74 29 0a 0a 23 20 54 68 69 73  kartist)..# This
2c00: 20 70 72 6f 63 65 64 75 72 65 20 65 78 65 63 75   procedure execu
2c10: 74 65 73 20 61 20 74 65 73 74 20 63 61 73 65 20  tes a test case 
2c20: 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 73 74  to check that st
2c30: 61 74 65 6d 65 6e 74 20 0a 23 20 52 2d 35 32 34  atement .# R-524
2c40: 38 36 2d 32 31 33 35 32 20 69 73 20 74 72 75 65  86-21352 is true
2c50: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
2c60: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2c70: 6e 74 20 70 61 73 73 65 64 2e 0a 23 20 61 73 20  nt passed..# as 
2c80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2c90: 65 6e 74 2e 0a 70 72 6f 63 20 74 65 73 74 5f 72  ent..proc test_r
2ca0: 35 32 34 38 36 5f 32 31 33 35 32 20 7b 74 6e 20  52486_21352 {tn 
2cb0: 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20 72 65 73  sql} {.  set res
2cc0: 20 5b 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d   [catchsql $sql]
2cd0: 0a 20 20 73 65 74 20 72 65 73 75 6c 74 73 20 7b  .  set results {
2ce0: 0a 20 20 20 20 7b 30 20 7b 7d 7d 20 0a 20 20 20  .    {0 {}} .   
2cf0: 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73   {1 {UNIQUE cons
2d00: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 61  traint failed: a
2d10: 72 74 69 73 74 2e 61 72 74 69 73 74 69 64 7d 7d  rtist.artistid}}
2d20: 20 0a 20 20 20 20 7b 31 20 7b 46 4f 52 45 49 47   .    {1 {FOREIG
2d30: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
2d40: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20   failed}}.  }.  
2d50: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 24 72 65  if {[lsearch $re
2d60: 73 75 6c 74 73 20 24 72 65 73 5d 3c 30 7d 20 7b  sults $res]<0} {
2d70: 0a 20 20 20 20 65 72 72 6f 72 20 24 72 65 73 0a  .    error $res.
2d80: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65    }..  do_test e
2d90: 5f 66 6b 65 79 2d 31 31 2e 24 74 6e 20 7b 0a 20  _fkey-11.$tn {. 
2da0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2db0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2dc0: 2a 29 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48  *) FROM track WH
2dd0: 45 52 45 20 4e 4f 54 20 28 0a 20 20 20 20 20 20  ERE NOT (.      
2de0: 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 53    trackartist IS
2df0: 20 4e 55 4c 4c 20 4f 52 20 0a 20 20 20 20 20 20   NULL OR .      
2e00: 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20    EXISTS(SELECT 
2e10: 31 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  1 FROM artist WH
2e20: 45 52 45 20 61 72 74 69 73 74 69 64 3d 74 72 61  ERE artistid=tra
2e30: 63 6b 61 72 74 69 73 74 29 0a 20 20 20 20 20 20  ckartist).      
2e40: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a  ).    }.  } {0}.
2e50: 7d 0a 0a 23 20 45 78 65 63 75 74 65 20 61 20 73  }..# Execute a s
2e60: 65 72 69 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  eries of random 
2e70: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 61  INSERT, UPDATE a
2e80: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
2e90: 69 6f 6e 73 0a 23 20 28 73 6f 6d 65 20 6f 66 20  ions.# (some of 
2ea0: 77 68 69 63 68 20 6d 61 79 20 66 61 69 6c 20 64  which may fail d
2eb0: 75 65 20 74 6f 20 46 4b 20 6f 72 20 50 4b 20 63  ue to FK or PK c
2ec0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
2ed0: 69 6f 6e 73 29 20 6f 6e 20 0a 23 20 74 68 65 20  ions) on .# the 
2ee0: 74 77 6f 20 74 61 62 6c 65 73 20 69 6e 20 74 68  two tables in th
2ef0: 65 20 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61  e example schema
2f00: 2e 20 54 65 73 74 20 74 68 61 74 20 52 2d 35 32  . Test that R-52
2f10: 34 38 36 2d 32 31 33 35 32 0a 23 20 69 73 20 74  486-21352.# is t
2f20: 72 75 65 20 61 66 74 65 72 20 65 78 65 63 75 74  rue after execut
2f30: 69 6e 67 20 65 61 63 68 20 6f 70 65 72 61 74 69  ing each operati
2f40: 6f 6e 2e 0a 23 0a 73 65 74 20 54 65 6d 70 6c 61  on..#.set Templa
2f50: 74 65 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 49  te {.  {INSERT I
2f60: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
2f70: 28 24 74 2c 20 27 74 72 61 63 6b 20 24 74 27 2c  ($t, 'track $t',
2f80: 20 24 61 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20   $a)}.  {DELETE 
2f90: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
2fa0: 20 74 72 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20   trackid = $t}. 
2fb0: 20 7b 55 50 44 41 54 45 20 74 72 61 63 6b 20 53   {UPDATE track S
2fc0: 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d  ET trackartist =
2fd0: 20 24 61 20 57 48 45 52 45 20 74 72 61 63 6b 69   $a WHERE tracki
2fe0: 64 20 3d 20 24 74 7d 0a 20 20 7b 49 4e 53 45 52  d = $t}.  {INSER
2ff0: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
3000: 4c 55 45 53 28 24 61 2c 20 27 61 72 74 69 73 74  LUES($a, 'artist
3010: 20 24 61 27 29 7d 0a 20 20 7b 44 45 4c 45 54 45   $a')}.  {DELETE
3020: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
3030: 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 24 61  RE artistid = $a
3040: 7d 0a 20 20 7b 55 50 44 41 54 45 20 61 72 74 69  }.  {UPDATE arti
3050: 73 74 20 53 45 54 20 61 72 74 69 73 74 69 64 20  st SET artistid 
3060: 3d 20 24 61 32 20 57 48 45 52 45 20 61 72 74 69  = $a2 WHERE arti
3070: 73 74 69 64 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72  stid = $a}.}.for
3080: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
3090: 20 35 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   500} {incr i} {
30a0: 0a 20 20 73 65 74 20 61 20 20 20 5b 65 78 70 72  .  set a   [expr
30b0: 20 69 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d   int(rand()*10)]
30c0: 0a 20 20 73 65 74 20 61 32 20 20 5b 65 78 70 72  .  set a2  [expr
30d0: 20 69 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d   int(rand()*10)]
30e0: 0a 20 20 73 65 74 20 74 20 20 20 5b 65 78 70 72  .  set t   [expr
30f0: 20 69 6e 74 28 72 61 6e 64 28 29 2a 35 30 29 5d   int(rand()*50)]
3100: 0a 20 20 73 65 74 20 73 71 6c 20 5b 73 75 62 73  .  set sql [subs
3110: 74 20 5b 6c 69 6e 64 65 78 20 24 54 65 6d 70 6c  t [lindex $Templ
3120: 61 74 65 20 5b 65 78 70 72 20 69 6e 74 28 72 61  ate [expr int(ra
3130: 6e 64 28 29 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65  nd()*6)]]]..  te
3140: 73 74 5f 72 35 32 34 38 36 5f 32 31 33 35 32 20  st_r52486_21352 
3150: 24 69 20 24 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d  $i $sql.}..#----
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68  -----.# Check th
31b0: 61 74 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  at a NOT NULL co
31c0: 6e 73 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20  nstraint can be 
31d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 78 61  added to the exa
31e0: 6d 70 6c 65 20 73 63 68 65 6d 61 0a 23 20 74 6f  mple schema.# to
31f0: 20 70 72 6f 68 69 62 69 74 20 4e 55 4c 4c 20 63   prohibit NULL c
3200: 68 69 6c 64 20 6b 65 79 73 20 66 72 6f 6d 20 62  hild keys from b
3210: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2e 0a 23  eing inserted..#
3220: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3230: 52 2d 34 32 34 31 32 2d 35 39 33 32 31 20 54 69  R-42412-59321 Ti
3240: 70 3a 20 49 66 20 74 68 65 20 61 70 70 6c 69 63  p: If the applic
3250: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ation requires a
3260: 20 73 74 72 69 63 74 65 72 0a 23 20 72 65 6c 61   stricter.# rela
3270: 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
3280: 20 61 72 74 69 73 74 20 61 6e 64 20 74 72 61 63   artist and trac
3290: 6b 2c 20 77 68 65 72 65 20 4e 55 4c 4c 20 76 61  k, where NULL va
32a0: 6c 75 65 73 20 61 72 65 20 6e 6f 74 0a 23 20 70  lues are not.# p
32b0: 65 72 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20  ermitted in the 
32c0: 74 72 61 63 6b 61 72 74 69 73 74 20 63 6f 6c 75  trackartist colu
32d0: 6d 6e 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74  mn, simply add t
32e0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 22  he appropriate "
32f0: 4e 4f 54 0a 23 20 4e 55 4c 4c 22 20 63 6f 6e 73  NOT.# NULL" cons
3300: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 73 63  traint to the sc
3310: 68 65 6d 61 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  hema..#.drop_all
3320: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
3330: 65 5f 66 6b 65 79 2d 31 32 2e 31 20 7b 0a 20 20  e_fkey-12.1 {.  
3340: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3350: 45 41 54 45 20 54 41 42 4c 45 20 61 72 74 69 73  EATE TABLE artis
3360: 74 28 0a 20 20 20 20 20 20 61 72 74 69 73 74 69  t(.      artisti
3370: 64 20 20 20 20 49 4e 54 45 47 45 52 20 50 52 49  d    INTEGER PRI
3380: 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20  MARY KEY, .     
3390: 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58   artistname  TEX
33a0: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  T.    );.    CRE
33b0: 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28  ATE TABLE track(
33c0: 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20  .      trackid  
33d0: 20 20 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20     INTEGER, .   
33e0: 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54     trackname   T
33f0: 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63  EXT, .      trac
3400: 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 20  kartist INTEGER 
3410: 4e 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  NOT NULL,.      
3420: 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63  FOREIGN KEY(trac
3430: 6b 61 72 74 69 73 74 29 20 52 45 46 45 52 45 4e  kartist) REFEREN
3440: 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69 73  CES artist(artis
3450: 74 69 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  tid).    );.  }.
3460: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
3470: 6b 65 79 2d 31 32 2e 32 20 7b 0a 20 20 63 61 74  key-12.2 {.  cat
3480: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
3490: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
34a0: 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67  (14, 'Mr. Bojang
34b0: 6c 65 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20  les', NULL) }.} 
34c0: 7b 31 20 7b 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  {1 {NOT NULL con
34d0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
34e0: 74 72 61 63 6b 2e 74 72 61 63 6b 61 72 74 69 73  track.trackartis
34f0: 74 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t}}..#----------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3540: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
3550: 2d 31 36 31 32 37 2d 33 35 34 34 32 0a 23 0a 23  -16127-35442.#.#
3560: 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65   Test an example
3570: 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b 65 79   from foreignkey
3580: 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f 61  s.html..#.drop_a
3590: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
35a0: 74 20 65 5f 66 6b 65 79 2d 31 33 2e 31 20 7b 0a  t e_fkey-13.1 {.
35b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
35c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
35d0: 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
35e0: 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
35f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
3600: 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
3610: 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
3620: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
3630: 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
3640: 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 0a 20       INTEGER, . 
3650: 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
3660: 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
3670: 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
3680: 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  R,.      FOREIGN
3690: 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74   KEY(trackartist
36a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  ) REFERENCES art
36b0: 69 73 74 28 61 72 74 69 73 74 69 64 29 0a 20 20  ist(artistid).  
36c0: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
36d0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
36e0: 45 53 28 31 2c 20 27 44 65 61 6e 20 4d 61 72 74  ES(1, 'Dean Mart
36f0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
3700: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
3710: 55 45 53 28 32 2c 20 27 46 72 61 6e 6b 20 53 69  UES(2, 'Frank Si
3720: 6e 61 74 72 61 27 29 3b 0a 20 20 20 20 49 4e 53  natra');.    INS
3730: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
3740: 41 4c 55 45 53 28 31 31 2c 20 27 54 68 61 74 27  ALUES(11, 'That'
3750: 27 73 20 41 6d 6f 72 65 27 2c 20 31 29 3b 0a 20  's Amore', 1);. 
3760: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3770: 72 61 63 6b 20 56 41 4c 55 45 53 28 31 32 2c 20  rack VALUES(12, 
3780: 27 43 68 72 69 73 74 6d 61 73 20 42 6c 75 65 73  'Christmas Blues
3790: 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 1);.    INSER
37a0: 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
37b0: 55 45 53 28 31 33 2c 20 27 4d 79 20 57 61 79 27  UES(13, 'My Way'
37c0: 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 2);.  }.} {}.d
37d0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33  o_test e_fkey-13
37e0: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
37f0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72  { INSERT INTO tr
3800: 61 63 6b 20 56 41 4c 55 45 53 28 31 34 2c 20 27  ack VALUES(14, '
3810: 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20  Mr. Bojangles', 
3820: 33 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  3) }.} {1 {FOREI
3830: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
3840: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
3850: 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 33 20 7b  st e_fkey-13.3 {
3860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
3870: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
3880: 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e 20 42  ALUES(14, 'Mr. B
3890: 6f 6a 61 6e 67 6c 65 73 27 2c 20 4e 55 4c 4c 29  ojangles', NULL)
38a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
38b0: 65 5f 66 6b 65 79 2d 31 33 2e 34 20 7b 0a 20 20  e_fkey-13.4 {.  
38c0: 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20 20 20  catchsql { .    
38d0: 55 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54  UPDATE track SET
38e0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 33   trackartist = 3
38f0: 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61 6d 65   WHERE trackname
3900: 20 3d 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65   = 'Mr. Bojangle
3910: 73 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f  s';.  }.} {1 {FO
3920: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
3930: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
3940: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e  _test e_fkey-13.
3950: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 33 2c  artist VALUES(3,
3980: 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72   'Sammy Davis Jr
3990: 2e 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  .');.    UPDATE 
39a0: 74 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61  track SET tracka
39b0: 72 74 69 73 74 20 3d 20 33 20 57 48 45 52 45 20  rtist = 3 WHERE 
39c0: 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d 72 2e  trackname = 'Mr.
39d0: 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a 20 20 20   Bojangles';.   
39e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
39f0: 63 6b 20 56 41 4c 55 45 53 28 31 35 2c 20 27 42  ck VALUES(15, 'B
3a00: 6f 6f 67 69 65 20 57 6f 6f 67 69 65 27 2c 20 33  oogie Woogie', 3
3a10: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d  );.  }.} {}..#--
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
3a70: 43 45 2d 4f 46 3a 20 52 2d 31 35 39 35 38 2d 35  CE-OF: R-15958-5
3a80: 30 32 33 33 0a 23 0a 23 20 54 65 73 74 20 74 68  0233.#.# Test th
3a90: 65 20 73 65 63 6f 6e 64 20 65 78 61 6d 70 6c 65  e second example
3aa0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
3ab0: 73 65 63 74 69 6f 6e 20 6f 66 20 66 6f 72 65 69  section of forei
3ac0: 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64  gnkeys.html..#.d
3ad0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 34  o_test e_fkey-14
3ae0: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
3af0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
3b00: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
3b10: 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 46 72 61  rtistname = 'Fra
3b20: 6e 6b 20 53 69 6e 61 74 72 61 27 3b 0a 20 20 7d  nk Sinatra';.  }
3b30: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
3b40: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
3b50: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
3b60: 5f 66 6b 65 79 2d 31 34 2e 32 20 7b 0a 20 20 65  _fkey-14.2 {.  e
3b70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
3b80: 45 54 45 20 46 52 4f 4d 20 74 72 61 63 6b 20 57  ETE FROM track W
3b90: 48 45 52 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d  HERE trackname =
3ba0: 20 27 4d 79 20 57 61 79 27 3b 0a 20 20 20 20 44   'My Way';.    D
3bb0: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
3bc0: 74 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61  t WHERE artistna
3bd0: 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53 69 6e 61  me = 'Frank Sina
3be0: 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  tra';.  }.} {}.d
3bf0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 34  o_test e_fkey-14
3c00: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
3c10: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61 72 74  {.    UPDATE art
3c20: 69 73 74 20 53 45 54 20 61 72 74 69 73 74 69 64  ist SET artistid
3c30: 3d 34 20 57 48 45 52 45 20 61 72 74 69 73 74 6e  =4 WHERE artistn
3c40: 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74  ame = 'Dean Mart
3c50: 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46  in';.  }.} {1 {F
3c60: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
3c70: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
3c80: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 34  o_test e_fkey-14
3c90: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
3ca0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
3cb0: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
3cc0: 63 6b 6e 61 6d 65 20 49 4e 28 27 54 68 61 74 27  ckname IN('That'
3cd0: 27 73 20 41 6d 6f 72 65 27 2c 20 27 43 68 72 69  's Amore', 'Chri
3ce0: 73 74 6d 61 73 20 42 6c 75 65 73 27 29 3b 0a 20  stmas Blues');. 
3cf0: 20 20 20 55 50 44 41 54 45 20 61 72 74 69 73 74     UPDATE artist
3d00: 20 53 45 54 20 61 72 74 69 73 74 69 64 3d 34 20   SET artistid=4 
3d10: 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65  WHERE artistname
3d20: 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27   = 'Dean Martin'
3d30: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d  ;.  }.} {}...#--
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d80: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
3d90: 43 45 2d 4f 46 3a 20 52 2d 35 36 30 33 32 2d 32  CE-OF: R-56032-2
3da0: 34 39 32 33 20 54 68 65 20 66 6f 72 65 69 67 6e  4923 The foreign
3db0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
3dc0: 69 73 20 73 61 74 69 73 66 69 65 64 20 69 66 0a  is satisfied if.
3dd0: 23 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  # for each row i
3de0: 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  n the child tabl
3df0: 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20  e either one or 
3e00: 6d 6f 72 65 20 6f 66 20 74 68 65 20 63 68 69 6c  more of the chil
3e10: 64 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 20  d key.# columns 
3e20: 61 72 65 20 4e 55 4c 4c 2c 20 6f 72 20 74 68 65  are NULL, or the
3e30: 72 65 20 65 78 69 73 74 73 20 61 20 72 6f 77 20  re exists a row 
3e40: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
3e50: 62 6c 65 20 66 6f 72 20 77 68 69 63 68 0a 23 20  ble for which.# 
3e60: 65 61 63 68 20 70 61 72 65 6e 74 20 6b 65 79 20  each parent key 
3e70: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
3e80: 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f  a value equal to
3e90: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 74   the value in it
3ea0: 73 0a 23 20 61 73 73 6f 63 69 61 74 65 64 20 63  s.# associated c
3eb0: 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e  hild key column.
3ec0: 0a 23 0a 23 20 54 65 73 74 20 61 6c 73 6f 20 74  .#.# Test also t
3ed0: 68 61 74 20 74 68 65 20 75 73 75 61 6c 20 63 6f  hat the usual co
3ee0: 6d 70 61 72 69 73 6f 6e 20 72 75 6c 65 73 20 61  mparison rules a
3ef0: 72 65 20 75 73 65 64 20 77 68 65 6e 20 74 65 73  re used when tes
3f00: 74 69 6e 67 20 69 66 20 74 68 65 72 65 20 0a 23  ting if there .#
3f10: 20 69 73 20 61 20 6d 61 74 63 68 69 6e 67 20 72   is a matching r
3f20: 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ow in the parent
3f30: 20 74 61 62 6c 65 20 6f 66 20 61 20 66 6f 72 65   table of a fore
3f40: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
3f50: 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  nt..#.# EVIDENCE
3f60: 2d 4f 46 3a 20 52 2d 35 37 37 36 35 2d 31 32 33  -OF: R-57765-123
3f70: 38 30 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20  80 In the above 
3f80: 70 61 72 61 67 72 61 70 68 2c 20 74 68 65 20 74  paragraph, the t
3f90: 65 72 6d 20 22 65 71 75 61 6c 22 0a 23 20 6d 65  erm "equal".# me
3fa0: 61 6e 73 20 65 71 75 61 6c 20 77 68 65 6e 20 76  ans equal when v
3fb0: 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72  alues are compar
3fc0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 72 75 6c  ed using the rul
3fd0: 65 73 20 73 70 65 63 69 66 69 65 64 20 68 65 72  es specified her
3fe0: 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  e..#.drop_all_ta
3ff0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
4000: 6b 65 79 2d 31 35 2e 31 20 7b 0a 20 20 65 78 65  key-15.1 {.  exe
4010: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4020: 45 20 54 41 42 4c 45 20 70 61 72 28 70 20 50 52  E TABLE par(p PR
4030: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
4040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
4050: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
4060: 72 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  r);..    INSERT 
4070: 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45 53 28  INTO par VALUES(
4080: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
4090: 4e 54 4f 20 70 61 72 20 56 41 4c 55 45 53 28 27  NTO par VALUES('
40a0: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
40b0: 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45 53 28  INTO par VALUES(
40c0: 58 27 33 31 27 29 3b 0a 20 20 20 20 53 45 4c 45  X'31');.    SELE
40d0: 43 54 20 74 79 70 65 6f 66 28 70 29 20 46 52 4f  CT typeof(p) FRO
40e0: 4d 20 70 61 72 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  M par;.  }.} {in
40f0: 74 65 67 65 72 20 74 65 78 74 20 62 6c 6f 62 7d  teger text blob}
4100: 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65  ..proc test_efke
4110: 79 5f 34 35 20 7b 74 6e 20 69 73 45 72 72 6f 72  y_45 {tn isError
4120: 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   sql} {.  do_tes
4130: 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24 74 6e 2e  t e_fkey-15.$tn.
4140: 31 20 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c  1 ".    catchsql
4150: 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e   {$sql}.  " [lin
4160: 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b  dex {{0 {}} {1 {
4170: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
4180: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d  traint failed}}}
4190: 20 24 69 73 45 72 72 6f 72 5d 0a 0a 20 20 64 6f   $isError]..  do
41a0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 35 2e  _test e_fkey-15.
41b0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
41c0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
41d0: 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 20 57 48  CT * FROM chi WH
41e0: 45 52 45 20 63 20 49 53 20 4e 4f 54 20 4e 55 4c  ERE c IS NOT NUL
41f0: 4c 20 41 4e 44 20 63 20 4e 4f 54 20 49 4e 20 28  L AND c NOT IN (
4200: 53 45 4c 45 43 54 20 70 20 46 52 4f 4d 20 70 61  SELECT p FROM pa
4210: 72 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  r).    }.  } {}.
4220: 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  }..test_efkey_45
4230: 20 31 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54   1 0 "INSERT INT
4240: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 31 29 22  O chi VALUES(1)"
4250: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 32  .test_efkey_45 2
4260: 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   1 "INSERT INTO 
4270: 63 68 69 20 56 41 4c 55 45 53 28 27 31 2e 30 27  chi VALUES('1.0'
4280: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  )".test_efkey_45
4290: 20 33 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54   3 0 "INSERT INT
42a0: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27 31 27  O chi VALUES('1'
42b0: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  )".test_efkey_45
42c0: 20 34 20 31 20 22 44 45 4c 45 54 45 20 46 52 4f   4 1 "DELETE FRO
42d0: 4d 20 70 61 72 20 57 48 45 52 45 20 70 20 3d 20  M par WHERE p = 
42e0: 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '1'".test_efkey_
42f0: 34 35 20 35 20 30 20 22 44 45 4c 45 54 45 20 46  45 5 0 "DELETE F
4300: 52 4f 4d 20 63 68 69 20 57 48 45 52 45 20 63 20  ROM chi WHERE c 
4310: 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65  = '1'".test_efke
4320: 79 5f 34 35 20 36 20 30 20 22 44 45 4c 45 54 45  y_45 6 0 "DELETE
4330: 20 46 52 4f 4d 20 70 61 72 20 57 48 45 52 45 20   FROM par WHERE 
4340: 70 20 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66  p = '1'".test_ef
4350: 6b 65 79 5f 34 35 20 37 20 31 20 22 49 4e 53 45  key_45 7 1 "INSE
4360: 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41 4c 55  RT INTO chi VALU
4370: 45 53 28 27 31 27 29 22 0a 74 65 73 74 5f 65 66  ES('1')".test_ef
4380: 6b 65 79 5f 34 35 20 38 20 30 20 22 49 4e 53 45  key_45 8 0 "INSE
4390: 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41 4c 55  RT INTO chi VALU
43a0: 45 53 28 58 27 33 31 27 29 22 0a 74 65 73 74 5f  ES(X'31')".test_
43b0: 65 66 6b 65 79 5f 34 35 20 39 20 31 20 22 49 4e  efkey_45 9 1 "IN
43c0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
43d0: 4c 55 45 53 28 58 27 33 32 27 29 22 0a 0a 23 2d  LUES(X'32')"..#-
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65 63 69  --------.# Speci
4430: 66 69 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68  fically, test th
4440: 61 74 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e  at when comparin
4450: 67 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65  g child and pare
4460: 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 74 68  nt key values th
4470: 65 0a 23 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  e.# default coll
4480: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
4490: 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  f the parent key
44a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 2e   column is used.
44b0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
44c0: 3a 20 52 2d 31 35 37 39 36 2d 34 37 35 31 33 20  : R-15796-47513 
44d0: 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 74  When comparing t
44e0: 65 78 74 20 76 61 6c 75 65 73 2c 20 74 68 65 20  ext values, the 
44f0: 63 6f 6c 6c 61 74 69 6e 67 0a 23 20 73 65 71 75  collating.# sequ
4500: 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ence associated 
4510: 77 69 74 68 20 74 68 65 20 70 61 72 65 6e 74 20  with the parent 
4520: 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c  key column is al
4530: 77 61 79 73 20 75 73 65 64 2e 0a 23 0a 64 72 6f  ways used..#.dro
4540: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
4550: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 31  test e_fkey-16.1
4560: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4570: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4580: 74 31 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  t1(a COLLATE noc
4590: 61 73 65 20 50 52 49 4d 41 52 59 20 4b 45 59 29  ase PRIMARY KEY)
45a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
45b0: 4c 45 20 74 32 28 62 20 52 45 46 45 52 45 4e 43  LE t2(b REFERENC
45c0: 45 53 20 74 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  ES t1);.  }.} {}
45d0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
45e0: 31 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  16.2 {.  execsql
45f0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
4600: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6f 4e  TO t1 VALUES('oN
4610: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
4620: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
4630: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
4640: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
4650: 28 27 4f 4e 45 27 29 3b 0a 20 20 20 20 55 50 44  ('ONE');.    UPD
4660: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
4670: 4f 6e 45 27 3b 0a 20 20 20 20 55 50 44 41 54 45  OnE';.    UPDATE
4680: 20 74 31 20 53 45 54 20 61 20 3d 20 27 4f 4e 45   t1 SET a = 'ONE
4690: 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ';.  }.} {}.do_t
46a0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 33 20  est e_fkey-16.3 
46b0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  {.  catchsql { U
46c0: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
46d0: 20 27 74 77 6f 27 20 57 48 45 52 45 20 72 6f 77   'two' WHERE row
46e0: 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31 20 7b 46  id = 1 }.} {1 {F
46f0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
4700: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
4710: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36  o_test e_fkey-16
4720: 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .4 {.  catchsql 
4730: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  { DELETE FROM t1
4740: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
4750: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
4760: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
4770: 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  failed}}..#-----
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66 69 63 61  ----.# Specifica
47d0: 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74 20 77  lly, test that w
47e0: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 63 68  hen comparing ch
47f0: 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20 6b  ild and parent k
4800: 65 79 20 76 61 6c 75 65 73 20 74 68 65 0a 23 20  ey values the.# 
4810: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
4820: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
4830: 6e 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20  n is applied to 
4840: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61  the child key va
4850: 6c 75 65 0a 23 20 62 65 66 6f 72 65 20 74 68 65  lue.# before the
4860: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61 6b 65   comparison take
4870: 73 20 70 6c 61 63 65 2e 0a 23 0a 23 20 45 56 49  s place..#.# EVI
4880: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 34  DENCE-OF: R-0424
4890: 30 2d 31 33 38 36 30 20 57 68 65 6e 20 63 6f 6d  0-13860 When com
48a0: 70 61 72 69 6e 67 20 76 61 6c 75 65 73 2c 20 69  paring values, i
48b0: 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  f the parent key
48c0: 0a 23 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e  .# column has an
48d0: 20 61 66 66 69 6e 69 74 79 2c 20 74 68 65 6e 20   affinity, then 
48e0: 74 68 61 74 20 61 66 66 69 6e 69 74 79 20 69 73  that affinity is
48f0: 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
4900: 63 68 69 6c 64 20 6b 65 79 0a 23 20 76 61 6c 75  child key.# valu
4910: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d  e before the com
4920: 70 61 72 69 73 6f 6e 20 69 73 20 70 65 72 66 6f  parison is perfo
4930: 72 6d 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  rmed..#.drop_all
4940: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
4950: 65 5f 66 6b 65 79 2d 31 37 2e 31 20 7b 0a 20 20  e_fkey-17.1 {.  
4960: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4970: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
4980: 4e 55 4d 45 52 49 43 20 50 52 49 4d 41 52 59 20  NUMERIC PRIMARY 
4990: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
49a0: 20 54 41 42 4c 45 20 74 32 28 62 20 54 45 58 54   TABLE t2(b TEXT
49b0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b   REFERENCES t1);
49c0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
49d0: 74 20 65 5f 66 6b 65 79 2d 31 37 2e 32 20 7b 0a  t e_fkey-17.2 {.
49e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
49f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4a00: 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e  ALUES(1);.    IN
4a10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4a20: 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45  UES(2);.    INSE
4a30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4a40: 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  S('three');.    
4a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
4a60: 41 4c 55 45 53 28 27 32 2e 30 27 29 3b 0a 20 20  ALUES('2.0');.  
4a70: 20 20 53 45 4c 45 43 54 20 62 2c 20 74 79 70 65    SELECT b, type
4a80: 6f 66 28 62 29 20 46 52 4f 4d 20 74 32 3b 0a 20  of(b) FROM t2;. 
4a90: 20 7d 0a 7d 20 7b 32 2e 30 20 74 65 78 74 7d 0a   }.} {2.0 text}.
4aa0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
4ab0: 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.3 {.  execsql 
4ac0: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
4ad0: 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b  a) FROM t1 }.} {
4ae0: 69 6e 74 65 67 65 72 20 69 6e 74 65 67 65 72 20  integer integer 
4af0: 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  text}.do_test e_
4b00: 66 6b 65 79 2d 31 37 2e 34 20 7b 0a 20 20 63 61  fkey-17.4 {.  ca
4b10: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
4b20: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
4b30: 77 69 64 20 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b  wid = 2 }.} {1 {
4b40: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
4b50: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
4b60: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
4b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ba0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23  ############.###
4bb0: 20 53 45 43 54 49 4f 4e 20 33 3a 20 52 65 71 75   SECTION 3: Requ
4bc0: 69 72 65 64 20 61 6e 64 20 53 75 67 67 65 73 74  ired and Suggest
4bd0: 65 64 20 44 61 74 61 62 61 73 65 20 49 6e 64 65  ed Database Inde
4be0: 78 65 73 0a 23 23 23 23 23 23 23 23 23 23 23 23  xes.############
4bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4c20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
4c30: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 20  -----------.# A 
4c80: 70 61 72 65 6e 74 20 6b 65 79 20 6d 75 73 74 20  parent key must 
4c90: 62 65 20 65 69 74 68 65 72 20 61 20 50 52 49 4d  be either a PRIM
4ca0: 41 52 59 20 4b 45 59 2c 20 73 75 62 6a 65 63 74  ARY KEY, subject
4cb0: 20 74 6f 20 61 20 55 4e 49 51 55 45 20 0a 23 20   to a UNIQUE .# 
4cc0: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 68  constraint, or h
4cd0: 61 76 65 20 61 20 55 4e 49 51 55 45 20 69 6e 64  ave a UNIQUE ind
4ce0: 65 78 20 63 72 65 61 74 65 64 20 6f 6e 20 69 74  ex created on it
4cf0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
4d00: 46 3a 20 52 2d 31 33 34 33 35 2d 32 36 33 31 31  F: R-13435-26311
4d10: 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 61   Usually, the pa
4d20: 72 65 6e 74 20 6b 65 79 20 6f 66 20 61 20 66 6f  rent key of a fo
4d30: 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73  reign key.# cons
4d40: 74 72 61 69 6e 74 20 69 73 20 74 68 65 20 70 72  traint is the pr
4d50: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65  imary key of the
4d60: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 49   parent table. I
4d70: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 74  f they are not t
4d80: 68 65 0a 23 20 70 72 69 6d 61 72 79 20 6b 65 79  he.# primary key
4d90: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 65 6e  , then the paren
4da0: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6d 75  t key columns mu
4db0: 73 74 20 62 65 20 63 6f 6c 6c 65 63 74 69 76 65  st be collective
4dc0: 6c 79 20 73 75 62 6a 65 63 74 0a 23 20 74 6f 20  ly subject.# to 
4dd0: 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
4de0: 69 6e 74 20 6f 72 20 68 61 76 65 20 61 20 55 4e  int or have a UN
4df0: 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 20 0a 23  IQUE index..# .#
4e00: 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20   Also test that 
4e10: 69 66 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20  if a parent key 
4e20: 69 73 20 6e 6f 74 20 73 75 62 6a 65 63 74 20 74  is not subject t
4e30: 6f 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  o a PRIMARY KEY 
4e40: 6f 72 20 55 4e 49 51 55 45 0a 23 20 63 6f 6e 73  or UNIQUE.# cons
4e50: 74 72 61 69 6e 74 2c 20 62 75 74 20 64 6f 65 73  traint, but does
4e60: 20 68 61 76 65 20 61 20 55 4e 49 51 55 45 20 69   have a UNIQUE i
4e70: 6e 64 65 78 20 63 72 65 61 74 65 64 20 6f 6e 20  ndex created on 
4e80: 69 74 2c 20 74 68 65 6e 20 74 68 65 20 55 4e 49  it, then the UNI
4e90: 51 55 45 20 69 6e 64 65 78 0a 23 20 6d 75 73 74  QUE index.# must
4ea0: 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   use the default
4eb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
4ec0: 6e 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  nces associated 
4ed0: 77 69 74 68 20 74 68 65 20 70 61 72 65 6e 74 20  with the parent 
4ee0: 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 2e 0a 23  key.# columns..#
4ef0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4f00: 52 2d 30 30 33 37 36 2d 33 39 32 31 32 20 49 66  R-00376-39212 If
4f10: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
4f20: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 61 20 55  columns have a U
4f30: 4e 49 51 55 45 0a 23 20 69 6e 64 65 78 2c 20 74  NIQUE.# index, t
4f40: 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 6d  hen that index m
4f50: 75 73 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ust use the coll
4f60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
4f70: 74 68 61 74 20 61 72 65 0a 23 20 73 70 65 63 69  that are.# speci
4f80: 66 69 65 64 20 69 6e 20 74 68 65 20 43 52 45 41  fied in the CREA
4f90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4fa0: 6e 74 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e  nt for the paren
4fb0: 74 20 74 61 62 6c 65 2e 0a 23 0a 64 72 6f 70 5f  t table..#.drop_
4fc0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
4fd0: 73 74 20 65 5f 66 6b 65 79 2d 31 38 2e 31 20 7b  st e_fkey-18.1 {
4fe0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4ff0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
5000: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  (a REFERENCES t1
5010: 28 78 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70  (x));.  }.} {}.p
5020: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 35  roc test_efkey_5
5030: 37 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  7 {tn isError sq
5040: 6c 7d 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  l} {.  catchsql 
5050: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
5060: 7d 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c  }.  execsql $sql
5070: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
5080: 79 2d 31 38 2e 24 74 6e 20 7b 0a 20 20 20 20 63  y-18.$tn {.    c
5090: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
50a0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
50b0: 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 5b 6c 69 6e  NULL) }.  } [lin
50c0: 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 2f 31 20  dex {{0 {}} {/1 
50d0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
50e0: 6d 61 74 63 68 20 2d 20 22 2e 2a 22 20 72 65 66  match - ".*" ref
50f0: 65 72 65 6e 63 69 6e 67 20 22 2e 2a 22 7d 2f 7d  erencing ".*"}/}
5100: 7d 20 5c 0a 20 20 20 20 20 24 69 73 45 72 72 6f  } \.     $isErro
5110: 72 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f  r].}.test_efkey_
5120: 35 37 20 32 20 30 20 7b 20 43 52 45 41 54 45 20  57 2 0 { CREATE 
5130: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
5140: 52 59 20 4b 45 59 29 20 7d 0a 74 65 73 74 5f 65  RY KEY) }.test_e
5150: 66 6b 65 79 5f 35 37 20 33 20 30 20 7b 20 43 52  fkey_57 3 0 { CR
5160: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
5170: 55 4e 49 51 55 45 29 20 7d 0a 74 65 73 74 5f 65  UNIQUE) }.test_e
5180: 66 6b 65 79 5f 35 37 20 34 20 30 20 7b 20 43 52  fkey_57 4 0 { CR
5190: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
51a0: 3b 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20  ; CREATE UNIQUE 
51b0: 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31 28  INDEX t1i ON t1(
51c0: 78 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f  x) }.test_efkey_
51d0: 35 37 20 35 20 31 20 7b 20 0a 20 20 43 52 45 41  57 5 1 { .  CREA
51e0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20  TE TABLE t1(x); 
51f0: 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45  .  CREATE UNIQUE
5200: 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31   INDEX t1i ON t1
5210: 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (x COLLATE nocas
5220: 65 29 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79  e);.}.test_efkey
5230: 5f 35 37 20 36 20 31 20 7b 20 43 52 45 41 54 45  _57 6 1 { CREATE
5240: 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d 0a 74   TABLE t1(x) }.t
5250: 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 37 20 31  est_efkey_57 7 1
5260: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
5270: 74 31 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59  t1(x, y, PRIMARY
5280: 20 4b 45 59 28 78 2c 20 79 29 29 20 7d 0a 74 65   KEY(x, y)) }.te
5290: 73 74 5f 65 66 6b 65 79 5f 35 37 20 38 20 31 20  st_efkey_57 8 1 
52a0: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
52b0: 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  1(x, y, UNIQUE(x
52c0: 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f 65 66 6b  , y)) }.test_efk
52d0: 65 79 5f 35 37 20 39 20 31 20 7b 20 0a 20 20 43  ey_57 9 1 { .  C
52e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
52f0: 2c 20 79 29 3b 20 0a 20 20 43 52 45 41 54 45 20  , y); .  CREATE 
5300: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 31 69  UNIQUE INDEX t1i
5310: 20 4f 4e 20 74 31 28 78 2c 20 79 29 3b 0a 7d 0a   ON t1(x, y);.}.
5320: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5370: 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
5380: 61 6e 20 65 78 61 6d 70 6c 65 20 69 6e 20 66 6f  an example in fo
5390: 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20  reignkeys.html. 
53a0: 53 65 76 65 72 61 6c 20 74 65 73 74 61 62 6c 65  Several testable
53b0: 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  .# statements re
53c0: 66 65 72 20 74 6f 20 74 68 69 73 20 65 78 61 6d  fer to this exam
53d0: 70 6c 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 0a  ple, as follows.
53e0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
53f0: 20 52 2d 32 37 34 38 34 2d 30 31 34 36 37 0a 23   R-27484-01467.#
5400: 0a 23 20 46 4b 20 43 6f 6e 73 74 72 61 69 6e 74  .# FK Constraint
5410: 73 20 6f 6e 20 63 68 69 6c 64 31 2c 20 63 68 69  s on child1, chi
5420: 6c 64 32 20 61 6e 64 20 63 68 69 6c 64 33 20 61  ld2 and child3 a
5430: 72 65 20 4f 6b 2e 0a 23 0a 23 20 50 72 6f 62 6c  re Ok..#.# Probl
5440: 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68  em with FK on ch
5450: 69 6c 64 34 3a 0a 23 0a 23 20 45 56 49 44 45 4e  ild4:.#.# EVIDEN
5460: 43 45 2d 4f 46 3a 20 52 2d 35 31 30 33 39 2d 34  CE-OF: R-51039-4
5470: 34 38 34 30 20 54 68 65 20 66 6f 72 65 69 67 6e  4840 The foreign
5480: 20 6b 65 79 20 64 65 63 6c 61 72 65 64 20 61 73   key declared as
5490: 20 70 61 72 74 20 6f 66 20 74 61 62 6c 65 0a 23   part of table.#
54a0: 20 63 68 69 6c 64 34 20 69 73 20 61 6e 20 65 72   child4 is an er
54b0: 72 6f 72 20 62 65 63 61 75 73 65 20 65 76 65 6e  ror because even
54c0: 20 74 68 6f 75 67 68 20 74 68 65 20 70 61 72 65   though the pare
54d0: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  nt key column is
54e0: 0a 23 20 69 6e 64 65 78 65 64 2c 20 74 68 65 20  .# indexed, the 
54f0: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 55 4e 49  index is not UNI
5500: 51 55 45 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d  QUE..#.# Problem
5510: 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c   with FK on chil
5520: 64 35 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  d5:.#.# EVIDENCE
5530: 2d 4f 46 3a 20 52 2d 30 31 30 36 30 2d 34 38 37  -OF: R-01060-487
5540: 38 38 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  88 The foreign k
5550: 65 79 20 66 6f 72 20 74 61 62 6c 65 20 63 68 69  ey for table chi
5560: 6c 64 35 20 69 73 20 61 6e 0a 23 20 65 72 72 6f  ld5 is an.# erro
5570: 72 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74  r because even t
5580: 68 6f 75 67 68 20 74 68 65 20 70 61 72 65 6e 74  hough the parent
5590: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 68 61 73 20   key column has 
55a0: 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2c 0a  a unique index,.
55b0: 23 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 73  # the index uses
55c0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c   a different col
55d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
55e0: 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69 74  .#.# Problem wit
55f0: 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 36 20 61  h FK on child6 a
5600: 6e 64 20 63 68 69 6c 64 37 3a 0a 23 0a 23 20 45  nd child7:.#.# E
5610: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
5620: 30 38 38 2d 33 37 34 36 39 20 54 61 62 6c 65 73  088-37469 Tables
5630: 20 63 68 69 6c 64 36 20 61 6e 64 20 63 68 69 6c   child6 and chil
5640: 64 37 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  d7 are incorrect
5650: 0a 23 20 62 65 63 61 75 73 65 20 77 68 69 6c 65  .# because while
5660: 20 62 6f 74 68 20 68 61 76 65 20 55 4e 49 51 55   both have UNIQU
5670: 45 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  E indices on the
5680: 69 72 20 70 61 72 65 6e 74 20 6b 65 79 73 2c 20  ir parent keys, 
5690: 74 68 65 20 6b 65 79 73 0a 23 20 61 72 65 20 6e  the keys.# are n
56a0: 6f 74 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  ot an exact matc
56b0: 68 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 73  h to the columns
56c0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 4e 49   of a single UNI
56d0: 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f  QUE index..#.dro
56e0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
56f0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 31  test e_fkey-19.1
5700: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5710: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5720: 70 61 72 65 6e 74 28 61 20 50 52 49 4d 41 52 59  parent(a PRIMARY
5730: 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 2c 20   KEY, b UNIQUE, 
5740: 63 2c 20 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  c, d, e, f);.   
5750: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
5760: 4e 44 45 58 20 69 31 20 4f 4e 20 70 61 72 65 6e  NDEX i1 ON paren
5770: 74 28 63 2c 20 64 29 3b 0a 20 20 20 20 43 52 45  t(c, d);.    CRE
5780: 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
5790: 70 61 72 65 6e 74 28 65 29 3b 0a 20 20 20 20 43  parent(e);.    C
57a0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
57b0: 45 58 20 69 33 20 4f 4e 20 70 61 72 65 6e 74 28  EX i3 ON parent(
57c0: 66 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  f COLLATE nocase
57d0: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
57e0: 41 42 4c 45 20 63 68 69 6c 64 31 28 66 2c 20 67  ABLE child1(f, g
57f0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
5800: 6e 74 28 61 29 29 3b 20 20 20 20 20 20 20 20 20  nt(a));         
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
5820: 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54   Ok.    CREATE T
5830: 41 42 4c 45 20 63 68 69 6c 64 32 28 68 2c 20 69  ABLE child2(h, i
5840: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
5850: 6e 74 28 62 29 29 3b 20 20 20 20 20 20 20 20 20  nt(b));         
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
5870: 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54   Ok.    CREATE T
5880: 41 42 4c 45 20 63 68 69 6c 64 33 28 6a 2c 20 6b  ABLE child3(j, k
5890: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 2c  , FOREIGN KEY(j,
58a0: 20 6b 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   k) REFERENCES p
58b0: 61 72 65 6e 74 28 63 2c 20 64 29 29 3b 20 2d 2d  arent(c, d)); --
58c0: 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54   Ok.    CREATE T
58d0: 41 42 4c 45 20 63 68 69 6c 64 34 28 6c 2c 20 6d  ABLE child4(l, m
58e0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
58f0: 6e 74 28 65 29 29 3b 20 20 20 20 20 20 20 20 20  nt(e));         
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
5910: 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45 20   Err.    CREATE 
5920: 54 41 42 4c 45 20 63 68 69 6c 64 35 28 6e 2c 20  TABLE child5(n, 
5930: 6f 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  o REFERENCES par
5940: 65 6e 74 28 66 29 29 3b 20 20 20 20 20 20 20 20  ent(f));        
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
5960: 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45  - Err.    CREATE
5970: 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28 70 2c   TABLE child6(p,
5980: 20 71 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   q, FOREIGN KEY(
5990: 70 2c 71 29 20 52 45 46 45 52 45 4e 43 45 53 20  p,q) REFERENCES 
59a0: 70 61 72 65 6e 74 28 62 2c 20 63 29 29 3b 20 20  parent(b, c));  
59b0: 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54  -- Err.    CREAT
59c0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28 72  E TABLE child7(r
59d0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
59e0: 6e 74 28 63 29 29 3b 20 20 20 20 20 20 20 20 20  nt(c));         
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d   -- Err.  }.} {}
5a10: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
5a20: 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  19.2 {.  execsql
5a30: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
5a40: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
5a50: 28 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20  (1, 2, 3, 4, 5, 
5a60: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
5a70: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
5a80: 53 28 27 78 78 78 27 2c 20 31 29 3b 0a 20 20 20  S('xxx', 1);.   
5a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
5aa0: 6c 64 32 20 56 41 4c 55 45 53 28 27 78 78 78 27  ld2 VALUES('xxx'
5ab0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
5ac0: 20 49 4e 54 4f 20 63 68 69 6c 64 33 20 56 41 4c   INTO child3 VAL
5ad0: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 7d  UES(3, 4);.  }.}
5ae0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
5af0: 65 79 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74 63  ey-19.2 {.  catc
5b00: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
5b10: 54 4f 20 63 68 69 6c 64 34 20 56 41 4c 55 45 53  TO child4 VALUES
5b20: 28 27 78 78 78 27 2c 20 35 29 20 7d 0a 7d 20 7b  ('xxx', 5) }.} {
5b30: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
5b40: 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64  ismatch - "child
5b50: 34 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  4" referencing "
5b60: 70 61 72 65 6e 74 22 7d 7d 0a 64 6f 5f 74 65 73  parent"}}.do_tes
5b70: 74 20 65 5f 66 6b 65 79 2d 31 39 2e 33 20 7b 0a  t e_fkey-19.3 {.
5b80: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
5b90: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 35 20  ERT INTO child5 
5ba0: 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20 36 29  VALUES('xxx', 6)
5bb0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
5bc0: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
5bd0: 22 63 68 69 6c 64 35 22 20 72 65 66 65 72 65 6e  "child5" referen
5be0: 63 69 6e 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a  cing "parent"}}.
5bf0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
5c00: 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.4 {.  catchsql
5c10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
5c20: 68 69 6c 64 36 20 56 41 4c 55 45 53 28 32 2c 20  hild6 VALUES(2, 
5c30: 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  3) }.} {1 {forei
5c40: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
5c50: 2d 20 22 63 68 69 6c 64 36 22 20 72 65 66 65 72  - "child6" refer
5c60: 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 22 7d  encing "parent"}
5c70: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
5c80: 2d 31 39 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  -19.5 {.  catchs
5c90: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
5ca0: 20 63 68 69 6c 64 37 20 56 41 4c 55 45 53 28 33   child7 VALUES(3
5cb0: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
5cc0: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d  n key mismatch -
5cd0: 20 22 63 68 69 6c 64 37 22 20 72 65 66 65 72 65   "child7" refere
5ce0: 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 22 7d 7d  ncing "parent"}}
5cf0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5d40: 65 73 74 20 65 72 72 6f 72 73 20 69 6e 20 74 68  est errors in th
5d50: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
5d60: 61 20 74 68 61 74 20 61 72 65 20 64 65 74 65 63  a that are detec
5d70: 74 65 64 20 77 68 69 6c 65 20 70 72 65 70 61 72  ted while prepar
5d80: 69 6e 67 0a 23 20 44 4d 4c 20 73 74 61 74 65 6d  ing.# DML statem
5d90: 65 6e 74 73 2e 20 54 68 65 20 65 72 72 6f 72 20  ents. The error 
5da0: 74 65 78 74 20 66 6f 72 20 74 68 65 73 65 20 6d  text for these m
5db0: 65 73 73 61 67 65 73 20 61 6c 77 61 79 73 20 6d  essages always m
5dc0: 61 74 63 68 65 73 20 0a 23 20 65 69 74 68 65 72  atches .# either
5dd0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
5de0: 73 6d 61 74 63 68 22 20 6f 72 20 22 6e 6f 20 73  smatch" or "no s
5df0: 75 63 68 20 74 61 62 6c 65 2a 22 20 28 75 73 69  uch table*" (usi
5e00: 6e 67 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  ng [string match
5e10: 5d 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ])..#.# EVIDENCE
5e20: 2d 4f 46 3a 20 52 2d 34 35 34 38 38 2d 30 38 35  -OF: R-45488-085
5e30: 30 34 20 49 66 20 74 68 65 20 64 61 74 61 62 61  04 If the databa
5e40: 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74 61 69  se schema contai
5e50: 6e 73 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23  ns foreign key.#
5e60: 20 65 72 72 6f 72 73 20 74 68 61 74 20 72 65 71   errors that req
5e70: 75 69 72 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  uire looking at 
5e80: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61  more than one ta
5e90: 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 74  ble definition t
5ea0: 6f 0a 23 20 69 64 65 6e 74 69 66 79 2c 20 74 68  o.# identify, th
5eb0: 65 6e 20 74 68 6f 73 65 20 65 72 72 6f 72 73 20  en those errors 
5ec0: 61 72 65 20 6e 6f 74 20 64 65 74 65 63 74 65 64  are not detected
5ed0: 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73   when the tables
5ee0: 20 61 72 65 0a 23 20 63 72 65 61 74 65 64 2e 0a   are.# created..
5ef0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5f00: 20 52 2d 34 38 33 39 31 2d 33 38 34 37 32 20 49   R-48391-38472 I
5f10: 6e 73 74 65 61 64 2c 20 73 75 63 68 20 65 72 72  nstead, such err
5f20: 6f 72 73 20 70 72 65 76 65 6e 74 20 74 68 65 0a  ors prevent the.
5f30: 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 66 72  # application fr
5f40: 6f 6d 20 70 72 65 70 61 72 69 6e 67 20 53 51 4c  om preparing SQL
5f50: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5f60: 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e 74   modify the cont
5f70: 65 6e 74 20 6f 66 0a 23 20 74 68 65 20 63 68 69  ent of.# the chi
5f80: 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74 61 62  ld or parent tab
5f90: 6c 65 73 20 69 6e 20 77 61 79 73 20 74 68 61 74  les in ways that
5fa0: 20 75 73 65 20 74 68 65 20 66 6f 72 65 69 67 6e   use the foreign
5fb0: 20 6b 65 79 73 2e 0a 23 0a 23 20 45 56 49 44 45   keys..#.# EVIDE
5fc0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 31 30 38 2d  NCE-OF: R-03108-
5fd0: 36 33 36 35 39 20 54 68 65 20 45 6e 67 6c 69 73  63659 The Englis
5fe0: 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
5ff0: 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 23 20 66   message for.# f
6000: 6f 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65  oreign key DML e
6010: 72 72 6f 72 73 20 69 73 20 75 73 75 61 6c 6c 79  rrors is usually
6020: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
6030: 73 6d 61 74 63 68 22 20 62 75 74 20 63 61 6e 20  smatch" but can 
6040: 61 6c 73 6f 0a 23 20 62 65 20 22 6e 6f 20 73 75  also.# be "no su
6050: 63 68 20 74 61 62 6c 65 22 20 69 66 20 74 68 65  ch table" if the
6060: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f   parent table do
6070: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a  es not exist..#.
6080: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
6090: 2d 33 35 37 36 33 2d 34 38 32 36 37 20 46 6f 72  -35763-48267 For
60a0: 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72  eign key DML err
60b0: 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  ors are reported
60c0: 20 69 66 3a 20 54 68 65 0a 23 20 70 61 72 65 6e   if: The.# paren
60d0: 74 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  t table does not
60e0: 20 65 78 69 73 74 2c 20 6f 72 20 54 68 65 20 70   exist, or The p
60f0: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
6100: 73 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 0a 23  s named in the.#
6110: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
6120: 73 74 72 61 69 6e 74 20 64 6f 20 6e 6f 74 20 65  straint do not e
6130: 78 69 73 74 2c 20 6f 72 20 54 68 65 20 70 61 72  xist, or The par
6140: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
6150: 6e 61 6d 65 64 0a 23 20 69 6e 20 74 68 65 20 66  named.# in the f
6160: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
6170: 72 61 69 6e 74 20 61 72 65 20 6e 6f 74 20 74 68  raint are not th
6180: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66  e primary key of
6190: 20 74 68 65 20 70 61 72 65 6e 74 0a 23 20 74 61   the parent.# ta
61a0: 62 6c 65 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ble and are not 
61b0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 75 6e 69  subject to a uni
61c0: 71 75 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 75  que constraint u
61d0: 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 0a 23  sing collating.#
61e0: 20 73 65 71 75 65 6e 63 65 20 73 70 65 63 69 66   sequence specif
61f0: 69 65 64 20 69 6e 20 74 68 65 20 43 52 45 41 54  ied in the CREAT
6200: 45 20 54 41 42 4c 45 2c 20 6f 72 20 54 68 65 20  E TABLE, or The 
6210: 63 68 69 6c 64 20 74 61 62 6c 65 20 72 65 66 65  child table refe
6220: 72 65 6e 63 65 73 0a 23 20 74 68 65 20 70 72 69  rences.# the pri
6230: 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20  mary key of the 
6240: 70 61 72 65 6e 74 20 77 69 74 68 6f 75 74 20 73  parent without s
6250: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 70 72  pecifying the pr
6260: 69 6d 61 72 79 20 6b 65 79 0a 23 20 63 6f 6c 75  imary key.# colu
6270: 6d 6e 73 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  mns and the numb
6280: 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
6290: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
62a0: 20 70 61 72 65 6e 74 20 64 6f 20 6e 6f 74 0a 23   parent do not.#
62b0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
62c0: 72 20 6f 66 20 63 68 69 6c 64 20 6b 65 79 20 63  r of child key c
62d0: 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73  olumns..#.do_tes
62e0: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 31 20 7b 0a  t e_fkey-20.1 {.
62f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
6310: 63 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73  c REFERENCES nos
6320: 75 63 68 74 61 62 6c 65 2c 20 64 29 3b 0a 0a 20  uchtable, d);.. 
6330: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6340: 70 32 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  p2(a, b, UNIQUE(
6350: 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41  a, b));.    CREA
6360: 54 45 20 54 41 42 4c 45 20 63 32 28 63 2c 20 64  TE TABLE c2(c, d
6370: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
6380: 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
6390: 32 28 61 2c 20 78 29 29 3b 0a 0a 20 20 20 20 43  2(a, x));..    C
63a0: 52 45 41 54 45 20 54 41 42 4c 45 20 70 33 28 61  REATE TABLE p3(a
63b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
63c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
63d0: 4c 45 20 63 33 28 63 20 52 45 46 45 52 45 4e 43  LE c3(c REFERENC
63e0: 45 53 20 70 33 28 62 29 2c 20 64 29 3b 0a 0a 20  ES p3(b), d);.. 
63f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6400: 70 34 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p4(a PRIMARY KEY
6410: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
6420: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 34   UNIQUE INDEX p4
6430: 69 20 4f 4e 20 70 34 28 62 20 43 4f 4c 4c 41 54  i ON p4(b COLLAT
6440: 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 43  E nocase);.    C
6450: 52 45 41 54 45 20 54 41 42 4c 45 20 63 34 28 63  REATE TABLE c4(c
6460: 20 52 45 46 45 52 45 4e 43 45 53 20 70 34 28 62   REFERENCES p4(b
6470: 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  ), d);..    CREA
6480: 54 45 20 54 41 42 4c 45 20 70 35 28 61 20 50 52  TE TABLE p5(a PR
6490: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 43 4f 4c  IMARY KEY, b COL
64a0: 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20  LATE nocase);.  
64b0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
64c0: 49 4e 44 45 58 20 70 35 69 20 4f 4e 20 70 35 28  INDEX p5i ON p5(
64d0: 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  b COLLATE binary
64e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
64f0: 42 4c 45 20 63 35 28 63 20 52 45 46 45 52 45 4e  BLE c5(c REFEREN
6500: 43 45 53 20 70 35 28 62 29 2c 20 64 29 3b 0a 0a  CES p5(b), d);..
6510: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6520: 20 70 36 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p6(a PRIMARY KE
6530: 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, b);.    CREAT
6540: 45 20 54 41 42 4c 45 20 63 36 28 63 2c 20 64 2c  E TABLE c6(c, d,
6550: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
6560: 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 36  d) REFERENCES p6
6570: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6580: 41 42 4c 45 20 70 37 28 61 2c 20 62 2c 20 50 52  ABLE p7(a, b, PR
6590: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
65a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
65b0: 4c 45 20 63 37 28 63 2c 20 64 20 52 45 46 45 52  LE c7(c, d REFER
65c0: 45 4e 43 45 53 20 70 37 29 3b 0a 20 20 7d 0a 7d  ENCES p7);.  }.}
65d0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
65e0: 20 74 62 6c 20 70 74 62 6c 20 65 72 72 7d 20 7b   tbl ptbl err} {
65f0: 0a 20 20 32 20 63 31 20 7b 7d 20 22 6e 6f 20 73  .  2 c1 {} "no s
6600: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
6610: 6e 6f 73 75 63 68 74 61 62 6c 65 22 0a 20 20 33  nosuchtable".  3
6620: 20 63 32 20 70 32 20 22 66 6f 72 65 69 67 6e 20   c2 p2 "foreign 
6630: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c  key mismatch - \
6640: 22 63 32 5c 22 20 72 65 66 65 72 65 6e 63 69 6e  "c2\" referencin
6650: 67 20 5c 22 70 32 5c 22 22 0a 20 20 34 20 63 33  g \"p2\"".  4 c3
6660: 20 70 33 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p3 "foreign key
6670: 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 33   mismatch - \"c3
6680: 5c 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c  \" referencing \
6690: 22 70 33 5c 22 22 0a 20 20 35 20 63 34 20 70 34  "p3\"".  5 c4 p4
66a0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
66b0: 73 6d 61 74 63 68 20 2d 20 5c 22 63 34 5c 22 20  smatch - \"c4\" 
66c0: 72 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 34  referencing \"p4
66d0: 5c 22 22 0a 20 20 36 20 63 35 20 70 35 20 22 66  \"".  6 c5 p5 "f
66e0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
66f0: 74 63 68 20 2d 20 5c 22 63 35 5c 22 20 72 65 66  tch - \"c5\" ref
6700: 65 72 65 6e 63 69 6e 67 20 5c 22 70 35 5c 22 22  erencing \"p5\""
6710: 0a 20 20 37 20 63 36 20 70 36 20 22 66 6f 72 65  .  7 c6 p6 "fore
6720: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
6730: 20 2d 20 5c 22 63 36 5c 22 20 72 65 66 65 72 65   - \"c6\" refere
6740: 6e 63 69 6e 67 20 5c 22 70 36 5c 22 22 0a 20 20  ncing \"p6\"".  
6750: 38 20 63 37 20 70 37 20 22 66 6f 72 65 69 67 6e  8 c7 p7 "foreign
6760: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
6770: 5c 22 63 37 5c 22 20 72 65 66 65 72 65 6e 63 69  \"c7\" referenci
6780: 6e 67 20 5c 22 70 37 5c 22 22 0a 7d 20 7b 0a 20  ng \"p7\"".} {. 
6790: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
67a0: 32 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63  20.$tn.1 {.    c
67b0: 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54 20  atchsql "INSERT 
67c0: 49 4e 54 4f 20 24 74 62 6c 20 56 41 4c 55 45 53  INTO $tbl VALUES
67d0: 28 27 61 27 2c 20 27 62 27 29 22 0a 20 20 7d 20  ('a', 'b')".  } 
67e0: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
67f0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
6800: 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63 61  0.$tn.2 {.    ca
6810: 74 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 24  tchsql "UPDATE $
6820: 74 62 6c 20 53 45 54 20 63 20 3d 20 3f 2c 20 64  tbl SET c = ?, d
6830: 20 3d 20 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20   = ?".  } [list 
6840: 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73  1 $err].  do_tes
6850: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
6860: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
6870: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74   "INSERT INTO $t
6880: 62 6c 20 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a  bl SELECT ?, ?".
6890: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
68a0: 5d 0a 0a 20 20 69 66 20 7b 24 70 74 62 6c 20 6e  ]..  if {$ptbl n
68b0: 65 20 22 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  e ""} {.    do_t
68c0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74  est e_fkey-20.$t
68d0: 6e 2e 34 20 7b 0a 20 20 20 20 20 20 63 61 74 63  n.4 {.      catc
68e0: 68 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  hsql "DELETE FRO
68f0: 4d 20 24 70 74 62 6c 22 0a 20 20 20 20 7d 20 5b  M $ptbl".    } [
6900: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20 20  list 1 $err].   
6910: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
6920: 32 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 20  20.$tn.5 {.     
6930: 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41 54   catchsql "UPDAT
6940: 45 20 24 70 74 62 6c 20 53 45 54 20 61 20 3d 20  E $ptbl SET a = 
6950: 3f 2c 20 62 20 3d 20 3f 22 0a 20 20 20 20 7d 20  ?, b = ?".    } 
6960: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
6970: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
6980: 2d 32 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -20.$tn.6 {.    
6990: 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45    catchsql "INSE
69a0: 52 54 20 49 4e 54 4f 20 24 70 74 62 6c 20 53 45  RT INTO $ptbl SE
69b0: 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20 20 20 7d  LECT ?, ?".    }
69c0: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20   [list 1 $err]. 
69d0: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
6a30: 52 2d 31 39 33 35 33 2d 34 33 36 34 33 0a 23 0a  R-19353-43643.#.
6a40: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
6a50: 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65  le of foreign ke
6a60: 79 20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72  y mismatch error
6a70: 73 20 63 61 75 73 65 64 20 62 79 20 69 6d 70 6c  s caused by impl
6a80: 69 63 69 74 6c 79 0a 23 20 6d 61 70 70 69 6e 67  icitly.# mapping
6a90: 20 61 20 63 68 69 6c 64 20 6b 65 79 20 74 6f 20   a child key to 
6aa0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
6ab0: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  of the parent ta
6ac0: 62 6c 65 20 77 68 65 6e 20 74 68 65 0a 23 20 63  ble when the.# c
6ad0: 68 69 6c 64 20 6b 65 79 20 63 6f 6e 73 69 73 74  hild key consist
6ae0: 73 20 6f 66 20 61 20 64 69 66 66 65 72 65 6e 74  s of a different
6af0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
6b00: 6e 73 20 74 6f 20 74 68 61 74 20 70 72 69 6d 61  ns to that prima
6b10: 72 79 20 6b 65 79 2e 0a 23 20 0a 64 72 6f 70 5f  ry key..# .drop_
6b20: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
6b30: 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 31 20 7b  st e_fkey-21.1 {
6b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6b50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
6b60: 72 65 6e 74 32 28 61 2c 20 62 2c 20 50 52 49 4d  rent2(a, b, PRIM
6b70: 41 52 59 20 4b 45 59 28 61 2c 62 29 29 3b 0a 0a  ARY KEY(a,b));..
6b80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6b90: 20 63 68 69 6c 64 38 28 78 2c 20 79 2c 20 46 4f   child8(x, y, FO
6ba0: 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20 52  REIGN KEY(x,y) R
6bb0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
6bc0: 32 29 3b 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20  2);     -- Ok.  
6bd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
6be0: 68 69 6c 64 39 28 78 20 52 45 46 45 52 45 4e 43  hild9(x REFERENC
6bf0: 45 53 20 70 61 72 65 6e 74 32 29 3b 20 20 20 20  ES parent2);    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 20 2d 2d 20 45 72 72 0a 20 20 20        -- Err.   
6c20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
6c30: 69 6c 64 31 30 28 78 2c 79 2c 7a 2c 20 46 4f 52  ild10(x,y,z, FOR
6c40: 45 49 47 4e 20 4b 45 59 28 78 2c 79 2c 7a 29 20  EIGN KEY(x,y,z) 
6c50: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
6c60: 74 32 29 3b 20 2d 2d 20 45 72 72 0a 20 20 7d 0a  t2); -- Err.  }.
6c70: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6c80: 6b 65 79 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65  key-21.2 {.  exe
6c90: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
6ca0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 32 20 56  T INTO parent2 V
6cb0: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
6cc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6cd0: 4f 20 63 68 69 6c 64 38 20 56 41 4c 55 45 53 28  O child8 VALUES(
6ce0: 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 7d 0a  'I', 'II');.  }.
6cf0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6d00: 6b 65 79 2d 32 31 2e 33 20 7b 0a 20 20 63 61 74  key-21.3 {.  cat
6d10: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
6d20: 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45  NTO child9 VALUE
6d30: 53 28 27 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66  S('I') }.} {1 {f
6d40: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6d50: 74 63 68 20 2d 20 22 63 68 69 6c 64 39 22 20 72  tch - "child9" r
6d60: 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65  eferencing "pare
6d70: 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  nt2"}}.do_test e
6d80: 5f 66 6b 65 79 2d 32 31 2e 34 20 7b 0a 20 20 63  _fkey-21.4 {.  c
6d90: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
6da0: 20 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c   INTO child9 VAL
6db0: 55 45 53 28 27 49 49 27 29 20 7d 0a 7d 20 7b 31  UES('II') }.} {1
6dc0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6dd0: 73 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 39  smatch - "child9
6de0: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
6df0: 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73  arent2"}}.do_tes
6e00: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 35 20 7b 0a  t e_fkey-21.5 {.
6e10: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6e20: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20  ERT INTO child9 
6e30: 56 41 4c 55 45 53 28 4e 55 4c 4c 29 20 7d 0a 7d  VALUES(NULL) }.}
6e40: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
6e50: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69   mismatch - "chi
6e60: 6c 64 39 22 20 72 65 66 65 72 65 6e 63 69 6e 67  ld9" referencing
6e70: 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f   "parent2"}}.do_
6e80: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 36  test e_fkey-21.6
6e90: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
6ea0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
6eb0: 64 31 30 20 56 41 4c 55 45 53 28 27 49 27 2c 20  d10 VALUES('I', 
6ec0: 27 49 49 27 2c 20 27 49 49 49 27 29 20 7d 0a 7d  'II', 'III') }.}
6ed0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
6ee0: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69   mismatch - "chi
6ef0: 6c 64 31 30 22 20 72 65 66 65 72 65 6e 63 69 6e  ld10" referencin
6f00: 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a 64 6f  g "parent2"}}.do
6f10: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6f20: 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  7 {.  catchsql {
6f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
6f40: 6c 64 31 30 20 56 41 4c 55 45 53 28 31 2c 20 32  ld10 VALUES(1, 2
6f50: 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 3) }.} {1 {for
6f60: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
6f70: 68 20 2d 20 22 63 68 69 6c 64 31 30 22 20 72 65  h - "child10" re
6f80: 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65 6e  ferencing "paren
6f90: 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  t2"}}.do_test e_
6fa0: 66 6b 65 79 2d 32 31 2e 38 20 7b 0a 20 20 63 61  fkey-21.8 {.  ca
6fb0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6fc0: 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41 4c  INTO child10 VAL
6fd0: 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  UES(NULL, NULL, 
6fe0: 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  NULL) }.} {1 {fo
6ff0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
7000: 63 68 20 2d 20 22 63 68 69 6c 64 31 30 22 20 72  ch - "child10" r
7010: 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65  eferencing "pare
7020: 6e 74 32 22 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  nt2"}}..#-------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 0a 23 20 54 65 73 74 20 65 72 72 6f 72 73  --.# Test errors
7080: 20 74 68 61 74 20 61 72 65 20 72 65 70 6f 72 74   that are report
7090: 65 64 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ed when creating
70a0: 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
70b0: 2e 20 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c  . .# Specificall
70c0: 79 3a 0a 23 0a 23 20 20 20 2a 20 64 69 66 66 65  y:.#.#   * diffe
70d0: 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63  rent number of c
70e0: 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20  hild and parent 
70f0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64  key columns, and
7100: 0a 23 20 20 20 2a 20 63 68 69 6c 64 20 63 6f 6c  .#   * child col
7110: 75 6d 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  umns that do not
7120: 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56 49 44   exist..#.# EVID
7130: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 36 38 32  ENCE-OF: R-23682
7140: 2d 35 39 38 32 30 20 42 79 20 63 6f 6e 74 72 61  -59820 By contra
7150: 73 74 2c 20 69 66 20 66 6f 72 65 69 67 6e 20 6b  st, if foreign k
7160: 65 79 20 65 72 72 6f 72 73 20 63 61 6e 20 62 65  ey errors can be
7170: 0a 23 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 69  .# recognized si
7180: 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  mply by looking 
7190: 61 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  at the definitio
71a0: 6e 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  n of the child t
71b0: 61 62 6c 65 20 61 6e 64 0a 23 20 77 69 74 68 6f  able and.# witho
71c0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 6f 6e  ut having to con
71d0: 73 75 6c 74 20 74 68 65 20 70 61 72 65 6e 74 20  sult the parent 
71e0: 74 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  table definition
71f0: 2c 20 74 68 65 6e 20 74 68 65 20 43 52 45 41 54  , then the CREAT
7200: 45 0a 23 20 54 41 42 4c 45 20 73 74 61 74 65 6d  E.# TABLE statem
7210: 65 6e 74 20 66 6f 72 20 74 68 65 20 63 68 69 6c  ent for the chil
7220: 64 20 74 61 62 6c 65 20 66 61 69 6c 73 2e 0a 23  d table fails..#
7230: 0a 23 20 54 68 65 73 65 20 65 72 72 6f 72 73 20  .# These errors 
7240: 61 72 65 20 72 65 70 6f 72 74 65 64 20 77 68 65  are reported whe
7250: 74 68 65 72 20 6f 72 20 6e 6f 74 20 46 4b 20 73  ther or not FK s
7260: 75 70 70 6f 72 74 20 69 73 20 65 6e 61 62 6c 65  upport is enable
7270: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
7280: 4f 46 3a 20 52 2d 33 33 38 38 33 2d 32 38 38 33  OF: R-33883-2883
7290: 33 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 44 44  3 Foreign key DD
72a0: 4c 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70  L errors are rep
72b0: 6f 72 74 65 64 0a 23 20 72 65 67 61 72 64 6c 65  orted.# regardle
72c0: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
72d0: 20 6e 6f 74 20 66 6f 72 65 69 67 6e 20 6b 65 79   not foreign key
72e0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
72f0: 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 0a 23 20   enabled when.# 
7300: 74 68 65 20 74 61 62 6c 65 20 69 73 20 63 72 65  the table is cre
7310: 61 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  ated..#.drop_all
7320: 5f 74 61 62 6c 65 73 0a 66 6f 72 65 61 63 68 20  _tables.foreach 
7330: 66 6b 20 5b 6c 69 73 74 20 4f 46 46 20 4f 4e 5d  fk [list OFF ON]
7340: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 50 52   {.  execsql "PR
7350: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
7360: 73 20 3d 20 24 66 6b 22 0a 20 20 73 65 74 20 69  s = $fk".  set i
7370: 20 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 73 71   0.  foreach {sq
7380: 6c 20 65 72 72 6f 72 7d 20 7b 0a 20 20 20 20 22  l error} {.    "
7390: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
73a0: 6c 64 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  ld1(a, b, FOREIG
73b0: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
73c0: 52 45 4e 43 45 53 20 70 28 63 29 29 22 0a 20 20  RENCES p(c))".  
73d0: 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63      {number of c
73e0: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
73f0: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
7400: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
7410: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
7420: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
7430: 6c 65 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20  le}.    "CREATE 
7440: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20  TABLE child2(a, 
7450: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
7460: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
7470: 70 28 63 2c 20 64 2c 20 65 29 29 22 0a 20 20 20  p(c, d, e))".   
7480: 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f     {number of co
7490: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
74a0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
74b0: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
74c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
74d0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
74e0: 65 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  e}.    "CREATE T
74f0: 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62  ABLE child2(a, b
7500: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
7510: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
7520: 28 63 2c 20 64 29 29 22 0a 20 20 20 20 20 20 7b  (c, d))".      {
7530: 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22  unknown column "
7540: 63 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  c" in foreign ke
7550: 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a 20 20  y definition}.  
7560: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
7570: 63 68 69 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52  child2(a, b, FOR
7580: 45 49 47 4e 20 4b 45 59 28 63 2c 20 62 29 20 52  EIGN KEY(c, b) R
7590: 45 46 45 52 45 4e 43 45 53 20 70 28 63 2c 20 64  EFERENCES p(c, d
75a0: 29 29 22 0a 20 20 20 20 20 20 7b 75 6e 6b 6e 6f  ))".      {unkno
75b0: 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e  wn column "c" in
75c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
75d0: 69 6e 69 74 69 6f 6e 7d 0a 20 20 7d 20 7b 0a 20  inition}.  } {. 
75e0: 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65     do_test e_fke
75f0: 79 2d 32 32 2e 24 66 6b 2e 5b 69 6e 63 72 20 69  y-22.$fk.[incr i
7600: 5d 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  ] {.      catchs
7610: 71 6c 20 24 73 71 6c 0a 20 20 20 20 7d 20 5b 6c  ql $sql.    } [l
7620: 69 73 74 20 31 20 24 65 72 72 6f 72 5d 0a 20 20  ist 1 $error].  
7630: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7680: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 52 45  # Test that a RE
7690: 46 45 52 45 4e 43 49 4e 47 20 63 6c 61 75 73 65  FERENCING clause
76a0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73   that does not s
76b0: 70 65 63 69 66 79 20 70 61 72 65 6e 74 20 6b 65  pecify parent ke
76c0: 79 20 63 6f 6c 75 6d 6e 73 0a 23 20 69 6d 70 6c  y columns.# impl
76d0: 69 63 69 74 6c 79 20 6d 61 70 73 20 74 6f 20 74  icitly maps to t
76e0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f  he primary key o
76f0: 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  f the parent tab
7700: 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  le..#.# EVIDENCE
7710: 2d 4f 46 3a 20 52 2d 34 33 38 37 39 2d 30 38 30  -OF: R-43879-080
7720: 32 35 20 41 74 74 61 63 68 69 6e 67 20 61 20 22  25 Attaching a "
7730: 52 45 46 45 52 45 4e 43 45 53 20 3c 70 61 72 65  REFERENCES <pare
7740: 6e 74 2d 74 61 62 6c 65 3e 22 0a 23 20 63 6c 61  nt-table>".# cla
7750: 75 73 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  use to a column 
7760: 64 65 66 69 6e 69 74 69 6f 6e 20 63 72 65 61 74  definition creat
7770: 65 73 20 61 20 66 6f 72 65 69 67 6e 0a 23 20 6b  es a foreign.# k
7780: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  ey constraint th
7790: 61 74 20 6d 61 70 73 20 74 68 65 20 63 6f 6c 75  at maps the colu
77a0: 6d 6e 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72  mn to the primar
77b0: 79 20 6b 65 79 20 6f 66 0a 23 20 3c 70 61 72 65  y key of.# <pare
77c0: 6e 74 2d 74 61 62 6c 65 3e 2e 0a 23 20 0a 64 6f  nt-table>..# .do
77d0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 33 2e  _test e_fkey-23.
77e0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
77f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7800: 20 70 31 28 61 2c 20 62 2c 20 50 52 49 4d 41 52   p1(a, b, PRIMAR
7810: 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20  Y KEY(a, b));.  
7820: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
7830: 32 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b  2(a, b PRIMARY K
7840: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
7850: 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46  TABLE c1(c, d, F
7860: 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
7870: 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 29 3b   REFERENCES p1);
7880: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7890: 45 20 63 32 28 61 2c 20 62 20 52 45 46 45 52 45  E c2(a, b REFERE
78a0: 4e 43 45 53 20 70 32 29 3b 0a 20 20 7d 0a 7d 20  NCES p2);.  }.} 
78b0: 7b 7d 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b  {}.proc test_efk
78c0: 65 79 5f 36 30 20 7b 74 6e 20 69 73 45 72 72 6f  ey_60 {tn isErro
78d0: 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65  r sql} {.  do_te
78e0: 73 74 20 65 5f 66 6b 65 79 2d 32 33 2e 24 74 6e  st e_fkey-23.$tn
78f0: 20 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   ".    catchsql 
7900: 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64  {$sql}.  " [lind
7910: 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46  ex {{0 {}} {1 {F
7920: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
7930: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20  raint failed}}} 
7940: 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 0a 74 65 73  $isError].}..tes
7950: 74 5f 65 66 6b 65 79 5f 36 30 20 32 20 31 20 22  t_efkey_60 2 1 "
7960: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
7970: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
7980: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 33  .test_efkey_60 3
7990: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
79a0: 70 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  p1 VALUES(239, 2
79b0: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
79c0: 36 30 20 34 20 30 20 22 49 4e 53 45 52 54 20 49  60 4 0 "INSERT I
79d0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32 33  NTO c1 VALUES(23
79e0: 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66  9, 231)".test_ef
79f0: 6b 65 79 5f 36 30 20 35 20 31 20 22 49 4e 53 45  key_60 5 1 "INSE
7a00: 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
7a10: 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73  S(239, 231)".tes
7a20: 74 5f 65 66 6b 65 79 5f 36 30 20 36 20 30 20 22  t_efkey_60 6 0 "
7a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 32 20 56  INSERT INTO p2 V
7a40: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
7a50: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 37  .test_efkey_60 7
7a60: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
7a70: 63 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  c2 VALUES(239, 2
7a80: 33 31 29 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  31)"..#---------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ad0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20  .# Test that an 
7ae0: 69 6e 64 65 78 20 6f 6e 20 6f 6e 20 74 68 65 20  index on on the 
7af0: 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
7b00: 73 20 6f 66 20 61 6e 20 46 4b 20 63 6f 6e 73 74  s of an FK const
7b10: 72 61 69 6e 74 0a 23 20 69 73 20 6f 70 74 69 6f  raint.# is optio
7b20: 6e 61 6c 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  nal..#.# EVIDENC
7b30: 45 2d 4f 46 3a 20 52 2d 31 35 34 31 37 2d 32 38  E-OF: R-15417-28
7b40: 30 31 34 20 49 6e 64 69 63 65 73 20 61 72 65 20  014 Indices are 
7b50: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f 72  not required for
7b60: 20 63 68 69 6c 64 20 6b 65 79 0a 23 20 63 6f 6c   child key.# col
7b70: 75 6d 6e 73 0a 23 0a 23 20 41 6c 73 6f 20 74 65  umns.#.# Also te
7b80: 73 74 20 74 68 61 74 20 69 66 20 61 6e 20 69 6e  st that if an in
7b90: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 6f  dex is created o
7ba0: 6e 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  n the child key 
7bb0: 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 64 6f 65 73  columns, it does
7bc0: 0a 23 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  .# not make a di
7bd0: 66 66 65 72 65 6e 63 65 20 77 68 65 74 68 65 72  fference whether
7be0: 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 61 20   or not it is a 
7bf0: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a  UNIQUE index..#.
7c00: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7c10: 2d 31 35 37 34 31 2d 35 30 38 39 33 20 54 68 65  -15741-50893 The
7c20: 20 63 68 69 6c 64 20 6b 65 79 20 69 6e 64 65 78   child key index
7c30: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
7c40: 6f 20 62 65 0a 23 20 28 61 6e 64 20 75 73 75 61  o be.# (and usua
7c50: 6c 6c 79 20 77 69 6c 6c 20 6e 6f 74 20 62 65 29  lly will not be)
7c60: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e   a UNIQUE index.
7c70: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
7c80: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
7c90: 79 2d 32 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-24.1 {.  execs
7ca0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
7cb0: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 2c 20  TABLE parent(x, 
7cc0: 79 2c 20 55 4e 49 51 55 45 28 79 2c 20 78 29 29  y, UNIQUE(y, x))
7cd0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7ce0: 4c 45 20 63 31 28 61 2c 20 62 2c 20 46 4f 52 45  LE c1(a, b, FORE
7cf0: 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45  IGN KEY(a, b) RE
7d00: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
7d10: 78 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41  x, y));.    CREA
7d20: 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62  TE TABLE c2(a, b
7d30: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
7d40: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
7d50: 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20  arent(x, y));.  
7d60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
7d70: 33 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  3(a, b, FOREIGN 
7d80: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
7d90: 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79  NCES parent(x, y
7da0: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  ));.    CREATE I
7db0: 4e 44 45 58 20 63 32 69 20 4f 4e 20 63 32 28 61  NDEX c2i ON c2(a
7dc0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7dd0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 63 33   UNIQUE INDEX c3
7de0: 69 20 4f 4e 20 63 32 28 62 2c 20 61 29 3b 0a 20  i ON c2(b, a);. 
7df0: 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65 73   }.} {}.proc tes
7e00: 74 5f 65 66 6b 65 79 5f 36 31 20 7b 74 6e 20 69  t_efkey_61 {tn i
7e10: 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20  sError sql} {.  
7e20: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
7e30: 34 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63  4.$tn ".    catc
7e40: 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20  hsql {$sql}.  " 
7e50: 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20  [lindex {{0 {}} 
7e60: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
7e70: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7e80: 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d  d}}} $isError].}
7e90: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 7d 20  .foreach {tn c} 
7ea0: 5b 6c 69 73 74 20 32 20 63 31 20 33 20 63 32 20  [list 2 c1 3 c2 
7eb0: 34 20 63 33 5d 20 7b 0a 20 20 74 65 73 74 5f 65  4 c3] {.  test_e
7ec0: 66 6b 65 79 5f 36 31 20 24 74 6e 2e 31 20 31 20  fkey_61 $tn.1 1 
7ed0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 63 20  "INSERT INTO $c 
7ee0: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 20 20  VALUES(1, 2)".  
7ef0: 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74  test_efkey_61 $t
7f00: 6e 2e 32 20 30 20 22 49 4e 53 45 52 54 20 49 4e  n.2 0 "INSERT IN
7f10: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
7f20: 28 31 2c 20 32 29 22 0a 20 20 74 65 73 74 5f 65  (1, 2)".  test_e
7f30: 66 6b 65 79 5f 36 31 20 24 74 6e 2e 33 20 30 20  fkey_61 $tn.3 0 
7f40: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 63 20  "INSERT INTO $c 
7f50: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 0a 20  VALUES(1, 2)".. 
7f60: 20 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54 45   execsql "DELETE
7f70: 20 46 52 4f 4d 20 24 63 20 3b 20 44 45 4c 45 54   FROM $c ; DELET
7f80: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 22 0a 7d  E FROM parent".}
7f90: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
7fe0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30  VIDENCE-OF: R-00
7ff0: 32 37 39 2d 35 32 32 38 33 0a 23 0a 23 20 54 65  279-52283.#.# Te
8000: 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 73 68  st an example sh
8010: 6f 77 69 6e 67 20 74 68 61 74 20 77 68 65 6e 20  owing that when 
8020: 61 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64  a row is deleted
8030: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
8040: 20 0a 23 20 74 61 62 6c 65 2c 20 74 68 65 20 63   .# table, the c
8050: 68 69 6c 64 20 74 61 62 6c 65 20 69 73 20 71 75  hild table is qu
8060: 65 72 69 65 64 20 66 6f 72 20 6f 72 70 68 61 6e  eried for orphan
8070: 65 64 20 72 6f 77 73 20 61 73 20 66 6f 6c 6c 6f  ed rows as follo
8080: 77 73 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43 54  ws:.#.#   SELECT
8090: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63   rowid FROM trac
80a0: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
80b0: 69 73 74 20 3d 20 3f 0a 23 0a 23 20 45 56 49 44  ist = ?.#.# EVID
80c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 33 30 32  ENCE-OF: R-23302
80d0: 2d 33 30 39 35 36 20 49 66 20 74 68 69 73 20 53  -30956 If this S
80e0: 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 61 6e  ELECT returns an
80f0: 79 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 0a 23  y rows at all,.#
8100: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 63 6f 6e   then SQLite con
8110: 63 6c 75 64 65 73 20 74 68 61 74 20 64 65 6c 65  cludes that dele
8120: 74 69 6e 67 20 74 68 65 20 72 6f 77 20 66 72 6f  ting the row fro
8130: 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  m the parent tab
8140: 6c 65 0a 23 20 77 6f 75 6c 64 20 76 69 6f 6c 61  le.# would viola
8150: 74 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  te the foreign k
8160: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ey constraint an
8170: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  d returns an err
8180: 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  or..#.do_test e_
8190: 66 6b 65 79 2d 32 35 2e 31 20 7b 0a 20 20 65 78  fkey-25.1 {.  ex
81a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
81b0: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
81c0: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
81d0: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
81e0: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
81f0: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
8200: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
8210: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
8220: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
8230: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
8240: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
8250: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
8260: 72 74 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20  rtist INTEGER,. 
8270: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
8280: 28 74 72 61 63 6b 61 72 74 69 73 74 29 20 52 45  (trackartist) RE
8290: 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
82a0: 61 72 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b  artistid).    );
82b0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 64 65 74  .  }.} {}.do_det
82c0: 61 69 6c 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  ail_test e_fkey-
82d0: 32 35 2e 32 20 7b 0a 20 20 50 52 41 47 4d 41 20  25.2 {.  PRAGMA 
82e0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
82f0: 46 46 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  FF;.  EXPLAIN QU
8300: 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20  ERY PLAN DELETE 
8310: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
8320: 45 20 31 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51  E 1;.  EXPLAIN Q
8330: 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
8340: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63   rowid FROM trac
8350: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
8360: 69 73 74 20 3d 20 3f 3b 0a 7d 20 7b 0a 20 20 7b  ist = ?;.} {.  {
8370: 53 43 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73  SCAN TABLE artis
8380: 74 7d 20 0a 20 20 7b 53 43 41 4e 20 54 41 42 4c  t} .  {SCAN TABL
8390: 45 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f 64 65  E track}.}.do_de
83a0: 74 61 69 6c 5f 74 65 73 74 20 65 5f 66 6b 65 79  tail_test e_fkey
83b0: 2d 32 35 2e 33 20 7b 0a 20 20 50 52 41 47 4d 41  -25.3 {.  PRAGMA
83c0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
83d0: 4f 4e 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  ON;.  EXPLAIN QU
83e0: 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20  ERY PLAN DELETE 
83f0: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
8400: 45 20 31 3b 0a 7d 20 7b 0a 20 20 7b 53 43 41 4e  E 1;.} {.  {SCAN
8410: 20 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a   TABLE artist} .
8420: 20 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 72    {SCAN TABLE tr
8430: 61 63 6b 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65  ack}.}.do_test e
8440: 5f 66 6b 65 79 2d 32 35 2e 34 20 7b 0a 20 20 65  _fkey-25.4 {.  e
8450: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
8460: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
8470: 56 41 4c 55 45 53 28 35 2c 20 27 61 72 74 69 73  VALUES(5, 'artis
8480: 74 20 35 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  t 5');.    INSER
8490: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
84a0: 4c 55 45 53 28 36 2c 20 27 61 72 74 69 73 74 20  LUES(6, 'artist 
84b0: 36 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  6');.    INSERT 
84c0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
84d0: 45 53 28 37 2c 20 27 61 72 74 69 73 74 20 37 27  ES(7, 'artist 7'
84e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
84f0: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
8500: 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 35 29  1, 'track 1', 5)
8510: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8520: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 32  O track VALUES(2
8530: 2c 20 27 74 72 61 63 6b 20 32 27 2c 20 36 29 3b  , 'track 2', 6);
8540: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  .  }.} {}..do_te
8550: 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 35 20 7b  st e_fkey-25.5 {
8560: 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20  .  concat \.    
8570: 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  [execsql { SELEC
8580: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61  T rowid FROM tra
8590: 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72  ck WHERE trackar
85a0: 74 69 73 74 20 3d 20 35 20 7d 5d 20 20 20 5c 0a  tist = 5 }]   \.
85b0: 20 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20      [catchsql { 
85c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
85d0: 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69  st WHERE artisti
85e0: 64 20 3d 20 35 20 7d 5d 0a 7d 20 7b 31 20 31 20  d = 5 }].} {1 1 
85f0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
8600: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
8610: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
8620: 2d 32 35 2e 36 20 7b 0a 20 20 63 6f 6e 63 61 74  -25.6 {.  concat
8630: 20 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20   \.    [execsql 
8640: 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46  { SELECT rowid F
8650: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
8660: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 37 20  trackartist = 7 
8670: 7d 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63  }]   \.    [catc
8680: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
8690: 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
86a0: 61 72 74 69 73 74 69 64 20 3d 20 37 20 7d 5d 0a  artistid = 7 }].
86b0: 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73  } {0 {}}..do_tes
86c0: 74 20 65 5f 66 6b 65 79 2d 32 35 2e 37 20 7b 0a  t e_fkey-25.7 {.
86d0: 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b    concat \.    [
86e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
86f0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63   rowid FROM trac
8700: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
8710: 69 73 74 20 3d 20 36 20 7d 5d 20 20 20 5c 0a 20  ist = 6 }]   \. 
8720: 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44     [catchsql { D
8730: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
8740: 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64  t WHERE artistid
8750: 20 3d 20 36 20 7d 5d 0a 7d 20 7b 32 20 31 20 7b   = 6 }].} {2 1 {
8760: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
8770: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
8780: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
87d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39  IDENCE-OF: R-479
87e0: 33 36 2d 31 30 30 34 34 20 4f 72 2c 20 6d 6f 72  36-10044 Or, mor
87f0: 65 20 67 65 6e 65 72 61 6c 6c 79 3a 0a 23 20 53  e generally:.# S
8800: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8810: 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57   <child-table> W
8820: 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e  HERE <child-key>
8830: 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76   = :parent_key_v
8840: 61 6c 75 65 0a 23 0a 23 20 54 65 73 74 20 74 68  alue.#.# Test th
8850: 61 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73  at when a row is
8860: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
8870: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f  e parent table o
8880: 66 20 61 6e 20 46 4b 20 0a 23 20 63 6f 6e 73 74  f an FK .# const
8890: 72 61 69 6e 74 2c 20 74 68 65 20 63 68 69 6c 64  raint, the child
88a0: 20 74 61 62 6c 65 20 69 73 20 71 75 65 72 69 65   table is querie
88b0: 64 20 66 6f 72 20 6f 72 70 68 61 6e 65 64 20 72  d for orphaned r
88c0: 6f 77 73 2e 20 54 68 65 0a 23 20 71 75 65 72 79  ows. The.# query
88d0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
88e0: 6f 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20  o:.#.#   SELECT 
88f0: 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c  rowid FROM <chil
8900: 64 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c  d-table> WHERE <
8910: 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61  child-key> = :pa
8920: 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23  rent_key_value.#
8930: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
8940: 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  t when a row is 
8950: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
8960: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20  e parent table, 
8970: 6f 72 20 77 68 65 6e 20 74 68 65 20 0a 23 20 70  or when the .# p
8980: 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73  arent key values
8990: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
89a0: 72 6f 77 20 61 72 65 20 6d 6f 64 69 66 69 65 64  row are modified
89b0: 2c 20 61 20 71 75 65 72 79 20 65 71 75 69 76 61  , a query equiva
89c0: 6c 65 6e 74 0a 23 20 74 6f 20 74 68 65 20 66 6f  lent.# to the fo
89d0: 6c 6c 6f 77 69 6e 67 20 69 73 20 70 6c 61 6e 6e  llowing is plann
89e0: 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  ed. In some case
89f0: 73 20 69 74 20 69 73 20 6e 6f 74 20 65 78 65 63  s it is not exec
8a00: 75 74 65 64 2c 20 62 75 74 20 69 74 0a 23 20 69  uted, but it.# i
8a10: 73 20 61 6c 77 61 79 73 20 70 6c 61 6e 6e 65 64  s always planned
8a20: 2e 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72  ..#.#   SELECT r
8a30: 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64  owid FROM <child
8a40: 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63  -table> WHERE <c
8a50: 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72  hild-key> = :par
8a60: 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a  ent_key_value.#.
8a70: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8a80: 2d 36 31 36 31 36 2d 34 36 37 30 30 20 53 69 6d  -61616-46700 Sim
8a90: 69 6c 61 72 20 71 75 65 72 69 65 73 20 6d 61 79  ilar queries may
8aa0: 20 62 65 20 72 75 6e 20 69 66 20 74 68 65 20 63   be run if the c
8ab0: 6f 6e 74 65 6e 74 0a 23 20 6f 66 20 74 68 65 20  ontent.# of the 
8ac0: 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f  parent key is mo
8ad0: 64 69 66 69 65 64 20 6f 72 20 61 20 6e 65 77 20  dified or a new 
8ae0: 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20  row is inserted 
8af0: 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
8b00: 23 20 74 61 62 6c 65 2e 0a 23 0a 23 0a 64 72 6f  # table..#.#.dro
8b10: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
8b20: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 31  test e_fkey-26.1
8b30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
8b40: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
8b50: 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28  nt(x, y, UNIQUE(
8b60: 79 2c 20 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66 6f  y, x)) }.} {}.fo
8b70: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b  reach {tn sql} {
8b80: 0a 20 20 32 20 7b 20 0a 20 20 20 20 43 52 45 41  .  2 { .    CREA
8b90: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61  TE TABLE child(a
8ba0: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
8bb0: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
8bc0: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 0a  S parent(x, y)).
8bd0: 20 20 7d 0a 20 20 33 20 7b 20 0a 20 20 20 20 43    }.  3 { .    C
8be0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
8bf0: 64 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  d(a, b, FOREIGN 
8c00: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
8c10: 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79  NCES parent(x, y
8c20: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  ));.    CREATE I
8c30: 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20 63  NDEX childi ON c
8c40: 68 69 6c 64 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  hild(a, b);.  }.
8c50: 20 20 34 20 7b 20 0a 20 20 20 20 43 52 45 41 54    4 { .    CREAT
8c60: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c  E TABLE child(a,
8c70: 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
8c80: 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  a, b) REFERENCES
8c90: 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a   parent(x, y));.
8ca0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
8cb0: 45 20 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f  E INDEX childi O
8cc0: 4e 20 63 68 69 6c 64 28 62 2c 20 61 29 3b 0a 20  N child(b, a);. 
8cd0: 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c   }.} {.  execsql
8ce0: 20 24 73 71 6c 0a 0a 20 20 65 78 65 63 73 71 6c   $sql..  execsql
8cf0: 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   {PRAGMA foreign
8d00: 5f 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 73  _keys = OFF}.  s
8d10: 65 74 20 64 65 6c 65 74 65 20 5b 63 6f 6e 63 61  et delete [conca
8d20: 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22  t \.      [eqp "
8d30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
8d40: 6e 74 20 57 48 45 52 45 20 31 22 5d 20 5c 0a 20  nt WHERE 1"] \. 
8d50: 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43       [eqp "SELEC
8d60: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69  T rowid FROM chi
8d70: 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  ld WHERE a = ? A
8d80: 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20  ND b = ?"].  ]. 
8d90: 20 73 65 74 20 75 70 64 61 74 65 20 5b 63 6f 6e   set update [con
8da0: 63 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70  cat \.      [eqp
8db0: 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20   "UPDATE parent 
8dc0: 53 45 54 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20 5c  SET x=?, y=?"] \
8dd0: 0a 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c  .      [eqp "SEL
8de0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63  ECT rowid FROM c
8df0: 68 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f  hild WHERE a = ?
8e00: 20 41 4e 44 20 62 20 3d 20 3f 22 5d 20 5c 0a 20   AND b = ?"] \. 
8e10: 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43       [eqp "SELEC
8e20: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69  T rowid FROM chi
8e30: 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  ld WHERE a = ? A
8e40: 4e 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20  ND b = ?"].  ]. 
8e50: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
8e60: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
8e70: 4f 4e 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65  ON}..  do_test e
8e80: 5f 66 6b 65 79 2d 32 36 2e 24 74 6e 2e 31 20 7b  _fkey-26.$tn.1 {
8e90: 20 65 71 70 20 22 44 45 4c 45 54 45 20 46 52 4f   eqp "DELETE FRO
8ea0: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 31  M parent WHERE 1
8eb0: 22 20 7d 20 24 64 65 6c 65 74 65 0a 20 20 64 6f  " } $delete.  do
8ec0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e  _test e_fkey-26.
8ed0: 24 74 6e 2e 32 20 7b 20 65 71 70 20 22 55 50 44  $tn.2 { eqp "UPD
8ee0: 41 54 45 20 70 61 72 65 6e 74 20 73 65 74 20 78  ATE parent set x
8ef0: 3d 3f 2c 20 79 3d 3f 22 20 7d 20 24 75 70 64 61  =?, y=?" } $upda
8f00: 74 65 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 44  te..  execsql {D
8f10: 52 4f 50 20 54 41 42 4c 45 20 63 68 69 6c 64 7d  ROP TABLE child}
8f20: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
8f70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8f80: 31 34 35 35 33 2d 33 34 30 31 33 0a 23 0a 23 20  14553-34013.#.# 
8f90: 54 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65  Test the example
8fa0: 20 73 63 68 65 6d 61 20 61 74 20 74 68 65 20 65   schema at the e
8fb0: 6e 64 20 6f 66 20 73 65 63 74 69 6f 6e 20 33 2e  nd of section 3.
8fc0: 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20   Also test that 
8fd0: 69 73 0a 23 20 69 73 20 22 65 66 66 69 63 69 65  is.# is "efficie
8fe0: 6e 74 22 2e 20 49 6e 20 74 68 69 73 20 63 61 73  nt". In this cas
8ff0: 65 20 22 65 66 66 69 63 69 65 6e 74 22 20 6d 65  e "efficient" me
9000: 61 6e 73 20 74 68 61 74 20 66 6f 72 65 69 67 6e  ans that foreign
9010: 20 6b 65 79 0a 23 20 72 65 6c 61 74 65 64 20 6f   key.# related o
9020: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  perations on the
9030: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f   parent table do
9040: 20 6e 6f 74 20 70 72 6f 76 6f 6b 65 20 6c 69 6e   not provoke lin
9050: 65 61 72 20 73 63 61 6e 73 2e 0a 23 0a 64 72 6f  ear scans..#.dro
9060: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
9070: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 31  test e_fkey-27.1
9080: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
9090: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
90a0: 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
90b0: 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
90c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
90d0: 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
90e0: 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
90f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9100: 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
9110: 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
9120: 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
9130: 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
9140: 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
9150: 47 45 52 20 52 45 46 45 52 45 4e 43 45 53 20 61  GER REFERENCES a
9160: 72 74 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  rtist.    );.   
9170: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 72   CREATE INDEX tr
9180: 61 63 6b 69 6e 64 65 78 20 4f 4e 20 74 72 61 63  ackindex ON trac
9190: 6b 28 74 72 61 63 6b 61 72 74 69 73 74 29 3b 0a  k(trackartist);.
91a0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
91b0: 20 65 5f 66 6b 65 79 2d 32 37 2e 32 20 7b 0a 20   e_fkey-27.2 {. 
91c0: 20 65 71 70 20 7b 20 49 4e 53 45 52 54 20 49 4e   eqp { INSERT IN
91d0: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
91e0: 28 3f 2c 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64 6f  (?, ?) }.} {}.do
91f0: 5f 64 65 74 61 69 6c 5f 74 65 73 74 20 65 5f 66  _detail_test e_f
9200: 6b 65 79 2d 32 37 2e 33 20 7b 0a 20 20 45 58 50  key-27.3 {.  EXP
9210: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
9220: 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
9230: 54 20 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20  T artistid = ?, 
9240: 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 3f 0a 7d  artistname = ?.}
9250: 20 7b 0a 20 20 7b 53 43 41 4e 20 54 41 42 4c 45   {.  {SCAN TABLE
9260: 20 61 72 74 69 73 74 7d 20 0a 20 20 7b 53 45 41   artist} .  {SEA
9270: 52 43 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20  RCH TABLE track 
9280: 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
9290: 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20  NDEX trackindex 
92a0: 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d  (trackartist=?)}
92b0: 20 0a 20 20 7b 53 45 41 52 43 48 20 54 41 42 4c   .  {SEARCH TABL
92c0: 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f  E track USING CO
92d0: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61  VERING INDEX tra
92e0: 63 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72  ckindex (trackar
92f0: 74 69 73 74 3d 3f 29 7d 0a 7d 0a 64 6f 5f 64 65  tist=?)}.}.do_de
9300: 74 61 69 6c 5f 74 65 73 74 20 65 5f 66 6b 65 79  tail_test e_fkey
9310: 2d 32 37 2e 34 20 7b 0a 20 20 45 58 50 4c 41 49  -27.4 {.  EXPLAI
9320: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c  N QUERY PLAN DEL
9330: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 0a  ETE FROM artist.
9340: 7d 20 7b 0a 20 20 7b 53 43 41 4e 20 54 41 42 4c  } {.  {SCAN TABL
9350: 45 20 61 72 74 69 73 74 7d 20 0a 20 20 7b 53 45  E artist} .  {SE
9360: 41 52 43 48 20 54 41 42 4c 45 20 74 72 61 63 6b  ARCH TABLE track
9370: 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
9380: 49 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78  INDEX trackindex
9390: 20 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29   (trackartist=?)
93a0: 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  }.}..###########
93b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93f0: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 31  .### SECTION 4.1
9400: 3a 20 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72 65  : Composite Fore
9410: 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69  ign Key Constrai
9420: 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23 23 23  nts.############
9430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
9470: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
94c0: 65 63 6b 20 74 68 61 74 20 70 61 72 65 6e 74 20  eck that parent 
94d0: 61 6e 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d  and child keys m
94e0: 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
94f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9500: 6d 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  mns..#.# EVIDENC
9510: 45 2d 4f 46 3a 20 52 2d 34 31 30 36 32 2d 33 34  E-OF: R-41062-34
9520: 34 33 31 20 50 61 72 65 6e 74 20 61 6e 64 20 63  431 Parent and c
9530: 68 69 6c 64 20 6b 65 79 73 20 6d 75 73 74 20 68  hild keys must h
9540: 61 76 65 20 74 68 65 20 73 61 6d 65 0a 23 20 63  ave the same.# c
9550: 61 72 64 69 6e 61 6c 69 74 79 2e 0a 23 0a 66 6f  ardinality..#.fo
9560: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 65 72  reach {tn sql er
9570: 72 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45  r} {.  1 "CREATE
9580: 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45 46 45   TABLE c(jj REFE
9590: 52 45 4e 43 45 53 20 70 28 78 2c 20 79 29 29 22  RENCES p(x, y))"
95a0: 20 0a 20 20 20 20 7b 66 6f 72 65 69 67 6e 20 6b   .    {foreign k
95b0: 65 79 20 6f 6e 20 6a 6a 20 73 68 6f 75 6c 64 20  ey on jj should 
95c0: 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
95d0: 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
95e0: 6c 65 20 70 7d 0a 0a 20 20 32 20 22 43 52 45 41  le p}..  2 "CREA
95f0: 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45  TE TABLE c(jj RE
9600: 46 45 52 45 4e 43 45 53 20 70 28 29 29 22 20 7b  FERENCES p())" {
9610: 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78  near ")": syntax
9620: 20 65 72 72 6f 72 7d 0a 0a 20 20 33 20 22 43 52   error}..  3 "CR
9630: 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 2c  EATE TABLE c(jj,
9640: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 29   FOREIGN KEY(jj)
9650: 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c   REFERENCES p(x,
9660: 20 79 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62   y))" .    {numb
9670: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9680: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
9690: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
96a0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
96b0: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
96c0: 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 34 20  ced table}..  4 
96d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  "CREATE TABLE c(
96e0: 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  jj, FOREIGN KEY(
96f0: 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  jj) REFERENCES p
9700: 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20  ())" .    {near 
9710: 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ")": syntax erro
9720: 72 7d 0a 0a 20 20 35 20 22 43 52 45 41 54 45 20  r}..  5 "CREATE 
9730: 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20  TABLE c(ii, jj, 
9740: 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20  FOREIGN KEY(jj, 
9750: 69 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  ii) REFERENCES p
9760: 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20  ())" .    {near 
9770: 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ")": syntax erro
9780: 72 7d 0a 0a 20 20 36 20 22 43 52 45 41 54 45 20  r}..  6 "CREATE 
9790: 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20  TABLE c(ii, jj, 
97a0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20  FOREIGN KEY(jj, 
97b0: 69 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  ii) REFERENCES p
97c0: 28 78 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62  (x))" .    {numb
97d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
97e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
97f0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
9800: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9810: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
9820: 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 37 20  ced table}..  7 
9830: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  "CREATE TABLE c(
9840: 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20  ii, jj, FOREIGN 
9850: 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46 45  KEY(jj, ii) REFE
9860: 52 45 4e 43 45 53 20 70 28 78 2c 79 2c 7a 29 29  RENCES p(x,y,z))
9870: 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f  " .    {number o
9880: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
9890: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
98a0: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
98b0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
98c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
98d0: 74 61 62 6c 65 7d 0a 7d 20 7b 0a 20 20 64 72 6f  table}.} {.  dro
98e0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64  p_all_tables.  d
98f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38  o_test e_fkey-28
9900: 2e 24 74 6e 20 5b 6c 69 73 74 20 63 61 74 63 68  .$tn [list catch
9910: 73 71 6c 20 24 73 71 6c 5d 20 5b 6c 69 73 74 20  sql $sql] [list 
9920: 31 20 24 65 72 72 5d 0a 7d 0a 64 6f 5f 74 65 73  1 $err].}.do_tes
9930: 74 20 65 5f 66 6b 65 79 2d 32 38 2e 38 20 7b 0a  t e_fkey-28.8 {.
9940: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
9950: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
9960: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
9970: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
9980: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9990: 45 20 63 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  E c(a, b, FOREIG
99a0: 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52  N KEY(a,b) REFER
99b0: 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a 20 20  ENCES p);.  }.  
99c0: 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45  catchsql {DELETE
99d0: 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b 66   FROM p}.} {1 {f
99e0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
99f0: 74 63 68 20 2d 20 22 63 22 20 72 65 66 65 72 65  tch - "c" refere
9a00: 6e 63 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74  ncing "p"}}.do_t
9a10: 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 39 20  est e_fkey-28.9 
9a20: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
9a30: 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  les.  execsql {.
9a40: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9a50: 20 70 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59   p(x, y, PRIMARY
9a60: 20 4b 45 59 28 78 2c 79 29 29 3b 0a 20 20 20 20   KEY(x,y));.    
9a70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 61  CREATE TABLE c(a
9a80: 20 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a   REFERENCES p);.
9a90: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
9aa0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d  DELETE FROM p}.}
9ab0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
9ac0: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 22 20   mismatch - "c" 
9ad0: 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d  referencing "p"}
9ae0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
9af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9b30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9b40: 32 34 36 37 36 2d 30 39 38 35 39 0a 23 0a 23 20  24676-09859.#.# 
9b50: 54 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65  Test the example
9b60: 20 73 63 68 65 6d 61 20 69 6e 20 74 68 65 20 22   schema in the "
9b70: 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72 65 69 67  Composite Foreig
9b80: 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74  n Key Constraint
9b90: 73 22 20 0a 23 20 73 65 63 74 69 6f 6e 2e 0a 23  s" .# section..#
9ba0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9bb0: 32 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  29.1 {.  execsql
9bc0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
9bd0: 42 4c 45 20 61 6c 62 75 6d 28 0a 20 20 20 20 20  BLE album(.     
9be0: 20 61 6c 62 75 6d 61 72 74 69 73 74 20 54 45 58   albumartist TEX
9bf0: 54 2c 0a 20 20 20 20 20 20 61 6c 62 75 6d 6e 61  T,.      albumna
9c00: 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61  me TEXT,.      a
9c10: 6c 62 75 6d 63 6f 76 65 72 20 42 49 4e 41 52 59  lbumcover BINARY
9c20: 2c 0a 20 20 20 20 20 20 50 52 49 4d 41 52 59 20  ,.      PRIMARY 
9c30: 4b 45 59 28 61 6c 62 75 6d 61 72 74 69 73 74 2c  KEY(albumartist,
9c40: 20 61 6c 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20   albumname).    
9c50: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
9c60: 42 4c 45 20 73 6f 6e 67 28 0a 20 20 20 20 20 20  BLE song(.      
9c70: 73 6f 6e 67 69 64 20 49 4e 54 45 47 45 52 2c 0a  songid INTEGER,.
9c80: 20 20 20 20 20 20 73 6f 6e 67 61 72 74 69 73 74        songartist
9c90: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e   TEXT,.      son
9ca0: 67 61 6c 62 75 6d 20 54 45 58 54 2c 0a 20 20 20  galbum TEXT,.   
9cb0: 20 20 20 73 6f 6e 67 6e 61 6d 65 20 54 45 58 54     songname TEXT
9cc0: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
9cd0: 4b 45 59 28 73 6f 6e 67 61 72 74 69 73 74 2c 20  KEY(songartist, 
9ce0: 73 6f 6e 67 61 6c 62 75 6d 29 20 52 45 46 45 52  songalbum) REFER
9cf0: 45 4e 43 45 53 20 61 6c 62 75 6d 28 61 6c 62 75  ENCES album(albu
9d00: 6d 61 72 74 69 73 74 2c 61 6c 62 75 6d 6e 61 6d  martist,albumnam
9d10: 65 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  e).    );.  }.} 
9d20: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
9d30: 65 79 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63  ey-29.2 {.  exec
9d40: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
9d50: 20 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41 4c 55   INTO album VALU
9d60: 45 53 28 27 45 6c 76 69 73 20 50 72 65 73 6c 65  ES('Elvis Presle
9d70: 79 27 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72  y', 'Elvis'' Chr
9d80: 69 73 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 4e  istmas Album', N
9d90: 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
9da0: 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45   INTO song VALUE
9db0: 53 28 0a 20 20 20 20 20 20 31 2c 20 27 45 6c 76  S(.      1, 'Elv
9dc0: 69 73 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c  is Presley', 'El
9dd0: 76 69 73 27 27 20 43 68 72 69 73 74 6d 61 73 20  vis'' Christmas 
9de0: 41 6c 62 75 6d 27 2c 20 27 48 65 72 65 20 43 6f  Album', 'Here Co
9df0: 6d 65 73 20 53 61 6e 74 61 20 43 6c 61 75 73 65  mes Santa Clause
9e00: 27 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  '.    );.  }.} {
9e10: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
9e20: 2d 32 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -29.3 {.  catchs
9e30: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
9e40: 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53  INTO song VALUES
9e50: 28 32 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c  (2, 'Elvis Presl
9e60: 65 79 27 2c 20 27 45 6c 76 69 73 20 49 73 20 42  ey', 'Elvis Is B
9e70: 61 63 6b 21 27 2c 20 27 46 65 76 65 72 27 29 3b  ack!', 'Fever');
9e80: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  .  }.} {1 {FOREI
9e90: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
9ea0: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d  t failed}}...#--
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
9f00: 43 45 2d 4f 46 3a 20 52 2d 33 33 36 32 36 2d 34  CE-OF: R-33626-4
9f10: 38 34 31 38 20 49 6e 20 53 51 4c 69 74 65 2c 20  8418 In SQLite, 
9f20: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68  if any of the ch
9f30: 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a  ild key columns.
9f40: 23 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20  # (in this case 
9f50: 73 6f 6e 67 61 72 74 69 73 74 20 61 6e 64 20 73  songartist and s
9f60: 6f 6e 67 61 6c 62 75 6d 29 20 61 72 65 20 4e 55  ongalbum) are NU
9f70: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  LL, then there i
9f80: 73 20 6e 6f 0a 23 20 72 65 71 75 69 72 65 6d 65  s no.# requireme
9f90: 6e 74 20 66 6f 72 20 61 20 63 6f 72 72 65 73 70  nt for a corresp
9fa0: 6f 6e 64 69 6e 67 20 72 6f 77 20 69 6e 20 74 68  onding row in th
9fb0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a  e parent table..
9fc0: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
9fd0: 2d 33 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -30.1 {.  execsq
9fe0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
9ff0: 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28  NTO song VALUES(
a000: 32 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65  2, 'Elvis Presle
a010: 79 27 2c 20 4e 55 4c 4c 2c 20 27 46 65 76 65 72  y', NULL, 'Fever
a020: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
a030: 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28  NTO song VALUES(
a040: 33 2c 20 4e 55 4c 4c 2c 20 27 45 6c 76 69 73 20  3, NULL, 'Elvis 
a050: 49 73 20 42 61 63 6b 27 2c 20 27 53 6f 6c 64 69  Is Back', 'Soldi
a060: 65 72 20 42 6f 79 27 29 3b 0a 20 20 7d 0a 7d 20  er Boy');.  }.} 
a070: 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  {}..############
a080: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a090: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a0b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
a0c0: 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 32 3a  ### SECTION 4.2:
a0d0: 20 44 65 66 65 72 72 65 64 20 46 6f 72 65 69 67   Deferred Foreig
a0e0: 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74  n Key Constraint
a0f0: 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
a100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a110: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a120: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a130: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
a140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
a190: 20 74 68 61 74 20 69 66 20 61 20 73 74 61 74 65   that if a state
a1a0: 6d 65 6e 74 20 76 69 6f 6c 61 74 65 73 20 61 6e  ment violates an
a1b0: 20 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63 6f   immediate FK co
a1c0: 6e 73 74 72 61 69 6e 74 2c 20 61 6e 64 20 74 68  nstraint, and th
a1d0: 65 0a 23 20 64 61 74 61 62 61 73 65 20 64 6f 65  e.# database doe
a1e0: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  s not satisfy th
a1f0: 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  e FK constraint 
a200: 6f 6e 63 65 20 61 6c 6c 20 65 66 66 65 63 74 73  once all effects
a210: 20 6f 66 20 74 68 65 0a 23 20 73 74 61 74 65 6d   of the.# statem
a220: 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 61 70  ent have been ap
a230: 70 6c 69 65 64 2c 20 61 6e 20 65 72 72 6f 72 20  plied, an error 
a240: 69 73 20 72 65 70 6f 72 74 65 64 20 61 6e 64 20  is reported and 
a250: 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 0a 23  the effects of.#
a260: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
a270: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20  olled back..#.# 
a280: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
a290: 39 33 32 33 2d 33 30 34 37 30 20 49 66 20 61 20  9323-30470 If a 
a2a0: 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64 69 66 69  statement modifi
a2b0: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
a2c0: 6f 66 20 74 68 65 0a 23 20 64 61 74 61 62 61 73  of the.# databas
a2d0: 65 20 73 6f 20 74 68 61 74 20 61 6e 20 69 6d 6d  e so that an imm
a2e0: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
a2f0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ey constraint is
a300: 20 69 6e 20 76 69 6f 6c 61 74 69 6f 6e 0a 23 20   in violation.# 
a310: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
a320: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
a330: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73   an exception is
a340: 20 74 68 72 6f 77 6e 20 61 6e 64 20 74 68 65 0a   thrown and the.
a350: 23 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65  # effects of the
a360: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 72   statement are r
a370: 65 76 65 72 74 65 64 2e 0a 23 0a 64 72 6f 70 5f  everted..#.drop_
a380: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
a390: 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 31 20 7b  st e_fkey-31.1 {
a3a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a3b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 69   CREATE TABLE ki
a3c0: 6e 67 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59  ng(a, b, PRIMARY
a3d0: 20 4b 45 59 28 61 29 29 3b 0a 20 20 20 20 43 52   KEY(a));.    CR
a3e0: 45 41 54 45 20 54 41 42 4c 45 20 70 72 69 6e 63  EATE TABLE princ
a3f0: 65 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 6b  e(c REFERENCES k
a400: 69 6e 67 2c 20 64 29 3b 0a 20 20 7d 0a 7d 20 7b  ing, d);.  }.} {
a410: 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }..do_test e_fke
a420: 79 2d 33 31 2e 32 20 7b 0a 20 20 23 20 45 78 65  y-31.2 {.  # Exe
a430: 63 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74  cute a statement
a440: 20 74 68 61 74 20 76 69 6f 6c 61 74 65 73 20 74   that violates t
a450: 68 65 20 69 6d 6d 65 64 69 61 74 65 20 46 4b 20  he immediate FK 
a460: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 63 61  constraint..  ca
a470: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
a480: 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c 55  INTO prince VALU
a490: 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20  ES(1, 2) }.} {1 
a4a0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
a4b0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
a4c0: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
a4d0: 2d 33 31 2e 33 20 7b 0a 20 20 23 20 54 68 69 73  -31.3 {.  # This
a4e0: 20 74 69 6d 65 2c 20 75 73 65 20 61 20 74 72 69   time, use a tri
a4f0: 67 67 65 72 20 74 6f 20 66 69 78 20 74 68 65 20  gger to fix the 
a500: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
a510: 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  tion before the.
a520: 20 20 23 20 73 74 61 74 65 6d 65 6e 74 20 68 61    # statement ha
a530: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
a540: 74 69 6e 67 2e 20 54 68 65 6e 20 65 78 65 63 75  ting. Then execu
a550: 74 65 20 74 68 65 20 73 61 6d 65 20 73 74 61 74  te the same stat
a560: 65 6d 65 6e 74 20 61 73 0a 20 20 23 20 69 6e 20  ement as.  # in 
a570: 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73  the previous tes
a580: 74 20 63 61 73 65 2e 20 54 68 69 73 20 74 69 6d  t case. This tim
a590: 65 2c 20 6e 6f 20 65 72 72 6f 72 2e 0a 20 20 65  e, no error..  e
a5a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
a5b0: 41 54 45 20 54 52 49 47 47 45 52 20 6b 74 20 41  ATE TRIGGER kt A
a5c0: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 70  FTER INSERT ON p
a5d0: 72 69 6e 63 65 20 57 48 45 4e 0a 20 20 20 20 20  rince WHEN.     
a5e0: 20 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c   NOT EXISTS (SEL
a5f0: 45 43 54 20 61 20 46 52 4f 4d 20 6b 69 6e 67 20  ECT a FROM king 
a600: 57 48 45 52 45 20 61 20 3d 20 6e 65 77 2e 63 29  WHERE a = new.c)
a610: 0a 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20  .    BEGIN.     
a620: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 69 6e   INSERT INTO kin
a630: 67 20 56 41 4c 55 45 53 28 6e 65 77 2e 63 2c 20  g VALUES(new.c, 
a640: 4e 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 0a 20  NULL);.    END. 
a650: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
a660: 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63  NSERT INTO princ
a670: 65 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d  e VALUES(1, 2) }
a680: 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68  .} {}..# Test th
a690: 61 74 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 73  at operating ins
a6a0: 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ide a transactio
a6b0: 6e 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  n makes no diffe
a6c0: 72 65 6e 63 65 20 74 6f 20 0a 23 20 69 6d 6d 65  rence to .# imme
a6d0: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
a6e0: 20 76 69 6f 6c 61 74 69 6f 6e 20 68 61 6e 64 6c   violation handl
a6f0: 69 6e 67 2e 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ing..do_test e_f
a700: 6b 65 79 2d 33 31 2e 34 20 7b 0a 20 20 65 78 65  key-31.4 {.  exe
a710: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
a720: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a730: 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28  O prince VALUES(
a740: 32 2c 20 33 29 3b 0a 20 20 20 20 44 52 4f 50 20  2, 3);.    DROP 
a750: 54 52 49 47 47 45 52 20 6b 74 3b 0a 20 20 7d 0a  TRIGGER kt;.  }.
a760: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
a770: 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20  ERT INTO prince 
a780: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 7d  VALUES(3, 4) }.}
a790: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
a7a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
a7b0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
a7c0: 6b 65 79 2d 33 31 2e 35 20 7b 0a 20 20 65 78 65  key-31.5 {.  exe
a7d0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49  csql {.    COMMI
a7e0: 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  T;.    SELECT * 
a7f0: 46 52 4f 4d 20 6b 69 6e 67 3b 0a 20 20 7d 0a 7d  FROM king;.  }.}
a800: 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 0a 23 2d   {1 {} 2 {}}..#-
a810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a850: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
a860: 74 68 61 74 20 69 66 20 61 20 64 65 66 65 72 72  that if a deferr
a870: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ed constraint is
a880: 20 76 69 6f 6c 61 74 65 64 20 77 69 74 68 69 6e   violated within
a890: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
a8a0: 23 20 6e 6f 74 68 69 6e 67 20 68 61 70 70 65 6e  # nothing happen
a8b0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  s immediately an
a8c0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  d the database i
a8d0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  s allowed to per
a8e0: 73 69 73 74 0a 23 20 69 6e 20 61 20 73 74 61 74  sist.# in a stat
a8f0: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
a900: 73 61 74 69 73 66 79 20 74 68 65 20 46 4b 20 63  satisfy the FK c
a910: 6f 6e 73 74 72 61 69 6e 74 2e 20 48 6f 77 65 76  onstraint. Howev
a920: 65 72 20 61 74 74 65 6d 70 74 73 0a 23 20 74 6f  er attempts.# to
a930: 20 43 4f 4d 4d 49 54 20 74 68 65 20 74 72 61 6e   COMMIT the tran
a940: 73 61 63 74 69 6f 6e 20 66 61 69 6c 20 75 6e 74  saction fail unt
a950: 69 6c 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72  il the FK constr
a960: 61 69 6e 74 20 69 73 20 73 61 74 69 73 66 69 65  aint is satisfie
a970: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
a980: 4f 46 3a 20 52 2d 34 39 31 37 38 2d 32 31 33 35  OF: R-49178-2135
a990: 38 20 42 79 20 63 6f 6e 74 72 61 73 74 2c 20 69  8 By contrast, i
a9a0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f  f a statement mo
a9b0: 64 69 66 69 65 73 20 74 68 65 0a 23 20 63 6f 6e  difies the.# con
a9c0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
a9d0: 61 62 61 73 65 20 73 75 63 68 20 74 68 61 74 20  abase such that 
a9e0: 61 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  a deferred forei
a9f0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
aa00: 74 0a 23 20 69 73 20 76 69 6f 6c 61 74 65 64 2c  t.# is violated,
aa10: 20 74 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69   the violation i
aa20: 73 20 6e 6f 74 20 72 65 70 6f 72 74 65 64 20 69  s not reported i
aa30: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 23 0a 23 20  mmediately..#.# 
aa40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
aa50: 39 36 39 32 2d 31 32 34 38 38 20 44 65 66 65 72  9692-12488 Defer
aa60: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
aa70: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
aa80: 6e 6f 74 0a 23 20 63 68 65 63 6b 65 64 20 75 6e  not.# checked un
aa90: 74 69 6c 20 74 68 65 20 74 72 61 6e 73 61 63 74  til the transact
aaa0: 69 6f 6e 20 74 72 69 65 73 20 74 6f 20 43 4f 4d  ion tries to COM
aab0: 4d 49 54 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  MIT..#.# EVIDENC
aac0: 45 2d 4f 46 3a 20 52 2d 35 35 31 34 37 2d 34 37  E-OF: R-55147-47
aad0: 36 36 34 20 46 6f 72 20 61 73 20 6c 6f 6e 67 20  664 For as long 
aae0: 61 73 20 74 68 65 20 75 73 65 72 20 68 61 73 20  as the user has 
aaf0: 61 6e 20 6f 70 65 6e 0a 23 20 74 72 61 6e 73 61  an open.# transa
ab00: 63 74 69 6f 6e 2c 20 74 68 65 20 64 61 74 61 62  ction, the datab
ab10: 61 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ase is allowed t
ab20: 6f 20 65 78 69 73 74 20 69 6e 20 61 20 73 74 61  o exist in a sta
ab30: 74 65 20 74 68 61 74 20 76 69 6f 6c 61 74 65 73  te that violates
ab40: 0a 23 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66  .# any number of
ab50: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
ab60: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
ab70: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
ab80: 4f 46 3a 20 52 2d 32 39 36 30 34 2d 33 30 33 39  OF: R-29604-3039
ab90: 35 20 48 6f 77 65 76 65 72 2c 20 43 4f 4d 4d 49  5 However, COMMI
aba0: 54 20 77 69 6c 6c 20 66 61 69 6c 20 61 73 20 6c  T will fail as l
abb0: 6f 6e 67 20 61 73 0a 23 20 66 6f 72 65 69 67 6e  ong as.# foreign
abc0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
abd0: 20 72 65 6d 61 69 6e 20 69 6e 20 76 69 6f 6c 61   remain in viola
abe0: 74 69 6f 6e 2e 0a 23 0a 70 72 6f 63 20 74 65 73  tion..#.proc tes
abf0: 74 5f 65 66 6b 65 79 5f 33 34 20 7b 74 6e 20 69  t_efkey_34 {tn i
ac00: 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20  sError sql} {.  
ac10: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
ac20: 32 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63  2.$tn ".    catc
ac30: 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20  hsql {$sql}.  " 
ac40: 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20  [lindex {{0 {}} 
ac50: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
ac60: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ac70: 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d  d}}} $isError].}
ac80: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
ac90: 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  ..test_efkey_34 
aca0: 20 31 20 30 20 7b 0a 20 20 43 52 45 41 54 45 20   1 0 {.  CREATE 
acb0: 54 41 42 4c 45 20 6c 6c 28 6b 20 50 52 49 4d 41  TABLE ll(k PRIMA
acc0: 52 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54  RY KEY);.  CREAT
acd0: 45 20 54 41 42 4c 45 20 6b 6b 28 63 20 52 45 46  E TABLE kk(c REF
ace0: 45 52 45 4e 43 45 53 20 6c 6c 20 44 45 46 45 52  ERENCES ll DEFER
acf0: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
ad00: 44 45 46 45 52 52 45 44 29 3b 0a 7d 0a 74 65 73  DEFERRED);.}.tes
ad10: 74 5f 65 66 6b 65 79 5f 33 34 20 20 32 20 30 20  t_efkey_34  2 0 
ad20: 22 42 45 47 49 4e 22 0a 74 65 73 74 5f 65 66 6b  "BEGIN".test_efk
ad30: 65 79 5f 33 34 20 20 33 20 30 20 20 20 22 49 4e  ey_34  3 0   "IN
ad40: 53 45 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c  SERT INTO kk VAL
ad50: 55 45 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b  UES(5)".test_efk
ad60: 65 79 5f 33 34 20 20 34 20 30 20 20 20 22 49 4e  ey_34  4 0   "IN
ad70: 53 45 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c  SERT INTO kk 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 35 20 31 20 22 43 4f 4d  key_34  5 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 36 20 30 20 20 20 22 49 4e 53 45 52  34  6 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 31 30 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  (10)".test_efkey
ade0: 5f 33 34 20 20 37 20 31 20 22 43 4f 4d 4d 49 54  _34  7 1 "COMMIT
adf0: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  ".test_efkey_34 
ae00: 20 38 20 30 20 20 20 22 49 4e 53 45 52 54 20 49   8 0   "INSERT I
ae10: 4e 54 4f 20 6c 6c 20 56 41 4c 55 45 53 28 35 29  NTO ll VALUES(5)
ae20: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  ".test_efkey_34 
ae30: 20 39 20 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 23   9 0 "COMMIT"..#
ae40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e  ---------.# When
ae90: 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 69 6e 73   not running ins
aea0: 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ide a transactio
aeb0: 6e 2c 20 61 20 64 65 66 65 72 72 65 64 20 63 6f  n, a deferred co
aec0: 6e 73 74 72 61 69 6e 74 20 69 73 20 73 69 6d 69  nstraint is simi
aed0: 6c 61 72 0a 23 20 74 6f 20 61 6e 20 69 6d 6d 65  lar.# to an imme
aee0: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
aef0: 20 28 76 69 6f 6c 61 74 69 6f 6e 73 20 61 72 65   (violations are
af00: 20 72 65 70 6f 72 74 65 64 20 69 6d 6d 65 64 69   reported immedi
af10: 61 74 65 6c 79 29 2e 0a 23 0a 23 20 45 56 49 44  ately)..#.# EVID
af20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 38 34 34  ENCE-OF: R-56844
af30: 2d 36 31 37 30 35 20 49 66 20 74 68 65 20 63 75  -61705 If the cu
af40: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
af50: 69 73 20 6e 6f 74 20 69 6e 73 69 64 65 20 61 6e  is not inside an
af60: 0a 23 20 65 78 70 6c 69 63 69 74 20 74 72 61 6e  .# explicit tran
af70: 73 61 63 74 69 6f 6e 20 28 61 20 42 45 47 49 4e  saction (a BEGIN
af80: 2f 43 4f 4d 4d 49 54 2f 52 4f 4c 4c 42 41 43 4b  /COMMIT/ROLLBACK
af90: 20 62 6c 6f 63 6b 29 2c 20 74 68 65 6e 20 61 6e   block), then an
afa0: 20 69 6d 70 6c 69 63 69 74 0a 23 20 74 72 61 6e   implicit.# tran
afb0: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
afc0: 74 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  tted as soon as 
afd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
afe0: 73 20 66 69 6e 69 73 68 65 64 0a 23 20 65 78 65  s finished.# exe
aff0: 63 75 74 69 6e 67 2e 20 49 6e 20 74 68 69 73 20  cuting. In this 
b000: 63 61 73 65 20 64 65 66 65 72 72 65 64 20 63 6f  case deferred co
b010: 6e 73 74 72 61 69 6e 74 73 20 62 65 68 61 76 65  nstraints behave
b020: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 23 20 69   the same as.# i
b030: 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61  mmediate constra
b040: 69 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  ints..#.drop_all
b050: 5f 74 61 62 6c 65 73 0a 70 72 6f 63 20 74 65 73  _tables.proc tes
b060: 74 5f 65 66 6b 65 79 5f 33 35 20 7b 74 6e 20 69  t_efkey_35 {tn i
b070: 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20  sError sql} {.  
b080: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
b090: 33 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63  3.$tn ".    catc
b0a0: 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20  hsql {$sql}.  " 
b0b0: 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20  [lindex {{0 {}} 
b0c0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
b0d0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
b0e0: 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d  d}}} $isError].}
b0f0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
b100: 33 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  33.1 {.  execsql
b110: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
b120: 42 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79 29  BLE parent(x, y)
b130: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
b140: 51 55 45 20 49 4e 44 45 58 20 70 69 20 4f 4e 20  QUE INDEX pi ON 
b150: 70 61 72 65 6e 74 28 78 2c 20 79 29 3b 0a 20 20  parent(x, y);.  
b160: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b170: 68 69 6c 64 28 61 2c 20 62 2c 0a 20 20 20 20 20  hild(a, b,.     
b180: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b190: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  b) REFERENCES pa
b1a0: 72 65 6e 74 28 78 2c 20 79 29 20 44 45 46 45 52  rent(x, y) DEFER
b1b0: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
b1c0: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
b1d0: 20 20 7d 0a 7d 20 7b 7d 0a 74 65 73 74 5f 65 66    }.} {}.test_ef
b1e0: 6b 65 79 5f 33 35 20 32 20 31 20 22 49 4e 53 45  key_35 2 1 "INSE
b1f0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56  RT INTO child  V
b200: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 22  ALUES('x', 'y')"
b210: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 33  .test_efkey_35 3
b220: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
b230: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 78  parent VALUES('x
b240: 27 2c 20 27 79 27 29 22 0a 74 65 73 74 5f 65 66  ', 'y')".test_ef
b250: 6b 65 79 5f 33 35 20 34 20 30 20 22 49 4e 53 45  key_35 4 0 "INSE
b260: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56  RT INTO child  V
b270: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 22  ALUES('x', 'y')"
b280: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
b290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
b2d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
b2e0: 32 37 38 32 2d 36 31 38 34 31 0a 23 0a 23 20 54  2782-61841.#.# T
b2f0: 65 73 74 20 74 68 61 74 20 61 6e 20 46 4b 20 63  est that an FK c
b300: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 64  onstraint is mad
b310: 65 20 64 65 66 65 72 72 65 64 20 62 79 20 61 64  e deferred by ad
b320: 64 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ding the followi
b330: 6e 67 0a 23 20 74 6f 20 74 68 65 20 64 65 66 69  ng.# to the defi
b340: 6e 69 74 69 6f 6e 3a 0a 23 0a 23 20 20 20 44 45  nition:.#.#   DE
b350: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
b360: 4c 59 20 44 45 46 45 52 52 45 44 0a 23 0a 23 20  LY DEFERRED.#.# 
b370: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
b380: 39 30 30 35 2d 32 38 37 39 31 0a 23 0a 23 20 41  9005-28791.#.# A
b390: 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 61 64  lso test that ad
b3a0: 64 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  ding any of the 
b3b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 61 20 66  following to a f
b3c0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
b3d0: 69 74 69 6f 6e 20 0a 23 20 6d 61 6b 65 73 20 74  ition .# makes t
b3e0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 49 4d  he constraint IM
b3f0: 4d 45 44 49 41 54 45 3a 0a 23 0a 23 20 20 20 4e  MEDIATE:.#.#   N
b400: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  OT DEFERRABLE IN
b410: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b420: 0a 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41  .#   NOT DEFERRA
b430: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  BLE INITIALLY IM
b440: 4d 45 44 49 41 54 45 0a 23 20 20 20 4e 4f 54 20  MEDIATE.#   NOT 
b450: 44 45 46 45 52 52 41 42 4c 45 0a 23 20 20 20 44  DEFERRABLE.#   D
b460: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
b470: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20  LLY IMMEDIATE.# 
b480: 20 20 44 45 46 45 52 52 41 42 4c 45 0a 23 0a 23    DEFERRABLE.#.#
b490: 20 46 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72   Foreign keys ar
b4a0: 65 20 49 4d 4d 45 44 49 41 54 45 20 62 79 20 64  e IMMEDIATE by d
b4b0: 65 66 61 75 6c 74 20 28 69 66 20 74 68 65 72 65  efault (if there
b4c0: 20 69 73 20 6e 6f 20 44 45 46 45 52 52 41 42 4c   is no DEFERRABL
b4d0: 45 20 6f 72 20 4e 4f 54 0a 23 20 44 45 46 45 52  E or NOT.# DEFER
b4e0: 52 41 42 4c 45 20 63 6c 61 75 73 65 29 2e 0a 23  RABLE clause)..#
b4f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b500: 52 2d 33 35 32 39 30 2d 31 36 34 36 30 20 46 6f  R-35290-16460 Fo
b510: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
b520: 61 69 6e 74 73 20 61 72 65 20 69 6d 6d 65 64 69  aints are immedi
b530: 61 74 65 20 62 79 0a 23 20 64 65 66 61 75 6c 74  ate by.# default
b540: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
b550: 46 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  F: R-30323-21917
b560: 20 45 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65   Each foreign ke
b570: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  y constraint in 
b580: 53 51 4c 69 74 65 20 69 73 0a 23 20 63 6c 61 73  SQLite is.# clas
b590: 73 69 66 69 65 64 20 61 73 20 65 69 74 68 65 72  sified as either
b5a0: 20 69 6d 6d 65 64 69 61 74 65 20 6f 72 20 64 65   immediate or de
b5b0: 66 65 72 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  ferred..#.drop_a
b5c0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
b5d0: 74 20 65 5f 66 6b 65 79 2d 33 34 2e 31 20 7b 0a  t e_fkey-34.1 {.
b5e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b5f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
b600: 65 6e 74 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49  ent(x, y, z, PRI
b610: 4d 41 52 59 20 4b 45 59 28 78 2c 79 2c 7a 29 29  MARY KEY(x,y,z))
b620: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b630: 4c 45 20 63 31 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c1(a, b, c,. 
b640: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b650: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b660: 4e 43 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20  NCES parent NOT 
b670: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b680: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
b690: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
b6a0: 54 41 42 4c 45 20 63 32 28 61 2c 20 62 2c 20 63  TABLE c2(a, b, c
b6b0: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
b6c0: 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46  KEY(a, b, c) REF
b6d0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4e  ERENCES parent N
b6e0: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  OT DEFERRABLE IN
b6f0: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b700: 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  E.    );.    CRE
b710: 41 54 45 20 54 41 42 4c 45 20 63 33 28 61 2c 20  ATE TABLE c3(a, 
b720: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b730: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b740: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b750: 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c  nt NOT DEFERRABL
b760: 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  E.    );.    CRE
b770: 41 54 45 20 54 41 42 4c 45 20 63 34 28 61 2c 20  ATE TABLE c4(a, 
b780: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b790: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b7a0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b7b0: 6e 74 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  nt DEFERRABLE IN
b7c0: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
b7d0: 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  E.    );.    CRE
b7e0: 41 54 45 20 54 41 42 4c 45 20 63 35 28 61 2c 20  ATE TABLE c5(a, 
b7f0: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b800: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b810: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b820: 6e 74 20 44 45 46 45 52 52 41 42 4c 45 0a 20 20  nt DEFERRABLE.  
b830: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
b840: 54 41 42 4c 45 20 63 36 28 61 2c 20 62 2c 20 63  TABLE c6(a, b, c
b850: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
b860: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b870: 53 20 70 61 72 65 6e 74 29 3b 0a 0a 20 20 20 20  S parent);..    
b880: 2d 2d 20 54 68 69 73 20 46 4b 20 63 6f 6e 73 74  -- This FK const
b890: 72 61 69 6e 74 20 69 73 20 74 68 65 20 6f 6e 6c  raint is the onl
b8a0: 79 20 64 65 66 65 72 72 61 62 6c 65 20 6f 6e 65  y deferrable one
b8b0: 2e 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
b8c0: 4c 45 20 63 37 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c7(a, b, c,. 
b8d0: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b8e0: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b8f0: 4e 43 45 53 20 70 61 72 65 6e 74 20 44 45 46 45  NCES parent DEFE
b900: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b910: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
b920: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
b930: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
b940: 27 61 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a  'a', 'b', 'c');.
b950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b960: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 64  parent VALUES('d
b970: 27 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20  ', 'e', 'f');.  
b980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
b990: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 67 27 2c  rent VALUES('g',
b9a0: 20 27 68 27 2c 20 27 69 27 29 3b 0a 20 20 20 20   'h', 'i');.    
b9b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
b9c0: 6e 74 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27  nt VALUES('j', '
b9d0: 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20 49 4e  k', 'l');.    IN
b9e0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
b9f0: 20 56 41 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27   VALUES('m', 'n'
ba00: 2c 20 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'o');.    INSE
ba10: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
ba20: 41 4c 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20  ALUES('p', 'q', 
ba30: 27 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'r');.    INSERT
ba40: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
ba50: 55 45 53 28 27 73 27 2c 20 27 74 27 2c 20 27 75  UES('s', 't', 'u
ba60: 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  ');..    INSERT 
ba70: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27  INTO c1 VALUES('
ba80: 61 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20  a', 'b', 'c');. 
ba90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
baa0: 32 20 56 41 4c 55 45 53 28 27 64 27 2c 20 27 65  2 VALUES('d', 'e
bab0: 27 2c 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'f');.    INS
bac0: 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
bad0: 45 53 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27  ES('g', 'h', 'i'
bae0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
baf0: 54 4f 20 63 34 20 56 41 4c 55 45 53 28 27 6a 27  TO c4 VALUES('j'
bb00: 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20  , 'k', 'l');.   
bb10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 35 20   INSERT INTO c5 
bb20: 56 41 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c  VALUES('m', 'n',
bb30: 20 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'o');.    INSER
bb40: 54 20 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53  T INTO c6 VALUES
bb50: 28 27 70 27 2c 20 27 71 27 2c 20 27 72 27 29 3b  ('p', 'q', 'r');
bb60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
bb70: 20 63 37 20 56 41 4c 55 45 53 28 27 73 27 2c 20   c7 VALUES('s', 
bb80: 27 74 27 2c 20 27 75 27 29 3b 0a 20 20 7d 0a 7d  't', 'u');.  }.}
bb90: 20 7b 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65   {}..proc test_e
bba0: 66 6b 65 79 5f 32 39 20 7b 74 6e 20 73 71 6c 20  fkey_29 {tn sql 
bbb0: 69 73 45 72 72 6f 72 7d 20 7b 0a 20 20 64 6f 5f  isError} {.  do_
bbc0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 34 2e 24  test e_fkey-34.$
bbd0: 74 6e 20 22 63 61 74 63 68 73 71 6c 20 7b 24 73  tn "catchsql {$s
bbe0: 71 6c 7d 22 20 5b 0a 20 20 20 20 6c 69 6e 64 65  ql}" [.    linde
bbf0: 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f  x {{0 {}} {1 {FO
bc00: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
bc10: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24  aint failed}}} $
bc20: 69 73 45 72 72 6f 72 0a 20 20 5d 0a 7d 0a 74 65  isError.  ].}.te
bc30: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 32 20 22  st_efkey_29  2 "
bc40: 42 45 47 49 4e 22 20 20 20 20 20 20 20 20 20 20  BEGIN"          
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f           0.test_
bc70: 65 66 6b 65 79 5f 32 39 20 20 33 20 22 44 45 4c  efkey_29  3 "DEL
bc80: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
bc90: 57 48 45 52 45 20 78 20 3d 20 27 61 27 22 20 20  WHERE x = 'a'"  
bca0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bcb0: 65 79 5f 32 39 20 20 34 20 22 44 45 4c 45 54 45  ey_29  4 "DELETE
bcc0: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
bcd0: 52 45 20 78 20 3d 20 27 64 27 22 20 20 20 20 20  RE x = 'd'"     
bce0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
bcf0: 32 39 20 20 35 20 22 44 45 4c 45 54 45 20 46 52  29  5 "DELETE FR
bd00: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
bd10: 78 20 3d 20 27 67 27 22 20 20 20 20 20 20 20 20  x = 'g'"        
bd20: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bd30: 20 36 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   6 "DELETE FROM 
bd40: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
bd50: 20 27 6a 27 22 20 20 20 20 20 20 20 20 31 0a 74   'j'"        1.t
bd60: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 37 20  est_efkey_29  7 
bd70: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
bd80: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6d  ent WHERE x = 'm
bd90: 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74  '"        1.test
bda0: 5f 65 66 6b 65 79 5f 32 39 20 20 38 20 22 44 45  _efkey_29  8 "DE
bdb0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
bdc0: 20 57 48 45 52 45 20 78 20 3d 20 27 70 27 22 20   WHERE x = 'p'" 
bdd0: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
bde0: 6b 65 79 5f 32 39 20 20 39 20 22 44 45 4c 45 54  key_29  9 "DELET
bdf0: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
be00: 45 52 45 20 78 20 3d 20 27 73 27 22 20 20 20 20  ERE x = 's'"    
be10: 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79      0.test_efkey
be20: 5f 32 39 20 31 30 20 22 43 4f 4d 4d 49 54 22 20  _29 10 "COMMIT" 
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
be60: 20 31 31 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20   11 "ROLLBACK"  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
be90: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
bea0: 39 20 22 42 45 47 49 4e 22 20 20 20 20 20 20 20  9 "BEGIN"       
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74 65              0.te
bed0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 30 20 22  st_efkey_29 10 "
bee0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
bef0: 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20  T z = 'z' WHERE 
bf00: 7a 20 3d 20 27 63 27 22 20 31 0a 74 65 73 74 5f  z = 'c'" 1.test_
bf10: 65 66 6b 65 79 5f 32 39 20 31 31 20 22 55 50 44  efkey_29 11 "UPD
bf20: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
bf30: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bf40: 20 27 66 27 22 20 31 0a 74 65 73 74 5f 65 66 6b   'f'" 1.test_efk
bf50: 65 79 5f 32 39 20 31 32 20 22 55 50 44 41 54 45  ey_29 12 "UPDATE
bf60: 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20   parent SET z = 
bf70: 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 69  'z' WHERE z = 'i
bf80: 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '" 1.test_efkey_
bf90: 32 39 20 31 33 20 22 55 50 44 41 54 45 20 70 61  29 13 "UPDATE pa
bfa0: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
bfb0: 20 57 48 45 52 45 20 7a 20 3d 20 27 6c 27 22 20   WHERE z = 'l'" 
bfc0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bfd0: 31 34 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  14 "UPDATE paren
bfe0: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
bff0: 45 52 45 20 7a 20 3d 20 27 6f 27 22 20 31 0a 74  ERE z = 'o'" 1.t
c000: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 35 20  est_efkey_29 15 
c010: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
c020: 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45  ET z = 'z' WHERE
c030: 20 7a 20 3d 20 27 72 27 22 20 31 0a 74 65 73 74   z = 'r'" 1.test
c040: 5f 65 66 6b 65 79 5f 32 39 20 31 36 20 22 55 50  _efkey_29 16 "UP
c050: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
c060: 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20  z = 'z' WHERE z 
c070: 3d 20 27 75 27 22 20 30 0a 74 65 73 74 5f 65 66  = 'u'" 0.test_ef
c080: 6b 65 79 5f 32 39 20 31 37 20 22 43 4f 4d 4d 49  key_29 17 "COMMI
c090: 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T"              
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c0c0: 5f 32 39 20 31 38 20 22 52 4f 4c 4c 42 41 43 4b  _29 18 "ROLLBACK
c0d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32   0..test_efkey_2
c100: 39 20 31 37 20 22 42 45 47 49 4e 22 20 20 20 20  9 17 "BEGIN"    
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c130: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
c140: 38 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  8 "INSERT INTO c
c150: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  1 VALUES(1, 2, 3
c160: 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65  )"          1.te
c170: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 39 20 22  st_efkey_29 19 "
c180: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
c190: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
c1a0: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c1b0: 65 66 6b 65 79 5f 32 39 20 32 30 20 22 49 4e 53  efkey_29 20 "INS
c1c0: 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
c1d0: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
c1e0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c1f0: 65 79 5f 32 39 20 32 31 20 22 49 4e 53 45 52 54  ey_29 21 "INSERT
c200: 20 49 4e 54 4f 20 63 34 20 56 41 4c 55 45 53 28   INTO c4 VALUES(
c210: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
c220: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c230: 32 39 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e  29 22 "INSERT IN
c240: 54 4f 20 63 35 20 56 41 4c 55 45 53 28 31 2c 20  TO c5 VALUES(1, 
c250: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
c260: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c270: 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  22 "INSERT INTO 
c280: 63 36 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c6 VALUES(1, 2, 
c290: 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74  3)"          1.t
c2a0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 32 20  est_efkey_29 22 
c2b0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 37 20  "INSERT INTO c7 
c2c0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22  VALUES(1, 2, 3)"
c2d0: 20 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74            0.test
c2e0: 5f 65 66 6b 65 79 5f 32 39 20 32 33 20 22 43 4f  _efkey_29 23 "CO
c2f0: 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20  MMIT"           
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c320: 6b 65 79 5f 32 39 20 32 34 20 22 49 4e 53 45 52  key_29 24 "INSER
c330: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
c340: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20  LUES(1, 2, 3)"  
c350: 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79      0.test_efkey
c360: 5f 32 39 20 32 35 20 22 43 4f 4d 4d 49 54 22 20  _29 25 "COMMIT" 
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32   0..test_efkey_2
c3a0: 39 20 32 36 20 22 42 45 47 49 4e 22 20 20 20 20  9 26 "BEGIN"    
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c3d0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
c3e0: 37 20 22 55 50 44 41 54 45 20 63 31 20 53 45 54  7 "UPDATE c1 SET
c3f0: 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20   a = 10"        
c400: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c410: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 38 20 22  st_efkey_29 28 "
c420: 55 50 44 41 54 45 20 63 32 20 53 45 54 20 61 20  UPDATE c2 SET a 
c430: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c440: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c450: 65 66 6b 65 79 5f 32 39 20 32 39 20 22 55 50 44  efkey_29 29 "UPD
c460: 41 54 45 20 63 33 20 53 45 54 20 61 20 3d 20 31  ATE c3 SET a = 1
c470: 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
c480: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c490: 65 79 5f 32 39 20 33 30 20 22 55 50 44 41 54 45  ey_29 30 "UPDATE
c4a0: 20 63 34 20 53 45 54 20 61 20 3d 20 31 30 22 20   c4 SET a = 10" 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c4d0: 32 39 20 33 31 20 22 55 50 44 41 54 45 20 63 35  29 31 "UPDATE c5
c4e0: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c510: 33 31 20 22 55 50 44 41 54 45 20 63 36 20 53 45  31 "UPDATE c6 SE
c520: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
c540: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 31 20  est_efkey_29 31 
c550: 22 55 50 44 41 54 45 20 63 37 20 53 45 54 20 61  "UPDATE c7 SET a
c560: 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20   = 10"          
c570: 20 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74            0.test
c580: 5f 65 66 6b 65 79 5f 32 39 20 33 32 20 22 43 4f  _efkey_29 32 "CO
c590: 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20  MMIT"           
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c5c0: 6b 65 79 5f 32 39 20 33 33 20 22 52 4f 4c 4c 42  key_29 33 "ROLLB
c5d0: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d      0..#--------
c600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
c650: 20 52 2d 32 34 34 39 39 2d 35 37 30 37 31 0a 23   R-24499-57071.#
c660: 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70  .# Test an examp
c670: 6c 65 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b  le from foreignk
c680: 65 79 73 2e 68 74 6d 6c 20 64 65 61 6c 69 6e 67  eys.html dealing
c690: 20 77 69 74 68 20 61 20 64 65 66 65 72 72 65 64   with a deferred
c6a0: 20 66 6f 72 65 69 67 6e 20 0a 23 20 6b 65 79 20   foreign .# key 
c6b0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 6f  constraint..#.do
c6c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e  _test e_fkey-35.
c6d0: 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  1 {.  drop_all_t
c6e0: 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
c6f0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
c700: 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20  LE artist(.     
c710: 20 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54   artistid    INT
c720: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
c730: 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e  , .      artistn
c740: 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b  ame  TEXT.    );
c750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
c760: 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74  E track(.      t
c770: 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47  rackid     INTEG
c780: 45 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e  ER,.      trackn
c790: 61 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20  ame   TEXT, .   
c7a0: 20 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49     trackartist I
c7b0: 4e 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45  NTEGER REFERENCE
c7c0: 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
c7d0: 64 29 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  d) DEFERRABLE IN
c7e0: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
c7f0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
c800: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
c810: 33 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.2 {.  execsql
c820: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
c830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c840: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20  track VALUES(1, 
c850: 27 57 68 69 74 65 20 43 68 72 69 73 74 6d 61 73  'White Christmas
c860: 27 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 63 61 74  ', 5);.  }.  cat
c870: 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  chsql COMMIT.} {
c880: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
c890: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
c8a0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
c8b0: 79 2d 33 35 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-35.3 {.  execs
c8c0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
c8d0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
c8e0: 45 53 28 35 2c 20 27 42 69 6e 67 20 43 72 6f 73  ES(5, 'Bing Cros
c8f0: 62 79 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  by');.    COMMIT
c900: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  ;.  }.} {}..#---
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c950: 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20  ------.# Verify 
c960: 74 68 61 74 20 61 20 6e 65 73 74 65 64 20 73 61  that a nested sa
c970: 76 65 70 6f 69 6e 74 20 6d 61 79 20 62 65 20 72  vepoint may be r
c980: 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20  eleased without 
c990: 73 61 74 69 73 66 79 69 6e 67 20 0a 23 20 64 65  satisfying .# de
c9a0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
c9b0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ey constraints..
c9c0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
c9d0: 20 52 2d 30 37 32 32 33 2d 34 38 33 32 33 20 41   R-07223-48323 A
c9e0: 20 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e   nested savepoin
c9f0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
ca00: 79 20 62 65 0a 23 20 52 45 4c 45 41 53 45 64 20  y be.# RELEASEd 
ca10: 77 68 69 6c 65 20 74 68 65 20 64 61 74 61 62 61  while the databa
ca20: 73 65 20 69 73 20 69 6e 20 61 20 73 74 61 74 65  se is in a state
ca30: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73   that does not s
ca40: 61 74 69 73 66 79 20 61 0a 23 20 64 65 66 65 72  atisfy a.# defer
ca50: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
ca60: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 72  constraint..#.dr
ca70: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
ca80: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e  _test e_fkey-36.
ca90: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
caa0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
cab0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
cac0: 59 2c 0a 20 20 20 20 20 20 62 20 52 45 46 45 52  Y,.      b REFER
cad0: 45 4e 43 45 53 20 74 31 20 44 45 46 45 52 52 41  ENCES t1 DEFERRA
cae0: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
caf0: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
cb00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cb10: 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20   VALUES(1, 1);. 
cb20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
cb30: 31 20 56 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a  1 VALUES(2, 2);.
cb40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cb50: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b  t1 VALUES(3, 3);
cb60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
cb70: 74 20 65 5f 66 6b 65 79 2d 33 36 2e 32 20 7b 0a  t e_fkey-36.2 {.
cb80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
cb90: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
cba0: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
cbb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cbc0: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35 29 3b  t1 VALUES(4, 5);
cbd0: 0a 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 6f  .      RELEASE o
cbe0: 6e 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ne;.  }.} {}.do_
cbf0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 33  test e_fkey-36.3
cc00: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f   {.  catchsql CO
cc10: 4d 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  MMIT.} {1 {FOREI
cc20: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
cc30: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
cc40: 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 34 20 7b  st e_fkey-36.4 {
cc50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
cc60: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
cc70: 20 3d 20 35 20 57 48 45 52 45 20 61 20 3d 20 34   = 5 WHERE a = 4
cc80: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
cc90: 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {}...#------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
ccf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73   a transaction s
cd00: 61 76 65 70 6f 69 6e 74 20 28 61 6e 20 6f 75 74  avepoint (an out
cd10: 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
cd20: 20 6f 70 65 6e 65 64 20 77 68 65 6e 0a 23 20 74   opened when.# t
cd30: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
cd40: 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d  in auto-commit m
cd50: 6f 64 65 29 20 63 61 6e 6e 6f 74 20 62 65 20 72  ode) cannot be r
cd60: 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 0a  eleased without.
cd70: 23 20 73 61 74 69 73 66 79 69 6e 67 20 64 65 66  # satisfying def
cd80: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
cd90: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  y constraints. I
cda0: 74 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  t may be rolled 
cdb0: 62 61 63 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e  back..#.# EVIDEN
cdc0: 43 45 2d 4f 46 3a 20 52 2d 34 34 32 39 35 2d 31  CE-OF: R-44295-1
cdd0: 33 38 32 33 20 41 20 74 72 61 6e 73 61 63 74 69  3823 A transacti
cde0: 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 28 61 20  on savepoint (a 
cdf0: 6e 6f 6e 2d 6e 65 73 74 65 64 0a 23 20 73 61 76  non-nested.# sav
ce00: 65 70 6f 69 6e 74 20 74 68 61 74 20 77 61 73 20  epoint that was 
ce10: 6f 70 65 6e 65 64 20 77 68 69 6c 65 20 74 68 65  opened while the
ce20: 72 65 20 77 61 73 20 6e 6f 74 20 63 75 72 72 65  re was not curre
ce30: 6e 74 6c 79 20 61 6e 20 6f 70 65 6e 0a 23 20 74  ntly an open.# t
ce40: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 6f 6e 20  ransaction), on 
ce50: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
ce60: 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
ce70: 65 20 73 61 6d 65 20 72 65 73 74 72 69 63 74 69  e same restricti
ce80: 6f 6e 73 0a 23 20 61 73 20 61 20 43 4f 4d 4d 49  ons.# as a COMMI
ce90: 54 20 2d 20 61 74 74 65 6d 70 74 69 6e 67 20 74  T - attempting t
cea0: 6f 20 52 45 4c 45 41 53 45 20 69 74 20 77 68 69  o RELEASE it whi
ceb0: 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
cec0: 69 73 20 69 6e 20 73 75 63 68 20 61 0a 23 20 73  is in such a.# s
ced0: 74 61 74 65 20 77 69 6c 6c 20 66 61 69 6c 2e 0a  tate will fail..
cee0: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
cef0: 2d 33 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -37.1 {.  execsq
cf00: 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
cf10: 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 53 41 56  T one;.      SAV
cf20: 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20  EPOINT two;.    
cf30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cf40: 74 31 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b  t1 VALUES(6, 7);
cf50: 0a 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 74  .      RELEASE t
cf60: 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  wo;.  }.} {}.do_
cf70: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 32  test e_fkey-37.2
cf80: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52   {.  catchsql {R
cf90: 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 31  ELEASE one}.} {1
cfa0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
cfb0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
cfc0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
cfd0: 2d 33 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -37.3 {.  execsq
cfe0: 6c 20 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45  l {.      UPDATE
cff0: 20 74 31 20 53 45 54 20 61 20 3d 20 37 20 57 48   t1 SET a = 7 WH
d000: 45 52 45 20 61 20 3d 20 36 3b 0a 20 20 20 20 52  ERE a = 6;.    R
d010: 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a  ELEASE one;.  }.
d020: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
d030: 6b 65 79 2d 33 37 2e 34 20 7b 0a 20 20 65 78 65  key-37.4 {.  exe
d040: 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50  csql {.    SAVEP
d050: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
d060: 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20  SAVEPOINT two;. 
d070: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
d080: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20  TO t1 VALUES(9, 
d090: 31 30 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41  10);.      RELEA
d0a0: 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d  SE two;.  }.} {}
d0b0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d0c0: 33 37 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  37.5 {.  catchsq
d0d0: 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a  l {RELEASE one}.
d0e0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
d0f0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
d100: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
d110: 66 6b 65 79 2d 33 37 2e 36 20 7b 0a 20 20 65 78  fkey-37.6 {.  ex
d120: 65 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 20  ecsql {ROLLBACK 
d130: 54 4f 20 6f 6e 65 20 3b 20 52 45 4c 45 41 53 45  TO one ; RELEASE
d140: 20 6f 6e 65 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d   one}.} {}..#---
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d190: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
d1a0: 61 74 20 69 66 20 61 20 43 4f 4d 4d 49 54 20 6f  at if a COMMIT o
d1b0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 64  peration fails d
d1c0: 75 65 20 74 6f 20 64 65 66 65 72 72 65 64 20 66  ue to deferred f
d1d0: 6f 72 65 69 67 6e 20 6b 65 79 20 0a 23 20 63 6f  oreign key .# co
d1e0: 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 79 20 6e  nstraints, any n
d1f0: 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73  ested savepoints
d200: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a   remain open..#.
d210: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d220: 2d 33 37 37 33 36 2d 34 32 36 31 36 20 49 66 20  -37736-42616 If 
d230: 61 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65  a COMMIT stateme
d240: 6e 74 20 28 6f 72 20 74 68 65 20 52 45 4c 45 41  nt (or the RELEA
d250: 53 45 20 6f 66 20 61 0a 23 20 74 72 61 6e 73 61  SE of a.# transa
d260: 63 74 69 6f 6e 20 53 41 56 45 50 4f 49 4e 54 29  ction SAVEPOINT)
d270: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 74   fails because t
d280: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
d290: 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 0a 23 20  urrently in a.# 
d2a0: 73 74 61 74 65 20 74 68 61 74 20 76 69 6f 6c 61  state that viola
d2b0: 74 65 73 20 61 20 64 65 66 65 72 72 65 64 20 66  tes a deferred f
d2c0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
d2d0: 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
d2e0: 61 72 65 0a 23 20 63 75 72 72 65 6e 74 6c 79 20  are.# currently 
d2f0: 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74  nested savepoint
d300: 73 2c 20 74 68 65 20 6e 65 73 74 65 64 20 73 61  s, the nested sa
d310: 76 65 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20  vepoints remain 
d320: 6f 70 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  open..#.do_test 
d330: 65 5f 66 6b 65 79 2d 33 38 2e 31 20 7b 0a 20 20  e_fkey-38.1 {.  
d340: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
d350: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
d360: 52 45 20 61 3e 33 3b 0a 20 20 20 20 53 45 4c 45  RE a>3;.    SELE
d370: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
d380: 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33  }.} {1 1 2 2 3 3
d390: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
d3a0: 2d 33 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -38.2 {.  execsq
d3b0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
d3c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
d3d0: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   t1 VALUES(4, 4)
d3e0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
d3f0: 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 49  T one;.        I
d400: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d410: 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20  LUES(5, 6);.    
d420: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
d430: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31  M t1;.  }.} {1 1
d440: 20 32 20 32 20 33 20 33 20 34 20 34 20 35 20 36   2 2 3 3 4 4 5 6
d450: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
d460: 2d 33 38 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -38.3 {.  catchs
d470: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
d480: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
d490: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
d4a0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
d4b0: 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.4 {.  execsql 
d4c0: 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  {.    ROLLBACK T
d4d0: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
d4e0: 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  T;.    SELECT * 
d4f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
d500: 31 20 31 20 32 20 32 20 33 20 33 20 34 20 34 7d  1 1 2 2 3 3 4 4}
d510: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
d520: 2d 33 38 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -38.5 {.  execsq
d530: 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
d540: 54 20 61 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  T a;.      INSER
d550: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d560: 28 35 2c 20 35 29 3b 0a 20 20 20 20 20 20 53 41  (5, 5);.      SA
d570: 56 45 50 4f 49 4e 54 20 62 3b 0a 20 20 20 20 20  VEPOINT b;.     
d580: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d590: 31 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a  1 VALUES(6, 7);.
d5a0: 20 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e          SAVEPOIN
d5b0: 54 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 49  T c;.          I
d5c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d5d0: 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a  LUES(7, 8);.  }.
d5e0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
d5f0: 6b 65 79 2d 33 38 2e 36 20 7b 0a 20 20 63 61 74  key-38.6 {.  cat
d600: 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 61  chsql {RELEASE a
d610: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
d620: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
d630: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
d640: 65 5f 66 6b 65 79 2d 33 38 2e 37 20 7b 0a 20 20  e_fkey-38.7 {.  
d650: 65 78 65 63 73 71 6c 20 20 7b 52 4f 4c 4c 42 41  execsql  {ROLLBA
d660: 43 4b 20 54 4f 20 63 7d 0a 20 20 63 61 74 63 68  CK TO c}.  catch
d670: 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a  sql {RELEASE a}.
d680: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
d690: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
d6a0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
d6b0: 66 6b 65 79 2d 33 38 2e 38 20 7b 0a 20 20 65 78  fkey-38.8 {.  ex
d6c0: 65 63 73 71 6c 20 20 7b 0a 20 20 20 20 52 4f 4c  ecsql  {.    ROL
d6d0: 4c 42 41 43 4b 20 54 4f 20 62 3b 0a 20 20 20 20  LBACK TO b;.    
d6e0: 52 45 4c 45 41 53 45 20 61 3b 0a 20 20 20 20 53  RELEASE a;.    S
d6f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
d700: 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20  .  }.} {1 1 2 2 
d710: 33 20 33 20 34 20 34 20 35 20 35 7d 0a 0a 23 23  3 3 4 4 5 5}..##
d720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
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 0a 23 23 23 20 53 45  #########.### SE
d770: 43 54 49 4f 4e 20 34 2e 33 3a 20 4f 4e 20 44 45  CTION 4.3: ON DE
d780: 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41  LETE and ON UPDA
d790: 54 45 20 41 63 74 69 6f 6e 73 0a 23 23 23 23 23  TE Actions.#####
d7a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d7b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d7c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d7d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d7e0: 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ######..#-------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 63  --.# Test that c
d840: 6f 6e 66 69 67 75 72 65 64 20 4f 4e 20 44 45 4c  onfigured ON DEL
d850: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
d860: 45 20 61 63 74 69 6f 6e 73 20 74 61 6b 65 20 70  E actions take p
d870: 6c 61 63 65 20 77 68 65 6e 0a 23 20 64 65 6c 65  lace when.# dele
d880: 74 69 6e 67 20 6f 72 20 6d 6f 64 69 66 79 69 6e  ting or modifyin
d890: 67 20 72 6f 77 73 20 6f 66 20 74 68 65 20 70 61  g rows of the pa
d8a0: 72 65 6e 74 20 74 61 62 6c 65 2c 20 72 65 73 70  rent table, resp
d8b0: 65 63 74 69 76 65 6c 79 2e 0a 23 0a 23 20 45 56  ectively..#.# EV
d8c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 32  IDENCE-OF: R-482
d8d0: 37 30 2d 34 34 32 38 32 20 46 6f 72 65 69 67 6e  70-44282 Foreign
d8e0: 20 6b 65 79 20 4f 4e 20 44 45 4c 45 54 45 20 61   key ON DELETE a
d8f0: 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 63 6c 61  nd ON UPDATE cla
d900: 75 73 65 73 0a 23 20 61 72 65 20 75 73 65 64 20  uses.# are used 
d910: 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 61 63 74  to configure act
d920: 69 6f 6e 73 20 74 68 61 74 20 74 61 6b 65 20 70  ions that take p
d930: 6c 61 63 65 20 77 68 65 6e 20 64 65 6c 65 74 69  lace when deleti
d940: 6e 67 20 72 6f 77 73 20 66 72 6f 6d 0a 23 20 74  ng rows from.# t
d950: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
d960: 28 4f 4e 20 44 45 4c 45 54 45 29 2c 20 6f 72 20  (ON DELETE), or 
d970: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 70 61  modifying the pa
d980: 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20  rent key values 
d990: 6f 66 0a 23 20 65 78 69 73 74 69 6e 67 20 72 6f  of.# existing ro
d9a0: 77 73 20 28 4f 4e 20 55 50 44 41 54 45 29 2e 0a  ws (ON UPDATE)..
d9b0: 23 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  #.# Test that a 
d9c0: 73 69 6e 67 6c 65 20 46 4b 20 63 6f 6e 73 74 72  single FK constr
d9d0: 61 69 6e 74 20 6d 61 79 20 68 61 76 65 20 64 69  aint may have di
d9e0: 66 66 65 72 65 6e 74 20 61 63 74 69 6f 6e 73 20  fferent actions 
d9f0: 63 6f 6e 66 69 67 75 72 65 64 0a 23 20 66 6f 72  configured.# for
da00: 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f   ON DELETE and O
da10: 4e 20 55 50 44 41 54 45 2e 0a 23 0a 23 20 45 56  N UPDATE..#.# EV
da20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 31  IDENCE-OF: R-481
da30: 32 34 2d 36 33 32 32 35 20 41 20 73 69 6e 67 6c  24-63225 A singl
da40: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
da50: 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 68 61 76  nstraint may hav
da60: 65 0a 23 20 64 69 66 66 65 72 65 6e 74 20 61 63  e.# different ac
da70: 74 69 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64  tions configured
da80: 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61   for ON DELETE a
da90: 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a  nd ON UPDATE..#.
daa0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
dab0: 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.1 {.  execsql 
dac0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
dad0: 4c 45 20 70 28 61 2c 20 62 20 50 52 49 4d 41 52  LE p(a, b PRIMAR
dae0: 59 20 4b 45 59 2c 20 63 29 3b 0a 20 20 20 20 43  Y KEY, c);.    C
daf0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 64  REATE TABLE c1(d
db00: 2c 20 65 2c 20 66 20 44 45 46 41 55 4c 54 20 27  , e, f DEFAULT '
db10: 6b 30 27 20 52 45 46 45 52 45 4e 43 45 53 20 70  k0' REFERENCES p
db20: 20 0a 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54   .      ON UPDAT
db30: 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20  E SET DEFAULT.  
db40: 20 20 20 20 4f 4e 20 44 45 4c 45 54 45 20 53 45      ON DELETE SE
db50: 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 0a 20  T NULL.    );.. 
db60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
db70: 20 56 41 4c 55 45 53 28 30 2c 20 27 6b 30 27 2c   VALUES(0, 'k0',
db80: 20 27 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   '');.    INSERT
db90: 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31   INTO p VALUES(1
dba0: 2c 20 27 6b 31 27 2c 20 27 49 27 29 3b 0a 20 20  , 'k1', 'I');.  
dbb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
dbc0: 56 41 4c 55 45 53 28 32 2c 20 27 6b 32 27 2c 20  VALUES(2, 'k2', 
dbd0: 27 49 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  'II');.    INSER
dbe0: 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
dbf0: 33 2c 20 27 6b 33 27 2c 20 27 49 49 49 27 29 3b  3, 'k3', 'III');
dc00: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
dc10: 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O c1 VALUES(1, '
dc20: 78 78 27 2c 20 27 6b 31 27 29 3b 0a 20 20 20 20  xx', 'k1');.    
dc30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
dc40: 41 4c 55 45 53 28 32 2c 20 27 78 78 27 2c 20 27  ALUES(2, 'xx', '
dc50: 6b 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  k2');.    INSERT
dc60: 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
dc70: 33 2c 20 27 78 78 27 2c 20 27 6b 33 27 29 3b 0a  3, 'xx', 'k3');.
dc80: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
dc90: 20 65 5f 66 6b 65 79 2d 33 39 2e 32 20 7b 0a 20   e_fkey-39.2 {. 
dca0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
dcb0: 50 44 41 54 45 20 70 20 53 45 54 20 62 20 3d 20  PDATE p SET b = 
dcc0: 27 6b 34 27 20 57 48 45 52 45 20 61 20 3d 20 31  'k4' WHERE a = 1
dcd0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
dce0: 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM c1;.  }.} {1
dcf0: 20 78 78 20 6b 30 20 32 20 78 78 20 6b 32 20 33   xx k0 2 xx k2 3
dd00: 20 78 78 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20   xx k3}.do_test 
dd10: 65 5f 66 6b 65 79 2d 33 39 2e 33 20 7b 0a 20 20  e_fkey-39.3 {.  
dd20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
dd30: 4c 45 54 45 20 46 52 4f 4d 20 70 20 57 48 45 52  LETE FROM p WHER
dd40: 45 20 61 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c  E a = 2;.    SEL
dd50: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20  ECT * FROM c1;. 
dd60: 20 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20   }.} {1 xx k0 2 
dd70: 78 78 20 7b 7d 20 33 20 78 78 20 6b 33 7d 0a 64  xx {} 3 xx k3}.d
dd80: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39  o_test e_fkey-39
dd90: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
dda0: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
ddb0: 55 45 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70  UE INDEX pi ON p
ddc0: 28 63 29 3b 0a 20 20 20 20 52 45 50 4c 41 43 45  (c);.    REPLACE
ddd0: 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 35   INTO p VALUES(5
dde0: 2c 20 27 6b 35 27 2c 20 27 49 49 49 27 29 3b 0a  , 'k5', 'III');.
ddf0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
de00: 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78  M c1;.  }.} {1 x
de10: 78 20 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78  x k0 2 xx {} 3 x
de20: 78 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  x {}}..#--------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de70: 2d 0a 23 20 45 61 63 68 20 66 6f 72 65 69 67 6e  -.# Each foreign
de80: 20 6b 65 79 20 69 6e 20 74 68 65 20 73 79 73 74   key in the syst
de90: 65 6d 20 68 61 73 20 61 6e 20 4f 4e 20 55 50 44  em has an ON UPD
dea0: 41 54 45 20 61 6e 64 20 4f 4e 20 44 45 4c 45 54  ATE and ON DELET
deb0: 45 20 61 63 74 69 6f 6e 2c 0a 23 20 65 69 74 68  E action,.# eith
dec0: 65 72 20 22 4e 4f 20 41 43 54 49 4f 4e 22 2c 20  er "NO ACTION", 
ded0: 22 52 45 53 54 52 49 43 54 22 2c 20 22 53 45 54  "RESTRICT", "SET
dee0: 20 4e 55 4c 4c 22 2c 20 22 53 45 54 20 44 45 46   NULL", "SET DEF
def0: 41 55 4c 54 22 20 6f 72 20 22 43 41 53 43 41 44  AULT" or "CASCAD
df00: 45 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  E"..#.# EVIDENCE
df10: 2d 4f 46 3a 20 52 2d 33 33 33 32 36 2d 34 35 32  -OF: R-33326-452
df20: 35 32 20 54 68 65 20 4f 4e 20 44 45 4c 45 54 45  52 The ON DELETE
df30: 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 61   and ON UPDATE a
df40: 63 74 69 6f 6e 0a 23 20 61 73 73 6f 63 69 61 74  ction.# associat
df50: 65 64 20 77 69 74 68 20 65 61 63 68 20 66 6f 72  ed with each for
df60: 65 69 67 6e 20 6b 65 79 20 69 6e 20 61 6e 20 53  eign key in an S
df70: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69  QLite database i
df80: 73 20 6f 6e 65 20 6f 66 20 22 4e 4f 0a 23 20 41  s one of "NO.# A
df90: 43 54 49 4f 4e 22 2c 20 22 52 45 53 54 52 49 43  CTION", "RESTRIC
dfa0: 54 22 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20  T", "SET NULL", 
dfb0: 22 53 45 54 20 44 45 46 41 55 4c 54 22 20 6f 72  "SET DEFAULT" or
dfc0: 20 22 43 41 53 43 41 44 45 22 2e 0a 23 0a 23 20   "CASCADE"..#.# 
dfd0: 49 66 20 6e 6f 6e 65 20 69 73 20 73 70 65 63 69  If none is speci
dfe0: 66 69 65 64 20 65 78 70 6c 69 63 69 74 6c 79 2c  fied explicitly,
dff0: 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 69 73 20   "NO ACTION" is 
e000: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23  the default..#.#
e010: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e020: 31 39 38 30 33 2d 34 35 38 38 34 20 49 66 20 61  19803-45884 If a
e030: 6e 20 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  n action is not 
e040: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
e050: 66 69 65 64 2c 0a 23 20 69 74 20 64 65 66 61 75  fied,.# it defau
e060: 6c 74 73 20 74 6f 20 22 4e 4f 20 41 43 54 49 4f  lts to "NO ACTIO
e070: 4e 22 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f  N"..# .drop_all_
e080: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
e090: 5f 66 6b 65 79 2d 34 30 2e 31 20 7b 0a 20 20 65  _fkey-40.1 {.  e
e0a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
e0b0: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
e0c0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
e0d0: 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  y);.    CREATE T
e0e0: 41 42 4c 45 20 63 68 69 6c 64 31 28 61 2c 20 0a  ABLE child1(a, .
e0f0: 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e 43        b REFERENC
e100: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
e110: 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 20 4f 4e  ATE NO ACTION ON
e120: 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
e130: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
e140: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
e150: 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45  a, .      b REFE
e160: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
e170: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
e180: 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e   ON DELETE SET N
e190: 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  ULL.    );.    C
e1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e1b0: 64 33 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52  d3(a, .      b R
e1c0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e1d0: 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e   ON UPDATE SET N
e1e0: 55 4c 4c 20 4f 4e 20 44 45 4c 45 54 45 20 53 45  ULL ON DELETE SE
e1f0: 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b  T DEFAULT.    );
e200: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e210: 45 20 63 68 69 6c 64 34 28 61 2c 20 0a 20 20 20  E child4(a, .   
e220: 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20     b REFERENCES 
e230: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
e240: 20 53 45 54 20 44 45 46 41 55 4c 54 20 4f 4e 20   SET DEFAULT ON 
e250: 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20  DELETE CASCADE. 
e260: 20 20 20 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 72     );..    -- Cr
e270: 65 61 74 65 20 73 6f 6d 65 20 66 6f 72 65 69 67  eate some foreig
e280: 6e 20 6b 65 79 73 20 74 68 61 74 20 75 73 65 20  n keys that use 
e290: 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69  the default acti
e2a0: 6f 6e 20 2d 20 22 4e 4f 20 41 43 54 49 4f 4e 22  on - "NO ACTION"
e2b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e2c0: 45 20 63 68 69 6c 64 35 28 61 2c 20 62 20 52 45  E child5(a, b RE
e2d0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
e2e0: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
e2f0: 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
e300: 41 42 4c 45 20 63 68 69 6c 64 36 28 61 2c 20 62  ABLE child6(a, b
e310: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
e320: 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53  nt ON DELETE RES
e330: 54 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41  TRICT);.    CREA
e340: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28  TE TABLE child7(
e350: 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  a, b REFERENCES 
e360: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
e370: 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 20 20 20   NO ACTION);.   
e380: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
e390: 69 6c 64 38 28 61 2c 20 62 20 52 45 46 45 52 45  ild8(a, b REFERE
e3a0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
e3b0: 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  PDATE NO ACTION)
e3c0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65  ;.  }.} {}..fore
e3d0: 61 63 68 20 7b 74 6e 20 7a 54 61 62 20 6c 52 65  ach {tn zTab lRe
e3e0: 73 7d 20 7b 0a 20 20 32 20 63 68 69 6c 64 31 20  s} {.  2 child1 
e3f0: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e400: 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53   {NO ACTION} RES
e410: 54 52 49 43 54 20 4e 4f 4e 45 7d 0a 20 20 33 20  TRICT NONE}.  3 
e420: 63 68 69 6c 64 32 20 7b 30 20 30 20 70 61 72 65  child2 {0 0 pare
e430: 6e 74 20 62 20 7b 7d 20 52 45 53 54 52 49 43 54  nt b {} RESTRICT
e440: 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 4e 4f 4e 45   {SET NULL} NONE
e450: 7d 0a 20 20 34 20 63 68 69 6c 64 33 20 7b 30 20  }.  4 child3 {0 
e460: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53  0 parent b {} {S
e470: 45 54 20 4e 55 4c 4c 7d 20 7b 53 45 54 20 44 45  ET NULL} {SET DE
e480: 46 41 55 4c 54 7d 20 4e 4f 4e 45 7d 0a 20 20 35  FAULT} NONE}.  5
e490: 20 63 68 69 6c 64 34 20 7b 30 20 30 20 70 61 72   child4 {0 0 par
e4a0: 65 6e 74 20 62 20 7b 7d 20 7b 53 45 54 20 44 45  ent b {} {SET DE
e4b0: 46 41 55 4c 54 7d 20 43 41 53 43 41 44 45 20 4e  FAULT} CASCADE N
e4c0: 4f 4e 45 7d 0a 20 20 36 20 63 68 69 6c 64 35 20  ONE}.  6 child5 
e4d0: 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d  {0 0 parent b {}
e4e0: 20 43 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54   CASCADE {NO ACT
e4f0: 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 37 20 63  ION} NONE}.  7 c
e500: 68 69 6c 64 36 20 7b 30 20 30 20 70 61 72 65 6e  hild6 {0 0 paren
e510: 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f  t b {} {NO ACTIO
e520: 4e 7d 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45  N} RESTRICT NONE
e530: 7d 0a 20 20 38 20 63 68 69 6c 64 37 20 7b 30 20  }.  8 child7 {0 
e540: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e  0 parent b {} {N
e550: 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43  O ACTION} {NO AC
e560: 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 39 20  TION} NONE}.  9 
e570: 63 68 69 6c 64 38 20 7b 30 20 30 20 70 61 72 65  child8 {0 0 pare
e580: 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49  nt b {} {NO ACTI
e590: 4f 4e 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20  ON} {NO ACTION} 
e5a0: 4e 4f 4e 45 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74  NONE}.} {.  do_t
e5b0: 65 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e 24 74  est e_fkey-40.$t
e5c0: 6e 20 7b 20 65 78 65 63 73 71 6c 20 22 50 52 41  n { execsql "PRA
e5d0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  GMA foreign_key_
e5e0: 6c 69 73 74 28 24 7a 54 61 62 29 22 20 7d 20 24  list($zTab)" } $
e5f0: 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lRes.}..#-------
e600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e640: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 22  --.# Test that "
e650: 4e 4f 20 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73  NO ACTION" means
e660: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 68 61   that nothing ha
e670: 70 70 65 6e 73 20 74 6f 20 61 20 63 68 69 6c 64  ppens to a child
e680: 20 72 6f 77 20 77 68 65 6e 0a 23 20 69 74 27 73   row when.# it's
e690: 20 70 61 72 65 6e 74 20 72 6f 77 20 69 73 20 75   parent row is u
e6a0: 70 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65  pdated or delete
e6b0: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
e6c0: 4f 46 3a 20 52 2d 31 39 39 37 31 2d 35 34 39 37  OF: R-19971-5497
e6d0: 36 20 43 6f 6e 66 69 67 75 72 69 6e 67 20 22 4e  6 Configuring "N
e6e0: 4f 20 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20  O ACTION" means 
e6f0: 6a 75 73 74 20 74 68 61 74 3a 0a 23 20 77 68 65  just that:.# whe
e700: 6e 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69  n a parent key i
e710: 73 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65  s modified or de
e720: 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
e730: 61 74 61 62 61 73 65 2c 20 6e 6f 20 73 70 65 63  atabase, no spec
e740: 69 61 6c 0a 23 20 61 63 74 69 6f 6e 20 69 73 20  ial.# action is 
e750: 74 61 6b 65 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c  taken..#.drop_al
e760: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
e770: 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20   e_fkey-41.1 {. 
e780: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
e790: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
e7a0: 6e 74 28 70 31 2c 20 70 32 2c 20 50 52 49 4d 41  nt(p1, p2, PRIMA
e7b0: 52 59 20 4b 45 59 28 70 31 2c 20 70 32 29 29 3b  RY KEY(p1, p2));
e7c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e7d0: 45 20 63 68 69 6c 64 28 63 31 2c 20 63 32 2c 20  E child(c1, c2, 
e7e0: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
e7f0: 45 59 28 63 31 2c 20 63 32 29 20 52 45 46 45 52  EY(c1, c2) REFER
e800: 45 4e 43 45 53 20 70 61 72 65 6e 74 0a 20 20 20  ENCES parent.   
e810: 20 20 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20     ON UPDATE NO 
e820: 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 4f 4e 20  ACTION.      ON 
e830: 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
e840: 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c  .      DEFERRABL
e850: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
e860: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20  RRED.    );.    
e870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
e880: 6e 74 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27  nt VALUES('j', '
e890: 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  k');.    INSERT 
e8a0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
e8b0: 45 53 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20  ES('l', 'm');.  
e8c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
e8d0: 69 6c 64 20 56 41 4c 55 45 53 28 27 6a 27 2c 20  ild VALUES('j', 
e8e0: 27 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'k');.    INSERT
e8f0: 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55   INTO child VALU
e900: 45 53 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20  ES('l', 'm');.  
e910: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
e920: 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65  _fkey-41.2 {.  e
e930: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
e940: 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
e950: 20 70 61 72 65 6e 74 20 53 45 54 20 70 31 3d 27   parent SET p1='
e960: 6b 27 20 57 48 45 52 45 20 70 31 3d 27 6a 27 3b  k' WHERE p1='j';
e970: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
e980: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
e990: 70 31 3d 27 6c 27 3b 0a 20 20 20 20 20 20 53 45  p1='l';.      SE
e9a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c  LECT * FROM chil
e9b0: 64 3b 0a 20 20 7d 0a 7d 20 7b 6a 20 6b 20 6c 20  d;.  }.} {j k l 
e9c0: 6d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  m}.do_test e_fke
e9d0: 79 2d 34 31 2e 33 20 7b 0a 20 20 63 61 74 63 68  y-41.3 {.  catch
e9e0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
e9f0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
ea00: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
ea10: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ea20: 34 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  41.4 {.  execsql
ea30: 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 0a   ROLLBACK.} {}..
ea40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
ea50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
ea90: 74 20 74 68 61 74 20 22 52 45 53 54 52 49 43 54  t that "RESTRICT
eaa0: 22 20 6d 65 61 6e 73 20 74 68 65 20 61 70 70 6c  " means the appl
eab0: 69 63 61 74 69 6f 6e 20 69 73 20 70 72 6f 68 69  ication is prohi
eac0: 62 69 74 65 64 20 66 72 6f 6d 20 64 65 6c 65 74  bited from delet
ead0: 69 6e 67 0a 23 20 6f 72 20 75 70 64 61 74 69 6e  ing.# or updatin
eae0: 67 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65  g a parent table
eaf0: 20 72 6f 77 20 77 68 65 6e 20 74 68 65 72 65 20   row when there 
eb00: 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f  exists one or mo
eb10: 72 65 20 63 68 69 6c 64 20 6b 65 79 73 0a 23 20  re child keys.# 
eb20: 6d 61 70 70 65 64 20 74 6f 20 69 74 2e 0a 23 0a  mapped to it..#.
eb30: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
eb40: 2d 30 34 32 37 32 2d 33 38 36 35 33 20 54 68 65  -04272-38653 The
eb50: 20 22 52 45 53 54 52 49 43 54 22 20 61 63 74 69   "RESTRICT" acti
eb60: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
eb70: 65 0a 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  e.# application 
eb80: 69 73 20 70 72 6f 68 69 62 69 74 65 64 20 66 72  is prohibited fr
eb90: 6f 6d 20 64 65 6c 65 74 69 6e 67 20 28 66 6f 72  om deleting (for
eba0: 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52   ON DELETE RESTR
ebb0: 49 43 54 29 20 6f 72 0a 23 20 6d 6f 64 69 66 79  ICT) or.# modify
ebc0: 69 6e 67 20 28 66 6f 72 20 4f 4e 20 55 50 44 41  ing (for ON UPDA
ebd0: 54 45 20 52 45 53 54 52 49 43 54 29 20 61 20 70  TE RESTRICT) a p
ebe0: 61 72 65 6e 74 20 6b 65 79 20 77 68 65 6e 20 74  arent key when t
ebf0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ec00: 23 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20  # or more child 
ec10: 6b 65 79 73 20 6d 61 70 70 65 64 20 74 6f 20 69  keys mapped to i
ec20: 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  t..#.drop_all_ta
ec30: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
ec40: 6b 65 79 2d 34 31 2e 31 20 7b 0a 20 20 65 78 65  key-41.1 {.  exe
ec50: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
ec60: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 70  E TABLE parent(p
ec70: 31 2c 20 70 32 29 3b 0a 20 20 20 20 43 52 45 41  1, p2);.    CREA
ec80: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
ec90: 70 61 72 65 6e 74 5f 69 20 4f 4e 20 70 61 72 65  parent_i ON pare
eca0: 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20  nt(p1, p2);.    
ecb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
ecc0: 6c 64 31 28 63 31 2c 20 63 32 2c 20 0a 20 20 20  ld1(c1, c2, .   
ecd0: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63     FOREIGN KEY(c
ece0: 32 2c 20 63 31 29 20 52 45 46 45 52 45 4e 43 45  2, c1) REFERENCE
ecf0: 53 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29  S parent(p1, p2)
ed00: 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52   ON DELETE RESTR
ed10: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  ICT.    );.    C
ed20: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
ed30: 64 32 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20  d2(c1, c2, .    
ed40: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32    FOREIGN KEY(c2
ed50: 2c 20 63 31 29 20 52 45 46 45 52 45 4e 43 45 53  , c1) REFERENCES
ed60: 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20   parent(p1, p2) 
ed70: 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49  ON UPDATE RESTRI
ed80: 43 54 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  CT.    );.  }.} 
ed90: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
eda0: 79 2d 34 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-41.2 {.  execs
edb0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
edc0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
edd0: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
ede0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
edf0: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 63 27 2c  rent VALUES('c',
ee00: 20 27 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'd');.    INSER
ee10: 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41  T INTO child1 VA
ee20: 4c 55 45 53 28 27 62 27 2c 20 27 61 27 29 3b 0a  LUES('b', 'a');.
ee30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ee40: 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27 64  child2 VALUES('d
ee50: 27 2c 20 27 63 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'c');.  }.} {
ee60: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
ee70: 2d 34 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -41.3 {.  catchs
ee80: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
ee90: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 70 31   parent WHERE p1
eea0: 20 3d 20 27 61 27 20 7d 0a 7d 20 7b 31 20 7b 46   = 'a' }.} {1 {F
eeb0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
eec0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
eed0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31  o_test e_fkey-41
eee0: 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .4 {.  catchsql 
eef0: 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20  { UPDATE parent 
ef00: 53 45 54 20 70 32 20 3d 20 27 65 27 20 57 48 45  SET p2 = 'e' WHE
ef10: 52 45 20 70 31 20 3d 20 27 63 27 20 7d 0a 7d 20  RE p1 = 'c' }.} 
ef20: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
ef30: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ef40: 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d}}..#----------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ef90: 23 20 54 65 73 74 20 74 68 61 74 20 52 45 53 54  # Test that REST
efa0: 52 49 43 54 20 69 73 20 73 6c 69 67 68 74 6c 79  RICT is slightly
efb0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
efc0: 4e 4f 20 41 43 54 49 4f 4e 20 66 6f 72 20 49 4d  NO ACTION for IM
efd0: 4d 45 44 49 41 54 45 0a 23 20 63 6f 6e 73 74 72  MEDIATE.# constr
efe0: 61 69 6e 74 73 2c 20 69 6e 20 74 68 61 74 20 69  aints, in that i
eff0: 74 20 69 73 20 65 6e 66 6f 72 63 65 64 20 69 6d  t is enforced im
f000: 6d 65 64 69 61 74 65 6c 79 2c 20 6e 6f 74 20 61  mediately, not a
f010: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
f020: 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23   .# statement..#
f030: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
f040: 52 2d 33 37 39 39 37 2d 34 32 31 38 37 20 54 68  R-37997-42187 Th
f050: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
f060: 77 65 65 6e 20 74 68 65 20 65 66 66 65 63 74 20  ween the effect 
f070: 6f 66 20 61 0a 23 20 52 45 53 54 52 49 43 54 20  of a.# RESTRICT 
f080: 61 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 72 6d 61  action and norma
f090: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  l foreign key co
f0a0: 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65  nstraint enforce
f0b0: 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 23 20 74  ment is that.# t
f0c0: 68 65 20 52 45 53 54 52 49 43 54 20 61 63 74 69  he RESTRICT acti
f0d0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61  on processing ha
f0e0: 70 70 65 6e 73 20 61 73 20 73 6f 6f 6e 20 61 73  ppens as soon as
f0f0: 20 74 68 65 20 66 69 65 6c 64 20 69 73 20 75 70   the field is up
f100: 64 61 74 65 64 0a 23 20 2d 20 6e 6f 74 20 61 74  dated.# - not at
f110: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f120: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
f130: 74 20 61 73 20 69 74 20 77 6f 75 6c 64 20 77 69  t as it would wi
f140: 74 68 20 61 6e 0a 23 20 69 6d 6d 65 64 69 61 74  th an.# immediat
f150: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  e constraint, or
f160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
f170: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
f180: 61 63 74 69 6f 6e 20 61 73 20 69 74 0a 23 20 77  action as it.# w
f190: 6f 75 6c 64 20 77 69 74 68 20 61 20 64 65 66 65  ould with a defe
f1a0: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 2e  rred constraint.
f1b0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
f1c0: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
f1d0: 79 2d 34 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-42.1 {.  execs
f1e0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
f1f0: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50  TABLE parent(x P
f200: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
f210: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
f220: 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45  ild1(c REFERENCE
f230: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
f240: 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20  TE RESTRICT);.  
f250: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
f260: 68 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43  hild2(c REFERENC
f270: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
f280: 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a  ATE NO ACTION);.
f290: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f2a0: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
f2b0: 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
f2c0: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f2d0: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
f2e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
f2f0: 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65  hild1 VALUES('ke
f300: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
f310: 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c   INTO child2 VAL
f320: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20  UES('key2');..  
f330: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
f340: 20 70 61 72 65 6e 74 5f 74 20 41 46 54 45 52 20   parent_t AFTER 
f350: 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74  UPDATE ON parent
f360: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
f370: 41 54 45 20 63 68 69 6c 64 31 20 73 65 74 20 63  ATE child1 set c
f380: 20 3d 20 6e 65 77 2e 78 20 57 48 45 52 45 20 63   = new.x WHERE c
f390: 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20   = old.x;.      
f3a0: 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 73 65  UPDATE child2 se
f3b0: 74 20 63 20 3d 20 6e 65 77 2e 78 20 57 48 45 52  t c = new.x WHER
f3c0: 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20  E c = old.x;.   
f3d0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
f3e0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f3f0: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
f400: 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20  { UPDATE parent 
f410: 53 45 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65  SET x = 'key one
f420: 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  ' WHERE x = 'key
f430: 31 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  1' }.} {1 {FOREI
f440: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
f450: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
f460: 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 33 20 7b  st e_fkey-42.3 {
f470: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
f480: 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20    UPDATE parent 
f490: 53 45 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f  SET x = 'key two
f4a0: 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  ' WHERE x = 'key
f4b0: 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2';.    SELECT *
f4c0: 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20   FROM child2;.  
f4d0: 7d 0a 7d 20 7b 7b 6b 65 79 20 74 77 6f 7d 7d 0a  }.} {{key two}}.
f4e0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
f4f0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f500: 34 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.4 {.  execsql
f510: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
f520: 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49  BLE parent(x PRI
f530: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
f540: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
f550: 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d1(c REFERENCES 
f560: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
f570: 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20   RESTRICT);.    
f580: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f590: 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld2(c REFERENCES
f5a0: 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54   parent ON DELET
f5b0: 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20  E NO ACTION);.. 
f5c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f5d0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f5e0: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
f5f0: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f600: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
f610: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f620: 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ld1 VALUES('key1
f630: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f640: 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
f650: 53 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20  S('key2');..    
f660: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 70  CREATE TRIGGER p
f670: 61 72 65 6e 74 5f 74 20 41 46 54 45 52 20 44 45  arent_t AFTER DE
f680: 4c 45 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42  LETE ON parent B
f690: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
f6a0: 45 20 63 68 69 6c 64 31 20 53 45 54 20 63 20 3d  E child1 SET c =
f6b0: 20 4e 55 4c 4c 20 57 48 45 52 45 20 63 20 3d 20   NULL WHERE c = 
f6c0: 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20 55 50 44  old.x;.      UPD
f6d0: 41 54 45 20 63 68 69 6c 64 32 20 53 45 54 20 63  ATE child2 SET c
f6e0: 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 63 20   = NULL WHERE c 
f6f0: 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 45 4e 44  = old.x;.    END
f700: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
f710: 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 35 20 7b  st e_fkey-42.5 {
f720: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
f730: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
f740: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31   WHERE x = 'key1
f750: 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ' }.} {1 {FOREIG
f760: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
f770: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
f780: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 36 20 7b 0a  t e_fkey-42.6 {.
f790: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
f7a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72   DELETE FROM par
f7b0: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b  ent WHERE x = 'k
f7c0: 65 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  ey2';.    SELECT
f7d0: 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a   * FROM child2;.
f7e0: 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 64 72 6f 70    }.} {{}}..drop
f7f0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
f800: 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 37 20  est e_fkey-42.7 
f810: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
f820: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
f830: 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20  arent(x PRIMARY 
f840: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
f850: 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20   TABLE child1(c 
f860: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
f870: 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54  t ON DELETE REST
f880: 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54  RICT);.    CREAT
f890: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63  E TABLE child2(c
f8a0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
f8b0: 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20  nt ON DELETE NO 
f8c0: 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e  ACTION);..    IN
f8d0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
f8e0: 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b   VALUES('key1');
f8f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f900: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
f910: 6b 65 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45  key2');.    INSE
f920: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56  RT INTO child1 V
f930: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
f940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
f950: 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65  hild2 VALUES('ke
f960: 79 32 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  y2');.  }.} {}.d
f970: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f980: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
f990: 7b 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70  { REPLACE INTO p
f9a0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f9b0: 79 31 27 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  y1') }.} {1 {FOR
f9c0: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
f9d0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
f9e0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 39  test e_fkey-42.9
f9f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
fa00: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
fa10: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
fa20: 6b 65 79 32 27 29 3b 0a 20 20 20 20 53 45 4c 45  key2');.    SELE
fa30: 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32  CT * FROM child2
fa40: 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79 32 7d 0a 0a  ;.  }.} {key2}..
fa50: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
fa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
faa0: 74 20 74 68 61 74 20 52 45 53 54 52 49 43 54 20  t that RESTRICT 
fab0: 69 73 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65  is enforced imme
fac0: 64 69 61 74 65 6c 79 2c 20 65 76 65 6e 20 66 6f  diately, even fo
fad0: 72 20 61 20 44 45 46 45 52 52 45 44 20 63 6f 6e  r a DEFERRED con
fae0: 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49  straint..#.# EVI
faf0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 31 37  DENCE-OF: R-2417
fb00: 39 2d 36 30 35 32 33 20 45 76 65 6e 20 69 66 20  9-60523 Even if 
fb10: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
fb20: 63 6f 6e 73 74 72 61 69 6e 74 20 69 74 20 69 73  constraint it is
fb30: 0a 23 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  .# attached to i
fb40: 73 20 64 65 66 65 72 72 65 64 2c 20 63 6f 6e 66  s deferred, conf
fb50: 69 67 75 72 69 6e 67 20 61 20 52 45 53 54 52 49  iguring a RESTRI
fb60: 43 54 20 61 63 74 69 6f 6e 20 63 61 75 73 65 73  CT action causes
fb70: 20 53 51 4c 69 74 65 0a 23 20 74 6f 20 72 65 74   SQLite.# to ret
fb80: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
fb90: 65 64 69 61 74 65 6c 79 20 69 66 20 61 20 70 61  ediately if a pa
fba0: 72 65 6e 74 20 6b 65 79 20 77 69 74 68 20 64 65  rent key with de
fbb0: 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 0a 23 20  pendent child.# 
fbc0: 6b 65 79 73 20 69 73 20 64 65 6c 65 74 65 64 20  keys is deleted 
fbd0: 6f 72 20 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 64  or modified..#.d
fbe0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
fbf0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
fc00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fc10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fc20: 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
fc30: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
fc40: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
fc50: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
fc60: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52  rent ON UPDATE R
fc70: 45 53 54 52 49 43 54 0a 20 20 20 20 20 20 44 45  ESTRICT.      DE
fc80: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
fc90: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
fca0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
fcb0: 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46  BLE child2(c REF
fcc0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
fcd0: 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49  N UPDATE NO ACTI
fce0: 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41  ON.      DEFERRA
fcf0: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
fd00: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20  FERRED.    );.. 
fd10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
fd20: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
fd30: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
fd40: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
fd50: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
fd60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
fd70: 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ld1 VALUES('key1
fd80: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fd90: 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
fda0: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42  S('key2');.    B
fdb0: 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  EGIN;.  }.} {}.d
fdc0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
fdd0: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
fde0: 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20  { UPDATE parent 
fdf0: 53 45 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65  SET x = 'key one
fe00: 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  ' WHERE x = 'key
fe10: 31 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  1' }.} {1 {FOREI
fe20: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
fe30: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
fe40: 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 33 20 7b  st e_fkey-43.3 {
fe50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
fe60: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78  ATE parent SET x
fe70: 20 3d 20 27 6b 65 79 20 74 77 6f 27 20 57 48 45   = 'key two' WHE
fe80: 52 45 20 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a  RE x = 'key2' }.
fe90: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
fea0: 6b 65 79 2d 34 33 2e 34 20 7b 0a 20 20 63 61 74  key-43.4 {.  cat
feb0: 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  chsql COMMIT.} {
fec0: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
fed0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
fee0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
fef0: 79 2d 34 33 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-43.5 {.  execs
ff00: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
ff10: 63 68 69 6c 64 32 20 53 45 54 20 63 20 3d 20 27  child2 SET c = '
ff20: 6b 65 79 20 74 77 6f 27 3b 0a 20 20 20 20 43 4f  key two';.    CO
ff30: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
ff40: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
ff50: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
ff60: 33 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.6 {.  execsql 
ff70: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ff80: 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
ff90: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
ffa0: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
ffb0: 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(c REFERENCES p
ffc0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
ffd0: 52 45 53 54 52 49 43 54 0a 20 20 20 20 20 20 44  RESTRICT.      D
ffe0: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
fff0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
10000 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
10010 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45  ABLE child2(c RE
10020 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
10030 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54  ON DELETE NO ACT
10040 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52  ION.      DEFERR
10050 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
10060 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a  EFERRED.    );..
10070 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10080 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
10090 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey1');.    INSER
100a0 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
100b0 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20  LUES('key2');.  
100c0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
100d0 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79  ild1 VALUES('key
100e0 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
100f0 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55  INTO child2 VALU
10100 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
10110 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  BEGIN;.  }.} {}.
10120 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10130 33 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.7 {.  catchsql
10140 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
10150 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
10160 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 46  'key1' }.} {1 {F
10170 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
10180 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.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 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
101b0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72   DELETE FROM par
101c0 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b  ent WHERE x = 'k
101d0 65 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ey2' }.} {}.do_t
101e0 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 39 20  est e_fkey-43.9 
101f0 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  {.  catchsql COM
10200 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  MIT.} {1 {FOREIG
10210 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
10220 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
10230 74 20 65 5f 66 6b 65 79 2d 34 33 2e 31 30 20 7b  t e_fkey-43.10 {
10240 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10250 20 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 53   UPDATE child2 S
10260 45 54 20 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ET c = NULL;.   
10270 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
10280 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
10290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
102d0 54 65 73 74 20 53 45 54 20 4e 55 4c 4c 20 61 63  Test SET NULL ac
102e0 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  tions..#.# EVIDE
102f0 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 33 35 33 2d  NCE-OF: R-03353-
10300 30 35 33 32 37 20 49 66 20 74 68 65 20 63 6f 6e  05327 If the con
10310 66 69 67 75 72 65 64 20 61 63 74 69 6f 6e 20 69  figured action i
10320 73 20 22 53 45 54 20 4e 55 4c 4c 22 2c 0a 23 20  s "SET NULL",.# 
10330 74 68 65 6e 20 77 68 65 6e 20 61 20 70 61 72 65  then when a pare
10340 6e 74 20 6b 65 79 20 69 73 20 64 65 6c 65 74 65  nt key is delete
10350 64 20 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45  d (for ON DELETE
10360 20 53 45 54 20 4e 55 4c 4c 29 20 6f 72 20 6d 6f   SET NULL) or mo
10370 64 69 66 69 65 64 0a 23 20 28 66 6f 72 20 4f 4e  dified.# (for ON
10380 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c   UPDATE SET NULL
10390 29 2c 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  ), the child key
103a0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20   columns of all 
103b0 72 6f 77 73 20 69 6e 20 74 68 65 0a 23 20 63 68  rows in the.# ch
103c0 69 6c 64 20 74 61 62 6c 65 20 74 68 61 74 20 6d  ild table that m
103d0 61 70 70 65 64 20 74 6f 20 74 68 65 20 70 61 72  apped to the par
103e0 65 6e 74 20 6b 65 79 20 61 72 65 20 73 65 74 20  ent key are set 
103f0 74 6f 20 63 6f 6e 74 61 69 6e 20 53 51 4c 20 4e  to contain SQL N
10400 55 4c 4c 0a 23 20 76 61 6c 75 65 73 2e 0a 23 0a  ULL.# values..#.
10410 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
10420 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10430 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
10440 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10450 4c 45 20 70 41 28 78 20 50 52 49 4d 41 52 59 20  LE pA(x PRIMARY 
10460 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
10470 20 54 41 42 4c 45 20 63 41 28 63 20 52 45 46 45   TABLE cA(c REFE
10480 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 44 45 4c  RENCES pA ON DEL
10490 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20  ETE SET NULL);. 
104a0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
104b0 63 42 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  cB(c REFERENCES 
104c0 70 41 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54  pA ON UPDATE SET
104d0 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 49 4e 53   NULL);..    INS
104e0 45 52 54 20 49 4e 54 4f 20 70 41 20 56 41 4c 55  ERT INTO pA VALU
104f0 45 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20  ES(X'ABCD');.   
10500 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 20   INSERT INTO pA 
10510 56 41 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b  VALUES(X'1234');
10520 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10530 20 63 41 20 56 41 4c 55 45 53 28 58 27 41 42 43   cA VALUES(X'ABC
10540 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  D');.    INSERT 
10550 49 4e 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58  INTO cB VALUES(X
10560 27 31 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b  '1234');.  }.} {
10570 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10580 2d 34 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -44.2 {.  execsq
10590 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
105a0 52 4f 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77  ROM pA WHERE row
105b0 69 64 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45  id = 1;.    SELE
105c0 43 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d  CT quote(x) FROM
105d0 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 31 32   pA;.  }.} {X'12
105e0 33 34 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  34'}.do_test e_f
105f0 6b 65 79 2d 34 34 2e 33 20 7b 0a 20 20 65 78 65  key-44.3 {.  exe
10600 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
10610 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20  T quote(c) FROM 
10620 63 41 3b 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d  cA;.  }.} {NULL}
10630 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10640 34 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  44.4 {.  execsql
10650 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 41   {.    UPDATE pA
10660 20 53 45 54 20 78 20 3d 20 58 27 38 37 36 35 27   SET x = X'8765'
10670 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32   WHERE rowid = 2
10680 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f  ;.    SELECT quo
10690 74 65 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20  te(x) FROM pA;. 
106a0 20 7d 0a 7d 20 7b 58 27 38 37 36 35 27 7d 0a 64   }.} {X'8765'}.d
106b0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34  o_test e_fkey-44
106c0 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
106d0 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29   SELECT quote(c)
106e0 20 46 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 4e 55   FROM cB }.} {NU
106f0 4c 4c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  LL}..#----------
10700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10740 23 20 54 65 73 74 20 53 45 54 20 44 45 46 41 55  # Test SET DEFAU
10750 4c 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20  LT actions..#.# 
10760 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
10770 33 30 35 34 2d 35 34 38 33 32 20 54 68 65 20 22  3054-54832 The "
10780 53 45 54 20 44 45 46 41 55 4c 54 22 20 61 63 74  SET DEFAULT" act
10790 69 6f 6e 73 20 61 72 65 20 73 69 6d 69 6c 61 72  ions are similar
107a0 20 74 6f 0a 23 20 22 53 45 54 20 4e 55 4c 4c 22   to.# "SET NULL"
107b0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
107c0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
107d0 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73  key columns is s
107e0 65 74 20 74 6f 0a 23 20 63 6f 6e 74 61 69 6e 20  et to.# contain 
107f0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 64 65 66 61  the columns defa
10800 75 6c 74 20 76 61 6c 75 65 20 69 6e 73 74 65 61  ult value instea
10810 64 20 6f 66 20 4e 55 4c 4c 2e 0a 23 0a 64 72 6f  d of NULL..#.dro
10820 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
10830 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 31  test e_fkey-45.1
10840 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10850 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10860 70 41 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  pA(x PRIMARY KEY
10870 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
10880 42 4c 45 20 63 41 28 63 20 44 45 46 41 55 4c 54  BLE cA(c DEFAULT
10890 20 58 27 30 30 30 30 27 20 52 45 46 45 52 45 4e   X'0000' REFEREN
108a0 43 45 53 20 70 41 20 4f 4e 20 44 45 4c 45 54 45  CES pA ON DELETE
108b0 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 20   SET DEFAULT);. 
108c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
108d0 63 42 28 63 20 44 45 46 41 55 4c 54 20 58 27 39  cB(c DEFAULT X'9
108e0 39 39 39 27 20 52 45 46 45 52 45 4e 43 45 53 20  999' REFERENCES 
108f0 70 41 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54  pA ON UPDATE SET
10900 20 44 45 46 41 55 4c 54 29 3b 0a 0a 20 20 20 20   DEFAULT);..    
10910 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72  INSERT INTO pA(r
10920 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28  owid, x) VALUES(
10930 31 2c 20 58 27 30 30 30 30 27 29 3b 0a 20 20 20  1, X'0000');.   
10940 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28   INSERT INTO pA(
10950 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53  rowid, x) VALUES
10960 28 32 2c 20 58 27 39 39 39 39 27 29 3b 0a 20 20  (2, X'9999');.  
10970 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41    INSERT INTO pA
10980 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45  (rowid, x) VALUE
10990 53 28 33 2c 20 58 27 41 42 43 44 27 29 3b 0a 20  S(3, X'ABCD');. 
109a0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
109b0 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55  A(rowid, x) VALU
109c0 45 53 28 34 2c 20 58 27 31 32 33 34 27 29 3b 0a  ES(4, X'1234');.
109d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
109e0 20 63 41 20 56 41 4c 55 45 53 28 58 27 41 42 43   cA VALUES(X'ABC
109f0 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  D');.    INSERT 
10a00 49 4e 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58  INTO cB VALUES(X
10a10 27 31 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b  '1234');.  }.} {
10a20 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10a30 2d 34 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -45.2 {.  execsq
10a40 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
10a50 52 4f 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77  ROM pA WHERE row
10a60 69 64 20 3d 20 33 3b 0a 20 20 20 20 53 45 4c 45  id = 3;.    SELE
10a70 43 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d  CT quote(x) FROM
10a80 20 70 41 20 4f 52 44 45 52 20 42 59 20 72 6f 77   pA ORDER BY row
10a90 69 64 3b 0a 20 20 7d 0a 7d 20 7b 58 27 30 30 30  id;.  }.} {X'000
10aa0 30 27 20 58 27 39 39 39 39 27 20 58 27 31 32 33  0' X'9999' X'123
10ab0 34 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  4'}.do_test e_fk
10ac0 65 79 2d 34 35 2e 33 20 7b 0a 20 20 65 78 65 63  ey-45.3 {.  exec
10ad0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f  sql { SELECT quo
10ae0 74 65 28 63 29 20 46 52 4f 4d 20 63 41 20 7d 0a  te(c) FROM cA }.
10af0 7d 20 7b 58 27 30 30 30 30 27 7d 0a 64 6f 5f 74  } {X'0000'}.do_t
10b00 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 34 20  est e_fkey-45.4 
10b10 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10b20 20 20 55 50 44 41 54 45 20 70 41 20 53 45 54 20    UPDATE pA SET 
10b30 78 20 3d 20 58 27 38 37 36 35 27 20 57 48 45 52  x = X'8765' WHER
10b40 45 20 72 6f 77 69 64 20 3d 20 34 3b 0a 20 20 20  E rowid = 4;.   
10b50 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29   SELECT quote(x)
10b60 20 46 52 4f 4d 20 70 41 20 4f 52 44 45 52 20 42   FROM pA ORDER B
10b70 59 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b  Y rowid;.  }.} {
10b80 58 27 30 30 30 30 27 20 58 27 39 39 39 39 27 20  X'0000' X'9999' 
10b90 58 27 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74  X'8765'}.do_test
10ba0 20 65 5f 66 6b 65 79 2d 34 35 2e 35 20 7b 0a 20   e_fkey-45.5 {. 
10bb0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
10bc0 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20  T quote(c) FROM 
10bd0 63 42 20 7d 0a 7d 20 7b 58 27 39 39 39 39 27 7d  cB }.} {X'9999'}
10be0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
10c30 65 73 74 20 4f 4e 20 44 45 4c 45 54 45 20 43 41  est ON DELETE CA
10c40 53 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23  SCADE actions..#
10c50 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10c60 52 2d 36 31 33 37 36 2d 35 37 32 36 37 20 41 20  R-61376-57267 A 
10c70 22 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e  "CASCADE" action
10c80 20 70 72 6f 70 61 67 61 74 65 73 20 74 68 65 20   propagates the 
10c90 64 65 6c 65 74 65 20 6f 72 0a 23 20 75 70 64 61  delete or.# upda
10ca0 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  te operation on 
10cb0 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 74  the parent key t
10cc0 6f 20 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74  o each dependent
10cd0 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 23 20   child key..#.# 
10ce0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
10cf0 31 38 30 39 2d 36 32 32 30 37 20 46 6f 72 20 61  1809-62207 For a
10d00 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  n "ON DELETE CAS
10d10 43 41 44 45 22 20 61 63 74 69 6f 6e 2c 20 74 68  CADE" action, th
10d20 69 73 0a 23 20 6d 65 61 6e 73 20 74 68 61 74 20  is.# means that 
10d30 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
10d40 63 68 69 6c 64 20 74 61 62 6c 65 20 74 68 61 74  child table that
10d50 20 77 61 73 20 61 73 73 6f 63 69 61 74 65 64 20   was associated 
10d60 77 69 74 68 20 74 68 65 0a 23 20 64 65 6c 65 74  with the.# delet
10d70 65 64 20 70 61 72 65 6e 74 20 72 6f 77 20 69 73  ed parent row is
10d80 20 61 6c 73 6f 20 64 65 6c 65 74 65 64 2e 0a 23   also deleted..#
10d90 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
10da0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10db0 34 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  46.1 {.  execsql
10dc0 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
10dd0 42 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51  BLE p1(a, b UNIQ
10de0 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  UE);.    CREATE 
10df0 54 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52  TABLE c1(c REFER
10e00 45 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 44  ENCES p1(b) ON D
10e10 45 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20 64  ELETE CASCADE, d
10e20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10e30 54 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO p1 VALUES(NUL
10e40 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
10e50 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10e60 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
10e70 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
10e80 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
10e90 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
10ea0 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ALUES(NULL, NULL
10eb0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10ec0 54 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20  TO c1 VALUES(4, 
10ed0 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
10ee0 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c  NTO c1 VALUES(5,
10ef0 20 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   5);.    SELECT 
10f00 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31  count(*) FROM c1
10f10 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74  ;.  }.} {3}.do_t
10f20 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 32 20  est e_fkey-46.2 
10f30 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10f40 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 31    DELETE FROM p1
10f50 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20   WHERE a = 4;.  
10f60 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52    SELECT d, c FR
10f70 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  OM c1;.  }.} {{}
10f80 20 7b 7d 20 35 20 35 7d 0a 64 6f 5f 74 65 73 74   {} 5 5}.do_test
10f90 20 65 5f 66 6b 65 79 2d 34 36 2e 33 20 7b 0a 20   e_fkey-46.3 {. 
10fa0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
10fb0 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 3b 0a 20  ELETE FROM p1;. 
10fc0 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46     SELECT d, c F
10fd0 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b  ROM c1;.  }.} {{
10fe0 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {}}.do_test e_
10ff0 66 6b 65 79 2d 34 36 2e 34 20 7b 0a 20 20 65 78  fkey-46.4 {.  ex
11000 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
11010 20 46 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b 7d 0a   FROM p1 }.} {}.
11020 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
11070 65 73 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41  est ON UPDATE CA
11080 53 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23  SCADE actions..#
11090 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
110a0 52 2d 31 33 38 37 37 2d 36 34 35 34 32 20 46 6f  R-13877-64542 Fo
110b0 72 20 61 6e 20 22 4f 4e 20 55 50 44 41 54 45 20  r an "ON UPDATE 
110c0 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 2c  CASCADE" action,
110d0 20 69 74 20 6d 65 61 6e 73 0a 23 20 74 68 61 74   it means.# that
110e0 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
110f0 65 64 20 69 6e 20 65 61 63 68 20 64 65 70 65 6e  ed in each depen
11100 64 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 20 61  dent child key a
11110 72 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 0a 23  re modified to.#
11120 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 70   match the new p
11130 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73  arent key values
11140 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
11150 46 3a 20 52 2d 36 31 33 37 36 2d 35 37 32 36 37  F: R-61376-57267
11160 20 41 20 22 43 41 53 43 41 44 45 22 20 61 63 74   A "CASCADE" act
11170 69 6f 6e 20 70 72 6f 70 61 67 61 74 65 73 20 74  ion propagates t
11180 68 65 20 64 65 6c 65 74 65 20 6f 72 0a 23 20 75  he delete or.# u
11190 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  pdate operation 
111a0 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  on the parent ke
111b0 79 20 74 6f 20 65 61 63 68 20 64 65 70 65 6e 64  y to each depend
111c0 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23  ent child key..#
111d0 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
111e0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
111f0 34 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  47.1 {.  execsql
11200 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
11210 42 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51  BLE p1(a, b UNIQ
11220 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  UE);.    CREATE 
11230 54 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52  TABLE c1(c REFER
11240 45 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 55  ENCES p1(b) ON U
11250 50 44 41 54 45 20 43 41 53 43 41 44 45 2c 20 64  PDATE CASCADE, d
11260 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11270 54 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO p1 VALUES(NUL
11280 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
11290 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
112a0 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
112b0 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
112c0 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
112d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
112e0 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ALUES(NULL, NULL
112f0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11300 54 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20  TO c1 VALUES(4, 
11310 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
11320 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c  NTO c1 VALUES(5,
11330 20 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   5);.    SELECT 
11340 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31  count(*) FROM c1
11350 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74  ;.  }.} {3}.do_t
11360 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 32 20  est e_fkey-47.2 
11370 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11380 20 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20    UPDATE p1 SET 
11390 62 20 3d 20 31 30 20 57 48 45 52 45 20 62 20 3d  b = 10 WHERE b =
113a0 20 35 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64   5;.    SELECT d
113b0 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  , c FROM c1;.  }
113c0 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 34 20 35 20  .} {{} {} 4 4 5 
113d0 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  10}.do_test e_fk
113e0 65 79 2d 34 37 2e 33 20 7b 0a 20 20 65 78 65 63  ey-47.3 {.  exec
113f0 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
11400 20 70 31 20 53 45 54 20 62 20 3d 20 31 31 20 57   p1 SET b = 11 W
11410 48 45 52 45 20 62 20 3d 20 34 3b 0a 20 20 20 20  HERE b = 4;.    
11420 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d  SELECT d, c FROM
11430 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b   c1;.  }.} {{} {
11440 7d 20 34 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f  } 4 11 5 10}.do_
11450 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 34  test e_fkey-47.4
11460 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
11470 20 20 20 20 55 50 44 41 54 45 20 70 31 20 53 45      UPDATE p1 SE
11480 54 20 62 20 3d 20 36 20 57 48 45 52 45 20 62 20  T b = 6 WHERE b 
11490 49 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c  IS NULL;.    SEL
114a0 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31  ECT d, c FROM c1
114b0 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34  ;.  }.} {{} {} 4
114c0 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73   11 5 10}.do_tes
114d0 74 20 65 5f 66 6b 65 79 2d 34 36 2e 35 20 7b 0a  t e_fkey-46.5 {.
114e0 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
114f0 43 54 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d  CT * FROM p1 }.}
11500 20 7b 7b 7d 20 36 20 34 20 31 31 20 35 20 31 30   {{} 6 4 11 5 10
11510 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
11520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11560 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
11570 35 30 35 38 2d 35 37 31 35 38 0a 23 0a 23 20 54  5058-57158.#.# T
11580 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66  est an example f
11590 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45  rom the "ON DELE
115a0 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
115b0 20 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f   Actions" sectio
115c0 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b  n .# of foreignk
115d0 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70  eys.html..#.drop
115e0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
115f0 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 31 20  est e_fkey-48.1 
11600 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11610 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
11620 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74  rtist(.      art
11630 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52  istid    INTEGER
11640 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
11650 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20       artistname 
11660 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20   TEXT.    );.   
11670 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
11680 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b  ack(.      track
11690 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a  id     INTEGER,.
116a0 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20        trackname 
116b0 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74    TEXT, .      t
116c0 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47  rackartist INTEG
116d0 45 52 20 52 45 46 45 52 45 4e 43 45 53 20 61 72  ER REFERENCES ar
116e0 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20 4f  tist(artistid) O
116f0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
11700 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53  .    );..    INS
11710 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
11720 56 41 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20  VALUES(1, 'Dean 
11730 4d 61 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e  Martin');.    IN
11740 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
11750 20 56 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e   VALUES(2, 'Fran
11760 6b 20 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20  k Sinatra');.   
11770 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
11780 63 6b 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54  ck VALUES(11, 'T
11790 68 61 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31  hat''s Amore', 1
117a0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
117b0 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
117c0 31 32 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42  12, 'Christmas B
117d0 6c 75 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49  lues', 1);.    I
117e0 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
117f0 20 56 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20   VALUES(13, 'My 
11800 57 61 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20  Way', 2);.  }.} 
11810 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
11820 79 2d 34 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-48.2 {.  execs
11830 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
11840 61 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73  artist SET artis
11850 74 69 64 20 3d 20 31 30 30 20 57 48 45 52 45 20  tid = 100 WHERE 
11860 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 44 65  artistname = 'De
11870 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20 20 7d 0a  an Martin';.  }.
11880 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
11890 6b 65 79 2d 34 38 2e 33 20 7b 0a 20 20 65 78 65  key-48.3 {.  exe
118a0 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
118b0 46 52 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20  FROM artist }.} 
118c0 7b 32 20 7b 46 72 61 6e 6b 20 53 69 6e 61 74 72  {2 {Frank Sinatr
118d0 61 7d 20 31 30 30 20 7b 44 65 61 6e 20 4d 61 72  a} 100 {Dean Mar
118e0 74 69 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  tin}}.do_test e_
118f0 66 6b 65 79 2d 34 38 2e 34 20 7b 0a 20 20 65 78  fkey-48.4 {.  ex
11900 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
11910 20 46 52 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20   FROM track }.} 
11920 7b 31 31 20 7b 54 68 61 74 27 73 20 41 6d 6f 72  {11 {That's Amor
11930 65 7d 20 31 30 30 20 31 32 20 7b 43 68 72 69 73  e} 100 12 {Chris
11940 74 6d 61 73 20 42 6c 75 65 73 7d 20 31 30 30 20  tmas Blues} 100 
11950 31 33 20 7b 4d 79 20 57 61 79 7d 20 32 7d 0a 0a  13 {My Way} 2}..
11960 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65  -----------.# Ve
119b0 72 69 66 79 20 74 68 61 74 20 61 64 64 69 6e 67  rify that adding
119c0 20 61 6e 20 46 4b 20 61 63 74 69 6f 6e 20 64 6f   an FK action do
119d0 65 73 20 6e 6f 74 20 61 62 73 6f 6c 76 65 20 74  es not absolve t
119e0 68 65 20 75 73 65 72 20 6f 66 20 74 68 65 20 0a  he user of the .
119f0 23 20 72 65 71 75 69 72 65 6d 65 6e 74 20 6e 6f  # requirement no
11a00 74 20 74 6f 20 76 69 6f 6c 61 74 65 20 74 68 65  t to violate the
11a10 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
11a20 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49  straint..#.# EVI
11a30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 36  DENCE-OF: R-5396
11a40 38 2d 35 31 36 34 32 20 43 6f 6e 66 69 67 75 72  8-51642 Configur
11a50 69 6e 67 20 61 6e 20 4f 4e 20 55 50 44 41 54 45  ing an ON UPDATE
11a60 20 6f 72 20 4f 4e 20 44 45 4c 45 54 45 0a 23 20   or ON DELETE.# 
11a70 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
11a80 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 66 6f  mean that the fo
11a90 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
11aa0 61 69 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  aint does not ne
11ab0 65 64 20 74 6f 0a 23 20 62 65 20 73 61 74 69 73  ed to.# be satis
11ac0 66 69 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  fied..#.drop_all
11ad0 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
11ae0 65 5f 66 6b 65 79 2d 34 39 2e 31 20 7b 0a 20 20  e_fkey-49.1 {.  
11af0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
11b00 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
11b10 74 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  t(a COLLATE noca
11b20 73 65 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  se, b, c, PRIMAR
11b30 59 20 4b 45 59 28 63 2c 20 61 29 29 3b 0a 20 20  Y KEY(c, a));.  
11b40 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
11b50 68 69 6c 64 28 64 20 44 45 46 41 55 4c 54 20 27  hild(d DEFAULT '
11b60 61 27 2c 20 65 2c 20 66 20 44 45 46 41 55 4c 54  a', e, f DEFAULT
11b70 20 27 63 27 2c 0a 20 20 20 20 20 20 46 4f 52 45   'c',.      FORE
11b80 49 47 4e 20 4b 45 59 28 66 2c 20 64 29 20 52 45  IGN KEY(f, d) RE
11b90 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
11ba0 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45  ON UPDATE SET DE
11bb0 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 0a 20 20  FAULT.    );..  
11bc0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
11bd0 72 65 6e 74 20 56 41 4c 55 45 53 28 27 41 27 2c  rent VALUES('A',
11be0 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20   'b', 'c');.    
11bf0 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
11c00 6e 74 20 56 41 4c 55 45 53 28 27 4f 4e 45 27 2c  nt VALUES('ONE',
11c10 20 27 74 77 6f 27 2c 20 27 74 68 72 65 65 27 29   'two', 'three')
11c20 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11c30 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27  O child VALUES('
11c40 6f 6e 65 27 2c 20 27 74 77 6f 27 2c 20 27 74 68  one', 'two', 'th
11c50 72 65 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ree');.  }.} {}.
11c60 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
11c70 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
11c80 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
11c90 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
11ca0 20 53 45 54 20 61 20 3d 20 27 27 20 57 48 45 52   SET a = '' WHER
11cb0 45 20 61 20 3d 20 27 6f 4e 65 27 3b 0a 20 20 20  E a = 'oNe';.   
11cc0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
11cd0 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 61   child;.  }.} {a
11ce0 20 74 77 6f 20 63 7d 0a 64 6f 5f 74 65 73 74 20   two c}.do_test 
11cf0 65 5f 66 6b 65 79 2d 34 39 2e 33 20 7b 0a 20 20  e_fkey-49.3 {.  
11d00 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f  execsql {.    RO
11d10 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 44 45 4c 45  LLBACK;.    DELE
11d20 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
11d30 48 45 52 45 20 61 20 3d 20 27 41 27 3b 0a 20 20  HERE a = 'A';.  
11d40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11d50 70 61 72 65 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 4f  parent;.  }.} {O
11d60 4e 45 20 74 77 6f 20 74 68 72 65 65 7d 0a 64 6f  NE two three}.do
11d70 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e  _test e_fkey-49.
11d80 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
11d90 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
11da0 45 54 20 61 20 3d 20 27 27 20 57 48 45 52 45 20  ET a = '' WHERE 
11db0 61 20 3d 20 27 6f 4e 65 27 20 7d 0a 7d 20 7b 31  a = 'oNe' }.} {1
11dc0 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
11dd0 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
11de0 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
11e30 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11e40 31 31 38 35 36 2d 31 39 38 33 36 0a 23 0a 23 20  11856-19836.#.# 
11e50 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20  Test an example 
11e60 66 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c  from the "ON DEL
11e70 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
11e80 45 20 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69  E Actions" secti
11e90 6f 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e  on .# of foreign
11ea0 6b 65 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20  keys.html. This 
11eb0 65 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 74 68  example shows th
11ec0 61 74 20 61 64 64 69 6e 67 20 61 6e 20 22 4f 4e  at adding an "ON
11ed0 20 44 45 4c 45 54 45 20 44 45 46 41 55 4c 54 22   DELETE DEFAULT"
11ee0 0a 23 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  .# clause does n
11ef0 6f 74 20 61 62 72 6f 67 61 74 65 20 74 68 65 20  ot abrogate the 
11f00 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
11f10 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
11f20 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20 28 52 2d  constraint.# (R-
11f30 32 38 32 32 30 2d 34 36 36 39 34 29 2e 0a 23 0a  28220-46694)..#.
11f40 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
11f50 2d 32 38 32 32 30 2d 34 36 36 39 34 20 46 6f 72  -28220-46694 For
11f60 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20   example, if an 
11f70 22 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44  "ON DELETE SET D
11f80 45 46 41 55 4c 54 22 0a 23 20 61 63 74 69 6f 6e  EFAULT".# action
11f90 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20   is configured, 
11fa0 62 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  but there is no 
11fb0 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e  row in the paren
11fc0 74 20 74 61 62 6c 65 20 74 68 61 74 0a 23 20 63  t table that.# c
11fd0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
11fe0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
11ff0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65   of the child ke
12000 79 20 63 6f 6c 75 6d 6e 73 2c 20 64 65 6c 65 74  y columns, delet
12010 69 6e 67 20 61 0a 23 20 70 61 72 65 6e 74 20 6b  ing a.# parent k
12020 65 79 20 77 68 69 6c 65 20 64 65 70 65 6e 64 65  ey while depende
12030 6e 74 20 63 68 69 6c 64 20 6b 65 79 73 20 65 78  nt child keys ex
12040 69 73 74 20 73 74 69 6c 6c 20 63 61 75 73 65 73  ist still causes
12050 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23   a foreign key.#
12060 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 64 72   violation..#.dr
12070 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
12080 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e  _test e_fkey-50.
12090 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
120a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
120b0 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61   artist(.      a
120c0 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47  rtistid    INTEG
120d0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
120e0 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d  .      artistnam
120f0 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20  e  TEXT.    );. 
12100 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12110 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61  track(.      tra
12120 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52  ckid     INTEGER
12130 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d  ,.      tracknam
12140 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
12150 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
12160 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 20 52  EGER DEFAULT 0 R
12170 45 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74  EFERENCES artist
12180 28 61 72 74 69 73 74 69 64 29 20 4f 4e 20 44 45  (artistid) ON DE
12190 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  LETE SET DEFAULT
121a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
121b0 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
121c0 41 4c 55 45 53 28 33 2c 20 27 53 61 6d 6d 79 20  ALUES(3, 'Sammy 
121d0 44 61 76 69 73 20 4a 72 2e 27 29 3b 0a 20 20 20  Davis Jr.');.   
121e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
121f0 63 6b 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d  ck VALUES(14, 'M
12200 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33  r. Bojangles', 3
12210 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
12220 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 32 20  est e_fkey-50.2 
12230 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  {.  catchsql { D
12240 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
12250 74 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61  t WHERE artistna
12260 6d 65 20 3d 20 27 53 61 6d 6d 79 20 44 61 76 69  me = 'Sammy Davi
12270 73 20 4a 72 2e 27 20 7d 0a 7d 20 7b 31 20 7b 46  s Jr.' }.} {1 {F
12280 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
12290 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
122a0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30  o_test e_fkey-50
122b0 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
122c0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
122d0 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 30   artist VALUES(0
122e0 2c 20 27 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73  , 'Unknown Artis
122f0 74 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  t');.    DELETE 
12300 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
12310 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27  E artistname = '
12320 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27  Sammy Davis Jr.'
12330 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
12340 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 34 20 7b  st e_fkey-50.4 {
12350 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
12360 45 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73  ECT * FROM artis
12370 74 20 7d 0a 7d 20 7b 30 20 7b 55 6e 6b 6e 6f 77  t }.} {0 {Unknow
12380 6e 20 41 72 74 69 73 74 7d 7d 0a 64 6f 5f 74 65  n Artist}}.do_te
12390 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 35 20 7b  st e_fkey-50.5 {
123a0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
123b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b  ECT * FROM track
123c0 20 7d 0a 7d 20 7b 31 34 20 7b 4d 72 2e 20 42 6f   }.} {14 {Mr. Bo
123d0 6a 61 6e 67 6c 65 73 7d 20 30 7d 0a 0a 23 2d 2d  jangles} 0}..#--
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12420 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
12430 43 45 2d 4f 46 3a 20 52 2d 30 39 35 36 34 2d 32  CE-OF: R-09564-2
12440 32 31 37 30 0a 23 0a 23 20 43 68 65 63 6b 20 74  2170.#.# Check t
12450 68 61 74 20 74 68 65 20 6f 72 64 65 72 20 6f 66  hat the order of
12460 20 73 74 65 70 73 20 69 6e 20 61 6e 20 55 50 44   steps in an UPD
12470 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 6e  ATE or DELETE on
12480 20 61 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62   a parent .# tab
12490 6c 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  le is as follows
124a0 3a 0a 23 0a 23 20 20 20 31 2e 20 45 78 65 63 75  :.#.#   1. Execu
124b0 74 65 20 61 70 70 6c 69 63 61 62 6c 65 20 42 45  te applicable BE
124c0 46 4f 52 45 20 74 72 69 67 67 65 72 20 70 72 6f  FORE trigger pro
124d0 67 72 61 6d 73 2c 0a 23 20 20 20 32 2e 20 43 68  grams,.#   2. Ch
124e0 65 63 6b 20 6c 6f 63 61 6c 20 28 6e 6f 6e 20 66  eck local (non f
124f0 6f 72 65 69 67 6e 20 6b 65 79 29 20 63 6f 6e 73  oreign key) cons
12500 74 72 61 69 6e 74 73 2c 0a 23 20 20 20 33 2e 20  traints,.#   3. 
12510 55 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65  Update or delete
12520 20 74 68 65 20 72 6f 77 20 69 6e 20 74 68 65 20   the row in the 
12530 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 0a 23 20  parent table,.# 
12540 20 20 34 2e 20 50 65 72 66 6f 72 6d 20 61 6e 79    4. Perform any
12550 20 72 65 71 75 69 72 65 64 20 66 6f 72 65 69 67   required foreig
12560 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2c 0a 23  n key actions,.#
12570 20 20 20 35 2e 20 45 78 65 63 75 74 65 20 61 70     5. Execute ap
12580 70 6c 69 63 61 62 6c 65 20 41 46 54 45 52 20 74  plicable AFTER t
12590 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
125a0 20 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62   .#.drop_all_tab
125b0 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
125c0 65 79 2d 35 31 2e 31 20 7b 0a 20 20 70 72 6f 63  ey-51.1 {.  proc
125d0 20 6d 61 78 70 61 72 65 6e 74 20 7b 61 72 67 73   maxparent {args
125e0 7d 20 7b 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45  } { db one {SELE
125f0 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 70  CT max(x) FROM p
12600 61 72 65 6e 74 7d 20 7d 0a 20 20 64 62 20 66 75  arent} }.  db fu
12610 6e 63 20 6d 61 78 70 61 72 65 6e 74 20 6d 61 78  nc maxparent max
12620 70 61 72 65 6e 74 0a 0a 20 20 65 78 65 63 73 71  parent..  execsq
12630 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
12640 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52  ABLE parent(x PR
12650 49 4d 41 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20  IMARY KEY);..   
12660 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
12670 62 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45  bu BEFORE UPDATE
12680 20 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e   ON parent BEGIN
12690 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
126a0 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
126b0 28 6e 65 77 2e 78 2d 6f 6c 64 2e 78 29 3b 0a 20  (new.x-old.x);. 
126c0 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
126d0 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 0a  TE TABLE child(.
126e0 20 20 20 20 20 20 61 20 44 45 46 41 55 4c 54 20        a DEFAULT 
126f0 28 6d 61 78 70 61 72 65 6e 74 28 29 29 20 52 45  (maxparent()) RE
12700 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
12710 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45  ON UPDATE SET DE
12720 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20  FAULT.    );.   
12730 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
12740 61 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20  au AFTER UPDATE 
12750 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a  ON parent BEGIN.
12760 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
12770 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
12780 6e 65 77 2e 78 2b 6f 6c 64 2e 78 29 3b 0a 20 20  new.x+old.x);.  
12790 20 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45    END;..    INSE
127a0 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
127b0 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e  ALUES(1);.    IN
127c0 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20  SERT INTO child 
127d0 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 7d  VALUES(1);.  }.}
127e0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
127f0 65 79 2d 35 31 2e 32 20 7b 0a 20 20 65 78 65 63  ey-51.2 {.  exec
12800 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12810 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20   parent SET x = 
12820 32 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  22;.    SELECT *
12830 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 4f 52 44   FROM parent ORD
12840 45 52 20 42 59 20 72 6f 77 69 64 3b 20 53 45 4c  ER BY rowid; SEL
12850 45 43 54 20 27 78 78 78 27 20 3b 20 53 45 4c 45  ECT 'xxx' ; SELE
12860 43 54 20 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b  CT a FROM child;
12870 0a 20 20 7d 0a 7d 20 7b 32 32 20 32 31 20 32 33  .  }.} {22 21 23
12880 20 78 78 78 20 32 32 7d 0a 64 6f 5f 74 65 73 74   xxx 22}.do_test
12890 20 65 5f 66 6b 65 79 2d 35 31 2e 33 20 7b 0a 20   e_fkey-51.3 {. 
128a0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
128b0 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 69 6c 64  ELETE FROM child
128c0 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
128d0 4d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 49 4e  M parent;.    IN
128e0 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
128f0 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20   VALUES(-1);.   
12900 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
12910 6c 64 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20  ld VALUES(-1);. 
12920 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
12930 20 53 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20   SET x = 22;.   
12940 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
12950 61 72 65 6e 74 20 4f 52 44 45 52 20 42 59 20 72  arent ORDER BY r
12960 6f 77 69 64 3b 20 53 45 4c 45 43 54 20 27 78 78  owid; SELECT 'xx
12970 78 27 20 3b 20 53 45 4c 45 43 54 20 61 20 46 52  x' ; SELECT a FR
12980 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
12990 7b 32 32 20 32 33 20 32 31 20 78 78 78 20 32 33  {22 23 21 xxx 23
129a0 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
129b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
129f0 20 56 65 72 69 66 79 20 74 68 61 74 20 4f 4e 20   Verify that ON 
12a00 55 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20 6f  UPDATE actions o
12a10 6e 6c 79 20 61 63 74 75 61 6c 6c 79 20 74 61 6b  nly actually tak
12a20 65 20 70 6c 61 63 65 20 69 66 20 74 68 65 20 70  e place if the p
12a30 61 72 65 6e 74 20 6b 65 79 0a 23 20 69 73 20 73  arent key.# is s
12a40 65 74 20 74 6f 20 61 20 6e 65 77 20 76 61 6c 75  et to a new valu
12a50 65 20 74 68 61 74 20 69 73 20 64 69 73 74 69 6e  e that is distin
12a60 63 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20  ct from the old 
12a70 76 61 6c 75 65 2e 20 54 68 65 20 64 65 66 61 75  value. The defau
12a80 6c 74 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lt.# collation s
12a90 65 71 75 65 6e 63 65 20 61 6e 64 20 61 66 66 69  equence and affi
12aa0 6e 69 74 79 20 61 72 65 20 75 73 65 64 20 74 6f  nity are used to
12ab0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
12ac0 65 20 6e 65 77 20 76 61 6c 75 65 0a 23 20 69 73  e new value.# is
12ad0 20 27 64 69 73 74 69 6e 63 74 27 20 66 72 6f 6d   'distinct' from
12ae0 20 74 68 65 20 6f 6c 64 20 6f 72 20 6e 6f 74 2e   the old or not.
12af0 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
12b00 3a 20 52 2d 32 37 33 38 33 2d 31 30 32 34 36 20  : R-27383-10246 
12b10 41 6e 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  An ON UPDATE act
12b20 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 74 61 6b 65  ion is only take
12b30 6e 20 69 66 20 74 68 65 0a 23 20 76 61 6c 75 65  n if the.# value
12b40 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
12b50 6b 65 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64  key are modified
12b60 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
12b70 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 76 61   parent key.# va
12b80 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 65 71 75  lues are not equ
12b90 61 6c 20 74 6f 20 74 68 65 20 6f 6c 64 2e 0a 23  al to the old..#
12ba0 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
12bb0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
12bc0 35 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  52.1 {.  execsql
12bd0 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
12be0 42 4c 45 20 7a 65 75 73 28 61 20 49 4e 54 45 47  BLE zeus(a INTEG
12bf0 45 52 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53  ER COLLATE NOCAS
12c00 45 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  E, b, PRIMARY KE
12c10 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
12c20 45 41 54 45 20 54 41 42 4c 45 20 61 70 6f 6c 6c  EATE TABLE apoll
12c30 6f 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46  o(c, d, .      F
12c40 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
12c50 20 52 45 46 45 52 45 4e 43 45 53 20 7a 65 75 73   REFERENCES zeus
12c60 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
12c70 44 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e  DE.    );.    IN
12c80 53 45 52 54 20 49 4e 54 4f 20 7a 65 75 73 20 56  SERT INTO zeus V
12c90 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 78 79  ALUES('abc', 'xy
12ca0 7a 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  z');.    INSERT 
12cb0 49 4e 54 4f 20 61 70 6f 6c 6c 6f 20 56 41 4c 55  INTO apollo VALU
12cc0 45 53 28 27 41 42 43 27 2c 20 27 78 79 7a 27 29  ES('ABC', 'xyz')
12cd0 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
12ce0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75  {.    UPDATE zeu
12cf0 73 20 53 45 54 20 61 20 3d 20 27 61 42 63 27 3b  s SET a = 'aBc';
12d00 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
12d10 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12d20 20 7b 41 42 43 20 78 79 7a 7d 0a 64 6f 5f 74 65   {ABC xyz}.do_te
12d30 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 32 20 7b  st e_fkey-52.2 {
12d40 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12d50 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54   UPDATE zeus SET
12d60 20 61 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20   a = 1, b = 1;. 
12d70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
12d80 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b   apollo;.  }.} {
12d90 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  1 1}.do_test e_f
12da0 6b 65 79 2d 35 32 2e 33 20 7b 0a 20 20 65 78 65  key-52.3 {.  exe
12db0 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12dc0 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20 31  E zeus SET a = 1
12dd0 2c 20 62 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c  , b = 1;.    SEL
12de0 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63  ECT typeof(c), c
12df0 2c 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46  , typeof(d), d F
12e00 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a  ROM apollo;.  }.
12e10 7d 20 7b 69 6e 74 65 67 65 72 20 31 20 69 6e 74  } {integer 1 int
12e20 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20  eger 1}.do_test 
12e30 65 5f 66 6b 65 79 2d 35 32 2e 34 20 7b 0a 20 20  e_fkey-52.4 {.  
12e40 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
12e50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20  DATE zeus SET a 
12e60 3d 20 27 31 27 3b 0a 20 20 20 20 53 45 4c 45 43  = '1';.    SELEC
12e70 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20  T typeof(c), c, 
12e80 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f  typeof(d), d FRO
12e90 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20  M apollo;.  }.} 
12ea0 7b 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67  {integer 1 integ
12eb0 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  er 1}.do_test e_
12ec0 66 6b 65 79 2d 35 32 2e 35 20 7b 0a 20 20 65 78  fkey-52.5 {.  ex
12ed0 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
12ee0 54 45 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20  TE zeus SET b = 
12ef0 27 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  '1';.    SELECT 
12f00 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79  typeof(c), c, ty
12f10 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20  peof(d), d FROM 
12f20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69  apollo;.  }.} {i
12f30 6e 74 65 67 65 72 20 31 20 74 65 78 74 20 31 7d  nteger 1 text 1}
12f40 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
12f50 35 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  52.6 {.  execsql
12f60 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65   {.    UPDATE ze
12f70 75 73 20 53 45 54 20 62 20 3d 20 4e 55 4c 4c 3b  us SET b = NULL;
12f80 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65  .    SELECT type
12f90 6f 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66  of(c), c, typeof
12fa0 28 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c  (d), d FROM apol
12fb0 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67  lo;.  }.} {integ
12fc0 65 72 20 31 20 6e 75 6c 6c 20 7b 7d 7d 0a 0a 23  er 1 null {}}..#
12fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
13020 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 31 32 39  ENCE-OF: R-35129
13030 2d 35 38 31 34 31 0a 23 0a 23 20 54 65 73 74 20  -58141.#.# Test 
13040 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20  an example from 
13050 74 68 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61  the "ON DELETE a
13060 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74  nd ON UPDATE Act
13070 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23  ions" section .#
13080 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e   of foreignkeys.
13090 68 74 6d 6c 2e 20 54 68 69 73 20 65 78 61 6d 70  html. This examp
130a0 6c 65 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  le demonstrates 
130b0 74 68 61 74 20 4f 4e 20 55 50 44 41 54 45 20 61  that ON UPDATE a
130c0 63 74 69 6f 6e 73 0a 23 20 6f 6e 6c 79 20 74 61  ctions.# only ta
130d0 6b 65 20 70 6c 61 63 65 20 69 66 20 61 74 20 6c  ke place if at l
130e0 65 61 73 74 20 6f 6e 65 20 70 61 72 65 6e 74 20  east one parent 
130f0 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 73 65  key column is se
13100 74 20 74 6f 20 61 20 76 61 6c 75 65 20 0a 23 20  t to a value .# 
13110 74 68 61 74 20 69 73 20 64 69 73 74 69 6e 63 74  that is distinct
13120 20 66 72 6f 6d 20 69 74 73 20 70 72 65 76 69 6f   from its previo
13130 75 73 20 76 61 6c 75 65 2e 0a 23 0a 64 72 6f 70  us value..#.drop
13140 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
13150 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 31 20  est e_fkey-53.1 
13160 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
13170 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
13180 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20  arent(x PRIMARY 
13190 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
131a0 20 54 41 42 4c 45 20 63 68 69 6c 64 28 79 20 52   TABLE child(y R
131b0 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
131c0 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e   ON UPDATE SET N
131d0 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
131e0 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
131f0 55 45 53 28 27 6b 65 79 27 29 3b 0a 20 20 20 20  UES('key');.    
13200 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
13210 64 20 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b  d VALUES('key');
13220 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
13230 74 20 65 5f 66 6b 65 79 2d 35 33 2e 32 20 7b 0a  t e_fkey-53.2 {.
13240 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
13250 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
13260 54 20 78 20 3d 20 27 6b 65 79 27 3b 0a 20 20 20  T x = 'key';.   
13270 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79   SELECT IFNULL(y
13280 2c 20 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63  , 'null') FROM c
13290 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79  hild;.  }.} {key
132a0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
132b0 2d 35 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -53.3 {.  execsq
132c0 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70  l {.    UPDATE p
132d0 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b  arent SET x = 'k
132e0 65 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  ey2';.    SELECT
132f0 20 49 46 4e 55 4c 4c 28 79 2c 20 27 6e 75 6c 6c   IFNULL(y, 'null
13300 27 29 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20  ') FROM child;. 
13310 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 23 23   }.} {null}..###
13320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13360 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43  ########.### SEC
13370 54 49 4f 4e 20 35 3a 20 43 52 45 41 54 45 2c 20  TION 5: CREATE, 
13380 41 4c 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54  ALTER and DROP T
13390 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 0a 23 23  ABLE commands.##
133a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
133e0 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d  #########..#----
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13430 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
13440 74 20 70 61 72 65 6e 74 20 6b 65 79 73 20 61 72  t parent keys ar
13450 65 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68  e not checked wh
13460 65 6e 20 74 61 62 6c 65 73 20 61 72 65 20 63 72  en tables are cr
13470 65 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  eated..#.# EVIDE
13480 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 30 31 38 2d  NCE-OF: R-36018-
13490 32 31 37 35 35 20 54 68 65 20 70 61 72 65 6e 74  21755 The parent
134a0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73   key definitions
134b0 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a   of foreign key.
134c0 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  # constraints ar
134d0 65 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68  e not checked wh
134e0 65 6e 20 61 20 74 61 62 6c 65 20 69 73 20 63 72  en a table is cr
134f0 65 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  eated..#.# EVIDE
13500 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 33 38 34 2d  NCE-OF: R-25384-
13510 33 39 33 33 37 20 54 68 65 72 65 20 69 73 20 6e  39337 There is n
13520 6f 74 68 69 6e 67 20 73 74 6f 70 70 69 6e 67 20  othing stopping 
13530 74 68 65 20 75 73 65 72 20 66 72 6f 6d 0a 23 20  the user from.# 
13540 63 72 65 61 74 69 6e 67 20 61 20 66 6f 72 65 69  creating a forei
13550 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
13560 6e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  n that refers to
13570 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20   a parent table 
13580 74 68 61 74 0a 23 20 64 6f 65 73 20 6e 6f 74 20  that.# does not 
13590 65 78 69 73 74 2c 20 6f 72 20 74 6f 20 70 61 72  exist, or to par
135a0 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
135b0 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73  that do not exis
135c0 74 20 6f 72 20 61 72 65 20 6e 6f 74 0a 23 20 63  t or are not.# c
135d0 6f 6c 6c 65 63 74 69 76 65 6c 79 20 62 6f 75 6e  ollectively boun
135e0 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
135f0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
13600 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20 43 68 69  straint..#.# Chi
13610 6c 64 20 6b 65 79 73 20 61 72 65 20 63 68 65 63  ld keys are chec
13620 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6c  ked to ensure al
13630 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20 63 6f 6c 75  l component colu
13640 6d 6e 73 20 65 78 69 73 74 2e 20 49 66 20 70 61  mns exist. If pa
13650 72 65 6e 74 0a 23 20 6b 65 79 20 63 6f 6c 75 6d  rent.# key colum
13660 6e 73 20 61 72 65 20 65 78 70 6c 69 63 69 74 6c  ns are explicitl
13670 79 20 73 70 65 63 69 66 69 65 64 2c 20 53 51 4c  y specified, SQL
13680 69 74 65 20 63 68 65 63 6b 73 20 74 6f 20 6d 61  ite checks to ma
13690 6b 65 20 73 75 72 65 20 74 68 65 72 65 0a 23 20  ke sure there.# 
136a0 61 72 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  are the same num
136b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
136c0 6e 20 74 68 65 20 63 68 69 6c 64 20 61 6e 64 20  n the child and 
136d0 70 61 72 65 6e 74 20 6b 65 79 73 2e 20 28 54 4f  parent keys. (TO
136e0 44 4f 3a 20 54 68 69 73 0a 23 20 69 73 20 74 65  DO: This.# is te
136f0 73 74 65 64 20 62 75 74 20 64 6f 65 73 20 6e 6f  sted but does no
13700 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  t correspond to 
13710 61 6e 79 20 74 65 73 74 61 62 6c 65 20 73 74 61  any testable sta
13720 74 65 6d 65 6e 74 2e 29 0a 23 0a 23 20 41 6c 73  tement.).#.# Als
13730 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  o test that the 
13740 61 62 6f 76 65 20 73 74 61 74 65 6d 65 6e 74 73  above statements
13750 20 61 72 65 20 74 72 75 65 20 72 65 67 61 72 64   are true regard
13760 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
13770 6f 72 20 6e 6f 74 0a 23 20 66 6f 72 65 69 67 6e  or not.# foreign
13780 20 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65   keys are enable
13790 64 3a 20 20 22 41 20 43 52 45 41 54 45 20 54 41  d:  "A CREATE TA
137a0 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72  BLE command oper
137b0 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 77 68  ates the same wh
137c0 65 74 68 65 72 0a 23 20 6f 72 20 6e 6f 74 20 66  ether.# or not f
137d0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
137e0 72 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c  raints are enabl
137f0 65 64 2e 22 0a 23 0a 23 20 45 56 49 44 45 4e 43  ed.".#.# EVIDENC
13800 45 2d 4f 46 3a 20 52 2d 30 38 39 30 38 2d 32 33  E-OF: R-08908-23
13810 34 33 39 20 41 20 43 52 45 41 54 45 20 54 41 42  439 A CREATE TAB
13820 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61  LE command opera
13830 74 65 73 20 74 68 65 20 73 61 6d 65 0a 23 20 77  tes the same.# w
13840 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f  hether or not fo
13850 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
13860 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
13870 64 2e 0a 23 20 0a 66 6f 72 65 61 63 68 20 7b 74  d..# .foreach {t
13880 6e 20 7a 43 72 65 61 74 65 54 62 6c 20 6c 52 65  n zCreateTbl lRe
13890 73 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45  s} {.  1 "CREATE
138a0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52   TABLE t1(a, b R
138b0 45 46 45 52 45 4e 43 45 53 20 74 31 29 22 20 20  EFERENCES t1)"  
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 20 7b 30 20 7b 7d 7d            {0 {}}
138e0 0a 20 20 32 20 22 43 52 45 41 54 45 20 54 41 42  .  2 "CREATE TAB
138f0 4c 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52  LE t1(a, b REFER
13900 45 4e 43 45 53 20 74 32 29 22 20 20 20 20 20 20  ENCES t2)"      
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 33        {0 {}}.  3
13930 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
13940 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  1(a, b, FOREIGN 
13950 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e  KEY(a,b) REFEREN
13960 43 45 53 20 74 31 29 22 20 20 20 20 20 20 20 20  CES t1)"        
13970 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 20 22 43 52    {0 {}}.  4 "CR
13980 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
13990 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
139a0 61 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  a,b) REFERENCES 
139b0 74 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30  t2)"          {0
139c0 20 7b 7d 7d 0a 20 20 35 20 22 43 52 45 41 54 45   {}}.  5 "CREATE
139d0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
139e0 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29  FOREIGN KEY(a,b)
139f0 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22   REFERENCES t2)"
13a00 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d            {0 {}}
13a10 0a 20 20 36 20 22 43 52 45 41 54 45 20 54 41 42  .  6 "CREATE TAB
13a20 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45  LE t1(a, b, FORE
13a30 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46  IGN KEY(a,b) REF
13a40 45 52 45 4e 43 45 53 20 74 32 28 6e 2c 64 29 29  ERENCES t2(n,d))
13a50 22 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 37  "     {0 {}}.  7
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 61 2c 62 29 20 52 45 46 45 52 45 4e  KEY(a,b) REFEREN
13a90 43 45 53 20 74 31 28 61 2c 62 29 29 22 20 20 20  CES t1(a,b))"   
13aa0 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 41 20 22 43    {0 {}}..  A "C
13ab0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
13ac0 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
13ad0 28 63 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53  (c,b) REFERENCES
13ae0 20 74 32 29 22 20 20 20 20 20 20 20 20 20 20 0a   t2)"          .
13af0 20 20 20 20 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e       {1 {unknown
13b00 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66   column "c" in f
13b10 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
13b20 69 74 69 6f 6e 7d 7d 0a 20 20 42 20 22 43 52 45  ition}}.  B "CRE
13b30 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13b40 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  b, FOREIGN KEY(c
13b50 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13b60 32 28 64 29 29 22 20 20 20 20 20 20 20 20 20 20  2(d))"          
13b70 0a 20 20 20 20 20 7b 31 20 7b 6e 75 6d 62 65 72  .     {1 {number
13b80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
13b90 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
13ba0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
13bb0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
13bc0 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
13bd0 64 20 74 61 62 6c 65 7d 7d 0a 7d 20 7b 0a 20 20  d table}}.} {.  
13be0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
13bf0 34 2e 24 74 6e 2e 6f 66 66 20 7b 0a 20 20 20 20  4.$tn.off {.    
13c00 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
13c10 20 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41      execsql {PRA
13c20 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
13c30 20 3d 20 4f 46 46 7d 0a 20 20 20 20 63 61 74 63   = OFF}.    catc
13c40 68 73 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c  hsql $zCreateTbl
13c50 0a 20 20 7d 20 24 6c 52 65 73 0a 20 20 64 6f 5f  .  } $lRes.  do_
13c60 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24  test e_fkey-54.$
13c70 74 6e 2e 6f 6e 20 7b 0a 20 20 20 20 64 72 6f 70  tn.on {.    drop
13c80 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20  _all_tables.    
13c90 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
13ca0 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
13cb0 4e 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  N}.    catchsql 
13cc0 24 7a 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20  $zCreateTbl.  } 
13cd0 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  $lRes.}..#------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d20 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
13d30 46 3a 20 52 2d 34 37 39 35 32 2d 36 32 34 39 38  F: R-47952-62498
13d40 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
13d50 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 22  ble to use the "
13d60 41 4c 54 45 52 20 54 41 42 4c 45 0a 23 20 2e 2e  ALTER TABLE.# ..
13d70 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 22 20 73 79  . ADD COLUMN" sy
13d80 6e 74 61 78 20 74 6f 20 61 64 64 20 61 20 63 6f  ntax to add a co
13d90 6c 75 6d 6e 20 74 68 61 74 20 69 6e 63 6c 75 64  lumn that includ
13da0 65 73 20 61 20 52 45 46 45 52 45 4e 43 45 53 0a  es a REFERENCES.
13db0 23 20 63 6c 61 75 73 65 2c 20 75 6e 6c 65 73 73  # clause, unless
13dc0 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
13dd0 75 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f  ue of the new co
13de0 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 20 41 74  lumn is NULL. At
13df0 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 64 6f  tempting.# to do
13e00 20 73 6f 20 72 65 74 75 72 6e 73 20 61 6e 20 65   so returns an e
13e10 72 72 6f 72 2e 0a 23 0a 70 72 6f 63 20 74 65 73  rror..#.proc tes
13e20 74 5f 65 66 6b 65 79 5f 36 20 7b 74 6e 20 7a 41  t_efkey_6 {tn zA
13e30 6c 74 65 72 20 69 73 45 72 72 6f 72 7d 20 7b 0a  lter isError} {.
13e40 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
13e50 73 20 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  s ..  do_test e_
13e60 66 6b 65 79 2d 35 36 2e 24 74 6e 2e 31 20 22 0a  fkey-56.$tn.1 ".
13e70 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52      execsql { CR
13e80 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61  EATE TABLE tbl(a
13e90 2c 20 62 29 20 7d 0a 20 20 20 20 5b 6c 69 73 74  , b) }.    [list
13ea0 20 63 61 74 63 68 73 71 6c 20 24 7a 41 6c 74 65   catchsql $zAlte
13eb0 72 5d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  r].  " [lindex {
13ec0 7b 30 20 7b 7d 7d 20 7b 31 20 7b 43 61 6e 6e 6f  {0 {}} {1 {Canno
13ed0 74 20 61 64 64 20 61 20 52 45 46 45 52 45 4e 43  t add a REFERENC
13ee0 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e  ES column with n
13ef0 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20  on-NULL default 
13f00 76 61 6c 75 65 7d 7d 7d 20 24 69 73 45 72 72 6f  value}}} $isErro
13f10 72 5d 0a 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65  r]..}..test_efke
13f20 79 5f 36 20 31 20 22 41 4c 54 45 52 20 54 41 42  y_6 1 "ALTER TAB
13f30 4c 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d  LE tbl ADD COLUM
13f40 4e 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 78  N c REFERENCES x
13f50 78 22 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f  x" 0.test_efkey_
13f60 36 20 32 20 22 41 4c 54 45 52 20 54 41 42 4c 45  6 2 "ALTER TABLE
13f70 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20   tbl ADD COLUMN 
13f80 63 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52  c DEFAULT NULL R
13f90 45 46 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a  EFERENCES xx" 0.
13fa0 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 33 20 22  test_efkey_6 3 "
13fb0 41 4c 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20  ALTER TABLE tbl 
13fc0 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46  ADD COLUMN c DEF
13fd0 41 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45  AULT 0 REFERENCE
13fe0 53 20 78 78 22 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d  S xx" 1..#------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14030 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
14040 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64 6a 75  ALTER TABLE adju
14050 73 74 73 20 52 45 46 45 52 45 4e 43 45 53 20 63  sts REFERENCES c
14060 6c 61 75 73 65 73 20 77 68 65 6e 20 74 68 65 20  lauses when the 
14070 70 61 72 65 6e 74 20 74 61 62 6c 65 0a 23 20 69  parent table.# i
14080 73 20 52 45 4e 41 4d 45 44 2e 0a 23 0a 23 20 45  s RENAMED..#.# E
14090 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
140a0 30 38 30 2d 30 32 30 36 39 20 49 66 20 61 6e 20  080-02069 If an 
140b0 22 41 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e 2e  "ALTER TABLE ...
140c0 20 52 45 4e 41 4d 45 20 54 4f 22 20 63 6f 6d 6d   RENAME TO" comm
140d0 61 6e 64 0a 23 20 69 73 20 75 73 65 64 20 74 6f  and.# is used to
140e0 20 72 65 6e 61 6d 65 20 61 20 74 61 62 6c 65 20   rename a table 
140f0 74 68 61 74 20 69 73 20 74 68 65 20 70 61 72 65  that is the pare
14100 6e 74 20 74 61 62 6c 65 20 6f 66 20 6f 6e 65 20  nt table of one 
14110 6f 72 20 6d 6f 72 65 0a 23 20 66 6f 72 65 69 67  or more.# foreig
14120 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
14130 73 2c 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  s, the definitio
14140 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67  ns of the foreig
14150 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69  n key.# constrai
14160 6e 74 73 20 61 72 65 20 6d 6f 64 69 66 69 65 64  nts are modified
14170 20 74 6f 20 72 65 66 65 72 20 74 6f 20 74 68 65   to refer to the
14180 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 62 79   parent table by
14190 20 69 74 73 20 6e 65 77 20 6e 61 6d 65 0a 23 0a   its new name.#.
141a0 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 73  # Test that thes
141b0 65 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 61 72  e adjustments ar
141c0 65 20 76 69 73 69 62 6c 65 20 69 6e 20 74 68 65  e visible in the
141d0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
141e0 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e  able..#.# EVIDEN
141f0 43 45 2d 4f 46 3a 20 52 2d 36 33 38 32 37 2d 35  CE-OF: R-63827-5
14200 34 37 37 34 20 54 68 65 20 74 65 78 74 20 6f 66  4774 The text of
14210 20 74 68 65 20 63 68 69 6c 64 20 43 52 45 41 54   the child CREAT
14220 45 20 54 41 42 4c 45 0a 23 20 73 74 61 74 65 6d  E TABLE.# statem
14230 65 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74  ent or statement
14240 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
14250 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
14260 62 6c 65 20 61 72 65 20 6d 6f 64 69 66 69 65 64  ble are modified
14270 0a 23 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  .# to reflect th
14280 65 20 6e 65 77 20 70 61 72 65 6e 74 20 74 61 62  e new parent tab
14290 6c 65 20 6e 61 6d 65 2e 0a 23 0a 64 6f 5f 74 65  le name..#.do_te
142a0 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 31 20 7b  st e_fkey-56.1 {
142b0 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
142c0 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
142d0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
142e0 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65  'p 1 "parent one
142f0 22 27 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  "'(a 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 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  "', b, PRIMARY K
14320 45 59 28 62 29 29 3b 0a 0a 20 20 20 20 43 52 45  EY(b));..    CRE
14330 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
14340 64 20 52 45 46 45 52 45 4e 43 45 53 20 27 70 20  d REFERENCES 'p 
14350 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20  1 "parent one"' 
14360 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
14370 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
14380 41 42 4c 45 20 63 32 28 65 2c 20 66 2c 20 46 4f  ABLE c2(e, f, FO
14390 52 45 49 47 4e 20 4b 45 59 28 66 29 20 52 45 46  REIGN KEY(f) REF
143a0 45 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61  ERENCES 'p 1 "pa
143b0 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50  rent one"' ON UP
143c0 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  DATE CASCADE);. 
143d0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
143e0 63 33 28 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c  c3(e, 'f col 2',
143f0 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 27 66 20   FOREIGN KEY('f 
14400 63 6f 6c 20 32 27 29 20 52 45 46 45 52 45 4e 43  col 2') REFERENC
14410 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  ES 'p 1 "parent 
14420 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20  one"' ON UPDATE 
14430 43 41 53 43 41 44 45 29 3b 0a 0a 20 20 20 20 49  CASCADE);..    I
14440 4e 53 45 52 54 20 49 4e 54 4f 20 27 70 20 31 20  NSERT INTO 'p 1 
14450 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 56 41  "parent one"' VA
14460 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20  LUES(1, 1);.    
14470 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
14480 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20  ALUES(1, 1);.   
14490 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20   INSERT INTO c2 
144a0 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20  VALUES(1, 1);.  
144b0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33    INSERT INTO c3
144c0 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 0a   VALUES(1, 1);..
144d0 20 20 20 20 2d 2d 20 43 52 45 41 54 45 20 54 41      -- CREATE TA
144e0 42 4c 45 20 71 28 61 2c 20 62 2c 20 50 52 49 4d  BLE q(a, b, PRIM
144f0 41 52 59 20 4b 45 59 28 62 29 29 3b 0a 20 20 7d  ARY KEY(b));.  }
14500 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
14510 66 6b 65 79 2d 35 36 2e 32 20 7b 0a 20 20 65 78  fkey-56.2 {.  ex
14520 65 63 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41  ecsql { ALTER TA
14530 42 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74  BLE 'p 1 "parent
14540 20 6f 6e 65 22 27 20 52 45 4e 41 4d 45 20 54 4f   one"' RENAME TO
14550 20 70 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   p }.} {}.do_tes
14560 74 20 65 5f 66 6b 65 79 2d 35 36 2e 33 20 7b 0a  t e_fkey-56.3 {.
14570 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
14580 55 50 44 41 54 45 20 70 20 53 45 54 20 61 20 3d  UPDATE p SET a =
14590 20 27 78 78 78 27 2c 20 62 20 3d 20 27 78 78 78   'xxx', b = 'xxx
145a0 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
145b0 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45  FROM p;.    SELE
145c0 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20  CT * FROM c1;.  
145d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
145e0 63 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  c2;.    SELECT *
145f0 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 7d 20   FROM c3;.  }.} 
14600 7b 78 78 78 20 78 78 78 20 31 20 78 78 78 20 31  {xxx xxx 1 xxx 1
14610 20 78 78 78 20 31 20 78 78 78 7d 0a 64 6f 5f 74   xxx 1 xxx}.do_t
14620 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 34 20  est e_fkey-56.4 
14630 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
14640 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
14650 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
14660 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27  E type = 'table'
14670 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  }.} [list       
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
146c0 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20    {CREATE TABLE 
146d0 22 70 22 28 61 20 52 45 46 45 52 45 4e 43 45 53  "p"(a REFERENCES
146e0 20 22 70 22 2c 20 62 2c 20 50 52 49 4d 41 52 59   "p", b, PRIMARY
146f0 20 4b 45 59 28 62 29 29 7d 20 20 20 20 20 20 20   KEY(b))}       
14700 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
14710 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31  {CREATE TABLE c1
14720 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53  (c, d REFERENCES
14730 20 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43   "p" ON UPDATE C
14740 41 53 43 41 44 45 29 7d 20 20 20 20 20 20 20 20  ASCADE)}        
14750 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43            \.  {C
14760 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 65  REATE TABLE c2(e
14770 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , f, FOREIGN KEY
14780 28 66 29 20 52 45 46 45 52 45 4e 43 45 53 20 22  (f) REFERENCES "
14790 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  p" ON UPDATE CAS
147a0 43 41 44 45 29 7d 20 20 5c 0a 20 20 7b 43 52 45  CADE)}  \.  {CRE
147b0 41 54 45 20 54 41 42 4c 45 20 63 33 28 65 2c 20  ATE TABLE c3(e, 
147c0 27 66 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45 49  'f col 2', FOREI
147d0 47 4e 20 4b 45 59 28 27 66 20 63 6f 6c 20 32 27  GN KEY('f col 2'
147e0 29 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22  ) REFERENCES "p"
147f0 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
14800 44 45 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d  DE)} \.]..#-----
14810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14850 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
14860 74 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 64  t a DROP TABLE d
14870 6f 65 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20  oes an implicit 
14880 44 45 4c 45 54 45 20 46 52 4f 4d 2e 20 57 68 69  DELETE FROM. Whi
14890 63 68 20 64 6f 65 73 20 6e 6f 74 0a 23 20 63 61  ch does not.# ca
148a0 75 73 65 20 61 6e 79 20 74 72 69 67 67 65 72 73  use any triggers
148b0 20 74 6f 20 66 69 72 65 2c 20 62 75 74 20 64 6f   to fire, but do
148c0 65 73 20 66 69 72 65 20 66 6f 72 65 69 67 6e 20  es fire foreign 
148d0 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23  key actions..#.#
148e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
148f0 31 34 32 30 38 2d 32 33 39 38 36 20 49 66 20 66  14208-23986 If f
14900 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
14910 72 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c  raints are enabl
14920 65 64 20 77 68 65 6e 0a 23 20 69 74 20 69 73 20  ed when.# it is 
14930 70 72 65 70 61 72 65 64 2c 20 74 68 65 20 44 52  prepared, the DR
14940 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
14950 20 70 65 72 66 6f 72 6d 73 20 61 6e 20 69 6d 70   performs an imp
14960 6c 69 63 69 74 20 44 45 4c 45 54 45 20 74 6f 0a  licit DELETE to.
14970 23 20 72 65 6d 6f 76 65 20 61 6c 6c 20 72 6f 77  # remove all row
14980 73 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  s from the table
14990 20 62 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67   before dropping
149a0 20 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43   it..#.# EVIDENC
149b0 45 2d 4f 46 3a 20 52 2d 31 31 30 37 38 2d 30 33  E-OF: R-11078-03
149c0 39 34 35 20 54 68 65 20 69 6d 70 6c 69 63 69 74  945 The implicit
149d0 20 44 45 4c 45 54 45 20 64 6f 65 73 20 6e 6f 74   DELETE does not
149e0 20 63 61 75 73 65 20 61 6e 79 20 53 51 4c 0a 23   cause any SQL.#
149f0 20 74 72 69 67 67 65 72 73 20 74 6f 20 66 69 72   triggers to fir
14a00 65 2c 20 62 75 74 20 6d 61 79 20 69 6e 76 6f 6b  e, but may invok
14a10 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63  e foreign key ac
14a20 74 69 6f 6e 73 20 6f 72 20 63 6f 6e 73 74 72 61  tions or constra
14a30 69 6e 74 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 73  int.# violations
14a40 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..#.do_test e_fk
14a50 65 79 2d 35 37 2e 31 20 7b 0a 20 20 64 72 6f 70  ey-57.1 {.  drop
14a60 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78  _all_tables.  ex
14a70 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
14a80 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c  TE TABLE p(a, b,
14a90 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
14aa0 62 29 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  b));..    CREATE
14ab0 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20   TABLE c1(c, d, 
14ac0 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
14ad0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  ) REFERENCES p O
14ae0 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c  N DELETE SET NUL
14af0 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  L);.    CREATE T
14b00 41 42 4c 45 20 63 32 28 63 2c 20 64 2c 20 46 4f  ABLE c2(c, d, FO
14b10 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
14b20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
14b30 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55  DELETE SET DEFAU
14b40 4c 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  LT);.    CREATE 
14b50 54 41 42 4c 45 20 63 33 28 63 2c 20 64 2c 20 46  TABLE c3(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 43 41 53 43 41 44 45 29   DELETE CASCADE)
14b90 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14ba0 4c 45 20 63 34 28 63 2c 20 64 2c 20 46 4f 52 45  LE c4(c, d, FORE
14bb0 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45  IGN KEY(c, d) RE
14bc0 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
14bd0 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a  LETE RESTRICT);.
14be0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14bf0 20 63 35 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c5(c, d, FOREIG
14c00 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
14c10 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45  RENCES p ON DELE
14c20 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a  TE NO ACTION);..
14c30 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14c40 20 63 36 28 63 2c 20 64 2c 20 0a 20 20 20 20 20   c6(c, d, .     
14c50 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
14c60 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
14c70 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
14c80 43 54 20 0a 20 20 20 20 20 20 44 45 46 45 52 52  CT .      DEFERR
14c90 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
14ca0 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20  EFERRED.    );. 
14cb0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14cc0 63 37 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20  c7(c, d, .      
14cd0 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
14ce0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  ) REFERENCES p O
14cf0 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49  N DELETE NO ACTI
14d00 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41  ON.      DEFERRA
14d10 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
14d20 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20  FERRED.    );.. 
14d30 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14d40 6c 6f 67 28 6d 73 67 29 3b 0a 20 20 20 20 43 52  log(msg);.    CR
14d50 45 41 54 45 20 54 52 49 47 47 45 52 20 74 74 20  EATE TRIGGER tt 
14d60 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
14d70 70 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  p BEGIN.      IN
14d80 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
14d90 4c 55 45 53 28 27 64 65 6c 65 74 65 20 27 20 7c  LUES('delete ' |
14da0 7c 20 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20  | old.rowid);.  
14db0 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
14dc0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14dd0 35 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  57.2 {.  execsql
14de0 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
14df0 54 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27 2c  TO p VALUES('a',
14e00 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
14e10 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
14e20 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
14e30 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
14e40 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
14e50 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
14e60 20 63 33 20 56 41 4c 55 45 53 28 27 61 27 2c 20   c3 VALUES('a', 
14e70 27 62 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  'b');.    BEGIN;
14e80 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
14e90 45 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  E p;.      SELEC
14ea0 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  T * FROM c1;.  }
14eb0 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65  .} {{} {}}.do_te
14ec0 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 33 20 7b  st e_fkey-57.3 {
14ed0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
14ee0 45 43 54 20 2a 20 46 52 4f 4d 20 63 32 20 7d 0a  ECT * FROM c2 }.
14ef0 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  } {{} {}}.do_tes
14f00 74 20 65 5f 66 6b 65 79 2d 35 37 2e 34 20 7b 0a  t e_fkey-57.4 {.
14f10 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
14f20 43 54 20 2a 20 46 52 4f 4d 20 63 33 20 7d 0a 7d  CT * FROM c3 }.}
14f30 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
14f40 65 79 2d 35 37 2e 35 20 7b 0a 20 20 65 78 65 63  ey-57.5 {.  exec
14f50 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
14f60 52 4f 4d 20 6c 6f 67 20 7d 0a 7d 20 7b 7d 0a 64  ROM log }.} {}.d
14f70 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14f80 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52  .6 {.  execsql R
14f90 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f  OLLBACK.} {}.do_
14fa0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 37  test e_fkey-57.7
14fb0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
14fc0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
14fd0 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20  DELETE FROM p;. 
14fe0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
14ff0 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 52 4f 4c 4c  OM log;.    ROLL
15000 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 64 65  BACK;.  }.} {{de
15010 6c 65 74 65 20 31 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  lete 1}}..#-----
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15060 2d 2d 2d 2d 0a 23 20 49 66 20 61 6e 20 49 4d 4d  ----.# If an IMM
15070 45 44 49 41 54 45 20 66 6f 72 65 69 67 6e 20 6b  EDIATE foreign k
15080 65 79 20 66 61 69 6c 73 20 61 73 20 61 20 72 65  ey fails as a re
15090 73 75 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54  sult of a DROP T
150a0 41 42 4c 45 2c 20 74 68 65 0a 23 20 44 52 4f 50  ABLE, the.# DROP
150b0 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 66   TABLE command f
150c0 61 69 6c 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ails..#.# EVIDEN
150d0 43 45 2d 4f 46 3a 20 52 2d 33 32 37 36 38 2d 34  CE-OF: R-32768-4
150e0 37 39 32 35 20 49 66 20 61 6e 20 69 6d 6d 65 64  7925 If an immed
150f0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
15100 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23   constraint is.#
15110 20 76 69 6f 6c 61 74 65 64 2c 20 74 68 65 20 44   violated, the D
15120 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
15130 65 6e 74 20 66 61 69 6c 73 20 61 6e 64 20 74 68  ent fails and th
15140 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 64  e table is not d
15150 72 6f 70 70 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  ropped..#.do_tes
15160 74 20 65 5f 66 6b 65 79 2d 35 38 2e 31 20 7b 0a  t e_fkey-58.1 {.
15170 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
15180 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 3b   DELETE FROM c1;
15190 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
151a0 20 63 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20   c2;.    DELETE 
151b0 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 20 20 65  FROM c3;.  }.  e
151c0 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
151d0 49 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27  INTO c5 VALUES('
151e0 61 27 2c 20 27 62 27 29 20 7d 0a 20 20 63 61 74  a', 'b') }.  cat
151f0 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
15200 4c 45 20 70 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  LE p }.} {1 {FOR
15210 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
15220 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
15230 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 32  test e_fkey-58.2
15240 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
15250 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 20 7d  ELECT * FROM p }
15260 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74  .} {a b}.do_test
15270 20 65 5f 66 6b 65 79 2d 35 38 2e 33 20 7b 0a 20   e_fkey-58.3 {. 
15280 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
15290 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f  BEGIN;.      DRO
152a0 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d  P TABLE p;.  }.}
152b0 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
152c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
152d0 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
152e0 6b 65 79 2d 35 38 2e 34 20 7b 0a 20 20 65 78 65  key-58.4 {.  exe
152f0 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
15300 54 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20  T * FROM p;.    
15310 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 35  SELECT * FROM c5
15320 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
15330 20 20 7d 0a 7d 20 7b 61 20 62 20 61 20 62 7d 0a    }.} {a b a b}.
15340 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66  -----------.# If
15390 20 61 20 44 45 46 45 52 52 45 44 20 66 6f 72 65   a DEFERRED fore
153a0 69 67 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73  ign key fails as
153b0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44   a result of a D
153c0 52 4f 50 20 54 41 42 4c 45 2c 20 61 74 74 65 6d  ROP TABLE, attem
153d0 70 74 69 6e 67 0a 23 20 74 6f 20 63 6f 6d 6d 69  pting.# to commi
153e0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
153f0 6e 20 66 61 69 6c 73 20 75 6e 6c 65 73 73 20 74  n fails unless t
15400 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20  he violation is 
15410 66 69 78 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  fixed..#.# EVIDE
15420 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 39 30 33 2d  NCE-OF: R-05903-
15430 30 38 34 36 30 20 49 66 20 61 20 64 65 66 65 72  08460 If a defer
15440 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
15450 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20  constraint is.# 
15460 76 69 6f 6c 61 74 65 64 2c 20 74 68 65 6e 20 61  violated, then a
15470 6e 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72  n error is repor
15480 74 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  ted when the use
15490 72 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6f  r attempts to co
154a0 6d 6d 69 74 0a 23 20 74 68 65 20 74 72 61 6e 73  mmit.# the trans
154b0 61 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 6f  action if the fo
154c0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
154d0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
154e0 73 74 69 6c 6c 20 65 78 69 73 74 0a 23 20 61 74  still exist.# at
154f0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 23 0a 64   that point..#.d
15500 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39  o_test e_fkey-59
15510 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
15520 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f   .    DELETE FRO
15530 4d 20 63 31 20 3b 20 44 45 4c 45 54 45 20 46 52  M c1 ; DELETE FR
15540 4f 4d 20 63 32 20 3b 20 44 45 4c 45 54 45 20 46  OM c2 ; DELETE F
15550 52 4f 4d 20 63 33 20 3b 0a 20 20 20 20 44 45 4c  ROM c3 ;.    DEL
15560 45 54 45 20 46 52 4f 4d 20 63 34 20 3b 20 44 45  ETE FROM c4 ; DE
15570 4c 45 54 45 20 46 52 4f 4d 20 63 35 20 3b 20 44  LETE FROM c5 ; D
15580 45 4c 45 54 45 20 46 52 4f 4d 20 63 36 20 3b 0a  ELETE FROM c6 ;.
15590 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
155a0 63 37 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  c7 .  }.} {}.do_
155b0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 32  test e_fkey-59.2
155c0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
155d0 4e 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41  NSERT INTO c7 VA
155e0 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d  LUES('a', 'b') }
155f0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
15600 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52   BEGIN;.      DR
15610 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a  OP TABLE p;.  }.
15620 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
15630 6b 65 79 2d 35 39 2e 33 20 7b 0a 20 20 63 61 74  key-59.3 {.  cat
15640 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  chsql COMMIT.} {
15650 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
15660 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
15670 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
15680 79 2d 35 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-59.4 {.  execs
15690 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
156a0 45 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52  E p(a, b, PRIMAR
156b0 59 20 4b 45 59 28 61 2c 20 62 29 29 20 7d 0a 20  Y KEY(a, b)) }. 
156c0 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
156d0 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
156e0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
156f0 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
15700 5f 66 6b 65 79 2d 35 39 2e 35 20 7b 0a 20 20 65  _fkey-59.5 {.  e
15710 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
15720 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 61  INTO p VALUES('a
15730 27 2c 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63  ', 'b') }.  exec
15740 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a  sql COMMIT.} {}.
15750 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 6e  -----------.# An
157a0 79 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  y "foreign key m
157b0 69 73 6d 61 74 63 68 22 20 65 72 72 6f 72 73 20  ismatch" errors 
157c0 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
157d0 65 20 72 75 6e 6e 69 6e 67 20 61 6e 20 69 6d 70  e running an imp
157e0 6c 69 63 69 74 0a 23 20 22 44 45 4c 45 54 45 20  licit.# "DELETE 
157f0 46 52 4f 4d 20 74 62 6c 22 20 61 72 65 20 69 67  FROM tbl" are ig
15800 6e 6f 72 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  nored..#.# EVIDE
15810 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 32 34 32 2d  NCE-OF: R-57242-
15820 33 37 30 30 35 20 41 6e 79 20 22 66 6f 72 65 69  37005 Any "forei
15830 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22  gn key mismatch"
15840 20 65 72 72 6f 72 73 0a 23 20 65 6e 63 6f 75 6e   errors.# encoun
15850 74 65 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tered as part of
15860 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c   an implicit DEL
15870 45 54 45 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  ETE are ignored.
15880 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
15890 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
158a0 79 2d 36 30 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-60.1 {.  execs
158b0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
158c0 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
158d0 46 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  FF;..    CREATE 
158e0 54 41 42 4c 45 20 70 28 61 20 50 52 49 4d 41 52  TABLE p(a PRIMAR
158f0 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
15900 43 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29  CES nosuchtable)
15910 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
15920 4c 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45  LE c1(c, d, FORE
15930 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45  IGN KEY(c, d) RE
15940 46 45 52 45 4e 43 45 53 20 61 29 3b 0a 20 20 20  FERENCES a);.   
15950 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32   CREATE TABLE c2
15960 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  (c REFERENCES p(
15970 62 29 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41  b), d);.    CREA
15980 54 45 20 54 41 42 4c 45 20 63 33 28 63 20 52 45  TE TABLE c3(c RE
15990 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
159a0 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 64  LETE SET NULL, d
159b0 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
159c0 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20  NTO p VALUES(1, 
159d0 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
159e0 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c  NTO c1 VALUES(1,
159f0 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
15a00 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31  INTO c2 VALUES(1
15a10 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
15a20 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28   INTO c3 VALUES(
15a30 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  1, 2);.  }.} {}.
15a40 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15a50 30 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.2 {.  execsql 
15a60 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
15a70 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 20 20 63  _keys = ON }.  c
15a80 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
15a90 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b   FROM p }.} {1 {
15aa0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d  no such table: m
15ab0 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 7d  ain.nosuchtable}
15ac0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15ad0 2d 36 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -60.3 {.  execsq
15ae0 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
15af0 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
15b00 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  p;.      SELECT 
15b10 2a 20 46 52 4f 4d 20 63 33 3b 0a 20 20 20 20 52  * FROM c3;.    R
15b20 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
15b30 7b 7d 20 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  {} 2}.do_test e_
15b40 66 6b 65 79 2d 36 30 2e 34 20 7b 0a 20 20 65 78  fkey-60.4 {.  ex
15b50 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
15b60 41 42 4c 45 20 6e 6f 73 75 63 68 74 61 62 6c 65  ABLE nosuchtable
15b70 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  (x PRIMARY KEY) 
15b80 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  }.  catchsql { D
15b90 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d  ELETE FROM p }.}
15ba0 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
15bb0 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 32 22   mismatch - "c2"
15bc0 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22   referencing "p"
15bd0 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
15be0 79 2d 36 30 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-60.5 {.  execs
15bf0 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
15c00 63 31 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  c1 }.  catchsql 
15c10 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20  { DELETE FROM p 
15c20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
15c30 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
15c40 63 32 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20  c2" referencing 
15c50 22 70 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  "p"}}.do_test e_
15c60 66 6b 65 79 2d 36 30 2e 36 20 7b 0a 20 20 65 78  fkey-60.6 {.  ex
15c70 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  ecsql { DROP TAB
15c80 4c 45 20 63 32 20 7d 0a 20 20 65 78 65 63 73 71  LE c2 }.  execsq
15c90 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
15ca0 70 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  p }.} {}..#-----
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cf0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
15d00 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 65 68   the special beh
15d10 61 76 69 6f 72 73 20 6f 66 20 41 4c 54 45 52 20  aviors of ALTER 
15d20 61 6e 64 20 44 52 4f 50 20 54 41 42 4c 45 20 61  and DROP TABLE a
15d30 72 65 20 6f 6e 6c 79 0a 23 20 61 63 74 69 76 61  re only.# activa
15d40 74 65 64 20 77 68 65 6e 20 66 6f 72 65 69 67 6e  ted when foreign
15d50 20 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65   keys are enable
15d60 64 2e 20 53 70 65 63 69 61 6c 20 62 65 68 61 76  d. Special behav
15d70 69 6f 72 73 20 61 72 65 3a 0a 23 0a 23 20 20 20  iors are:.#.#   
15d80 31 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6e 6f  1. ADD COLUMN no
15d90 74 20 61 6c 6c 6f 77 69 6e 67 20 61 20 52 45 46  t allowing a REF
15da0 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 77  ERENCES clause w
15db0 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 0a  ith a non-NULL .
15dc0 23 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76  #      default v
15dd0 61 6c 75 65 2e 0a 23 20 20 20 32 2e 20 4d 6f 64  alue..#   2. Mod
15de0 69 66 79 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  ifying foreign k
15df0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 77  ey definitions w
15e00 68 65 6e 20 61 20 70 61 72 65 6e 74 20 74 61 62  hen a parent tab
15e10 6c 65 20 69 73 20 52 45 4e 41 4d 45 64 2e 0a 23  le is RENAMEd..#
15e20 20 20 20 33 2e 20 52 75 6e 6e 69 6e 67 20 61 6e     3. Running an
15e30 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45   implicit DELETE
15e40 20 46 52 4f 4d 20 63 6f 6d 6d 61 6e 64 20 61 73   FROM command as
15e50 20 70 61 72 74 20 6f 66 20 44 52 4f 50 20 54 41   part of DROP TA
15e60 42 4c 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  BLE..#.# EVIDENC
15e70 45 2d 4f 46 3a 20 52 2d 35 34 31 34 32 2d 34 31  E-OF: R-54142-41
15e80 33 34 36 20 54 68 65 20 70 72 6f 70 65 72 74 69  346 The properti
15e90 65 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54  es of the DROP T
15ea0 41 42 4c 45 20 61 6e 64 20 41 4c 54 45 52 0a 23  ABLE and ALTER.#
15eb0 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 20   TABLE commands 
15ec0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
15ed0 6f 6e 6c 79 20 61 70 70 6c 79 20 69 66 20 66 6f  only apply if fo
15ee0 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65  reign keys are e
15ef0 6e 61 62 6c 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  nabled..#.do_tes
15f00 74 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 31 20  t e_fkey-61.1.1 
15f10 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
15f20 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  les.  execsql { 
15f30 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
15f40 61 2c 20 62 29 20 7d 0a 20 20 63 61 74 63 68 73  a, b) }.  catchs
15f50 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
15f60 20 74 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63   t1 ADD COLUMN c
15f70 20 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52   DEFAULT 'xxx' R
15f80 45 46 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 7d  EFERENCES t2 }.}
15f90 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20   {1 {Cannot add 
15fa0 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c  a REFERENCES col
15fb0 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c  umn with non-NUL
15fc0 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d  L default value}
15fd0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15fe0 2d 36 31 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -61.1.2 {.  exec
15ff0 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
16000 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 20  eign_keys = OFF 
16010 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c  }.  execsql { AL
16020 54 45 52 20 54 41 42 4c 45 20 74 31 20 41 44 44  TER TABLE t1 ADD
16030 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c   COLUMN c DEFAUL
16040 54 20 27 78 78 78 27 20 52 45 46 45 52 45 4e 43  T 'xxx' REFERENC
16050 45 53 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71  ES t2 }.  execsq
16060 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46  l { SELECT sql F
16070 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
16080 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27  r WHERE name = '
16090 74 31 27 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45  t1' }.} {{CREATE
160a0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
160b0 63 20 44 45 46 41 55 4c 54 20 27 78 78 78 27 20  c DEFAULT 'xxx' 
160c0 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d  REFERENCES t2)}}
160d0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
160e0 36 31 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  61.1.3 {.  execs
160f0 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  ql { PRAGMA fore
16100 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a  ign_keys = ON }.
16110 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  } {}..do_test e_
16120 66 6b 65 79 2d 36 31 2e 32 2e 31 20 7b 0a 20 20  fkey-61.2.1 {.  
16130 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
16140 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
16150 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61  CREATE TABLE p(a
16160 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
16170 45 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52  EATE TABLE c(b R
16180 45 46 45 52 45 4e 43 45 53 20 70 28 61 29 29 3b  EFERENCES p(a));
16190 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
161a0 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 70 20    ALTER TABLE p 
161b0 52 45 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e 74  RENAME TO parent
161c0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73  ;.      SELECT s
161d0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
161e0 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
161f0 20 3d 20 27 63 27 3b 0a 20 20 20 20 52 4f 4c 4c   = 'c';.    ROLL
16200 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52  BACK;.  }.} {{CR
16210 45 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52  EATE TABLE c(b R
16220 45 46 45 52 45 4e 43 45 53 20 22 70 61 72 65 6e  EFERENCES "paren
16230 74 22 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74  t"(a))}}.do_test
16240 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 32 20 7b   e_fkey-61.2.2 {
16250 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16260 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
16270 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20  keys = OFF;.    
16280 50 52 41 47 4d 41 20 6c 65 67 61 63 79 5f 61 6c  PRAGMA legacy_al
16290 74 65 72 5f 74 61 62 6c 65 20 3d 20 4f 4e 3b 0a  ter_table = ON;.
162a0 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20      ALTER TABLE 
162b0 70 20 52 45 4e 41 4d 45 20 54 4f 20 70 61 72 65  p RENAME TO pare
162c0 6e 74 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  nt;.    SELECT s
162d0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
162e0 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
162f0 20 3d 20 27 63 27 3b 0a 20 20 7d 0a 7d 20 7b 7b   = 'c';.  }.} {{
16300 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 62  CREATE TABLE c(b
16310 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 61 29   REFERENCES p(a)
16320 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  )}}.do_test e_fk
16330 65 79 2d 36 31 2e 32 2e 33 20 7b 0a 20 20 65 78  ey-61.2.3 {.  ex
16340 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66  ecsql { PRAGMA f
16350 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
16360 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
16370 52 41 47 4d 41 20 6c 65 67 61 63 79 5f 61 6c 74  RAGMA legacy_alt
16380 65 72 5f 74 61 62 6c 65 20 3d 20 4f 46 46 20 7d  er_table = OFF }
16390 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  .} {}..do_test e
163a0 5f 66 6b 65 79 2d 36 31 2e 33 2e 31 20 7b 0a 20  _fkey-61.3.1 {. 
163b0 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
163c0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
163d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
163e0 61 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43  a UNIQUE);.    C
163f0 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 62 20  REATE TABLE c(b 
16400 52 45 46 45 52 45 4e 43 45 53 20 70 28 61 29 20  REFERENCES p(a) 
16410 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
16420 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
16430 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 78  INTO p VALUES('x
16440 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
16450 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 78 27  NTO c VALUES('x'
16460 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
16470 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70      DROP TABLE p
16480 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
16490 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 52 4f 4c   FROM c;.    ROL
164a0 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  LBACK;.  }.} {{}
164b0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
164c0 2d 36 31 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63  -61.3.2 {.  exec
164d0 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
164e0 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
164f0 4f 46 46 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  OFF;.    DROP TA
16500 42 4c 45 20 70 3b 0a 20 20 20 20 53 45 4c 45 43  BLE p;.    SELEC
16510 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a  T * FROM c;.  }.
16520 7d 20 7b 78 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {x}.do_test e_
16530 66 6b 65 79 2d 36 31 2e 33 2e 33 20 7b 0a 20 20  fkey-61.3.3 {.  
16540 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
16550 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
16560 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23  ON }.} {}..#####
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 23 23 23 23 23 23 23 23 23 23 23 23  ################
165a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
165b0 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49  ######.### SECTI
165c0 4f 4e 20 36 3a 20 4c 69 6d 69 74 73 20 61 6e 64  ON 6: Limits and
165d0 20 55 6e 73 75 70 70 6f 72 74 65 64 20 46 65 61   Unsupported Fea
165e0 74 75 72 65 73 0a 23 23 23 23 23 23 23 23 23 23  tures.##########
165f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16610 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16630 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #..#------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
16680 54 65 73 74 20 74 68 61 74 20 4d 41 54 43 48 20  Test that MATCH 
16690 63 6c 61 75 73 65 73 20 61 72 65 20 70 61 72 73  clauses are pars
166a0 65 64 2c 20 62 75 74 20 53 51 4c 69 74 65 20 74  ed, but SQLite t
166b0 72 65 61 74 73 20 65 76 65 72 79 20 66 6f 72 65  reats every fore
166c0 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72  ign key.# constr
166d0 61 69 6e 74 20 61 73 20 69 66 20 69 74 20 77 65  aint as if it we
166e0 72 65 20 22 4d 41 54 43 48 20 53 49 4d 50 4c 45  re "MATCH SIMPLE
166f0 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  "..#.# EVIDENCE-
16700 4f 46 3a 20 52 2d 32 34 37 32 38 2d 31 33 32 33  OF: R-24728-1323
16710 30 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  0 SQLite parses 
16720 4d 41 54 43 48 20 63 6c 61 75 73 65 73 20 28 69  MATCH clauses (i
16730 2e 65 2e 20 64 6f 65 73 20 6e 6f 74 0a 23 20 72  .e. does not.# r
16740 65 70 6f 72 74 20 61 20 73 79 6e 74 61 78 20 65  eport a syntax e
16750 72 72 6f 72 20 69 66 20 79 6f 75 20 73 70 65 63  rror if you spec
16760 69 66 79 20 6f 6e 65 29 2c 20 62 75 74 20 64 6f  ify one), but do
16770 65 73 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  es not enforce t
16780 68 65 6d 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  hem..#.# EVIDENC
16790 45 2d 4f 46 3a 20 52 2d 32 34 34 35 30 2d 34 36  E-OF: R-24450-46
167a0 31 37 34 20 41 6c 6c 20 66 6f 72 65 69 67 6e 20  174 All foreign 
167b0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
167c0 69 6e 20 53 51 4c 69 74 65 20 61 72 65 0a 23 20  in SQLite are.# 
167d0 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 4d 41  handled as if MA
167e0 54 43 48 20 53 49 4d 50 4c 45 20 77 65 72 65 20  TCH SIMPLE were 
167f0 73 70 65 63 69 66 69 65 64 2e 0a 23 0a 66 6f 72  specified..#.for
16800 65 61 63 68 20 7a 4d 61 74 63 68 20 5b 6c 69 73  each zMatch [lis
16810 74 20 53 49 4d 50 4c 45 20 50 41 52 54 49 41 4c  t SIMPLE PARTIAL
16820 20 46 55 4c 4c 20 53 69 6d 70 6c 65 20 70 61 72   FULL Simple par
16830 54 49 41 4c 20 46 75 4c 4c 20 5d 20 7b 0a 20 20  TIAL FuLL ] {.  
16840 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
16850 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
16860 2d 36 32 2e 24 7a 4d 61 74 63 68 2e 31 20 7b 0a  -62.$zMatch.1 {.
16870 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
16880 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16890 20 70 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d   p(a, b, c, PRIM
168a0 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
168b0 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
168c0 4c 45 20 63 28 64 2c 20 65 2c 20 66 2c 20 46 4f  LE c(d, e, f, FO
168d0 52 45 49 47 4e 20 4b 45 59 28 65 2c 20 66 29 20  REIGN KEY(e, f) 
168e0 52 45 46 45 52 45 4e 43 45 53 20 70 20 4d 41 54  REFERENCES p MAT
168f0 43 48 20 24 7a 4d 61 74 63 68 29 3b 0a 20 20 20  CH $zMatch);.   
16900 20 22 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   ".  } {}.  do_t
16910 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 24 7a  est e_fkey-62.$z
16920 4d 61 74 63 68 2e 32 20 7b 0a 20 20 20 20 65 78  Match.2 {.    ex
16930 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
16940 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20  NTO p VALUES(1, 
16950 32 2c 20 33 29 20 20 20 20 20 20 20 20 20 7d 0a  2, 3)         }.
16960 0a 20 20 20 20 23 20 4d 41 54 43 48 20 53 49 4d  .    # MATCH SIM
16970 50 4c 45 20 62 65 68 61 76 69 6f 72 3a 20 41 6c  PLE behavior: Al
16980 6c 6f 77 20 61 6e 79 20 63 68 69 6c 64 20 6b 65  low any child ke
16990 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
169a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  one or more.    
169b0 23 20 4e 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20  # NULL value to 
169c0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 4e 6f 6e  be inserted. Non
169d0 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 20 64 6f 20  -NULL values do 
169e0 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 70 20  not have to map 
169f0 74 6f 20 61 6e 79 0a 20 20 20 20 23 20 70 61 72  to any.    # par
16a00 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 2c 20  ent key values, 
16a10 73 6f 20 6c 6f 6e 67 20 61 73 20 61 74 20 6c 65  so long as at le
16a20 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 20 6f 66  ast one field of
16a30 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 69   the child key i
16a40 73 0a 20 20 20 20 23 20 4e 55 4c 4c 2e 0a 20 20  s.    # NULL..  
16a50 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
16a60 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
16a70 28 27 77 27 2c 20 32 2c 20 33 29 20 20 20 20 20  ('w', 2, 3)     
16a80 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
16a90 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20  { INSERT INTO c 
16aa0 56 41 4c 55 45 53 28 27 78 27 2c 20 27 78 27 2c  VALUES('x', 'x',
16ab0 20 4e 55 4c 4c 29 20 20 7d 0a 20 20 20 20 65 78   NULL)  }.    ex
16ac0 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
16ad0 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 79 27  NTO c VALUES('y'
16ae0 2c 20 4e 55 4c 4c 2c 20 27 78 27 29 20 20 7d 0a  , NULL, 'x')  }.
16af0 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
16b00 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
16b10 45 53 28 27 7a 27 2c 20 4e 55 4c 4c 2c 20 4e 55  ES('z', NULL, NU
16b20 4c 4c 29 20 7d 0a 0a 20 20 20 20 23 20 43 68 65  LL) }..    # Che
16b30 63 6b 20 74 68 61 74 20 74 68 65 20 46 4b 20 69  ck that the FK i
16b40 73 20 65 6e 66 6f 72 63 65 64 20 70 72 6f 70 65  s enforced prope
16b50 72 6c 79 20 69 66 20 74 68 65 72 65 20 61 72 65  rly if there are
16b60 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20   no NULL values 
16b70 0a 20 20 20 20 23 20 69 6e 20 74 68 65 20 63 68  .    # in the ch
16b80 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e  ild key columns.
16b90 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
16ba0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
16bb0 4c 55 45 53 28 27 61 27 2c 20 32 2c 20 34 29 20  LUES('a', 2, 4) 
16bc0 7d 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47  }.  } {1 {FOREIG
16bd0 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
16be0 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d   failed}}.}..#--
16bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c30 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
16c40 68 61 74 20 53 51 4c 69 74 65 20 64 6f 65 73 20  hat SQLite does 
16c50 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
16c60 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54 20 73  SET CONSTRAINT s
16c70 74 61 74 65 6d 65 6e 74 2e 20 41 6e 64 0a 23 20  tatement. And.# 
16c80 74 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69  that it is possi
16c90 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 62 6f  ble to create bo
16ca0 74 68 20 69 6d 6d 65 64 69 61 74 65 20 61 6e 64  th immediate and
16cb0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
16cc0 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45  aints..#.# EVIDE
16cd0 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 35 39 39 2d  NCE-OF: R-21599-
16ce0 31 36 30 33 38 20 49 6e 20 53 51 4c 69 74 65 2c  16038 In SQLite,
16cf0 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   a foreign key c
16d00 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20 70  onstraint is.# p
16d10 65 72 6d 61 6e 65 6e 74 6c 79 20 6d 61 72 6b 65  ermanently marke
16d20 64 20 61 73 20 64 65 66 65 72 72 65 64 20 6f 72  d as deferred or
16d30 20 69 6d 6d 65 64 69 61 74 65 20 77 68 65 6e 20   immediate when 
16d40 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23  it is created..#
16d50 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
16d60 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
16d70 36 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  62.1 {.  catchsq
16d80 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52 41 49  l { SET CONSTRAI
16d90 4e 54 53 20 41 4c 4c 20 49 4d 4d 45 44 49 41 54  NTS ALL IMMEDIAT
16da0 45 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22  E }.} {1 {near "
16db0 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65 72 72  SET": syntax err
16dc0 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  or}}.do_test e_f
16dd0 6b 65 79 2d 36 32 2e 32 20 7b 0a 20 20 63 61 74  key-62.2 {.  cat
16de0 63 68 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53  chsql { SET CONS
16df0 54 52 41 49 4e 54 53 20 41 4c 4c 20 44 45 46 45  TRAINTS ALL DEFE
16e00 52 52 45 44 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61  RRED }.} {1 {nea
16e10 72 20 22 53 45 54 22 3a 20 73 79 6e 74 61 78 20  r "SET": syntax 
16e20 65 72 72 6f 72 7d 7d 0a 0a 64 6f 5f 74 65 73 74  error}}..do_test
16e30 20 65 5f 66 6b 65 79 2d 36 32 2e 33 20 7b 0a 20   e_fkey-62.3 {. 
16e40 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
16e50 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c  REATE TABLE p(a,
16e60 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
16e70 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41  a, b));.    CREA
16e80 54 45 20 54 41 42 4c 45 20 63 64 28 63 2c 20 64  TE TABLE cd(c, d
16e90 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  , .      FOREIGN
16ea0 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
16eb0 45 4e 43 45 53 20 70 20 44 45 46 45 52 52 41 42  ENCES p DEFERRAB
16ec0 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
16ed0 45 52 52 45 44 29 3b 0a 20 20 20 20 43 52 45 41  ERRED);.    CREA
16ee0 54 45 20 54 41 42 4c 45 20 63 69 28 63 2c 20 64  TE TABLE ci(c, d
16ef0 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  , .      FOREIGN
16f00 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
16f10 45 4e 43 45 53 20 70 20 44 45 46 45 52 52 41 42  ENCES p DEFERRAB
16f20 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  LE INITIALLY IMM
16f30 45 44 49 41 54 45 29 3b 0a 20 20 20 20 42 45 47  EDIATE);.    BEG
16f40 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  IN;.  }.} {}.do_
16f50 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 34  test e_fkey-62.4
16f60 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
16f70 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 69 20 56  INSERT INTO ci V
16f80 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 20  ALUES('x', 'y') 
16f90 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
16fa0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
16fb0 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
16fc0 65 5f 66 6b 65 79 2d 36 32 2e 35 20 7b 0a 20 20  e_fkey-62.5 {.  
16fd0 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
16fe0 54 20 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53  T INTO cd VALUES
16ff0 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d 20 7b  ('x', 'y') }.} {
17000 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  0 {}}.do_test e_
17010 66 6b 65 79 2d 36 32 2e 36 20 7b 0a 20 20 63 61  fkey-62.6 {.  ca
17020 74 63 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  tchsql { COMMIT 
17030 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
17040 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
17050 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
17060 65 5f 66 6b 65 79 2d 36 32 2e 37 20 7b 0a 20 20  e_fkey-62.7 {.  
17070 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44  execsql { .    D
17080 45 4c 45 54 45 20 46 52 4f 4d 20 63 64 3b 0a 20  ELETE FROM cd;. 
17090 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
170a0 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
170b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
170f0 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  # Test that the 
17100 6d 61 78 69 6d 75 6d 20 72 65 63 75 72 73 69 6f  maximum recursio
17110 6e 20 64 65 70 74 68 20 6f 66 20 66 6f 72 65 69  n depth of forei
17120 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 20 70 72  gn key action pr
17130 6f 67 72 61 6d 73 20 69 73 0a 23 20 67 6f 76 65  ograms is.# gove
17140 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  rned by the SQLI
17150 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
17160 45 50 54 48 20 61 6e 64 20 53 51 4c 49 54 45 5f  EPTH and SQLITE_
17170 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
17180 50 54 48 0a 23 20 73 65 74 74 69 6e 67 73 2e 0a  PTH.# settings..
17190 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
171a0 20 52 2d 34 32 32 36 34 2d 33 30 35 30 33 20 54   R-42264-30503 T
171b0 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  he SQLITE_MAX_TR
171c0 49 47 47 45 52 5f 44 45 50 54 48 20 61 6e 64 0a  IGGER_DEPTH and.
171d0 23 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  # SQLITE_LIMIT_T
171e0 52 49 47 47 45 52 5f 44 45 50 54 48 20 73 65 74  RIGGER_DEPTH set
171f0 74 69 6e 67 73 20 64 65 74 65 72 6d 69 6e 65 20  tings determine 
17200 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
17210 77 61 62 6c 65 0a 23 20 64 65 70 74 68 20 6f 66  wable.# depth of
17220 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
17230 20 72 65 63 75 72 73 69 6f 6e 2e 20 46 6f 72 20   recursion. For 
17240 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
17250 74 68 65 73 65 20 6c 69 6d 69 74 73 2c 0a 23 20  these limits,.# 
17260 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69  foreign key acti
17270 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ons are consider
17280 65 64 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ed trigger progr
17290 61 6d 73 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74  ams..#.proc test
172a0 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72  _on_delete_recur
172b0 73 69 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20  sion {limit} {. 
172c0 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
172d0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
172e0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
172f0 41 54 45 20 54 41 42 4c 45 20 74 30 28 61 20 50  ATE TABLE t0(a P
17300 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
17310 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17320 74 30 20 56 41 4c 55 45 53 28 27 78 30 27 2c 20  t0 VALUES('x0', 
17330 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  NULL);.  }.  for
17340 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c   {set i 1} {$i <
17350 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20  = $limit} {incr 
17360 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
17370 20 22 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   ".      CREATE 
17380 54 41 42 4c 45 20 74 24 69 20 28 0a 20 20 20 20  TABLE t$i (.    
17390 20 20 20 20 61 20 50 52 49 4d 41 52 59 20 4b 45      a PRIMARY KE
173a0 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
173b0 74 5b 65 78 70 72 20 24 69 2d 31 5d 20 4f 4e 20  t[expr $i-1] ON 
173c0 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20  DELETE CASCADE. 
173d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4e       );.      IN
173e0 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20 56 41  SERT INTO t$i VA
173f0 4c 55 45 53 28 27 78 24 69 27 2c 20 27 78 5b 65  LUES('x$i', 'x[e
17400 78 70 72 20 24 69 2d 31 5d 27 29 3b 0a 20 20 20  xpr $i-1]');.   
17410 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c   ".  }.  execsql
17420 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68 73   COMMIT.  catchs
17430 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54 45 20  ql ".    DELETE 
17440 46 52 4f 4d 20 74 30 3b 0a 20 20 20 20 53 45 4c  FROM t0;.    SEL
17450 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17460 4d 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d  M t$limit;.  ".}
17470 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f 75 70  .proc test_on_up
17480 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 7b  date_recursion {
17490 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f 70 5f  limit} {.  drop_
174a0 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
174b0 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
174c0 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
174d0 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41 52 59  BLE t0(a PRIMARY
174e0 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52   KEY);.    INSER
174f0 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53  T INTO t0 VALUES
17500 28 27 78 78 78 27 29 3b 0a 20 20 7d 0a 20 20 66  ('xxx');.  }.  f
17510 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69  or {set i 1} {$i
17520 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63   <= $limit} {inc
17530 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 6a  r i} {.    set j
17540 20 5b 65 78 70 72 20 24 69 2d 31 5d 0a 0a 20 20   [expr $i-1]..  
17550 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
17560 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
17570 24 69 20 28 61 20 50 52 49 4d 41 52 59 20 4b 45  $i (a PRIMARY KE
17580 59 20 52 45 46 45 52 45 4e 43 45 53 20 74 24 6a  Y REFERENCES t$j
17590 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
175a0 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  DE);.      INSER
175b0 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45  T INTO t$i VALUE
175c0 53 28 27 78 78 78 27 29 3b 0a 20 20 20 20 22 0a  S('xxx');.    ".
175d0 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f    }.  execsql CO
175e0 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c 20  MMIT.  catchsql 
175f0 22 0a 20 20 20 20 55 50 44 41 54 45 20 74 30 20  ".    UPDATE t0 
17600 53 45 54 20 61 20 3d 20 27 79 79 79 27 3b 0a 20  SET a = 'yyy';. 
17610 20 20 20 53 45 4c 45 43 54 20 4e 4f 54 20 28 61     SELECT NOT (a
17620 3d 27 79 79 79 27 29 20 46 52 4f 4d 20 74 24 6c  ='yyy') FROM t$l
17630 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 0a 23 20 49  imit;.  ".}..# I
17640 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  f the current bu
17650 69 6c 64 20 77 61 73 20 63 72 65 61 74 65 64 20  ild was created 
17660 75 73 69 6e 67 20 63 6c 61 6e 67 20 77 69 74 68  using clang with
17670 20 74 68 65 20 2d 66 73 61 6e 69 74 69 7a 65 3d   the -fsanitize=
17680 61 64 64 72 65 73 73 0a 23 20 73 77 69 74 63 68  address.# switch
17690 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 62 72 61  , then the libra
176a0 72 79 20 75 73 65 73 20 63 6f 6e 73 69 64 65 72  ry uses consider
176b0 61 62 6c 79 20 6d 6f 72 65 20 73 74 61 63 6b 20  ably more stack 
176c0 73 70 61 63 65 20 74 68 61 6e 20 75 73 75 61 6c  space than usual
176d0 2e 0a 23 20 53 6f 20 6d 75 63 68 20 6d 6f 72 65  ..# So much more
176e0 2c 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74  , that some of t
176f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
17700 74 73 20 63 61 75 73 65 20 73 74 61 63 6b 20 6f  ts cause stack o
17710 76 65 72 66 6c 6f 77 73 0a 23 20 69 66 20 74 68  verflows.# if th
17720 65 79 20 61 72 65 20 72 75 6e 20 75 6e 64 65 72  ey are run under
17730 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
17740 69 6f 6e 2e 0a 23 0a 69 66 20 7b 5b 63 6c 61 6e  ion..#.if {[clan
17750 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
17760 73 73 5d 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74  ss]==0} {.  do_t
17770 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e  est e_fkey-63.1.
17780 31 20 7b 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f  1 {.    test_on_
17790 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
177a0 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49   $SQLITE_MAX_TRI
177b0 47 47 45 52 5f 44 45 50 54 48 0a 20 20 7d 20 7b  GGER_DEPTH.  } {
177c0 30 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65  0 0}.  do_test e
177d0 5f 66 6b 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20  _fkey-63.1.2 {. 
177e0 20 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74     test_on_delet
177f0 65 5f 72 65 63 75 72 73 69 6f 6e 20 5b 65 78 70  e_recursion [exp
17800 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
17810 49 47 47 45 52 5f 44 45 50 54 48 2b 31 5d 0a 20  IGGER_DEPTH+1]. 
17820 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20   } {1 {too many 
17830 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
17840 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 20 20  r recursion}}.  
17850 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
17860 33 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69  3.1.3 {.    sqli
17870 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te3_limit db SQL
17880 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
17890 52 5f 44 45 50 54 48 20 35 0a 20 20 20 20 20 20  R_DEPTH 5.      
178a0 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
178b0 65 63 75 72 73 69 6f 6e 20 35 0a 20 20 7d 20 7b  ecursion 5.  } {
178c0 30 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65  0 0}.  do_test e
178d0 5f 66 6b 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20  _fkey-63.1.4 {. 
178e0 20 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74     test_on_delet
178f0 65 5f 72 65 63 75 72 73 69 6f 6e 20 36 0a 20 20  e_recursion 6.  
17900 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c  } {1 {too many l
17910 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
17920 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64   recursion}}.  d
17930 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
17940 2e 31 2e 35 20 7b 0a 20 20 20 20 73 71 6c 69 74  .1.5 {.    sqlit
17950 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49  e3_limit db SQLI
17960 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
17970 5f 44 45 50 54 48 20 31 30 30 30 30 30 30 0a 20  _DEPTH 1000000. 
17980 20 7d 20 7b 35 7d 0a 20 20 64 6f 5f 74 65 73 74   } {5}.  do_test
17990 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 31 20 7b   e_fkey-63.2.1 {
179a0 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64  .    test_on_upd
179b0 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53  ate_recursion $S
179c0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
179d0 52 5f 44 45 50 54 48 0a 20 20 7d 20 7b 30 20 30  R_DEPTH.  } {0 0
179e0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
179f0 65 79 2d 36 33 2e 32 2e 32 20 7b 0a 20 20 20 20  ey-63.2.2 {.    
17a00 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72  test_on_update_r
17a10 65 63 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24  ecursion [expr $
17a20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
17a30 45 52 5f 44 45 50 54 48 2b 31 5d 0a 20 20 7d 20  ER_DEPTH+1].  } 
17a40 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  {1 {too many lev
17a50 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
17a60 65 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f  ecursion}}.  do_
17a70 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32  test e_fkey-63.2
17a80 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .3 {.    sqlite3
17a90 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45  _limit db SQLITE
17aa0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
17ab0 45 50 54 48 20 35 0a 20 20 20 20 20 20 74 65 73  EPTH 5.      tes
17ac0 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75  t_on_update_recu
17ad0 72 73 69 6f 6e 20 35 0a 20 20 7d 20 7b 30 20 30  rsion 5.  } {0 0
17ae0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17af0 65 79 2d 36 33 2e 32 2e 34 20 7b 0a 20 20 20 20  ey-63.2.4 {.    
17b00 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72  test_on_update_r
17b10 65 63 75 72 73 69 6f 6e 20 36 0a 20 20 7d 20 7b  ecursion 6.  } {
17b20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
17b30 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
17b40 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  cursion}}.  do_t
17b50 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e  est e_fkey-63.2.
17b60 35 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  5 {.    sqlite3_
17b70 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f  limit db SQLITE_
17b80 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
17b90 50 54 48 20 31 30 30 30 30 30 30 0a 20 20 7d 20  PTH 1000000.  } 
17ba0 7b 35 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  {5}.}..#--------
17bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17bf0 2d 0a 23 20 54 68 65 20 73 65 74 74 69 6e 67 20  -.# The setting 
17c00 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
17c10 5f 74 72 69 67 67 65 72 73 20 70 72 61 67 6d 61  _triggers pragma
17c20 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
17c30 20 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20 61   foreign.# key a
17c40 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44  ctions..#.# EVID
17c50 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 33 35 35  ENCE-OF: R-44355
17c60 2d 30 30 32 37 30 20 54 68 65 20 50 52 41 47 4d  -00270 The PRAGM
17c70 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
17c80 67 65 72 73 20 73 65 74 74 69 6e 67 20 64 6f 65  gers setting doe
17c90 73 0a 23 20 6e 6f 74 20 61 66 66 65 63 74 20 74  s.# not affect t
17ca0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
17cb0 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69  foreign key acti
17cc0 6f 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 72  ons..#.foreach r
17cd0 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
17ce0 73 5f 73 65 74 74 69 6e 67 20 5b 6c 69 73 74 20  s_setting [list 
17cf0 30 20 31 20 4f 4e 20 4f 46 46 5d 20 7b 0a 20 20  0 1 ON OFF] {.  
17d00 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
17d10 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
17d20 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
17d30 67 65 72 73 20 3d 20 24 72 65 63 75 72 73 69 76  gers = $recursiv
17d40 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69  e_triggers_setti
17d50 6e 67 22 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65  ng"..  do_test e
17d60 5f 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73  _fkey-64.$recurs
17d70 69 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74  ive_triggers_set
17d80 74 69 6e 67 2e 31 20 7b 0a 20 20 20 20 65 78 65  ting.1 {.    exe
17d90 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
17da0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
17db0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
17dc0 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 44  FERENCES t1 ON D
17dd0 45 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b 0a  ELETE CASCADE);.
17de0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
17df0 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 4e  O t1 VALUES(1, N
17e00 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ULL);.      INSE
17e10 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
17e20 53 28 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 49  S(2, 1);.      I
17e30 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
17e40 4c 55 45 53 28 33 2c 20 32 29 3b 0a 20 20 20 20  LUES(3, 2);.    
17e50 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17e60 20 56 41 4c 55 45 53 28 34 2c 20 33 29 3b 0a 20   VALUES(4, 3);. 
17e70 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17e80 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 34 29   t1 VALUES(5, 4)
17e90 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63  ;.      SELECT c
17ea0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
17eb0 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 35 7d 0a 20  .    }.  } {5}. 
17ec0 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
17ed0 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74 72  64.$recursive_tr
17ee0 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e 32  iggers_setting.2
17ef0 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
17f00 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
17f10 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17f20 20 3d 20 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20   = 1 }.  } {1}. 
17f30 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
17f40 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74 72  64.$recursive_tr
17f50 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e 33  iggers_setting.3
17f60 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
17f70 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46   .      DELETE F
17f80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
17f90 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   1;.      SELECT
17fa0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
17fb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d  1;.    }.  } {0}
17fc0 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.