/ Hex Artifact Content
Login

Artifact 54cc0046d2d952d6c42b0dd94414e7a8f75f79f4:


0000: 23 20 32 30 30 39 20 4f 63 74 6f 62 65 72 20 37  # 2009 October 7
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 74 65 73 74 73 20 74 6f 20 76 65 72 69 66 79 20  tests to verify 
0190: 74 68 65 20 22 74 65 73 74 61 62 6c 65 20 73 74  the "testable st
01a0: 61 74 65 6d 65 6e 74 73 22 20 69 6e 20 74 68 65  atements" in the
01b0: 0a 23 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 69  .# foreignkeys.i
01c0: 6e 20 64 6f 63 75 6d 65 6e 74 2e 0a 23 0a 23 20  n document..#.# 
01d0: 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  The tests in thi
01e0: 73 20 66 69 6c 65 20 61 72 65 20 61 72 72 61 6e  s file are arran
01f0: 67 65 64 20 74 6f 20 6d 69 72 72 6f 72 20 74 68  ged to mirror th
0200: 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 0a  e structure of .
0210: 23 20 66 6f 72 65 69 67 6e 6b 65 79 2e 69 6e 2c  # foreignkey.in,
0220: 20 77 69 74 68 20 6f 6e 65 20 65 78 63 65 70 74   with one except
0230: 69 6f 6e 3a 20 54 68 65 20 73 74 61 74 65 6d 65  ion: The stateme
0240: 6e 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32  nts in section 2
0250: 2c 20 77 68 69 63 68 20 0a 23 20 64 65 61 6c 73  , which .# deals
0260: 20 77 69 74 68 20 65 6e 61 62 6c 69 6e 67 2f 64   with enabling/d
0270: 69 73 61 62 6c 69 6e 67 20 66 6f 72 65 69 67 6e  isabling foreign
0280: 20 6b 65 79 20 73 75 70 70 6f 72 74 2c 20 69 73   key support, is
0290: 20 74 65 73 74 65 64 20 66 69 72 73 74 2c 0a 23   tested first,.#
02a0: 20 62 65 66 6f 72 65 20 73 65 63 74 69 6f 6e 20   before section 
02b0: 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
02c0: 73 65 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  se some statemen
02d0: 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32 20  ts in section 2 
02e0: 64 65 61 6c 0a 23 20 77 69 74 68 20 62 75 69 6c  deal.# with buil
02f0: 64 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 69  ds that do not i
0300: 6e 63 6c 75 64 65 20 63 6f 6d 70 6c 65 74 65 20  nclude complete 
0310: 66 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  foreign key supp
0320: 6f 72 74 20 28 62 65 63 61 75 73 65 0a 23 20 65  ort (because.# e
0330: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4d 49  ither SQLITE_OMI
0340: 54 5f 54 52 49 47 47 45 52 20 6f 72 20 53 51 4c  T_TRIGGER or SQL
0350: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
0360: 5f 4b 45 59 20 77 61 73 20 64 65 66 69 6e 65 64  _KEY was defined
0370: 0a 23 20 61 74 20 62 75 69 6c 64 20 74 69 6d 65  .# at build time
0380: 29 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  )..#..set testdi
0390: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
03a0: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
03b0: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
03c0: 63 6c 0a 0a 70 72 6f 63 20 65 71 70 20 7b 73 71  cl..proc eqp {sq
03d0: 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 20 75 70 6c  l {db db}} { upl
03e0: 65 76 65 6c 20 65 78 65 63 73 71 6c 20 5b 6c 69  evel execsql [li
03f0: 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  st "EXPLAIN QUER
0400: 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 20 24 64  Y PLAN $sql"] $d
0410: 62 20 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  b }..###########
0420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0460: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 32 3a 20  .### SECTION 2: 
0470: 45 6e 61 62 6c 69 6e 67 20 46 6f 72 65 69 67 6e  Enabling Foreign
0480: 20 4b 65 79 20 53 75 70 70 6f 72 74 0a 23 23 23   Key Support.###
0490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04d0: 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
0530: 4f 46 3a 20 52 2d 33 33 37 31 30 2d 35 36 33 34  OF: R-33710-5634
0540: 34 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 75 73  4 In order to us
0550: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
0560: 6e 73 74 72 61 69 6e 74 73 20 69 6e 0a 23 20 53  nstraints in.# S
0570: 51 4c 69 74 65 2c 20 74 68 65 20 6c 69 62 72 61  QLite, the libra
0580: 72 79 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 69  ry must be compi
0590: 6c 65 64 20 77 69 74 68 20 6e 65 69 74 68 65 72  led with neither
05a0: 0a 23 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  .# SQLITE_OMIT_F
05b0: 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53 51  OREIGN_KEY or SQ
05c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
05d0: 52 20 64 65 66 69 6e 65 64 2e 0a 23 0a 69 66 63  R defined..#.ifc
05e0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26  apable trigger&&
05f0: 66 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64  foreignkey {.  d
0600: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 20  o_test e_fkey-1 
0610: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
0620: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
0630: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
0640: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0650: 4c 45 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b  LE p(i PRIMARY K
0660: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
0670: 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45  E TABLE c(j REFE
0680: 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41  RENCES p ON UPDA
0690: 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
06a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
06b0: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
06c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
06d0: 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65  NTO c VALUES('he
06e0: 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44  llo');.      UPD
06f0: 41 54 45 20 70 20 53 45 54 20 69 20 3d 20 27 77  ATE p SET i = 'w
0700: 6f 72 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c  orld';.      SEL
0710: 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
0720: 20 20 7d 0a 20 20 7d 20 7b 77 6f 72 6c 64 7d 0a    }.  } {world}.
0730: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0780: 54 65 73 74 20 74 68 65 20 65 66 66 65 63 74 73  Test the effects
0790: 20 6f 66 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49   of defining OMI
07a0: 54 5f 54 52 49 47 47 45 52 20 62 75 74 20 6e 6f  T_TRIGGER but no
07b0: 74 20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  t OMIT_FOREIGN_K
07c0: 45 59 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  EY..#.# EVIDENCE
07d0: 2d 4f 46 3a 20 52 2d 31 30 31 30 39 2d 32 30 34  -OF: R-10109-204
07e0: 35 32 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  52 If SQLITE_OMI
07f0: 54 5f 54 52 49 47 47 45 52 20 69 73 20 64 65 66  T_TRIGGER is def
0800: 69 6e 65 64 20 62 75 74 0a 23 20 53 51 4c 49 54  ined but.# SQLIT
0810: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
0820: 45 59 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  EY is not, then 
0830: 53 51 4c 69 74 65 20 62 65 68 61 76 65 73 20 61  SQLite behaves a
0840: 73 20 69 74 20 64 69 64 20 70 72 69 6f 72 20 74  s it did prior t
0850: 6f 0a 23 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e  o.# version 3.6.
0860: 31 39 20 28 32 30 30 39 2d 31 30 2d 31 34 29 20  19 (2009-10-14) 
0870: 2d 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  - foreign key de
0880: 66 69 6e 69 74 69 6f 6e 73 20 61 72 65 20 70 61  finitions are pa
0890: 72 73 65 64 20 61 6e 64 0a 23 20 6d 61 79 20 62  rsed and.# may b
08a0: 65 20 71 75 65 72 69 65 64 20 75 73 69 6e 67 20  e queried using 
08b0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
08c0: 65 79 5f 6c 69 73 74 2c 20 62 75 74 20 66 6f 72  ey_list, but for
08d0: 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74  eign key.# const
08e0: 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74 20 65  raints are not e
08f0: 6e 66 6f 72 63 65 64 2e 0a 23 0a 23 20 53 70 65  nforced..#.# Spe
0900: 63 69 66 69 63 61 6c 6c 79 2c 20 74 65 73 74 20  cifically, test 
0910: 74 68 61 74 20 22 50 52 41 47 4d 41 20 66 6f 72  that "PRAGMA for
0920: 65 69 67 6e 5f 6b 65 79 73 22 20 69 73 20 61 20  eign_keys" is a 
0930: 6e 6f 2d 6f 70 20 69 6e 20 74 68 69 73 20 63 61  no-op in this ca
0940: 73 65 2e 0a 23 20 57 68 65 6e 20 75 73 69 6e 67  se..# When using
0950: 20 74 68 65 20 70 72 61 67 6d 61 20 74 6f 20 71   the pragma to q
0960: 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
0970: 20 73 65 74 74 69 6e 67 2c 20 30 20 72 6f 77 73   setting, 0 rows
0980: 20 61 72 65 20 72 65 74 75 72 6e 65 64 2e 0a 23   are returned..#
0990: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
09a0: 52 2d 32 32 35 36 37 2d 34 34 30 33 39 20 54 68  R-22567-44039 Th
09b0: 65 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  e PRAGMA foreign
09c0: 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64 20 69 73  _keys command is
09d0: 20 61 20 6e 6f 2d 6f 70 0a 23 20 69 6e 20 74 68   a no-op.# in th
09e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
09f0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
0a00: 46 3a 20 52 2d 34 31 37 38 34 2d 31 33 33 33 39  F: R-41784-13339
0a10: 20 54 69 70 3a 20 49 66 20 74 68 65 20 63 6f 6d   Tip: If the com
0a20: 6d 61 6e 64 20 22 50 52 41 47 4d 41 20 66 6f 72  mand "PRAGMA for
0a30: 65 69 67 6e 5f 6b 65 79 73 22 0a 23 20 72 65 74  eign_keys".# ret
0a40: 75 72 6e 73 20 6e 6f 20 64 61 74 61 20 69 6e 73  urns no data ins
0a50: 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65  tead of a single
0a60: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
0a70: 22 30 22 20 6f 72 20 22 31 22 2c 20 74 68 65 6e  "0" or "1", then
0a80: 0a 23 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  .# the version o
0a90: 66 20 53 51 4c 69 74 65 20 79 6f 75 20 61 72 65  f SQLite you are
0aa0: 20 75 73 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20   using does not 
0ab0: 73 75 70 70 6f 72 74 20 66 6f 72 65 69 67 6e 20  support foreign 
0ac0: 6b 65 79 73 0a 23 20 28 65 69 74 68 65 72 20 62  keys.# (either b
0ad0: 65 63 61 75 73 65 20 69 74 20 69 73 20 6f 6c 64  ecause it is old
0ae0: 65 72 20 74 68 61 6e 20 33 2e 36 2e 31 39 20 6f  er than 3.6.19 o
0af0: 72 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  r because it was
0b00: 20 63 6f 6d 70 69 6c 65 64 0a 23 20 77 69 74 68   compiled.# with
0b10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
0b20: 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53 51 4c 49  EIGN_KEY or SQLI
0b30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
0b40: 64 65 66 69 6e 65 64 29 2e 0a 23 0a 72 65 73 65  defined)..#.rese
0b50: 74 5f 64 62 0a 69 66 63 61 70 61 62 6c 65 20 21  t_db.ifcapable !
0b60: 74 72 69 67 67 65 72 26 26 66 6f 72 65 69 67 6e  trigger&&foreign
0b70: 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  key {.  do_test 
0b80: 65 5f 66 6b 65 79 2d 32 2e 31 20 7b 0a 20 20 20  e_fkey-2.1 {.   
0b90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
0ba0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
0bb0: 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20 20  keys = ON;.     
0bc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
0bd0: 69 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  i PRIMARY KEY);.
0be0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0bf0: 4c 45 20 63 28 6a 20 52 45 46 45 52 45 4e 43 45  LE c(j REFERENCE
0c00: 53 20 70 20 4f 4e 20 55 50 44 41 54 45 20 43 41  S p ON UPDATE CA
0c10: 53 43 41 44 45 29 3b 0a 20 20 20 20 20 20 49 4e  SCADE);.      IN
0c20: 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
0c30: 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20  ES('hello');.   
0c40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
0c50: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
0c60: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 70  ;.      UPDATE p
0c70: 20 53 45 54 20 69 20 3d 20 27 77 6f 72 6c 64 27   SET i = 'world'
0c80: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
0c90: 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 7d 0a 20   FROM c;.    }. 
0ca0: 20 7d 20 7b 68 65 6c 6c 6f 7d 0a 20 20 64 6f 5f   } {hello}.  do_
0cb0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 2e 32 20  test e_fkey-2.2 
0cc0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
0cd0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
0ce0: 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a 20 20 7d  ey_list(c) }.  }
0cf0: 20 7b 30 20 30 20 70 20 6a 20 7b 7d 20 43 41 53   {0 0 p j {} CAS
0d00: 43 41 44 45 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d  CADE {NO ACTION}
0d10: 20 4e 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65 73 74   NONE}.  do_test
0d20: 20 65 5f 66 6b 65 79 2d 32 2e 33 20 7b 0a 20 20   e_fkey-2.3 {.  
0d30: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
0d40: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
0d50: 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 0a 23 2d 2d  }.  } {}.}...#--
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
0db0: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 65  he effects of de
0dc0: 66 69 6e 69 6e 67 20 4f 4d 49 54 5f 46 4f 52 45  fining OMIT_FORE
0dd0: 49 47 4e 5f 4b 45 59 2e 0a 23 0a 23 20 45 56 49  IGN_KEY..#.# EVI
0de0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 34 32  DENCE-OF: R-5842
0df0: 38 2d 33 36 36 36 30 20 49 66 20 4f 4d 49 54 5f  8-36660 If OMIT_
0e00: 46 4f 52 45 49 47 4e 5f 4b 45 59 20 69 73 20 64  FOREIGN_KEY is d
0e10: 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 23 20 66  efined, then.# f
0e20: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
0e30: 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 65 76  itions cannot ev
0e40: 65 6e 20 62 65 20 70 61 72 73 65 64 20 28 61 74  en be parsed (at
0e50: 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 65 63  tempting to spec
0e60: 69 66 79 20 61 0a 23 20 66 6f 72 65 69 67 6e 20  ify a.# foreign 
0e70: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 69  key definition i
0e80: 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  s a syntax error
0e90: 29 2e 0a 23 0a 23 20 53 70 65 63 69 66 69 63 61  )..#.# Specifica
0ea0: 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74 20 66  lly, test that f
0eb0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
0ec0: 72 61 69 6e 74 73 20 63 61 6e 6e 6f 74 20 65 76  raints cannot ev
0ed0: 65 6e 20 62 65 20 70 61 72 73 65 64 20 0a 23 20  en be parsed .# 
0ee0: 69 6e 20 73 75 63 68 20 61 20 62 75 69 6c 64 2e  in such a build.
0ef0: 0a 23 0a 72 65 73 65 74 5f 64 62 0a 69 66 63 61  .#.reset_db.ifca
0f00: 70 61 62 6c 65 20 21 66 6f 72 65 69 67 6e 6b 65  pable !foreignke
0f10: 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  y {.  do_test e_
0f20: 66 6b 65 79 2d 33 2e 31 20 7b 0a 20 20 20 20 65  fkey-3.1 {.    e
0f30: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
0f40: 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d 41 52  TABLE p(i PRIMAR
0f50: 59 20 4b 45 59 29 20 7d 0a 20 20 20 20 63 61 74  Y KEY) }.    cat
0f60: 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  chsql { CREATE T
0f70: 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45 4e  ABLE c(j REFEREN
0f80: 43 45 53 20 70 20 4f 4e 20 55 50 44 41 54 45 20  CES p ON UPDATE 
0f90: 43 41 53 43 41 44 45 29 20 7d 0a 20 20 7d 20 7b  CASCADE) }.  } {
0fa0: 31 20 7b 6e 65 61 72 20 22 4f 4e 22 3a 20 73 79  1 {near "ON": sy
0fb0: 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a 20 20 64  ntax error}}.  d
0fc0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e  o_test e_fkey-3.
0fd0: 32 20 7b 0a 20 20 20 20 23 20 54 68 69 73 20 69  2 {.    # This i
0fe0: 73 20 61 6c 6c 6f 77 65 64 2c 20 61 73 20 69 6e  s allowed, as in
0ff0: 20 74 68 69 73 20 62 75 69 6c 64 2c 20 22 52 45   this build, "RE
1000: 46 45 52 45 4e 43 45 53 22 20 69 73 20 6e 6f 74  FERENCES" is not
1010: 20 61 20 6b 65 79 77 6f 72 64 2e 0a 20 20 20 20   a keyword..    
1020: 23 20 54 68 65 20 64 65 63 6c 61 72 65 64 20 64  # The declared d
1030: 61 74 61 74 79 70 65 20 6f 66 20 63 6f 6c 75 6d  atatype of colum
1040: 6e 20 6a 20 69 73 20 22 52 45 46 45 52 45 4e 43  n j is "REFERENC
1050: 45 53 20 70 22 2e 0a 20 20 20 20 65 78 65 63 73  ES p"..    execs
1060: 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
1070: 45 20 63 28 6a 20 52 45 46 45 52 45 4e 43 45 53  E c(j REFERENCES
1080: 20 70 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64   p) }.  } {}.  d
1090: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e  o_test e_fkey-3.
10a0: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
10b0: 7b 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  { PRAGMA table_i
10c0: 6e 66 6f 28 63 29 20 7d 0a 20 20 7d 20 7b 30 20  nfo(c) }.  } {0 
10d0: 6a 20 7b 52 45 46 45 52 45 4e 43 45 53 20 70 7d  j {REFERENCES p}
10e0: 20 30 20 7b 7d 20 30 7d 0a 20 20 64 6f 5f 74 65   0 {} 0}.  do_te
10f0: 73 74 20 65 5f 66 6b 65 79 2d 33 2e 34 20 7b 0a  st e_fkey-3.4 {.
1100: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
1110: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1120: 5f 6c 69 73 74 28 63 29 20 7d 0a 20 20 7d 20 7b  _list(c) }.  } {
1130: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
1140: 65 79 2d 33 2e 35 20 7b 0a 20 20 20 20 65 78 65  ey-3.5 {.    exe
1150: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
1160: 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 20 20 7d  reign_keys }.  }
1170: 20 7b 7d 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65   {}.}..ifcapable
1180: 20 21 66 6f 72 65 69 67 6e 6b 65 79 7c 7c 21 74   !foreignkey||!t
1190: 72 69 67 67 65 72 20 7b 20 66 69 6e 69 73 68 5f  rigger { finish_
11a0: 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d 0a  test ; return }.
11b0: 72 65 73 65 74 5f 64 62 0a 0a 0a 23 2d 2d 2d 2d  reset_db...#----
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
1210: 2d 4f 46 3a 20 52 2d 30 37 32 38 30 2d 36 30 35  -OF: R-07280-605
1220: 31 30 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  10 Assuming the 
1230: 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
1240: 6c 65 64 20 77 69 74 68 0a 23 20 66 6f 72 65 69  led with.# forei
1250: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
1260: 74 73 20 65 6e 61 62 6c 65 64 2c 20 69 74 20 6d  ts enabled, it m
1270: 75 73 74 20 73 74 69 6c 6c 20 62 65 20 65 6e 61  ust still be ena
1280: 62 6c 65 64 20 62 79 20 74 68 65 0a 23 20 61 70  bled by the.# ap
1290: 70 6c 69 63 61 74 69 6f 6e 20 61 74 20 72 75 6e  plication at run
12a0: 74 69 6d 65 2c 20 75 73 69 6e 67 20 74 68 65 20  time, using the 
12b0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
12c0: 65 79 73 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 23  eys command..#.#
12d0: 20 54 68 69 73 20 61 6c 73 6f 20 74 65 73 74 73   This also tests
12e0: 20 74 68 61 74 20 66 6f 72 65 69 67 6e 20 6b 65   that foreign ke
12f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
1300: 65 20 64 69 73 61 62 6c 65 64 20 62 79 20 64 65  e disabled by de
1310: 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45  fault..#.# EVIDE
1320: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 32 36 31 2d  NCE-OF: R-44261-
1330: 33 39 37 30 32 20 46 6f 72 65 69 67 6e 20 6b 65  39702 Foreign ke
1340: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
1350: 65 20 64 69 73 61 62 6c 65 64 20 62 79 0a 23 20  e disabled by.# 
1360: 64 65 66 61 75 6c 74 20 28 66 6f 72 20 62 61 63  default (for bac
1370: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1380: 6c 69 74 79 29 2c 20 73 6f 20 6d 75 73 74 20 62  lity), so must b
1390: 65 20 65 6e 61 62 6c 65 64 20 73 65 70 61 72 61  e enabled separa
13a0: 74 65 6c 79 0a 23 20 66 6f 72 20 65 61 63 68 20  tely.# for each 
13b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13c0: 69 6f 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ion..#.drop_all_
13d0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
13e0: 5f 66 6b 65 79 2d 34 2e 31 20 7b 0a 20 20 65 78  _fkey-4.1 {.  ex
13f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1400: 54 45 20 54 41 42 4c 45 20 70 28 69 20 50 52 49  TE TABLE p(i PRI
1410: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
1420: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20  REATE TABLE c(j 
1430: 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
1440: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
1450: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1460: 20 70 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f   p VALUES('hello
1470: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
1480: 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65  NTO c VALUES('he
1490: 6c 6c 6f 27 29 3b 0a 20 20 20 20 55 50 44 41 54  llo');.    UPDAT
14a0: 45 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72  E p SET i = 'wor
14b0: 6c 64 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ld';.    SELECT 
14c0: 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d  * FROM c;.  } .}
14d0: 20 7b 68 65 6c 6c 6f 7d 0a 64 6f 5f 74 65 73 74   {hello}.do_test
14e0: 20 65 5f 66 6b 65 79 2d 34 2e 32 20 7b 0a 20 20   e_fkey-4.2 {.  
14f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
1500: 4c 45 54 45 20 46 52 4f 4d 20 63 3b 0a 20 20 20  LETE FROM c;.   
1510: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a   DELETE FROM p;.
1520: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
1530: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
1540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
1550: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b  VALUES('hello');
1560: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1570: 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f   c VALUES('hello
1580: 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70  ');.    UPDATE p
1590: 20 53 45 54 20 69 20 3d 20 27 77 6f 72 6c 64 27   SET i = 'world'
15a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
15b0: 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b 77  ROM c;.  } .} {w
15c0: 6f 72 6c 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  orld}..#--------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
1620: 20 52 2d 30 38 30 31 33 2d 33 37 37 33 37 20 54   R-08013-37737 T
1630: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
1640: 61 6e 20 61 6c 73 6f 20 75 73 65 20 61 20 50 52  an also use a PR
1650: 41 47 4d 41 0a 23 20 66 6f 72 65 69 67 6e 5f 6b  AGMA.# foreign_k
1660: 65 79 73 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  eys statement to
1670: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 66 6f   determine if fo
1680: 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 63  reign keys are c
1690: 75 72 72 65 6e 74 6c 79 0a 23 20 65 6e 61 62 6c  urrently.# enabl
16a0: 65 64 2e 0a 0a 23 0a 23 20 54 68 69 73 20 61 6c  ed...#.# This al
16b0: 73 6f 20 74 65 73 74 73 20 74 68 65 20 65 78 61  so tests the exa
16c0: 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 73 65 63  mple code in sec
16d0: 74 69 6f 6e 20 32 20 6f 66 20 66 6f 72 65 69 67  tion 2 of foreig
16e0: 6e 6b 65 79 73 2e 69 6e 2e 0a 23 0a 23 20 45 56  nkeys.in..#.# EV
16f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 32  IDENCE-OF: R-112
1700: 35 35 2d 31 39 39 30 37 0a 23 20 0a 72 65 73 65  55-19907.# .rese
1710: 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 65 5f 66  t_db.do_test e_f
1720: 6b 65 79 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63  key-5.1 {.  exec
1730: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
1740: 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 7d 20 7b 30  eign_keys }.} {0
1750: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
1760: 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.2 {.  execsql
1770: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 66   { .    PRAGMA f
1780: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
1790: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  ;.    PRAGMA for
17a0: 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d 0a 7d  eign_keys;.  }.}
17b0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {1}.do_test e_f
17c0: 6b 65 79 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63  key-5.3 {.  exec
17d0: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
17e0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
17f0: 20 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41   OFF;.    PRAGMA
1800: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20   foreign_keys;. 
1810: 20 7d 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d   }.} {0}..#-----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
1870: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1880: 62 6c 65 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  ble to enable or
1890: 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
18a0: 20 6b 65 79 20 73 75 70 70 6f 72 74 0a 23 20 77   key support.# w
18b0: 68 69 6c 65 20 6e 6f 74 20 69 6e 20 61 75 74 6f  hile not in auto
18c0: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 23 0a  -commit mode..#.
18d0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
18e0: 2d 34 36 36 34 39 2d 35 38 35 33 37 20 49 74 20  -46649-58537 It 
18f0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1900: 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73  to enable or dis
1910: 61 62 6c 65 0a 23 20 66 6f 72 65 69 67 6e 20 6b  able.# foreign k
1920: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ey constraints i
1930: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
1940: 61 20 6d 75 6c 74 69 2d 73 74 61 74 65 6d 65 6e  a multi-statemen
1950: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  t transaction.# 
1960: 28 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20  (when SQLite is 
1970: 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69  not in autocommi
1980: 74 20 6d 6f 64 65 29 2e 20 41 74 74 65 6d 70 74  t mode). Attempt
1990: 69 6e 67 20 74 6f 20 64 6f 20 73 6f 20 64 6f 65  ing to do so doe
19a0: 73 20 6e 6f 74 0a 23 20 72 65 74 75 72 6e 20 61  s not.# return a
19b0: 6e 20 65 72 72 6f 72 3b 20 69 74 20 73 69 6d 70  n error; it simp
19c0: 6c 79 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ly has no effect
19d0: 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f  ..#.reset_db.do_
19e0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e 31 20  test e_fkey-6.1 
19f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1a00: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
1a10: 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20  _keys = ON;.    
1a20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1a30: 61 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a 20 20  a UNIQUE, b);.  
1a40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1a50: 32 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45  2(c, d REFERENCE
1a60: 53 20 74 31 28 61 29 29 3b 0a 20 20 20 20 49 4e  S t1(a));.    IN
1a70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1a80: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49  UES(1, 2);.    I
1a90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1aa0: 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20 20  LUES(2, 1);.    
1ab0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41  BEGIN;.      PRA
1ac0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
1ad0: 20 3d 20 4f 46 46 3b 0a 20 20 7d 0a 20 20 63 61   = OFF;.  }.  ca
1ae0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 44  tchsql {.      D
1af0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a 20 20  ELETE FROM t1.  
1b00: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
1b10: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
1b20: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
1b30: 65 5f 66 6b 65 79 2d 36 2e 32 20 7b 0a 20 20 65  e_fkey-6.2 {.  e
1b40: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1b50: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 7d  foreign_keys }.}
1b60: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {1}.do_test e_f
1b70: 6b 65 79 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63  key-6.3 {.  exec
1b80: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
1b90: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  ;.    PRAGMA for
1ba0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
1bb0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
1bc0: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
1bd0: 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20  _keys = ON;.    
1be0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1bf0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66  ;.      PRAGMA f
1c00: 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d  oreign_keys;.  }
1c10: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {0}.do_test e
1c20: 5f 66 6b 65 79 2d 36 2e 34 20 7b 0a 20 20 65 78  _fkey-6.4 {.  ex
1c30: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b  ecsql COMMIT.} {
1c40: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
1c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
1c90: 23 23 20 53 45 43 54 49 4f 4e 20 31 3a 20 49 6e  ## SECTION 1: In
1ca0: 74 72 6f 64 75 63 74 69 6f 6e 20 74 6f 20 46 6f  troduction to Fo
1cb0: 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72  reign Key Constr
1cc0: 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23  aints.##########
1cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d10: 23 0a 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d  #.execsql "PRAGM
1d20: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
1d30: 20 4f 4e 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   ON"..#---------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .# Verify that t
1d90: 68 65 20 73 79 6e 74 61 78 20 69 6e 20 74 68 65  he syntax in the
1da0: 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20 69   first example i
1db0: 6e 20 73 65 63 74 69 6f 6e 20 31 20 69 73 20 76  n section 1 is v
1dc0: 61 6c 69 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  alid..#.# EVIDEN
1dd0: 43 45 2d 4f 46 3a 20 52 2d 30 34 30 34 32 2d 32  CE-OF: R-04042-2
1de0: 34 38 32 35 20 54 6f 20 64 6f 20 73 6f 2c 20 61  4825 To do so, a
1df0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
1e00: 69 6e 69 74 69 6f 6e 20 6d 61 79 20 62 65 0a 23  inition may be.#
1e10: 20 61 64 64 65 64 20 62 79 20 6d 6f 64 69 66 79   added by modify
1e20: 69 6e 67 20 74 68 65 20 64 65 63 6c 61 72 61 74  ing the declarat
1e30: 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 61 63 6b  ion of the track
1e40: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 0a 23 20   table to the.# 
1e50: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 43 52 45 41 54  following: CREAT
1e60: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 20 74  E TABLE track( t
1e70: 72 61 63 6b 69 64 20 49 4e 54 45 47 45 52 2c 20  rackid INTEGER, 
1e80: 74 72 61 63 6b 6e 61 6d 65 20 54 45 58 54 2c 0a  trackname TEXT,.
1e90: 23 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e  # trackartist IN
1ea0: 54 45 47 45 52 2c 20 46 4f 52 45 49 47 4e 20 4b  TEGER, FOREIGN K
1eb0: 45 59 28 74 72 61 63 6b 61 72 74 69 73 74 29 20  EY(trackartist) 
1ec0: 52 45 46 45 52 45 4e 43 45 53 0a 23 20 61 72 74  REFERENCES.# art
1ed0: 69 73 74 28 61 72 74 69 73 74 69 64 29 20 29 3b  ist(artistid) );
1ee0: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
1ef0: 79 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  y-7.1 {.  execsq
1f00: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
1f10: 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20  ABLE artist(.   
1f20: 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20 49     artistid    I
1f30: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1f40: 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73  EY, .      artis
1f50: 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20  tname  TEXT.    
1f60: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
1f70: 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20  BLE track(.     
1f80: 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54   trackid     INT
1f90: 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74 72 61  EGER, .      tra
1fa0: 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
1fb0: 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
1fc0: 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20  t INTEGER,.     
1fd0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72 61   FOREIGN KEY(tra
1fe0: 63 6b 61 72 74 69 73 74 29 20 52 45 46 45 52 45  ckartist) REFERE
1ff0: 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
2000: 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d  stid).    );.  }
2010: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
2070: 20 52 2d 36 31 33 36 32 2d 33 32 30 38 37 20 41   R-61362-32087 A
2080: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69 6e 73  ttempting to ins
2090: 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20 74  ert a row into t
20a0: 68 65 20 74 72 61 63 6b 0a 23 20 74 61 62 6c 65  he track.# table
20b0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
20c0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e 79  orrespond to any
20d0: 20 72 6f 77 20 69 6e 20 74 68 65 20 61 72 74 69   row in the arti
20e0: 73 74 20 74 61 62 6c 65 20 77 69 6c 6c 0a 23 20  st table will.# 
20f0: 66 61 69 6c 2c 0a 23 0a 64 6f 5f 74 65 73 74 20  fail,.#.do_test 
2100: 65 5f 66 6b 65 79 2d 38 2e 31 20 7b 0a 20 20 63  e_fkey-8.1 {.  c
2110: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
2120: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
2130: 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c  ES(1, 'track 1',
2140: 20 31 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45   1) }.} {1 {FORE
2150: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
2160: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
2170: 65 73 74 20 65 5f 66 6b 65 79 2d 38 2e 32 20 7b  est e_fkey-8.2 {
2180: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
2190: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
21a0: 56 41 4c 55 45 53 28 32 2c 20 27 61 72 74 69 73  VALUES(2, 'artis
21b0: 74 20 31 27 29 20 7d 0a 20 20 63 61 74 63 68 73  t 1') }.  catchs
21c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
21d0: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c   track VALUES(1,
21e0: 20 27 74 72 61 63 6b 20 31 27 2c 20 31 29 20 7d   'track 1', 1) }
21f0: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
2200: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
2210: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
2220: 5f 66 6b 65 79 2d 38 2e 32 20 7b 0a 20 20 65 78  _fkey-8.2 {.  ex
2230: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
2240: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
2250: 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 32  (1, 'track 1', 2
2260: 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ) }.} {}..#-----
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d 70 74 69 6e  ----.# Attemptin
22c0: 67 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72 6f  g to delete a ro
22d0: 77 20 66 72 6f 6d 20 74 68 65 20 27 61 72 74 69  w from the 'arti
22e0: 73 74 27 20 74 61 62 6c 65 20 77 68 69 6c 65 20  st' table while 
22f0: 74 68 65 72 65 20 61 72 65 20 0a 23 20 64 65 70  there are .# dep
2300: 65 6e 64 65 6e 74 20 72 6f 77 73 20 69 6e 20 74  endent rows in t
2310: 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20 61  he track table a
2320: 6c 73 6f 20 66 61 69 6c 73 2e 0a 23 0a 23 20 45  lso fails..#.# E
2330: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
2340: 34 30 31 2d 35 32 34 30 30 20 61 73 20 77 69 6c  401-52400 as wil
2350: 6c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  l attempting to 
2360: 64 65 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f  delete a row fro
2370: 6d 20 74 68 65 0a 23 20 61 72 74 69 73 74 20 74  m the.# artist t
2380: 61 62 6c 65 20 77 68 65 6e 20 74 68 65 72 65 20  able when there 
2390: 65 78 69 73 74 20 64 65 70 65 6e 64 65 6e 74 20  exist dependent 
23a0: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61 63  rows in the trac
23b0: 6b 20 74 61 62 6c 65 0a 23 0a 64 6f 5f 74 65 73  k table.#.do_tes
23c0: 74 20 65 5f 66 6b 65 79 2d 39 2e 31 20 7b 0a 20  t e_fkey-9.1 {. 
23d0: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
23e0: 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
23f0: 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20  HERE artistid = 
2400: 32 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  2 }.} {1 {FOREIG
2410: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
2420: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
2430: 74 20 65 5f 66 6b 65 79 2d 39 2e 32 20 7b 0a 20  t e_fkey-9.2 {. 
2440: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
2450: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63  DELETE FROM trac
2460: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
2470: 69 73 74 20 3d 20 32 3b 0a 20 20 20 20 44 45 4c  ist = 2;.    DEL
2480: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
2490: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
24a0: 20 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d   2;.  }.} {}..#-
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 74 68  --------.# If th
2500: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2510: 6c 75 6d 6e 20 28 74 72 61 63 6b 61 72 74 69 73  lumn (trackartis
2520: 74 29 20 69 6e 20 74 61 62 6c 65 20 27 74 72 61  t) in table 'tra
2530: 63 6b 27 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ck' is set to NU
2540: 4c 4c 2c 0a 23 20 74 68 65 72 65 20 69 73 20 6e  LL,.# there is n
2550: 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  o requirement fo
2560: 72 20 61 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  r a matching row
2570: 20 69 6e 20 74 68 65 20 27 61 72 74 69 73 74 27   in the 'artist'
2580: 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44   table..#.# EVID
2590: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39 38 30  ENCE-OF: R-23980
25a0: 2d 34 38 38 35 39 20 54 68 65 72 65 20 69 73 20  -48859 There is 
25b0: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 3a 20 69  one exception: i
25c0: 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  f the foreign ke
25d0: 79 0a 23 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  y.# column in th
25e0: 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20 69 73  e track table is
25f0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6e 6f 20 63   NULL, then no c
2600: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
2610: 72 79 20 69 6e 20 74 68 65 0a 23 20 61 72 74 69  ry in the.# arti
2620: 73 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  st table is requ
2630: 69 72 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ired..#.do_test 
2640: 65 5f 66 6b 65 79 2d 31 30 2e 31 20 7b 0a 20 20  e_fkey-10.1 {.  
2650: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
2660: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
2670: 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b  VALUES(1, 'track
2680: 20 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20   1', NULL);.    
2690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
26a0: 6b 20 56 41 4c 55 45 53 28 32 2c 20 27 74 72 61  k VALUES(2, 'tra
26b0: 63 6b 20 32 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20  ck 2', NULL);.  
26c0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
26d0: 5f 66 6b 65 79 2d 31 30 2e 32 20 7b 0a 20 20 65  _fkey-10.2 {.  e
26e0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
26f0: 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20 7d 0a  * FROM artist }.
2700: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
2710: 6b 65 79 2d 31 30 2e 33 20 7b 0a 20 20 23 20 53  key-10.3 {.  # S
2720: 65 74 74 69 6e 67 20 74 68 65 20 74 72 61 63 6b  etting the track
2730: 69 64 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  id to a non-NULL
2740: 20 76 61 6c 75 65 20 66 61 69 6c 73 2c 20 6f 66   value fails, of
2750: 20 63 6f 75 72 73 65 2e 0a 20 20 63 61 74 63 68   course..  catch
2760: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 72 61  sql { UPDATE tra
2770: 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69  ck SET trackarti
2780: 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72 61  st = 5 WHERE tra
2790: 63 6b 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31 20  ckid = 1 }.} {1 
27a0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
27b0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
27c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
27d0: 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  10.4 {.  execsql
27e0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
27f0: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
2800: 28 35 2c 20 27 61 72 74 69 73 74 20 35 27 29 3b  (5, 'artist 5');
2810: 0a 20 20 20 20 55 50 44 41 54 45 20 74 72 61 63  .    UPDATE trac
2820: 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69 73  k SET trackartis
2830: 74 20 3d 20 35 20 57 48 45 52 45 20 74 72 61 63  t = 5 WHERE trac
2840: 6b 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 63  kid = 1;.  }.  c
2850: 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
2860: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
2870: 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35 7d  RE artistid = 5}
2880: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
2890: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
28a0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
28b0: 5f 66 6b 65 79 2d 31 30 2e 35 20 7b 0a 20 20 65  _fkey-10.5 {.  e
28c0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55 50  xecsql { .    UP
28d0: 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20 74  DATE track SET t
28e0: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 4e 55 4c  rackartist = NUL
28f0: 4c 20 57 48 45 52 45 20 74 72 61 63 6b 69 64 20  L WHERE trackid 
2900: 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  = 1;.    DELETE 
2910: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
2920: 45 20 61 72 74 69 73 74 69 64 20 3d 20 35 3b 0a  E artistid = 5;.
2930: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
2990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
29a0: 73 20 74 72 75 65 20 66 6f 20 61 6c 6c 20 72 6f  s true fo all ro
29b0: 77 73 20 69 6e 20 74 68 65 20 74 72 61 63 6b 20  ws in the track 
29c0: 74 61 62 6c 65 3a 0a 23 0a 23 20 20 20 74 72 61  table:.#.#   tra
29d0: 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55 4c 4c  ckartist IS NULL
29e0: 20 4f 52 20 0a 23 20 20 20 45 58 49 53 54 53 28   OR .#   EXISTS(
29f0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61 72  SELECT 1 FROM ar
2a00: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
2a10: 74 69 64 3d 74 72 61 63 6b 61 72 74 69 73 74 29  tid=trackartist)
2a20: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
2a30: 3a 20 52 2d 35 32 34 38 36 2d 32 31 33 35 32 20  : R-52486-21352 
2a40: 45 78 70 72 65 73 73 65 64 20 69 6e 20 53 51 4c  Expressed in SQL
2a50: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
2a60: 74 20 66 6f 72 20 65 76 65 72 79 0a 23 20 72 6f  t for every.# ro
2a70: 77 20 69 6e 20 74 68 65 20 74 72 61 63 6b 20 74  w in the track t
2a80: 61 62 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  able, the follow
2a90: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 65  ing expression e
2aa0: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
2ab0: 3a 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74 20  :.# trackartist 
2ac0: 49 53 20 4e 55 4c 4c 20 4f 52 20 45 58 49 53 54  IS NULL OR EXIST
2ad0: 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  S(SELECT 1 FROM 
2ae0: 61 72 74 69 73 74 20 57 48 45 52 45 0a 23 20 61  artist WHERE.# a
2af0: 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61 72 74  rtistid=trackart
2b00: 69 73 74 29 0a 0a 23 20 54 68 69 73 20 70 72 6f  ist)..# This pro
2b10: 63 65 64 75 72 65 20 65 78 65 63 75 74 65 73 20  cedure executes 
2b20: 61 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 63  a test case to c
2b30: 68 65 63 6b 20 74 68 61 74 20 73 74 61 74 65 6d  heck that statem
2b40: 65 6e 74 20 0a 23 20 52 2d 35 32 34 38 36 2d 32  ent .# R-52486-2
2b50: 31 33 35 32 20 69 73 20 74 72 75 65 20 61 66 74  1352 is true aft
2b60: 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68 65  er executing the
2b70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70   SQL statement p
2b80: 61 73 73 65 64 2e 0a 23 20 61 73 20 74 68 65 20  assed..# as the 
2b90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2ba0: 0a 70 72 6f 63 20 74 65 73 74 5f 72 35 32 34 38  .proc test_r5248
2bb0: 36 5f 32 31 33 35 32 20 7b 74 6e 20 73 71 6c 7d  6_21352 {tn sql}
2bc0: 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 63 61   {.  set res [ca
2bd0: 74 63 68 73 71 6c 20 24 73 71 6c 5d 0a 20 20 73  tchsql $sql].  s
2be0: 65 74 20 72 65 73 75 6c 74 73 20 7b 0a 20 20 20  et results {.   
2bf0: 20 7b 30 20 7b 7d 7d 20 0a 20 20 20 20 7b 31 20   {0 {}} .    {1 
2c00: 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  {UNIQUE constrai
2c10: 6e 74 20 66 61 69 6c 65 64 3a 20 61 72 74 69 73  nt failed: artis
2c20: 74 2e 61 72 74 69 73 74 69 64 7d 7d 20 0a 20 20  t.artistid}} .  
2c30: 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45    {1 {FOREIGN KE
2c40: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
2c50: 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20 69 66 20 7b  led}}.  }.  if {
2c60: 5b 6c 73 65 61 72 63 68 20 24 72 65 73 75 6c 74  [lsearch $result
2c70: 73 20 24 72 65 73 5d 3c 30 7d 20 7b 0a 20 20 20  s $res]<0} {.   
2c80: 20 65 72 72 6f 72 20 24 72 65 73 0a 20 20 7d 0a   error $res.  }.
2c90: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
2ca0: 79 2d 31 31 2e 24 74 6e 20 7b 0a 20 20 20 20 65  y-11.$tn {.    e
2cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
2cc0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2cd0: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
2ce0: 4e 4f 54 20 28 0a 20 20 20 20 20 20 20 20 74 72  NOT (.        tr
2cf0: 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55 4c  ackartist IS NUL
2d00: 4c 20 4f 52 20 0a 20 20 20 20 20 20 20 20 45 58  L OR .        EX
2d10: 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52  ISTS(SELECT 1 FR
2d20: 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
2d30: 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61 72  artistid=trackar
2d40: 74 69 73 74 29 0a 20 20 20 20 20 20 29 0a 20 20  tist).      ).  
2d50: 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a 0a 23    }.  } {0}.}..#
2d60: 20 45 78 65 63 75 74 65 20 61 20 73 65 72 69 65   Execute a serie
2d70: 73 20 6f 66 20 72 61 6e 64 6f 6d 20 49 4e 53 45  s of random INSE
2d80: 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64 20 44  RT, UPDATE and D
2d90: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2da0: 0a 23 20 28 73 6f 6d 65 20 6f 66 20 77 68 69 63  .# (some of whic
2db0: 68 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  h may fail due t
2dc0: 6f 20 46 4b 20 6f 72 20 50 4b 20 63 6f 6e 73 74  o FK or PK const
2dd0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
2de0: 29 20 6f 6e 20 0a 23 20 74 68 65 20 74 77 6f 20  ) on .# the two 
2df0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 65 78  tables in the ex
2e00: 61 6d 70 6c 65 20 73 63 68 65 6d 61 2e 20 54 65  ample schema. Te
2e10: 73 74 20 74 68 61 74 20 52 2d 35 32 34 38 36 2d  st that R-52486-
2e20: 32 31 33 35 32 0a 23 20 69 73 20 74 72 75 65 20  21352.# is true 
2e30: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 20  after executing 
2e40: 65 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  each operation..
2e50: 23 0a 73 65 74 20 54 65 6d 70 6c 61 74 65 20 7b  #.set Template {
2e60: 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  .  {INSERT INTO 
2e70: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 24 74 2c  track VALUES($t,
2e80: 20 27 74 72 61 63 6b 20 24 74 27 2c 20 24 61 29   'track $t', $a)
2e90: 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  }.  {DELETE FROM
2ea0: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
2eb0: 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20 7b 55 50  ckid = $t}.  {UP
2ec0: 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20 74  DATE track SET t
2ed0: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 24 61 20  rackartist = $a 
2ee0: 57 48 45 52 45 20 74 72 61 63 6b 69 64 20 3d 20  WHERE trackid = 
2ef0: 24 74 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e  $t}.  {INSERT IN
2f00: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
2f10: 28 24 61 2c 20 27 61 72 74 69 73 74 20 24 61 27  ($a, 'artist $a'
2f20: 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f  )}.  {DELETE FRO
2f30: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
2f40: 72 74 69 73 74 69 64 20 3d 20 24 61 7d 0a 20 20  rtistid = $a}.  
2f50: 7b 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53  {UPDATE artist S
2f60: 45 54 20 61 72 74 69 73 74 69 64 20 3d 20 24 61  ET artistid = $a
2f70: 32 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64  2 WHERE artistid
2f80: 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72 20 7b 73 65   = $a}.}.for {se
2f90: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35 30 30  t i 0} {$i < 500
2fa0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73  } {incr i} {.  s
2fb0: 65 74 20 61 20 20 20 5b 65 78 70 72 20 69 6e 74  et a   [expr int
2fc0: 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20 20 73  (rand()*10)].  s
2fd0: 65 74 20 61 32 20 20 5b 65 78 70 72 20 69 6e 74  et a2  [expr int
2fe0: 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20 20 73  (rand()*10)].  s
2ff0: 65 74 20 74 20 20 20 5b 65 78 70 72 20 69 6e 74  et t   [expr int
3000: 28 72 61 6e 64 28 29 2a 35 30 29 5d 0a 20 20 73  (rand()*50)].  s
3010: 65 74 20 73 71 6c 20 5b 73 75 62 73 74 20 5b 6c  et sql [subst [l
3020: 69 6e 64 65 78 20 24 54 65 6d 70 6c 61 74 65 20  index $Template 
3030: 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28 29  [expr int(rand()
3040: 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65 73 74 5f 72  *6)]]]..  test_r
3050: 35 32 34 38 36 5f 32 31 33 35 32 20 24 69 20 24  52486_21352 $i $
3060: 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  sql.}..#--------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 61  -.# Check that a
30c0: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
30d0: 61 69 6e 74 20 63 61 6e 20 62 65 20 61 64 64 65  aint can be adde
30e0: 64 20 74 6f 20 74 68 65 20 65 78 61 6d 70 6c 65  d to the example
30f0: 20 73 63 68 65 6d 61 0a 23 20 74 6f 20 70 72 6f   schema.# to pro
3100: 68 69 62 69 74 20 4e 55 4c 4c 20 63 68 69 6c 64  hibit NULL child
3110: 20 6b 65 79 73 20 66 72 6f 6d 20 62 65 69 6e 67   keys from being
3120: 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a 23 20 45   inserted..#.# E
3130: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
3140: 34 31 32 2d 35 39 33 32 31 20 54 69 70 3a 20 49  412-59321 Tip: I
3150: 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
3160: 6e 20 72 65 71 75 69 72 65 73 20 61 20 73 74 72  n requires a str
3170: 69 63 74 65 72 0a 23 20 72 65 6c 61 74 69 6f 6e  icter.# relation
3180: 73 68 69 70 20 62 65 74 77 65 65 6e 20 61 72 74  ship between art
3190: 69 73 74 20 61 6e 64 20 74 72 61 63 6b 2c 20 77  ist and track, w
31a0: 68 65 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  here NULL values
31b0: 20 61 72 65 20 6e 6f 74 0a 23 20 70 65 72 6d 69   are not.# permi
31c0: 74 74 65 64 20 69 6e 20 74 68 65 20 74 72 61 63  tted in the trac
31d0: 6b 61 72 74 69 73 74 20 63 6f 6c 75 6d 6e 2c 20  kartist column, 
31e0: 73 69 6d 70 6c 79 20 61 64 64 20 74 68 65 20 61  simply add the a
31f0: 70 70 72 6f 70 72 69 61 74 65 20 22 4e 4f 54 0a  ppropriate "NOT.
3200: 23 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  # NULL" constrai
3210: 6e 74 20 74 6f 20 74 68 65 20 73 63 68 65 6d 61  nt to the schema
3220: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
3230: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
3240: 65 79 2d 31 32 2e 31 20 7b 0a 20 20 65 78 65 63  ey-12.1 {.  exec
3250: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3260: 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
3270: 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
3280: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3290: 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
32a0: 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
32b0: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
32c0: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
32d0: 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
32e0: 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74  NTEGER, .      t
32f0: 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
3300: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
3310: 69 73 74 20 49 4e 54 45 47 45 52 20 4e 4f 54 20  ist INTEGER NOT 
3320: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 46 4f 52 45  NULL,.      FORE
3330: 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74  IGN KEY(trackart
3340: 69 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20  ist) REFERENCES 
3350: 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29  artist(artistid)
3360: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
3370: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3380: 31 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  12.2 {.  catchsq
3390: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
33a0: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34 2c  track VALUES(14,
33b0: 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27   'Mr. Bojangles'
33c0: 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20 7b  , NULL) }.} {1 {
33d0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
33e0: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 72 61 63  int failed: trac
33f0: 6b 2e 74 72 61 63 6b 61 72 74 69 73 74 7d 7d 0a  k.trackartist}}.
3400: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
3450: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 31  IDENCE-OF: R-161
3460: 32 37 2d 33 35 34 34 32 0a 23 0a 23 20 54 65 73  27-35442.#.# Tes
3470: 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f  t an example fro
3480: 6d 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74  m foreignkeys.ht
3490: 6d 6c 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ml..#.drop_all_t
34a0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
34b0: 66 6b 65 79 2d 31 33 2e 31 20 7b 0a 20 20 65 78  fkey-13.1 {.  ex
34c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
34d0: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
34e0: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
34f0: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
3500: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
3510: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
3520: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
3530: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
3540: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
3550: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
3560: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
3570: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
3580: 72 74 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20  rtist INTEGER,. 
3590: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
35a0: 28 74 72 61 63 6b 61 72 74 69 73 74 29 20 52 45  (trackartist) RE
35b0: 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
35c0: 61 72 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b  artistid).    );
35d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
35e0: 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 31   artist VALUES(1
35f0: 2c 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 29  , 'Dean Martin')
3600: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3610: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
3620: 32 2c 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72  2, 'Frank Sinatr
3630: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
3640: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
3650: 53 28 31 31 2c 20 27 54 68 61 74 27 27 73 20 41  S(11, 'That''s A
3660: 6d 6f 72 65 27 2c 20 31 29 3b 0a 20 20 20 20 49  more', 1);.    I
3670: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3680: 20 56 41 4c 55 45 53 28 31 32 2c 20 27 43 68 72   VALUES(12, 'Chr
3690: 69 73 74 6d 61 73 20 42 6c 75 65 73 27 2c 20 31  istmas Blues', 1
36a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
36b0: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
36c0: 31 33 2c 20 27 4d 79 20 57 61 79 27 2c 20 32 29  13, 'My Way', 2)
36d0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
36e0: 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 32 20 7b  st e_fkey-13.2 {
36f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
3700: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
3710: 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e 20  VALUES(14, 'Mr. 
3720: 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33 29 20 7d  Bojangles', 3) }
3730: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
3740: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
3750: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
3760: 5f 66 6b 65 79 2d 31 33 2e 33 20 7b 0a 20 20 65  _fkey-13.3 {.  e
3770: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
3780: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
3790: 53 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e  S(14, 'Mr. Bojan
37a0: 67 6c 65 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d  gles', NULL) }.}
37b0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
37c0: 65 79 2d 31 33 2e 34 20 7b 0a 20 20 63 61 74 63  ey-13.4 {.  catc
37d0: 68 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41  hsql { .    UPDA
37e0: 54 45 20 74 72 61 63 6b 20 53 45 54 20 74 72 61  TE track SET tra
37f0: 63 6b 61 72 74 69 73 74 20 3d 20 33 20 57 48 45  ckartist = 3 WHE
3800: 52 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27  RE trackname = '
3810: 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a  Mr. Bojangles';.
3820: 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47    }.} {1 {FOREIG
3830: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
3840: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
3850: 74 20 65 5f 66 6b 65 79 2d 31 33 2e 35 20 7b 0a  t e_fkey-13.5 {.
3860: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
3880: 73 74 20 56 41 4c 55 45 53 28 33 2c 20 27 53 61  st VALUES(3, 'Sa
3890: 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 29 3b  mmy Davis Jr.');
38a0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 72 61 63  .    UPDATE trac
38b0: 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69 73  k SET trackartis
38c0: 74 20 3d 20 33 20 57 48 45 52 45 20 74 72 61 63  t = 3 WHERE trac
38d0: 6b 6e 61 6d 65 20 3d 20 27 4d 72 2e 20 42 6f 6a  kname = 'Mr. Boj
38e0: 61 6e 67 6c 65 73 27 3b 0a 20 20 20 20 49 4e 53  angles';.    INS
38f0: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
3900: 41 4c 55 45 53 28 31 35 2c 20 27 42 6f 6f 67 69  ALUES(15, 'Boogi
3910: 65 20 57 6f 6f 67 69 65 27 2c 20 33 29 3b 0a 20  e Woogie', 3);. 
3920: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
3980: 46 3a 20 52 2d 31 35 39 35 38 2d 35 30 32 33 33  F: R-15958-50233
3990: 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 73 65  .#.# Test the se
39a0: 63 6f 6e 64 20 65 78 61 6d 70 6c 65 20 66 72 6f  cond example fro
39b0: 6d 20 74 68 65 20 66 69 72 73 74 20 73 65 63 74  m the first sect
39c0: 69 6f 6e 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65  ion of foreignke
39d0: 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 6f 5f 74 65  ys.html..#.do_te
39e0: 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 31 20 7b  st e_fkey-14.1 {
39f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3a00: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72    DELETE FROM ar
3a10: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
3a20: 74 6e 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53  tname = 'Frank S
3a30: 69 6e 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b  inatra';.  }.} {
3a40: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
3a50: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
3a60: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
3a70: 79 2d 31 34 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-14.2 {.  execs
3a80: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
3a90: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
3aa0: 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d 79   trackname = 'My
3ab0: 20 57 61 79 27 3b 0a 20 20 20 20 44 45 4c 45 54   Way';.    DELET
3ac0: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
3ad0: 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d  ERE artistname =
3ae0: 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 27   'Frank Sinatra'
3af0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
3b00: 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 33 20 7b  st e_fkey-14.3 {
3b10: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3b20: 20 20 55 50 44 41 54 45 20 61 72 74 69 73 74 20    UPDATE artist 
3b30: 53 45 54 20 61 72 74 69 73 74 69 64 3d 34 20 57  SET artistid=4 W
3b40: 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20  HERE artistname 
3b50: 3d 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b  = 'Dean Martin';
3b60: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  .  }.} {1 {FOREI
3b70: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
3b80: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
3b90: 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 34 20 7b  st e_fkey-14.4 {
3ba0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3bb0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61   DELETE FROM tra
3bc0: 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61  ck WHERE trackna
3bd0: 6d 65 20 49 4e 28 27 54 68 61 74 27 27 73 20 41  me IN('That''s A
3be0: 6d 6f 72 65 27 2c 20 27 43 68 72 69 73 74 6d 61  more', 'Christma
3bf0: 73 20 42 6c 75 65 73 27 29 3b 0a 20 20 20 20 55  s Blues');.    U
3c00: 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45 54  PDATE artist SET
3c10: 20 61 72 74 69 73 74 69 64 3d 34 20 57 48 45 52   artistid=4 WHER
3c20: 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27  E artistname = '
3c30: 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20 20  Dean Martin';.  
3c40: 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {}...#------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
3ca0: 46 3a 20 52 2d 35 36 30 33 32 2d 32 34 39 32 33  F: R-56032-24923
3cb0: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
3cc0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
3cd0: 61 74 69 73 66 69 65 64 20 69 66 0a 23 20 66 6f  atisfied if.# fo
3ce0: 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68  r each row in th
3cf0: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 65 69  e child table ei
3d00: 74 68 65 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ther one or more
3d10: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65   of the child ke
3d20: 79 0a 23 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  y.# columns are 
3d30: 4e 55 4c 4c 2c 20 6f 72 20 74 68 65 72 65 20 65  NULL, or there e
3d40: 78 69 73 74 73 20 61 20 72 6f 77 20 69 6e 20 74  xists a row in t
3d50: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
3d60: 66 6f 72 20 77 68 69 63 68 0a 23 20 65 61 63 68  for which.# each
3d70: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75   parent key colu
3d80: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61  mn contains a va
3d90: 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65  lue equal to the
3da0: 20 76 61 6c 75 65 20 69 6e 20 69 74 73 0a 23 20   value in its.# 
3db0: 61 73 73 6f 63 69 61 74 65 64 20 63 68 69 6c 64  associated child
3dc0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 23   key column..#.#
3dd0: 20 54 65 73 74 20 61 6c 73 6f 20 74 68 61 74 20   Test also that 
3de0: 74 68 65 20 75 73 75 61 6c 20 63 6f 6d 70 61 72  the usual compar
3df0: 69 73 6f 6e 20 72 75 6c 65 73 20 61 72 65 20 75  ison rules are u
3e00: 73 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  sed when testing
3e10: 20 69 66 20 74 68 65 72 65 20 0a 23 20 69 73 20   if there .# is 
3e20: 61 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 69  a matching row i
3e30: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
3e40: 6c 65 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  le of a foreign 
3e50: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  key constraint..
3e60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
3e70: 20 52 2d 35 37 37 36 35 2d 31 32 33 38 30 20 49   R-57765-12380 I
3e80: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
3e90: 67 72 61 70 68 2c 20 74 68 65 20 74 65 72 6d 20  graph, the term 
3ea0: 22 65 71 75 61 6c 22 0a 23 20 6d 65 61 6e 73 20  "equal".# means 
3eb0: 65 71 75 61 6c 20 77 68 65 6e 20 76 61 6c 75 65  equal when value
3ec0: 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75  s are compared u
3ed0: 73 69 6e 67 20 74 68 65 20 72 75 6c 65 73 20 73  sing the rules s
3ee0: 70 65 63 69 66 69 65 64 20 68 65 72 65 2e 0a 23  pecified here..#
3ef0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
3f00: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3f10: 31 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  15.1 {.  execsql
3f20: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
3f30: 42 4c 45 20 70 61 72 28 70 20 50 52 49 4d 41 52  BLE par(p PRIMAR
3f40: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
3f50: 54 45 20 54 41 42 4c 45 20 63 68 69 28 63 20 52  TE TABLE chi(c R
3f60: 45 46 45 52 45 4e 43 45 53 20 70 61 72 29 3b 0a  EFERENCES par);.
3f70: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3f80: 20 70 61 72 20 56 41 4c 55 45 53 28 31 29 3b 0a   par VALUES(1);.
3f90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fa0: 70 61 72 20 56 41 4c 55 45 53 28 27 31 27 29 3b  par VALUES('1');
3fb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3fc0: 20 70 61 72 20 56 41 4c 55 45 53 28 58 27 33 31   par VALUES(X'31
3fd0: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  ');.    SELECT t
3fe0: 79 70 65 6f 66 28 70 29 20 46 52 4f 4d 20 70 61  ypeof(p) FROM pa
3ff0: 72 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  r;.  }.} {intege
4000: 72 20 74 65 78 74 20 62 6c 6f 62 7d 0a 0a 70 72  r text blob}..pr
4010: 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  oc test_efkey_45
4020: 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c   {tn isError sql
4030: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
4040: 66 6b 65 79 2d 31 35 2e 24 74 6e 2e 31 20 22 0a  fkey-15.$tn.1 ".
4050: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73      catchsql {$s
4060: 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20  ql}.  " [lindex 
4070: 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45  {{0 {}} {1 {FORE
4080: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
4090: 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73  nt failed}}} $is
40a0: 45 72 72 6f 72 5d 0a 0a 20 20 64 6f 5f 74 65 73  Error]..  do_tes
40b0: 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24 74 6e 2e  t e_fkey-15.$tn.
40c0: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
40d0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
40e0: 20 46 52 4f 4d 20 63 68 69 20 57 48 45 52 45 20   FROM chi WHERE 
40f0: 63 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e  c IS NOT NULL AN
4100: 44 20 63 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45  D c NOT IN (SELE
4110: 43 54 20 70 20 46 52 4f 4d 20 70 61 72 29 0a 20  CT p FROM par). 
4120: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 74     }.  } {}.}..t
4130: 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 31 20 30  est_efkey_45 1 0
4140: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68   "INSERT INTO ch
4150: 69 20 56 41 4c 55 45 53 28 31 29 22 0a 74 65 73  i VALUES(1)".tes
4160: 74 5f 65 66 6b 65 79 5f 34 35 20 32 20 31 20 22  t_efkey_45 2 1 "
4170: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20  INSERT INTO chi 
4180: 56 41 4c 55 45 53 28 27 31 2e 30 27 29 22 0a 74  VALUES('1.0')".t
4190: 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 33 20 30  est_efkey_45 3 0
41a0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68   "INSERT INTO ch
41b0: 69 20 56 41 4c 55 45 53 28 27 31 27 29 22 0a 74  i VALUES('1')".t
41c0: 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 34 20 31  est_efkey_45 4 1
41d0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
41e0: 72 20 57 48 45 52 45 20 70 20 3d 20 27 31 27 22  r WHERE p = '1'"
41f0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 35  .test_efkey_45 5
4200: 20 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   0 "DELETE FROM 
4210: 63 68 69 20 57 48 45 52 45 20 63 20 3d 20 27 31  chi WHERE c = '1
4220: 27 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  '".test_efkey_45
4230: 20 36 20 30 20 22 44 45 4c 45 54 45 20 46 52 4f   6 0 "DELETE FRO
4240: 4d 20 70 61 72 20 57 48 45 52 45 20 70 20 3d 20  M par WHERE p = 
4250: 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '1'".test_efkey_
4260: 34 35 20 37 20 31 20 22 49 4e 53 45 52 54 20 49  45 7 1 "INSERT I
4270: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27  NTO chi VALUES('
4280: 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  1')".test_efkey_
4290: 34 35 20 38 20 30 20 22 49 4e 53 45 52 54 20 49  45 8 0 "INSERT I
42a0: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 58  NTO chi VALUES(X
42b0: 27 33 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65  '31')".test_efke
42c0: 79 5f 34 35 20 39 20 31 20 22 49 4e 53 45 52 54  y_45 9 1 "INSERT
42d0: 20 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53   INTO chi VALUES
42e0: 28 58 27 33 32 27 29 22 0a 0a 23 2d 2d 2d 2d 2d  (X'32')"..#-----
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66 69 63 61  ----.# Specifica
4340: 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74 20 77  lly, test that w
4350: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 63 68  hen comparing ch
4360: 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20 6b  ild and parent k
4370: 65 79 20 76 61 6c 75 65 73 20 74 68 65 0a 23 20  ey values the.# 
4380: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
4390: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
43a0: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
43b0: 75 6d 6e 20 69 73 20 75 73 65 64 2e 0a 23 0a 23  umn is used..#.#
43c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
43d0: 31 35 37 39 36 2d 34 37 35 31 33 20 57 68 65 6e  15796-47513 When
43e0: 20 63 6f 6d 70 61 72 69 6e 67 20 74 65 78 74 20   comparing text 
43f0: 76 61 6c 75 65 73 2c 20 74 68 65 20 63 6f 6c 6c  values, the coll
4400: 61 74 69 6e 67 0a 23 20 73 65 71 75 65 6e 63 65  ating.# sequence
4410: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4420: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
4430: 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73  column is always
4440: 20 75 73 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c   used..#.drop_al
4450: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
4460: 20 65 5f 66 6b 65 79 2d 31 36 2e 31 20 7b 0a 20   e_fkey-16.1 {. 
4470: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4480: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
4490: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
44a0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
44b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
44c0: 32 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 74  2(b REFERENCES t
44d0: 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  1);.  }.} {}.do_
44e0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 32  test e_fkey-16.2
44f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4500: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4510: 31 20 56 41 4c 55 45 53 28 27 6f 4e 65 27 29 3b  1 VALUES('oNe');
4520: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4530: 20 74 32 20 56 41 4c 55 45 53 28 27 6f 6e 65 27   t2 VALUES('one'
4540: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4550: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 4f 4e  TO t2 VALUES('ON
4560: 45 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  E');.    UPDATE 
4570: 74 32 20 53 45 54 20 62 20 3d 20 27 4f 6e 45 27  t2 SET b = 'OnE'
4580: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
4590: 53 45 54 20 61 20 3d 20 27 4f 4e 45 27 3b 0a 20  SET a = 'ONE';. 
45a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
45b0: 65 5f 66 6b 65 79 2d 31 36 2e 33 20 7b 0a 20 20  e_fkey-16.3 {.  
45c0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
45d0: 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 77  E t2 SET b = 'tw
45e0: 6f 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  o' WHERE rowid =
45f0: 20 31 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49   1 }.} {1 {FOREI
4600: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
4610: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
4620: 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 34 20 7b  st e_fkey-16.4 {
4630: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
4640: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
4650: 52 45 20 72 6f 77 69 64 20 3d 20 31 20 7d 0a 7d  RE rowid = 1 }.}
4660: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
4670: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
4680: 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ed}}..#---------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .# Specifically,
46e0: 20 74 65 73 74 20 74 68 61 74 20 77 68 65 6e 20   test that when 
46f0: 63 6f 6d 70 61 72 69 6e 67 20 63 68 69 6c 64 20  comparing child 
4700: 61 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 20 76  and parent key v
4710: 61 6c 75 65 73 20 74 68 65 0a 23 20 61 66 66 69  alues the.# affi
4720: 6e 69 74 79 20 6f 66 20 74 68 65 20 70 61 72 65  nity of the pare
4730: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  nt key column is
4740: 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
4750: 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 0a  child key value.
4760: 23 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d  # before the com
4770: 70 61 72 69 73 6f 6e 20 74 61 6b 65 73 20 70 6c  parison takes pl
4780: 61 63 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ace..#.# EVIDENC
4790: 45 2d 4f 46 3a 20 52 2d 30 34 32 34 30 2d 31 33  E-OF: R-04240-13
47a0: 38 36 30 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  860 When compari
47b0: 6e 67 20 76 61 6c 75 65 73 2c 20 69 66 20 74 68  ng values, if th
47c0: 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 63  e parent key.# c
47d0: 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 61 66 66  olumn has an aff
47e0: 69 6e 69 74 79 2c 20 74 68 65 6e 20 74 68 61 74  inity, then that
47f0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 61 70 70   affinity is app
4800: 6c 69 65 64 20 74 6f 20 74 68 65 20 63 68 69 6c  lied to the chil
4810: 64 20 6b 65 79 0a 23 20 76 61 6c 75 65 20 62 65  d key.# value be
4820: 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 61 72 69  fore the compari
4830: 73 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  son is performed
4840: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
4850: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
4860: 65 79 2d 31 37 2e 31 20 7b 0a 20 20 65 78 65 63  ey-17.1 {.  exec
4870: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
4880: 20 54 41 42 4c 45 20 74 31 28 61 20 4e 55 4d 45   TABLE t1(a NUME
4890: 52 49 43 20 50 52 49 4d 41 52 59 20 4b 45 59 29  RIC PRIMARY KEY)
48a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
48b0: 4c 45 20 74 32 28 62 20 54 45 58 54 20 52 45 46  LE t2(b TEXT REF
48c0: 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 7d  ERENCES t1);.  }
48d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
48e0: 66 6b 65 79 2d 31 37 2e 32 20 7b 0a 20 20 65 78  fkey-17.2 {.  ex
48f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
4900: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4910: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
4920: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4930: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
4940: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74  NTO t1 VALUES('t
4950: 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  hree');.    INSE
4960: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4970: 53 28 27 32 2e 30 27 29 3b 0a 20 20 20 20 53 45  S('2.0');.    SE
4980: 4c 45 43 54 20 62 2c 20 74 79 70 65 6f 66 28 62  LECT b, typeof(b
4990: 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  ) FROM t2;.  }.}
49a0: 20 7b 32 2e 30 20 74 65 78 74 7d 0a 64 6f 5f 74   {2.0 text}.do_t
49b0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 33 20  est e_fkey-17.3 
49c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
49d0: 4c 45 43 54 20 74 79 70 65 6f 66 28 61 29 20 46  LECT typeof(a) F
49e0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 69 6e 74 65  ROM t1 }.} {inte
49f0: 67 65 72 20 69 6e 74 65 67 65 72 20 74 65 78 74  ger integer text
4a00: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
4a10: 2d 31 37 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -17.4 {.  catchs
4a20: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
4a30: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20   t1 WHERE rowid 
4a40: 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  = 2 }.} {1 {FORE
4a50: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
4a60: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 23 23  nt failed}}..###
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ab0: 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43  ########.### SEC
4ac0: 54 49 4f 4e 20 33 3a 20 52 65 71 75 69 72 65 64  TION 3: Required
4ad0: 20 61 6e 64 20 53 75 67 67 65 73 74 65 64 20 44   and Suggested D
4ae0: 61 74 61 62 61 73 65 20 49 6e 64 65 78 65 73 0a  atabase Indexes.
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b30: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d  ###########..#--
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 20 70 61 72 65  -------.# A pare
4b90: 6e 74 20 6b 65 79 20 6d 75 73 74 20 62 65 20 65  nt key must be e
4ba0: 69 74 68 65 72 20 61 20 50 52 49 4d 41 52 59 20  ither a PRIMARY 
4bb0: 4b 45 59 2c 20 73 75 62 6a 65 63 74 20 74 6f 20  KEY, subject to 
4bc0: 61 20 55 4e 49 51 55 45 20 0a 23 20 63 6f 6e 73  a UNIQUE .# cons
4bd0: 74 72 61 69 6e 74 2c 20 6f 72 20 68 61 76 65 20  traint, or have 
4be0: 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 63  a UNIQUE index c
4bf0: 72 65 61 74 65 64 20 6f 6e 20 69 74 2e 0a 23 0a  reated on it..#.
4c00: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4c10: 2d 31 33 34 33 35 2d 32 36 33 31 31 20 55 73 75  -13435-26311 Usu
4c20: 61 6c 6c 79 2c 20 74 68 65 20 70 61 72 65 6e 74  ally, the parent
4c30: 20 6b 65 79 20 6f 66 20 61 20 66 6f 72 65 69 67   key of a foreig
4c40: 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69  n key.# constrai
4c50: 6e 74 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  nt is the primar
4c60: 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72  y key of the par
4c70: 65 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ent table. If th
4c80: 65 79 20 61 72 65 20 6e 6f 74 20 74 68 65 0a 23  ey are not the.#
4c90: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
4ca0: 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  en the parent ke
4cb0: 79 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  y columns must b
4cc0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 73  e collectively s
4cd0: 75 62 6a 65 63 74 0a 23 20 74 6f 20 61 20 55 4e  ubject.# to a UN
4ce0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
4cf0: 6f 72 20 68 61 76 65 20 61 20 55 4e 49 51 55 45  or have a UNIQUE
4d00: 20 69 6e 64 65 78 2e 0a 23 20 0a 23 20 41 6c 73   index..# .# Als
4d10: 6f 20 74 65 73 74 20 74 68 61 74 20 69 66 20 61  o test that if a
4d20: 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6e   parent key is n
4d30: 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  ot subject to a 
4d40: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
4d50: 4e 49 51 55 45 0a 23 20 63 6f 6e 73 74 72 61 69  NIQUE.# constrai
4d60: 6e 74 2c 20 62 75 74 20 64 6f 65 73 20 68 61 76  nt, but does hav
4d70: 65 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  e a UNIQUE index
4d80: 20 63 72 65 61 74 65 64 20 6f 6e 20 69 74 2c 20   created on it, 
4d90: 74 68 65 6e 20 74 68 65 20 55 4e 49 51 55 45 20  then the UNIQUE 
4da0: 69 6e 64 65 78 0a 23 20 6d 75 73 74 20 75 73 65  index.# must use
4db0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
4dc0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
4dd0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4de0: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 0a   the parent key.
4df0: 23 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45  # columns..#.# E
4e00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30  VIDENCE-OF: R-00
4e10: 33 37 36 2d 33 39 32 31 32 20 49 66 20 74 68 65  376-39212 If the
4e20: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75   parent key colu
4e30: 6d 6e 73 20 68 61 76 65 20 61 20 55 4e 49 51 55  mns have a UNIQU
4e40: 45 0a 23 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  E.# index, then 
4e50: 74 68 61 74 20 69 6e 64 65 78 20 6d 75 73 74 20  that index must 
4e60: 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  use the collatio
4e70: 6e 20 73 65 71 75 65 6e 63 65 73 20 74 68 61 74  n sequences that
4e80: 20 61 72 65 0a 23 20 73 70 65 63 69 66 69 65 64   are.# specified
4e90: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
4ea0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66  ABLE statement f
4eb0: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  or the parent ta
4ec0: 62 6c 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ble..#.drop_all_
4ed0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
4ee0: 5f 66 6b 65 79 2d 31 38 2e 31 20 7b 0a 20 20 65  _fkey-18.1 {.  e
4ef0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4f00: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 52  ATE TABLE t2(a R
4f10: 45 46 45 52 45 4e 43 45 53 20 74 31 28 78 29 29  EFERENCES t1(x))
4f20: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20  ;.  }.} {}.proc 
4f30: 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 7b 74  test_efkey_57 {t
4f40: 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b  n isError sql} {
4f50: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52  .  catchsql { DR
4f60: 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 20 20  OP TABLE t1 }.  
4f70: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64  execsql $sql.  d
4f80: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 38  o_test e_fkey-18
4f90: 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61 74 63 68  .$tn {.    catch
4fa0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
4fb0: 4f 20 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t2 VALUES(NULL
4fc0: 29 20 7d 0a 20 20 7d 20 5b 6c 69 6e 64 65 78 20  ) }.  } [lindex 
4fd0: 7b 7b 30 20 7b 7d 7d 20 7b 2f 31 20 7b 66 6f 72  {{0 {}} {/1 {for
4fe0: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
4ff0: 68 20 2d 20 22 2e 2a 22 20 72 65 66 65 72 65 6e  h - ".*" referen
5000: 63 69 6e 67 20 22 2e 2a 22 7d 2f 7d 7d 20 5c 0a  cing ".*"}/}} \.
5010: 20 20 20 20 20 24 69 73 45 72 72 6f 72 5d 0a 7d       $isError].}
5020: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 32  .test_efkey_57 2
5030: 20 30 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c   0 { CREATE TABL
5040: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
5050: 45 59 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79  EY) }.test_efkey
5060: 5f 35 37 20 33 20 30 20 7b 20 43 52 45 41 54 45  _57 3 0 { CREATE
5070: 20 54 41 42 4c 45 20 74 31 28 78 20 55 4e 49 51   TABLE t1(x UNIQ
5080: 55 45 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79  UE) }.test_efkey
5090: 5f 35 37 20 34 20 30 20 7b 20 43 52 45 41 54 45  _57 4 0 { CREATE
50a0: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20 43 52   TABLE t1(x); CR
50b0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
50c0: 58 20 74 31 69 20 4f 4e 20 74 31 28 78 29 20 7d  X t1i ON t1(x) }
50d0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 35  .test_efkey_57 5
50e0: 20 31 20 7b 20 0a 20 20 43 52 45 41 54 45 20 54   1 { .  CREATE T
50f0: 41 42 4c 45 20 74 31 28 78 29 3b 20 0a 20 20 43  ABLE t1(x); .  C
5100: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
5110: 45 58 20 74 31 69 20 4f 4e 20 74 31 28 78 20 43  EX t1i ON t1(x C
5120: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
5130: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20  }.test_efkey_57 
5140: 36 20 31 20 7b 20 43 52 45 41 54 45 20 54 41 42  6 1 { CREATE TAB
5150: 4c 45 20 74 31 28 78 29 20 7d 0a 74 65 73 74 5f  LE t1(x) }.test_
5160: 65 66 6b 65 79 5f 35 37 20 37 20 31 20 7b 20 43  efkey_57 7 1 { C
5170: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5180: 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , y, PRIMARY KEY
5190: 28 78 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f 65  (x, y)) }.test_e
51a0: 66 6b 65 79 5f 35 37 20 38 20 31 20 7b 20 43 52  fkey_57 8 1 { CR
51b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
51c0: 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
51d0: 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35  ) }.test_efkey_5
51e0: 37 20 39 20 31 20 7b 20 0a 20 20 43 52 45 41 54  7 9 1 { .  CREAT
51f0: 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29  E TABLE t1(x, y)
5200: 3b 20 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51  ; .  CREATE UNIQ
5210: 55 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20  UE INDEX t1i ON 
5220: 74 31 28 78 2c 20 79 29 3b 0a 7d 0a 0a 0a 23 2d  t1(x, y);.}...#-
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
5280: 62 6c 6f 63 6b 20 74 65 73 74 73 20 61 6e 20 65  block tests an e
5290: 78 61 6d 70 6c 65 20 69 6e 20 66 6f 72 65 69 67  xample in foreig
52a0: 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 53 65 76 65  nkeys.html. Seve
52b0: 72 61 6c 20 74 65 73 74 61 62 6c 65 0a 23 20 73  ral testable.# s
52c0: 74 61 74 65 6d 65 6e 74 73 20 72 65 66 65 72 20  tatements refer 
52d0: 74 6f 20 74 68 69 73 20 65 78 61 6d 70 6c 65 2c  to this example,
52e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 0a 23 0a 23 20   as follows.#.# 
52f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
5300: 37 34 38 34 2d 30 31 34 36 37 0a 23 0a 23 20 46  7484-01467.#.# F
5310: 4b 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  K Constraints on
5320: 20 63 68 69 6c 64 31 2c 20 63 68 69 6c 64 32 20   child1, child2 
5330: 61 6e 64 20 63 68 69 6c 64 33 20 61 72 65 20 4f  and child3 are O
5340: 6b 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77  k..#.# Problem w
5350: 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 34  ith FK on child4
5360: 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  :.#.# EVIDENCE-O
5370: 46 3a 20 52 2d 35 31 30 33 39 2d 34 34 38 34 30  F: R-51039-44840
5380: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
5390: 20 64 65 63 6c 61 72 65 64 20 61 73 20 70 61 72   declared as par
53a0: 74 20 6f 66 20 74 61 62 6c 65 0a 23 20 63 68 69  t of table.# chi
53b0: 6c 64 34 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ld4 is an error 
53c0: 62 65 63 61 75 73 65 20 65 76 65 6e 20 74 68 6f  because even tho
53d0: 75 67 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b  ugh the parent k
53e0: 65 79 20 63 6f 6c 75 6d 6e 20 69 73 0a 23 20 69  ey column is.# i
53f0: 6e 64 65 78 65 64 2c 20 74 68 65 20 69 6e 64 65  ndexed, the inde
5400: 78 20 69 73 20 6e 6f 74 20 55 4e 49 51 55 45 2e  x is not UNIQUE.
5410: 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69 74  .#.# Problem wit
5420: 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 35 3a 0a  h FK on child5:.
5430: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5440: 20 52 2d 30 31 30 36 30 2d 34 38 37 38 38 20 54   R-01060-48788 T
5450: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 66  he foreign key f
5460: 6f 72 20 74 61 62 6c 65 20 63 68 69 6c 64 35 20  or table child5 
5470: 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 20 62 65  is an.# error be
5480: 63 61 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67  cause even thoug
5490: 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  h the parent key
54a0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 20 75 6e   column has a un
54b0: 69 71 75 65 20 69 6e 64 65 78 2c 0a 23 20 74 68  ique index,.# th
54c0: 65 20 69 6e 64 65 78 20 75 73 65 73 20 61 20 64  e index uses a d
54d0: 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
54e0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 23 0a 23  ng sequence..#.#
54f0: 20 50 72 6f 62 6c 65 6d 20 77 69 74 68 20 46 4b   Problem with FK
5500: 20 6f 6e 20 63 68 69 6c 64 36 20 61 6e 64 20 63   on child6 and c
5510: 68 69 6c 64 37 3a 0a 23 0a 23 20 45 56 49 44 45  hild7:.#.# EVIDE
5520: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 30 38 38 2d  NCE-OF: R-63088-
5530: 33 37 34 36 39 20 54 61 62 6c 65 73 20 63 68 69  37469 Tables chi
5540: 6c 64 36 20 61 6e 64 20 63 68 69 6c 64 37 20 61  ld6 and child7 a
5550: 72 65 20 69 6e 63 6f 72 72 65 63 74 0a 23 20 62  re incorrect.# b
5560: 65 63 61 75 73 65 20 77 68 69 6c 65 20 62 6f 74  ecause while bot
5570: 68 20 68 61 76 65 20 55 4e 49 51 55 45 20 69 6e  h have UNIQUE in
5580: 64 69 63 65 73 20 6f 6e 20 74 68 65 69 72 20 70  dices on their p
5590: 61 72 65 6e 74 20 6b 65 79 73 2c 20 74 68 65 20  arent keys, the 
55a0: 6b 65 79 73 0a 23 20 61 72 65 20 6e 6f 74 20 61  keys.# are not a
55b0: 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 74 6f  n exact match to
55c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
55d0: 61 20 73 69 6e 67 6c 65 20 55 4e 49 51 55 45 20  a single UNIQUE 
55e0: 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61 6c  index..#.drop_al
55f0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
5600: 20 65 5f 66 6b 65 79 2d 31 39 2e 31 20 7b 0a 20   e_fkey-19.1 {. 
5610: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
5620: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
5630: 6e 74 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(a PRIMARY KEY
5640: 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 2c 20 64  , b UNIQUE, c, d
5650: 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 43 52 45  , e, f);.    CRE
5660: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
5670: 20 69 31 20 4f 4e 20 70 61 72 65 6e 74 28 63 2c   i1 ON parent(c,
5680: 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   d);.    CREATE 
5690: 49 4e 44 45 58 20 69 32 20 4f 4e 20 70 61 72 65  INDEX i2 ON pare
56a0: 6e 74 28 65 29 3b 0a 20 20 20 20 43 52 45 41 54  nt(e);.    CREAT
56b0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69  E UNIQUE INDEX i
56c0: 33 20 4f 4e 20 70 61 72 65 6e 74 28 66 20 43 4f  3 ON parent(f CO
56d0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 0a  LLATE nocase);..
56e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
56f0: 20 63 68 69 6c 64 31 28 66 2c 20 67 20 52 45 46   child1(f, g REF
5700: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 61  ERENCES parent(a
5710: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
5720: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f 6b 0a            -- Ok.
5730: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5740: 20 63 68 69 6c 64 32 28 68 2c 20 69 20 52 45 46   child2(h, i REF
5750: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 62  ERENCES parent(b
5760: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
5770: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f 6b 0a            -- Ok.
5780: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5790: 20 63 68 69 6c 64 33 28 6a 2c 20 6b 2c 20 46 4f   child3(j, k, FO
57a0: 52 45 49 47 4e 20 4b 45 59 28 6a 2c 20 6b 29 20  REIGN KEY(j, k) 
57b0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
57c0: 74 28 63 2c 20 64 29 29 3b 20 2d 2d 20 4f 6b 0a  t(c, d)); -- Ok.
57d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
57e0: 20 63 68 69 6c 64 34 28 6c 2c 20 6d 20 52 45 46   child4(l, m REF
57f0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 65  ERENCES parent(e
5800: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
5810: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72 72            -- Err
5820: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5830: 45 20 63 68 69 6c 64 35 28 6e 2c 20 6f 20 52 45  E child5(n, o RE
5840: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
5850: 66 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  f));            
5860: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72             -- Er
5870: 72 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  r.    CREATE TAB
5880: 4c 45 20 63 68 69 6c 64 36 28 70 2c 20 71 2c 20  LE child6(p, q, 
5890: 46 4f 52 45 49 47 4e 20 4b 45 59 28 70 2c 71 29  FOREIGN KEY(p,q)
58a0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
58b0: 6e 74 28 62 2c 20 63 29 29 3b 20 20 2d 2d 20 45  nt(b, c));  -- E
58c0: 72 72 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  rr.    CREATE TA
58d0: 42 4c 45 20 63 68 69 6c 64 37 28 72 20 52 45 46  BLE child7(r REF
58e0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 63  ERENCES parent(c
58f0: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
5910: 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  Err.  }.} {}.do_
5920: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 32  test e_fkey-19.2
5930: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
5950: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 2c 20  arent VALUES(1, 
5960: 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 29 3b 0a  2, 3, 4, 5, 6);.
5970: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5980: 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 78  child1 VALUES('x
5990: 78 78 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  xx', 1);.    INS
59a0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
59b0: 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20 32 29  VALUES('xxx', 2)
59c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
59d0: 4f 20 63 68 69 6c 64 33 20 56 41 4c 55 45 53 28  O child3 VALUES(
59e0: 33 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  3, 4);.  }.} {}.
59f0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
5a00: 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.2 {.  catchsql
5a10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
5a20: 68 69 6c 64 34 20 56 41 4c 55 45 53 28 27 78 78  hild4 VALUES('xx
5a30: 78 27 2c 20 35 29 20 7d 0a 7d 20 7b 31 20 7b 66  x', 5) }.} {1 {f
5a40: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
5a50: 74 63 68 20 2d 20 22 63 68 69 6c 64 34 22 20 72  tch - "child4" r
5a60: 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65  eferencing "pare
5a70: 6e 74 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  nt"}}.do_test e_
5a80: 66 6b 65 79 2d 31 39 2e 33 20 7b 0a 20 20 63 61  fkey-19.3 {.  ca
5a90: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
5aa0: 49 4e 54 4f 20 63 68 69 6c 64 35 20 56 41 4c 55  INTO child5 VALU
5ab0: 45 53 28 27 78 78 78 27 2c 20 36 29 20 7d 0a 7d  ES('xxx', 6) }.}
5ac0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
5ad0: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69   mismatch - "chi
5ae0: 6c 64 35 22 20 72 65 66 65 72 65 6e 63 69 6e 67  ld5" referencing
5af0: 20 22 70 61 72 65 6e 74 22 7d 7d 0a 64 6f 5f 74   "parent"}}.do_t
5b00: 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 34 20  est e_fkey-19.4 
5b10: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
5b20: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
5b30: 36 20 56 41 4c 55 45 53 28 32 2c 20 33 29 20 7d  6 VALUES(2, 3) }
5b40: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
5b50: 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63  ey mismatch - "c
5b60: 68 69 6c 64 36 22 20 72 65 66 65 72 65 6e 63 69  hild6" referenci
5b70: 6e 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a 64 6f  ng "parent"}}.do
5b80: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e  _test e_fkey-19.
5b90: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
5ba0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
5bb0: 6c 64 37 20 56 41 4c 55 45 53 28 33 29 20 7d 0a  ld7 VALUES(3) }.
5bc0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
5bd0: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68  y mismatch - "ch
5be0: 69 6c 64 37 22 20 72 65 66 65 72 65 6e 63 69 6e  ild7" referencin
5bf0: 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a 0a 23 2d  g "parent"}}..#-
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
5c50: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 64 61  errors in the da
5c60: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 74 68  tabase schema th
5c70: 61 74 20 61 72 65 20 64 65 74 65 63 74 65 64 20  at are detected 
5c80: 77 68 69 6c 65 20 70 72 65 70 61 72 69 6e 67 0a  while preparing.
5c90: 23 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73  # DML statements
5ca0: 2e 20 54 68 65 20 65 72 72 6f 72 20 74 65 78 74  . The error text
5cb0: 20 66 6f 72 20 74 68 65 73 65 20 6d 65 73 73 61   for these messa
5cc0: 67 65 73 20 61 6c 77 61 79 73 20 6d 61 74 63 68  ges always match
5cd0: 65 73 20 0a 23 20 65 69 74 68 65 72 20 22 66 6f  es .# either "fo
5ce0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
5cf0: 63 68 22 20 6f 72 20 22 6e 6f 20 73 75 63 68 20  ch" or "no such 
5d00: 74 61 62 6c 65 2a 22 20 28 75 73 69 6e 67 20 5b  table*" (using [
5d10: 73 74 72 69 6e 67 20 6d 61 74 63 68 5d 29 2e 0a  string match])..
5d20: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5d30: 20 52 2d 34 35 34 38 38 2d 30 38 35 30 34 20 49   R-45488-08504 I
5d40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
5d50: 63 68 65 6d 61 20 63 6f 6e 74 61 69 6e 73 20 66  chema contains f
5d60: 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 65 72 72  oreign key.# err
5d70: 6f 72 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ors that require
5d80: 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 6d 6f 72 65   looking at more
5d90: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
5da0: 64 65 66 69 6e 69 74 69 6f 6e 20 74 6f 0a 23 20  definition to.# 
5db0: 69 64 65 6e 74 69 66 79 2c 20 74 68 65 6e 20 74  identify, then t
5dc0: 68 6f 73 65 20 65 72 72 6f 72 73 20 61 72 65 20  hose errors are 
5dd0: 6e 6f 74 20 64 65 74 65 63 74 65 64 20 77 68 65  not detected whe
5de0: 6e 20 74 68 65 20 74 61 62 6c 65 73 20 61 72 65  n the tables are
5df0: 0a 23 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20  .# created..#.# 
5e00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
5e10: 38 33 39 31 2d 33 38 34 37 32 20 49 6e 73 74 65  8391-38472 Inste
5e20: 61 64 2c 20 73 75 63 68 20 65 72 72 6f 72 73 20  ad, such errors 
5e30: 70 72 65 76 65 6e 74 20 74 68 65 0a 23 20 61 70  prevent the.# ap
5e40: 70 6c 69 63 61 74 69 6f 6e 20 66 72 6f 6d 20 70  plication from p
5e50: 72 65 70 61 72 69 6e 67 20 53 51 4c 20 73 74 61  reparing SQL sta
5e60: 74 65 6d 65 6e 74 73 20 74 68 61 74 20 6d 6f 64  tements that mod
5e70: 69 66 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ify the content 
5e80: 6f 66 0a 23 20 74 68 65 20 63 68 69 6c 64 20 6f  of.# the child o
5e90: 72 20 70 61 72 65 6e 74 20 74 61 62 6c 65 73 20  r parent tables 
5ea0: 69 6e 20 77 61 79 73 20 74 68 61 74 20 75 73 65  in ways that use
5eb0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
5ec0: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
5ed0: 4f 46 3a 20 52 2d 30 33 31 30 38 2d 36 33 36 35  OF: R-03108-6365
5ee0: 39 20 54 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  9 The English la
5ef0: 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
5f00: 73 61 67 65 20 66 6f 72 0a 23 20 66 6f 72 65 69  sage for.# forei
5f10: 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72 6f 72  gn key DML error
5f20: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 22 66 6f  s is usually "fo
5f30: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
5f40: 63 68 22 20 62 75 74 20 63 61 6e 20 61 6c 73 6f  ch" but can also
5f50: 0a 23 20 62 65 20 22 6e 6f 20 73 75 63 68 20 74  .# be "no such t
5f60: 61 62 6c 65 22 20 69 66 20 74 68 65 20 70 61 72  able" if the par
5f70: 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  ent table does n
5f80: 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  ot exist..#.# EV
5f90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37  IDENCE-OF: R-607
5fa0: 38 31 2d 32 36 35 37 36 20 46 6f 72 65 69 67 6e  81-26576 Foreign
5fb0: 20 6b 65 79 20 44 4d 4c 20 65 72 72 6f 72 73 20   key DML errors 
5fc0: 61 72 65 20 6d 61 79 20 62 65 20 72 65 70 6f 72  are may be repor
5fd0: 74 65 64 0a 23 20 69 66 3a 20 54 68 65 20 70 61  ted.# if: The pa
5fe0: 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73 20  rent table does 
5ff0: 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 54 68  not exist, or Th
6000: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
6010: 75 6d 6e 73 20 6e 61 6d 65 64 0a 23 20 69 6e 20  umns named.# in 
6020: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
6030: 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 20 6e 6f  constraint do no
6040: 74 20 65 78 69 73 74 2c 20 6f 72 20 54 68 65 20  t exist, or The 
6050: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
6060: 6e 73 0a 23 20 6e 61 6d 65 64 20 69 6e 20 74 68  ns.# named in th
6070: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
6080: 6e 73 74 72 61 69 6e 74 20 61 72 65 20 6e 6f 74  nstraint are not
6090: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
60a0: 20 6f 66 20 74 68 65 0a 23 20 70 61 72 65 6e 74   of the.# parent
60b0: 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 6e   table and are n
60c0: 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  ot subject to a 
60d0: 75 6e 69 71 75 65 20 63 6f 6e 73 74 72 61 69 6e  unique constrain
60e0: 74 20 75 73 69 6e 67 0a 23 20 63 6f 6c 6c 61 74  t using.# collat
60f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 73 70 65  ing sequence spe
6100: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 43 52  cified in the CR
6110: 45 41 54 45 20 54 41 42 4c 45 2c 20 6f 72 20 54  EATE TABLE, or T
6120: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 0a 23  he child table.#
6130: 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
6140: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
6150: 68 65 20 70 61 72 65 6e 74 20 77 69 74 68 6f 75  he parent withou
6160: 74 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65  t specifying the
6170: 0a 23 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63  .# primary key c
6180: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 6e  olumns and the n
6190: 75 6d 62 65 72 20 6f 66 20 70 72 69 6d 61 72 79  umber of primary
61a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
61b0: 74 68 65 0a 23 20 70 61 72 65 6e 74 20 64 6f 20  the.# parent do 
61c0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
61d0: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 6b 65  mber of child ke
61e0: 79 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 6f 5f  y columns..#.do_
61f0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 31  test e_fkey-20.1
6200: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6210: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6220: 63 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  c1(c REFERENCES 
6230: 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20 64 29 3b  nosuchtable, d);
6240: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
6250: 4c 45 20 70 32 28 61 2c 20 62 2c 20 55 4e 49 51  LE p2(a, b, UNIQ
6260: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43  UE(a, b));.    C
6270: 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 63  REATE TABLE c2(c
6280: 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
6290: 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
62a0: 53 20 70 32 28 61 2c 20 78 29 29 3b 0a 0a 20 20  S p2(a, x));..  
62b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
62c0: 33 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  3(a PRIMARY KEY,
62d0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
62e0: 54 41 42 4c 45 20 63 33 28 63 20 52 45 46 45 52  TABLE c3(c REFER
62f0: 45 4e 43 45 53 20 70 33 28 62 29 2c 20 64 29 3b  ENCES p3(b), d);
6300: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
6310: 4c 45 20 70 34 28 61 20 50 52 49 4d 41 52 59 20  LE p4(a PRIMARY 
6320: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  KEY, b);.    CRE
6330: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
6340: 20 70 34 69 20 4f 4e 20 70 34 28 62 20 43 4f 4c   p4i ON p4(b COL
6350: 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20  LATE nocase);.  
6360: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
6370: 34 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  4(c REFERENCES p
6380: 34 28 62 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43  4(b), d);..    C
6390: 52 45 41 54 45 20 54 41 42 4c 45 20 70 35 28 61  REATE TABLE p5(a
63a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
63b0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b  COLLATE nocase);
63c0: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
63d0: 55 45 20 49 4e 44 45 58 20 70 35 69 20 4f 4e 20  UE INDEX p5i ON 
63e0: 70 35 28 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  p5(b COLLATE bin
63f0: 61 72 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ary);.    CREATE
6400: 20 54 41 42 4c 45 20 63 35 28 63 20 52 45 46 45   TABLE c5(c REFE
6410: 52 45 4e 43 45 53 20 70 35 28 62 29 2c 20 64 29  RENCES p5(b), d)
6420: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6430: 42 4c 45 20 70 36 28 61 20 50 52 49 4d 41 52 59  BLE p6(a PRIMARY
6440: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
6450: 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 63 2c  EATE TABLE c6(c,
6460: 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   d, FOREIGN KEY(
6470: 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  c, d) REFERENCES
6480: 20 70 36 29 3b 0a 0a 20 20 20 20 43 52 45 41 54   p6);..    CREAT
6490: 45 20 54 41 42 4c 45 20 70 37 28 61 2c 20 62 2c  E TABLE p7(a, b,
64a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
64b0: 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
64c0: 54 41 42 4c 45 20 63 37 28 63 2c 20 64 20 52 45  TABLE c7(c, d RE
64d0: 46 45 52 45 4e 43 45 53 20 70 37 29 3b 0a 20 20  FERENCES p7);.  
64e0: 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20  }.} {}..foreach 
64f0: 7b 74 6e 20 74 62 6c 20 70 74 62 6c 20 65 72 72  {tn tbl ptbl err
6500: 7d 20 7b 0a 20 20 32 20 63 31 20 7b 7d 20 22 6e  } {.  2 c1 {} "n
6510: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61  o such table: ma
6520: 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 22 0a  in.nosuchtable".
6530: 20 20 33 20 63 32 20 70 32 20 22 66 6f 72 65 69    3 c2 p2 "forei
6540: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
6550: 2d 20 5c 22 63 32 5c 22 20 72 65 66 65 72 65 6e  - \"c2\" referen
6560: 63 69 6e 67 20 5c 22 70 32 5c 22 22 0a 20 20 34  cing \"p2\"".  4
6570: 20 63 33 20 70 33 20 22 66 6f 72 65 69 67 6e 20   c3 p3 "foreign 
6580: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c  key mismatch - \
6590: 22 63 33 5c 22 20 72 65 66 65 72 65 6e 63 69 6e  "c3\" referencin
65a0: 67 20 5c 22 70 33 5c 22 22 0a 20 20 35 20 63 34  g \"p3\"".  5 c4
65b0: 20 70 34 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p4 "foreign key
65c0: 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 34   mismatch - \"c4
65d0: 5c 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c  \" referencing \
65e0: 22 70 34 5c 22 22 0a 20 20 36 20 63 35 20 70 35  "p4\"".  6 c5 p5
65f0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
6600: 73 6d 61 74 63 68 20 2d 20 5c 22 63 35 5c 22 20  smatch - \"c5\" 
6610: 72 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 35  referencing \"p5
6620: 5c 22 22 0a 20 20 37 20 63 36 20 70 36 20 22 66  \"".  7 c6 p6 "f
6630: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6640: 74 63 68 20 2d 20 5c 22 63 36 5c 22 20 72 65 66  tch - \"c6\" ref
6650: 65 72 65 6e 63 69 6e 67 20 5c 22 70 36 5c 22 22  erencing \"p6\""
6660: 0a 20 20 38 20 63 37 20 70 37 20 22 66 6f 72 65  .  8 c7 p7 "fore
6670: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
6680: 20 2d 20 5c 22 63 37 5c 22 20 72 65 66 65 72 65   - \"c7\" refere
6690: 6e 63 69 6e 67 20 5c 22 70 37 5c 22 22 0a 7d 20  ncing \"p7\"".} 
66a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
66b0: 65 79 2d 32 30 2e 24 74 6e 2e 31 20 7b 0a 20 20  ey-20.$tn.1 {.  
66c0: 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45    catchsql "INSE
66d0: 52 54 20 49 4e 54 4f 20 24 74 62 6c 20 56 41 4c  RT INTO $tbl VAL
66e0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 22 0a 20  UES('a', 'b')". 
66f0: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d   } [list 1 $err]
6700: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
6710: 79 2d 32 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  y-20.$tn.2 {.   
6720: 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41 54   catchsql "UPDAT
6730: 45 20 24 74 62 6c 20 53 45 54 20 63 20 3d 20 3f  E $tbl SET c = ?
6740: 2c 20 64 20 3d 20 3f 22 0a 20 20 7d 20 5b 6c 69  , d = ?".  } [li
6750: 73 74 20 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f  st 1 $err].  do_
6760: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24  test e_fkey-20.$
6770: 74 6e 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.3 {.    catch
6780: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
6790: 20 24 74 62 6c 20 53 45 4c 45 43 54 20 3f 2c 20   $tbl SELECT ?, 
67a0: 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24  ?".  } [list 1 $
67b0: 65 72 72 5d 0a 0a 20 20 69 66 20 7b 24 70 74 62  err]..  if {$ptb
67c0: 6c 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20 64  l ne ""} {.    d
67d0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30  o_test e_fkey-20
67e0: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 63  .$tn.4 {.      c
67f0: 61 74 63 68 73 71 6c 20 22 44 45 4c 45 54 45 20  atchsql "DELETE 
6800: 46 52 4f 4d 20 24 70 74 62 6c 22 0a 20 20 20 20  FROM $ptbl".    
6810: 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a  } [list 1 $err].
6820: 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b      do_test e_fk
6830: 65 79 2d 32 30 2e 24 74 6e 2e 35 20 7b 0a 20 20  ey-20.$tn.5 {.  
6840: 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 55 50      catchsql "UP
6850: 44 41 54 45 20 24 70 74 62 6c 20 53 45 54 20 61  DATE $ptbl SET a
6860: 20 3d 20 3f 2c 20 62 20 3d 20 3f 22 0a 20 20 20   = ?, b = ?".   
6870: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d   } [list 1 $err]
6880: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  .    do_test e_f
6890: 6b 65 79 2d 32 30 2e 24 74 6e 2e 36 20 7b 0a 20  key-20.$tn.6 {. 
68a0: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 49       catchsql "I
68b0: 4e 53 45 52 54 20 49 4e 54 4f 20 24 70 74 62 6c  NSERT INTO $ptbl
68c0: 20 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20   SELECT ?, ?".  
68d0: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
68e0: 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ].  }.}..#------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
6940: 46 3a 20 52 2d 31 39 33 35 33 2d 34 33 36 34 33  F: R-19353-43643
6950: 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 65 78  .#.# Test the ex
6960: 61 6d 70 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e  ample of foreign
6970: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 65 72   key mismatch er
6980: 72 6f 72 73 20 63 61 75 73 65 64 20 62 79 20 69  rors caused by i
6990: 6d 70 6c 69 63 69 74 6c 79 0a 23 20 6d 61 70 70  mplicitly.# mapp
69a0: 69 6e 67 20 61 20 63 68 69 6c 64 20 6b 65 79 20  ing a child key 
69b0: 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  to the primary k
69c0: 65 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ey of the parent
69d0: 20 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65 0a   table when the.
69e0: 23 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6e 73  # child key cons
69f0: 69 73 74 73 20 6f 66 20 61 20 64 69 66 66 65 72  ists of a differ
6a00: 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  ent number of co
6a10: 6c 75 6d 6e 73 20 74 6f 20 74 68 61 74 20 70 72  lumns to that pr
6a20: 69 6d 61 72 79 20 6b 65 79 2e 0a 23 20 0a 64 72  imary key..# .dr
6a30: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
6a40: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6a50: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
6a60: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6a70: 20 70 61 72 65 6e 74 32 28 61 2c 20 62 2c 20 50   parent2(a, b, P
6a80: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 29 29  RIMARY KEY(a,b))
6a90: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6aa0: 42 4c 45 20 63 68 69 6c 64 38 28 78 2c 20 79 2c  BLE child8(x, y,
6ab0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79   FOREIGN KEY(x,y
6ac0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
6ad0: 65 6e 74 32 29 3b 20 20 20 20 20 2d 2d 20 4f 6b  ent2);     -- Ok
6ae0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6af0: 45 20 63 68 69 6c 64 39 28 78 20 52 45 46 45 52  E child9(x REFER
6b00: 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29 3b 20  ENCES parent2); 
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72 72 0a           -- Err.
6b30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6b40: 20 63 68 69 6c 64 31 30 28 78 2c 79 2c 7a 2c 20   child10(x,y,z, 
6b50: 46 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 2c  FOREIGN KEY(x,y,
6b60: 7a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  z) REFERENCES pa
6b70: 72 65 6e 74 32 29 3b 20 2d 2d 20 45 72 72 0a 20  rent2); -- Err. 
6b80: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
6b90: 65 5f 66 6b 65 79 2d 32 31 2e 32 20 7b 0a 20 20  e_fkey-21.2 {.  
6ba0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
6bb0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
6bc0: 32 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49  2 VALUES('I', 'I
6bd0: 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  I');.    INSERT 
6be0: 49 4e 54 4f 20 63 68 69 6c 64 38 20 56 41 4c 55  INTO child8 VALU
6bf0: 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20  ES('I', 'II');. 
6c00: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
6c10: 65 5f 66 6b 65 79 2d 32 31 2e 33 20 7b 0a 20 20  e_fkey-21.3 {.  
6c20: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
6c30: 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41  T INTO child9 VA
6c40: 4c 55 45 53 28 27 49 27 29 20 7d 0a 7d 20 7b 31  LUES('I') }.} {1
6c50: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6c60: 73 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 39  smatch - "child9
6c70: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
6c80: 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73  arent2"}}.do_tes
6c90: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 34 20 7b 0a  t e_fkey-21.4 {.
6ca0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6cb0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20  ERT INTO child9 
6cc0: 56 41 4c 55 45 53 28 27 49 49 27 29 20 7d 0a 7d  VALUES('II') }.}
6cd0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
6ce0: 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69   mismatch - "chi
6cf0: 6c 64 39 22 20 72 65 66 65 72 65 6e 63 69 6e 67  ld9" referencing
6d00: 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f   "parent2"}}.do_
6d10: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 35  test e_fkey-21.5
6d20: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
6d30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
6d40: 64 39 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 20  d9 VALUES(NULL) 
6d50: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
6d60: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
6d70: 63 68 69 6c 64 39 22 20 72 65 66 65 72 65 6e 63  child9" referenc
6d80: 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a  ing "parent2"}}.
6d90: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
6da0: 31 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.6 {.  catchsql
6db0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
6dc0: 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28 27 49  hild10 VALUES('I
6dd0: 27 2c 20 27 49 49 27 2c 20 27 49 49 49 27 29 20  ', 'II', 'III') 
6de0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
6df0: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
6e00: 63 68 69 6c 64 31 30 22 20 72 65 66 65 72 65 6e  child10" referen
6e10: 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d  cing "parent2"}}
6e20: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
6e30: 32 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71  21.7 {.  catchsq
6e40: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
6e50: 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28 31  child10 VALUES(1
6e60: 2c 20 32 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b  , 2, 3) }.} {1 {
6e70: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6e80: 61 74 63 68 20 2d 20 22 63 68 69 6c 64 31 30 22  atch - "child10"
6e90: 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61   referencing "pa
6ea0: 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74  rent2"}}.do_test
6eb0: 20 65 5f 66 6b 65 79 2d 32 31 2e 38 20 7b 0a 20   e_fkey-21.8 {. 
6ec0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
6ed0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20  RT INTO child10 
6ee0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c  VALUES(NULL, NUL
6ef0: 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20  L, NULL) }.} {1 
6f00: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6f10: 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 31 30  match - "child10
6f20: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
6f30: 61 72 65 6e 74 32 22 7d 7d 0a 0a 23 2d 2d 2d 2d  arent2"}}..#----
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 65 72 72  -----.# Test err
6f90: 6f 72 73 20 74 68 61 74 20 61 72 65 20 72 65 70  ors that are rep
6fa0: 6f 72 74 65 64 20 77 68 65 6e 20 63 72 65 61 74  orted when creat
6fb0: 69 6e 67 20 74 68 65 20 63 68 69 6c 64 20 74 61  ing the child ta
6fc0: 62 6c 65 2e 20 0a 23 20 53 70 65 63 69 66 69 63  ble. .# Specific
6fd0: 61 6c 6c 79 3a 0a 23 0a 23 20 20 20 2a 20 64 69  ally:.#.#   * di
6fe0: 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  fferent number o
6ff0: 66 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65  f child and pare
7000: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20  nt key columns, 
7010: 61 6e 64 0a 23 20 20 20 2a 20 63 68 69 6c 64 20  and.#   * child 
7020: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 64 6f 20  columns that do 
7030: 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20 45  not exist..#.# E
7040: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
7050: 36 38 32 2d 35 39 38 32 30 20 42 79 20 63 6f 6e  682-59820 By con
7060: 74 72 61 73 74 2c 20 69 66 20 66 6f 72 65 69 67  trast, if foreig
7070: 6e 20 6b 65 79 20 65 72 72 6f 72 73 20 63 61 6e  n key errors can
7080: 20 62 65 0a 23 20 72 65 63 6f 67 6e 69 7a 65 64   be.# recognized
7090: 20 73 69 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b 69   simply by looki
70a0: 6e 67 20 61 74 20 74 68 65 20 64 65 66 69 6e 69  ng at the defini
70b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 69 6c  tion of the chil
70c0: 64 20 74 61 62 6c 65 20 61 6e 64 0a 23 20 77 69  d table and.# wi
70d0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
70e0: 63 6f 6e 73 75 6c 74 20 74 68 65 20 70 61 72 65  consult the pare
70f0: 6e 74 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74  nt table definit
7100: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 43 52  ion, then the CR
7110: 45 41 54 45 0a 23 20 54 41 42 4c 45 20 73 74 61  EATE.# TABLE sta
7120: 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 63  tement for the c
7130: 68 69 6c 64 20 74 61 62 6c 65 20 66 61 69 6c 73  hild table fails
7140: 2e 0a 23 0a 23 20 54 68 65 73 65 20 65 72 72 6f  ..#.# These erro
7150: 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  rs are reported 
7160: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 46  whether or not F
7170: 4b 20 73 75 70 70 6f 72 74 20 69 73 20 65 6e 61  K support is ena
7180: 62 6c 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  bled..#.# EVIDEN
7190: 43 45 2d 4f 46 3a 20 52 2d 33 33 38 38 33 2d 32  CE-OF: R-33883-2
71a0: 38 38 33 33 20 46 6f 72 65 69 67 6e 20 6b 65 79  8833 Foreign key
71b0: 20 44 44 4c 20 65 72 72 6f 72 73 20 61 72 65 20   DDL errors are 
71c0: 72 65 70 6f 72 74 65 64 0a 23 20 72 65 67 61 72  reported.# regar
71d0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
71e0: 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e 20   or not foreign 
71f0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
7200: 61 72 65 20 65 6e 61 62 6c 65 64 20 77 68 65 6e  are enabled when
7210: 0a 23 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  .# the table is 
7220: 63 72 65 61 74 65 64 2e 0a 23 0a 64 72 6f 70 5f  created..#.drop_
7230: 61 6c 6c 5f 74 61 62 6c 65 73 0a 66 6f 72 65 61  all_tables.forea
7240: 63 68 20 66 6b 20 5b 6c 69 73 74 20 4f 46 46 20  ch fk [list OFF 
7250: 4f 4e 5d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ON] {.  execsql 
7260: 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
7270: 6b 65 79 73 20 3d 20 24 66 6b 22 0a 20 20 73 65  keys = $fk".  se
7280: 74 20 69 20 30 0a 20 20 66 6f 72 65 61 63 68 20  t i 0.  foreach 
7290: 7b 73 71 6c 20 65 72 72 6f 72 7d 20 7b 0a 20 20  {sql error} {.  
72a0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
72b0: 63 68 69 6c 64 31 28 61 2c 20 62 2c 20 46 4f 52  child1(a, b, FOR
72c0: 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52  EIGN KEY(a, b) R
72d0: 45 46 45 52 45 4e 43 45 53 20 70 28 63 29 29 22  EFERENCES p(c))"
72e0: 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f  .      {number o
72f0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
7300: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
7310: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
7320: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
7330: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
7340: 74 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45 41  table}.    "CREA
7350: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
7360: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7370: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
7380: 45 53 20 70 28 63 2c 20 64 2c 20 65 29 29 22 0a  ES p(c, d, e))".
7390: 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66        {number of
73a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
73b0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
73c0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
73d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
73e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
73f0: 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45 41 54  able}.    "CREAT
7400: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61  E TABLE child2(a
7410: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
7420: 28 61 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45  (a, c) REFERENCE
7430: 53 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20 20  S p(c, d))".    
7440: 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    {unknown colum
7450: 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67 6e  n "c" in foreign
7460: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d   key definition}
7470: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
7480: 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62 2c 20  LE child2(a, b, 
7490: 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 62  FOREIGN KEY(c, b
74a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 63  ) REFERENCES p(c
74b0: 2c 20 64 29 29 22 0a 20 20 20 20 20 20 7b 75 6e  , d))".      {un
74c0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22  known column "c"
74d0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
74e0: 64 65 66 69 6e 69 74 69 6f 6e 7d 0a 20 20 7d 20  definition}.  } 
74f0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f  {.    do_test e_
7500: 66 6b 65 79 2d 32 32 2e 24 66 6b 2e 5b 69 6e 63  fkey-22.$fk.[inc
7510: 72 20 69 5d 20 7b 0a 20 20 20 20 20 20 63 61 74  r i] {.      cat
7520: 63 68 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 7d  chsql $sql.    }
7530: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6f 72 5d   [list 1 $error]
7540: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7590: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
75a0: 20 52 45 46 45 52 45 4e 43 49 4e 47 20 63 6c 61   REFERENCING cla
75b0: 75 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  use that does no
75c0: 74 20 73 70 65 63 69 66 79 20 70 61 72 65 6e 74  t specify parent
75d0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23 20 69   key columns.# i
75e0: 6d 70 6c 69 63 69 74 6c 79 20 6d 61 70 73 20 74  mplicitly maps t
75f0: 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  o the primary ke
7600: 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  y of the parent 
7610: 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45  table..#.# EVIDE
7620: 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 38 37 39 2d  NCE-OF: R-43879-
7630: 30 38 30 32 35 20 41 74 74 61 63 68 69 6e 67 20  08025 Attaching 
7640: 61 20 22 52 45 46 45 52 45 4e 43 45 53 20 3c 70  a "REFERENCES <p
7650: 61 72 65 6e 74 2d 74 61 62 6c 65 3e 22 0a 23 20  arent-table>".# 
7660: 63 6c 61 75 73 65 20 74 6f 20 61 20 63 6f 6c 75  clause to a colu
7670: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 63 72  mn definition cr
7680: 65 61 74 65 73 20 61 20 66 6f 72 65 69 67 6e 0a  eates a foreign.
7690: 23 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  # key constraint
76a0: 20 74 68 61 74 20 6d 61 70 73 20 74 68 65 20 63   that maps the c
76b0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 70 72 69  olumn to the pri
76c0: 6d 61 72 79 20 6b 65 79 20 6f 66 0a 23 20 3c 70  mary key of.# <p
76d0: 61 72 65 6e 74 2d 74 61 62 6c 65 3e 2e 0a 23 20  arent-table>..# 
76e0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
76f0: 32 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  23.1 {.  execsql
7700: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
7710: 42 4c 45 20 70 31 28 61 2c 20 62 2c 20 50 52 49  BLE p1(a, b, PRI
7720: 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b  MARY KEY(a, b));
7730: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7740: 45 20 70 32 28 61 2c 20 62 20 50 52 49 4d 41 52  E p2(a, b PRIMAR
7750: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
7760: 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64  TE TABLE c1(c, d
7770: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
7780: 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
7790: 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  1);.    CREATE T
77a0: 41 42 4c 45 20 63 32 28 61 2c 20 62 20 52 45 46  ABLE c2(a, b REF
77b0: 45 52 45 4e 43 45 53 20 70 32 29 3b 0a 20 20 7d  ERENCES p2);.  }
77c0: 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65 73 74 5f  .} {}.proc test_
77d0: 65 66 6b 65 79 5f 36 30 20 7b 74 6e 20 69 73 45  efkey_60 {tn isE
77e0: 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f  rror sql} {.  do
77f0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 33 2e  _test e_fkey-23.
7800: 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73  $tn ".    catchs
7810: 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c  ql {$sql}.  " [l
7820: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
7830: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
7840: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
7850: 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 0a  }} $isError].}..
7860: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 32 20  test_efkey_60 2 
7870: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  1 "INSERT INTO c
7880: 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  1 VALUES(239, 23
7890: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  1)".test_efkey_6
78a0: 30 20 33 20 30 20 22 49 4e 53 45 52 54 20 49 4e  0 3 0 "INSERT IN
78b0: 54 4f 20 70 31 20 56 41 4c 55 45 53 28 32 33 39  TO p1 VALUES(239
78c0: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
78d0: 65 79 5f 36 30 20 34 20 30 20 22 49 4e 53 45 52  ey_60 4 0 "INSER
78e0: 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
78f0: 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74  (239, 231)".test
7900: 5f 65 66 6b 65 79 5f 36 30 20 35 20 31 20 22 49  _efkey_60 5 1 "I
7910: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
7920: 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a  LUES(239, 231)".
7930: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 36 20  test_efkey_60 6 
7940: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  0 "INSERT INTO p
7950: 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  2 VALUES(239, 23
7960: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  1)".test_efkey_6
7970: 30 20 37 20 30 20 22 49 4e 53 45 52 54 20 49 4e  0 7 0 "INSERT IN
7980: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 33 39  TO c2 VALUES(239
7990: 2c 20 32 33 31 29 22 0a 0a 23 2d 2d 2d 2d 2d 2d  , 231)"..#------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
79f0: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 6f 6e 20 74  an index on on t
7a00: 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c  he child key col
7a10: 75 6d 6e 73 20 6f 66 20 61 6e 20 46 4b 20 63 6f  umns of an FK co
7a20: 6e 73 74 72 61 69 6e 74 0a 23 20 69 73 20 6f 70  nstraint.# is op
7a30: 74 69 6f 6e 61 6c 2e 0a 23 0a 23 20 45 56 49 44  tional..#.# EVID
7a40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 31 37  ENCE-OF: R-15417
7a50: 2d 32 38 30 31 34 20 49 6e 64 69 63 65 73 20 61  -28014 Indices a
7a60: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  re not required 
7a70: 66 6f 72 20 63 68 69 6c 64 20 6b 65 79 0a 23 20  for child key.# 
7a80: 63 6f 6c 75 6d 6e 73 0a 23 0a 23 20 41 6c 73 6f  columns.#.# Also
7a90: 20 74 65 73 74 20 74 68 61 74 20 69 66 20 61 6e   test that if an
7aa0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
7ab0: 64 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 6b  d on the child k
7ac0: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20 64  ey columns, it d
7ad0: 6f 65 73 0a 23 20 6e 6f 74 20 6d 61 6b 65 20 61  oes.# not make a
7ae0: 20 64 69 66 66 65 72 65 6e 63 65 20 77 68 65 74   difference whet
7af0: 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73  her or not it is
7b00: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e   a UNIQUE index.
7b10: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
7b20: 3a 20 52 2d 31 35 37 34 31 2d 35 30 38 39 33 20  : R-15741-50893 
7b30: 54 68 65 20 63 68 69 6c 64 20 6b 65 79 20 69 6e  The child key in
7b40: 64 65 78 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  dex does not hav
7b50: 65 20 74 6f 20 62 65 0a 23 20 28 61 6e 64 20 75  e to be.# (and u
7b60: 73 75 61 6c 6c 79 20 77 69 6c 6c 20 6e 6f 74 20  sually will not 
7b70: 62 65 29 20 61 20 55 4e 49 51 55 45 20 69 6e 64  be) a UNIQUE ind
7b80: 65 78 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ex..#.drop_all_t
7b90: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
7ba0: 66 6b 65 79 2d 32 34 2e 31 20 7b 0a 20 20 65 78  fkey-24.1 {.  ex
7bb0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
7bc0: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
7bd0: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c 20  x, y, UNIQUE(y, 
7be0: 78 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  x));.    CREATE 
7bf0: 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20 46  TABLE c1(a, b, F
7c00: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
7c10: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
7c20: 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43  nt(x, y));.    C
7c30: 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 61  REATE TABLE c2(a
7c40: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
7c50: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
7c60: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b  S parent(x, y));
7c70: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7c80: 45 20 63 33 28 61 2c 20 62 2c 20 46 4f 52 45 49  E c3(a, b, FOREI
7c90: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
7ca0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
7cb0: 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , y));.    CREAT
7cc0: 45 20 49 4e 44 45 58 20 63 32 69 20 4f 4e 20 63  E INDEX c2i ON c
7cd0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
7ce0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
7cf0: 20 63 33 69 20 4f 4e 20 63 32 28 62 2c 20 61 29   c3i ON c2(b, a)
7d00: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20  ;.  }.} {}.proc 
7d10: 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 7b 74  test_efkey_61 {t
7d20: 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b  n isError sql} {
7d30: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
7d40: 79 2d 32 34 2e 24 74 6e 20 22 0a 20 20 20 20 63  y-24.$tn ".    c
7d50: 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20  atchsql {$sql}. 
7d60: 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b   " [lindex {{0 {
7d70: 7d 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  }} {1 {FOREIGN K
7d80: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
7d90: 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72  iled}}} $isError
7da0: 5d 0a 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ].}.foreach {tn 
7db0: 63 7d 20 5b 6c 69 73 74 20 32 20 63 31 20 33 20  c} [list 2 c1 3 
7dc0: 63 32 20 34 20 63 33 5d 20 7b 0a 20 20 74 65 73  c2 4 c3] {.  tes
7dd0: 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e 31  t_efkey_61 $tn.1
7de0: 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   1 "INSERT INTO 
7df0: 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  $c VALUES(1, 2)"
7e00: 0a 20 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31  .  test_efkey_61
7e10: 20 24 74 6e 2e 32 20 30 20 22 49 4e 53 45 52 54   $tn.2 0 "INSERT
7e20: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
7e30: 55 45 53 28 31 2c 20 32 29 22 0a 20 20 74 65 73  UES(1, 2)".  tes
7e40: 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e 33  t_efkey_61 $tn.3
7e50: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
7e60: 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  $c VALUES(1, 2)"
7e70: 0a 0a 20 20 65 78 65 63 73 71 6c 20 22 44 45 4c  ..  execsql "DEL
7e80: 45 54 45 20 46 52 4f 4d 20 24 63 20 3b 20 44 45  ETE FROM $c ; DE
7e90: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
7ea0: 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ".}..#----------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7ef0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7f00: 2d 30 30 32 37 39 2d 35 32 32 38 33 0a 23 0a 23  -00279-52283.#.#
7f10: 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65   Test an example
7f20: 20 73 68 6f 77 69 6e 67 20 74 68 61 74 20 77 68   showing that wh
7f30: 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65  en a row is dele
7f40: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ted from the par
7f50: 65 6e 74 20 0a 23 20 74 61 62 6c 65 2c 20 74 68  ent .# table, th
7f60: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69 73  e child table is
7f70: 20 71 75 65 72 69 65 64 20 66 6f 72 20 6f 72 70   queried for orp
7f80: 68 61 6e 65 64 20 72 6f 77 73 20 61 73 20 66 6f  haned rows as fo
7f90: 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 53 45 4c  llows:.#.#   SEL
7fa0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
7fb0: 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b  rack WHERE track
7fc0: 61 72 74 69 73 74 20 3d 20 3f 0a 23 0a 23 20 45  artist = ?.#.# E
7fd0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
7fe0: 33 30 32 2d 33 30 39 35 36 20 49 66 20 74 68 69  302-30956 If thi
7ff0: 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  s SELECT returns
8000: 20 61 6e 79 20 72 6f 77 73 20 61 74 20 61 6c 6c   any rows at all
8010: 2c 0a 23 20 74 68 65 6e 20 53 51 4c 69 74 65 20  ,.# then SQLite 
8020: 63 6f 6e 63 6c 75 64 65 73 20 74 68 61 74 20 64  concludes that d
8030: 65 6c 65 74 69 6e 67 20 74 68 65 20 72 6f 77 20  eleting the row 
8040: 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
8050: 74 61 62 6c 65 0a 23 20 77 6f 75 6c 64 20 76 69  table.# would vi
8060: 6f 6c 61 74 65 20 74 68 65 20 66 6f 72 65 69 67  olate the foreig
8070: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
8080: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
8090: 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74  error..#.do_test
80a0: 20 65 5f 66 6b 65 79 2d 32 35 2e 31 20 7b 0a 20   e_fkey-25.1 {. 
80b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
80c0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74 69  REATE TABLE arti
80d0: 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73 74  st(.      artist
80e0: 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50 52  id    INTEGER PR
80f0: 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20  IMARY KEY, .    
8100: 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45    artistname  TE
8110: 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  XT.    );.    CR
8120: 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b  EATE TABLE track
8130: 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64 20  (.      trackid 
8140: 20 20 20 20 49 4e 54 45 47 45 52 2c 20 0a 20 20      INTEGER, .  
8150: 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20      trackname   
8160: 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61  TEXT, .      tra
8170: 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52  ckartist INTEGER
8180: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
8190: 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74 29  KEY(trackartist)
81a0: 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74 69   REFERENCES arti
81b0: 73 74 28 61 72 74 69 73 74 69 64 29 0a 20 20 20  st(artistid).   
81c0: 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   );.  }.} {}.do_
81d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66  execsql_test e_f
81e0: 6b 65 79 2d 32 35 2e 32 20 7b 0a 20 20 50 52 41  key-25.2 {.  PRA
81f0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
8200: 20 3d 20 4f 46 46 3b 0a 20 20 45 58 50 4c 41 49   = OFF;.  EXPLAI
8210: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c  N QUERY PLAN DEL
8220: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
8230: 57 48 45 52 45 20 31 3b 0a 20 20 45 58 50 4c 41  WHERE 1;.  EXPLA
8240: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
8250: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
8260: 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63  track WHERE trac
8270: 6b 61 72 74 69 73 74 20 3d 20 3f 3b 0a 7d 20 7b  kartist = ?;.} {
8280: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
8290: 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20 20  ABLE artist} .  
82a0: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
82b0: 45 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f 65 78  E track}.}.do_ex
82c0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65  ecsql_test e_fke
82d0: 79 2d 32 35 2e 33 20 7b 0a 20 20 50 52 41 47 4d  y-25.3 {.  PRAGM
82e0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
82f0: 20 4f 4e 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51   ON;.  EXPLAIN Q
8300: 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45  UERY PLAN DELETE
8310: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
8320: 52 45 20 31 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  RE 1;.} {.  0 0 
8330: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61 72  0 {SCAN TABLE ar
8340: 74 69 73 74 7d 20 0a 20 20 30 20 30 20 30 20 7b  tist} .  0 0 0 {
8350: 53 43 41 4e 20 54 41 42 4c 45 20 74 72 61 63 6b  SCAN TABLE track
8360: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.}.do_test e_fk
8370: 65 79 2d 32 35 2e 34 20 7b 0a 20 20 65 78 65 63  ey-25.4 {.  exec
8380: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
8390: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
83a0: 55 45 53 28 35 2c 20 27 61 72 74 69 73 74 20 35  UES(5, 'artist 5
83b0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
83c0: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
83d0: 53 28 36 2c 20 27 61 72 74 69 73 74 20 36 27 29  S(6, 'artist 6')
83e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
83f0: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
8400: 37 2c 20 27 61 72 74 69 73 74 20 37 27 29 3b 0a  7, 'artist 7');.
8410: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8420: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20  track VALUES(1, 
8430: 27 74 72 61 63 6b 20 31 27 2c 20 35 29 3b 0a 20  'track 1', 5);. 
8440: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8450: 72 61 63 6b 20 56 41 4c 55 45 53 28 32 2c 20 27  rack VALUES(2, '
8460: 74 72 61 63 6b 20 32 27 2c 20 36 29 3b 0a 20 20  track 2', 6);.  
8470: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
8480: 65 5f 66 6b 65 79 2d 32 35 2e 35 20 7b 0a 20 20  e_fkey-25.5 {.  
8490: 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78  concat \.    [ex
84a0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72  ecsql { SELECT r
84b0: 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20  owid FROM track 
84c0: 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73  WHERE trackartis
84d0: 74 20 3d 20 35 20 7d 5d 20 20 20 5c 0a 20 20 20  t = 5 }]   \.   
84e0: 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c   [catchsql { DEL
84f0: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
8500: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
8510: 20 35 20 7d 5d 0a 7d 20 7b 31 20 31 20 7b 46 4f   5 }].} {1 1 {FO
8520: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
8530: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64  aint failed}}..d
8540: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35  o_test e_fkey-25
8550: 2e 36 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a  .6 {.  concat \.
8560: 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 20 53      [execsql { S
8570: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8580: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
8590: 63 6b 61 72 74 69 73 74 20 3d 20 37 20 7d 5d 20  ckartist = 7 }] 
85a0: 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68 73 71    \.    [catchsq
85b0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
85c0: 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74  artist WHERE art
85d0: 69 73 74 69 64 20 3d 20 37 20 7d 5d 0a 7d 20 7b  istid = 7 }].} {
85e0: 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  0 {}}..do_test e
85f0: 5f 66 6b 65 79 2d 32 35 2e 37 20 7b 0a 20 20 63  _fkey-25.7 {.  c
8600: 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78 65  oncat \.    [exe
8610: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f  csql { SELECT ro
8620: 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20 57  wid FROM track W
8630: 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73 74  HERE trackartist
8640: 20 3d 20 36 20 7d 5d 20 20 20 5c 0a 20 20 20 20   = 6 }]   \.    
8650: 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45  [catchsql { DELE
8660: 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
8670: 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20  HERE artistid = 
8680: 36 20 7d 5d 0a 7d 20 7b 32 20 31 20 7b 46 4f 52  6 }].} {2 1 {FOR
8690: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
86a0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d  int failed}}..#-
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
8700: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39 33 36 2d  NCE-OF: R-47936-
8710: 31 30 30 34 34 20 4f 72 2c 20 6d 6f 72 65 20 67  10044 Or, more g
8720: 65 6e 65 72 61 6c 6c 79 3a 0a 23 20 53 45 4c 45  enerally:.# SELE
8730: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63  CT rowid FROM <c
8740: 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52  hild-table> WHER
8750: 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20  E <child-key> = 
8760: 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75  :parent_key_valu
8770: 65 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20  e.#.# Test that 
8780: 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65  when a row is de
8790: 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70  leted from the p
87a0: 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 61  arent table of a
87b0: 6e 20 46 4b 20 0a 23 20 63 6f 6e 73 74 72 61 69  n FK .# constrai
87c0: 6e 74 2c 20 74 68 65 20 63 68 69 6c 64 20 74 61  nt, the child ta
87d0: 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66  ble is queried f
87e0: 6f 72 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 73  or orphaned rows
87f0: 2e 20 54 68 65 0a 23 20 71 75 65 72 79 20 69 73  . The.# query is
8800: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
8810: 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77  #.#   SELECT row
8820: 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74  id FROM <child-t
8830: 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69  able> WHERE <chi
8840: 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e  ld-key> = :paren
8850: 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20  t_key_value.#.# 
8860: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 77  Also test that w
8870: 68 65 6e 20 61 20 72 6f 77 20 69 73 20 69 6e 73  hen a row is ins
8880: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70  erted into the p
8890: 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 6f 72 20  arent table, or 
88a0: 77 68 65 6e 20 74 68 65 20 0a 23 20 70 61 72 65  when the .# pare
88b0: 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f 66  nt key values of
88c0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72 6f 77   an existing row
88d0: 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 61   are modified, a
88e0: 20 71 75 65 72 79 20 65 71 75 69 76 61 6c 65 6e   query equivalen
88f0: 74 0a 23 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  t.# to the follo
8900: 77 69 6e 67 20 69 73 20 70 6c 61 6e 6e 65 64 2e  wing is planned.
8910: 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 69   In some cases i
8920: 74 20 69 73 20 6e 6f 74 20 65 78 65 63 75 74 65  t is not execute
8930: 64 2c 20 62 75 74 20 69 74 0a 23 20 69 73 20 61  d, but it.# is a
8940: 6c 77 61 79 73 20 70 6c 61 6e 6e 65 64 2e 0a 23  lways planned..#
8950: 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69  .#   SELECT rowi
8960: 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74 61  d FROM <child-ta
8970: 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69 6c  ble> WHERE <chil
8980: 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e 74  d-key> = :parent
8990: 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20 45  _key_value.#.# E
89a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
89b0: 36 31 36 2d 34 36 37 30 30 20 53 69 6d 69 6c 61  616-46700 Simila
89c0: 72 20 71 75 65 72 69 65 73 20 6d 61 79 20 62 65  r queries may be
89d0: 20 72 75 6e 20 69 66 20 74 68 65 20 63 6f 6e 74   run if the cont
89e0: 65 6e 74 0a 23 20 6f 66 20 74 68 65 20 70 61 72  ent.# of the par
89f0: 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f 64 69 66  ent key is modif
8a00: 69 65 64 20 6f 72 20 61 20 6e 65 77 20 72 6f 77  ied or a new row
8a10: 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
8a20: 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 23 20 74  o the parent.# t
8a30: 61 62 6c 65 2e 0a 23 0a 23 0a 64 72 6f 70 5f 61  able..#.#.drop_a
8a40: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
8a50: 74 20 65 5f 66 6b 65 79 2d 32 36 2e 31 20 7b 0a  t e_fkey-26.1 {.
8a60: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
8a70: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
8a80: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c 20  x, y, UNIQUE(y, 
8a90: 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61  x)) }.} {}.forea
8aa0: 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20  ch {tn sql} {.  
8ab0: 32 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  2 { .    CREATE 
8ac0: 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62  TABLE child(a, b
8ad0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
8ae0: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
8af0: 61 72 65 6e 74 28 78 2c 20 79 29 29 0a 20 20 7d  arent(x, y)).  }
8b00: 0a 20 20 33 20 7b 20 0a 20 20 20 20 43 52 45 41  .  3 { .    CREA
8b10: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61  TE TABLE child(a
8b20: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
8b30: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
8b40: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b  S parent(x, y));
8b50: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
8b60: 58 20 63 68 69 6c 64 69 20 4f 4e 20 63 68 69 6c  X childi ON chil
8b70: 64 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 34  d(a, b);.  }.  4
8b80: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
8b90: 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c  ABLE child(a, b,
8ba0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
8bb0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  b) REFERENCES pa
8bc0: 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20  rent(x, y));.   
8bd0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
8be0: 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20 63  NDEX childi ON c
8bf0: 68 69 6c 64 28 62 2c 20 61 29 3b 0a 20 20 7d 0a  hild(b, a);.  }.
8c00: 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73  } {.  execsql $s
8c10: 71 6c 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  ql..  execsql {P
8c20: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
8c30: 79 73 20 3d 20 4f 46 46 7d 0a 20 20 73 65 74 20  ys = OFF}.  set 
8c40: 64 65 6c 65 74 65 20 5b 63 6f 6e 63 61 74 20 5c  delete [concat \
8c50: 0a 20 20 20 20 20 20 5b 65 71 70 20 22 44 45 4c  .      [eqp "DEL
8c60: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
8c70: 57 48 45 52 45 20 31 22 5d 20 5c 0a 20 20 20 20  WHERE 1"] \.    
8c80: 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20 72    [eqp "SELECT r
8c90: 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64 20  owid FROM child 
8ca0: 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
8cb0: 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 73 65  b = ?"].  ].  se
8cc0: 74 20 75 70 64 61 74 65 20 5b 63 6f 6e 63 61 74  t update [concat
8cd0: 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 55   \.      [eqp "U
8ce0: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
8cf0: 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20 5c 0a 20 20   x=?, y=?"] \.  
8d00: 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54      [eqp "SELECT
8d10: 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c   rowid FROM chil
8d20: 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  d WHERE a = ? AN
8d30: 44 20 62 20 3d 20 3f 22 5d 20 5c 0a 20 20 20 20  D b = ?"] \.    
8d40: 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20 72    [eqp "SELECT r
8d50: 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64 20  owid FROM child 
8d60: 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
8d70: 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 65 78  b = ?"].  ].  ex
8d80: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f  ecsql {PRAGMA fo
8d90: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 7d  reign_keys = ON}
8da0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..  do_test e_fk
8db0: 65 79 2d 32 36 2e 24 74 6e 2e 31 20 7b 20 65 71  ey-26.$tn.1 { eq
8dc0: 70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  p "DELETE FROM p
8dd0: 61 72 65 6e 74 20 57 48 45 52 45 20 31 22 20 7d  arent WHERE 1" }
8de0: 20 24 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65   $delete.  do_te
8df0: 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24 74 6e  st e_fkey-26.$tn
8e00: 2e 32 20 7b 20 65 71 70 20 22 55 50 44 41 54 45  .2 { eqp "UPDATE
8e10: 20 70 61 72 65 6e 74 20 73 65 74 20 78 3d 3f 2c   parent set x=?,
8e20: 20 79 3d 3f 22 20 7d 20 24 75 70 64 61 74 65 0a   y=?" } $update.
8e30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52 4f 50  .  execsql {DROP
8e40: 20 54 41 42 4c 45 20 63 68 69 6c 64 7d 0a 7d 0a   TABLE child}.}.
8e50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
8ea0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 35  IDENCE-OF: R-145
8eb0: 35 33 2d 33 34 30 31 33 0a 23 0a 23 20 54 65 73  53-34013.#.# Tes
8ec0: 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73 63  t the example sc
8ed0: 68 65 6d 61 20 61 74 20 74 68 65 20 65 6e 64 20  hema at the end 
8ee0: 6f 66 20 73 65 63 74 69 6f 6e 20 33 2e 20 41 6c  of section 3. Al
8ef0: 73 6f 20 74 65 73 74 20 74 68 61 74 20 69 73 0a  so test that is.
8f00: 23 20 69 73 20 22 65 66 66 69 63 69 65 6e 74 22  # is "efficient"
8f10: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 22  . In this case "
8f20: 65 66 66 69 63 69 65 6e 74 22 20 6d 65 61 6e 73  efficient" means
8f30: 20 74 68 61 74 20 66 6f 72 65 69 67 6e 20 6b 65   that foreign ke
8f40: 79 0a 23 20 72 65 6c 61 74 65 64 20 6f 70 65 72  y.# related oper
8f50: 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 61  ations on the pa
8f60: 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 20 6e 6f  rent table do no
8f70: 74 20 70 72 6f 76 6f 6b 65 20 6c 69 6e 65 61 72  t provoke linear
8f80: 20 73 63 61 6e 73 2e 0a 23 0a 64 72 6f 70 5f 61   scans..#.drop_a
8f90: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
8fa0: 74 20 65 5f 66 6b 65 79 2d 32 37 2e 31 20 7b 0a  t e_fkey-27.1 {.
8fb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
8fd0: 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
8fe0: 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
8ff0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
9000: 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
9010: 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
9020: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
9030: 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
9040: 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20       INTEGER,.  
9050: 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20      trackname   
9060: 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61  TEXT, .      tra
9070: 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52  ckartist INTEGER
9080: 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74 69   REFERENCES arti
9090: 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  st.    );.    CR
90a0: 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63 6b  EATE INDEX track
90b0: 69 6e 64 65 78 20 4f 4e 20 74 72 61 63 6b 28 74  index ON track(t
90c0: 72 61 63 6b 61 72 74 69 73 74 29 3b 0a 20 20 7d  rackartist);.  }
90d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
90e0: 66 6b 65 79 2d 32 37 2e 32 20 7b 0a 20 20 65 71  fkey-27.2 {.  eq
90f0: 70 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  p { INSERT INTO 
9100: 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 3f 2c  artist VALUES(?,
9110: 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78   ?) }.} {}.do_ex
9120: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65  ecsql_test e_fke
9130: 79 2d 32 37 2e 33 20 7b 0a 20 20 45 58 50 4c 41  y-27.3 {.  EXPLA
9140: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 55 50  IN QUERY PLAN UP
9150: 44 41 54 45 20 61 72 74 69 73 74 20 53 45 54 20  DATE artist SET 
9160: 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20 61 72  artistid = ?, ar
9170: 74 69 73 74 6e 61 6d 65 20 3d 20 3f 0a 7d 20 7b  tistname = ?.} {
9180: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
9190: 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20 20  ABLE artist} .  
91a0: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
91b0: 42 4c 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20  BLE track USING 
91c0: 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74  COVERING INDEX t
91d0: 72 61 63 6b 69 6e 64 65 78 20 28 74 72 61 63 6b  rackindex (track
91e0: 61 72 74 69 73 74 3d 3f 29 7d 20 0a 20 20 30 20  artist=?)} .  0 
91f0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
9200: 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f  E track USING CO
9210: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61  VERING INDEX tra
9220: 63 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72  ckindex (trackar
9230: 74 69 73 74 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65 78  tist=?)}.}.do_ex
9240: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65  ecsql_test e_fke
9250: 79 2d 32 37 2e 34 20 7b 0a 20 20 45 58 50 4c 41  y-27.4 {.  EXPLA
9260: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45  IN QUERY PLAN DE
9270: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
9280: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
9290: 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74 7d  AN TABLE artist}
92a0: 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43   .  0 0 0 {SEARC
92b0: 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53  H TABLE track US
92c0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
92d0: 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20 28 74  EX trackindex (t
92e0: 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d 0a 7d  rackartist=?)}.}
92f0: 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  ...#############
9300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
9340: 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 31 3a 20  ## SECTION 4.1: 
9350: 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72 65 69 67  Composite Foreig
9360: 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74  n Key Constraint
9370: 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
9380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93a0: 23 23 23 23 23 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 0a 0a 23  #############..#
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63  ---------.# Chec
9410: 6b 20 74 68 61 74 20 70 61 72 65 6e 74 20 61 6e  k that parent an
9420: 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 75 73  d child keys mus
9430: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
9440: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
9450: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
9460: 4f 46 3a 20 52 2d 34 31 30 36 32 2d 33 34 34 33  OF: R-41062-3443
9470: 31 20 50 61 72 65 6e 74 20 61 6e 64 20 63 68 69  1 Parent and chi
9480: 6c 64 20 6b 65 79 73 20 6d 75 73 74 20 68 61 76  ld keys must hav
9490: 65 20 74 68 65 20 73 61 6d 65 0a 23 20 63 61 72  e the same.# car
94a0: 64 69 6e 61 6c 69 74 79 2e 0a 23 0a 66 6f 72 65  dinality..#.fore
94b0: 61 63 68 20 7b 74 6e 20 73 71 6c 20 65 72 72 7d  ach {tn sql err}
94c0: 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45 20 54   {.  1 "CREATE T
94d0: 41 42 4c 45 20 63 28 6a 6a 20 52 45 46 45 52 45  ABLE c(jj REFERE
94e0: 4e 43 45 53 20 70 28 78 2c 20 79 29 29 22 20 0a  NCES p(x, y))" .
94f0: 20 20 20 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79      {foreign key
9500: 20 6f 6e 20 6a 6a 20 73 68 6f 75 6c 64 20 72 65   on jj should re
9510: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
9520: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
9530: 20 70 7d 0a 0a 20 20 32 20 22 43 52 45 41 54 45   p}..  2 "CREATE
9540: 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45 46 45   TABLE c(jj REFE
9550: 52 45 4e 43 45 53 20 70 28 29 29 22 20 7b 6e 65  RENCES p())" {ne
9560: 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65  ar ")": syntax e
9570: 72 72 6f 72 7d 0a 0a 20 20 33 20 22 43 52 45 41  rror}..  3 "CREA
9580: 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 2c 20 46  TE TABLE c(jj, F
9590: 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 29 20 52  OREIGN KEY(jj) R
95a0: 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 20 79  EFERENCES p(x, y
95b0: 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72  ))" .    {number
95c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
95d0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
95e0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
95f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9600: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
9610: 64 20 74 61 62 6c 65 7d 0a 0a 20 20 34 20 22 43  d table}..  4 "C
9620: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a  REATE TABLE c(jj
9630: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a  , FOREIGN KEY(jj
9640: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 29  ) REFERENCES p()
9650: 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20 22 29  )" .    {near ")
9660: 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d  ": syntax error}
9670: 0a 0a 20 20 35 20 22 43 52 45 41 54 45 20 54 41  ..  5 "CREATE TA
9680: 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46 4f  BLE c(ii, jj, FO
9690: 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69 69  REIGN KEY(jj, ii
96a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 29  ) REFERENCES p()
96b0: 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20 22 29  )" .    {near ")
96c0: 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d  ": syntax error}
96d0: 0a 0a 20 20 36 20 22 43 52 45 41 54 45 20 54 41  ..  6 "CREATE TA
96e0: 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46 4f  BLE c(ii, jj, FO
96f0: 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69 69  REIGN KEY(jj, ii
9700: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 78  ) REFERENCES p(x
9710: 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72  ))" .    {number
9720: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
9730: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
9740: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
9750: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9760: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
9770: 64 20 74 61 62 6c 65 7d 0a 0a 20 20 37 20 22 43  d table}..  7 "C
9780: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 69 69  REATE TABLE c(ii
9790: 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45  , jj, FOREIGN KE
97a0: 59 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52 45  Y(jj, ii) REFERE
97b0: 4e 43 45 53 20 70 28 78 2c 79 2c 7a 29 29 22 20  NCES p(x,y,z))" 
97c0: 0a 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20  .    {number of 
97d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
97e0: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
97f0: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
9800: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
9810: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
9820: 62 6c 65 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70 5f  ble}.} {.  drop_
9830: 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f 5f  all_tables.  do_
9840: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 24  test e_fkey-28.$
9850: 74 6e 20 5b 6c 69 73 74 20 63 61 74 63 68 73 71  tn [list catchsq
9860: 6c 20 24 73 71 6c 5d 20 5b 6c 69 73 74 20 31 20  l $sql] [list 1 
9870: 24 65 72 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20  $err].}.do_test 
9880: 65 5f 66 6b 65 79 2d 32 38 2e 38 20 7b 0a 20 20  e_fkey-28.8 {.  
9890: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
98a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
98b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 78  CREATE TABLE p(x
98c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
98d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
98e0: 63 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  c(a, b, FOREIGN 
98f0: 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e  KEY(a,b) REFEREN
9900: 43 45 53 20 70 29 3b 0a 20 20 7d 0a 20 20 63 61  CES p);.  }.  ca
9910: 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45 20 46  tchsql {DELETE F
9920: 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b 66 6f 72  ROM p}.} {1 {for
9930: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
9940: 68 20 2d 20 22 63 22 20 72 65 66 65 72 65 6e 63  h - "c" referenc
9950: 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74 65 73  ing "p"}}.do_tes
9960: 74 20 65 5f 66 6b 65 79 2d 32 38 2e 39 20 7b 0a  t e_fkey-28.9 {.
9970: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
9980: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
9990: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
99a0: 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b  (x, y, PRIMARY K
99b0: 45 59 28 78 2c 79 29 29 3b 0a 20 20 20 20 43 52  EY(x,y));.    CR
99c0: 45 41 54 45 20 54 41 42 4c 45 20 63 28 61 20 52  EATE TABLE c(a R
99d0: 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20 20  EFERENCES p);.  
99e0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45  }.  catchsql {DE
99f0: 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b  LETE FROM p}.} {
9a00: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
9a10: 69 73 6d 61 74 63 68 20 2d 20 22 63 22 20 72 65  ismatch - "c" re
9a20: 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d 7d 0a  ferencing "p"}}.
9a30: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
9a80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
9a90: 36 37 36 2d 30 39 38 35 39 0a 23 0a 23 20 54 65  676-09859.#.# Te
9aa0: 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73  st the example s
9ab0: 63 68 65 6d 61 20 69 6e 20 74 68 65 20 22 43 6f  chema in the "Co
9ac0: 6d 70 6f 73 69 74 65 20 46 6f 72 65 69 67 6e 20  mposite Foreign 
9ad0: 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 22  Key Constraints"
9ae0: 20 0a 23 20 73 65 63 74 69 6f 6e 2e 0a 23 0a 64   .# section..#.d
9af0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 39  o_test e_fkey-29
9b00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
9b10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9b20: 45 20 61 6c 62 75 6d 28 0a 20 20 20 20 20 20 61  E album(.      a
9b30: 6c 62 75 6d 61 72 74 69 73 74 20 54 45 58 54 2c  lbumartist TEXT,
9b40: 0a 20 20 20 20 20 20 61 6c 62 75 6d 6e 61 6d 65  .      albumname
9b50: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c 62   TEXT,.      alb
9b60: 75 6d 63 6f 76 65 72 20 42 49 4e 41 52 59 2c 0a  umcover BINARY,.
9b70: 20 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45        PRIMARY KE
9b80: 59 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 20 61  Y(albumartist, a
9b90: 6c 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b  lbumname).    );
9ba0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9bb0: 45 20 73 6f 6e 67 28 0a 20 20 20 20 20 20 73 6f  E song(.      so
9bc0: 6e 67 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20  ngid INTEGER,.  
9bd0: 20 20 20 20 73 6f 6e 67 61 72 74 69 73 74 20 54      songartist T
9be0: 45 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67 61  EXT,.      songa
9bf0: 6c 62 75 6d 20 54 45 58 54 2c 0a 20 20 20 20 20  lbum TEXT,.     
9c00: 20 73 6f 6e 67 6e 61 6d 65 20 54 45 58 54 2c 0a   songname TEXT,.
9c10: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
9c20: 59 28 73 6f 6e 67 61 72 74 69 73 74 2c 20 73 6f  Y(songartist, so
9c30: 6e 67 61 6c 62 75 6d 29 20 52 45 46 45 52 45 4e  ngalbum) REFEREN
9c40: 43 45 53 20 61 6c 62 75 6d 28 61 6c 62 75 6d 61  CES album(albuma
9c50: 72 74 69 73 74 2c 61 6c 62 75 6d 6e 61 6d 65 29  rtist,albumname)
9c60: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
9c70: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
9c80: 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -29.2 {.  execsq
9c90: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
9ca0: 4e 54 4f 20 61 6c 62 75 6d 20 56 41 4c 55 45 53  NTO album VALUES
9cb0: 28 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27  ('Elvis Presley'
9cc0: 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72 69 73  , 'Elvis'' Chris
9cd0: 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 4e 55 4c  tmas Album', NUL
9ce0: 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  L);.    INSERT I
9cf0: 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28  NTO song VALUES(
9d00: 0a 20 20 20 20 20 20 31 2c 20 27 45 6c 76 69 73  .      1, 'Elvis
9d10: 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69   Presley', 'Elvi
9d20: 73 27 27 20 43 68 72 69 73 74 6d 61 73 20 41 6c  s'' Christmas Al
9d30: 62 75 6d 27 2c 20 27 48 65 72 65 20 43 6f 6d 65  bum', 'Here Come
9d40: 73 20 53 61 6e 74 61 20 43 6c 61 75 73 65 27 0a  s Santa Clause'.
9d50: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
9d60: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
9d70: 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.3 {.  catchsql
9d80: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
9d90: 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 32  TO song VALUES(2
9da0: 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79  , 'Elvis Presley
9db0: 27 2c 20 27 45 6c 76 69 73 20 49 73 20 42 61 63  ', 'Elvis Is Bac
9dc0: 6b 21 27 2c 20 27 46 65 76 65 72 27 29 3b 0a 20  k!', 'Fever');. 
9dd0: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
9de0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
9df0: 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d  failed}}...#----
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e40: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
9e50: 2d 4f 46 3a 20 52 2d 33 33 36 32 36 2d 34 38 34  -OF: R-33626-484
9e60: 31 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 69 66  18 In SQLite, if
9e70: 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69 6c   any of the chil
9e80: 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23 20  d key columns.# 
9e90: 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 6f  (in this case so
9ea0: 6e 67 61 72 74 69 73 74 20 61 6e 64 20 73 6f 6e  ngartist and son
9eb0: 67 61 6c 62 75 6d 29 20 61 72 65 20 4e 55 4c 4c  galbum) are NULL
9ec0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
9ed0: 6e 6f 0a 23 20 72 65 71 75 69 72 65 6d 65 6e 74  no.# requirement
9ee0: 20 66 6f 72 20 61 20 63 6f 72 72 65 73 70 6f 6e   for a correspon
9ef0: 64 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65 20  ding row in the 
9f00: 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a  parent table..#.
9f10: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
9f20: 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.1 {.  execsql 
9f30: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
9f40: 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 32 2c  O song VALUES(2,
9f50: 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27   'Elvis Presley'
9f60: 2c 20 4e 55 4c 4c 2c 20 27 46 65 76 65 72 27 29  , NULL, 'Fever')
9f70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9f80: 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 33 2c  O song VALUES(3,
9f90: 20 4e 55 4c 4c 2c 20 27 45 6c 76 69 73 20 49 73   NULL, 'Elvis Is
9fa0: 20 42 61 63 6b 27 2c 20 27 53 6f 6c 64 69 65 72   Back', 'Soldier
9fb0: 20 42 6f 79 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d   Boy');.  }.} {}
9fc0: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
9fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a000: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
a010: 23 20 53 45 43 54 49 4f 4e 20 34 2e 32 3a 20 44  # SECTION 4.2: D
a020: 65 66 65 72 72 65 64 20 46 6f 72 65 69 67 6e 20  eferred Foreign 
a030: 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 0a  Key Constraints.
a040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a080: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d  ###########..#--
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
a0e0: 68 61 74 20 69 66 20 61 20 73 74 61 74 65 6d 65  hat if a stateme
a0f0: 6e 74 20 76 69 6f 6c 61 74 65 73 20 61 6e 20 69  nt violates an i
a100: 6d 6d 65 64 69 61 74 65 20 46 4b 20 63 6f 6e 73  mmediate FK cons
a110: 74 72 61 69 6e 74 2c 20 61 6e 64 20 74 68 65 0a  traint, and the.
a120: 23 20 64 61 74 61 62 61 73 65 20 64 6f 65 73 20  # database does 
a130: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
a140: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  FK constraint on
a150: 63 65 20 61 6c 6c 20 65 66 66 65 63 74 73 20 6f  ce all effects o
a160: 66 20 74 68 65 0a 23 20 73 74 61 74 65 6d 65 6e  f the.# statemen
a170: 74 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 6c  t have been appl
a180: 69 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ied, an error is
a190: 20 72 65 70 6f 72 74 65 64 20 61 6e 64 20 74 68   reported and th
a1a0: 65 20 65 66 66 65 63 74 73 20 6f 66 0a 23 20 74  e effects of.# t
a1b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
a1c0: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45 56  led back..#.# EV
a1d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 33  IDENCE-OF: R-093
a1e0: 32 33 2d 33 30 34 37 30 20 49 66 20 61 20 73 74  23-30470 If a st
a1f0: 61 74 65 6d 65 6e 74 20 6d 6f 64 69 66 69 65 73  atement modifies
a200: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
a210: 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20   the.# database 
a220: 73 6f 20 74 68 61 74 20 61 6e 20 69 6d 6d 65 64  so that an immed
a230: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
a240: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 69   constraint is i
a250: 6e 20 76 69 6f 6c 61 74 69 6f 6e 0a 23 20 61 74  n violation.# at
a260: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
a270: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  the statement, a
a280: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74  n exception is t
a290: 68 72 6f 77 6e 20 61 6e 64 20 74 68 65 0a 23 20  hrown and the.# 
a2a0: 65 66 66 65 63 74 73 20 6f 66 20 74 68 65 20 73  effects of the s
a2b0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 72 65 76  tatement are rev
a2c0: 65 72 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c  erted..#.drop_al
a2d0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
a2e0: 20 65 5f 66 6b 65 79 2d 33 31 2e 31 20 7b 0a 20   e_fkey-31.1 {. 
a2f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
a300: 52 45 41 54 45 20 54 41 42 4c 45 20 6b 69 6e 67  REATE TABLE king
a310: 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  (a, b, PRIMARY K
a320: 45 59 28 61 29 29 3b 0a 20 20 20 20 43 52 45 41  EY(a));.    CREA
a330: 54 45 20 54 41 42 4c 45 20 70 72 69 6e 63 65 28  TE TABLE prince(
a340: 63 20 52 45 46 45 52 45 4e 43 45 53 20 6b 69 6e  c REFERENCES kin
a350: 67 2c 20 64 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  g, d);.  }.} {}.
a360: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
a370: 33 31 2e 32 20 7b 0a 20 20 23 20 45 78 65 63 75  31.2 {.  # Execu
a380: 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  te a statement t
a390: 68 61 74 20 76 69 6f 6c 61 74 65 73 20 74 68 65  hat violates the
a3a0: 20 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63 6f   immediate FK co
a3b0: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 63 61 74 63  nstraint..  catc
a3c0: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
a3d0: 54 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53  TO prince VALUES
a3e0: 28 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 46  (1, 2) }.} {1 {F
a3f0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
a400: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
a410: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
a420: 31 2e 33 20 7b 0a 20 20 23 20 54 68 69 73 20 74  1.3 {.  # This t
a430: 69 6d 65 2c 20 75 73 65 20 61 20 74 72 69 67 67  ime, use a trigg
a440: 65 72 20 74 6f 20 66 69 78 20 74 68 65 20 63 6f  er to fix the co
a450: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
a460: 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  on before the.  
a470: 23 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  # statement has 
a480: 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74 69  finished executi
a490: 6e 67 2e 20 54 68 65 6e 20 65 78 65 63 75 74 65  ng. Then execute
a4a0: 20 74 68 65 20 73 61 6d 65 20 73 74 61 74 65 6d   the same statem
a4b0: 65 6e 74 20 61 73 0a 20 20 23 20 69 6e 20 74 68  ent as.  # in th
a4c0: 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  e previous test 
a4d0: 63 61 73 65 2e 20 54 68 69 73 20 74 69 6d 65 2c  case. This time,
a4e0: 20 6e 6f 20 65 72 72 6f 72 2e 0a 20 20 65 78 65   no error..  exe
a4f0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
a500: 45 20 54 52 49 47 47 45 52 20 6b 74 20 41 46 54  E TRIGGER kt AFT
a510: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 70 72 69  ER INSERT ON pri
a520: 6e 63 65 20 57 48 45 4e 0a 20 20 20 20 20 20 4e  nce WHEN.      N
a530: 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43  OT EXISTS (SELEC
a540: 54 20 61 20 46 52 4f 4d 20 6b 69 6e 67 20 57 48  T a FROM king WH
a550: 45 52 45 20 61 20 3d 20 6e 65 77 2e 63 29 0a 20  ERE a = new.c). 
a560: 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49     BEGIN.      I
a570: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 69 6e 67 20  NSERT INTO king 
a580: 56 41 4c 55 45 53 28 6e 65 77 2e 63 2c 20 4e 55  VALUES(new.c, NU
a590: 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 0a 20 20 7d  LL);.    END.  }
a5a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
a5b0: 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20  ERT INTO prince 
a5c0: 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d  VALUES(1, 2) }.}
a5d0: 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74   {}..# Test that
a5e0: 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 73 69 64   operating insid
a5f0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
a600: 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
a610: 6e 63 65 20 74 6f 20 0a 23 20 69 6d 6d 65 64 69  nce to .# immedi
a620: 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ate constraint v
a630: 69 6f 6c 61 74 69 6f 6e 20 68 61 6e 64 6c 69 6e  iolation handlin
a640: 67 2e 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  g..do_test e_fke
a650: 79 2d 33 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-31.4 {.  execs
a660: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
a670: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a680: 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28 32 2c  prince VALUES(2,
a690: 20 33 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 52   3);.    DROP TR
a6a0: 49 47 47 45 52 20 6b 74 3b 0a 20 20 7d 0a 20 20  IGGER kt;.  }.  
a6b0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
a6c0: 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41  T INTO prince VA
a6d0: 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 7d 20 7b  LUES(3, 4) }.} {
a6e0: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
a6f0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
a700: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
a710: 79 2d 33 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-31.5 {.  execs
a720: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
a730: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
a740: 4f 4d 20 6b 69 6e 67 3b 0a 20 20 7d 0a 7d 20 7b  OM king;.  }.} {
a750: 31 20 7b 7d 20 32 20 7b 7d 7d 0a 0a 23 2d 2d 2d  1 {} 2 {}}..#---
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7a0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
a7b0: 61 74 20 69 66 20 61 20 64 65 66 65 72 72 65 64  at if a deferred
a7c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 76   constraint is v
a7d0: 69 6f 6c 61 74 65 64 20 77 69 74 68 69 6e 20 61  iolated within a
a7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 23 20   transaction,.# 
a7f0: 6e 6f 74 68 69 6e 67 20 68 61 70 70 65 6e 73 20  nothing happens 
a800: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
a810: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
a820: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
a830: 73 74 0a 23 20 69 6e 20 61 20 73 74 61 74 65 20  st.# in a state 
a840: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 61  that does not sa
a850: 74 69 73 66 79 20 74 68 65 20 46 4b 20 63 6f 6e  tisfy the FK con
a860: 73 74 72 61 69 6e 74 2e 20 48 6f 77 65 76 65 72  straint. However
a870: 20 61 74 74 65 6d 70 74 73 0a 23 20 74 6f 20 43   attempts.# to C
a880: 4f 4d 4d 49 54 20 74 68 65 20 74 72 61 6e 73 61  OMMIT the transa
a890: 63 74 69 6f 6e 20 66 61 69 6c 20 75 6e 74 69 6c  ction fail until
a8a0: 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61 69   the FK constrai
a8b0: 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  nt is satisfied.
a8c0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a8d0: 3a 20 52 2d 34 39 31 37 38 2d 32 31 33 35 38 20  : R-49178-21358 
a8e0: 42 79 20 63 6f 6e 74 72 61 73 74 2c 20 69 66 20  By contrast, if 
a8f0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64 69  a statement modi
a900: 66 69 65 73 20 74 68 65 0a 23 20 63 6f 6e 74 65  fies the.# conte
a910: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
a920: 61 73 65 20 73 75 63 68 20 74 68 61 74 20 61 20  ase such that a 
a930: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
a940: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
a950: 23 20 69 73 20 76 69 6f 6c 61 74 65 64 2c 20 74  # is violated, t
a960: 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20  he violation is 
a970: 6e 6f 74 20 72 65 70 6f 72 74 65 64 20 69 6d 6d  not reported imm
a980: 65 64 69 61 74 65 6c 79 2e 0a 23 0a 23 20 45 56  ediately..#.# EV
a990: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 36  IDENCE-OF: R-396
a9a0: 39 32 2d 31 32 34 38 38 20 44 65 66 65 72 72 65  92-12488 Deferre
a9b0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
a9c0: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f  nstraints are no
a9d0: 74 0a 23 20 63 68 65 63 6b 65 64 20 75 6e 74 69  t.# checked unti
a9e0: 6c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  l the transactio
a9f0: 6e 20 74 72 69 65 73 20 74 6f 20 43 4f 4d 4d 49  n tries to COMMI
aa00: 54 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  T..#.# EVIDENCE-
aa10: 4f 46 3a 20 52 2d 35 35 31 34 37 2d 34 37 36 36  OF: R-55147-4766
aa20: 34 20 46 6f 72 20 61 73 20 6c 6f 6e 67 20 61 73  4 For as long as
aa30: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 61 6e   the user has an
aa40: 20 6f 70 65 6e 0a 23 20 74 72 61 6e 73 61 63 74   open.# transact
aa50: 69 6f 6e 2c 20 74 68 65 20 64 61 74 61 62 61 73  ion, the databas
aa60: 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
aa70: 65 78 69 73 74 20 69 6e 20 61 20 73 74 61 74 65  exist in a state
aa80: 20 74 68 61 74 20 76 69 6f 6c 61 74 65 73 0a 23   that violates.#
aa90: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 64   any number of d
aaa0: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
aab0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  key constraints.
aac0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
aad0: 3a 20 52 2d 32 39 36 30 34 2d 33 30 33 39 35 20  : R-29604-30395 
aae0: 48 6f 77 65 76 65 72 2c 20 43 4f 4d 4d 49 54 20  However, COMMIT 
aaf0: 77 69 6c 6c 20 66 61 69 6c 20 61 73 20 6c 6f 6e  will fail as lon
ab00: 67 20 61 73 0a 23 20 66 6f 72 65 69 67 6e 20 6b  g as.# foreign k
ab10: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ey constraints r
ab20: 65 6d 61 69 6e 20 69 6e 20 76 69 6f 6c 61 74 69  emain in violati
ab30: 6f 6e 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f  on..#.proc test_
ab40: 65 66 6b 65 79 5f 33 34 20 7b 74 6e 20 69 73 45  efkey_34 {tn isE
ab50: 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f  rror sql} {.  do
ab60: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 32 2e  _test e_fkey-32.
ab70: 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73  $tn ".    catchs
ab80: 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c  ql {$sql}.  " [l
ab90: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
aba0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
abb0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
abc0: 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 64  }} $isError].}.d
abd0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 0a  rop_all_tables..
abe0: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 31  test_efkey_34  1
abf0: 20 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41   0 {.  CREATE TA
ac00: 42 4c 45 20 6c 6c 28 6b 20 50 52 49 4d 41 52 59  BLE ll(k PRIMARY
ac10: 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45 20   KEY);.  CREATE 
ac20: 54 41 42 4c 45 20 6b 6b 28 63 20 52 45 46 45 52  TABLE kk(c REFER
ac30: 45 4e 43 45 53 20 6c 6c 20 44 45 46 45 52 52 41  ENCES ll DEFERRA
ac40: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
ac50: 46 45 52 52 45 44 29 3b 0a 7d 0a 74 65 73 74 5f  FERRED);.}.test_
ac60: 65 66 6b 65 79 5f 33 34 20 20 32 20 30 20 22 42  efkey_34  2 0 "B
ac70: 45 47 49 4e 22 0a 74 65 73 74 5f 65 66 6b 65 79  EGIN".test_efkey
ac80: 5f 33 34 20 20 33 20 30 20 20 20 22 49 4e 53 45  _34  3 0   "INSE
ac90: 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55 45  RT INTO kk VALUE
aca0: 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  S(5)".test_efkey
acb0: 5f 33 34 20 20 34 20 30 20 20 20 22 49 4e 53 45  _34  4 0   "INSE
acc0: 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55 45  RT INTO kk VALUE
acd0: 53 28 31 30 29 22 0a 74 65 73 74 5f 65 66 6b 65  S(10)".test_efke
ace0: 79 5f 33 34 20 20 35 20 31 20 22 43 4f 4d 4d 49  y_34  5 1 "COMMI
acf0: 54 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34  T".test_efkey_34
ad00: 20 20 36 20 30 20 20 20 22 49 4e 53 45 52 54 20    6 0   "INSERT 
ad10: 49 4e 54 4f 20 6c 6c 20 56 41 4c 55 45 53 28 31  INTO ll VALUES(1
ad20: 30 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33  0)".test_efkey_3
ad30: 34 20 20 37 20 31 20 22 43 4f 4d 4d 49 54 22 0a  4  7 1 "COMMIT".
ad40: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 38  test_efkey_34  8
ad50: 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54   0   "INSERT INT
ad60: 4f 20 6c 6c 20 56 41 4c 55 45 53 28 35 29 22 0a  O ll VALUES(5)".
ad70: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 39  test_efkey_34  9
ad80: 20 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 23 2d 2d   0 "COMMIT"..#--
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e 20 6e  -------.# When n
ade0: 6f 74 20 72 75 6e 6e 69 6e 67 20 69 6e 73 69 64  ot running insid
adf0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  e a transaction,
ae00: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
ae10: 74 72 61 69 6e 74 20 69 73 20 73 69 6d 69 6c 61  traint is simila
ae20: 72 0a 23 20 74 6f 20 61 6e 20 69 6d 6d 65 64 69  r.# to an immedi
ae30: 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ate constraint (
ae40: 76 69 6f 6c 61 74 69 6f 6e 73 20 61 72 65 20 72  violations are r
ae50: 65 70 6f 72 74 65 64 20 69 6d 6d 65 64 69 61 74  eported immediat
ae60: 65 6c 79 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ely)..#.# EVIDEN
ae70: 43 45 2d 4f 46 3a 20 52 2d 35 36 38 34 34 2d 36  CE-OF: R-56844-6
ae80: 31 37 30 35 20 49 66 20 74 68 65 20 63 75 72 72  1705 If the curr
ae90: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ent statement is
aea0: 20 6e 6f 74 20 69 6e 73 69 64 65 20 61 6e 0a 23   not inside an.#
aeb0: 20 65 78 70 6c 69 63 69 74 20 74 72 61 6e 73 61   explicit transa
aec0: 63 74 69 6f 6e 20 28 61 20 42 45 47 49 4e 2f 43  ction (a BEGIN/C
aed0: 4f 4d 4d 49 54 2f 52 4f 4c 4c 42 41 43 4b 20 62  OMMIT/ROLLBACK b
aee0: 6c 6f 63 6b 29 2c 20 74 68 65 6e 20 61 6e 20 69  lock), then an i
aef0: 6d 70 6c 69 63 69 74 0a 23 20 74 72 61 6e 73 61  mplicit.# transa
af00: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
af10: 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ed as soon as th
af20: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  e statement has 
af30: 66 69 6e 69 73 68 65 64 0a 23 20 65 78 65 63 75  finished.# execu
af40: 74 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63 61  ting. In this ca
af50: 73 65 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  se deferred cons
af60: 74 72 61 69 6e 74 73 20 62 65 68 61 76 65 20 74  traints behave t
af70: 68 65 20 73 61 6d 65 20 61 73 0a 23 20 69 6d 6d  he same as.# imm
af80: 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e  ediate constrain
af90: 74 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ts..#.drop_all_t
afa0: 61 62 6c 65 73 0a 70 72 6f 63 20 74 65 73 74 5f  ables.proc test_
afb0: 65 66 6b 65 79 5f 33 35 20 7b 74 6e 20 69 73 45  efkey_35 {tn isE
afc0: 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f  rror sql} {.  do
afd0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 33 2e  _test e_fkey-33.
afe0: 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73  $tn ".    catchs
aff0: 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c  ql {$sql}.  " [l
b000: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
b010: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
b020: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
b030: 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 64  }} $isError].}.d
b040: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 33  o_test e_fkey-33
b050: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
b060: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b070: 45 20 70 61 72 65 6e 74 28 78 2c 20 79 29 3b 0a  E parent(x, y);.
b080: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
b090: 45 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70 61  E INDEX pi ON pa
b0a0: 72 65 6e 74 28 78 2c 20 79 29 3b 0a 20 20 20 20  rent(x, y);.    
b0b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
b0c0: 6c 64 28 61 2c 20 62 2c 0a 20 20 20 20 20 20 46  ld(a, b,.      F
b0d0: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
b0e0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b0f0: 6e 74 28 78 2c 20 79 29 20 44 45 46 45 52 52 41  nt(x, y) DEFERRA
b100: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
b110: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
b120: 7d 0a 7d 20 7b 7d 0a 74 65 73 74 5f 65 66 6b 65  }.} {}.test_efke
b130: 79 5f 33 35 20 32 20 31 20 22 49 4e 53 45 52 54  y_35 2 1 "INSERT
b140: 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41 4c   INTO child  VAL
b150: 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 74  UES('x', 'y')".t
b160: 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 33 20 30  est_efkey_35 3 0
b170: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61   "INSERT INTO pa
b180: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 78 27 2c  rent VALUES('x',
b190: 20 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b 65   'y')".test_efke
b1a0: 79 5f 33 35 20 34 20 30 20 22 49 4e 53 45 52 54  y_35 4 0 "INSERT
b1b0: 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41 4c   INTO child  VAL
b1c0: 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 0a  UES('x', 'y')"..
b1d0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
b220: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 37  IDENCE-OF: R-127
b230: 38 32 2d 36 31 38 34 31 0a 23 0a 23 20 54 65 73  82-61841.#.# Tes
b240: 74 20 74 68 61 74 20 61 6e 20 46 4b 20 63 6f 6e  t that an FK con
b250: 73 74 72 61 69 6e 74 20 69 73 20 6d 61 64 65 20  straint is made 
b260: 64 65 66 65 72 72 65 64 20 62 79 20 61 64 64 69  deferred by addi
b270: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
b280: 0a 23 20 74 6f 20 74 68 65 20 64 65 66 69 6e 69  .# to the defini
b290: 74 69 6f 6e 3a 0a 23 0a 23 20 20 20 44 45 46 45  tion:.#.#   DEFE
b2a0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b2b0: 20 44 45 46 45 52 52 45 44 0a 23 0a 23 20 45 56   DEFERRED.#.# EV
b2c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 30  IDENCE-OF: R-090
b2d0: 30 35 2d 32 38 37 39 31 0a 23 0a 23 20 41 6c 73  05-28791.#.# Als
b2e0: 6f 20 74 65 73 74 20 74 68 61 74 20 61 64 64 69  o test that addi
b2f0: 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ng any of the fo
b300: 6c 6c 6f 77 69 6e 67 20 74 6f 20 61 20 66 6f 72  llowing to a for
b310: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
b320: 69 6f 6e 20 0a 23 20 6d 61 6b 65 73 20 74 68 65  ion .# makes the
b330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 49 4d 4d 45   constraint IMME
b340: 44 49 41 54 45 3a 0a 23 0a 23 20 20 20 4e 4f 54  DIATE:.#.#   NOT
b350: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b360: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 23  IALLY DEFERRED.#
b370: 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c     NOT DEFERRABL
b380: 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  E INITIALLY IMME
b390: 44 49 41 54 45 0a 23 20 20 20 4e 4f 54 20 44 45  DIATE.#   NOT DE
b3a0: 46 45 52 52 41 42 4c 45 0a 23 20 20 20 44 45 46  FERRABLE.#   DEF
b3b0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
b3c0: 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20 20  Y IMMEDIATE.#   
b3d0: 44 45 46 45 52 52 41 42 4c 45 0a 23 0a 23 20 46  DEFERRABLE.#.# F
b3e0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20  oreign keys are 
b3f0: 49 4d 4d 45 44 49 41 54 45 20 62 79 20 64 65 66  IMMEDIATE by def
b400: 61 75 6c 74 20 28 69 66 20 74 68 65 72 65 20 69  ault (if there i
b410: 73 20 6e 6f 20 44 45 46 45 52 52 41 42 4c 45 20  s no DEFERRABLE 
b420: 6f 72 20 4e 4f 54 0a 23 20 44 45 46 45 52 52 41  or NOT.# DEFERRA
b430: 42 4c 45 20 63 6c 61 75 73 65 29 2e 0a 23 0a 23  BLE clause)..#.#
b440: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b450: 33 35 32 39 30 2d 31 36 34 36 30 20 46 6f 72 65  35290-16460 Fore
b460: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
b470: 6e 74 73 20 61 72 65 20 69 6d 6d 65 64 69 61 74  nts are immediat
b480: 65 20 62 79 0a 23 20 64 65 66 61 75 6c 74 2e 0a  e by.# default..
b490: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
b4a0: 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 45   R-30323-21917 E
b4b0: 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
b4c0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53 51  constraint in SQ
b4d0: 4c 69 74 65 20 69 73 0a 23 20 63 6c 61 73 73 69  Lite is.# classi
b4e0: 66 69 65 64 20 61 73 20 65 69 74 68 65 72 20 69  fied as either i
b4f0: 6d 6d 65 64 69 61 74 65 20 6f 72 20 64 65 66 65  mmediate or defe
b500: 72 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  rred..#.drop_all
b510: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
b520: 65 5f 66 6b 65 79 2d 33 34 2e 31 20 7b 0a 20 20  e_fkey-34.1 {.  
b530: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
b540: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
b550: 74 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  t(x, y, z, PRIMA
b560: 52 59 20 4b 45 59 28 78 2c 79 2c 7a 29 29 3b 0a  RY KEY(x,y,z));.
b570: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b580: 20 63 31 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20   c1(a, b, c,.   
b590: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61     FOREIGN KEY(a
b5a0: 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43  , b, c) REFERENC
b5b0: 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45  ES parent NOT DE
b5c0: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
b5d0: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
b5e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
b5f0: 42 4c 45 20 63 32 28 61 2c 20 62 2c 20 63 2c 0a  BLE c2(a, b, c,.
b600: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
b610: 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52  Y(a, b, c) REFER
b620: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4e 4f 54  ENCES parent NOT
b630: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b640: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a  IALLY IMMEDIATE.
b650: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
b660: 45 20 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c  E TABLE c3(a, b,
b670: 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   c,.      FOREIG
b680: 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52  N KEY(a, b, c) R
b690: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
b6a0: 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 0a   NOT DEFERRABLE.
b6b0: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
b6c0: 45 20 54 41 42 4c 45 20 63 34 28 61 2c 20 62 2c  E TABLE c4(a, b,
b6d0: 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   c,.      FOREIG
b6e0: 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52  N KEY(a, b, c) R
b6f0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
b700: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b710: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a  IALLY IMMEDIATE.
b720: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
b730: 45 20 54 41 42 4c 45 20 63 35 28 61 2c 20 62 2c  E TABLE c5(a, b,
b740: 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   c,.      FOREIG
b750: 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52  N KEY(a, b, c) R
b760: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
b770: 20 44 45 46 45 52 52 41 42 4c 45 0a 20 20 20 20   DEFERRABLE.    
b780: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
b790: 42 4c 45 20 63 36 28 61 2c 20 62 2c 20 63 2c 20  BLE c6(a, b, c, 
b7a0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
b7b0: 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20  , c) REFERENCES 
b7c0: 70 61 72 65 6e 74 29 3b 0a 0a 20 20 20 20 2d 2d  parent);..    --
b7d0: 20 54 68 69 73 20 46 4b 20 63 6f 6e 73 74 72 61   This FK constra
b7e0: 69 6e 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  int is the only 
b7f0: 64 65 66 65 72 72 61 62 6c 65 20 6f 6e 65 2e 0a  deferrable one..
b800: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b810: 20 63 37 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20   c7(a, b, c,.   
b820: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61     FOREIGN KEY(a
b830: 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43  , b, c) REFERENC
b840: 45 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52  ES parent DEFERR
b850: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
b860: 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a  EFERRED.    );..
b870: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b880: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 61  parent VALUES('a
b890: 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20  ', 'b', 'c');.  
b8a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
b8b0: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 64 27 2c  rent VALUES('d',
b8c0: 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 20 20   'e', 'f');.    
b8d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
b8e0: 6e 74 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27  nt VALUES('g', '
b8f0: 68 27 2c 20 27 69 27 29 3b 0a 20 20 20 20 49 4e  h', 'i');.    IN
b900: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
b910: 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27   VALUES('j', 'k'
b920: 2c 20 27 6c 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'l');.    INSE
b930: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
b940: 41 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c 20  ALUES('m', 'n', 
b950: 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'o');.    INSERT
b960: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
b970: 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20 27 72  UES('p', 'q', 'r
b980: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
b990: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
b9a0: 53 28 27 73 27 2c 20 27 74 27 2c 20 27 75 27 29  S('s', 't', 'u')
b9b0: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
b9c0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 61 27  TO c1 VALUES('a'
b9d0: 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20  , 'b', 'c');.   
b9e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20   INSERT INTO c2 
b9f0: 56 41 4c 55 45 53 28 27 64 27 2c 20 27 65 27 2c  VALUES('d', 'e',
ba00: 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'f');.    INSER
ba10: 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53  T INTO c3 VALUES
ba20: 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b  ('g', 'h', 'i');
ba30: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ba40: 20 63 34 20 56 41 4c 55 45 53 28 27 6a 27 2c 20   c4 VALUES('j', 
ba50: 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20 49  'k', 'l');.    I
ba60: 4e 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56 41  NSERT INTO c5 VA
ba70: 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c 20 27  LUES('m', 'n', '
ba80: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
ba90: 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28 27  INTO c6 VALUES('
baa0: 70 27 2c 20 27 71 27 2c 20 27 72 27 29 3b 0a 20  p', 'q', 'r');. 
bab0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
bac0: 37 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27 74  7 VALUES('s', 't
bad0: 27 2c 20 27 75 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'u');.  }.} {
bae0: 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b  }..proc test_efk
baf0: 65 79 5f 32 39 20 7b 74 6e 20 73 71 6c 20 69 73  ey_29 {tn sql is
bb00: 45 72 72 6f 72 7d 20 7b 0a 20 20 64 6f 5f 74 65  Error} {.  do_te
bb10: 73 74 20 65 5f 66 6b 65 79 2d 33 34 2e 24 74 6e  st e_fkey-34.$tn
bb20: 20 22 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c   "catchsql {$sql
bb30: 7d 22 20 5b 0a 20 20 20 20 6c 69 6e 64 65 78 20  }" [.    lindex 
bb40: 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45  {{0 {}} {1 {FORE
bb50: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
bb60: 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73  nt failed}}} $is
bb70: 45 72 72 6f 72 0a 20 20 5d 0a 7d 0a 74 65 73 74  Error.  ].}.test
bb80: 5f 65 66 6b 65 79 5f 32 39 20 20 32 20 22 42 45  _efkey_29  2 "BE
bb90: 47 49 4e 22 20 20 20 20 20 20 20 20 20 20 20 20  GIN"            
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66         0.test_ef
bbc0: 6b 65 79 5f 32 39 20 20 33 20 22 44 45 4c 45 54  key_29  3 "DELET
bbd0: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
bbe0: 45 52 45 20 78 20 3d 20 27 61 27 22 20 20 20 20  ERE x = 'a'"    
bbf0: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
bc00: 5f 32 39 20 20 34 20 22 44 45 4c 45 54 45 20 46  _29  4 "DELETE F
bc10: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
bc20: 20 78 20 3d 20 27 64 27 22 20 20 20 20 20 20 20   x = 'd'"       
bc30: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bc40: 20 20 35 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    5 "DELETE FROM
bc50: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
bc60: 3d 20 27 67 27 22 20 20 20 20 20 20 20 20 31 0a  = 'g'"        1.
bc70: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 36  test_efkey_29  6
bc80: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
bc90: 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
bca0: 6a 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73  j'"        1.tes
bcb0: 74 5f 65 66 6b 65 79 5f 32 39 20 20 37 20 22 44  t_efkey_29  7 "D
bcc0: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
bcd0: 74 20 57 48 45 52 45 20 78 20 3d 20 27 6d 27 22  t WHERE x = 'm'"
bce0: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
bcf0: 66 6b 65 79 5f 32 39 20 20 38 20 22 44 45 4c 45  fkey_29  8 "DELE
bd00: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
bd10: 48 45 52 45 20 78 20 3d 20 27 70 27 22 20 20 20  HERE x = 'p'"   
bd20: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
bd30: 79 5f 32 39 20 20 39 20 22 44 45 4c 45 54 45 20  y_29  9 "DELETE 
bd40: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
bd50: 45 20 78 20 3d 20 27 73 27 22 20 20 20 20 20 20  E x = 's'"      
bd60: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
bd70: 39 20 31 30 20 22 43 4f 4d 4d 49 54 22 20 20 20  9 10 "COMMIT"   
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
bda0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
bdb0: 31 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20  1 "ROLLBACK"    
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 0a 74              0..t
bde0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39 20  est_efkey_29  9 
bdf0: 22 42 45 47 49 4e 22 20 20 20 20 20 20 20 20 20  "BEGIN"         
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74            0.test
be20: 5f 65 66 6b 65 79 5f 32 39 20 31 30 20 22 55 50  _efkey_29 10 "UP
be30: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
be40: 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20  z = 'z' WHERE z 
be50: 3d 20 27 63 27 22 20 31 0a 74 65 73 74 5f 65 66  = 'c'" 1.test_ef
be60: 6b 65 79 5f 32 39 20 31 31 20 22 55 50 44 41 54  key_29 11 "UPDAT
be70: 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d  E parent SET z =
be80: 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27   'z' WHERE z = '
be90: 66 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79  f'" 1.test_efkey
bea0: 5f 32 39 20 31 32 20 22 55 50 44 41 54 45 20 70  _29 12 "UPDATE p
beb0: 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a  arent SET z = 'z
bec0: 27 20 57 48 45 52 45 20 7a 20 3d 20 27 69 27 22  ' WHERE z = 'i'"
bed0: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bee0: 20 31 33 20 22 55 50 44 41 54 45 20 70 61 72 65   13 "UPDATE pare
bef0: 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57  nt SET z = 'z' W
bf00: 48 45 52 45 20 7a 20 3d 20 27 6c 27 22 20 31 0a  HERE z = 'l'" 1.
bf10: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 34  test_efkey_29 14
bf20: 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20   "UPDATE parent 
bf30: 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52  SET z = 'z' WHER
bf40: 45 20 7a 20 3d 20 27 6f 27 22 20 31 0a 74 65 73  E z = 'o'" 1.tes
bf50: 74 5f 65 66 6b 65 79 5f 32 39 20 31 35 20 22 55  t_efkey_29 15 "U
bf60: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
bf70: 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a   z = 'z' WHERE z
bf80: 20 3d 20 27 72 27 22 20 31 0a 74 65 73 74 5f 65   = 'r'" 1.test_e
bf90: 66 6b 65 79 5f 32 39 20 31 36 20 22 55 50 44 41  fkey_29 16 "UPDA
bfa0: 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20  TE parent SET z 
bfb0: 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20  = 'z' WHERE z = 
bfc0: 27 75 27 22 20 30 0a 74 65 73 74 5f 65 66 6b 65  'u'" 0.test_efke
bfd0: 79 5f 32 39 20 31 37 20 22 43 4f 4d 4d 49 54 22  y_29 17 "COMMIT"
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c010: 39 20 31 38 20 22 52 4f 4c 4c 42 41 43 4b 22 20  9 18 "ROLLBACK" 
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c040: 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  ..test_efkey_29 
c050: 31 37 20 22 42 45 47 49 4e 22 20 20 20 20 20 20  17 "BEGIN"      
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74               0.t
c080: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 38 20  est_efkey_29 18 
c090: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20  "INSERT INTO c1 
c0a0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22  VALUES(1, 2, 3)"
c0b0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c0c0: 5f 65 66 6b 65 79 5f 32 39 20 31 39 20 22 49 4e  _efkey_29 19 "IN
c0d0: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
c0e0: 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20  UES(1, 2, 3)"   
c0f0: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c100: 6b 65 79 5f 32 39 20 32 30 20 22 49 4e 53 45 52  key_29 20 "INSER
c110: 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53  T INTO c3 VALUES
c120: 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20  (1, 2, 3)"      
c130: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c140: 5f 32 39 20 32 31 20 22 49 4e 53 45 52 54 20 49  _29 21 "INSERT I
c150: 4e 54 4f 20 63 34 20 56 41 4c 55 45 53 28 31 2c  NTO c4 VALUES(1,
c160: 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20   2, 3)"         
c170: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
c180: 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   22 "INSERT INTO
c190: 20 63 35 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   c5 VALUES(1, 2,
c1a0: 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a   3)"          1.
c1b0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 32  test_efkey_29 22
c1c0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 36   "INSERT INTO c6
c1d0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
c1e0: 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73  "          1.tes
c1f0: 74 5f 65 66 6b 65 79 5f 32 39 20 32 32 20 22 49  t_efkey_29 22 "I
c200: 4e 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41  NSERT INTO c7 VA
c210: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20  LUES(1, 2, 3)"  
c220: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
c230: 66 6b 65 79 5f 32 39 20 32 33 20 22 43 4f 4d 4d  fkey_29 23 "COMM
c240: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IT"             
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c270: 79 5f 32 39 20 32 34 20 22 49 4e 53 45 52 54 20  y_29 24 "INSERT 
c280: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
c290: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
c2a0: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
c2b0: 39 20 32 35 20 22 43 4f 4d 4d 49 54 22 20 20 20  9 25 "COMMIT"   
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c2e0: 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  ..test_efkey_29 
c2f0: 32 36 20 22 42 45 47 49 4e 22 20 20 20 20 20 20  26 "BEGIN"      
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 20 20 20 20 20 20 30 0a 74               0.t
c320: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 37 20  est_efkey_29 27 
c330: 22 55 50 44 41 54 45 20 63 31 20 53 45 54 20 61  "UPDATE c1 SET a
c340: 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20   = 10"          
c350: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c360: 5f 65 66 6b 65 79 5f 32 39 20 32 38 20 22 55 50  _efkey_29 28 "UP
c370: 44 41 54 45 20 63 32 20 53 45 54 20 61 20 3d 20  DATE c2 SET a = 
c380: 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20  10"             
c390: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c3a0: 6b 65 79 5f 32 39 20 32 39 20 22 55 50 44 41 54  key_29 29 "UPDAT
c3b0: 45 20 63 33 20 53 45 54 20 61 20 3d 20 31 30 22  E c3 SET a = 10"
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c3e0: 5f 32 39 20 33 30 20 22 55 50 44 41 54 45 20 63  _29 30 "UPDATE c
c3f0: 34 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20  4 SET a = 10"   
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
c420: 20 33 31 20 22 55 50 44 41 54 45 20 63 35 20 53   31 "UPDATE c5 S
c430: 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20  ET a = 10"      
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
c450: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 31  test_efkey_29 31
c460: 20 22 55 50 44 41 54 45 20 63 36 20 53 45 54 20   "UPDATE c6 SET 
c470: 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20  a = 10"         
c480: 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73             1.tes
c490: 74 5f 65 66 6b 65 79 5f 32 39 20 33 31 20 22 55  t_efkey_29 31 "U
c4a0: 50 44 41 54 45 20 63 37 20 53 45 54 20 61 20 3d  PDATE c7 SET a =
c4b0: 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20   10"            
c4c0: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
c4d0: 66 6b 65 79 5f 32 39 20 33 32 20 22 43 4f 4d 4d  fkey_29 32 "COMM
c4e0: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IT"             
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c510: 79 5f 32 39 20 33 33 20 22 52 4f 4c 4c 42 41 43  y_29 33 "ROLLBAC
c520: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    0..#----------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c590: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
c5a0: 2d 32 34 34 39 39 2d 35 37 30 37 31 0a 23 0a 23  -24499-57071.#.#
c5b0: 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65   Test an example
c5c0: 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b 65 79   from foreignkey
c5d0: 73 2e 68 74 6d 6c 20 64 65 61 6c 69 6e 67 20 77  s.html dealing w
c5e0: 69 74 68 20 61 20 64 65 66 65 72 72 65 64 20 66  ith a deferred f
c5f0: 6f 72 65 69 67 6e 20 0a 23 20 6b 65 79 20 63 6f  oreign .# key co
c600: 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 6f 5f 74  nstraint..#.do_t
c610: 65 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e 31 20  est e_fkey-35.1 
c620: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
c630: 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  les.  execsql {.
c640: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
c650: 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61   artist(.      a
c660: 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47  rtistid    INTEG
c670: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
c680: 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d  .      artistnam
c690: 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20  e  TEXT.    );. 
c6a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c6b0: 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61  track(.      tra
c6c0: 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52  ckid     INTEGER
c6d0: 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d  ,.      tracknam
c6e0: 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
c6f0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
c700: 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53 20  EGER REFERENCES 
c710: 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29  artist(artistid)
c720: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
c730: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
c740: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64     );.  }.} {}.d
c750: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 35  o_test e_fkey-35
c760: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
c770: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
c780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72    INSERT INTO tr
c790: 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27 57  ack VALUES(1, 'W
c7a0: 68 69 74 65 20 43 68 72 69 73 74 6d 61 73 27 2c  hite Christmas',
c7b0: 20 35 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68   5);.  }.  catch
c7c0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
c7d0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
c7e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
c7f0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
c800: 33 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.3 {.  execsql
c810: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
c820: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
c830: 28 35 2c 20 27 42 69 6e 67 20 43 72 6f 73 62 79  (5, 'Bing Crosby
c840: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
c850: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68  ----.# Verify th
c8b0: 61 74 20 61 20 6e 65 73 74 65 64 20 73 61 76 65  at a nested save
c8c0: 70 6f 69 6e 74 20 6d 61 79 20 62 65 20 72 65 6c  point may be rel
c8d0: 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 73 61  eased without sa
c8e0: 74 69 73 66 79 69 6e 67 20 0a 23 20 64 65 66 65  tisfying .# defe
c8f0: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
c900: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a   constraints..#.
c910: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
c920: 2d 30 37 32 32 33 2d 34 38 33 32 33 20 41 20 6e  -07223-48323 A n
c930: 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 20  ested savepoint 
c940: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
c950: 62 65 0a 23 20 52 45 4c 45 41 53 45 64 20 77 68  be.# RELEASEd wh
c960: 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
c970: 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20 74   is in a state t
c980: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  hat does not sat
c990: 69 73 66 79 20 61 0a 23 20 64 65 66 65 72 72 65  isfy a.# deferre
c9a0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
c9b0: 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 72 6f 70  nstraint..#.drop
c9c0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
c9d0: 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 31 20  est e_fkey-36.1 
c9e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
c9f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ca00: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
ca10: 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e  .      b REFEREN
ca20: 43 45 53 20 74 31 20 44 45 46 45 52 52 41 42 4c  CES t1 DEFERRABL
ca30: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
ca40: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20  RRED.    );.    
ca50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
ca60: 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20  ALUES(1, 1);.   
ca70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ca80: 56 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a 20 20  VALUES(2, 2);.  
ca90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
caa0: 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a 20   VALUES(3, 3);. 
cab0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
cac0: 65 5f 66 6b 65 79 2d 33 36 2e 32 20 7b 0a 20 20  e_fkey-36.2 {.  
cad0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
cae0: 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50  GIN;.      SAVEP
caf0: 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20  OINT one;.      
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 34 2c 20 35 29 3b 0a 20   VALUES(4, 5);. 
cb20: 20 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65       RELEASE one
cb30: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
cb40: 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 33 20 7b  st e_fkey-36.3 {
cb50: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
cb60: 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  IT.} {1 {FOREIGN
cb70: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
cb80: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
cb90: 20 65 5f 66 6b 65 79 2d 33 36 2e 34 20 7b 0a 20   e_fkey-36.4 {. 
cba0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
cbb0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
cbc0: 20 35 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a   5 WHERE a = 4;.
cbd0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
cbe0: 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  } {}...#--------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 61  -.# Check that a
cc40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
cc50: 65 70 6f 69 6e 74 20 28 61 6e 20 6f 75 74 65 72  epoint (an outer
cc60: 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 20 6f  most savepoint o
cc70: 70 65 6e 65 64 20 77 68 65 6e 0a 23 20 74 68 65  pened when.# the
cc80: 20 64 61 74 61 62 61 73 65 20 77 61 73 20 69 6e   database was in
cc90: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
cca0: 65 29 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 6c  e) cannot be rel
ccb0: 65 61 73 65 64 20 77 69 74 68 6f 75 74 0a 23 20  eased without.# 
ccc0: 73 61 74 69 73 66 79 69 6e 67 20 64 65 66 65 72  satisfying defer
ccd0: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
cce0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 74 20  constraints. It 
ccf0: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
cd00: 63 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ck..#.# EVIDENCE
cd10: 2d 4f 46 3a 20 52 2d 34 34 32 39 35 2d 31 33 38  -OF: R-44295-138
cd20: 32 33 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  23 A transaction
cd30: 20 73 61 76 65 70 6f 69 6e 74 20 28 61 20 6e 6f   savepoint (a no
cd40: 6e 2d 6e 65 73 74 65 64 0a 23 20 73 61 76 65 70  n-nested.# savep
cd50: 6f 69 6e 74 20 74 68 61 74 20 77 61 73 20 6f 70  oint that was op
cd60: 65 6e 65 64 20 77 68 69 6c 65 20 74 68 65 72 65  ened while there
cd70: 20 77 61 73 20 6e 6f 74 20 63 75 72 72 65 6e 74   was not current
cd80: 6c 79 20 61 6e 20 6f 70 65 6e 0a 23 20 74 72 61  ly an open.# tra
cd90: 6e 73 61 63 74 69 6f 6e 29 2c 20 6f 6e 20 74 68  nsaction), on th
cda0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 73  e other hand, is
cdb0: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
cdc0: 73 61 6d 65 20 72 65 73 74 72 69 63 74 69 6f 6e  same restriction
cdd0: 73 0a 23 20 61 73 20 61 20 43 4f 4d 4d 49 54 20  s.# as a COMMIT 
cde0: 2d 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  - attempting to 
cdf0: 52 45 4c 45 41 53 45 20 69 74 20 77 68 69 6c 65  RELEASE it while
ce00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
ce10: 20 69 6e 20 73 75 63 68 20 61 0a 23 20 73 74 61   in such a.# sta
ce20: 74 65 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 23 0a  te will fail..#.
ce30: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
ce40: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
ce50: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
ce60: 6f 6e 65 3b 0a 20 20 20 20 20 20 53 41 56 45 50  one;.      SAVEP
ce70: 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20 20  OINT two;.      
ce80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ce90: 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20   VALUES(6, 7);. 
cea0: 20 20 20 20 20 52 45 4c 45 41 53 45 20 74 77 6f       RELEASE two
ceb0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
cec0: 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 32 20 7b  st e_fkey-37.2 {
ced0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c  .  catchsql {REL
cee0: 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 31 20 7b  EASE one}.} {1 {
cef0: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
cf00: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
cf10: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
cf20: 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.3 {.  execsql 
cf30: 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  {.      UPDATE t
cf40: 31 20 53 45 54 20 61 20 3d 20 37 20 57 48 45 52  1 SET a = 7 WHER
cf50: 45 20 61 20 3d 20 36 3b 0a 20 20 20 20 52 45 4c  E a = 6;.    REL
cf60: 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20  EASE one;.  }.} 
cf70: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
cf80: 79 2d 33 37 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-37.4 {.  execs
cf90: 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  ql {.    SAVEPOI
cfa0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 53 41  NT one;.      SA
cfb0: 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20  VEPOINT two;.   
cfc0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
cfd0: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
cfe0: 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41 53 45  );.      RELEASE
cff0: 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   two;.  }.} {}.d
d000: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37  o_test e_fkey-37
d010: 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .5 {.  catchsql 
d020: 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20  {RELEASE one}.} 
d030: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
d040: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d050: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
d060: 65 79 2d 33 37 2e 36 20 7b 0a 20 20 65 78 65 63  ey-37.6 {.  exec
d070: 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 20 54 4f  sql {ROLLBACK TO
d080: 20 6f 6e 65 20 3b 20 52 45 4c 45 41 53 45 20 6f   one ; RELEASE o
d090: 6e 65 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ne}.} {}..#-----
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
d0f0: 20 69 66 20 61 20 43 4f 4d 4d 49 54 20 6f 70 65   if a COMMIT ope
d100: 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 64 75 65  ration fails due
d110: 20 74 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   to deferred for
d120: 65 69 67 6e 20 6b 65 79 20 0a 23 20 63 6f 6e 73  eign key .# cons
d130: 74 72 61 69 6e 74 73 2c 20 61 6e 79 20 6e 65 73  traints, any nes
d140: 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20 72  ted savepoints r
d150: 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 23 20  emain open..#.# 
d160: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d170: 37 37 33 36 2d 34 32 36 31 36 20 49 66 20 61 20  7736-42616 If a 
d180: 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74  COMMIT statement
d190: 20 28 6f 72 20 74 68 65 20 52 45 4c 45 41 53 45   (or the RELEASE
d1a0: 20 6f 66 20 61 0a 23 20 74 72 61 6e 73 61 63 74   of a.# transact
d1b0: 69 6f 6e 20 53 41 56 45 50 4f 49 4e 54 29 20 66  ion SAVEPOINT) f
d1c0: 61 69 6c 73 20 62 65 63 61 75 73 65 20 74 68 65  ails because the
d1d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 75 72   database is cur
d1e0: 72 65 6e 74 6c 79 20 69 6e 20 61 0a 23 20 73 74  rently in a.# st
d1f0: 61 74 65 20 74 68 61 74 20 76 69 6f 6c 61 74 65  ate that violate
d200: 73 20 61 20 64 65 66 65 72 72 65 64 20 66 6f 72  s a deferred for
d210: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
d220: 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
d230: 65 0a 23 20 63 75 72 72 65 6e 74 6c 79 20 6e 65  e.# currently ne
d240: 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 2c  sted savepoints,
d250: 20 74 68 65 20 6e 65 73 74 65 64 20 73 61 76 65   the nested save
d260: 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70  points remain op
d270: 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  en..#.do_test e_
d280: 66 6b 65 79 2d 33 38 2e 31 20 7b 0a 20 20 65 78  fkey-38.1 {.  ex
d290: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
d2a0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
d2b0: 20 61 3e 33 3b 0a 20 20 20 20 53 45 4c 45 43 54   a>3;.    SELECT
d2c0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
d2d0: 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a  } {1 1 2 2 3 3}.
d2e0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
d2f0: 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.2 {.  execsql 
d300: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
d310: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d320: 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a  1 VALUES(4, 4);.
d330: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
d340: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  one;.        INS
d350: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d360: 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 20 20  ES(5, 6);.      
d370: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
d380: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32  t1;.  }.} {1 1 2
d390: 20 32 20 33 20 33 20 34 20 34 20 35 20 36 7d 0a   2 3 3 4 4 5 6}.
d3a0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
d3b0: 38 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  8.3 {.  catchsql
d3c0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f   COMMIT.} {1 {FO
d3d0: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
d3e0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
d3f0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e  _test e_fkey-38.
d400: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
d410: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
d420: 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  one;.    COMMIT;
d430: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
d440: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
d450: 31 20 32 20 32 20 33 20 33 20 34 20 34 7d 0a 0a  1 2 2 3 3 4 4}..
d460: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
d470: 38 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.5 {.  execsql 
d480: 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  {.    SAVEPOINT 
d490: 61 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  a;.      INSERT 
d4a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
d4b0: 2c 20 35 29 3b 0a 20 20 20 20 20 20 53 41 56 45  , 5);.      SAVE
d4c0: 50 4f 49 4e 54 20 62 3b 0a 20 20 20 20 20 20 20  POINT b;.       
d4d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d4e0: 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20 20  VALUES(6, 7);.  
d4f0: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
d500: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53  c;.          INS
d510: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d520: 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 7d 20  ES(7, 8);.  }.} 
d530: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
d540: 79 2d 33 38 2e 36 20 7b 0a 20 20 63 61 74 63 68  y-38.6 {.  catch
d550: 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a  sql {RELEASE a}.
d560: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
d570: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
d580: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
d590: 66 6b 65 79 2d 33 38 2e 37 20 7b 0a 20 20 65 78  fkey-38.7 {.  ex
d5a0: 65 63 73 71 6c 20 20 7b 52 4f 4c 4c 42 41 43 4b  ecsql  {ROLLBACK
d5b0: 20 54 4f 20 63 7d 0a 20 20 63 61 74 63 68 73 71   TO c}.  catchsq
d5c0: 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a 7d 20  l {RELEASE a}.} 
d5d0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
d5e0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d5f0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
d600: 65 79 2d 33 38 2e 38 20 7b 0a 20 20 65 78 65 63  ey-38.8 {.  exec
d610: 73 71 6c 20 20 7b 0a 20 20 20 20 52 4f 4c 4c 42  sql  {.    ROLLB
d620: 41 43 4b 20 54 4f 20 62 3b 0a 20 20 20 20 52 45  ACK TO b;.    RE
d630: 4c 45 41 53 45 20 61 3b 0a 20 20 20 20 53 45 4c  LEASE a;.    SEL
d640: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
d650: 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20   }.} {1 1 2 2 3 
d660: 33 20 34 20 34 20 35 20 35 7d 0a 0a 23 23 23 23  3 4 4 5 5}..####
d670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6b0: 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
d6c0: 49 4f 4e 20 34 2e 33 3a 20 4f 4e 20 44 45 4c 45  ION 4.3: ON DELE
d6d0: 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
d6e0: 20 41 63 74 69 6f 6e 73 0a 23 23 23 23 23 23 23   Actions.#######
d6f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d730: 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d780: 0a 23 20 54 65 73 74 20 74 68 61 74 20 63 6f 6e  .# Test that con
d790: 66 69 67 75 72 65 64 20 4f 4e 20 44 45 4c 45 54  figured ON DELET
d7a0: 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
d7b0: 61 63 74 69 6f 6e 73 20 74 61 6b 65 20 70 6c 61  actions take pla
d7c0: 63 65 20 77 68 65 6e 0a 23 20 64 65 6c 65 74 69  ce when.# deleti
d7d0: 6e 67 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20  ng or modifying 
d7e0: 72 6f 77 73 20 6f 66 20 74 68 65 20 70 61 72 65  rows of the pare
d7f0: 6e 74 20 74 61 62 6c 65 2c 20 72 65 73 70 65 63  nt table, respec
d800: 74 69 76 65 6c 79 2e 0a 23 0a 23 20 45 56 49 44  tively..#.# EVID
d810: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 32 37 30  ENCE-OF: R-48270
d820: 2d 34 34 32 38 32 20 46 6f 72 65 69 67 6e 20 6b  -44282 Foreign k
d830: 65 79 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64  ey ON DELETE and
d840: 20 4f 4e 20 55 50 44 41 54 45 20 63 6c 61 75 73   ON UPDATE claus
d850: 65 73 0a 23 20 61 72 65 20 75 73 65 64 20 74 6f  es.# are used to
d860: 20 63 6f 6e 66 69 67 75 72 65 20 61 63 74 69 6f   configure actio
d870: 6e 73 20 74 68 61 74 20 74 61 6b 65 20 70 6c 61  ns that take pla
d880: 63 65 20 77 68 65 6e 20 64 65 6c 65 74 69 6e 67  ce when deleting
d890: 20 72 6f 77 73 20 66 72 6f 6d 0a 23 20 74 68 65   rows from.# the
d8a0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 28 4f   parent table (O
d8b0: 4e 20 44 45 4c 45 54 45 29 2c 20 6f 72 20 6d 6f  N DELETE), or mo
d8c0: 64 69 66 79 69 6e 67 20 74 68 65 20 70 61 72 65  difying the pare
d8d0: 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f 66  nt key values of
d8e0: 0a 23 20 65 78 69 73 74 69 6e 67 20 72 6f 77 73  .# existing rows
d8f0: 20 28 4f 4e 20 55 50 44 41 54 45 29 2e 0a 23 0a   (ON UPDATE)..#.
d900: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 73 69  # Test that a si
d910: 6e 67 6c 65 20 46 4b 20 63 6f 6e 73 74 72 61 69  ngle FK constrai
d920: 6e 74 20 6d 61 79 20 68 61 76 65 20 64 69 66 66  nt may have diff
d930: 65 72 65 6e 74 20 61 63 74 69 6f 6e 73 20 63 6f  erent actions co
d940: 6e 66 69 67 75 72 65 64 0a 23 20 66 6f 72 20 4f  nfigured.# for O
d950: 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20  N DELETE and ON 
d960: 55 50 44 41 54 45 2e 0a 23 0a 23 20 45 56 49 44  UPDATE..#.# EVID
d970: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 31 32 34  ENCE-OF: R-48124
d980: 2d 36 33 32 32 35 20 41 20 73 69 6e 67 6c 65 20  -63225 A single 
d990: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
d9a0: 74 72 61 69 6e 74 20 6d 61 79 20 68 61 76 65 0a  traint may have.
d9b0: 23 20 64 69 66 66 65 72 65 6e 74 20 61 63 74 69  # different acti
d9c0: 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66  ons configured f
d9d0: 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64  or ON DELETE and
d9e0: 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a 64 6f   ON UPDATE..#.do
d9f0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e  _test e_fkey-39.
da00: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
da10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
da20: 20 70 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20   p(a, b PRIMARY 
da30: 4b 45 59 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  KEY, c);.    CRE
da40: 41 54 45 20 54 41 42 4c 45 20 63 31 28 64 2c 20  ATE TABLE c1(d, 
da50: 65 2c 20 66 20 44 45 46 41 55 4c 54 20 27 6b 30  e, f DEFAULT 'k0
da60: 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 0a  ' REFERENCES p .
da70: 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54 45 20        ON UPDATE 
da80: 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20  SET DEFAULT.    
da90: 20 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20    ON DELETE SET 
daa0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 0a 20 20 20  NULL.    );..   
dab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
dac0: 41 4c 55 45 53 28 30 2c 20 27 6b 30 27 2c 20 27  ALUES(0, 'k0', '
dad0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
dae0: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20  NTO p VALUES(1, 
daf0: 27 6b 31 27 2c 20 27 49 27 29 3b 0a 20 20 20 20  'k1', 'I');.    
db00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
db10: 4c 55 45 53 28 32 2c 20 27 6b 32 27 2c 20 27 49  LUES(2, 'k2', 'I
db20: 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  I');.    INSERT 
db30: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 33 2c  INTO p VALUES(3,
db40: 20 27 6b 33 27 2c 20 27 49 49 49 27 29 3b 0a 0a   'k3', 'III');..
db50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
db60: 63 31 20 56 41 4c 55 45 53 28 31 2c 20 27 78 78  c1 VALUES(1, 'xx
db70: 27 2c 20 27 6b 31 27 29 3b 0a 20 20 20 20 49 4e  ', 'k1');.    IN
db80: 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
db90: 55 45 53 28 32 2c 20 27 78 78 27 2c 20 27 6b 32  UES(2, 'xx', 'k2
dba0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
dbb0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 33 2c  NTO c1 VALUES(3,
dbc0: 20 27 78 78 27 2c 20 27 6b 33 27 29 3b 0a 20 20   'xx', 'k3');.  
dbd0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
dbe0: 5f 66 6b 65 79 2d 33 39 2e 32 20 7b 0a 20 20 65  _fkey-39.2 {.  e
dbf0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
dc00: 41 54 45 20 70 20 53 45 54 20 62 20 3d 20 27 6b  ATE p SET b = 'k
dc10: 34 27 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  4' WHERE a = 1;.
dc20: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
dc30: 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78  M c1;.  }.} {1 x
dc40: 78 20 6b 30 20 32 20 78 78 20 6b 32 20 33 20 78  x k0 2 xx k2 3 x
dc50: 78 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  x k3}.do_test e_
dc60: 66 6b 65 79 2d 33 39 2e 33 20 7b 0a 20 20 65 78  fkey-39.3 {.  ex
dc70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
dc80: 54 45 20 46 52 4f 4d 20 70 20 57 48 45 52 45 20  TE FROM p WHERE 
dc90: 61 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43  a = 2;.    SELEC
dca0: 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  T * FROM c1;.  }
dcb0: 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78  .} {1 xx k0 2 xx
dcc0: 20 7b 7d 20 33 20 78 78 20 6b 33 7d 0a 64 6f 5f   {} 3 xx k3}.do_
dcd0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 34  test e_fkey-39.4
dce0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
dcf0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
dd00: 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70 28 63   INDEX pi ON p(c
dd10: 29 3b 0a 20 20 20 20 52 45 50 4c 41 43 45 20 49  );.    REPLACE I
dd20: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 35 2c 20  NTO p VALUES(5, 
dd30: 27 6b 35 27 2c 20 27 49 49 49 27 29 3b 0a 20 20  'k5', 'III');.  
dd40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
dd50: 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20  c1;.  }.} {1 xx 
dd60: 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78 20  k0 2 xx {} 3 xx 
dd70: 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}}..#----------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ddc0: 23 20 45 61 63 68 20 66 6f 72 65 69 67 6e 20 6b  # Each foreign k
ddd0: 65 79 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  ey in the system
dde0: 20 68 61 73 20 61 6e 20 4f 4e 20 55 50 44 41 54   has an ON UPDAT
ddf0: 45 20 61 6e 64 20 4f 4e 20 44 45 4c 45 54 45 20  E and ON DELETE 
de00: 61 63 74 69 6f 6e 2c 0a 23 20 65 69 74 68 65 72  action,.# either
de10: 20 22 4e 4f 20 41 43 54 49 4f 4e 22 2c 20 22 52   "NO ACTION", "R
de20: 45 53 54 52 49 43 54 22 2c 20 22 53 45 54 20 4e  ESTRICT", "SET N
de30: 55 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41 55  ULL", "SET DEFAU
de40: 4c 54 22 20 6f 72 20 22 43 41 53 43 41 44 45 22  LT" or "CASCADE"
de50: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
de60: 46 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32  F: R-33326-45252
de70: 20 54 68 65 20 4f 4e 20 44 45 4c 45 54 45 20 61   The ON DELETE a
de80: 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  nd ON UPDATE act
de90: 69 6f 6e 0a 23 20 61 73 73 6f 63 69 61 74 65 64  ion.# associated
dea0: 20 77 69 74 68 20 65 61 63 68 20 66 6f 72 65 69   with each forei
deb0: 67 6e 20 6b 65 79 20 69 6e 20 61 6e 20 53 51 4c  gn key in an SQL
dec0: 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20  ite database is 
ded0: 6f 6e 65 20 6f 66 20 22 4e 4f 0a 23 20 41 43 54  one of "NO.# ACT
dee0: 49 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54 22  ION", "RESTRICT"
def0: 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53  , "SET NULL", "S
df00: 45 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20 22  ET DEFAULT" or "
df10: 43 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 49 66  CASCADE"..#.# If
df20: 20 6e 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69   none is specifi
df30: 65 64 20 65 78 70 6c 69 63 69 74 6c 79 2c 20 22  ed explicitly, "
df40: 4e 4f 20 41 43 54 49 4f 4e 22 20 69 73 20 74 68  NO ACTION" is th
df50: 65 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  e default..#.# E
df60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
df70: 38 30 33 2d 34 35 38 38 34 20 49 66 20 61 6e 20  803-45884 If an 
df80: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65 78  action is not ex
df90: 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
dfa0: 65 64 2c 0a 23 20 69 74 20 64 65 66 61 75 6c 74  ed,.# it default
dfb0: 73 20 74 6f 20 22 4e 4f 20 41 43 54 49 4f 4e 22  s to "NO ACTION"
dfc0: 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  ..# .drop_all_ta
dfd0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
dfe0: 6b 65 79 2d 34 30 2e 31 20 7b 0a 20 20 65 78 65  key-40.1 {.  exe
dff0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
e000: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
e010: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
e020: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e030: 4c 45 20 63 68 69 6c 64 31 28 61 2c 20 0a 20 20  LE child1(a, .  
e040: 20 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53      b REFERENCES
e050: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
e060: 45 20 4e 4f 20 41 43 54 49 4f 4e 20 4f 4e 20 44  E NO ACTION ON D
e070: 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a 20  ELETE RESTRICT. 
e080: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
e090: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c   TABLE child2(a,
e0a0: 20 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45   .      b REFERE
e0b0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
e0c0: 50 44 41 54 45 20 52 45 53 54 52 49 43 54 20 4f  PDATE RESTRICT O
e0d0: 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c  N DELETE SET NUL
e0e0: 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  L.    );.    CRE
e0f0: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 33  ATE TABLE child3
e100: 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46  (a, .      b REF
e110: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
e120: 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c  N UPDATE SET NUL
e130: 4c 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  L ON DELETE SET 
e140: 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20  DEFAULT.    );. 
e150: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e160: 63 68 69 6c 64 34 28 61 2c 20 0a 20 20 20 20 20  child4(a, .     
e170: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e180: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53  rent ON UPDATE S
e190: 45 54 20 44 45 46 41 55 4c 54 20 4f 4e 20 44 45  ET DEFAULT ON DE
e1a0: 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20  LETE CASCADE.   
e1b0: 20 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 72 65 61   );..    -- Crea
e1c0: 74 65 20 73 6f 6d 65 20 66 6f 72 65 69 67 6e 20  te some foreign 
e1d0: 6b 65 79 73 20 74 68 61 74 20 75 73 65 20 74 68  keys that use th
e1e0: 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
e1f0: 20 2d 20 22 4e 4f 20 41 43 54 49 4f 4e 22 0a 20   - "NO ACTION". 
e200: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e210: 63 68 69 6c 64 35 28 61 2c 20 62 20 52 45 46 45  child5(a, b REFE
e220: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
e230: 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
e240: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e250: 4c 45 20 63 68 69 6c 64 36 28 61 2c 20 62 20 52  LE child6(a, b R
e260: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e270: 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52   ON DELETE RESTR
e280: 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ICT);.    CREATE
e290: 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28 61 2c   TABLE child7(a,
e2a0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e2b0: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e  rent ON DELETE N
e2c0: 4f 20 41 43 54 49 4f 4e 29 3b 0a 20 20 20 20 43  O ACTION);.    C
e2d0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e2e0: 64 38 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43  d8(a, b REFERENC
e2f0: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
e300: 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a  ATE NO ACTION);.
e310: 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63    }.} {}..foreac
e320: 68 20 7b 74 6e 20 7a 54 61 62 20 6c 52 65 73 7d  h {tn zTab lRes}
e330: 20 7b 0a 20 20 32 20 63 68 69 6c 64 31 20 7b 30   {.  2 child1 {0
e340: 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b   0 parent b {} {
e350: 4e 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53 54 52  NO ACTION} RESTR
e360: 49 43 54 20 4e 4f 4e 45 7d 0a 20 20 33 20 63 68  ICT NONE}.  3 ch
e370: 69 6c 64 32 20 7b 30 20 30 20 70 61 72 65 6e 74  ild2 {0 0 parent
e380: 20 62 20 7b 7d 20 52 45 53 54 52 49 43 54 20 7b   b {} RESTRICT {
e390: 53 45 54 20 4e 55 4c 4c 7d 20 4e 4f 4e 45 7d 0a  SET NULL} NONE}.
e3a0: 20 20 34 20 63 68 69 6c 64 33 20 7b 30 20 30 20    4 child3 {0 0 
e3b0: 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53 45 54  parent b {} {SET
e3c0: 20 4e 55 4c 4c 7d 20 7b 53 45 54 20 44 45 46 41   NULL} {SET DEFA
e3d0: 55 4c 54 7d 20 4e 4f 4e 45 7d 0a 20 20 35 20 63  ULT} NONE}.  5 c
e3e0: 68 69 6c 64 34 20 7b 30 20 30 20 70 61 72 65 6e  hild4 {0 0 paren
e3f0: 74 20 62 20 7b 7d 20 7b 53 45 54 20 44 45 46 41  t b {} {SET DEFA
e400: 55 4c 54 7d 20 43 41 53 43 41 44 45 20 4e 4f 4e  ULT} CASCADE NON
e410: 45 7d 0a 20 20 36 20 63 68 69 6c 64 35 20 7b 30  E}.  6 child5 {0
e420: 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 43   0 parent b {} C
e430: 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54 49 4f  ASCADE {NO ACTIO
e440: 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 37 20 63 68 69  N} NONE}.  7 chi
e450: 6c 64 36 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld6 {0 0 parent 
e460: 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d  b {} {NO ACTION}
e470: 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d 0a   RESTRICT NONE}.
e480: 20 20 38 20 63 68 69 6c 64 37 20 7b 30 20 30 20    8 child7 {0 0 
e490: 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20  parent b {} {NO 
e4a0: 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54 49  ACTION} {NO ACTI
e4b0: 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 39 20 63 68  ON} NONE}.  9 ch
e4c0: 69 6c 64 38 20 7b 30 20 30 20 70 61 72 65 6e 74  ild8 {0 0 parent
e4d0: 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e   b {} {NO ACTION
e4e0: 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f  } {NO ACTION} NO
e4f0: 4e 45 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  NE}.} {.  do_tes
e500: 74 20 65 5f 66 6b 65 79 2d 34 30 2e 24 74 6e 20  t e_fkey-40.$tn 
e510: 7b 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d  { execsql "PRAGM
e520: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69  A foreign_key_li
e530: 73 74 28 24 7a 54 61 62 29 22 20 7d 20 24 6c 52  st($zTab)" } $lR
e540: 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  es.}..#---------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e590: 0a 23 20 54 65 73 74 20 74 68 61 74 20 22 4e 4f  .# Test that "NO
e5a0: 20 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20 74   ACTION" means t
e5b0: 68 61 74 20 6e 6f 74 68 69 6e 67 20 68 61 70 70  hat nothing happ
e5c0: 65 6e 73 20 74 6f 20 61 20 63 68 69 6c 64 20 72  ens to a child r
e5d0: 6f 77 20 77 68 65 6e 0a 23 20 69 74 27 73 20 70  ow when.# it's p
e5e0: 61 72 65 6e 74 20 72 6f 77 20 69 73 20 75 70 64  arent row is upd
e5f0: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  ated or deleted.
e600: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
e610: 3a 20 52 2d 31 39 39 37 31 2d 35 34 39 37 36 20  : R-19971-54976 
e620: 43 6f 6e 66 69 67 75 72 69 6e 67 20 22 4e 4f 20  Configuring "NO 
e630: 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20 6a 75  ACTION" means ju
e640: 73 74 20 74 68 61 74 3a 0a 23 20 77 68 65 6e 20  st that:.# when 
e650: 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20  a parent key is 
e660: 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65  modified or dele
e670: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
e680: 61 62 61 73 65 2c 20 6e 6f 20 73 70 65 63 69 61  abase, no specia
e690: 6c 0a 23 20 61 63 74 69 6f 6e 20 69 73 20 74 61  l.# action is ta
e6a0: 6b 65 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ken..#.drop_all_
e6b0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
e6c0: 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20 20 65  _fkey-41.1 {.  e
e6d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
e6e0: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
e6f0: 28 70 31 2c 20 70 32 2c 20 50 52 49 4d 41 52 59  (p1, p2, PRIMARY
e700: 20 4b 45 59 28 70 31 2c 20 70 32 29 29 3b 0a 20   KEY(p1, p2));. 
e710: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e720: 63 68 69 6c 64 28 63 31 2c 20 63 32 2c 20 0a 20  child(c1, c2, . 
e730: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
e740: 28 63 31 2c 20 63 32 29 20 52 45 46 45 52 45 4e  (c1, c2) REFEREN
e750: 43 45 53 20 70 61 72 65 6e 74 0a 20 20 20 20 20  CES parent.     
e760: 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43   ON UPDATE NO AC
e770: 54 49 4f 4e 0a 20 20 20 20 20 20 4f 4e 20 44 45  TION.      ON DE
e780: 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20  LETE NO ACTION. 
e790: 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20       DEFERRABLE 
e7a0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
e7b0: 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e  ED.    );.    IN
e7c0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
e7d0: 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27   VALUES('j', 'k'
e7e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e7f0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
e800: 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 20 20  ('l', 'm');.    
e810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
e820: 64 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b  d VALUES('j', 'k
e830: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
e840: 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53  NTO child VALUES
e850: 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 7d 0a  ('l', 'm');.  }.
e860: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
e870: 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65 78 65  key-41.2 {.  exe
e880: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
e890: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 70  ;.      UPDATE p
e8a0: 61 72 65 6e 74 20 53 45 54 20 70 31 3d 27 6b 27  arent SET p1='k'
e8b0: 20 57 48 45 52 45 20 70 31 3d 27 6a 27 3b 0a 20   WHERE p1='j';. 
e8c0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
e8d0: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 70 31   parent WHERE p1
e8e0: 3d 27 6c 27 3b 0a 20 20 20 20 20 20 53 45 4c 45  ='l';.      SELE
e8f0: 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 3b  CT * FROM child;
e900: 0a 20 20 7d 0a 7d 20 7b 6a 20 6b 20 6c 20 6d 7d  .  }.} {j k l m}
e910: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
e920: 34 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  41.3 {.  catchsq
e930: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 46  l COMMIT.} {1 {F
e940: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
e950: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
e960: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31  o_test e_fkey-41
e970: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52  .4 {.  execsql R
e980: 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 0a 23 2d  OLLBACK.} {}..#-
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
e9e0: 74 68 61 74 20 22 52 45 53 54 52 49 43 54 22 20  that "RESTRICT" 
e9f0: 6d 65 61 6e 73 20 74 68 65 20 61 70 70 6c 69 63  means the applic
ea00: 61 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62 69  ation is prohibi
ea10: 74 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e  ted from deletin
ea20: 67 0a 23 20 6f 72 20 75 70 64 61 74 69 6e 67 20  g.# or updating 
ea30: 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 72  a parent table r
ea40: 6f 77 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  ow when there ex
ea50: 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
ea60: 20 63 68 69 6c 64 20 6b 65 79 73 0a 23 20 6d 61   child keys.# ma
ea70: 70 70 65 64 20 74 6f 20 69 74 2e 0a 23 0a 23 20  pped to it..#.# 
ea80: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ea90: 34 32 37 32 2d 33 38 36 35 33 20 54 68 65 20 22  4272-38653 The "
eaa0: 52 45 53 54 52 49 43 54 22 20 61 63 74 69 6f 6e  RESTRICT" action
eab0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a   means that the.
eac0: 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73  # application is
ead0: 20 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f 6d   prohibited from
eae0: 20 64 65 6c 65 74 69 6e 67 20 28 66 6f 72 20 4f   deleting (for O
eaf0: 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
eb00: 54 29 20 6f 72 0a 23 20 6d 6f 64 69 66 79 69 6e  T) or.# modifyin
eb10: 67 20 28 66 6f 72 20 4f 4e 20 55 50 44 41 54 45  g (for ON UPDATE
eb20: 20 52 45 53 54 52 49 43 54 29 20 61 20 70 61 72   RESTRICT) a par
eb30: 65 6e 74 20 6b 65 79 20 77 68 65 6e 20 74 68 65  ent key when the
eb40: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 23 20  re exists one.# 
eb50: 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b 65  or more child ke
eb60: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 69 74 2e  ys mapped to it.
eb70: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
eb80: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
eb90: 79 2d 34 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-41.1 {.  execs
eba0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
ebb0: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 70 31 2c  TABLE parent(p1,
ebc0: 20 70 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45   p2);.    CREATE
ebd0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 61   UNIQUE INDEX pa
ebe0: 72 65 6e 74 5f 69 20 4f 4e 20 70 61 72 65 6e 74  rent_i ON parent
ebf0: 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 43 52  (p1, p2);.    CR
ec00: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
ec10: 31 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20  1(c1, c2, .     
ec20: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32 2c   FOREIGN KEY(c2,
ec30: 20 63 31 29 20 52 45 46 45 52 45 4e 43 45 53 20   c1) REFERENCES 
ec40: 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20 4f  parent(p1, p2) O
ec50: 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
ec60: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  T.    );.    CRE
ec70: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
ec80: 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20 20  (c1, c2, .      
ec90: 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32 2c 20  FOREIGN KEY(c2, 
eca0: 63 31 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  c1) REFERENCES p
ecb0: 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20 4f 4e  arent(p1, p2) ON
ecc0: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
ecd0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
ece0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ecf0: 34 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  41.2 {.  execsql
ed00: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
ed10: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
ed20: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
ed30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
ed40: 6e 74 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  nt VALUES('c', '
ed50: 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  d');.    INSERT 
ed60: 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
ed70: 45 53 28 27 62 27 2c 20 27 61 27 29 3b 0a 20 20  ES('b', 'a');.  
ed80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
ed90: 69 6c 64 32 20 56 41 4c 55 45 53 28 27 64 27 2c  ild2 VALUES('d',
eda0: 20 27 63 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a   'c');.  }.} {}.
edb0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
edc0: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
edd0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
ede0: 61 72 65 6e 74 20 57 48 45 52 45 20 70 31 20 3d  arent WHERE p1 =
edf0: 20 27 61 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52   'a' }.} {1 {FOR
ee00: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
ee10: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
ee20: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 34  test e_fkey-41.4
ee30: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
ee40: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
ee50: 54 20 70 32 20 3d 20 27 65 27 20 57 48 45 52 45  T p2 = 'e' WHERE
ee60: 20 70 31 20 3d 20 27 63 27 20 7d 0a 7d 20 7b 31   p1 = 'c' }.} {1
ee70: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
ee80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
ee90: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
eee0: 54 65 73 74 20 74 68 61 74 20 52 45 53 54 52 49  Test that RESTRI
eef0: 43 54 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  CT is slightly d
ef00: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 4e 4f  ifferent from NO
ef10: 20 41 43 54 49 4f 4e 20 66 6f 72 20 49 4d 4d 45   ACTION for IMME
ef20: 44 49 41 54 45 0a 23 20 63 6f 6e 73 74 72 61 69  DIATE.# constrai
ef30: 6e 74 73 2c 20 69 6e 20 74 68 61 74 20 69 74 20  nts, in that it 
ef40: 69 73 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65  is enforced imme
ef50: 64 69 61 74 65 6c 79 2c 20 6e 6f 74 20 61 74 20  diately, not at 
ef60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
ef70: 23 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23  # statement..#.#
ef80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ef90: 33 37 39 39 37 2d 34 32 31 38 37 20 54 68 65 20  37997-42187 The 
efa0: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
efb0: 65 6e 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  en the effect of
efc0: 20 61 0a 23 20 52 45 53 54 52 49 43 54 20 61 63   a.# RESTRICT ac
efd0: 74 69 6f 6e 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  tion and normal 
efe0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
eff0: 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65  traint enforceme
f000: 6e 74 20 69 73 20 74 68 61 74 0a 23 20 74 68 65  nt is that.# the
f010: 20 52 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e   RESTRICT action
f020: 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 70 70   processing happ
f030: 65 6e 73 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ens as soon as t
f040: 68 65 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  he field is upda
f050: 74 65 64 0a 23 20 2d 20 6e 6f 74 20 61 74 20 74  ted.# - not at t
f060: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75  he end of the cu
f070: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
f080: 61 73 20 69 74 20 77 6f 75 6c 64 20 77 69 74 68  as it would with
f090: 20 61 6e 0a 23 20 69 6d 6d 65 64 69 61 74 65 20   an.# immediate 
f0a0: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 61  constraint, or a
f0b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
f0c0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
f0d0: 74 69 6f 6e 20 61 73 20 69 74 0a 23 20 77 6f 75  tion as it.# wou
f0e0: 6c 64 20 77 69 74 68 20 61 20 64 65 66 65 72 72  ld with a deferr
f0f0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23  ed constraint..#
f100: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
f110: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f120: 34 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.1 {.  execsql
f130: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
f140: 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49  BLE parent(x PRI
f150: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
f160: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
f170: 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d1(c REFERENCES 
f180: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
f190: 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20   RESTRICT);.    
f1a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f1b0: 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld2(c REFERENCES
f1c0: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
f1d0: 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20  E NO ACTION);.. 
f1e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f1f0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f200: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
f210: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f220: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
f230: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f240: 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ld1 VALUES('key1
f250: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f260: 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
f270: 53 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20  S('key2');..    
f280: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 70  CREATE TRIGGER p
f290: 61 72 65 6e 74 5f 74 20 41 46 54 45 52 20 55 50  arent_t AFTER UP
f2a0: 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42  DATE ON parent B
f2b0: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
f2c0: 45 20 63 68 69 6c 64 31 20 73 65 74 20 63 20 3d  E child1 set c =
f2d0: 20 6e 65 77 2e 78 20 57 48 45 52 45 20 63 20 3d   new.x WHERE c =
f2e0: 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20 55 50   old.x;.      UP
f2f0: 44 41 54 45 20 63 68 69 6c 64 32 20 73 65 74 20  DATE child2 set 
f300: 63 20 3d 20 6e 65 77 2e 78 20 57 48 45 52 45 20  c = new.x WHERE 
f310: 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 45  c = old.x;.    E
f320: 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ND;.  }.} {}.do_
f330: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 32  test e_fkey-42.2
f340: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
f350: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
f360: 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27 20  T x = 'key one' 
f370: 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27  WHERE x = 'key1'
f380: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
f390: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
f3a0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
f3b0: 20 65 5f 66 6b 65 79 2d 34 32 2e 33 20 7b 0a 20   e_fkey-42.3 {. 
f3c0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
f3d0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
f3e0: 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f 27 20  T x = 'key two' 
f3f0: 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32 27  WHERE x = 'key2'
f400: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
f410: 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20 7d 0a  ROM child2;.  }.
f420: 7d 20 7b 7b 6b 65 79 20 74 77 6f 7d 7d 0a 0a 64  } {{key two}}..d
f430: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
f440: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f450: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
f460: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f470: 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
f480: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
f490: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
f4a0: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
f4b0: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52  rent ON DELETE R
f4c0: 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43 52  ESTRICT);.    CR
f4d0: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
f4e0: 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  2(c REFERENCES p
f4f0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
f500: 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20  NO ACTION);..   
f510: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
f520: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ent VALUES('key1
f530: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f540: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f550: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49  S('key2');.    I
f560: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
f570: 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29  1 VALUES('key1')
f580: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f590: 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28  O child2 VALUES(
f5a0: 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20 43 52  'key2');..    CR
f5b0: 45 41 54 45 20 54 52 49 47 47 45 52 20 70 61 72  EATE TRIGGER par
f5c0: 65 6e 74 5f 74 20 41 46 54 45 52 20 44 45 4c 45  ent_t AFTER DELE
f5d0: 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45 47  TE ON parent BEG
f5e0: 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  IN.      UPDATE 
f5f0: 63 68 69 6c 64 31 20 53 45 54 20 63 20 3d 20 4e  child1 SET c = N
f600: 55 4c 4c 20 57 48 45 52 45 20 63 20 3d 20 6f 6c  ULL WHERE c = ol
f610: 64 2e 78 3b 0a 20 20 20 20 20 20 55 50 44 41 54  d.x;.      UPDAT
f620: 45 20 63 68 69 6c 64 32 20 53 45 54 20 63 20 3d  E child2 SET c =
f630: 20 4e 55 4c 4c 20 57 48 45 52 45 20 63 20 3d 20   NULL WHERE c = 
f640: 6f 6c 64 2e 78 3b 0a 20 20 20 20 45 4e 44 3b 0a  old.x;.    END;.
f650: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
f660: 20 65 5f 66 6b 65 79 2d 34 32 2e 35 20 7b 0a 20   e_fkey-42.5 {. 
f670: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
f680: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
f690: 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20  HERE x = 'key1' 
f6a0: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
f6b0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
f6c0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
f6d0: 65 5f 66 6b 65 79 2d 34 32 2e 36 20 7b 0a 20 20  e_fkey-42.6 {.  
f6e0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44  execsql { .    D
f6f0: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
f700: 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  t WHERE x = 'key
f710: 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2';.    SELECT *
f720: 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20   FROM child2;.  
f730: 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 64 72 6f 70 5f 61  }.} {{}}..drop_a
f740: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
f750: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 37 20 7b 0a  t e_fkey-42.7 {.
f760: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f770: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
f780: 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
f790: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
f7a0: 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45  ABLE child1(c RE
f7b0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
f7c0: 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
f7d0: 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  CT);.    CREATE 
f7e0: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52  TABLE child2(c R
f7f0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
f800: 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43   ON DELETE NO AC
f810: 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45  TION);..    INSE
f820: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f830: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
f840: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f850: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f860: 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y2');.    INSERT
f870: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
f880: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f8a0: 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ld2 VALUES('key2
f8b0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
f8c0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 38  test e_fkey-42.8
f8d0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
f8e0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 61 72  REPLACE INTO par
f8f0: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ent VALUES('key1
f900: 27 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  ') }.} {1 {FOREI
f910: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
f920: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
f930: 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 39 20 7b  st e_fkey-42.9 {
f940: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
f950: 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70    REPLACE INTO p
f960: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f970: 79 32 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  y2');.    SELECT
f980: 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a   * FROM child2;.
f990: 20 20 7d 0a 7d 20 7b 6b 65 79 32 7d 0a 0a 23 2d    }.} {key2}..#-
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
f9f0: 74 68 61 74 20 52 45 53 54 52 49 43 54 20 69 73  that RESTRICT is
fa00: 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65 64 69   enforced immedi
fa10: 61 74 65 6c 79 2c 20 65 76 65 6e 20 66 6f 72 20  ately, even for 
fa20: 61 20 44 45 46 45 52 52 45 44 20 63 6f 6e 73 74  a DEFERRED const
fa30: 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45  raint..#.# EVIDE
fa40: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 31 37 39 2d  NCE-OF: R-24179-
fa50: 36 30 35 32 33 20 45 76 65 6e 20 69 66 20 74 68  60523 Even if th
fa60: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
fa70: 6e 73 74 72 61 69 6e 74 20 69 74 20 69 73 0a 23  nstraint it is.#
fa80: 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 73 20   attached to is 
fa90: 64 65 66 65 72 72 65 64 2c 20 63 6f 6e 66 69 67  deferred, config
faa0: 75 72 69 6e 67 20 61 20 52 45 53 54 52 49 43 54  uring a RESTRICT
fab0: 20 61 63 74 69 6f 6e 20 63 61 75 73 65 73 20 53   action causes S
fac0: 51 4c 69 74 65 0a 23 20 74 6f 20 72 65 74 75 72  QLite.# to retur
fad0: 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
fae0: 69 61 74 65 6c 79 20 69 66 20 61 20 70 61 72 65  iately if a pare
faf0: 6e 74 20 6b 65 79 20 77 69 74 68 20 64 65 70 65  nt key with depe
fb00: 6e 64 65 6e 74 20 63 68 69 6c 64 0a 23 20 6b 65  ndent child.# ke
fb10: 79 73 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ys is deleted or
fb20: 20 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 64 72 6f   modified..#.dro
fb30: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
fb40: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 31  test e_fkey-43.1
fb50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
fb60: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fb70: 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59  parent(x PRIMARY
fb80: 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54   KEY);.    CREAT
fb90: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63  E TABLE child1(c
fba0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
fbb0: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53  nt ON UPDATE RES
fbc0: 54 52 49 43 54 0a 20 20 20 20 20 20 44 45 46 45  TRICT.      DEFE
fbd0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
fbe0: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
fbf0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fc00: 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52  E child2(c REFER
fc10: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
fc20: 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e  UPDATE NO ACTION
fc30: 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c  .      DEFERRABL
fc40: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
fc50: 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20  RRED.    );..   
fc60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
fc70: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ent VALUES('key1
fc80: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fc90: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
fca0: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49  S('key2');.    I
fcb0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
fcc0: 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29  1 VALUES('key1')
fcd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fce0: 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28  O child2 VALUES(
fcf0: 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42 45 47  'key2');.    BEG
fd00: 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  IN;.  }.} {}.do_
fd10: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 32  test e_fkey-43.2
fd20: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
fd30: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
fd40: 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27 20  T x = 'key one' 
fd50: 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27  WHERE x = 'key1'
fd60: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
fd70: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
fd80: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
fd90: 20 65 5f 66 6b 65 79 2d 34 33 2e 33 20 7b 0a 20   e_fkey-43.3 {. 
fda0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
fdb0: 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
fdc0: 20 27 6b 65 79 20 74 77 6f 27 20 57 48 45 52 45   'key two' WHERE
fdd0: 20 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20   x = 'key2' }.} 
fde0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
fdf0: 79 2d 34 33 2e 34 20 7b 0a 20 20 63 61 74 63 68  y-43.4 {.  catch
fe00: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
fe10: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
fe20: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
fe30: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
fe40: 34 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  43.5 {.  execsql
fe50: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63 68   {.    UPDATE ch
fe60: 69 6c 64 32 20 53 45 54 20 63 20 3d 20 27 6b 65  ild2 SET c = 'ke
fe70: 79 20 74 77 6f 27 3b 0a 20 20 20 20 43 4f 4d 4d  y two';.    COMM
fe80: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72  IT;.  }.} {}..dr
fe90: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
fea0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
feb0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
fec0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fed0: 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52   parent(x PRIMAR
fee0: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
fef0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28  TE TABLE child1(
ff00: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  c REFERENCES par
ff10: 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  ent ON DELETE RE
ff20: 53 54 52 49 43 54 0a 20 20 20 20 20 20 44 45 46  STRICT.      DEF
ff30: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
ff40: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
ff50: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ff60: 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45  LE child2(c REFE
ff70: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
ff80: 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f   DELETE NO ACTIO
ff90: 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42  N.      DEFERRAB
ffa0: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
ffb0: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20  ERRED.    );..  
ffc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
ffd0: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
ffe0: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
fff0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
10000 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
10010 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
10020 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  d1 VALUES('key1'
10030 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10040 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
10050 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42 45  ('key2');.    BE
10060 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  GIN;.  }.} {}.do
10070 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
10080 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  7 {.  catchsql {
10090 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72   DELETE FROM par
100a0 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b  ent WHERE x = 'k
100b0 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  ey1' }.} {1 {FOR
100c0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
100d0 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
100e0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 38  test e_fkey-43.8
100f0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
10100 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
10110 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  t WHERE x = 'key
10120 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  2' }.} {}.do_tes
10130 74 20 65 5f 66 6b 65 79 2d 34 33 2e 39 20 7b 0a  t e_fkey-43.9 {.
10140 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
10150 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  T.} {1 {FOREIGN 
10160 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
10170 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
10180 65 5f 66 6b 65 79 2d 34 33 2e 31 30 20 7b 0a 20  e_fkey-43.10 {. 
10190 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
101a0 50 44 41 54 45 20 63 68 69 6c 64 32 20 53 45 54  PDATE child2 SET
101b0 20 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 43   c = NULL;.    C
101c0 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
101d0 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
10220 73 74 20 53 45 54 20 4e 55 4c 4c 20 61 63 74 69  st SET NULL acti
10230 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ons..#.# EVIDENC
10240 45 2d 4f 46 3a 20 52 2d 30 33 33 35 33 2d 30 35  E-OF: R-03353-05
10250 33 32 37 20 49 66 20 74 68 65 20 63 6f 6e 66 69  327 If the confi
10260 67 75 72 65 64 20 61 63 74 69 6f 6e 20 69 73 20  gured action is 
10270 22 53 45 54 20 4e 55 4c 4c 22 2c 0a 23 20 74 68  "SET NULL",.# th
10280 65 6e 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74  en when a parent
10290 20 6b 65 79 20 69 73 20 64 65 6c 65 74 65 64 20   key is deleted 
102a0 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 53  (for ON DELETE S
102b0 45 54 20 4e 55 4c 4c 29 20 6f 72 20 6d 6f 64 69  ET NULL) or modi
102c0 66 69 65 64 0a 23 20 28 66 6f 72 20 4f 4e 20 55  fied.# (for ON U
102d0 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 2c  PDATE SET NULL),
102e0 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63   the child key c
102f0 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f  olumns of all ro
10300 77 73 20 69 6e 20 74 68 65 0a 23 20 63 68 69 6c  ws in the.# chil
10310 64 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 70  d table that map
10320 70 65 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ped to the paren
10330 74 20 6b 65 79 20 61 72 65 20 73 65 74 20 74 6f  t key are set to
10340 20 63 6f 6e 74 61 69 6e 20 53 51 4c 20 4e 55 4c   contain SQL NUL
10350 4c 0a 23 20 76 61 6c 75 65 73 2e 0a 23 0a 64 72  L.# values..#.dr
10360 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
10370 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e  _test e_fkey-44.
10380 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
10390 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
103a0 20 70 41 28 78 20 50 52 49 4d 41 52 59 20 4b 45   pA(x PRIMARY KE
103b0 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
103c0 41 42 4c 45 20 63 41 28 63 20 52 45 46 45 52 45  ABLE cA(c REFERE
103d0 4e 43 45 53 20 70 41 20 4f 4e 20 44 45 4c 45 54  NCES pA ON DELET
103e0 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20  E SET NULL);.   
103f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 42   CREATE TABLE cB
10400 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 41  (c REFERENCES pA
10410 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e   ON UPDATE SET N
10420 55 4c 4c 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  ULL);..    INSER
10430 54 20 49 4e 54 4f 20 70 41 20 56 41 4c 55 45 53  T INTO pA VALUES
10440 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49  (X'ABCD');.    I
10450 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 20 56 41  NSERT INTO pA VA
10460 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20  LUES(X'1234');. 
10470 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10480 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27  A VALUES(X'ABCD'
10490 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
104a0 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27 31  TO cB VALUES(X'1
104b0 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  234');.  }.} {}.
104c0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
104d0 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
104e0 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
104f0 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77 69 64  M pA WHERE rowid
10500 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
10510 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70   quote(x) FROM p
10520 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 31 32 33 34  A;.  }.} {X'1234
10530 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  '}.do_test e_fke
10540 79 2d 34 34 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-44.3 {.  execs
10550 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
10560 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63 41  quote(c) FROM cA
10570 3b 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a 64  ;.  }.} {NULL}.d
10580 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34  o_test e_fkey-44
10590 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
105a0 0a 20 20 20 20 55 50 44 41 54 45 20 70 41 20 53  .    UPDATE pA S
105b0 45 54 20 78 20 3d 20 58 27 38 37 36 35 27 20 57  ET x = X'8765' W
105c0 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32 3b 0a  HERE rowid = 2;.
105d0 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65      SELECT quote
105e0 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d  (x) FROM pA;.  }
105f0 0a 7d 20 7b 58 27 38 37 36 35 27 7d 0a 64 6f 5f  .} {X'8765'}.do_
10600 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 35  test e_fkey-44.5
10610 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
10620 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46  ELECT quote(c) F
10630 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 4e 55 4c 4c  ROM cB }.} {NULL
10640 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10690 54 65 73 74 20 53 45 54 20 44 45 46 41 55 4c 54  Test SET DEFAULT
106a0 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56   actions..#.# EV
106b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 30  IDENCE-OF: R-430
106c0 35 34 2d 35 34 38 33 32 20 54 68 65 20 22 53 45  54-54832 The "SE
106d0 54 20 44 45 46 41 55 4c 54 22 20 61 63 74 69 6f  T DEFAULT" actio
106e0 6e 73 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74  ns are similar t
106f0 6f 0a 23 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20  o.# "SET NULL", 
10700 65 78 63 65 70 74 20 74 68 61 74 20 65 61 63 68  except that each
10710 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65   of the child ke
10720 79 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73 65 74  y columns is set
10730 20 74 6f 0a 23 20 63 6f 6e 74 61 69 6e 20 74 68   to.# contain th
10740 65 20 63 6f 6c 75 6d 6e 73 20 64 65 66 61 75 6c  e columns defaul
10750 74 20 76 61 6c 75 65 20 69 6e 73 74 65 61 64 20  t value instead 
10760 6f 66 20 4e 55 4c 4c 2e 0a 23 0a 64 72 6f 70 5f  of NULL..#.drop_
10770 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
10780 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 31 20 7b  st e_fkey-45.1 {
10790 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
107a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 41   CREATE TABLE pA
107b0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
107c0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
107d0 45 20 63 41 28 63 20 44 45 46 41 55 4c 54 20 58  E cA(c DEFAULT X
107e0 27 30 30 30 30 27 20 52 45 46 45 52 45 4e 43 45  '0000' REFERENCE
107f0 53 20 70 41 20 4f 4e 20 44 45 4c 45 54 45 20 53  S pA ON DELETE S
10800 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 20 20 20  ET DEFAULT);.   
10810 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 42   CREATE TABLE cB
10820 28 63 20 44 45 46 41 55 4c 54 20 58 27 39 39 39  (c DEFAULT X'999
10830 39 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 41  9' REFERENCES pA
10840 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44   ON UPDATE SET D
10850 45 46 41 55 4c 54 29 3b 0a 0a 20 20 20 20 49 4e  EFAULT);..    IN
10860 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f 77  SERT INTO pA(row
10870 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 31 2c  id, x) VALUES(1,
10880 20 58 27 30 30 30 30 27 29 3b 0a 20 20 20 20 49   X'0000');.    I
10890 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f  NSERT INTO pA(ro
108a0 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 32  wid, x) VALUES(2
108b0 2c 20 58 27 39 39 39 39 27 29 3b 0a 20 20 20 20  , X'9999');.    
108c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72  INSERT INTO pA(r
108d0 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28  owid, x) VALUES(
108e0 33 2c 20 58 27 41 42 43 44 27 29 3b 0a 20 20 20  3, X'ABCD');.   
108f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28   INSERT INTO pA(
10900 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53  rowid, x) VALUES
10910 28 34 2c 20 58 27 31 32 33 34 27 29 3b 0a 0a 20  (4, X'1234');.. 
10920 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10930 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27  A VALUES(X'ABCD'
10940 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10950 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27 31  TO cB VALUES(X'1
10960 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  234');.  }.} {}.
10970 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10980 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
10990 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
109a0 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77 69 64  M pA WHERE rowid
109b0 20 3d 20 33 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 3;.    SELECT
109c0 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70   quote(x) FROM p
109d0 41 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  A ORDER BY rowid
109e0 3b 0a 20 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27  ;.  }.} {X'0000'
109f0 20 58 27 39 39 39 39 27 20 58 27 31 32 33 34 27   X'9999' X'1234'
10a00 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10a10 2d 34 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -45.3 {.  execsq
10a20 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65  l { SELECT quote
10a30 28 63 29 20 46 52 4f 4d 20 63 41 20 7d 0a 7d 20  (c) FROM cA }.} 
10a40 7b 58 27 30 30 30 30 27 7d 0a 64 6f 5f 74 65 73  {X'0000'}.do_tes
10a50 74 20 65 5f 66 6b 65 79 2d 34 35 2e 34 20 7b 0a  t e_fkey-45.4 {.
10a60 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10a70 55 50 44 41 54 45 20 70 41 20 53 45 54 20 78 20  UPDATE pA SET x 
10a80 3d 20 58 27 38 37 36 35 27 20 57 48 45 52 45 20  = X'8765' WHERE 
10a90 72 6f 77 69 64 20 3d 20 34 3b 0a 20 20 20 20 53  rowid = 4;.    S
10aa0 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20 46  ELECT quote(x) F
10ab0 52 4f 4d 20 70 41 20 4f 52 44 45 52 20 42 59 20  ROM pA ORDER BY 
10ac0 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b 58 27  rowid;.  }.} {X'
10ad0 30 30 30 30 27 20 58 27 39 39 39 39 27 20 58 27  0000' X'9999' X'
10ae0 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74 20 65  8765'}.do_test e
10af0 5f 66 6b 65 79 2d 34 35 2e 35 20 7b 0a 20 20 65  _fkey-45.5 {.  e
10b00 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
10b10 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63 42  quote(c) FROM cB
10b20 20 7d 0a 7d 20 7b 58 27 39 39 39 39 27 7d 0a 0a   }.} {X'9999'}..
10b30 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
10b80 74 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  t ON DELETE CASC
10b90 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23  ADE actions..#.#
10ba0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10bb0 36 31 33 37 36 2d 35 37 32 36 37 20 41 20 22 43  61376-57267 A "C
10bc0 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 20 70  ASCADE" action p
10bd0 72 6f 70 61 67 61 74 65 73 20 74 68 65 20 64 65  ropagates the de
10be0 6c 65 74 65 20 6f 72 0a 23 20 75 70 64 61 74 65  lete or.# update
10bf0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
10c00 65 20 70 61 72 65 6e 74 20 6b 65 79 20 74 6f 20  e parent key to 
10c10 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74 20 63  each dependent c
10c20 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 23 20 45 56  hild key..#.# EV
10c30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 38  IDENCE-OF: R-618
10c40 30 39 2d 36 32 32 30 37 20 46 6f 72 20 61 6e 20  09-62207 For an 
10c50 22 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41  "ON DELETE CASCA
10c60 44 45 22 20 61 63 74 69 6f 6e 2c 20 74 68 69 73  DE" action, this
10c70 0a 23 20 6d 65 61 6e 73 20 74 68 61 74 20 65 61  .# means that ea
10c80 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 63 68  ch row in the ch
10c90 69 6c 64 20 74 61 62 6c 65 20 74 68 61 74 20 77  ild table that w
10ca0 61 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  as associated wi
10cb0 74 68 20 74 68 65 0a 23 20 64 65 6c 65 74 65 64  th the.# deleted
10cc0 20 70 61 72 65 6e 74 20 72 6f 77 20 69 73 20 61   parent row is a
10cd0 6c 73 6f 20 64 65 6c 65 74 65 64 2e 0a 23 0a 64  lso deleted..#.d
10ce0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
10cf0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36  o_test e_fkey-46
10d00 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
10d10 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
10d20 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55 45  E p1(a, b UNIQUE
10d30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
10d40 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45 4e  BLE c1(c REFEREN
10d50 43 45 53 20 70 31 28 62 29 20 4f 4e 20 44 45 4c  CES p1(b) ON DEL
10d60 45 54 45 20 43 41 53 43 41 44 45 2c 20 64 29 3b  ETE CASCADE, d);
10d70 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10d80 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   p1 VALUES(NULL,
10d90 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45   NULL);.    INSE
10da0 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45  RT INTO p1 VALUE
10db0 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53  S(4, 4);.    INS
10dc0 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
10dd0 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e  ES(5, 5);.    IN
10de0 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
10df0 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
10e00 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10e10 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   c1 VALUES(4, 4)
10e20 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10e30 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O c1 VALUES(5, 5
10e40 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
10e50 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b 0a  unt(*) FROM c1;.
10e60 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73    }.} {3}.do_tes
10e70 74 20 65 5f 66 6b 65 79 2d 34 36 2e 32 20 7b 0a  t e_fkey-46.2 {.
10e80 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10e90 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 20 57  DELETE FROM p1 W
10ea0 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20  HERE a = 4;.    
10eb0 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d  SELECT d, c FROM
10ec0 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b   c1;.  }.} {{} {
10ed0 7d 20 35 20 35 7d 0a 64 6f 5f 74 65 73 74 20 65  } 5 5}.do_test e
10ee0 5f 66 6b 65 79 2d 34 36 2e 33 20 7b 0a 20 20 65  _fkey-46.3 {.  e
10ef0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
10f00 45 54 45 20 46 52 4f 4d 20 70 31 3b 0a 20 20 20  ETE FROM p1;.   
10f10 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
10f20 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  M c1;.  }.} {{} 
10f30 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}}.do_test e_fk
10f40 65 79 2d 34 36 2e 34 20 7b 0a 20 20 65 78 65 63  ey-46.4 {.  exec
10f50 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
10f60 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b 7d 0a 0a 0a  ROM p1 }.} {}...
10f70 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
10fc0 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  t ON UPDATE CASC
10fd0 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23  ADE actions..#.#
10fe0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10ff0 31 33 38 37 37 2d 36 34 35 34 32 20 46 6f 72 20  13877-64542 For 
11000 61 6e 20 22 4f 4e 20 55 50 44 41 54 45 20 43 41  an "ON UPDATE CA
11010 53 43 41 44 45 22 20 61 63 74 69 6f 6e 2c 20 69  SCADE" action, i
11020 74 20 6d 65 61 6e 73 0a 23 20 74 68 61 74 20 74  t means.# that t
11030 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
11040 20 69 6e 20 65 61 63 68 20 64 65 70 65 6e 64 65   in each depende
11050 6e 74 20 63 68 69 6c 64 20 6b 65 79 20 61 72 65  nt child key are
11060 20 6d 6f 64 69 66 69 65 64 20 74 6f 0a 23 20 6d   modified to.# m
11070 61 74 63 68 20 74 68 65 20 6e 65 77 20 70 61 72  atch the new par
11080 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 2e 0a  ent key values..
11090 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
110a0 20 52 2d 36 31 33 37 36 2d 35 37 32 36 37 20 41   R-61376-57267 A
110b0 20 22 43 41 53 43 41 44 45 22 20 61 63 74 69 6f   "CASCADE" actio
110c0 6e 20 70 72 6f 70 61 67 61 74 65 73 20 74 68 65  n propagates the
110d0 20 64 65 6c 65 74 65 20 6f 72 0a 23 20 75 70 64   delete or.# upd
110e0 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ate operation on
110f0 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
11100 74 6f 20 65 61 63 68 20 64 65 70 65 6e 64 65 6e  to each dependen
11110 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 64  t child key..#.d
11120 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
11130 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 37  o_test e_fkey-47
11140 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
11150 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11160 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55 45  E p1(a, b UNIQUE
11170 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
11180 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45 4e  BLE c1(c REFEREN
11190 43 45 53 20 70 31 28 62 29 20 4f 4e 20 55 50 44  CES p1(b) ON UPD
111a0 41 54 45 20 43 41 53 43 41 44 45 2c 20 64 29 3b  ATE CASCADE, d);
111b0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
111c0 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   p1 VALUES(NULL,
111d0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45   NULL);.    INSE
111e0 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45  RT INTO p1 VALUE
111f0 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53  S(4, 4);.    INS
11200 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
11210 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e  ES(5, 5);.    IN
11220 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
11230 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
11240 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11250 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   c1 VALUES(4, 4)
11260 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11270 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O c1 VALUES(5, 5
11280 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
11290 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b 0a  unt(*) FROM c1;.
112a0 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73    }.} {3}.do_tes
112b0 74 20 65 5f 66 6b 65 79 2d 34 37 2e 32 20 7b 0a  t e_fkey-47.2 {.
112c0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
112d0 55 50 44 41 54 45 20 70 31 20 53 45 54 20 62 20  UPDATE p1 SET b 
112e0 3d 20 31 30 20 57 48 45 52 45 20 62 20 3d 20 35  = 10 WHERE b = 5
112f0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20  ;.    SELECT d, 
11300 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  c FROM c1;.  }.}
11310 20 7b 7b 7d 20 7b 7d 20 34 20 34 20 35 20 31 30   {{} {} 4 4 5 10
11320 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
11330 2d 34 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -47.3 {.  execsq
11340 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70  l {.    UPDATE p
11350 31 20 53 45 54 20 62 20 3d 20 31 31 20 57 48 45  1 SET b = 11 WHE
11360 52 45 20 62 20 3d 20 34 3b 0a 20 20 20 20 53 45  RE b = 4;.    SE
11370 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63  LECT d, c FROM c
11380 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20  1;.  }.} {{} {} 
11390 34 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65  4 11 5 10}.do_te
113a0 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 34 20 7b  st e_fkey-47.4 {
113b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
113c0 20 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20    UPDATE p1 SET 
113d0 62 20 3d 20 36 20 57 48 45 52 45 20 62 20 49 53  b = 6 WHERE b IS
113e0 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43   NULL;.    SELEC
113f0 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a  T d, c FROM c1;.
11400 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31    }.} {{} {} 4 1
11410 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20  1 5 10}.do_test 
11420 65 5f 66 6b 65 79 2d 34 36 2e 35 20 7b 0a 20 20  e_fkey-46.5 {.  
11430 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
11440 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b   * FROM p1 }.} {
11450 7b 7d 20 36 20 34 20 31 31 20 35 20 31 30 7d 0a  {} 6 4 11 5 10}.
11460 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
114b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30  IDENCE-OF: R-650
114c0 35 38 2d 35 37 31 35 38 0a 23 0a 23 20 54 65 73  58-57158.#.# Tes
114d0 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f  t an example fro
114e0 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54 45  m the "ON DELETE
114f0 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 41   and ON UPDATE A
11500 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20  ctions" section 
11510 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79  .# of foreignkey
11520 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f 61  s.html..#.drop_a
11530 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
11540 74 20 65 5f 66 6b 65 79 2d 34 38 2e 31 20 7b 0a  t e_fkey-48.1 {.
11550 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11560 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
11570 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
11580 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
11590 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
115a0 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
115b0 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
115c0 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
115d0 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
115e0 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20       INTEGER,.  
115f0 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20      trackname   
11600 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61  TEXT, .      tra
11610 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52  ckartist INTEGER
11620 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74 69   REFERENCES arti
11630 73 74 28 61 72 74 69 73 74 69 64 29 20 4f 4e 20  st(artistid) ON 
11640 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a 20  UPDATE CASCADE. 
11650 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52     );..    INSER
11660 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
11670 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d 61  LUES(1, 'Dean Ma
11680 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  rtin');.    INSE
11690 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
116a0 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b 20  ALUES(2, 'Frank 
116b0 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20 49  Sinatra');.    I
116c0 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
116d0 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68 61   VALUES(11, 'Tha
116e0 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29 3b  t''s Amore', 1);
116f0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11700 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 32   track VALUES(12
11710 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c 75  , 'Christmas Blu
11720 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  es', 1);.    INS
11730 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
11740 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57 61  ALUES(13, 'My Wa
11750 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  y', 2);.  }.} {}
11760 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11770 34 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  48.2 {.  execsql
11780 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61 72   {.    UPDATE ar
11790 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74 69  tist SET artisti
117a0 64 20 3d 20 31 30 30 20 57 48 45 52 45 20 61 72  d = 100 WHERE ar
117b0 74 69 73 74 6e 61 6d 65 20 3d 20 27 44 65 61 6e  tistname = 'Dean
117c0 20 4d 61 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d 20   Martin';.  }.} 
117d0 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
117e0 79 2d 34 38 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-48.3 {.  execs
117f0 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
11800 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b 32  OM artist }.} {2
11810 20 7b 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 7d   {Frank Sinatra}
11820 20 31 30 30 20 7b 44 65 61 6e 20 4d 61 72 74 69   100 {Dean Marti
11830 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  n}}.do_test e_fk
11840 65 79 2d 34 38 2e 34 20 7b 0a 20 20 65 78 65 63  ey-48.4 {.  exec
11850 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
11860 52 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b 31  ROM track }.} {1
11870 31 20 7b 54 68 61 74 27 73 20 41 6d 6f 72 65 7d  1 {That's Amore}
11880 20 31 30 30 20 31 32 20 7b 43 68 72 69 73 74 6d   100 12 {Christm
11890 61 73 20 42 6c 75 65 73 7d 20 31 30 30 20 31 33  as Blues} 100 13
118a0 20 7b 4d 79 20 57 61 79 7d 20 32 7d 0a 0a 0a 23   {My Way} 2}...#
118b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
11900 66 79 20 74 68 61 74 20 61 64 64 69 6e 67 20 61  fy that adding a
11910 6e 20 46 4b 20 61 63 74 69 6f 6e 20 64 6f 65 73  n FK action does
11920 20 6e 6f 74 20 61 62 73 6f 6c 76 65 20 74 68 65   not absolve the
11930 20 75 73 65 72 20 6f 66 20 74 68 65 20 0a 23 20   user of the .# 
11940 72 65 71 75 69 72 65 6d 65 6e 74 20 6e 6f 74 20  requirement not 
11950 74 6f 20 76 69 6f 6c 61 74 65 20 74 68 65 20 66  to violate the f
11960 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
11970 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45  raint..#.# EVIDE
11980 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 36 38 2d  NCE-OF: R-53968-
11990 35 31 36 34 32 20 43 6f 6e 66 69 67 75 72 69 6e  51642 Configurin
119a0 67 20 61 6e 20 4f 4e 20 55 50 44 41 54 45 20 6f  g an ON UPDATE o
119b0 72 20 4f 4e 20 44 45 4c 45 54 45 0a 23 20 61 63  r ON DELETE.# ac
119c0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 65  tion does not me
119d0 61 6e 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  an that the fore
119e0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
119f0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nt does not need
11a00 20 74 6f 0a 23 20 62 65 20 73 61 74 69 73 66 69   to.# be satisfi
11a10 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
11a20 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
11a30 66 6b 65 79 2d 34 39 2e 31 20 7b 0a 20 20 65 78  fkey-49.1 {.  ex
11a40 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
11a50 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
11a60 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  a COLLATE nocase
11a70 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20  , b, c, PRIMARY 
11a80 4b 45 59 28 63 2c 20 61 29 29 3b 0a 20 20 20 20  KEY(c, a));.    
11a90 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
11aa0 6c 64 28 64 20 44 45 46 41 55 4c 54 20 27 61 27  ld(d DEFAULT 'a'
11ab0 2c 20 65 2c 20 66 20 44 45 46 41 55 4c 54 20 27  , e, f DEFAULT '
11ac0 63 27 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47  c',.      FOREIG
11ad0 4e 20 4b 45 59 28 66 2c 20 64 29 20 52 45 46 45  N KEY(f, d) REFE
11ae0 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
11af0 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41   UPDATE SET DEFA
11b00 55 4c 54 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  ULT.    );..    
11b10 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
11b20 6e 74 20 56 41 4c 55 45 53 28 27 41 27 2c 20 27  nt VALUES('A', '
11b30 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 49 4e  b', 'c');.    IN
11b40 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
11b50 20 56 41 4c 55 45 53 28 27 4f 4e 45 27 2c 20 27   VALUES('ONE', '
11b60 74 77 6f 27 2c 20 27 74 68 72 65 65 27 29 3b 0a  two', 'three');.
11b70 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11b80 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6f 6e  child VALUES('on
11b90 65 27 2c 20 27 74 77 6f 27 2c 20 27 74 68 72 65  e', 'two', 'thre
11ba0 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e');.  }.} {}.do
11bb0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e  _test e_fkey-49.
11bc0 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
11bd0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
11be0 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
11bf0 45 54 20 61 20 3d 20 27 27 20 57 48 45 52 45 20  ET a = '' WHERE 
11c00 61 20 3d 20 27 6f 4e 65 27 3b 0a 20 20 20 20 20  a = 'oNe';.     
11c10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
11c20 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 61 20 74  hild;.  }.} {a t
11c30 77 6f 20 63 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  wo c}.do_test e_
11c40 66 6b 65 79 2d 34 39 2e 33 20 7b 0a 20 20 65 78  fkey-49.3 {.  ex
11c50 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
11c60 42 41 43 4b 3b 0a 20 20 20 20 44 45 4c 45 54 45  BACK;.    DELETE
11c70 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
11c80 52 45 20 61 20 3d 20 27 41 27 3b 0a 20 20 20 20  RE a = 'A';.    
11c90 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61  SELECT * FROM pa
11ca0 72 65 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 4f 4e 45  rent;.  }.} {ONE
11cb0 20 74 77 6f 20 74 68 72 65 65 7d 0a 64 6f 5f 74   two three}.do_t
11cc0 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 34 20  est e_fkey-49.4 
11cd0 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  {.  catchsql { U
11ce0 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
11cf0 20 61 20 3d 20 27 27 20 57 48 45 52 45 20 61 20   a = '' WHERE a 
11d00 3d 20 27 6f 4e 65 27 20 7d 0a 7d 20 7b 31 20 7b  = 'oNe' }.} {1 {
11d10 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
11d20 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
11d30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
11d80 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
11d90 38 35 36 2d 31 39 38 33 36 0a 23 0a 23 20 54 65  856-19836.#.# Te
11da0 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
11db0 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54  om the "ON DELET
11dc0 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
11dd0 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e  Actions" section
11de0 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65   .# of foreignke
11df0 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65 78  ys.html. This ex
11e00 61 6d 70 6c 65 20 73 68 6f 77 73 20 74 68 61 74  ample shows that
11e10 20 61 64 64 69 6e 67 20 61 6e 20 22 4f 4e 20 44   adding an "ON D
11e20 45 4c 45 54 45 20 44 45 46 41 55 4c 54 22 0a 23  ELETE DEFAULT".#
11e30 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
11e40 20 61 62 72 6f 67 61 74 65 20 74 68 65 20 6e 65   abrogate the ne
11e50 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
11e60 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
11e70 6e 73 74 72 61 69 6e 74 0a 23 20 28 52 2d 32 38  nstraint.# (R-28
11e80 32 32 30 2d 34 36 36 39 34 29 2e 0a 23 0a 23 20  220-46694)..#.# 
11e90 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
11ea0 38 32 32 30 2d 34 36 36 39 34 20 46 6f 72 20 65  8220-46694 For e
11eb0 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 22 4f  xample, if an "O
11ec0 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46  N DELETE SET DEF
11ed0 41 55 4c 54 22 0a 23 20 61 63 74 69 6f 6e 20 69  AULT".# action i
11ee0 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 62 75  s configured, bu
11ef0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 6f  t there is no ro
11f00 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  w in the parent 
11f10 74 61 62 6c 65 20 74 68 61 74 0a 23 20 63 6f 72  table that.# cor
11f20 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
11f30 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 6f  default values o
11f40 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  f the child key 
11f50 63 6f 6c 75 6d 6e 73 2c 20 64 65 6c 65 74 69 6e  columns, deletin
11f60 67 20 61 0a 23 20 70 61 72 65 6e 74 20 6b 65 79  g a.# parent key
11f70 20 77 68 69 6c 65 20 64 65 70 65 6e 64 65 6e 74   while dependent
11f80 20 63 68 69 6c 64 20 6b 65 79 73 20 65 78 69 73   child keys exis
11f90 74 20 73 74 69 6c 6c 20 63 61 75 73 65 73 20 61  t still causes a
11fa0 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 76   foreign key.# v
11fb0 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 64 72 6f 70  iolation..#.drop
11fc0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
11fd0 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 31 20  est e_fkey-50.1 
11fe0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11ff0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
12000 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74  rtist(.      art
12010 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52  istid    INTEGER
12020 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
12030 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20       artistname 
12040 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20   TEXT.    );.   
12050 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
12060 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b  ack(.      track
12070 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a  id     INTEGER,.
12080 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20        trackname 
12090 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74    TEXT, .      t
120a0 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47  rackartist INTEG
120b0 45 52 20 44 45 46 41 55 4c 54 20 30 20 52 45 46  ER DEFAULT 0 REF
120c0 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61  ERENCES artist(a
120d0 72 74 69 73 74 69 64 29 20 4f 4e 20 44 45 4c 45  rtistid) ON DELE
120e0 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20  TE SET DEFAULT. 
120f0 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
12100 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
12110 55 45 53 28 33 2c 20 27 53 61 6d 6d 79 20 44 61  UES(3, 'Sammy Da
12120 76 69 73 20 4a 72 2e 27 29 3b 0a 20 20 20 20 49  vis Jr.');.    I
12130 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
12140 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e   VALUES(14, 'Mr.
12150 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33 29 3b   Bojangles', 3);
12160 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
12170 74 20 65 5f 66 6b 65 79 2d 35 30 2e 32 20 7b 0a  t e_fkey-50.2 {.
12180 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
12190 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
121a0 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65  WHERE artistname
121b0 20 3d 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20   = 'Sammy Davis 
121c0 4a 72 2e 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  Jr.' }.} {1 {FOR
121d0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
121e0 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
121f0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 33  test e_fkey-50.3
12200 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12210 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
12220 72 74 69 73 74 20 56 41 4c 55 45 53 28 30 2c 20  rtist VALUES(0, 
12230 27 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74 27  'Unknown Artist'
12240 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  );.    DELETE FR
12250 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
12260 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53 61  artistname = 'Sa
12270 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 3b 0a  mmy Davis Jr.';.
12280 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
12290 20 65 5f 66 6b 65 79 2d 35 30 2e 34 20 7b 0a 20   e_fkey-50.4 {. 
122a0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
122b0 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20  T * FROM artist 
122c0 7d 0a 7d 20 7b 30 20 7b 55 6e 6b 6e 6f 77 6e 20  }.} {0 {Unknown 
122d0 41 72 74 69 73 74 7d 7d 0a 64 6f 5f 74 65 73 74  Artist}}.do_test
122e0 20 65 5f 66 6b 65 79 2d 35 30 2e 35 20 7b 0a 20   e_fkey-50.5 {. 
122f0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
12300 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b 20 7d  T * FROM track }
12310 0a 7d 20 7b 31 34 20 7b 4d 72 2e 20 42 6f 6a 61  .} {14 {Mr. Boja
12320 6e 67 6c 65 73 7d 20 30 7d 0a 0a 23 2d 2d 2d 2d  ngles} 0}..#----
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12370 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
12380 2d 4f 46 3a 20 52 2d 30 39 35 36 34 2d 32 32 31  -OF: R-09564-221
12390 37 30 0a 23 0a 23 20 43 68 65 63 6b 20 74 68 61  70.#.# Check tha
123a0 74 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 73  t the order of s
123b0 74 65 70 73 20 69 6e 20 61 6e 20 55 50 44 41 54  teps in an UPDAT
123c0 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 6e 20 61  E or DELETE on a
123d0 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62 6c 65   parent .# table
123e0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
123f0 23 0a 23 20 20 20 31 2e 20 45 78 65 63 75 74 65  #.#   1. Execute
12400 20 61 70 70 6c 69 63 61 62 6c 65 20 42 45 46 4f   applicable BEFO
12410 52 45 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  RE trigger progr
12420 61 6d 73 2c 0a 23 20 20 20 32 2e 20 43 68 65 63  ams,.#   2. Chec
12430 6b 20 6c 6f 63 61 6c 20 28 6e 6f 6e 20 66 6f 72  k local (non for
12440 65 69 67 6e 20 6b 65 79 29 20 63 6f 6e 73 74 72  eign key) constr
12450 61 69 6e 74 73 2c 0a 23 20 20 20 33 2e 20 55 70  aints,.#   3. Up
12460 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20 74  date or delete t
12470 68 65 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61  he row in the pa
12480 72 65 6e 74 20 74 61 62 6c 65 2c 0a 23 20 20 20  rent table,.#   
12490 34 2e 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 72  4. Perform any r
124a0 65 71 75 69 72 65 64 20 66 6f 72 65 69 67 6e 20  equired foreign 
124b0 6b 65 79 20 61 63 74 69 6f 6e 73 2c 0a 23 20 20  key actions,.#  
124c0 20 35 2e 20 45 78 65 63 75 74 65 20 61 70 70 6c   5. Execute appl
124d0 69 63 61 62 6c 65 20 41 46 54 45 52 20 74 72 69  icable AFTER tri
124e0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 0a  gger programs. .
124f0 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
12500 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
12510 2d 35 31 2e 31 20 7b 0a 20 20 70 72 6f 63 20 6d  -51.1 {.  proc m
12520 61 78 70 61 72 65 6e 74 20 7b 61 72 67 73 7d 20  axparent {args} 
12530 7b 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  { db one {SELECT
12540 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 70 61 72   max(x) FROM par
12550 65 6e 74 7d 20 7d 0a 20 20 64 62 20 66 75 6e 63  ent} }.  db func
12560 20 6d 61 78 70 61 72 65 6e 74 20 6d 61 78 70 61   maxparent maxpa
12570 72 65 6e 74 0a 0a 20 20 65 78 65 63 73 71 6c 20  rent..  execsql 
12580 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
12590 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
125a0 41 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20 20 43  ARY KEY);..    C
125b0 52 45 41 54 45 20 54 52 49 47 47 45 52 20 62 75  REATE TRIGGER bu
125c0 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
125d0 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20  N parent BEGIN. 
125e0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
125f0 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 6e   parent VALUES(n
12600 65 77 2e 78 2d 6f 6c 64 2e 78 29 3b 0a 20 20 20  ew.x-old.x);.   
12610 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45   END;.    CREATE
12620 20 54 41 42 4c 45 20 63 68 69 6c 64 28 0a 20 20   TABLE child(.  
12630 20 20 20 20 61 20 44 45 46 41 55 4c 54 20 28 6d      a DEFAULT (m
12640 61 78 70 61 72 65 6e 74 28 29 29 20 52 45 46 45  axparent()) REFE
12650 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
12660 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41   UPDATE SET DEFA
12670 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  ULT.    );.    C
12680 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61 75  REATE TRIGGER au
12690 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
126a0 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20   parent BEGIN.  
126b0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
126c0 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 6e 65  parent VALUES(ne
126d0 77 2e 78 2b 6f 6c 64 2e 78 29 3b 0a 20 20 20 20  w.x+old.x);.    
126e0 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  END;..    INSERT
126f0 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
12700 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45  UES(1);.    INSE
12710 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41  RT INTO child VA
12720 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 7d 20 7b  LUES(1);.  }.} {
12730 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
12740 2d 35 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -51.2 {.  execsq
12750 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70  l {.    UPDATE p
12760 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 32 32  arent SET x = 22
12770 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
12780 52 4f 4d 20 70 61 72 65 6e 74 20 4f 52 44 45 52  ROM parent ORDER
12790 20 42 59 20 72 6f 77 69 64 3b 20 53 45 4c 45 43   BY rowid; SELEC
127a0 54 20 27 78 78 78 27 20 3b 20 53 45 4c 45 43 54  T 'xxx' ; SELECT
127b0 20 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20   a FROM child;. 
127c0 20 7d 0a 7d 20 7b 32 32 20 32 31 20 32 33 20 78   }.} {22 21 23 x
127d0 78 78 20 32 32 7d 0a 64 6f 5f 74 65 73 74 20 65  xx 22}.do_test e
127e0 5f 66 6b 65 79 2d 35 31 2e 33 20 7b 0a 20 20 65  _fkey-51.3 {.  e
127f0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
12800 45 54 45 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a  ETE FROM child;.
12810 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
12820 70 61 72 65 6e 74 3b 0a 20 20 20 20 49 4e 53 45  parent;.    INSE
12830 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
12840 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20 20 49  ALUES(-1);.    I
12850 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
12860 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20   VALUES(-1);.   
12870 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
12880 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20 53  ET x = 22;.    S
12890 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61 72  ELECT * FROM par
128a0 65 6e 74 20 4f 52 44 45 52 20 42 59 20 72 6f 77  ent ORDER BY row
128b0 69 64 3b 20 53 45 4c 45 43 54 20 27 78 78 78 27  id; SELECT 'xxx'
128c0 20 3b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ; SELECT a FROM
128d0 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32   child;.  }.} {2
128e0 32 20 32 33 20 32 31 20 78 78 78 20 32 33 7d 0a  2 23 21 xxx 23}.
128f0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56  ------------.# V
12940 65 72 69 66 79 20 74 68 61 74 20 4f 4e 20 55 50  erify that ON UP
12950 44 41 54 45 20 61 63 74 69 6f 6e 73 20 6f 6e 6c  DATE actions onl
12960 79 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20  y actually take 
12970 70 6c 61 63 65 20 69 66 20 74 68 65 20 70 61 72  place if the par
12980 65 6e 74 20 6b 65 79 0a 23 20 69 73 20 73 65 74  ent key.# is set
12990 20 74 6f 20 61 20 6e 65 77 20 76 61 6c 75 65 20   to a new value 
129a0 74 68 61 74 20 69 73 20 64 69 73 74 69 6e 63 74  that is distinct
129b0 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20 76 61   from the old va
129c0 6c 75 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  lue. The default
129d0 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  .# collation seq
129e0 75 65 6e 63 65 20 61 6e 64 20 61 66 66 69 6e 69  uence and affini
129f0 74 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ty are used to d
12a00 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
12a10 6e 65 77 20 76 61 6c 75 65 0a 23 20 69 73 20 27  new value.# is '
12a20 64 69 73 74 69 6e 63 74 27 20 66 72 6f 6d 20 74  distinct' from t
12a30 68 65 20 6f 6c 64 20 6f 72 20 6e 6f 74 2e 0a 23  he old or not..#
12a40 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
12a50 52 2d 32 37 33 38 33 2d 31 30 32 34 36 20 41 6e  R-27383-10246 An
12a60 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
12a70 6e 20 69 73 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  n is only taken 
12a80 69 66 20 74 68 65 0a 23 20 76 61 6c 75 65 73 20  if the.# values 
12a90 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  of the parent ke
12aa0 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 73  y are modified s
12ab0 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 70  o that the new p
12ac0 61 72 65 6e 74 20 6b 65 79 0a 23 20 76 61 6c 75  arent key.# valu
12ad0 65 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  es are not equal
12ae0 20 74 6f 20 74 68 65 20 6f 6c 64 2e 0a 23 0a 64   to the old..#.d
12af0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
12b00 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32  o_test e_fkey-52
12b10 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
12b20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
12b30 45 20 7a 65 75 73 28 61 20 49 4e 54 45 47 45 52  E zeus(a INTEGER
12b40 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c   COLLATE NOCASE,
12b50 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
12b60 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41  a, b));.    CREA
12b70 54 45 20 54 41 42 4c 45 20 61 70 6f 6c 6c 6f 28  TE TABLE apollo(
12b80 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52  c, d, .      FOR
12b90 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
12ba0 45 46 45 52 45 4e 43 45 53 20 7a 65 75 73 20 4f  EFERENCES zeus O
12bb0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
12bc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
12bd0 52 54 20 49 4e 54 4f 20 7a 65 75 73 20 56 41 4c  RT INTO zeus VAL
12be0 55 45 53 28 27 61 62 63 27 2c 20 27 78 79 7a 27  UES('abc', 'xyz'
12bf0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
12c00 54 4f 20 61 70 6f 6c 6c 6f 20 56 41 4c 55 45 53  TO apollo VALUES
12c10 28 27 41 42 43 27 2c 20 27 78 79 7a 27 29 3b 0a  ('ABC', 'xyz');.
12c20 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
12c30 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73 20      UPDATE zeus 
12c40 53 45 54 20 61 20 3d 20 27 61 42 63 27 3b 0a 20  SET a = 'aBc';. 
12c50 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
12c60 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b   apollo;.  }.} {
12c70 41 42 43 20 78 79 7a 7d 0a 64 6f 5f 74 65 73 74  ABC xyz}.do_test
12c80 20 65 5f 66 6b 65 79 2d 35 32 2e 32 20 7b 0a 20   e_fkey-52.2 {. 
12c90 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
12ca0 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 61  PDATE zeus SET a
12cb0 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20   = 1, b = 1;.   
12cc0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
12cd0 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20  pollo;.  }.} {1 
12ce0 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  1}.do_test e_fke
12cf0 79 2d 35 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-52.3 {.  execs
12d00 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12d10 7a 65 75 73 20 53 45 54 20 61 20 3d 20 31 2c 20  zeus SET a = 1, 
12d20 62 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43  b = 1;.    SELEC
12d30 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20  T typeof(c), c, 
12d40 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f  typeof(d), d FRO
12d50 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20  M apollo;.  }.} 
12d60 7b 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67  {integer 1 integ
12d70 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  er 1}.do_test e_
12d80 66 6b 65 79 2d 35 32 2e 34 20 7b 0a 20 20 65 78  fkey-52.4 {.  ex
12d90 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
12da0 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20  TE zeus SET a = 
12db0 27 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  '1';.    SELECT 
12dc0 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79  typeof(c), c, ty
12dd0 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20  peof(d), d FROM 
12de0 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69  apollo;.  }.} {i
12df0 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67 65 72  nteger 1 integer
12e00 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
12e10 65 79 2d 35 32 2e 35 20 7b 0a 20 20 65 78 65 63  ey-52.5 {.  exec
12e20 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12e30 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 27 31   zeus SET b = '1
12e40 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79  ';.    SELECT ty
12e50 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70 65  peof(c), c, type
12e60 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61 70  of(d), d FROM ap
12e70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74  ollo;.  }.} {int
12e80 65 67 65 72 20 31 20 74 65 78 74 20 31 7d 0a 64  eger 1 text 1}.d
12e90 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32  o_test e_fkey-52
12ea0 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
12eb0 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73  .    UPDATE zeus
12ec0 20 53 45 54 20 62 20 3d 20 4e 55 4c 4c 3b 0a 20   SET b = NULL;. 
12ed0 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66     SELECT typeof
12ee0 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28 64  (c), c, typeof(d
12ef0 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f  ), d FROM apollo
12f00 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72  ;.  }.} {integer
12f10 20 31 20 6e 75 6c 6c 20 7b 7d 7d 0a 0a 23 2d 2d   1 null {}}..#--
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
12f70 43 45 2d 4f 46 3a 20 52 2d 33 35 31 32 39 2d 35  CE-OF: R-35129-5
12f80 38 31 34 31 0a 23 0a 23 20 54 65 73 74 20 61 6e  8141.#.# Test an
12f90 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68   example from th
12fa0 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64  e "ON DELETE and
12fb0 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f   ON UPDATE Actio
12fc0 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f  ns" section .# o
12fd0 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74  f foreignkeys.ht
12fe0 6d 6c 2e 20 54 68 69 73 20 65 78 61 6d 70 6c 65  ml. This example
12ff0 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68   demonstrates th
13000 61 74 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  at ON UPDATE act
13010 69 6f 6e 73 0a 23 20 6f 6e 6c 79 20 74 61 6b 65  ions.# only take
13020 20 70 6c 61 63 65 20 69 66 20 61 74 20 6c 65 61   place if at lea
13030 73 74 20 6f 6e 65 20 70 61 72 65 6e 74 20 6b 65  st one parent ke
13040 79 20 63 6f 6c 75 6d 6e 20 69 73 20 73 65 74 20  y column is set 
13050 74 6f 20 61 20 76 61 6c 75 65 20 0a 23 20 74 68  to a value .# th
13060 61 74 20 69 73 20 64 69 73 74 69 6e 63 74 20 66  at is distinct f
13070 72 6f 6d 20 69 74 73 20 70 72 65 76 69 6f 75 73  rom its previous
13080 20 76 61 6c 75 65 2e 0a 23 0a 64 72 6f 70 5f 61   value..#.drop_a
13090 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
130a0 74 20 65 5f 66 6b 65 79 2d 35 33 2e 31 20 7b 0a  t e_fkey-53.1 {.
130b0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
130c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
130d0 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
130e0 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
130f0 41 42 4c 45 20 63 68 69 6c 64 28 79 20 52 45 46  ABLE child(y REF
13100 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
13110 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c  N UPDATE SET NUL
13120 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  L);.    INSERT I
13130 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
13140 53 28 27 6b 65 79 27 29 3b 0a 20 20 20 20 49 4e  S('key');.    IN
13150 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20  SERT INTO child 
13160 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a 20  VALUES('key');. 
13170 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
13180 65 5f 66 6b 65 79 2d 35 33 2e 32 20 7b 0a 20 20  e_fkey-53.2 {.  
13190 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
131a0 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
131b0 78 20 3d 20 27 6b 65 79 27 3b 0a 20 20 20 20 53  x = 'key';.    S
131c0 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20  ELECT IFNULL(y, 
131d0 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69  'null') FROM chi
131e0 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79 7d 0a  ld;.  }.} {key}.
131f0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
13200 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
13210 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61 72  {.    UPDATE par
13220 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79  ent SET x = 'key
13230 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 49  2';.    SELECT I
13240 46 4e 55 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27 29  FNULL(y, 'null')
13250 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d   FROM child;.  }
13260 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 23 23 23 23  .} {null}..#####
13270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
132a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
132b0 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49  ######.### SECTI
132c0 4f 4e 20 35 3a 20 43 52 45 41 54 45 2c 20 41 4c  ON 5: CREATE, AL
132d0 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54 41 42  TER and DROP TAB
132e0 4c 45 20 63 6f 6d 6d 61 6e 64 73 0a 23 23 23 23  LE commands.####
132f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
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 0a 0a 23 2d 2d 2d 2d 2d 2d  #######..#------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13380 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
13390 70 61 72 65 6e 74 20 6b 65 79 73 20 61 72 65 20  parent keys are 
133a0 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65 6e  not checked when
133b0 20 74 61 62 6c 65 73 20 61 72 65 20 63 72 65 61   tables are crea
133c0 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ted..#.# EVIDENC
133d0 45 2d 4f 46 3a 20 52 2d 33 36 30 31 38 2d 32 31  E-OF: R-36018-21
133e0 37 35 35 20 54 68 65 20 70 61 72 65 6e 74 20 6b  755 The parent k
133f0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ey definitions o
13400 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20  f foreign key.# 
13410 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
13420 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65 6e  not checked when
13430 20 61 20 74 61 62 6c 65 20 69 73 20 63 72 65 61   a table is crea
13440 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ted..#.# EVIDENC
13450 45 2d 4f 46 3a 20 52 2d 32 35 33 38 34 2d 33 39  E-OF: R-25384-39
13460 33 33 37 20 54 68 65 72 65 20 69 73 20 6e 6f 74  337 There is not
13470 68 69 6e 67 20 73 74 6f 70 70 69 6e 67 20 74 68  hing stopping th
13480 65 20 75 73 65 72 20 66 72 6f 6d 0a 23 20 63 72  e user from.# cr
13490 65 61 74 69 6e 67 20 61 20 66 6f 72 65 69 67 6e  eating a foreign
134a0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20   key definition 
134b0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
134c0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68   parent table th
134d0 61 74 0a 23 20 64 6f 65 73 20 6e 6f 74 20 65 78  at.# does not ex
134e0 69 73 74 2c 20 6f 72 20 74 6f 20 70 61 72 65 6e  ist, or to paren
134f0 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 74 68  t key columns th
13500 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  at do not exist 
13510 6f 72 20 61 72 65 20 6e 6f 74 0a 23 20 63 6f 6c  or are not.# col
13520 6c 65 63 74 69 76 65 6c 79 20 62 6f 75 6e 64 20  lectively bound 
13530 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
13540 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
13550 72 61 69 6e 74 2e 0a 23 0a 23 20 43 68 69 6c 64  raint..#.# Child
13560 20 6b 65 79 73 20 61 72 65 20 63 68 65 63 6b 65   keys are checke
13570 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20  d to ensure all 
13580 63 6f 6d 70 6f 6e 65 6e 74 20 63 6f 6c 75 6d 6e  component column
13590 73 20 65 78 69 73 74 2e 20 49 66 20 70 61 72 65  s exist. If pare
135a0 6e 74 0a 23 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  nt.# key columns
135b0 20 61 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20   are explicitly 
135c0 73 70 65 63 69 66 69 65 64 2c 20 53 51 4c 69 74  specified, SQLit
135d0 65 20 63 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65  e checks to make
135e0 20 73 75 72 65 20 74 68 65 72 65 0a 23 20 61 72   sure there.# ar
135f0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
13600 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
13610 74 68 65 20 63 68 69 6c 64 20 61 6e 64 20 70 61  the child and pa
13620 72 65 6e 74 20 6b 65 79 73 2e 20 28 54 4f 44 4f  rent keys. (TODO
13630 3a 20 54 68 69 73 0a 23 20 69 73 20 74 65 73 74  : This.# is test
13640 65 64 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ed but does not 
13650 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e  correspond to an
13660 79 20 74 65 73 74 61 62 6c 65 20 73 74 61 74 65  y testable state
13670 6d 65 6e 74 2e 29 0a 23 0a 23 20 41 6c 73 6f 20  ment.).#.# Also 
13680 74 65 73 74 20 74 68 61 74 20 74 68 65 20 61 62  test that the ab
13690 6f 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ove statements a
136a0 72 65 20 74 72 75 65 20 72 65 67 61 72 64 6c 65  re true regardle
136b0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
136c0 20 6e 6f 74 0a 23 20 66 6f 72 65 69 67 6e 20 6b   not.# foreign k
136d0 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 3a  eys are enabled:
136e0 20 20 22 41 20 43 52 45 41 54 45 20 54 41 42 4c    "A CREATE TABL
136f0 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74  E command operat
13700 65 73 20 74 68 65 20 73 61 6d 65 20 77 68 65 74  es the same whet
13710 68 65 72 0a 23 20 6f 72 20 6e 6f 74 20 66 6f 72  her.# or not for
13720 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
13730 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ints are enabled
13740 2e 22 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  .".#.# EVIDENCE-
13750 4f 46 3a 20 52 2d 30 38 39 30 38 2d 32 33 34 33  OF: R-08908-2343
13760 39 20 41 20 43 52 45 41 54 45 20 54 41 42 4c 45  9 A CREATE TABLE
13770 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74 65   command operate
13780 73 20 74 68 65 20 73 61 6d 65 0a 23 20 77 68 65  s the same.# whe
13790 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65  ther or not fore
137a0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
137b0 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e  nts are enabled.
137c0 0a 23 20 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  .# .foreach {tn 
137d0 7a 43 72 65 61 74 65 54 62 6c 20 6c 52 65 73 7d  zCreateTbl lRes}
137e0 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45 20 54   {.  1 "CREATE T
137f0 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52 45 46  ABLE t1(a, b REF
13800 45 52 45 4e 43 45 53 20 74 31 29 22 20 20 20 20  ERENCES t1)"    
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20          {0 {}}. 
13830 20 32 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   2 "CREATE TABLE
13840 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45 4e   t1(a, b REFEREN
13850 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20  CES t2)"        
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 33 20 22      {0 {}}.  3 "
13880 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
13890 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
138a0 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43 45  Y(a,b) REFERENCE
138b0 53 20 74 31 29 22 20 20 20 20 20 20 20 20 20 20  S t1)"          
138c0 7b 30 20 7b 7d 7d 0a 20 20 34 20 22 43 52 45 41  {0 {}}.  4 "CREA
138d0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
138e0 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
138f0 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  b) REFERENCES t2
13900 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b  )"          {0 {
13910 7d 7d 0a 20 20 35 20 22 43 52 45 41 54 45 20 54  }}.  5 "CREATE T
13920 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f  ABLE t1(a, b, FO
13930 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52  REIGN KEY(a,b) R
13940 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20 20  EFERENCES t2)"  
13950 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20          {0 {}}. 
13960 20 36 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   6 "CREATE TABLE
13970 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47   t1(a, b, FOREIG
13980 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52  N KEY(a,b) REFER
13990 45 4e 43 45 53 20 74 32 28 6e 2c 64 29 29 22 20  ENCES t2(n,d))" 
139a0 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 37 20 22      {0 {}}.  7 "
139b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
139c0 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
139d0 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43 45  Y(a,b) REFERENCE
139e0 53 20 74 31 28 61 2c 62 29 29 22 20 20 20 20 20  S t1(a,b))"     
139f0 7b 30 20 7b 7d 7d 0a 0a 20 20 41 20 22 43 52 45  {0 {}}..  A "CRE
13a00 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13a10 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  b, FOREIGN KEY(c
13a20 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13a30 32 29 22 20 20 20 20 20 20 20 20 20 20 0a 20 20  2)"          .  
13a40 20 20 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 63     {1 {unknown c
13a50 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72  olumn "c" in for
13a60 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
13a70 69 6f 6e 7d 7d 0a 20 20 42 20 22 43 52 45 41 54  ion}}.  B "CREAT
13a80 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
13a90 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 62   FOREIGN KEY(c,b
13aa0 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 28  ) REFERENCES t2(
13ab0 64 29 29 22 20 20 20 20 20 20 20 20 20 20 0a 20  d))"          . 
13ac0 20 20 20 20 7b 31 20 7b 6e 75 6d 62 65 72 20 6f      {1 {number o
13ad0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
13ae0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
13af0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
13b00 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13b10 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
13b20 74 61 62 6c 65 7d 7d 0a 7d 20 7b 0a 20 20 64 6f  table}}.} {.  do
13b30 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e  _test e_fkey-54.
13b40 24 74 6e 2e 6f 66 66 20 7b 0a 20 20 20 20 64 72  $tn.off {.    dr
13b50 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
13b60 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
13b70 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
13b80 20 4f 46 46 7d 0a 20 20 20 20 63 61 74 63 68 73   OFF}.    catchs
13b90 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a 20  ql $zCreateTbl. 
13ba0 20 7d 20 24 6c 52 65 73 0a 20 20 64 6f 5f 74 65   } $lRes.  do_te
13bb0 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24 74 6e  st e_fkey-54.$tn
13bc0 2e 6f 6e 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61  .on {.    drop_a
13bd0 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65 78  ll_tables.    ex
13be0 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f  ecsql {PRAGMA fo
13bf0 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 7d  reign_keys = ON}
13c00 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 24 7a  .    catchsql $z
13c10 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20 24 6c  CreateTbl.  } $l
13c20 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  Res.}..#--------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c70 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
13c80 20 52 2d 34 37 39 35 32 2d 36 32 34 39 38 20 49   R-47952-62498 I
13c90 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
13ca0 65 20 74 6f 20 75 73 65 20 74 68 65 20 22 41 4c  e to use the "AL
13cb0 54 45 52 20 54 41 42 4c 45 0a 23 20 2e 2e 2e 20  TER TABLE.# ... 
13cc0 41 44 44 20 43 4f 4c 55 4d 4e 22 20 73 79 6e 74  ADD COLUMN" synt
13cd0 61 78 20 74 6f 20 61 64 64 20 61 20 63 6f 6c 75  ax to add a colu
13ce0 6d 6e 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  mn that includes
13cf0 20 61 20 52 45 46 45 52 45 4e 43 45 53 0a 23 20   a REFERENCES.# 
13d00 63 6c 61 75 73 65 2c 20 75 6e 6c 65 73 73 20 74  clause, unless t
13d10 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
13d20 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f 6c 75   of the new colu
13d30 6d 6e 20 69 73 20 4e 55 4c 4c 2e 20 41 74 74 65  mn is NULL. Atte
13d40 6d 70 74 69 6e 67 0a 23 20 74 6f 20 64 6f 20 73  mpting.# to do s
13d50 6f 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  o returns an err
13d60 6f 72 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f  or..#.proc test_
13d70 65 66 6b 65 79 5f 36 20 7b 74 6e 20 7a 41 6c 74  efkey_6 {tn zAlt
13d80 65 72 20 69 73 45 72 72 6f 72 7d 20 7b 0a 20 20  er isError} {.  
13d90 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 20  drop_all_tables 
13da0 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..  do_test e_fk
13db0 65 79 2d 35 36 2e 24 74 6e 2e 31 20 22 0a 20 20  ey-56.$tn.1 ".  
13dc0 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
13dd0 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c 20  TE TABLE tbl(a, 
13de0 62 29 20 7d 0a 20 20 20 20 5b 6c 69 73 74 20 63  b) }.    [list c
13df0 61 74 63 68 73 71 6c 20 24 7a 41 6c 74 65 72 5d  atchsql $zAlter]
13e00 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30  .  " [lindex {{0
13e10 20 7b 7d 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20   {}} {1 {Cannot 
13e20 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45 53  add a REFERENCES
13e30 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e   column with non
13e40 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61  -NULL default va
13e50 6c 75 65 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d  lue}}} $isError]
13e60 0a 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f  ..}..test_efkey_
13e70 36 20 31 20 22 41 4c 54 45 52 20 54 41 42 4c 45  6 1 "ALTER TABLE
13e80 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20   tbl ADD COLUMN 
13e90 63 20 52 45 46 45 52 45 4e 43 45 53 20 78 78 22  c REFERENCES xx"
13ea0 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 20   0.test_efkey_6 
13eb0 32 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  2 "ALTER TABLE t
13ec0 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  bl ADD COLUMN c 
13ed0 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46  DEFAULT NULL REF
13ee0 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a 74 65  ERENCES xx" 0.te
13ef0 73 74 5f 65 66 6b 65 79 5f 36 20 33 20 22 41 4c  st_efkey_6 3 "AL
13f00 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20 41 44  TER TABLE tbl AD
13f10 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55  D COLUMN c DEFAU
13f20 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45 53 20  LT 0 REFERENCES 
13f30 78 78 22 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  xx" 1..#--------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 41 4c  -.# Test that AL
13f90 54 45 52 20 54 41 42 4c 45 20 61 64 6a 75 73 74  TER TABLE adjust
13fa0 73 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61  s REFERENCES cla
13fb0 75 73 65 73 20 77 68 65 6e 20 74 68 65 20 70 61  uses when the pa
13fc0 72 65 6e 74 20 74 61 62 6c 65 0a 23 20 69 73 20  rent table.# is 
13fd0 52 45 4e 41 4d 45 44 2e 0a 23 0a 23 20 45 56 49  RENAMED..#.# EVI
13fe0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 30 38  DENCE-OF: R-4708
13ff0 30 2d 30 32 30 36 39 20 49 66 20 61 6e 20 22 41  0-02069 If an "A
14000 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52  LTER TABLE ... R
14010 45 4e 41 4d 45 20 54 4f 22 20 63 6f 6d 6d 61 6e  ENAME TO" comman
14020 64 0a 23 20 69 73 20 75 73 65 64 20 74 6f 20 72  d.# is used to r
14030 65 6e 61 6d 65 20 61 20 74 61 62 6c 65 20 74 68  ename a table th
14040 61 74 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  at is the parent
14050 20 74 61 62 6c 65 20 6f 66 20 6f 6e 65 20 6f 72   table of one or
14060 20 6d 6f 72 65 0a 23 20 66 6f 72 65 69 67 6e 20   more.# foreign 
14070 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  key constraints,
14080 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
14090 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   of the foreign 
140a0 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  key.# constraint
140b0 73 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 74  s are modified t
140c0 6f 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 70  o refer to the p
140d0 61 72 65 6e 74 20 74 61 62 6c 65 20 62 79 20 69  arent table by i
140e0 74 73 20 6e 65 77 20 6e 61 6d 65 0a 23 0a 23 20  ts new name.#.# 
140f0 54 65 73 74 20 74 68 61 74 20 74 68 65 73 65 20  Test that these 
14100 61 64 6a 75 73 74 6d 65 6e 74 73 20 61 72 65 20  adjustments are 
14110 76 69 73 69 62 6c 65 20 69 6e 20 74 68 65 20 73  visible in the s
14120 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14130 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  le..#.# EVIDENCE
14140 2d 4f 46 3a 20 52 2d 36 33 38 32 37 2d 35 34 37  -OF: R-63827-547
14150 37 34 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  74 The text of t
14160 68 65 20 63 68 69 6c 64 20 43 52 45 41 54 45 20  he child CREATE 
14170 54 41 42 4c 45 0a 23 20 73 74 61 74 65 6d 65 6e  TABLE.# statemen
14180 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20  t or statements 
14190 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71  stored in the sq
141a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
141b0 65 20 61 72 65 20 6d 6f 64 69 66 69 65 64 0a 23  e are modified.#
141c0 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
141d0 6e 65 77 20 70 61 72 65 6e 74 20 74 61 62 6c 65  new parent table
141e0 20 6e 61 6d 65 2e 0a 23 0a 64 6f 5f 74 65 73 74   name..#.do_test
141f0 20 65 5f 66 6b 65 79 2d 35 36 2e 31 20 7b 0a 20   e_fkey-56.1 {. 
14200 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
14210 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
14220 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 70   CREATE TABLE 'p
14230 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
14240 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 27 70  (a REFERENCES 'p
14250 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
14260 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
14270 28 62 29 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  (b));..    CREAT
14280 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64 20  E TABLE c1(c, d 
14290 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20  REFERENCES 'p 1 
142a0 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e  "parent one"' ON
142b0 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
142c0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
142d0 4c 45 20 63 32 28 65 2c 20 66 2c 20 46 4f 52 45  LE c2(e, f, FORE
142e0 49 47 4e 20 4b 45 59 28 66 29 20 52 45 46 45 52  IGN KEY(f) REFER
142f0 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72 65  ENCES 'p 1 "pare
14300 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41  nt one"' ON UPDA
14310 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
14320 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33   CREATE TABLE c3
14330 28 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20 46  (e, 'f col 2', F
14340 4f 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63 6f  OREIGN KEY('f co
14350 6c 20 32 27 29 20 52 45 46 45 52 45 4e 43 45 53  l 2') REFERENCES
14360 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e   'p 1 "parent on
14370 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43 41  e"' ON UPDATE CA
14380 53 43 41 44 45 29 3b 0a 0a 20 20 20 20 49 4e 53  SCADE);..    INS
14390 45 52 54 20 49 4e 54 4f 20 27 70 20 31 20 22 70  ERT INTO 'p 1 "p
143a0 61 72 65 6e 74 20 6f 6e 65 22 27 20 56 41 4c 55  arent one"' VALU
143b0 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ES(1, 1);.    IN
143c0 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
143d0 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49  UES(1, 1);.    I
143e0 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
143f0 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20  LUES(1, 1);.    
14400 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56  INSERT INTO c3 V
14410 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 0a 20 20  ALUES(1, 1);..  
14420 20 20 2d 2d 20 43 52 45 41 54 45 20 54 41 42 4c    -- CREATE TABL
14430 45 20 71 28 61 2c 20 62 2c 20 50 52 49 4d 41 52  E q(a, b, PRIMAR
14440 59 20 4b 45 59 28 62 29 29 3b 0a 20 20 7d 0a 7d  Y KEY(b));.  }.}
14450 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
14460 65 79 2d 35 36 2e 32 20 7b 0a 20 20 65 78 65 63  ey-56.2 {.  exec
14470 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
14480 45 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f  E 'p 1 "parent o
14490 6e 65 22 27 20 52 45 4e 41 4d 45 20 54 4f 20 70  ne"' RENAME TO p
144a0 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
144b0 65 5f 66 6b 65 79 2d 35 36 2e 33 20 7b 0a 20 20  e_fkey-56.3 {.  
144c0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
144d0 44 41 54 45 20 70 20 53 45 54 20 61 20 3d 20 27  DATE p SET a = '
144e0 78 78 78 27 2c 20 62 20 3d 20 27 78 78 78 27 3b  xxx', b = 'xxx';
144f0 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
14500 4f 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45 43 54  OM p;.    SELECT
14510 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 20 20   * FROM c1;.    
14520 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 32  SELECT * FROM c2
14530 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
14540 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 7d 20 7b 78  ROM c3;.  }.} {x
14550 78 78 20 78 78 78 20 31 20 78 78 78 20 31 20 78  xx xxx 1 xxx 1 x
14560 78 78 20 31 20 78 78 78 7d 0a 64 6f 5f 74 65 73  xx 1 xxx}.do_tes
14570 74 20 65 5f 66 6b 65 79 2d 35 36 2e 34 20 7b 0a  t e_fkey-56.4 {.
14580 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
14590 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
145a0 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
145b0 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a  type = 'table'}.
145c0 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  } [list         
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
14610 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 70  {CREATE TABLE "p
14620 22 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 22  "(a REFERENCES "
14630 70 22 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  p", b, PRIMARY K
14640 45 59 28 62 29 29 7d 20 20 20 20 20 20 20 20 20  EY(b))}         
14650 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43            \.  {C
14660 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 63  REATE TABLE c1(c
14670 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20 22  , d REFERENCES "
14680 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  p" ON UPDATE CAS
14690 43 41 44 45 29 7d 20 20 20 20 20 20 20 20 20 20  CADE)}          
146a0 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52 45          \.  {CRE
146b0 41 54 45 20 54 41 42 4c 45 20 63 32 28 65 2c 20  ATE TABLE c2(e, 
146c0 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66  f, FOREIGN KEY(f
146d0 29 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22  ) REFERENCES "p"
146e0 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
146f0 44 45 29 7d 20 20 5c 0a 20 20 7b 43 52 45 41 54  DE)}  \.  {CREAT
14700 45 20 54 41 42 4c 45 20 63 33 28 65 2c 20 27 66  E TABLE c3(e, 'f
14710 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45 49 47 4e   col 2', FOREIGN
14720 20 4b 45 59 28 27 66 20 63 6f 6c 20 32 27 29 20   KEY('f col 2') 
14730 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 20 4f  REFERENCES "p" O
14740 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
14750 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  )} \.]..#-------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147a0 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
147b0 61 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f 65  a DROP TABLE doe
147c0 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45  s an implicit DE
147d0 4c 45 54 45 20 46 52 4f 4d 2e 20 57 68 69 63 68  LETE FROM. Which
147e0 20 64 6f 65 73 20 6e 6f 74 0a 23 20 63 61 75 73   does not.# caus
147f0 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 74  e any triggers t
14800 6f 20 66 69 72 65 2c 20 62 75 74 20 64 6f 65 73  o fire, but does
14810 20 66 69 72 65 20 66 6f 72 65 69 67 6e 20 6b 65   fire foreign ke
14820 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45  y actions..#.# E
14830 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
14840 32 30 38 2d 32 33 39 38 36 20 49 66 20 66 6f 72  208-23986 If for
14850 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
14860 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ints are enabled
14870 20 77 68 65 6e 0a 23 20 69 74 20 69 73 20 70 72   when.# it is pr
14880 65 70 61 72 65 64 2c 20 74 68 65 20 44 52 4f 50  epared, the DROP
14890 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 70   TABLE command p
148a0 65 72 66 6f 72 6d 73 20 61 6e 20 69 6d 70 6c 69  erforms an impli
148b0 63 69 74 20 44 45 4c 45 54 45 20 74 6f 0a 23 20  cit DELETE to.# 
148c0 72 65 6d 6f 76 65 20 61 6c 6c 20 72 6f 77 73 20  remove all rows 
148d0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 62  from the table b
148e0 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67 20 69  efore dropping i
148f0 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
14900 4f 46 3a 20 52 2d 31 31 30 37 38 2d 30 33 39 34  OF: R-11078-0394
14910 35 20 54 68 65 20 69 6d 70 6c 69 63 69 74 20 44  5 The implicit D
14920 45 4c 45 54 45 20 64 6f 65 73 20 6e 6f 74 20 63  ELETE does not c
14930 61 75 73 65 20 61 6e 79 20 53 51 4c 0a 23 20 74  ause any SQL.# t
14940 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65 2c  riggers to fire,
14950 20 62 75 74 20 6d 61 79 20 69 6e 76 6f 6b 65 20   but may invoke 
14960 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69  foreign key acti
14970 6f 6e 73 20 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ons or constrain
14980 74 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 0a  t.# violations..
14990 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
149a0 2d 35 37 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61  -57.1 {.  drop_a
149b0 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63  ll_tables.  exec
149c0 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
149d0 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 50   TABLE p(a, b, P
149e0 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29  RIMARY KEY(a, b)
149f0 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
14a00 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46 4f  ABLE c1(c, d, FO
14a10 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
14a20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
14a30 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29  DELETE SET NULL)
14a40 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14a50 4c 45 20 63 32 28 63 2c 20 64 2c 20 46 4f 52 45  LE c2(c, d, FORE
14a60 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45  IGN KEY(c, d) RE
14a70 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
14a80 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  LETE SET DEFAULT
14a90 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14aa0 42 4c 45 20 63 33 28 63 2c 20 64 2c 20 46 4f 52  BLE c3(c, d, FOR
14ab0 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
14ac0 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44  EFERENCES p ON D
14ad0 45 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b 0a  ELETE CASCADE);.
14ae0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14af0 20 63 34 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c4(c, d, FOREIG
14b00 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
14b10 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45  RENCES p ON DELE
14b20 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20  TE RESTRICT);.  
14b30 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14b40 35 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20  5(c, d, FOREIGN 
14b50 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45  KEY(c, d) REFERE
14b60 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45  NCES p ON DELETE
14b70 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20   NO ACTION);..  
14b80 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14b90 36 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46  6(c, d, .      F
14ba0 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14bb0 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14bc0 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
14bd0 20 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42   .      DEFERRAB
14be0 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
14bf0 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20  ERRED.    );.   
14c00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 37   CREATE TABLE c7
14c10 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f  (c, d, .      FO
14c20 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
14c30 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
14c40 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
14c50 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c  .      DEFERRABL
14c60 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
14c70 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20  RRED.    );..   
14c80 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
14c90 67 28 6d 73 67 29 3b 0a 20 20 20 20 43 52 45 41  g(msg);.    CREA
14ca0 54 45 20 54 52 49 47 47 45 52 20 74 74 20 41 46  TE TRIGGER tt AF
14cb0 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70 20  TER DELETE ON p 
14cc0 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
14cd0 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
14ce0 45 53 28 27 64 65 6c 65 74 65 20 27 20 7c 7c 20  ES('delete ' || 
14cf0 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20 20 20  old.rowid);.    
14d00 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  END;.  }.} {}..d
14d10 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14d20 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
14d30 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
14d40 20 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27   p VALUES('a', '
14d50 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
14d60 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27  INTO c1 VALUES('
14d70 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e  a', 'b');.    IN
14d80 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
14d90 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
14da0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
14db0 33 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  3 VALUES('a', 'b
14dc0 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ');.    BEGIN;. 
14dd0 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
14de0 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  p;.      SELECT 
14df0 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  * FROM c1;.  }.}
14e00 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74   {{} {}}.do_test
14e10 20 65 5f 66 6b 65 79 2d 35 37 2e 33 20 7b 0a 20   e_fkey-57.3 {. 
14e20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
14e30 54 20 2a 20 46 52 4f 4d 20 63 32 20 7d 0a 7d 20  T * FROM c2 }.} 
14e40 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20  {{} {}}.do_test 
14e50 65 5f 66 6b 65 79 2d 35 37 2e 34 20 7b 0a 20 20  e_fkey-57.4 {.  
14e60 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
14e70 20 2a 20 46 52 4f 4d 20 63 33 20 7d 0a 7d 20 7b   * FROM c3 }.} {
14e80 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
14e90 2d 35 37 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -57.5 {.  execsq
14ea0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
14eb0 4d 20 6c 6f 67 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  M log }.} {}.do_
14ec0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 36  test e_fkey-57.6
14ed0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52 4f 4c   {.  execsql ROL
14ee0 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  LBACK.} {}.do_te
14ef0 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 37 20 7b  st e_fkey-57.7 {
14f00 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
14f10 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
14f20 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20 20 20  LETE FROM p;.   
14f30 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
14f40 20 6c 6f 67 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   log;.    ROLLBA
14f50 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 64 65 6c 65  CK;.  }.} {{dele
14f60 74 65 20 31 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  te 1}}..#-------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 0a 23 20 49 66 20 61 6e 20 49 4d 4d 45 44  --.# If an IMMED
14fc0 49 41 54 45 20 66 6f 72 65 69 67 6e 20 6b 65 79  IATE foreign key
14fd0 20 66 61 69 6c 73 20 61 73 20 61 20 72 65 73 75   fails as a resu
14fe0 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  lt of a DROP TAB
14ff0 4c 45 2c 20 74 68 65 0a 23 20 44 52 4f 50 20 54  LE, the.# DROP T
15000 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 66 61 69  ABLE command fai
15010 6c 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ls..#.# EVIDENCE
15020 2d 4f 46 3a 20 52 2d 33 32 37 36 38 2d 34 37 39  -OF: R-32768-479
15030 32 35 20 49 66 20 61 6e 20 69 6d 6d 65 64 69 61  25 If an immedia
15040 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
15050 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20 76  onstraint is.# v
15060 69 6f 6c 61 74 65 64 2c 20 74 68 65 20 44 52 4f  iolated, the DRO
15070 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
15080 74 20 66 61 69 6c 73 20 61 6e 64 20 74 68 65 20  t fails and the 
15090 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 64 72 6f  table is not dro
150a0 70 70 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  pped..#.do_test 
150b0 65 5f 66 6b 65 79 2d 35 38 2e 31 20 7b 0a 20 20  e_fkey-58.1 {.  
150c0 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44  execsql { .    D
150d0 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 3b 0a 20  ELETE FROM c1;. 
150e0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
150f0 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  2;.    DELETE FR
15100 4f 4d 20 63 33 3b 0a 20 20 7d 0a 20 20 65 78 65  OM c3;.  }.  exe
15110 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
15120 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27 61 27  TO c5 VALUES('a'
15130 2c 20 27 62 27 29 20 7d 0a 20 20 63 61 74 63 68  , 'b') }.  catch
15140 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
15150 20 70 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49   p }.} {1 {FOREI
15160 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
15170 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
15180 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 32 20 7b  st e_fkey-58.2 {
15190 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
151a0 45 43 54 20 2a 20 46 52 4f 4d 20 70 20 7d 0a 7d  ECT * FROM p }.}
151b0 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20 65   {a b}.do_test e
151c0 5f 66 6b 65 79 2d 35 38 2e 33 20 7b 0a 20 20 63  _fkey-58.3 {.  c
151d0 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42 45  atchsql {.    BE
151e0 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  GIN;.      DROP 
151f0 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20 7b  TABLE p;.  }.} {
15200 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
15210 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
15220 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
15230 79 2d 35 38 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-58.4 {.  execs
15240 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
15250 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53 45  * FROM p;.    SE
15260 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 35 3b 0a  LECT * FROM c5;.
15270 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
15280 7d 0a 7d 20 7b 61 20 62 20 61 20 62 7d 0a 0a 23  }.} {a b a b}..#
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61  ---------.# If a
152e0 20 44 45 46 45 52 52 45 44 20 66 6f 72 65 69 67   DEFERRED foreig
152f0 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20 61  n key fails as a
15300 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52 4f   result of a DRO
15310 50 20 54 41 42 4c 45 2c 20 61 74 74 65 6d 70 74  P TABLE, attempt
15320 69 6e 67 0a 23 20 74 6f 20 63 6f 6d 6d 69 74 20  ing.# to commit 
15330 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15340 66 61 69 6c 73 20 75 6e 6c 65 73 73 20 74 68 65  fails unless the
15350 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 66 69   violation is fi
15360 78 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  xed..#.# EVIDENC
15370 45 2d 4f 46 3a 20 52 2d 30 35 39 30 33 2d 30 38  E-OF: R-05903-08
15380 34 36 30 20 49 66 20 61 20 64 65 66 65 72 72 65  460 If a deferre
15390 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
153a0 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20 76 69  nstraint is.# vi
153b0 6f 6c 61 74 65 64 2c 20 74 68 65 6e 20 61 6e 20  olated, then an 
153c0 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65  error is reporte
153d0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
153e0 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6f 6d 6d  attempts to comm
153f0 69 74 0a 23 20 74 68 65 20 74 72 61 6e 73 61 63  it.# the transac
15400 74 69 6f 6e 20 69 66 20 74 68 65 20 66 6f 72 65  tion if the fore
15410 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
15420 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 73 74  nt violations st
15430 69 6c 6c 20 65 78 69 73 74 0a 23 20 61 74 20 74  ill exist.# at t
15440 68 61 74 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f 5f  hat point..#.do_
15450 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 31  test e_fkey-59.1
15460 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
15470 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
15480 63 31 20 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d  c1 ; DELETE FROM
15490 20 63 32 20 3b 20 44 45 4c 45 54 45 20 46 52 4f   c2 ; DELETE FRO
154a0 4d 20 63 33 20 3b 0a 20 20 20 20 44 45 4c 45 54  M c3 ;.    DELET
154b0 45 20 46 52 4f 4d 20 63 34 20 3b 20 44 45 4c 45  E FROM c4 ; DELE
154c0 54 45 20 46 52 4f 4d 20 63 35 20 3b 20 44 45 4c  TE FROM c5 ; DEL
154d0 45 54 45 20 46 52 4f 4d 20 63 36 20 3b 0a 20 20  ETE FROM c6 ;.  
154e0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 37    DELETE FROM c7
154f0 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   .  }.} {}.do_te
15500 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 32 20 7b  st e_fkey-59.2 {
15510 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
15520 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c 55  ERT INTO c7 VALU
15530 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20  ES('a', 'b') }. 
15540 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
15550 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50  EGIN;.      DROP
15560 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20   TABLE p;.  }.} 
15570 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
15580 79 2d 35 39 2e 33 20 7b 0a 20 20 63 61 74 63 68  y-59.3 {.  catch
15590 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
155a0 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
155b0 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
155c0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
155d0 35 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  59.4 {.  execsql
155e0 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
155f0 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  p(a, b, PRIMARY 
15600 4b 45 59 28 61 2c 20 62 29 29 20 7d 0a 20 20 63  KEY(a, b)) }.  c
15610 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  atchsql COMMIT.}
15620 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
15630 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
15640 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
15650 6b 65 79 2d 35 39 2e 35 20 7b 0a 20 20 65 78 65  key-59.5 {.  exe
15660 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
15670 54 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27 2c  TO p VALUES('a',
15680 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63 73 71   'b') }.  execsq
15690 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23  l COMMIT.} {}..#
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 6e 79 20  ---------.# Any 
156f0 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
15700 6d 61 74 63 68 22 20 65 72 72 6f 72 73 20 65 6e  match" errors en
15710 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
15720 72 75 6e 6e 69 6e 67 20 61 6e 20 69 6d 70 6c 69  running an impli
15730 63 69 74 0a 23 20 22 44 45 4c 45 54 45 20 46 52  cit.# "DELETE FR
15740 4f 4d 20 74 62 6c 22 20 61 72 65 20 69 67 6e 6f  OM tbl" are igno
15750 72 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  red..#.# EVIDENC
15760 45 2d 4f 46 3a 20 52 2d 35 37 32 34 32 2d 33 37  E-OF: R-57242-37
15770 30 30 35 20 41 6e 79 20 22 66 6f 72 65 69 67 6e  005 Any "foreign
15780 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 20 65   key mismatch" e
15790 72 72 6f 72 73 0a 23 20 65 6e 63 6f 75 6e 74 65  rrors.# encounte
157a0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  red as part of a
157b0 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54  n implicit DELET
157c0 45 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23  E are ignored..#
157d0 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
157e0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
157f0 36 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.1 {.  execsql
15800 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f   {.    PRAGMA fo
15810 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
15820 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
15830 42 4c 45 20 70 28 61 20 50 52 49 4d 41 52 59 20  BLE p(a PRIMARY 
15840 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
15850 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29 3b 0a  S nosuchtable);.
15860 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
15870 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c1(c, d, FOREIG
15880 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
15890 52 45 4e 43 45 53 20 61 29 3b 0a 20 20 20 20 43  RENCES a);.    C
158a0 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 63  REATE TABLE c2(c
158b0 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 62 29   REFERENCES p(b)
158c0 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , d);.    CREATE
158d0 20 54 41 42 4c 45 20 63 33 28 63 20 52 45 46 45   TABLE c3(c REFE
158e0 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45  RENCES p ON DELE
158f0 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 64 29 3b  TE SET NULL, d);
15900 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
15910 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20 32 29  O p VALUES(1, 2)
15920 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
15930 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O c1 VALUES(1, 2
15940 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
15950 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20  TO c2 VALUES(1, 
15960 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
15970 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31 2c  NTO c3 VALUES(1,
15980 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   2);.  }.} {}.do
15990 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e  _test e_fkey-60.
159a0 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
159b0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
159c0 65 79 73 20 3d 20 4f 4e 20 7d 0a 20 20 63 61 74  eys = ON }.  cat
159d0 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
159e0 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ROM p }.} {1 {no
159f0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69   such table: mai
15a00 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d 0a  n.nosuchtable}}.
15a10 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15a20 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.3 {.  execsql 
15a30 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
15a40 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b     DROP TABLE p;
15a50 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
15a60 46 52 4f 4d 20 63 33 3b 0a 20 20 20 20 52 4f 4c  FROM c3;.    ROL
15a70 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  LBACK;.  }.} {{}
15a80 20 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   2}.do_test e_fk
15a90 65 79 2d 36 30 2e 34 20 7b 0a 20 20 65 78 65 63  ey-60.4 {.  exec
15aa0 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42  sql { CREATE TAB
15ab0 4c 45 20 6e 6f 73 75 63 68 74 61 62 6c 65 28 78  LE nosuchtable(x
15ac0 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 7d 0a   PRIMARY KEY) }.
15ad0 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
15ae0 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b  ETE FROM p }.} {
15af0 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
15b00 69 73 6d 61 74 63 68 20 2d 20 22 63 32 22 20 72  ismatch - "c2" r
15b10 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d 7d  eferencing "p"}}
15b20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15b30 36 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.5 {.  execsql
15b40 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 63 31   { DROP TABLE c1
15b50 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
15b60 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a  DELETE FROM p }.
15b70 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
15b80 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 32  y mismatch - "c2
15b90 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
15ba0 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  "}}.do_test e_fk
15bb0 65 79 2d 36 30 2e 36 20 7b 0a 20 20 65 78 65 63  ey-60.6 {.  exec
15bc0 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
15bd0 20 63 32 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   c2 }.  execsql 
15be0 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20  { DELETE FROM p 
15bf0 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c40 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  --.# Test that t
15c50 68 65 20 73 70 65 63 69 61 6c 20 62 65 68 61 76  he special behav
15c60 69 6f 72 73 20 6f 66 20 41 4c 54 45 52 20 61 6e  iors of ALTER an
15c70 64 20 44 52 4f 50 20 54 41 42 4c 45 20 61 72 65  d DROP TABLE are
15c80 20 6f 6e 6c 79 0a 23 20 61 63 74 69 76 61 74 65   only.# activate
15c90 64 20 77 68 65 6e 20 66 6f 72 65 69 67 6e 20 6b  d when foreign k
15ca0 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e  eys are enabled.
15cb0 20 53 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   Special behavio
15cc0 72 73 20 61 72 65 3a 0a 23 0a 23 20 20 20 31 2e  rs are:.#.#   1.
15cd0 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6e 6f 74 20   ADD COLUMN not 
15ce0 61 6c 6c 6f 77 69 6e 67 20 61 20 52 45 46 45 52  allowing a REFER
15cf0 45 4e 43 45 53 20 63 6c 61 75 73 65 20 77 69 74  ENCES clause wit
15d00 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 0a 23 20  h a non-NULL .# 
15d10 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c       default val
15d20 75 65 2e 0a 23 20 20 20 32 2e 20 4d 6f 64 69 66  ue..#   2. Modif
15d30 79 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  ying foreign key
15d40 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 77 68 65   definitions whe
15d50 6e 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65  n a parent table
15d60 20 69 73 20 52 45 4e 41 4d 45 64 2e 0a 23 20 20   is RENAMEd..#  
15d70 20 33 2e 20 52 75 6e 6e 69 6e 67 20 61 6e 20 69   3. Running an i
15d80 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20 46  mplicit DELETE F
15d90 52 4f 4d 20 63 6f 6d 6d 61 6e 64 20 61 73 20 70  ROM command as p
15da0 61 72 74 20 6f 66 20 44 52 4f 50 20 54 41 42 4c  art of DROP TABL
15db0 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  E..#.# EVIDENCE-
15dc0 4f 46 3a 20 52 2d 35 34 31 34 32 2d 34 31 33 34  OF: R-54142-4134
15dd0 36 20 54 68 65 20 70 72 6f 70 65 72 74 69 65 73  6 The properties
15de0 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54 41 42   of the DROP TAB
15df0 4c 45 20 61 6e 64 20 41 4c 54 45 52 0a 23 20 54  LE and ALTER.# T
15e00 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 20 64 65  ABLE commands de
15e10 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 6f 6e  scribed above on
15e20 6c 79 20 61 70 70 6c 79 20 69 66 20 66 6f 72 65  ly apply if fore
15e30 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e 61  ign keys are ena
15e40 62 6c 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  bled..#.do_test 
15e50 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 31 20 7b 0a  e_fkey-61.1.1 {.
15e60 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
15e70 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  s.  execsql { CR
15e80 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
15e90 20 62 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c   b) }.  catchsql
15ea0 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
15eb0 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44  1 ADD COLUMN c D
15ec0 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45 46  EFAULT 'xxx' REF
15ed0 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 7d 20 7b  ERENCES t2 }.} {
15ee0 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61 20  1 {Cannot add a 
15ef0 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75 6d  REFERENCES colum
15f00 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20  n with non-NULL 
15f10 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d 0a  default value}}.
15f20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15f30 31 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1.1.2 {.  execsq
15f40 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
15f50 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 20 7d 0a  gn_keys = OFF }.
15f60 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45    execsql { ALTE
15f70 52 20 54 41 42 4c 45 20 74 31 20 41 44 44 20 43  R TABLE t1 ADD C
15f80 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20  OLUMN c DEFAULT 
15f90 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45 53  'xxx' REFERENCES
15fa0 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   t2 }.  execsql 
15fb0 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f  { SELECT sql FRO
15fc0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15fd0 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 74 31  WHERE name = 't1
15fe0 27 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54  ' }.} {{CREATE T
15ff0 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 20  ABLE t1(a, b, c 
16000 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45  DEFAULT 'xxx' RE
16010 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d 0a 64  FERENCES t2)}}.d
16020 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
16030 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
16040 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
16050 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20  n_keys = ON }.} 
16060 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
16070 65 79 2d 36 31 2e 32 2e 31 20 7b 0a 20 20 64 72  ey-61.2.1 {.  dr
16080 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
16090 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
160a0 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55  EATE TABLE p(a U
160b0 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
160c0 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
160d0 45 52 45 4e 43 45 53 20 70 28 61 29 29 3b 0a 20  ERENCES p(a));. 
160e0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
160f0 41 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52 45  ALTER TABLE p RE
16100 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a  NAME TO parent;.
16110 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c        SELECT sql
16120 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
16130 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d  ter WHERE name =
16140 20 27 63 27 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   'c';.    ROLLBA
16150 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41  CK;.  }.} {{CREA
16160 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
16170 45 52 45 4e 43 45 53 20 22 70 61 72 65 6e 74 22  ERENCES "parent"
16180 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  (a))}}.do_test e
16190 5f 66 6b 65 79 2d 36 31 2e 32 2e 32 20 7b 0a 20  _fkey-61.2.2 {. 
161a0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
161b0 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
161c0 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 41 4c  ys = OFF;.    AL
161d0 54 45 52 20 54 41 42 4c 45 20 70 20 52 45 4e 41  TER TABLE p RENA
161e0 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a 20 20  ME TO parent;.  
161f0 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f    SELECT sql FRO
16200 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
16210 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 63 27  WHERE name = 'c'
16220 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45  ;.  }.} {{CREATE
16230 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45 52   TABLE c(b REFER
16240 45 4e 43 45 53 20 70 28 61 29 29 7d 7d 0a 64 6f  ENCES p(a))}}.do
16250 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
16260 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
16270 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
16280 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20 7b  _keys = ON }.} {
16290 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }..do_test e_fke
162a0 79 2d 36 31 2e 33 2e 31 20 7b 0a 20 20 64 72 6f  y-61.3.1 {.  dro
162b0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
162c0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
162d0 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55 4e  ATE TABLE p(a UN
162e0 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
162f0 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45  E TABLE c(b REFE
16300 52 45 4e 43 45 53 20 70 28 61 29 20 4f 4e 20 44  RENCES p(a) ON D
16310 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b  ELETE SET NULL);
16320 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
16330 20 70 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a   p VALUES('x');.
16340 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
16350 63 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a 20  c VALUES('x');. 
16360 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
16370 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
16380 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
16390 4d 20 63 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  M c;.    ROLLBAC
163a0 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f  K;.  }.} {{}}.do
163b0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
163c0 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
163d0 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  {.    PRAGMA for
163e0 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
163f0 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
16400 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  p;.    SELECT * 
16410 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a 7d 20 7b 78  FROM c;.  }.} {x
16420 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
16430 2d 36 31 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  -61.3.3 {.  exec
16440 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
16450 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d  eign_keys = ON }
16460 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23  .} {}..#########
16470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164b0 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 36  ##.### SECTION 6
164c0 3a 20 4c 69 6d 69 74 73 20 61 6e 64 20 55 6e 73  : Limits and Uns
164d0 75 70 70 6f 72 74 65 64 20 46 65 61 74 75 72 65  upported Feature
164e0 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
164f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16520 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16570 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
16580 20 74 68 61 74 20 4d 41 54 43 48 20 63 6c 61 75   that MATCH clau
16590 73 65 73 20 61 72 65 20 70 61 72 73 65 64 2c 20  ses are parsed, 
165a0 62 75 74 20 53 51 4c 69 74 65 20 74 72 65 61 74  but SQLite treat
165b0 73 20 65 76 65 72 79 20 66 6f 72 65 69 67 6e 20  s every foreign 
165c0 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  key.# constraint
165d0 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 22   as if it were "
165e0 4d 41 54 43 48 20 53 49 4d 50 4c 45 22 2e 0a 23  MATCH SIMPLE"..#
165f0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
16600 52 2d 32 34 37 32 38 2d 31 33 32 33 30 20 53 51  R-24728-13230 SQ
16610 4c 69 74 65 20 70 61 72 73 65 73 20 4d 41 54 43  Lite parses MATC
16620 48 20 63 6c 61 75 73 65 73 20 28 69 2e 65 2e 20  H clauses (i.e. 
16630 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 70 6f 72  does not.# repor
16640 74 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  t a syntax error
16650 20 69 66 20 79 6f 75 20 73 70 65 63 69 66 79 20   if you specify 
16660 6f 6e 65 29 2c 20 62 75 74 20 64 6f 65 73 20 6e  one), but does n
16670 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 65 6d 2e  ot enforce them.
16680 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
16690 3a 20 52 2d 32 34 34 35 30 2d 34 36 31 37 34 20  : R-24450-46174 
166a0 41 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  All foreign key 
166b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 53  constraints in S
166c0 51 4c 69 74 65 20 61 72 65 0a 23 20 68 61 6e 64  QLite are.# hand
166d0 6c 65 64 20 61 73 20 69 66 20 4d 41 54 43 48 20  led as if MATCH 
166e0 53 49 4d 50 4c 45 20 77 65 72 65 20 73 70 65 63  SIMPLE were spec
166f0 69 66 69 65 64 2e 0a 23 0a 66 6f 72 65 61 63 68  ified..#.foreach
16700 20 7a 4d 61 74 63 68 20 5b 6c 69 73 74 20 53 49   zMatch [list SI
16710 4d 50 4c 45 20 50 41 52 54 49 41 4c 20 46 55 4c  MPLE PARTIAL FUL
16720 4c 20 53 69 6d 70 6c 65 20 70 61 72 54 49 41 4c  L Simple parTIAL
16730 20 46 75 4c 4c 20 5d 20 7b 0a 20 20 64 72 6f 70   FuLL ] {.  drop
16740 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f  _all_tables.  do
16750 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16760 24 7a 4d 61 74 63 68 2e 31 20 7b 0a 20 20 20 20  $zMatch.1 {.    
16770 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
16780 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61  CREATE TABLE p(a
16790 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20  , b, c, PRIMARY 
167a0 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 20 20  KEY(b, c));.    
167b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
167c0 28 64 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49 47  (d, e, f, FOREIG
167d0 4e 20 4b 45 59 28 65 2c 20 66 29 20 52 45 46 45  N KEY(e, f) REFE
167e0 52 45 4e 43 45 53 20 70 20 4d 41 54 43 48 20 24  RENCES p MATCH $
167f0 7a 4d 61 74 63 68 29 3b 0a 20 20 20 20 22 0a 20  zMatch);.    ". 
16800 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
16810 65 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74 63  e_fkey-62.$zMatc
16820 68 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  h.2 {.    execsq
16830 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
16840 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  p VALUES(1, 2, 3
16850 29 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  )         }..   
16860 20 23 20 4d 41 54 43 48 20 53 49 4d 50 4c 45 20   # MATCH SIMPLE 
16870 62 65 68 61 76 69 6f 72 3a 20 41 6c 6c 6f 77 20  behavior: Allow 
16880 61 6e 79 20 63 68 69 6c 64 20 6b 65 79 20 74 68  any child key th
16890 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  at contains one 
168a0 6f 72 20 6d 6f 72 65 0a 20 20 20 20 23 20 4e 55  or more.    # NU
168b0 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 65 20 69  LL value to be i
168c0 6e 73 65 72 74 65 64 2e 20 4e 6f 6e 2d 4e 55 4c  nserted. Non-NUL
168d0 4c 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f 74 20  L values do not 
168e0 68 61 76 65 20 74 6f 20 6d 61 70 20 74 6f 20 61  have to map to a
168f0 6e 79 0a 20 20 20 20 23 20 70 61 72 65 6e 74 20  ny.    # parent 
16900 6b 65 79 20 76 61 6c 75 65 73 2c 20 73 6f 20 6c  key values, so l
16910 6f 6e 67 20 61 73 20 61 74 20 6c 65 61 73 74 20  ong as at least 
16920 6f 6e 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  one field of the
16930 20 63 68 69 6c 64 20 6b 65 79 20 69 73 0a 20 20   child key is.  
16940 20 20 23 20 4e 55 4c 4c 2e 0a 20 20 20 20 65 78    # NULL..    ex
16950 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
16960 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 77 27  NTO c VALUES('w'
16970 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20 7d 0a  , 2, 3)       }.
16980 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
16990 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
169a0 45 53 28 27 78 27 2c 20 27 78 27 2c 20 4e 55 4c  ES('x', 'x', NUL
169b0 4c 29 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71  L)  }.    execsq
169c0 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
169d0 63 20 56 41 4c 55 45 53 28 27 79 27 2c 20 4e 55  c VALUES('y', NU
169e0 4c 4c 2c 20 27 78 27 29 20 20 7d 0a 20 20 20 20  LL, 'x')  }.    
169f0 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
16a00 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
16a10 7a 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20  z', NULL, NULL) 
16a20 7d 0a 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74  }..    # Check t
16a30 68 61 74 20 74 68 65 20 46 4b 20 69 73 20 65 6e  hat the FK is en
16a40 66 6f 72 63 65 64 20 70 72 6f 70 65 72 6c 79 20  forced properly 
16a50 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
16a60 4e 55 4c 4c 20 76 61 6c 75 65 73 20 0a 20 20 20  NULL values .   
16a70 20 23 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20   # in the child 
16a80 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  key columns..   
16a90 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
16aa0 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
16ab0 28 27 61 27 2c 20 32 2c 20 34 29 20 7d 0a 20 20  ('a', 2, 4) }.  
16ac0 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
16ad0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
16ae0 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  led}}.}..#------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b30 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
16b40 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
16b50 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 54 20  support the SET 
16b60 43 4f 4e 53 54 52 41 49 4e 54 20 73 74 61 74 65  CONSTRAINT state
16b70 6d 65 6e 74 2e 20 41 6e 64 0a 23 20 74 68 61 74  ment. And.# that
16b80 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
16b90 74 6f 20 63 72 65 61 74 65 20 62 6f 74 68 20 69  to create both i
16ba0 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 64 65 66  mmediate and def
16bb0 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
16bc0 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
16bd0 4f 46 3a 20 52 2d 32 31 35 39 39 2d 31 36 30 33  OF: R-21599-1603
16be0 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 61 20 66  8 In SQLite, a f
16bf0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
16c00 72 61 69 6e 74 20 69 73 0a 23 20 70 65 72 6d 61  raint is.# perma
16c10 6e 65 6e 74 6c 79 20 6d 61 72 6b 65 64 20 61 73  nently marked as
16c20 20 64 65 66 65 72 72 65 64 20 6f 72 20 69 6d 6d   deferred or imm
16c30 65 64 69 61 74 65 20 77 68 65 6e 20 69 74 20 69  ediate when it i
16c40 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 72 6f  s created..#.dro
16c50 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
16c60 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 31  test e_fkey-62.1
16c70 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
16c80 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54 53 20  SET CONSTRAINTS 
16c90 41 4c 4c 20 49 4d 4d 45 44 49 41 54 45 20 7d 0a  ALL IMMEDIATE }.
16ca0 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 45 54 22  } {1 {near "SET"
16cb0 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d  : syntax error}}
16cc0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
16cd0 36 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  62.2 {.  catchsq
16ce0 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52 41 49  l { SET CONSTRAI
16cf0 4e 54 53 20 41 4c 4c 20 44 45 46 45 52 52 45 44  NTS ALL DEFERRED
16d00 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53   }.} {1 {near "S
16d10 45 54 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ET": syntax erro
16d20 72 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66  r}}..do_test e_f
16d30 6b 65 79 2d 36 32 2e 33 20 7b 0a 20 20 65 78 65  key-62.3 {.  exe
16d40 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
16d50 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20  E TABLE p(a, b, 
16d60 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
16d70 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
16d80 41 42 4c 45 20 63 64 28 63 2c 20 64 2c 20 0a 20  ABLE cd(c, d, . 
16d90 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
16da0 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
16db0 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20 49  S p DEFERRABLE I
16dc0 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
16dd0 44 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  D);.    CREATE T
16de0 41 42 4c 45 20 63 69 28 63 2c 20 64 2c 20 0a 20  ABLE ci(c, d, . 
16df0 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
16e00 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
16e10 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20 49  S p DEFERRABLE I
16e20 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
16e30 54 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  TE);.    BEGIN;.
16e40 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
16e50 20 65 5f 66 6b 65 79 2d 36 32 2e 34 20 7b 0a 20   e_fkey-62.4 {. 
16e60 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
16e70 52 54 20 49 4e 54 4f 20 63 69 20 56 41 4c 55 45  RT INTO ci VALUE
16e80 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d 20  S('x', 'y') }.} 
16e90 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
16ea0 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
16eb0 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
16ec0 65 79 2d 36 32 2e 35 20 7b 0a 20 20 63 61 74 63  ey-62.5 {.  catc
16ed0 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
16ee0 54 4f 20 63 64 20 56 41 4c 55 45 53 28 27 78 27  TO cd VALUES('x'
16ef0 2c 20 27 79 27 29 20 7d 0a 7d 20 7b 30 20 7b 7d  , 'y') }.} {0 {}
16f00 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
16f10 2d 36 32 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  -62.6 {.  catchs
16f20 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20  ql { COMMIT }.} 
16f30 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
16f40 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
16f50 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
16f60 65 79 2d 36 32 2e 37 20 7b 0a 20 20 65 78 65 63  ey-62.7 {.  exec
16f70 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54  sql { .    DELET
16f80 45 20 46 52 4f 4d 20 63 64 3b 0a 20 20 20 20 43  E FROM cd;.    C
16f90 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
16fa0 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
16ff0 73 74 20 74 68 61 74 20 74 68 65 20 6d 61 78 69  st that the maxi
17000 6d 75 6d 20 72 65 63 75 72 73 69 6f 6e 20 64 65  mum recursion de
17010 70 74 68 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b  pth of foreign k
17020 65 79 20 61 63 74 69 6f 6e 20 70 72 6f 67 72 61  ey action progra
17030 6d 73 20 69 73 0a 23 20 67 6f 76 65 72 6e 65 64  ms is.# governed
17040 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   by the SQLITE_M
17050 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
17060 20 61 6e 64 20 53 51 4c 49 54 45 5f 4c 49 4d 49   and SQLITE_LIMI
17070 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 0a  T_TRIGGER_DEPTH.
17080 23 20 73 65 74 74 69 6e 67 73 2e 0a 23 0a 23 20  # settings..#.# 
17090 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
170a0 32 32 36 34 2d 33 30 35 30 33 20 54 68 65 20 53  2264-30503 The S
170b0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
170c0 52 5f 44 45 50 54 48 20 61 6e 64 0a 23 20 53 51  R_DEPTH and.# SQ
170d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
170e0 45 52 5f 44 45 50 54 48 20 73 65 74 74 69 6e 67  ER_DEPTH setting
170f0 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  s determine the 
17100 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  maximum allowabl
17110 65 0a 23 20 64 65 70 74 68 20 6f 66 20 74 72 69  e.# depth of tri
17120 67 67 65 72 20 70 72 6f 67 72 61 6d 20 72 65 63  gger program rec
17130 75 72 73 69 6f 6e 2e 20 46 6f 72 20 74 68 65 20  ursion. For the 
17140 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 65 73  purposes of thes
17150 65 20 6c 69 6d 69 74 73 2c 0a 23 20 66 6f 72 65  e limits,.# fore
17160 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 20  ign key actions 
17170 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
17180 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
17190 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f  .#.proc test_on_
171a0 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
171b0 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f   {limit} {.  dro
171c0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
171d0 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
171e0 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
171f0 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
17200 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
17210 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56  INSERT INTO t0 V
17220 41 4c 55 45 53 28 27 78 30 27 2c 20 4e 55 4c 4c  ALUES('x0', NULL
17230 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
17240 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20 24 6c  t i 1} {$i <= $l
17250 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  imit} {incr i} {
17260 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
17270 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
17280 45 20 74 24 69 20 28 0a 20 20 20 20 20 20 20 20  E t$i (.        
17290 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
172a0 20 52 45 46 45 52 45 4e 43 45 53 20 74 5b 65 78   REFERENCES t[ex
172b0 70 72 20 24 69 2d 31 5d 20 4f 4e 20 44 45 4c 45  pr $i-1] ON DELE
172c0 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20 20  TE CASCADE.     
172d0 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54   );.      INSERT
172e0 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45 53   INTO t$i VALUES
172f0 28 27 78 24 69 27 2c 20 27 78 5b 65 78 70 72 20  ('x$i', 'x[expr 
17300 24 69 2d 31 5d 27 29 3b 0a 20 20 20 20 22 0a 20  $i-1]');.    ". 
17310 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   }.  execsql COM
17320 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c 20 22  MIT.  catchsql "
17330 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
17340 20 74 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t0;.    SELECT 
17350 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 24  count(*) FROM t$
17360 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 70 72 6f  limit;.  ".}.pro
17370 63 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65  c test_on_update
17380 5f 72 65 63 75 72 73 69 6f 6e 20 7b 6c 69 6d 69  _recursion {limi
17390 74 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  t} {.  drop_all_
173a0 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
173b0 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
173c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
173d0 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t0(a PRIMARY KEY
173e0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
173f0 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78 78  TO t0 VALUES('xx
17400 78 27 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b  x');.  }.  for {
17410 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20  set i 1} {$i <= 
17420 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d  $limit} {incr i}
17430 20 7b 0a 20 20 20 20 73 65 74 20 6a 20 5b 65 78   {.    set j [ex
17440 70 72 20 24 69 2d 31 5d 0a 0a 20 20 20 20 65 78  pr $i-1]..    ex
17450 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 43 52  ecsql ".      CR
17460 45 41 54 45 20 54 41 42 4c 45 20 74 24 69 20 28  EATE TABLE t$i (
17470 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45  a PRIMARY KEY RE
17480 46 45 52 45 4e 43 45 53 20 74 24 6a 20 4f 4e 20  FERENCES t$j ON 
17490 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
174a0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
174b0 54 4f 20 74 24 69 20 56 41 4c 55 45 53 28 27 78  TO t$i VALUES('x
174c0 78 78 27 29 3b 0a 20 20 20 20 22 0a 20 20 7d 0a  xx');.    ".  }.
174d0 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
174e0 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20  .  catchsql ".  
174f0 20 20 55 50 44 41 54 45 20 74 30 20 53 45 54 20    UPDATE t0 SET 
17500 61 20 3d 20 27 79 79 79 27 3b 0a 20 20 20 20 53  a = 'yyy';.    S
17510 45 4c 45 43 54 20 4e 4f 54 20 28 61 3d 27 79 79  ELECT NOT (a='yy
17520 79 27 29 20 46 52 4f 4d 20 74 24 6c 69 6d 69 74  y') FROM t$limit
17530 3b 0a 20 20 22 0a 7d 0a 0a 23 20 49 66 20 74 68  ;.  ".}..# If th
17540 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
17550 77 61 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  was created usin
17560 67 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65  g clang with the
17570 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61 64 64 72   -fsanitize=addr
17580 65 73 73 0a 23 20 73 77 69 74 63 68 2c 20 74 68  ess.# switch, th
17590 65 6e 20 74 68 65 20 6c 69 62 72 61 72 79 20 75  en the library u
175a0 73 65 73 20 63 6f 6e 73 69 64 65 72 61 62 6c 79  ses considerably
175b0 20 6d 6f 72 65 20 73 74 61 63 6b 20 73 70 61 63   more stack spac
175c0 65 20 74 68 61 6e 20 75 73 75 61 6c 2e 0a 23 20  e than usual..# 
175d0 53 6f 20 6d 75 63 68 20 6d 6f 72 65 2c 20 74 68  So much more, th
175e0 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 66  at some of the f
175f0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 63  ollowing tests c
17600 61 75 73 65 20 73 74 61 63 6b 20 6f 76 65 72 66  ause stack overf
17610 6c 6f 77 73 0a 23 20 69 66 20 74 68 65 79 20 61  lows.# if they a
17620 72 65 20 72 75 6e 20 75 6e 64 65 72 20 74 68 69  re run under thi
17630 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  s configuration.
17640 0a 23 0a 69 66 20 7b 5b 63 6c 61 6e 67 5f 73 61  .#.if {[clang_sa
17650 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73 5d 3d  nitize_address]=
17660 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  =0} {.  do_test 
17670 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 31 20 7b 0a  e_fkey-63.1.1 {.
17680 20 20 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65      test_on_dele
17690 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51  te_recursion $SQ
176a0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
176b0 5f 44 45 50 54 48 0a 20 20 7d 20 7b 30 20 30 7d  _DEPTH.  } {0 0}
176c0 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
176d0 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20 20 20 74  y-63.1.2 {.    t
176e0 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65  est_on_delete_re
176f0 63 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53  cursion [expr $S
17700 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
17710 52 5f 44 45 50 54 48 2b 31 5d 0a 20 20 7d 20 7b  R_DEPTH+1].  } {
17720 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
17730 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
17740 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  cursion}}.  do_t
17750 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e  est e_fkey-63.1.
17760 33 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  3 {.    sqlite3_
17770 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f  limit db SQLITE_
17780 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
17790 50 54 48 20 35 0a 20 20 20 20 20 20 74 65 73 74  PTH 5.      test
177a0 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72  _on_delete_recur
177b0 73 69 6f 6e 20 35 0a 20 20 7d 20 7b 30 20 30 7d  sion 5.  } {0 0}
177c0 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
177d0 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20 20 20 74  y-63.1.4 {.    t
177e0 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65  est_on_delete_re
177f0 63 75 72 73 69 6f 6e 20 36 0a 20 20 7d 20 7b 31  cursion 6.  } {1
17800 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   {too many level
17810 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
17820 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65  ursion}}.  do_te
17830 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 35  st e_fkey-63.1.5
17840 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c   {.    sqlite3_l
17850 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
17860 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
17870 54 48 20 31 30 30 30 30 30 30 0a 20 20 7d 20 7b  TH 1000000.  } {
17880 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  5}.  do_test e_f
17890 6b 65 79 2d 36 33 2e 32 2e 31 20 7b 0a 20 20 20  key-63.2.1 {.   
178a0 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f   test_on_update_
178b0 72 65 63 75 72 73 69 6f 6e 20 24 53 51 4c 49 54  recursion $SQLIT
178c0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
178d0 50 54 48 0a 20 20 7d 20 7b 30 20 30 7d 0a 20 20  PTH.  } {0 0}.  
178e0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
178f0 33 2e 32 2e 32 20 7b 0a 20 20 20 20 74 65 73 74  3.2.2 {.    test
17900 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72  _on_update_recur
17910 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51 4c 49  sion [expr $SQLI
17920 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
17930 45 50 54 48 2b 31 5d 0a 20 20 7d 20 7b 31 20 7b  EPTH+1].  } {1 {
17940 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
17950 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
17960 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  sion}}.  do_test
17970 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 33 20 7b   e_fkey-63.2.3 {
17980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .    sqlite3_lim
17990 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d  it db SQLITE_LIM
179a0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
179b0 20 35 0a 20 20 20 20 20 20 74 65 73 74 5f 6f 6e   5.      test_on
179c0 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f  _update_recursio
179d0 6e 20 35 0a 20 20 7d 20 7b 30 20 30 7d 0a 20 20  n 5.  } {0 0}.  
179e0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
179f0 33 2e 32 2e 34 20 7b 0a 20 20 20 20 74 65 73 74  3.2.4 {.    test
17a00 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72  _on_update_recur
17a10 73 69 6f 6e 20 36 0a 20 20 7d 20 7b 31 20 7b 74  sion 6.  } {1 {t
17a20 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
17a30 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
17a40 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ion}}.  do_test 
17a50 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 35 20 7b 0a  e_fkey-63.2.5 {.
17a60 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
17a70 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49  t db SQLITE_LIMI
17a80 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
17a90 31 30 30 30 30 30 30 0a 20 20 7d 20 7b 35 7d 0a  1000000.  } {5}.
17aa0 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
17ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
17af0 54 68 65 20 73 65 74 74 69 6e 67 20 6f 66 20 74  The setting of t
17b00 68 65 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  he recursive_tri
17b10 67 67 65 72 73 20 70 72 61 67 6d 61 20 64 6f 65  ggers pragma doe
17b20 73 20 6e 6f 74 20 61 66 66 65 63 74 20 66 6f 72  s not affect for
17b30 65 69 67 6e 0a 23 20 6b 65 79 20 61 63 74 69 6f  eign.# key actio
17b40 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ns..#.# EVIDENCE
17b50 2d 4f 46 3a 20 52 2d 34 34 33 35 35 2d 30 30 32  -OF: R-44355-002
17b60 37 30 20 54 68 65 20 50 52 41 47 4d 41 20 72 65  70 The PRAGMA re
17b70 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
17b80 20 73 65 74 74 69 6e 67 20 64 6f 65 73 0a 23 20   setting does.# 
17b90 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 6f  not affect the o
17ba0 70 65 72 61 74 69 6f 6e 20 6f 66 20 66 6f 72 65  peration of fore
17bb0 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e  ign key actions.
17bc0 0a 23 0a 66 6f 72 65 61 63 68 20 72 65 63 75 72  .#.foreach recur
17bd0 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65  sive_triggers_se
17be0 74 74 69 6e 67 20 5b 6c 69 73 74 20 30 20 31 20  tting [list 0 1 
17bf0 4f 4e 20 4f 46 46 5d 20 7b 0a 20 20 64 72 6f 70  ON OFF] {.  drop
17c00 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78  _all_tables.  ex
17c10 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 72 65  ecsql "PRAGMA re
17c20 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
17c30 20 3d 20 24 72 65 63 75 72 73 69 76 65 5f 74 72   = $recursive_tr
17c40 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 22 0a  iggers_setting".
17c50 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
17c60 79 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f  y-64.$recursive_
17c70 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67  triggers_setting
17c80 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
17c90 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
17ca0 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
17cb0 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
17cc0 4e 43 45 53 20 74 31 20 4f 4e 20 44 45 4c 45 54  NCES t1 ON DELET
17cd0 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20  E CASCADE);.    
17ce0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17cf0 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29   VALUES(1, NULL)
17d00 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
17d10 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
17d20 20 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   1);.      INSER
17d30 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
17d40 28 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 49 4e  (3, 2);.      IN
17d50 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
17d60 55 45 53 28 34 2c 20 33 29 3b 0a 20 20 20 20 20  UES(4, 3);.     
17d70 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
17d80 56 41 4c 55 45 53 28 35 2c 20 34 29 3b 0a 20 20  VALUES(5, 4);.  
17d90 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
17da0 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
17db0 20 7d 0a 20 20 7d 20 7b 35 7d 0a 20 20 64 6f 5f   }.  } {5}.  do_
17dc0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24  test e_fkey-64.$
17dd0 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
17de0 72 73 5f 73 65 74 74 69 6e 67 2e 32 20 7b 0a 20  rs_setting.2 {. 
17df0 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
17e00 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17e10 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31  M t1 WHERE a = 1
17e20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f   }.  } {1}.  do_
17e30 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24  test e_fkey-64.$
17e40 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
17e50 72 73 5f 73 65 74 74 69 6e 67 2e 33 20 7b 0a 20  rs_setting.3 {. 
17e60 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
17e70 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
17e80 74 31 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  t1 WHERE a = 1;.
17e90 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
17ea0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
17eb0 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a 0a     }.  } {0}.}..
17ec0 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.