/ Hex Artifact Content
Login

Artifact dcdc6ad26b1d4f07636208de4c1c22aae7c0597a685a6c10fe6da91f3191dd96:


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 33 35 37  IDENCE-OF: R-357
5fa0: 36 33 2d 34 38 32 36 37 20 46 6f 72 65 69 67 6e  63-48267 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 72 65 70 6f 72 74 65 64 20 69 66 3a  are reported if:
5fd0: 20 54 68 65 0a 23 20 70 61 72 65 6e 74 20 74 61   The.# parent ta
5fe0: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
5ff0: 73 74 2c 20 6f 72 20 54 68 65 20 70 61 72 65 6e  st, or The paren
6000: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6e 61  t key columns na
6010: 6d 65 64 20 69 6e 20 74 68 65 0a 23 20 66 6f 72  med in the.# for
6020: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
6030: 69 6e 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  int do not exist
6040: 2c 20 6f 72 20 54 68 65 20 70 61 72 65 6e 74 20  , or The parent 
6050: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  key columns name
6060: 64 0a 23 20 69 6e 20 74 68 65 20 66 6f 72 65 69  d.# in the forei
6070: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
6080: 74 20 61 72 65 20 6e 6f 74 20 74 68 65 20 70 72  t are not the pr
6090: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65  imary key of the
60a0: 20 70 61 72 65 6e 74 0a 23 20 74 61 62 6c 65 20   parent.# table 
60b0: 61 6e 64 20 61 72 65 20 6e 6f 74 20 73 75 62 6a  and are not subj
60c0: 65 63 74 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ect to a unique 
60d0: 63 6f 6e 73 74 72 61 69 6e 74 20 75 73 69 6e 67  constraint using
60e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 23 20 73 65 71   collating.# seq
60f0: 75 65 6e 63 65 20 73 70 65 63 69 66 69 65 64 20  uence specified 
6100: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
6110: 42 4c 45 2c 20 6f 72 20 54 68 65 20 63 68 69 6c  BLE, or The chil
6120: 64 20 74 61 62 6c 65 20 72 65 66 65 72 65 6e 63  d table referenc
6130: 65 73 0a 23 20 74 68 65 20 70 72 69 6d 61 72 79  es.# the primary
6140: 20 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72 65   key of the pare
6150: 6e 74 20 77 69 74 68 6f 75 74 20 73 70 65 63 69  nt without speci
6160: 66 79 69 6e 67 20 74 68 65 20 70 72 69 6d 61 72  fying the primar
6170: 79 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 20  y key.# columns 
6180: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
6190: 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  f primary key co
61a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 70 61 72  lumns in the par
61b0: 65 6e 74 20 64 6f 20 6e 6f 74 0a 23 20 6d 61 74  ent do not.# mat
61c0: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
61d0: 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d   child key colum
61e0: 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  ns..#.do_test e_
61f0: 66 6b 65 79 2d 32 30 2e 31 20 7b 0a 20 20 65 78  fkey-20.1 {.  ex
6200: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
6210: 54 45 20 54 41 42 4c 45 20 63 31 28 63 20 52 45  TE TABLE c1(c RE
6220: 46 45 52 45 4e 43 45 53 20 6e 6f 73 75 63 68 74  FERENCES nosucht
6230: 61 62 6c 65 2c 20 64 29 3b 0a 0a 20 20 20 20 43  able, d);..    C
6240: 52 45 41 54 45 20 54 41 42 4c 45 20 70 32 28 61  REATE TABLE p2(a
6250: 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62  , b, UNIQUE(a, b
6260: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
6270: 41 42 4c 45 20 63 32 28 63 2c 20 64 2c 20 46 4f  ABLE c2(c, d, FO
6280: 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
6290: 52 45 46 45 52 45 4e 43 45 53 20 70 32 28 61 2c  REFERENCES p2(a,
62a0: 20 78 29 29 3b 0a 0a 20 20 20 20 43 52 45 41 54   x));..    CREAT
62b0: 45 20 54 41 42 4c 45 20 70 33 28 61 20 50 52 49  E TABLE p3(a PRI
62c0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
62d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
62e0: 33 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  3(c REFERENCES p
62f0: 33 28 62 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43  3(b), d);..    C
6300: 52 45 41 54 45 20 54 41 42 4c 45 20 70 34 28 61  REATE TABLE p4(a
6310: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
6320: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
6330: 51 55 45 20 49 4e 44 45 58 20 70 34 69 20 4f 4e  QUE INDEX p4i ON
6340: 20 70 34 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f   p4(b COLLATE no
6350: 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54  case);.    CREAT
6360: 45 20 54 41 42 4c 45 20 63 34 28 63 20 52 45 46  E TABLE c4(c REF
6370: 45 52 45 4e 43 45 53 20 70 34 28 62 29 2c 20 64  ERENCES p4(b), d
6380: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6390: 41 42 4c 45 20 70 35 28 61 20 50 52 49 4d 41 52  ABLE p5(a PRIMAR
63a0: 59 20 4b 45 59 2c 20 62 20 43 4f 4c 4c 41 54 45  Y KEY, b COLLATE
63b0: 20 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 43 52   nocase);.    CR
63c0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
63d0: 58 20 70 35 69 20 4f 4e 20 70 35 28 62 20 43 4f  X p5i ON p5(b CO
63e0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 3b 0a 20  LLATE binary);. 
63f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6400: 63 35 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  c5(c REFERENCES 
6410: 70 35 28 62 29 2c 20 64 29 3b 0a 0a 20 20 20 20  p5(b), d);..    
6420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 36 28  CREATE TABLE p6(
6430: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
6440: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
6450: 42 4c 45 20 63 36 28 63 2c 20 64 2c 20 46 4f 52  BLE c6(c, d, FOR
6460: 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
6470: 45 46 45 52 45 4e 43 45 53 20 70 36 29 3b 0a 0a  EFERENCES p6);..
6480: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6490: 20 70 37 28 61 2c 20 62 2c 20 50 52 49 4d 41 52   p7(a, b, PRIMAR
64a0: 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20  Y KEY(a, b));.  
64b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
64c0: 37 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45  7(c, d REFERENCE
64d0: 53 20 70 37 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  S p7);.  }.} {}.
64e0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 74 62 6c  .foreach {tn tbl
64f0: 20 70 74 62 6c 20 65 72 72 7d 20 7b 0a 20 20 32   ptbl err} {.  2
6500: 20 63 31 20 7b 7d 20 22 6e 6f 20 73 75 63 68 20   c1 {} "no such 
6510: 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75  table: main.nosu
6520: 63 68 74 61 62 6c 65 22 0a 20 20 33 20 63 32 20  chtable".  3 c2 
6530: 70 32 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  p2 "foreign key 
6540: 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 32 5c  mismatch - \"c2\
6550: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c 22  " referencing \"
6560: 70 32 5c 22 22 0a 20 20 34 20 63 33 20 70 33 20  p2\"".  4 c3 p3 
6570: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
6580: 6d 61 74 63 68 20 2d 20 5c 22 63 33 5c 22 20 72  match - \"c3\" r
6590: 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 33 5c  eferencing \"p3\
65a0: 22 22 0a 20 20 35 20 63 34 20 70 34 20 22 66 6f  "".  5 c4 p4 "fo
65b0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
65c0: 63 68 20 2d 20 5c 22 63 34 5c 22 20 72 65 66 65  ch - \"c4\" refe
65d0: 72 65 6e 63 69 6e 67 20 5c 22 70 34 5c 22 22 0a  rencing \"p4\"".
65e0: 20 20 36 20 63 35 20 70 35 20 22 66 6f 72 65 69    6 c5 p5 "forei
65f0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
6600: 2d 20 5c 22 63 35 5c 22 20 72 65 66 65 72 65 6e  - \"c5\" referen
6610: 63 69 6e 67 20 5c 22 70 35 5c 22 22 0a 20 20 37  cing \"p5\"".  7
6620: 20 63 36 20 70 36 20 22 66 6f 72 65 69 67 6e 20   c6 p6 "foreign 
6630: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c  key mismatch - \
6640: 22 63 36 5c 22 20 72 65 66 65 72 65 6e 63 69 6e  "c6\" referencin
6650: 67 20 5c 22 70 36 5c 22 22 0a 20 20 38 20 63 37  g \"p6\"".  8 c7
6660: 20 70 37 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p7 "foreign key
6670: 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 37   mismatch - \"c7
6680: 5c 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c  \" referencing \
6690: 22 70 37 5c 22 22 0a 7d 20 7b 0a 20 20 64 6f 5f  "p7\"".} {.  do_
66a0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24  test e_fkey-20.$
66b0: 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.1 {.    catch
66c0: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
66d0: 20 24 74 62 6c 20 56 41 4c 55 45 53 28 27 61 27   $tbl VALUES('a'
66e0: 2c 20 27 62 27 29 22 0a 20 20 7d 20 5b 6c 69 73  , 'b')".  } [lis
66f0: 74 20 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f 74  t 1 $err].  do_t
6700: 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74  est e_fkey-20.$t
6710: 6e 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.2 {.    catchs
6720: 71 6c 20 22 55 50 44 41 54 45 20 24 74 62 6c 20  ql "UPDATE $tbl 
6730: 53 45 54 20 63 20 3d 20 3f 2c 20 64 20 3d 20 3f  SET c = ?, d = ?
6740: 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65  ".  } [list 1 $e
6750: 72 72 5d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  rr].  do_test e_
6760: 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 33 20 7b 0a  fkey-20.$tn.3 {.
6770: 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e      catchsql "IN
6780: 53 45 52 54 20 49 4e 54 4f 20 24 74 62 6c 20 53  SERT INTO $tbl S
6790: 45 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20 7d 20  ELECT ?, ?".  } 
67a0: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 0a 20  [list 1 $err].. 
67b0: 20 69 66 20 7b 24 70 74 62 6c 20 6e 65 20 22 22   if {$ptbl ne ""
67c0: 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  } {.    do_test 
67d0: 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 34 20  e_fkey-20.$tn.4 
67e0: 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c  {.      catchsql
67f0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 24 70   "DELETE FROM $p
6800: 74 62 6c 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74  tbl".    } [list
6810: 20 31 20 24 65 72 72 5d 0a 20 20 20 20 64 6f 5f   1 $err].    do_
6820: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24  test e_fkey-20.$
6830: 74 6e 2e 35 20 7b 0a 20 20 20 20 20 20 63 61 74  tn.5 {.      cat
6840: 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 24 70  chsql "UPDATE $p
6850: 74 62 6c 20 53 45 54 20 61 20 3d 20 3f 2c 20 62  tbl SET a = ?, b
6860: 20 3d 20 3f 22 0a 20 20 20 20 7d 20 5b 6c 69 73   = ?".    } [lis
6870: 74 20 31 20 24 65 72 72 5d 0a 20 20 20 20 64 6f  t 1 $err].    do
6880: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e  _test e_fkey-20.
6890: 24 74 6e 2e 36 20 7b 0a 20 20 20 20 20 20 63 61  $tn.6 {.      ca
68a0: 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54 20 49  tchsql "INSERT I
68b0: 4e 54 4f 20 24 70 74 62 6c 20 53 45 4c 45 43 54  NTO $ptbl SELECT
68c0: 20 3f 2c 20 3f 22 0a 20 20 20 20 7d 20 5b 6c 69   ?, ?".    } [li
68d0: 73 74 20 31 20 24 65 72 72 5d 0a 20 20 7d 0a 7d  st 1 $err].  }.}
68e0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
6930: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
6940: 33 35 33 2d 34 33 36 34 33 0a 23 0a 23 20 54 65  353-43643.#.# Te
6950: 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 6f  st the example o
6960: 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69  f foreign key mi
6970: 73 6d 61 74 63 68 20 65 72 72 6f 72 73 20 63 61  smatch errors ca
6980: 75 73 65 64 20 62 79 20 69 6d 70 6c 69 63 69 74  used by implicit
6990: 6c 79 0a 23 20 6d 61 70 70 69 6e 67 20 61 20 63  ly.# mapping a c
69a0: 68 69 6c 64 20 6b 65 79 20 74 6f 20 74 68 65 20  hild key to the 
69b0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
69c0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
69d0: 77 68 65 6e 20 74 68 65 0a 23 20 63 68 69 6c 64  when the.# child
69e0: 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f 66   key consists of
69f0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6e 75 6d   a different num
6a00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
6a10: 6f 20 74 68 61 74 20 70 72 69 6d 61 72 79 20 6b  o that primary k
6a20: 65 79 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f  ey..# .drop_all_
6a30: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
6a40: 5f 66 6b 65 79 2d 32 31 2e 31 20 7b 0a 20 20 65  _fkey-21.1 {.  e
6a50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
6a60: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
6a70: 32 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  2(a, b, PRIMARY 
6a80: 4b 45 59 28 61 2c 62 29 29 3b 0a 0a 20 20 20 20  KEY(a,b));..    
6a90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
6aa0: 6c 64 38 28 78 2c 20 79 2c 20 46 4f 52 45 49 47  ld8(x, y, FOREIG
6ab0: 4e 20 4b 45 59 28 78 2c 79 29 20 52 45 46 45 52  N KEY(x,y) REFER
6ac0: 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29 3b 20  ENCES parent2); 
6ad0: 20 20 20 20 2d 2d 20 4f 6b 0a 20 20 20 20 43 52      -- Ok.    CR
6ae0: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
6af0: 39 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 70  9(x REFERENCES p
6b00: 61 72 65 6e 74 32 29 3b 20 20 20 20 20 20 20 20  arent2);        
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45    -- Err.    CRE
6b30: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
6b40: 30 28 78 2c 79 2c 7a 2c 20 46 4f 52 45 49 47 4e  0(x,y,z, FOREIGN
6b50: 20 4b 45 59 28 78 2c 79 2c 7a 29 20 52 45 46 45   KEY(x,y,z) REFE
6b60: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29 3b  RENCES parent2);
6b70: 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d   -- Err.  }.} {}
6b80: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
6b90: 32 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  21.2 {.  execsql
6ba0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
6bb0: 54 4f 20 70 61 72 65 6e 74 32 20 56 41 4c 55 45  TO parent2 VALUE
6bc0: 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20  S('I', 'II');.  
6bd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
6be0: 69 6c 64 38 20 56 41 4c 55 45 53 28 27 49 27 2c  ild8 VALUES('I',
6bf0: 20 27 49 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d   'II');.  }.} {}
6c00: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
6c10: 32 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  21.3 {.  catchsq
6c20: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
6c30: 63 68 69 6c 64 39 20 56 41 4c 55 45 53 28 27 49  child9 VALUES('I
6c40: 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  ') }.} {1 {forei
6c50: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
6c60: 2d 20 22 63 68 69 6c 64 39 22 20 72 65 66 65 72  - "child9" refer
6c70: 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22  encing "parent2"
6c80: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
6c90: 79 2d 32 31 2e 34 20 7b 0a 20 20 63 61 74 63 68  y-21.4 {.  catch
6ca0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
6cb0: 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45 53 28  O child9 VALUES(
6cc0: 27 49 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  'II') }.} {1 {fo
6cd0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6ce0: 63 68 20 2d 20 22 63 68 69 6c 64 39 22 20 72 65  ch - "child9" re
6cf0: 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72 65 6e  ferencing "paren
6d00: 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  t2"}}.do_test e_
6d10: 66 6b 65 79 2d 32 31 2e 35 20 7b 0a 20 20 63 61  fkey-21.5 {.  ca
6d20: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6d30: 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55  INTO child9 VALU
6d40: 45 53 28 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20  ES(NULL) }.} {1 
6d50: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6d60: 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 39 22  match - "child9"
6d70: 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61   referencing "pa
6d80: 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73 74  rent2"}}.do_test
6d90: 20 65 5f 66 6b 65 79 2d 32 31 2e 36 20 7b 0a 20   e_fkey-21.6 {. 
6da0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
6db0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20  RT INTO child10 
6dc0: 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27  VALUES('I', 'II'
6dd0: 2c 20 27 49 49 49 27 29 20 7d 0a 7d 20 7b 31 20  , 'III') }.} {1 
6de0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6df0: 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 31 30  match - "child10
6e00: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
6e10: 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73  arent2"}}.do_tes
6e20: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 37 20 7b 0a  t e_fkey-21.7 {.
6e30: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6e40: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30  ERT INTO child10
6e50: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
6e60: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
6e70: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
6e80: 22 63 68 69 6c 64 31 30 22 20 72 65 66 65 72 65  "child10" refere
6e90: 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d  ncing "parent2"}
6ea0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
6eb0: 2d 32 31 2e 38 20 7b 0a 20 20 63 61 74 63 68 73  -21.8 {.  catchs
6ec0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
6ed0: 20 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28   child10 VALUES(
6ee0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
6ef0: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
6f00: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d  n key mismatch -
6f10: 20 22 63 68 69 6c 64 31 30 22 20 72 65 66 65 72   "child10" refer
6f20: 65 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22  encing "parent2"
6f30: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6f80: 20 54 65 73 74 20 65 72 72 6f 72 73 20 74 68 61   Test errors tha
6f90: 74 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 77  t are reported w
6fa0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 74 68 65  hen creating the
6fb0: 20 63 68 69 6c 64 20 74 61 62 6c 65 2e 20 0a 23   child table. .#
6fc0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 3a 0a 23   Specifically:.#
6fd0: 0a 23 20 20 20 2a 20 64 69 66 66 65 72 65 6e 74  .#   * different
6fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   number of child
6ff0: 20 61 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 20   and parent key 
7000: 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64 0a 23 20 20  columns, and.#  
7010: 20 2a 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 73   * child columns
7020: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 78 69   that do not exi
7030: 73 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  st..#.# EVIDENCE
7040: 2d 4f 46 3a 20 52 2d 32 33 36 38 32 2d 35 39 38  -OF: R-23682-598
7050: 32 30 20 42 79 20 63 6f 6e 74 72 61 73 74 2c 20  20 By contrast, 
7060: 69 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 65  if foreign key e
7070: 72 72 6f 72 73 20 63 61 6e 20 62 65 0a 23 20 72  rrors can be.# r
7080: 65 63 6f 67 6e 69 7a 65 64 20 73 69 6d 70 6c 79  ecognized simply
7090: 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74   by looking at t
70a0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
70b0: 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
70c0: 20 61 6e 64 0a 23 20 77 69 74 68 6f 75 74 20 68   and.# without h
70d0: 61 76 69 6e 67 20 74 6f 20 63 6f 6e 73 75 6c 74  aving to consult
70e0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
70f0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68  e definition, th
7100: 65 6e 20 74 68 65 20 43 52 45 41 54 45 0a 23 20  en the CREATE.# 
7110: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7120: 66 6f 72 20 74 68 65 20 63 68 69 6c 64 20 74 61  for the child ta
7130: 62 6c 65 20 66 61 69 6c 73 2e 0a 23 0a 23 20 54  ble fails..#.# T
7140: 68 65 73 65 20 65 72 72 6f 72 73 20 61 72 65 20  hese errors are 
7150: 72 65 70 6f 72 74 65 64 20 77 68 65 74 68 65 72  reported whether
7160: 20 6f 72 20 6e 6f 74 20 46 4b 20 73 75 70 70 6f   or not FK suppo
7170: 72 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 23  rt is enabled..#
7180: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7190: 52 2d 33 33 38 38 33 2d 32 38 38 33 33 20 46 6f  R-33883-28833 Fo
71a0: 72 65 69 67 6e 20 6b 65 79 20 44 44 4c 20 65 72  reign key DDL er
71b0: 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65  rors are reporte
71c0: 64 0a 23 20 72 65 67 61 72 64 6c 65 73 73 20 6f  d.# regardless o
71d0: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
71e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
71f0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e 61  straints are ena
7200: 62 6c 65 64 20 77 68 65 6e 0a 23 20 74 68 65 20  bled when.# the 
7210: 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
7220: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
7230: 6c 65 73 0a 66 6f 72 65 61 63 68 20 66 6b 20 5b  les.foreach fk [
7240: 6c 69 73 74 20 4f 46 46 20 4f 4e 5d 20 7b 0a 20  list OFF ON] {. 
7250: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
7260: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
7270: 24 66 6b 22 0a 20 20 73 65 74 20 69 20 30 0a 20  $fk".  set i 0. 
7280: 20 66 6f 72 65 61 63 68 20 7b 73 71 6c 20 65 72   foreach {sql er
7290: 72 6f 72 7d 20 7b 0a 20 20 20 20 22 43 52 45 41  ror} {.    "CREA
72a0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28  TE TABLE child1(
72b0: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
72c0: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
72d0: 45 53 20 70 28 63 29 29 22 0a 20 20 20 20 20 20  ES p(c))".      
72e0: 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  {number of colum
72f0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
7300: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
7310: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7320: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
7330: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a  ferenced table}.
7340: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
7350: 45 20 63 68 69 6c 64 32 28 61 2c 20 62 2c 20 46  E child2(a, b, F
7360: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
7370: 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 63 2c   REFERENCES p(c,
7380: 20 64 2c 20 65 29 29 22 0a 20 20 20 20 20 20 7b   d, e))".      {
7390: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
73a0: 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
73b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
73c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
73d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
73e0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 20  erenced table}. 
73f0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
7400: 20 63 68 69 6c 64 32 28 61 2c 20 62 2c 20 46 4f   child2(a, b, FO
7410: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 63 29 20  REIGN KEY(a, c) 
7420: 52 45 46 45 52 45 4e 43 45 53 20 70 28 63 2c 20  REFERENCES p(c, 
7430: 64 29 29 22 0a 20 20 20 20 20 20 7b 75 6e 6b 6e  d))".      {unkn
7440: 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69  own column "c" i
7450: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
7460: 66 69 6e 69 74 69 6f 6e 7d 0a 20 20 20 20 22 43  finition}.    "C
7470: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
7480: 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  d2(a, b, FOREIGN
7490: 20 4b 45 59 28 63 2c 20 62 29 20 52 45 46 45 52   KEY(c, b) REFER
74a0: 45 4e 43 45 53 20 70 28 63 2c 20 64 29 29 22 0a  ENCES p(c, d))".
74b0: 20 20 20 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63        {unknown c
74c0: 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72  olumn "c" in for
74d0: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
74e0: 69 6f 6e 7d 0a 20 20 7d 20 7b 0a 20 20 20 20 64  ion}.  } {.    d
74f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 32  o_test e_fkey-22
7500: 2e 24 66 6b 2e 5b 69 6e 63 72 20 69 5d 20 7b 0a  .$fk.[incr i] {.
7510: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 24        catchsql $
7520: 73 71 6c 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20  sql.    } [list 
7530: 31 20 24 65 72 72 6f 72 5d 0a 20 20 7d 0a 7d 0a  1 $error].  }.}.
7540: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
7590: 73 74 20 74 68 61 74 20 61 20 52 45 46 45 52 45  st that a REFERE
75a0: 4e 43 49 4e 47 20 63 6c 61 75 73 65 20 74 68 61  NCING clause tha
75b0: 74 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  t does not speci
75c0: 66 79 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  fy parent key co
75d0: 6c 75 6d 6e 73 0a 23 20 69 6d 70 6c 69 63 69 74  lumns.# implicit
75e0: 6c 79 20 6d 61 70 73 20 74 6f 20 74 68 65 20 70  ly maps to the p
75f0: 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68  rimary key of th
7600: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a  e parent table..
7610: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
7620: 20 52 2d 34 33 38 37 39 2d 30 38 30 32 35 20 41   R-43879-08025 A
7630: 74 74 61 63 68 69 6e 67 20 61 20 22 52 45 46 45  ttaching a "REFE
7640: 52 45 4e 43 45 53 20 3c 70 61 72 65 6e 74 2d 74  RENCES <parent-t
7650: 61 62 6c 65 3e 22 0a 23 20 63 6c 61 75 73 65 20  able>".# clause 
7660: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  to a column defi
7670: 6e 69 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61  nition creates a
7680: 20 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20 63   foreign.# key c
7690: 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6d  onstraint that m
76a0: 61 70 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  aps the column t
76b0: 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  o the primary ke
76c0: 79 20 6f 66 0a 23 20 3c 70 61 72 65 6e 74 2d 74  y of.# <parent-t
76d0: 61 62 6c 65 3e 2e 0a 23 20 0a 64 6f 5f 74 65 73  able>..# .do_tes
76e0: 74 20 65 5f 66 6b 65 79 2d 32 33 2e 31 20 7b 0a  t e_fkey-23.1 {.
76f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 31 28  CREATE TABLE p1(
7710: 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
7720: 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
7730: 45 41 54 45 20 54 41 42 4c 45 20 70 32 28 61 2c  EATE TABLE p2(a,
7740: 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b   b PRIMARY KEY);
7750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7760: 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c1(c, d, FOREI
7770: 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
7780: 45 52 45 4e 43 45 53 20 70 31 29 3b 0a 20 20 20  ERENCES p1);.   
7790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32   CREATE TABLE c2
77a0: 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
77b0: 20 70 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70   p2);.  }.} {}.p
77c0: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  roc test_efkey_6
77d0: 30 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  0 {tn isError sq
77e0: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
77f0: 5f 66 6b 65 79 2d 32 33 2e 24 74 6e 20 22 0a 20  _fkey-23.$tn ". 
7800: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71     catchsql {$sq
7810: 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  l}.  " [lindex {
7820: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45 49  {0 {}} {1 {FOREI
7830: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
7840: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
7850: 72 72 6f 72 5d 0a 7d 0a 0a 74 65 73 74 5f 65 66  rror].}..test_ef
7860: 6b 65 79 5f 36 30 20 32 20 31 20 22 49 4e 53 45  key_60 2 1 "INSE
7870: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
7880: 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73  S(239, 231)".tes
7890: 74 5f 65 66 6b 65 79 5f 36 30 20 33 20 30 20 22  t_efkey_60 3 0 "
78a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56  INSERT INTO p1 V
78b0: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
78c0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 34  .test_efkey_60 4
78d0: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
78e0: 63 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  c1 VALUES(239, 2
78f0: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
7900: 36 30 20 35 20 31 20 22 49 4e 53 45 52 54 20 49  60 5 1 "INSERT I
7910: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 33  NTO c2 VALUES(23
7920: 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66  9, 231)".test_ef
7930: 6b 65 79 5f 36 30 20 36 20 30 20 22 49 4e 53 45  key_60 6 0 "INSE
7940: 52 54 20 49 4e 54 4f 20 70 32 20 56 41 4c 55 45  RT INTO p2 VALUE
7950: 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73  S(239, 231)".tes
7960: 74 5f 65 66 6b 65 79 5f 36 30 20 37 20 30 20 22  t_efkey_60 7 0 "
7970: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
7980: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
7990: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
79e0: 65 73 74 20 74 68 61 74 20 61 6e 20 69 6e 64 65  est that an inde
79f0: 78 20 6f 6e 20 6f 6e 20 74 68 65 20 63 68 69 6c  x on on the chil
7a00: 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66  d key columns of
7a10: 20 61 6e 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e   an FK constrain
7a20: 74 0a 23 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  t.# is optional.
7a30: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
7a40: 3a 20 52 2d 31 35 34 31 37 2d 32 38 30 31 34 20  : R-15417-28014 
7a50: 49 6e 64 69 63 65 73 20 61 72 65 20 6e 6f 74 20  Indices are not 
7a60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 68 69  required for chi
7a70: 6c 64 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73  ld key.# columns
7a80: 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74  .#.# Also test t
7a90: 68 61 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  hat if an index 
7aa0: 69 73 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  is created on th
7ab0: 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75  e child key colu
7ac0: 6d 6e 73 2c 20 69 74 20 64 6f 65 73 0a 23 20 6e  mns, it does.# n
7ad0: 6f 74 20 6d 61 6b 65 20 61 20 64 69 66 66 65 72  ot make a differ
7ae0: 65 6e 63 65 20 77 68 65 74 68 65 72 20 6f 72 20  ence whether or 
7af0: 6e 6f 74 20 69 74 20 69 73 20 61 20 55 4e 49 51  not it is a UNIQ
7b00: 55 45 20 69 6e 64 65 78 2e 0a 23 0a 23 20 45 56  UE index..#.# EV
7b10: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 37  IDENCE-OF: R-157
7b20: 34 31 2d 35 30 38 39 33 20 54 68 65 20 63 68 69  41-50893 The chi
7b30: 6c 64 20 6b 65 79 20 69 6e 64 65 78 20 64 6f 65  ld key index doe
7b40: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65  s not have to be
7b50: 0a 23 20 28 61 6e 64 20 75 73 75 61 6c 6c 79 20  .# (and usually 
7b60: 77 69 6c 6c 20 6e 6f 74 20 62 65 29 20 61 20 55  will not be) a U
7b70: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64  NIQUE index..#.d
7b80: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
7b90: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 34  o_test e_fkey-24
7ba0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
7bb0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7bc0: 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20 55  E parent(x, y, U
7bd0: 4e 49 51 55 45 28 79 2c 20 78 29 29 3b 0a 20 20  NIQUE(y, x));.  
7be0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
7bf0: 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  1(a, b, FOREIGN 
7c00: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
7c10: 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79  NCES parent(x, y
7c20: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
7c30: 41 42 4c 45 20 63 32 28 61 2c 20 62 2c 20 46 4f  ABLE c2(a, b, FO
7c40: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20  REIGN KEY(a, b) 
7c50: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
7c60: 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43 52  t(x, y));.    CR
7c70: 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 61 2c  EATE TABLE c3(a,
7c80: 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
7c90: 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  a, b) REFERENCES
7ca0: 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a   parent(x, y));.
7cb0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
7cc0: 20 63 32 69 20 4f 4e 20 63 32 28 61 2c 20 62 29   c2i ON c2(a, b)
7cd0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
7ce0: 51 55 45 20 49 4e 44 45 58 20 63 33 69 20 4f 4e  QUE INDEX c3i ON
7cf0: 20 63 32 28 62 2c 20 61 29 3b 0a 20 20 7d 0a 7d   c2(b, a);.  }.}
7d00: 20 7b 7d 0a 70 72 6f 63 20 74 65 73 74 5f 65 66   {}.proc test_ef
7d10: 6b 65 79 5f 36 31 20 7b 74 6e 20 69 73 45 72 72  key_61 {tn isErr
7d20: 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74  or sql} {.  do_t
7d30: 65 73 74 20 65 5f 66 6b 65 79 2d 32 34 2e 24 74  est e_fkey-24.$t
7d40: 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c  n ".    catchsql
7d50: 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e   {$sql}.  " [lin
7d60: 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b  dex {{0 {}} {1 {
7d70: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
7d80: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d  traint failed}}}
7d90: 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 66 6f 72   $isError].}.for
7da0: 65 61 63 68 20 7b 74 6e 20 63 7d 20 5b 6c 69 73  each {tn c} [lis
7db0: 74 20 32 20 63 31 20 33 20 63 32 20 34 20 63 33  t 2 c1 3 c2 4 c3
7dc0: 5d 20 7b 0a 20 20 74 65 73 74 5f 65 66 6b 65 79  ] {.  test_efkey
7dd0: 5f 36 31 20 24 74 6e 2e 31 20 31 20 22 49 4e 53  _61 $tn.1 1 "INS
7de0: 45 52 54 20 49 4e 54 4f 20 24 63 20 56 41 4c 55  ERT INTO $c VALU
7df0: 45 53 28 31 2c 20 32 29 22 0a 20 20 74 65 73 74  ES(1, 2)".  test
7e00: 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e 32 20  _efkey_61 $tn.2 
7e10: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  0 "INSERT INTO p
7e20: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 2c 20  arent VALUES(1, 
7e30: 32 29 22 0a 20 20 74 65 73 74 5f 65 66 6b 65 79  2)".  test_efkey
7e40: 5f 36 31 20 24 74 6e 2e 33 20 30 20 22 49 4e 53  _61 $tn.3 0 "INS
7e50: 45 52 54 20 49 4e 54 4f 20 24 63 20 56 41 4c 55  ERT INTO $c VALU
7e60: 45 53 28 31 2c 20 32 29 22 0a 0a 20 20 65 78 65  ES(1, 2)"..  exe
7e70: 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  csql "DELETE FRO
7e80: 4d 20 24 63 20 3b 20 44 45 4c 45 54 45 20 46 52  M $c ; DELETE FR
7e90: 4f 4d 20 70 61 72 65 6e 74 22 0a 7d 0a 0a 23 2d  OM parent".}..#-
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
7ef0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 32 37 39 2d  NCE-OF: R-00279-
7f00: 35 32 32 38 33 0a 23 0a 23 20 54 65 73 74 20 61  52283.#.# Test a
7f10: 6e 20 65 78 61 6d 70 6c 65 20 73 68 6f 77 69 6e  n example showin
7f20: 67 20 74 68 61 74 20 77 68 65 6e 20 61 20 72 6f  g that when a ro
7f30: 77 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  w is deleted fro
7f40: 6d 20 74 68 65 20 70 61 72 65 6e 74 20 0a 23 20  m the parent .# 
7f50: 74 61 62 6c 65 2c 20 74 68 65 20 63 68 69 6c 64  table, the child
7f60: 20 74 61 62 6c 65 20 69 73 20 71 75 65 72 69 65   table is querie
7f70: 64 20 66 6f 72 20 6f 72 70 68 61 6e 65 64 20 72  d for orphaned r
7f80: 6f 77 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ows as follows:.
7f90: 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77  #.#   SELECT row
7fa0: 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48  id FROM track WH
7fb0: 45 52 45 20 74 72 61 63 6b 61 72 74 69 73 74 20  ERE trackartist 
7fc0: 3d 20 3f 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  = ?.#.# EVIDENCE
7fd0: 2d 4f 46 3a 20 52 2d 32 33 33 30 32 2d 33 30 39  -OF: R-23302-309
7fe0: 35 36 20 49 66 20 74 68 69 73 20 53 45 4c 45 43  56 If this SELEC
7ff0: 54 20 72 65 74 75 72 6e 73 20 61 6e 79 20 72 6f  T returns any ro
8000: 77 73 20 61 74 20 61 6c 6c 2c 0a 23 20 74 68 65  ws at all,.# the
8010: 6e 20 53 51 4c 69 74 65 20 63 6f 6e 63 6c 75 64  n SQLite conclud
8020: 65 73 20 74 68 61 74 20 64 65 6c 65 74 69 6e 67  es that deleting
8030: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 68   the row from th
8040: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 0a 23  e parent table.#
8050: 20 77 6f 75 6c 64 20 76 69 6f 6c 61 74 65 20 74   would violate t
8060: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
8070: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 72 65  onstraint and re
8080: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 0a  turns an error..
8090: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
80a0: 2d 32 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -25.1 {.  execsq
80b0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
80c0: 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20 20  ABLE artist(.   
80d0: 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20 49     artistid    I
80e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
80f0: 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69 73  EY, .      artis
8100: 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20 20  tname  TEXT.    
8110: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
8120: 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20 20  BLE track(.     
8130: 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e 54   trackid     INT
8140: 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74 72 61  EGER, .      tra
8150: 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
8160: 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
8170: 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20  t INTEGER,.     
8180: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72 61   FOREIGN KEY(tra
8190: 63 6b 61 72 74 69 73 74 29 20 52 45 46 45 52 45  ckartist) REFERE
81a0: 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
81b0: 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d  stid).    );.  }
81c0: 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
81d0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e  _test e_fkey-25.
81e0: 32 20 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72  2 {.  PRAGMA for
81f0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
8200: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
8210: 20 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52 4f   PLAN DELETE FRO
8220: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 31  M artist WHERE 1
8230: 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ;.  EXPLAIN QUER
8240: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 72 6f  Y PLAN SELECT ro
8250: 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20 57  wid FROM track W
8260: 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73 74  HERE trackartist
8270: 20 3d 20 3f 3b 0a 7d 20 7b 0a 20 20 30 20 30 20   = ?;.} {.  0 0 
8280: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61 72  0 {SCAN TABLE ar
8290: 74 69 73 74 7d 20 0a 20 20 30 20 30 20 30 20 7b  tist} .  0 0 0 {
82a0: 53 43 41 4e 20 54 41 42 4c 45 20 74 72 61 63 6b  SCAN TABLE track
82b0: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
82c0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 33 20  est e_fkey-25.3 
82d0: 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69  {.  PRAGMA forei
82e0: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
82f0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8300: 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  AN DELETE FROM a
8310: 72 74 69 73 74 20 57 48 45 52 45 20 31 3b 0a 7d  rtist WHERE 1;.}
8320: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
8330: 20 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a   TABLE artist} .
8340: 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41    0 0 0 {SCAN TA
8350: 42 4c 45 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f  BLE track}.}.do_
8360: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 34  test e_fkey-25.4
8370: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
8380: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
8390: 72 74 69 73 74 20 56 41 4c 55 45 53 28 35 2c 20  rtist VALUES(5, 
83a0: 27 61 72 74 69 73 74 20 35 27 29 3b 0a 20 20 20  'artist 5');.   
83b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74   INSERT INTO art
83c0: 69 73 74 20 56 41 4c 55 45 53 28 36 2c 20 27 61  ist VALUES(6, 'a
83d0: 72 74 69 73 74 20 36 27 29 3b 0a 20 20 20 20 49  rtist 6');.    I
83e0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73  NSERT INTO artis
83f0: 74 20 56 41 4c 55 45 53 28 37 2c 20 27 61 72 74  t VALUES(7, 'art
8400: 69 73 74 20 37 27 29 3b 0a 20 20 20 20 49 4e 53  ist 7');.    INS
8410: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
8420: 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b 20  ALUES(1, 'track 
8430: 31 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45  1', 5);.    INSE
8440: 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
8450: 4c 55 45 53 28 32 2c 20 27 74 72 61 63 6b 20 32  LUES(2, 'track 2
8460: 27 2c 20 36 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ', 6);.  }.} {}.
8470: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
8480: 32 35 2e 35 20 7b 0a 20 20 63 6f 6e 63 61 74 20  25.5 {.  concat 
8490: 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b  \.    [execsql {
84a0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
84b0: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
84c0: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 35 20 7d  rackartist = 5 }
84d0: 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68  ]   \.    [catch
84e0: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
84f0: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
8500: 72 74 69 73 74 69 64 20 3d 20 35 20 7d 5d 0a 7d  rtistid = 5 }].}
8510: 20 7b 31 20 31 20 7b 46 4f 52 45 49 47 4e 20 4b   {1 1 {FOREIGN K
8520: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
8530: 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  iled}}..do_test 
8540: 65 5f 66 6b 65 79 2d 32 35 2e 36 20 7b 0a 20 20  e_fkey-25.6 {.  
8550: 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78  concat \.    [ex
8560: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72  ecsql { SELECT r
8570: 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20  owid FROM track 
8580: 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73  WHERE trackartis
8590: 74 20 3d 20 37 20 7d 5d 20 20 20 5c 0a 20 20 20  t = 7 }]   \.   
85a0: 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c   [catchsql { DEL
85b0: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
85c0: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
85d0: 20 37 20 7d 5d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a   7 }].} {0 {}}..
85e0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
85f0: 35 2e 37 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c  5.7 {.  concat \
8600: 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 20  .    [execsql { 
8610: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
8620: 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72  M track WHERE tr
8630: 61 63 6b 61 72 74 69 73 74 20 3d 20 36 20 7d 5d  ackartist = 6 }]
8640: 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68 73     \.    [catchs
8650: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
8660: 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72   artist WHERE ar
8670: 74 69 73 74 69 64 20 3d 20 36 20 7d 5d 0a 7d 20  tistid = 6 }].} 
8680: 7b 32 20 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  {2 1 {FOREIGN KE
8690: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
86a0: 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  led}}..#--------
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 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
8700: 20 52 2d 34 37 39 33 36 2d 31 30 30 34 34 20 4f   R-47936-10044 O
8710: 72 2c 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 6c  r, more generall
8720: 79 3a 0a 23 20 53 45 4c 45 43 54 20 72 6f 77 69  y:.# SELECT rowi
8730: 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74 61  d FROM <child-ta
8740: 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69 6c  ble> WHERE <chil
8750: 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e 74  d-key> = :parent
8760: 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20 54  _key_value.#.# T
8770: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 61 20  est that when a 
8780: 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 66  row is deleted f
8790: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74  rom the parent t
87a0: 61 62 6c 65 20 6f 66 20 61 6e 20 46 4b 20 0a 23  able of an FK .#
87b0: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 74 68 65   constraint, the
87c0: 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69 73 20   child table is 
87d0: 71 75 65 72 69 65 64 20 66 6f 72 20 6f 72 70 68  queried for orph
87e0: 61 6e 65 64 20 72 6f 77 73 2e 20 54 68 65 0a 23  aned rows. The.#
87f0: 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76 61   query is equiva
8800: 6c 65 6e 74 20 74 6f 3a 0a 23 0a 23 20 20 20 53  lent to:.#.#   S
8810: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8820: 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57   <child-table> W
8830: 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e  HERE <child-key>
8840: 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76   = :parent_key_v
8850: 61 6c 75 65 0a 23 0a 23 20 41 6c 73 6f 20 74 65  alue.#.# Also te
8860: 73 74 20 74 68 61 74 20 77 68 65 6e 20 61 20 72  st that when a r
8870: 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  ow is inserted i
8880: 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 74  nto the parent t
8890: 61 62 6c 65 2c 20 6f 72 20 77 68 65 6e 20 74 68  able, or when th
88a0: 65 20 0a 23 20 70 61 72 65 6e 74 20 6b 65 79 20  e .# parent key 
88b0: 76 61 6c 75 65 73 20 6f 66 20 61 6e 20 65 78 69  values of an exi
88c0: 73 74 69 6e 67 20 72 6f 77 20 61 72 65 20 6d 6f  sting row are mo
88d0: 64 69 66 69 65 64 2c 20 61 20 71 75 65 72 79 20  dified, a query 
88e0: 65 71 75 69 76 61 6c 65 6e 74 0a 23 20 74 6f 20  equivalent.# to 
88f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
8900: 20 70 6c 61 6e 6e 65 64 2e 20 49 6e 20 73 6f 6d   planned. In som
8910: 65 20 63 61 73 65 73 20 69 74 20 69 73 20 6e 6f  e cases it is no
8920: 74 20 65 78 65 63 75 74 65 64 2c 20 62 75 74 20  t executed, but 
8930: 69 74 0a 23 20 69 73 20 61 6c 77 61 79 73 20 70  it.# is always p
8940: 6c 61 6e 6e 65 64 2e 0a 23 0a 23 20 20 20 53 45  lanned..#.#   SE
8950: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
8960: 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48  <child-table> WH
8970: 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20  ERE <child-key> 
8980: 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61  = :parent_key_va
8990: 6c 75 65 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  lue.#.# EVIDENCE
89a0: 2d 4f 46 3a 20 52 2d 36 31 36 31 36 2d 34 36 37  -OF: R-61616-467
89b0: 30 30 20 53 69 6d 69 6c 61 72 20 71 75 65 72 69  00 Similar queri
89c0: 65 73 20 6d 61 79 20 62 65 20 72 75 6e 20 69 66  es may be run if
89d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6f   the content.# o
89e0: 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  f the parent key
89f0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   is modified or 
8a00: 61 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e 73  a new row is ins
8a10: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70  erted into the p
8a20: 61 72 65 6e 74 0a 23 20 74 61 62 6c 65 2e 0a 23  arent.# table..#
8a30: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
8a40: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
8a50: 79 2d 32 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-26.1 {.  execs
8a60: 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
8a70: 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20 55  E parent(x, y, U
8a80: 4e 49 51 55 45 28 79 2c 20 78 29 29 20 7d 0a 7d  NIQUE(y, x)) }.}
8a90: 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20   {}.foreach {tn 
8aa0: 73 71 6c 7d 20 7b 0a 20 20 32 20 7b 20 0a 20 20  sql} {.  2 { .  
8ab0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
8ac0: 68 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49  hild(a, b, FOREI
8ad0: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
8ae0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
8af0: 2c 20 79 29 29 0a 20 20 7d 0a 20 20 33 20 7b 20  , y)).  }.  3 { 
8b00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8b10: 45 20 63 68 69 6c 64 28 61 2c 20 62 2c 20 46 4f  E child(a, b, FO
8b20: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20  REIGN KEY(a, b) 
8b30: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
8b40: 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43 52  t(x, y));.    CR
8b50: 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64  EATE INDEX child
8b60: 69 20 4f 4e 20 63 68 69 6c 64 28 61 2c 20 62 29  i ON child(a, b)
8b70: 3b 0a 20 20 7d 0a 20 20 34 20 7b 20 0a 20 20 20  ;.  }.  4 { .   
8b80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
8b90: 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  ild(a, b, FOREIG
8ba0: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
8bb0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c  RENCES parent(x,
8bc0: 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   y));.    CREATE
8bd0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 63 68   UNIQUE INDEX ch
8be0: 69 6c 64 69 20 4f 4e 20 63 68 69 6c 64 28 62 2c  ildi ON child(b,
8bf0: 20 61 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65   a);.  }.} {.  e
8c00: 78 65 63 73 71 6c 20 24 73 71 6c 0a 0a 20 20 65  xecsql $sql..  e
8c10: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
8c20: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
8c30: 46 7d 0a 20 20 73 65 74 20 64 65 6c 65 74 65 20  F}.  set delete 
8c40: 5b 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 20 20  [concat \.      
8c50: 5b 65 71 70 20 22 44 45 4c 45 54 45 20 46 52 4f  [eqp "DELETE FRO
8c60: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 31  M parent WHERE 1
8c70: 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20  "] \.      [eqp 
8c80: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  "SELECT rowid FR
8c90: 4f 4d 20 63 68 69 6c 64 20 57 48 45 52 45 20 61  OM child WHERE a
8ca0: 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d   = ? AND b = ?"]
8cb0: 0a 20 20 5d 0a 20 20 73 65 74 20 75 70 64 61 74  .  ].  set updat
8cc0: 65 20 5b 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20  e [concat \.    
8cd0: 20 20 5b 65 71 70 20 22 55 50 44 41 54 45 20 70    [eqp "UPDATE p
8ce0: 61 72 65 6e 74 20 53 45 54 20 78 3d 3f 2c 20 79  arent SET x=?, y
8cf0: 3d 3f 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71  =?"] \.      [eq
8d00: 70 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20  p "SELECT rowid 
8d10: 46 52 4f 4d 20 63 68 69 6c 64 20 57 48 45 52 45  FROM child WHERE
8d20: 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f   a = ? AND b = ?
8d30: 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20  "] \.      [eqp 
8d40: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  "SELECT rowid FR
8d50: 4f 4d 20 63 68 69 6c 64 20 57 48 45 52 45 20 61  OM child WHERE a
8d60: 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22 5d   = ? AND b = ?"]
8d70: 0a 20 20 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  ].  execsql {
8d80: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
8d90: 65 79 73 20 3d 20 4f 4e 7d 0a 0a 20 20 64 6f 5f  eys = ON}..  do_
8da0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24  test e_fkey-26.$
8db0: 74 6e 2e 31 20 7b 20 65 71 70 20 22 44 45 4c 45  tn.1 { eqp "DELE
8dc0: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
8dd0: 48 45 52 45 20 31 22 20 7d 20 24 64 65 6c 65 74  HERE 1" } $delet
8de0: 65 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  e.  do_test e_fk
8df0: 65 79 2d 32 36 2e 24 74 6e 2e 32 20 7b 20 65 71  ey-26.$tn.2 { eq
8e00: 70 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  p "UPDATE parent
8e10: 20 73 65 74 20 78 3d 3f 2c 20 79 3d 3f 22 20 7d   set x=?, y=?" }
8e20: 20 24 75 70 64 61 74 65 0a 0a 20 20 65 78 65 63   $update..  exec
8e30: 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20  sql {DROP TABLE 
8e40: 63 68 69 6c 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  child}.}..#-----
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
8ea0: 4f 46 3a 20 52 2d 31 34 35 35 33 2d 33 34 30 31  OF: R-14553-3401
8eb0: 33 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 65  3.#.# Test the e
8ec0: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 20 61 74  xample schema at
8ed0: 20 74 68 65 20 65 6e 64 20 6f 66 20 73 65 63 74   the end of sect
8ee0: 69 6f 6e 20 33 2e 20 41 6c 73 6f 20 74 65 73 74  ion 3. Also test
8ef0: 20 74 68 61 74 20 69 73 0a 23 20 69 73 20 22 65   that is.# is "e
8f00: 66 66 69 63 69 65 6e 74 22 2e 20 49 6e 20 74 68  fficient". In th
8f10: 69 73 20 63 61 73 65 20 22 65 66 66 69 63 69 65  is case "efficie
8f20: 6e 74 22 20 6d 65 61 6e 73 20 74 68 61 74 20 66  nt" means that f
8f30: 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 72 65 6c  oreign key.# rel
8f40: 61 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73 20  ated operations 
8f50: 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  on the parent ta
8f60: 62 6c 65 20 64 6f 20 6e 6f 74 20 70 72 6f 76 6f  ble do not provo
8f70: 6b 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2e  ke linear scans.
8f80: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
8f90: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
8fa0: 79 2d 32 37 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-27.1 {.  execs
8fb0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
8fc0: 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
8fd0: 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
8fe0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8ff0: 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
9000: 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
9010: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
9020: 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
9030: 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
9040: 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61  TEGER,.      tra
9050: 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
9060: 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
9070: 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  t INTEGER REFERE
9080: 4e 43 45 53 20 61 72 74 69 73 74 0a 20 20 20 20  NCES artist.    
9090: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
90a0: 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20 4f  DEX trackindex O
90b0: 4e 20 74 72 61 63 6b 28 74 72 61 63 6b 61 72 74  N track(trackart
90c0: 69 73 74 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ist);.  }.} {}.d
90d0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37  o_test e_fkey-27
90e0: 2e 32 20 7b 0a 20 20 65 71 70 20 7b 20 49 4e 53  .2 {.  eqp { INS
90f0: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
9100: 56 41 4c 55 45 53 28 3f 2c 20 3f 29 20 7d 0a 7d  VALUES(?, ?) }.}
9110: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
9120: 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 33 20  est e_fkey-27.3 
9130: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
9140: 59 20 50 4c 41 4e 20 55 50 44 41 54 45 20 61 72  Y PLAN UPDATE ar
9150: 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74 69  tist SET artisti
9160: 64 20 3d 20 3f 2c 20 61 72 74 69 73 74 6e 61 6d  d = ?, artistnam
9170: 65 20 3d 20 3f 0a 7d 20 7b 0a 20 20 30 20 30 20  e = ?.} {.  0 0 
9180: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61 72  0 {SCAN TABLE ar
9190: 74 69 73 74 7d 20 0a 20 20 30 20 30 20 30 20 7b  tist} .  0 0 0 {
91a0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 72 61  SEARCH TABLE tra
91b0: 63 6b 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e  ck USING COVERIN
91c0: 47 20 49 4e 44 45 58 20 74 72 61 63 6b 69 6e 64  G INDEX trackind
91d0: 65 78 20 28 74 72 61 63 6b 61 72 74 69 73 74 3d  ex (trackartist=
91e0: 3f 29 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 45  ?)} .  0 0 0 {SE
91f0: 41 52 43 48 20 54 41 42 4c 45 20 74 72 61 63 6b  ARCH TABLE track
9200: 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
9210: 49 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78  INDEX trackindex
9220: 20 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29   (trackartist=?)
9230: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
9240: 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 34 20  est e_fkey-27.4 
9250: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
9260: 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52  Y PLAN DELETE FR
9270: 4f 4d 20 61 72 74 69 73 74 0a 7d 20 7b 0a 20 20  OM artist.} {.  
9280: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
9290: 45 20 61 72 74 69 73 74 7d 20 0a 20 20 30 20 30  E artist} .  0 0
92a0: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
92b0: 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f 56   track USING COV
92c0: 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61 63  ERING INDEX trac
92d0: 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72 74  kindex (trackart
92e0: 69 73 74 3d 3f 29 7d 0a 7d 0a 0a 0a 23 23 23 23  ist=?)}.}...####
92f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9330: 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
9340: 49 4f 4e 20 34 2e 31 3a 20 43 6f 6d 70 6f 73 69  ION 4.1: Composi
9350: 74 65 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43  te Foreign Key C
9360: 6f 6e 73 74 72 61 69 6e 74 73 0a 23 23 23 23 23  onstraints.#####
9370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93b0: 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ######..#-------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9400: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
9410: 70 61 72 65 6e 74 20 61 6e 64 20 63 68 69 6c 64  parent and child
9420: 20 6b 65 79 73 20 6d 75 73 74 20 68 61 76 65 20   keys must have 
9430: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
9440: 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20  of columns..#.# 
9450: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9460: 31 30 36 32 2d 33 34 34 33 31 20 50 61 72 65 6e  1062-34431 Paren
9470: 74 20 61 6e 64 20 63 68 69 6c 64 20 6b 65 79 73  t and child keys
9480: 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
9490: 61 6d 65 0a 23 20 63 61 72 64 69 6e 61 6c 69 74  ame.# cardinalit
94a0: 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  y..#.foreach {tn
94b0: 20 73 71 6c 20 65 72 72 7d 20 7b 0a 20 20 31 20   sql err} {.  1 
94c0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28  "CREATE TABLE c(
94d0: 6a 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  jj REFERENCES p(
94e0: 78 2c 20 79 29 29 22 20 0a 20 20 20 20 7b 66 6f  x, y))" .    {fo
94f0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 6a 6a 20  reign key on jj 
9500: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
9510: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
9520: 20 6f 66 20 74 61 62 6c 65 20 70 7d 0a 0a 20 20   of table p}..  
9530: 32 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  2 "CREATE TABLE 
9540: 63 28 6a 6a 20 52 45 46 45 52 45 4e 43 45 53 20  c(jj REFERENCES 
9550: 70 28 29 29 22 20 7b 6e 65 61 72 20 22 29 22 3a  p())" {near ")":
9560: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a   syntax error}..
9570: 20 20 33 20 22 43 52 45 41 54 45 20 54 41 42 4c    3 "CREATE TABL
9580: 45 20 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20  E c(jj, FOREIGN 
9590: 4b 45 59 28 6a 6a 29 20 52 45 46 45 52 45 4e 43  KEY(jj) REFERENC
95a0: 45 53 20 70 28 78 2c 20 79 29 29 22 20 0a 20 20  ES p(x, y))" .  
95b0: 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    {number of col
95c0: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
95d0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
95e0: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
95f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9600: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
9610: 7d 0a 0a 20 20 34 20 22 43 52 45 41 54 45 20 54  }..  4 "CREATE T
9620: 41 42 4c 45 20 63 28 6a 6a 2c 20 46 4f 52 45 49  ABLE c(jj, FOREI
9630: 47 4e 20 4b 45 59 28 6a 6a 29 20 52 45 46 45 52  GN KEY(jj) REFER
9640: 45 4e 43 45 53 20 70 28 29 29 22 20 0a 20 20 20  ENCES p())" .   
9650: 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74   {near ")": synt
9660: 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 35 20 22  ax error}..  5 "
9670: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 69  CREATE TABLE c(i
9680: 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b  i, jj, FOREIGN K
9690: 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52  EY(jj, ii) REFER
96a0: 45 4e 43 45 53 20 70 28 29 29 22 20 0a 20 20 20  ENCES p())" .   
96b0: 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74   {near ")": synt
96c0: 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 36 20 22  ax error}..  6 "
96d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 69  CREATE TABLE c(i
96e0: 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b  i, jj, FOREIGN K
96f0: 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52  EY(jj, ii) REFER
9700: 45 4e 43 45 53 20 70 28 78 29 29 22 20 0a 20 20  ENCES p(x))" .  
9710: 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    {number of col
9720: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
9730: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
9740: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
9750: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9760: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
9770: 7d 0a 0a 20 20 37 20 22 43 52 45 41 54 45 20 54  }..  7 "CREATE T
9780: 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46  ABLE c(ii, jj, F
9790: 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69  OREIGN KEY(jj, i
97a0: 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  i) REFERENCES p(
97b0: 78 2c 79 2c 7a 29 29 22 20 0a 20 20 20 20 7b 6e  x,y,z))" .    {n
97c0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
97d0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
97e0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
97f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9800: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
9810: 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 7d 20  renced table}.} 
9820: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
9830: 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  les.  do_test e_
9840: 66 6b 65 79 2d 32 38 2e 24 74 6e 20 5b 6c 69 73  fkey-28.$tn [lis
9850: 74 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d  t catchsql $sql]
9860: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d   [list 1 $err].}
9870: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9880: 32 38 2e 38 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  28.8 {.  drop_al
9890: 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73  l_tables.  execs
98a0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
98b0: 54 41 42 4c 45 20 70 28 78 20 50 52 49 4d 41 52  TABLE p(x PRIMAR
98c0: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
98d0: 54 45 20 54 41 42 4c 45 20 63 28 61 2c 20 62 2c  TE TABLE c(a, b,
98e0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62   FOREIGN KEY(a,b
98f0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b  ) REFERENCES p);
9900: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
9910: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a  {DELETE FROM p}.
9920: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
9930: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 22  y mismatch - "c"
9940: 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22   referencing "p"
9950: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
9960: 79 2d 32 38 2e 39 20 7b 0a 20 20 64 72 6f 70 5f  y-28.9 {.  drop_
9970: 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
9980: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
9990: 45 20 54 41 42 4c 45 20 70 28 78 2c 20 79 2c 20  E TABLE p(x, y, 
99a0: 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 79 29  PRIMARY KEY(x,y)
99b0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
99c0: 42 4c 45 20 63 28 61 20 52 45 46 45 52 45 4e 43  BLE c(a REFERENC
99d0: 45 53 20 70 29 3b 0a 20 20 7d 0a 20 20 63 61 74  ES p);.  }.  cat
99e0: 63 68 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52  chsql {DELETE FR
99f0: 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  OM p}.} {1 {fore
9a00: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
9a10: 20 2d 20 22 63 22 20 72 65 66 65 72 65 6e 63 69   - "c" referenci
9a20: 6e 67 20 22 70 22 7d 7d 0a 0a 0a 23 2d 2d 2d 2d  ng "p"}}...#----
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a70: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
9a80: 2d 4f 46 3a 20 52 2d 32 34 36 37 36 2d 30 39 38  -OF: R-24676-098
9a90: 35 39 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20  59.#.# Test the 
9aa0: 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 20 69  example schema i
9ab0: 6e 20 74 68 65 20 22 43 6f 6d 70 6f 73 69 74 65  n the "Composite
9ac0: 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e   Foreign Key Con
9ad0: 73 74 72 61 69 6e 74 73 22 20 0a 23 20 73 65 63  straints" .# sec
9ae0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
9af0: 65 5f 66 6b 65 79 2d 32 39 2e 31 20 7b 0a 20 20  e_fkey-29.1 {.  
9b00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
9b10: 45 41 54 45 20 54 41 42 4c 45 20 61 6c 62 75 6d  EATE TABLE album
9b20: 28 0a 20 20 20 20 20 20 61 6c 62 75 6d 61 72 74  (.      albumart
9b30: 69 73 74 20 54 45 58 54 2c 0a 20 20 20 20 20 20  ist TEXT,.      
9b40: 61 6c 62 75 6d 6e 61 6d 65 20 54 45 58 54 2c 0a  albumname TEXT,.
9b50: 20 20 20 20 20 20 61 6c 62 75 6d 63 6f 76 65 72        albumcover
9b60: 20 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 50   BINARY,.      P
9b70: 52 49 4d 41 52 59 20 4b 45 59 28 61 6c 62 75 6d  RIMARY KEY(album
9b80: 61 72 74 69 73 74 2c 20 61 6c 62 75 6d 6e 61 6d  artist, albumnam
9b90: 65 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  e).    );.    CR
9ba0: 45 41 54 45 20 54 41 42 4c 45 20 73 6f 6e 67 28  EATE TABLE song(
9bb0: 0a 20 20 20 20 20 20 73 6f 6e 67 69 64 20 49 4e  .      songid IN
9bc0: 54 45 47 45 52 2c 0a 20 20 20 20 20 20 73 6f 6e  TEGER,.      son
9bd0: 67 61 72 74 69 73 74 20 54 45 58 54 2c 0a 20 20  gartist TEXT,.  
9be0: 20 20 20 20 73 6f 6e 67 61 6c 62 75 6d 20 54 45      songalbum TE
9bf0: 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67 6e 61  XT,.      songna
9c00: 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 46  me TEXT,.      F
9c10: 4f 52 45 49 47 4e 20 4b 45 59 28 73 6f 6e 67 61  OREIGN KEY(songa
9c20: 72 74 69 73 74 2c 20 73 6f 6e 67 61 6c 62 75 6d  rtist, songalbum
9c30: 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 6c 62  ) REFERENCES alb
9c40: 75 6d 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 61  um(albumartist,a
9c50: 6c 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b  lbumname).    );
9c60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  .  }.} {}..do_te
9c70: 73 74 20 65 5f 66 6b 65 79 2d 32 39 2e 32 20 7b  st e_fkey-29.2 {
9c80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
9c90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 6c 62   INSERT INTO alb
9ca0: 75 6d 20 56 41 4c 55 45 53 28 27 45 6c 76 69 73  um VALUES('Elvis
9cb0: 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69   Presley', 'Elvi
9cc0: 73 27 27 20 43 68 72 69 73 74 6d 61 73 20 41 6c  s'' Christmas Al
9cd0: 62 75 6d 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bum', NULL);.   
9ce0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e   INSERT INTO son
9cf0: 67 20 56 41 4c 55 45 53 28 0a 20 20 20 20 20 20  g VALUES(.      
9d00: 31 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65  1, 'Elvis Presle
9d10: 79 27 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72  y', 'Elvis'' Chr
9d20: 69 73 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 27  istmas Album', '
9d30: 48 65 72 65 20 43 6f 6d 65 73 20 53 61 6e 74 61  Here Comes Santa
9d40: 20 43 6c 61 75 73 65 27 0a 20 20 20 20 29 3b 0a   Clause'.    );.
9d50: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
9d60: 20 65 5f 66 6b 65 79 2d 32 39 2e 33 20 7b 0a 20   e_fkey-29.3 {. 
9d70: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
9d80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67  INSERT INTO song
9d90: 20 56 41 4c 55 45 53 28 32 2c 20 27 45 6c 76 69   VALUES(2, 'Elvi
9da0: 73 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76  s Presley', 'Elv
9db0: 69 73 20 49 73 20 42 61 63 6b 21 27 2c 20 27 46  is Is Back!', 'F
9dc0: 65 76 65 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31  ever');.  }.} {1
9dd0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
9de0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
9df0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9e40: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9e50: 33 33 36 32 36 2d 34 38 34 31 38 20 49 6e 20 53  33626-48418 In S
9e60: 51 4c 69 74 65 2c 20 69 66 20 61 6e 79 20 6f 66  QLite, if any of
9e70: 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63   the child key c
9e80: 6f 6c 75 6d 6e 73 0a 23 20 28 69 6e 20 74 68 69  olumns.# (in thi
9e90: 73 20 63 61 73 65 20 73 6f 6e 67 61 72 74 69 73  s case songartis
9ea0: 74 20 61 6e 64 20 73 6f 6e 67 61 6c 62 75 6d 29  t and songalbum)
9eb0: 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   are NULL, then 
9ec0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 23 20 72 65  there is no.# re
9ed0: 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 20  quirement for a 
9ee0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f  corresponding ro
9ef0: 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  w in the parent 
9f00: 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74  table..#.do_test
9f10: 20 65 5f 66 6b 65 79 2d 33 30 2e 31 20 7b 0a 20   e_fkey-30.1 {. 
9f20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
9f30: 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20  NSERT INTO song 
9f40: 56 41 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73  VALUES(2, 'Elvis
9f50: 20 50 72 65 73 6c 65 79 27 2c 20 4e 55 4c 4c 2c   Presley', NULL,
9f60: 20 27 46 65 76 65 72 27 29 3b 0a 20 20 20 20 49   'Fever');.    I
9f70: 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20  NSERT INTO song 
9f80: 56 41 4c 55 45 53 28 33 2c 20 4e 55 4c 4c 2c 20  VALUES(3, NULL, 
9f90: 27 45 6c 76 69 73 20 49 73 20 42 61 63 6b 27 2c  'Elvis Is Back',
9fa0: 20 27 53 6f 6c 64 69 65 72 20 42 6f 79 27 29 3b   'Soldier Boy');
9fb0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23  .  }.} {}..#####
9fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a000: 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49  ######.### SECTI
a010: 4f 4e 20 34 2e 32 3a 20 44 65 66 65 72 72 65 64  ON 4.2: Deferred
a020: 20 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e   Foreign Key Con
a030: 73 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23  straints.#######
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 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0d0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20  .# Test that if 
a0e0: 61 20 73 74 61 74 65 6d 65 6e 74 20 76 69 6f 6c  a statement viol
a0f0: 61 74 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  ates an immediat
a100: 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c  e FK constraint,
a110: 20 61 6e 64 20 74 68 65 0a 23 20 64 61 74 61 62   and the.# datab
a120: 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  ase does not sat
a130: 69 73 66 79 20 74 68 65 20 46 4b 20 63 6f 6e 73  isfy the FK cons
a140: 74 72 61 69 6e 74 20 6f 6e 63 65 20 61 6c 6c 20  traint once all 
a150: 65 66 66 65 63 74 73 20 6f 66 20 74 68 65 0a 23  effects of the.#
a160: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
a170: 62 65 65 6e 20 61 70 70 6c 69 65 64 2c 20 61 6e  been applied, an
a180: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
a190: 65 64 20 61 6e 64 20 74 68 65 20 65 66 66 65 63  ed and the effec
a1a0: 74 73 20 6f 66 0a 23 20 74 68 65 20 73 74 61 74  ts of.# the stat
a1b0: 65 6d 65 6e 74 20 72 6f 6c 6c 65 64 20 62 61 63  ement rolled bac
a1c0: 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  k..#.# EVIDENCE-
a1d0: 4f 46 3a 20 52 2d 30 39 33 32 33 2d 33 30 34 37  OF: R-09323-3047
a1e0: 30 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74  0 If a statement
a1f0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
a200: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 23 20  ntents of the.# 
a210: 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
a220: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 66 6f   an immediate fo
a230: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a240: 61 69 6e 74 20 69 73 20 69 6e 20 76 69 6f 6c 61  aint is in viola
a250: 74 69 6f 6e 0a 23 20 61 74 20 74 68 65 20 63 6f  tion.# at the co
a260: 6e 63 6c 75 73 69 6f 6e 20 74 68 65 20 73 74 61  nclusion the sta
a270: 74 65 6d 65 6e 74 2c 20 61 6e 20 65 78 63 65 70  tement, an excep
a280: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 20 61  tion is thrown a
a290: 6e 64 20 74 68 65 0a 23 20 65 66 66 65 63 74 73  nd the.# effects
a2a0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
a2b0: 74 20 61 72 65 20 72 65 76 65 72 74 65 64 2e 0a  t are reverted..
a2c0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
a2d0: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
a2e0: 2d 33 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -31.1 {.  execsq
a2f0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a300: 41 42 4c 45 20 6b 69 6e 67 28 61 2c 20 62 2c 20  ABLE king(a, b, 
a310: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 29 29 3b  PRIMARY KEY(a));
a320: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a330: 45 20 70 72 69 6e 63 65 28 63 20 52 45 46 45 52  E prince(c REFER
a340: 45 4e 43 45 53 20 6b 69 6e 67 2c 20 64 29 3b 0a  ENCES king, d);.
a350: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
a360: 74 20 65 5f 66 6b 65 79 2d 33 31 2e 32 20 7b 0a  t e_fkey-31.2 {.
a370: 20 20 23 20 45 78 65 63 75 74 65 20 61 20 73 74    # Execute a st
a380: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 76 69 6f  atement that vio
a390: 6c 61 74 65 73 20 74 68 65 20 69 6d 6d 65 64 69  lates the immedi
a3a0: 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  ate FK constrain
a3b0: 74 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  t..  catchsql { 
a3c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e  INSERT INTO prin
a3d0: 63 65 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20  ce VALUES(1, 2) 
a3e0: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
a3f0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
a400: 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ailed}}..do_test
a410: 20 65 5f 66 6b 65 79 2d 33 31 2e 33 20 7b 0a 20   e_fkey-31.3 {. 
a420: 20 23 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73   # This time, us
a430: 65 20 61 20 74 72 69 67 67 65 72 20 74 6f 20 66  e a trigger to f
a440: 69 78 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ix the constrain
a450: 74 20 76 69 6f 6c 61 74 69 6f 6e 20 62 65 66 6f  t violation befo
a460: 72 65 20 74 68 65 0a 20 20 23 20 73 74 61 74 65  re the.  # state
a470: 6d 65 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65  ment has finishe
a480: 64 20 65 78 65 63 75 74 69 6e 67 2e 20 54 68 65  d executing. The
a490: 6e 20 65 78 65 63 75 74 65 20 74 68 65 20 73 61  n execute the sa
a4a0: 6d 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73 0a  me statement as.
a4b0: 20 20 23 20 69 6e 20 74 68 65 20 70 72 65 76 69    # in the previ
a4c0: 6f 75 73 20 74 65 73 74 20 63 61 73 65 2e 20 54  ous test case. T
a4d0: 68 69 73 20 74 69 6d 65 2c 20 6e 6f 20 65 72 72  his time, no err
a4e0: 6f 72 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  or..  execsql {.
a4f0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
a500: 45 52 20 6b 74 20 41 46 54 45 52 20 49 4e 53 45  ER kt AFTER INSE
a510: 52 54 20 4f 4e 20 70 72 69 6e 63 65 20 57 48 45  RT ON prince WHE
a520: 4e 0a 20 20 20 20 20 20 4e 4f 54 20 45 58 49 53  N.      NOT EXIS
a530: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
a540: 4d 20 6b 69 6e 67 20 57 48 45 52 45 20 61 20 3d  M king WHERE a =
a550: 20 6e 65 77 2e 63 29 0a 20 20 20 20 42 45 47 49   new.c).    BEGI
a560: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
a570: 4e 54 4f 20 6b 69 6e 67 20 56 41 4c 55 45 53 28  NTO king VALUES(
a580: 6e 65 77 2e 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20  new.c, NULL);.  
a590: 20 20 45 4e 44 0a 20 20 7d 0a 20 20 65 78 65 63    END.  }.  exec
a5a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a5b0: 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28  O prince VALUES(
a5c0: 31 2c 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  1, 2) }.} {}..# 
a5d0: 54 65 73 74 20 74 68 61 74 20 6f 70 65 72 61 74  Test that operat
a5e0: 69 6e 67 20 69 6e 73 69 64 65 20 61 20 74 72 61  ing inside a tra
a5f0: 6e 73 61 63 74 69 6f 6e 20 6d 61 6b 65 73 20 6e  nsaction makes n
a600: 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20  o difference to 
a610: 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e  .# immediate con
a620: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
a630: 6e 20 68 61 6e 64 6c 69 6e 67 2e 0a 64 6f 5f 74  n handling..do_t
a640: 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 34 20  est e_fkey-31.4 
a650: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
a660: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
a670: 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20  ERT INTO prince 
a680: 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20  VALUES(2, 3);.  
a690: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 6b    DROP TRIGGER k
a6a0: 74 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  t;.  }.  catchsq
a6b0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
a6c0: 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28 33 2c  prince VALUES(3,
a6d0: 20 34 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45   4) }.} {1 {FORE
a6e0: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
a6f0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
a700: 65 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 35 20  est e_fkey-31.5 
a710: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
a720: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45    COMMIT;.    SE
a730: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 69 6e 67  LECT * FROM king
a740: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 7d 20 32 20  ;.  }.} {1 {} 2 
a750: 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}}..#----------
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a7a0: 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
a7b0: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
a7c0: 61 69 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64  aint is violated
a7d0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
a7e0: 63 74 69 6f 6e 2c 0a 23 20 6e 6f 74 68 69 6e 67  ction,.# nothing
a7f0: 20 68 61 70 70 65 6e 73 20 69 6d 6d 65 64 69 61   happens immedia
a800: 74 65 6c 79 20 61 6e 64 20 74 68 65 20 64 61 74  tely and the dat
a810: 61 62 61 73 65 20 69 73 20 61 6c 6c 6f 77 65 64  abase is allowed
a820: 20 74 6f 20 70 65 72 73 69 73 74 0a 23 20 69 6e   to persist.# in
a830: 20 61 20 73 74 61 74 65 20 74 68 61 74 20 64 6f   a state that do
a840: 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74  es not satisfy t
a850: 68 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  he FK constraint
a860: 2e 20 48 6f 77 65 76 65 72 20 61 74 74 65 6d 70  . However attemp
a870: 74 73 0a 23 20 74 6f 20 43 4f 4d 4d 49 54 20 74  ts.# to COMMIT t
a880: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  he transaction f
a890: 61 69 6c 20 75 6e 74 69 6c 20 74 68 65 20 46 4b  ail until the FK
a8a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73   constraint is s
a8b0: 61 74 69 73 66 69 65 64 2e 0a 23 0a 23 20 45 56  atisfied..#.# EV
a8c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 31  IDENCE-OF: R-491
a8d0: 37 38 2d 32 31 33 35 38 20 42 79 20 63 6f 6e 74  78-21358 By cont
a8e0: 72 61 73 74 2c 20 69 66 20 61 20 73 74 61 74 65  rast, if a state
a8f0: 6d 65 6e 74 20 6d 6f 64 69 66 69 65 73 20 74 68  ment modifies th
a900: 65 0a 23 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  e.# contents of 
a910: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 63  the database suc
a920: 68 20 74 68 61 74 20 61 20 64 65 66 65 72 72 65  h that a deferre
a930: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
a940: 6e 73 74 72 61 69 6e 74 0a 23 20 69 73 20 76 69  nstraint.# is vi
a950: 6f 6c 61 74 65 64 2c 20 74 68 65 20 76 69 6f 6c  olated, the viol
a960: 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 65 70  ation is not rep
a970: 6f 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  orted immediatel
a980: 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  y..#.# EVIDENCE-
a990: 4f 46 3a 20 52 2d 33 39 36 39 32 2d 31 32 34 38  OF: R-39692-1248
a9a0: 38 20 44 65 66 65 72 72 65 64 20 66 6f 72 65 69  8 Deferred forei
a9b0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
a9c0: 74 73 20 61 72 65 20 6e 6f 74 0a 23 20 63 68 65  ts are not.# che
a9d0: 63 6b 65 64 20 75 6e 74 69 6c 20 74 68 65 20 74  cked until the t
a9e0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 72 69 65 73  ransaction tries
a9f0: 20 74 6f 20 43 4f 4d 4d 49 54 2e 0a 23 0a 23 20   to COMMIT..#.# 
aa00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
aa10: 35 31 34 37 2d 34 37 36 36 34 20 46 6f 72 20 61  5147-47664 For a
aa20: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 75 73  s long as the us
aa30: 65 72 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 23  er has an open.#
aa40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
aa50: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
aa60: 6c 6f 77 65 64 20 74 6f 20 65 78 69 73 74 20 69  lowed to exist i
aa70: 6e 20 61 20 73 74 61 74 65 20 74 68 61 74 20 76  n a state that v
aa80: 69 6f 6c 61 74 65 73 0a 23 20 61 6e 79 20 6e 75  iolates.# any nu
aa90: 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72 65 64  mber of deferred
aaa0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
aab0: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56  straints..#.# EV
aac0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 36  IDENCE-OF: R-296
aad0: 30 34 2d 33 30 33 39 35 20 48 6f 77 65 76 65 72  04-30395 However
aae0: 2c 20 43 4f 4d 4d 49 54 20 77 69 6c 6c 20 66 61  , COMMIT will fa
aaf0: 69 6c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 23 20  il as long as.# 
ab00: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
ab10: 74 72 61 69 6e 74 73 20 72 65 6d 61 69 6e 20 69  traints remain i
ab20: 6e 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 70  n violation..#.p
ab30: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33  roc test_efkey_3
ab40: 34 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  4 {tn isError sq
ab50: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
ab60: 5f 66 6b 65 79 2d 33 32 2e 24 74 6e 20 22 0a 20  _fkey-32.$tn ". 
ab70: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71     catchsql {$sq
ab80: 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  l}.  " [lindex {
ab90: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45 49  {0 {}} {1 {FOREI
aba0: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
abb0: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
abc0: 72 72 6f 72 5d 0a 7d 0a 64 72 6f 70 5f 61 6c 6c  rror].}.drop_all
abd0: 5f 74 61 62 6c 65 73 0a 0a 74 65 73 74 5f 65 66  _tables..test_ef
abe0: 6b 65 79 5f 33 34 20 20 31 20 30 20 7b 0a 20 20  key_34  1 0 {.  
abf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6c 28  CREATE TABLE ll(
ac00: 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  k PRIMARY KEY);.
ac10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
ac20: 6b 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 6c  k(c REFERENCES l
ac30: 6c 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  l DEFERRABLE INI
ac40: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29  TIALLY DEFERRED)
ac50: 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33  ;.}.test_efkey_3
ac60: 34 20 20 32 20 30 20 22 42 45 47 49 4e 22 0a 74  4  2 0 "BEGIN".t
ac70: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 33 20  est_efkey_34  3 
ac80: 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  0   "INSERT INTO
ac90: 20 6b 6b 20 56 41 4c 55 45 53 28 35 29 22 0a 74   kk VALUES(5)".t
aca0: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 34 20  est_efkey_34  4 
acb0: 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  0   "INSERT INTO
acc0: 20 6b 6b 20 56 41 4c 55 45 53 28 31 30 29 22 0a   kk VALUES(10)".
acd0: 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 35  test_efkey_34  5
ace0: 20 31 20 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74   1 "COMMIT".test
acf0: 5f 65 66 6b 65 79 5f 33 34 20 20 36 20 30 20 20  _efkey_34  6 0  
ad00: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c   "INSERT INTO ll
ad10: 20 56 41 4c 55 45 53 28 31 30 29 22 0a 74 65 73   VALUES(10)".tes
ad20: 74 5f 65 66 6b 65 79 5f 33 34 20 20 37 20 31 20  t_efkey_34  7 1 
ad30: 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66  "COMMIT".test_ef
ad40: 6b 65 79 5f 33 34 20 20 38 20 30 20 20 20 22 49  key_34  8 0   "I
ad50: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41  NSERT INTO ll VA
ad60: 4c 55 45 53 28 35 29 22 0a 74 65 73 74 5f 65 66  LUES(5)".test_ef
ad70: 6b 65 79 5f 33 34 20 20 39 20 30 20 22 43 4f 4d  key_34  9 0 "COM
ad80: 4d 49 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  MIT"..#---------
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: 0a 23 20 57 68 65 6e 20 6e 6f 74 20 72 75 6e 6e  .# When not runn
ade0: 69 6e 67 20 69 6e 73 69 64 65 20 61 20 74 72 61  ing inside a tra
adf0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 64 65 66 65  nsaction, a defe
ae00: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
ae10: 69 73 20 73 69 6d 69 6c 61 72 0a 23 20 74 6f 20  is similar.# to 
ae20: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e  an immediate con
ae30: 73 74 72 61 69 6e 74 20 28 76 69 6f 6c 61 74 69  straint (violati
ae40: 6f 6e 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  ons are reported
ae50: 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 23   immediately)..#
ae60: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ae70: 52 2d 35 36 38 34 34 2d 36 31 37 30 35 20 49 66  R-56844-61705 If
ae80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
ae90: 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 69 6e  tement is not in
aea0: 73 69 64 65 20 61 6e 0a 23 20 65 78 70 6c 69 63  side an.# explic
aeb0: 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  it transaction (
aec0: 61 20 42 45 47 49 4e 2f 43 4f 4d 4d 49 54 2f 52  a BEGIN/COMMIT/R
aed0: 4f 4c 4c 42 41 43 4b 20 62 6c 6f 63 6b 29 2c 20  OLLBACK block), 
aee0: 74 68 65 6e 20 61 6e 20 69 6d 70 6c 69 63 69 74  then an implicit
aef0: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  .# transaction i
af00: 73 20 63 6f 6d 6d 69 74 74 65 64 20 61 73 20 73  s committed as s
af10: 6f 6f 6e 20 61 73 20 74 68 65 20 73 74 61 74 65  oon as the state
af20: 6d 65 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65  ment has finishe
af30: 64 0a 23 20 65 78 65 63 75 74 69 6e 67 2e 20 49  d.# executing. I
af40: 6e 20 74 68 69 73 20 63 61 73 65 20 64 65 66 65  n this case defe
af50: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  rred constraints
af60: 20 62 65 68 61 76 65 20 74 68 65 20 73 61 6d 65   behave the same
af70: 20 61 73 0a 23 20 69 6d 6d 65 64 69 61 74 65 20   as.# immediate 
af80: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64  constraints..#.d
af90: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 70  rop_all_tables.p
afa0: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33  roc test_efkey_3
afb0: 35 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  5 {tn isError sq
afc0: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
afd0: 5f 66 6b 65 79 2d 33 33 2e 24 74 6e 20 22 0a 20  _fkey-33.$tn ". 
afe0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71     catchsql {$sq
aff0: 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  l}.  " [lindex {
b000: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45 49  {0 {}} {1 {FOREI
b010: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
b020: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
b030: 72 72 6f 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20  rror].}.do_test 
b040: 65 5f 66 6b 65 79 2d 33 33 2e 31 20 7b 0a 20 20  e_fkey-33.1 {.  
b050: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
b060: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
b070: 74 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  t(x, y);.    CRE
b080: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
b090: 20 70 69 20 4f 4e 20 70 61 72 65 6e 74 28 78 2c   pi ON parent(x,
b0a0: 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   y);.    CREATE 
b0b0: 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62  TABLE child(a, b
b0c0: 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20  ,.      FOREIGN 
b0d0: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
b0e0: 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79  NCES parent(x, y
b0f0: 29 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  ) DEFERRABLE INI
b100: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
b110: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
b120: 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 32 20  test_efkey_35 2 
b130: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  1 "INSERT INTO c
b140: 68 69 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27  hild  VALUES('x'
b150: 2c 20 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b  , 'y')".test_efk
b160: 65 79 5f 33 35 20 33 20 30 20 22 49 4e 53 45 52  ey_35 3 0 "INSER
b170: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b180: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a  LUES('x', 'y')".
b190: 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 34 20  test_efkey_35 4 
b1a0: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  0 "INSERT INTO c
b1b0: 68 69 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27  hild  VALUES('x'
b1c0: 2c 20 27 79 27 29 22 0a 0a 0a 23 2d 2d 2d 2d 2d  , 'y')"...#-----
b1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
b220: 4f 46 3a 20 52 2d 31 32 37 38 32 2d 36 31 38 34  OF: R-12782-6184
b230: 31 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20  1.#.# Test that 
b240: 61 6e 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  an FK constraint
b250: 20 69 73 20 6d 61 64 65 20 64 65 66 65 72 72 65   is made deferre
b260: 64 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 20  d by adding the 
b270: 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 6f 20 74  following.# to t
b280: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 3a 0a 23  he definition:.#
b290: 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c 45 20  .#   DEFERRABLE 
b2a0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
b2b0: 45 44 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  ED.#.# EVIDENCE-
b2c0: 4f 46 3a 20 52 2d 30 39 30 30 35 2d 32 38 37 39  OF: R-09005-2879
b2d0: 31 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20  1.#.# Also test 
b2e0: 74 68 61 74 20 61 64 64 69 6e 67 20 61 6e 79 20  that adding any 
b2f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b300: 20 74 6f 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   to a foreign ke
b310: 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a 23 20  y definition .# 
b320: 6d 61 6b 65 73 20 74 68 65 20 63 6f 6e 73 74 72  makes the constr
b330: 61 69 6e 74 20 49 4d 4d 45 44 49 41 54 45 3a 0a  aint IMMEDIATE:.
b340: 23 0a 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52  #.#   NOT DEFERR
b350: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
b360: 45 46 45 52 52 45 44 0a 23 20 20 20 4e 4f 54 20  EFERRED.#   NOT 
b370: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b380: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 23  ALLY IMMEDIATE.#
b390: 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c     NOT DEFERRABL
b3a0: 45 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c 45  E.#   DEFERRABLE
b3b0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
b3c0: 49 41 54 45 0a 23 20 20 20 44 45 46 45 52 52 41  IATE.#   DEFERRA
b3d0: 42 4c 45 0a 23 0a 23 20 46 6f 72 65 69 67 6e 20  BLE.#.# Foreign 
b3e0: 6b 65 79 73 20 61 72 65 20 49 4d 4d 45 44 49 41  keys are IMMEDIA
b3f0: 54 45 20 62 79 20 64 65 66 61 75 6c 74 20 28 69  TE by default (i
b400: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 44 45  f there is no DE
b410: 46 45 52 52 41 42 4c 45 20 6f 72 20 4e 4f 54 0a  FERRABLE or NOT.
b420: 23 20 44 45 46 45 52 52 41 42 4c 45 20 63 6c 61  # DEFERRABLE cla
b430: 75 73 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e  use)..#.# EVIDEN
b440: 43 45 2d 4f 46 3a 20 52 2d 33 35 32 39 30 2d 31  CE-OF: R-35290-1
b450: 36 34 36 30 20 46 6f 72 65 69 67 6e 20 6b 65 79  6460 Foreign key
b460: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
b470: 20 69 6d 6d 65 64 69 61 74 65 20 62 79 0a 23 20   immediate by.# 
b480: 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49  default..#.# EVI
b490: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 32  DENCE-OF: R-3032
b4a0: 33 2d 32 31 39 31 37 20 45 61 63 68 20 66 6f 72  3-21917 Each for
b4b0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
b4c0: 69 6e 74 20 69 6e 20 53 51 4c 69 74 65 20 69 73  int in SQLite is
b4d0: 0a 23 20 63 6c 61 73 73 69 66 69 65 64 20 61 73  .# classified as
b4e0: 20 65 69 74 68 65 72 20 69 6d 6d 65 64 69 61 74   either immediat
b4f0: 65 20 6f 72 20 64 65 66 65 72 72 65 64 2e 0a 23  e or deferred..#
b500: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
b510: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
b520: 33 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  34.1 {.  execsql
b530: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
b540: 42 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c  BLE parent(x, y,
b550: 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   z, PRIMARY KEY(
b560: 78 2c 79 2c 7a 29 29 3b 0a 20 20 20 20 43 52 45  x,y,z));.    CRE
b570: 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 2c 20  ATE TABLE c1(a, 
b580: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b590: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b5a0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b5b0: 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c  nt NOT DEFERRABL
b5c0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
b5d0: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20  RRED.    );.    
b5e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
b5f0: 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46  a, b, c,.      F
b600: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c  OREIGN KEY(a, b,
b610: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
b620: 61 72 65 6e 74 20 4e 4f 54 20 44 45 46 45 52 52  arent NOT DEFERR
b630: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49  ABLE INITIALLY I
b640: 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a  MMEDIATE.    );.
b650: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b660: 20 63 33 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20   c3(a, b, c,.   
b670: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61     FOREIGN KEY(a
b680: 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43  , b, c) REFERENC
b690: 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45  ES parent NOT DE
b6a0: 46 45 52 52 41 42 4c 45 0a 20 20 20 20 29 3b 0a  FERRABLE.    );.
b6b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b6c0: 20 63 34 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20   c4(a, b, c,.   
b6d0: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61     FOREIGN KEY(a
b6e0: 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43  , b, c) REFERENC
b6f0: 45 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52  ES parent DEFERR
b700: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49  ABLE INITIALLY I
b710: 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a  MMEDIATE.    );.
b720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b730: 20 63 35 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20   c5(a, b, c,.   
b740: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61     FOREIGN KEY(a
b750: 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43  , b, c) REFERENC
b760: 45 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52  ES parent DEFERR
b770: 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ABLE.    );.    
b780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28  CREATE TABLE c6(
b790: 61 2c 20 62 2c 20 63 2c 20 46 4f 52 45 49 47 4e  a, b, c, FOREIGN
b7a0: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b7b0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 29  FERENCES parent)
b7c0: 3b 0a 0a 20 20 20 20 2d 2d 20 54 68 69 73 20 46  ;..    -- This F
b7d0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  K constraint is 
b7e0: 74 68 65 20 6f 6e 6c 79 20 64 65 66 65 72 72 61  the only deferra
b7f0: 62 6c 65 20 6f 6e 65 2e 0a 20 20 20 20 43 52 45  ble one..    CRE
b800: 41 54 45 20 54 41 42 4c 45 20 63 37 28 61 2c 20  ATE TABLE c7(a, 
b810: 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45  b, c,.      FORE
b820: 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29  IGN KEY(a, b, c)
b830: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
b840: 6e 74 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  nt DEFERRABLE IN
b850: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b860: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53  .    );..    INS
b870: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
b880: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c  VALUES('a', 'b',
b890: 20 27 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'c');.    INSER
b8a0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b8b0: 4c 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20 27  LUES('d', 'e', '
b8c0: 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  f');.    INSERT 
b8d0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b8e0: 45 53 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27  ES('g', 'h', 'i'
b8f0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b900: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b910: 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b  ('j', 'k', 'l');
b920: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b930: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
b940: 6d 27 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20  m', 'n', 'o');. 
b950: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b960: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 70 27  arent VALUES('p'
b970: 2c 20 27 71 27 2c 20 27 72 27 29 3b 0a 20 20 20  , 'q', 'r');.   
b980: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
b990: 65 6e 74 20 56 41 4c 55 45 53 28 27 73 27 2c 20  ent VALUES('s', 
b9a0: 27 74 27 2c 20 27 75 27 29 3b 0a 0a 20 20 20 20  't', 'u');..    
b9b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
b9c0: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20  ALUES('a', 'b', 
b9d0: 27 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'c');.    INSERT
b9e0: 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28   INTO c2 VALUES(
b9f0: 27 64 27 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a  'd', 'e', 'f');.
ba00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ba10: 63 33 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27  c3 VALUES('g', '
ba20: 68 27 2c 20 27 69 27 29 3b 0a 20 20 20 20 49 4e  h', 'i');.    IN
ba30: 53 45 52 54 20 49 4e 54 4f 20 63 34 20 56 41 4c  SERT INTO c4 VAL
ba40: 55 45 53 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c  UES('j', 'k', 'l
ba50: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
ba60: 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27 6d  NTO c5 VALUES('m
ba70: 27 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20  ', 'n', 'o');.  
ba80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 36    INSERT INTO c6
ba90: 20 56 41 4c 55 45 53 28 27 70 27 2c 20 27 71 27   VALUES('p', 'q'
baa0: 2c 20 27 72 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'r');.    INSE
bab0: 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c 55 45  RT INTO c7 VALUE
bac0: 53 28 27 73 27 2c 20 27 74 27 2c 20 27 75 27 29  S('s', 't', 'u')
bad0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63  ;.  }.} {}..proc
bae0: 20 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 7b   test_efkey_29 {
baf0: 74 6e 20 73 71 6c 20 69 73 45 72 72 6f 72 7d 20  tn sql isError} 
bb00: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
bb10: 65 79 2d 33 34 2e 24 74 6e 20 22 63 61 74 63 68  ey-34.$tn "catch
bb20: 73 71 6c 20 7b 24 73 71 6c 7d 22 20 5b 0a 20 20  sql {$sql}" [.  
bb30: 20 20 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d    lindex {{0 {}}
bb40: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
bb50: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
bb60: 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 0a 20  ed}}} $isError. 
bb70: 20 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f   ].}.test_efkey_
bb80: 32 39 20 20 32 20 22 42 45 47 49 4e 22 20 20 20  29  2 "BEGIN"   
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  0.test_efkey_29 
bbc0: 20 33 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   3 "DELETE FROM 
bbd0: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
bbe0: 20 27 61 27 22 20 20 20 20 20 20 20 20 31 0a 74   'a'"        1.t
bbf0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 34 20  est_efkey_29  4 
bc00: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
bc10: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 64  ent WHERE x = 'd
bc20: 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74  '"        1.test
bc30: 5f 65 66 6b 65 79 5f 32 39 20 20 35 20 22 44 45  _efkey_29  5 "DE
bc40: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
bc50: 20 57 48 45 52 45 20 78 20 3d 20 27 67 27 22 20   WHERE x = 'g'" 
bc60: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
bc70: 6b 65 79 5f 32 39 20 20 36 20 22 44 45 4c 45 54  key_29  6 "DELET
bc80: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
bc90: 45 52 45 20 78 20 3d 20 27 6a 27 22 20 20 20 20  ERE x = 'j'"    
bca0: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
bcb0: 5f 32 39 20 20 37 20 22 44 45 4c 45 54 45 20 46  _29  7 "DELETE F
bcc0: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
bcd0: 20 78 20 3d 20 27 6d 27 22 20 20 20 20 20 20 20   x = 'm'"       
bce0: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bcf0: 20 20 38 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    8 "DELETE FROM
bd00: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
bd10: 3d 20 27 70 27 22 20 20 20 20 20 20 20 20 31 0a  = 'p'"        1.
bd20: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39  test_efkey_29  9
bd30: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
bd40: 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
bd50: 73 27 22 20 20 20 20 20 20 20 20 30 0a 74 65 73  s'"        0.tes
bd60: 74 5f 65 66 6b 65 79 5f 32 39 20 31 30 20 22 43  t_efkey_29 10 "C
bd70: 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20  OMMIT"          
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 31 0a 74 65 73 74 5f 65          1.test_e
bda0: 66 6b 65 79 5f 32 39 20 31 31 20 22 52 4f 4c 4c  fkey_29 11 "ROLL
bdb0: 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20  BACK"           
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b       0..test_efk
bde0: 65 79 5f 32 39 20 20 39 20 22 42 45 47 49 4e 22  ey_29  9 "BEGIN"
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
be20: 32 39 20 31 30 20 22 55 50 44 41 54 45 20 70 61  29 10 "UPDATE pa
be30: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
be40: 20 57 48 45 52 45 20 7a 20 3d 20 27 63 27 22 20   WHERE z = 'c'" 
be50: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
be60: 31 31 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  11 "UPDATE paren
be70: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
be80: 45 52 45 20 7a 20 3d 20 27 66 27 22 20 31 0a 74  ERE z = 'f'" 1.t
be90: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 32 20  est_efkey_29 12 
bea0: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
beb0: 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45  ET z = 'z' WHERE
bec0: 20 7a 20 3d 20 27 69 27 22 20 31 0a 74 65 73 74   z = 'i'" 1.test
bed0: 5f 65 66 6b 65 79 5f 32 39 20 31 33 20 22 55 50  _efkey_29 13 "UP
bee0: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
bef0: 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20  z = 'z' WHERE z 
bf00: 3d 20 27 6c 27 22 20 31 0a 74 65 73 74 5f 65 66  = 'l'" 1.test_ef
bf10: 6b 65 79 5f 32 39 20 31 34 20 22 55 50 44 41 54  key_29 14 "UPDAT
bf20: 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d  E parent SET z =
bf30: 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27   'z' WHERE z = '
bf40: 6f 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79  o'" 1.test_efkey
bf50: 5f 32 39 20 31 35 20 22 55 50 44 41 54 45 20 70  _29 15 "UPDATE p
bf60: 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a  arent SET z = 'z
bf70: 27 20 57 48 45 52 45 20 7a 20 3d 20 27 72 27 22  ' WHERE z = 'r'"
bf80: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bf90: 20 31 36 20 22 55 50 44 41 54 45 20 70 61 72 65   16 "UPDATE pare
bfa0: 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57  nt SET z = 'z' W
bfb0: 48 45 52 45 20 7a 20 3d 20 27 75 27 22 20 30 0a  HERE z = 'u'" 0.
bfc0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 37  test_efkey_29 17
bfd0: 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20   "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 31 0a 74 65 73             1.tes
c000: 74 5f 65 66 6b 65 79 5f 32 39 20 31 38 20 22 52  t_efkey_29 18 "R
c010: 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20  OLLBACK"        
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 30 0a 0a 74 65 73 74 5f          0..test_
c040: 65 66 6b 65 79 5f 32 39 20 31 37 20 22 42 45 47  efkey_29 17 "BEG
c050: 49 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IN"             
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b        0.test_efk
c080: 65 79 5f 32 39 20 31 38 20 22 49 4e 53 45 52 54  ey_29 18 "INSERT
c090: 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
c0a0: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
c0b0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c0c0: 32 39 20 31 39 20 22 49 4e 53 45 52 54 20 49 4e  29 19 "INSERT IN
c0d0: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20  TO c2 VALUES(1, 
c0e0: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
c0f0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c100: 32 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  20 "INSERT INTO 
c110: 63 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c3 VALUES(1, 2, 
c120: 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74  3)"          1.t
c130: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 31 20  est_efkey_29 21 
c140: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 34 20  "INSERT INTO c4 
c150: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22  VALUES(1, 2, 3)"
c160: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c170: 5f 65 66 6b 65 79 5f 32 39 20 32 32 20 22 49 4e  _efkey_29 22 "IN
c180: 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c  SERT INTO c5 VAL
c190: 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20  UES(1, 2, 3)"   
c1a0: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c1b0: 6b 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52  key_29 22 "INSER
c1c0: 54 20 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53  T INTO c6 VALUES
c1d0: 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20  (1, 2, 3)"      
c1e0: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c1f0: 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54 20 49  _29 22 "INSERT I
c200: 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28 31 2c  NTO c7 VALUES(1,
c210: 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20   2, 3)"         
c220: 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   0.test_efkey_29
c230: 20 32 33 20 22 43 4f 4d 4d 49 54 22 20 20 20 20   23 "COMMIT"    
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
c260: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 34  test_efkey_29 24
c270: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61   "INSERT INTO pa
c280: 72 65 6e 74 20 56 41 4c 55 45 53 28 31 2c 20 32  rent VALUES(1, 2
c290: 2c 20 33 29 22 20 20 20 20 20 20 30 0a 74 65 73  , 3)"      0.tes
c2a0: 74 5f 65 66 6b 65 79 5f 32 39 20 32 35 20 22 43  t_efkey_29 25 "C
c2b0: 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20  OMMIT"          
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 30 0a 0a 74 65 73 74 5f          0..test_
c2e0: 65 66 6b 65 79 5f 32 39 20 32 36 20 22 42 45 47  efkey_29 26 "BEG
c2f0: 49 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IN"             
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b        0.test_efk
c320: 65 79 5f 32 39 20 32 37 20 22 55 50 44 41 54 45  ey_29 27 "UPDATE
c330: 20 63 31 20 53 45 54 20 61 20 3d 20 31 30 22 20   c1 SET a = 10" 
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c360: 32 39 20 32 38 20 22 55 50 44 41 54 45 20 63 32  29 28 "UPDATE c2
c370: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c3a0: 32 39 20 22 55 50 44 41 54 45 20 63 33 20 53 45  29 "UPDATE c3 SE
c3b0: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
c3d0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 30 20  est_efkey_29 30 
c3e0: 22 55 50 44 41 54 45 20 63 34 20 53 45 54 20 61  "UPDATE c4 SET a
c3f0: 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20   = 10"          
c400: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c410: 5f 65 66 6b 65 79 5f 32 39 20 33 31 20 22 55 50  _efkey_29 31 "UP
c420: 44 41 54 45 20 63 35 20 53 45 54 20 61 20 3d 20  DATE c5 SET a = 
c430: 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20  10"             
c440: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
c450: 6b 65 79 5f 32 39 20 33 31 20 22 55 50 44 41 54  key_29 31 "UPDAT
c460: 45 20 63 36 20 53 45 54 20 61 20 3d 20 31 30 22  E c6 SET a = 10"
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c490: 5f 32 39 20 33 31 20 22 55 50 44 41 54 45 20 63  _29 31 "UPDATE c
c4a0: 37 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20  7 SET a = 10"   
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   0.test_efkey_29
c4d0: 20 33 32 20 22 43 4f 4d 4d 49 54 22 20 20 20 20   32 "COMMIT"    
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
c500: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 33  test_efkey_29 33
c510: 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20   "ROLLBACK"     
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 20 20 20 20 20 30 0a 0a 23 2d             0..#-
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
c590: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 34 39 39 2d  NCE-OF: R-24499-
c5a0: 35 37 30 37 31 0a 23 0a 23 20 54 65 73 74 20 61  57071.#.# Test a
c5b0: 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 66  n example from f
c5c0: 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 20  oreignkeys.html 
c5d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64  dealing with a d
c5e0: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
c5f0: 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  .# key constrain
c600: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  t..#.do_test e_f
c610: 6b 65 79 2d 33 35 2e 31 20 7b 0a 20 20 64 72 6f  key-35.1 {.  dro
c620: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
c630: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
c640: 41 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74  ATE TABLE artist
c650: 28 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64  (.      artistid
c660: 20 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d      INTEGER PRIM
c670: 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20  ARY KEY, .      
c680: 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54  artistname  TEXT
c690: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
c6a0: 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a  TE TABLE track(.
c6b0: 20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20        trackid   
c6c0: 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20    INTEGER,.     
c6d0: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
c6e0: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
c6f0: 72 74 69 73 74 20 49 4e 54 45 47 45 52 20 52 45  rtist INTEGER RE
c700: 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
c710: 61 72 74 69 73 74 69 64 29 20 44 45 46 45 52 52  artistid) DEFERR
c720: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
c730: 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20  EFERRED.    );. 
c740: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
c750: 65 5f 66 6b 65 79 2d 33 35 2e 32 20 7b 0a 20 20  e_fkey-35.2 {.  
c760: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
c770: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
c780: 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
c790: 55 45 53 28 31 2c 20 27 57 68 69 74 65 20 43 68  UES(1, 'White Ch
c7a0: 72 69 73 74 6d 61 73 27 2c 20 35 29 3b 0a 20 20  ristmas', 5);.  
c7b0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  }.  catchsql COM
c7c0: 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  MIT.} {1 {FOREIG
c7d0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
c7e0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
c7f0: 74 20 65 5f 66 6b 65 79 2d 33 35 2e 33 20 7b 0a  t e_fkey-35.3 {.
c800: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
c810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
c820: 73 74 20 56 41 4c 55 45 53 28 35 2c 20 27 42 69  st VALUES(5, 'Bi
c830: 6e 67 20 43 72 6f 73 62 79 27 29 3b 0a 20 20 20  ng Crosby');.   
c840: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
c850: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
c8a0: 56 65 72 69 66 79 20 74 68 61 74 20 61 20 6e 65  Verify that a ne
c8b0: 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 20 6d  sted savepoint m
c8c0: 61 79 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  ay be released w
c8d0: 69 74 68 6f 75 74 20 73 61 74 69 73 66 79 69 6e  ithout satisfyin
c8e0: 67 20 0a 23 20 64 65 66 65 72 72 65 64 20 66 6f  g .# deferred fo
c8f0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
c900: 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45  aints..#.# EVIDE
c910: 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 32 33 2d  NCE-OF: R-07223-
c920: 34 38 33 32 33 20 41 20 6e 65 73 74 65 64 20 73  48323 A nested s
c930: 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
c940: 74 69 6f 6e 20 6d 61 79 20 62 65 0a 23 20 52 45  tion may be.# RE
c950: 4c 45 41 53 45 64 20 77 68 69 6c 65 20 74 68 65  LEASEd while the
c960: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
c970: 61 20 73 74 61 74 65 20 74 68 61 74 20 64 6f 65  a state that doe
c980: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 61 0a  s not satisfy a.
c990: 23 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  # deferred forei
c9a0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
c9b0: 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  t..#.drop_all_ta
c9c0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
c9d0: 6b 65 79 2d 33 36 2e 31 20 7b 0a 20 20 65 78 65  key-36.1 {.  exe
c9e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
c9f0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
ca00: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
ca10: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  b REFERENCES t1 
ca20: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
ca30: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
ca40: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
ca50: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
ca60: 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
ca70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
ca80: 32 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  2, 2);.    INSER
ca90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
caa0: 28 33 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (3, 3);.  }.} {}
cab0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
cac0: 33 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  36.2 {.  execsql
cad0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
cae0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
caf0: 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  e;.        INSER
cb00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
cb10: 28 34 2c 20 35 29 3b 0a 20 20 20 20 20 20 52 45  (4, 5);.      RE
cb20: 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d  LEASE one;.  }.}
cb30: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
cb40: 65 79 2d 33 36 2e 33 20 7b 0a 20 20 63 61 74 63  ey-36.3 {.  catc
cb50: 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
cb60: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
cb70: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
cb80: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
cb90: 2d 33 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -36.4 {.  execsq
cba0: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
cbb0: 31 20 53 45 54 20 61 20 3d 20 35 20 57 48 45 52  1 SET a = 5 WHER
cbc0: 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 43 4f 4d  E a = 4;.    COM
cbd0: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a  MIT;.  }.} {}...
cbe0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65  ----------.# Che
cc30: 63 6b 20 74 68 61 74 20 61 20 74 72 61 6e 73 61  ck that a transa
cc40: 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
cc50: 28 61 6e 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  (an outermost sa
cc60: 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20 77  vepoint opened w
cc70: 68 65 6e 0a 23 20 74 68 65 20 64 61 74 61 62 61  hen.# the databa
cc80: 73 65 20 77 61 73 20 69 6e 20 61 75 74 6f 2d 63  se was in auto-c
cc90: 6f 6d 6d 69 74 20 6d 6f 64 65 29 20 63 61 6e 6e  ommit mode) cann
cca0: 6f 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  ot be released w
ccb0: 69 74 68 6f 75 74 0a 23 20 73 61 74 69 73 66 79  ithout.# satisfy
ccc0: 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
ccd0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
cce0: 69 6e 74 73 2e 20 49 74 20 6d 61 79 20 62 65 20  ints. It may be 
ccf0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23  rolled back..#.#
cd00: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cd10: 34 34 32 39 35 2d 31 33 38 32 33 20 41 20 74 72  44295-13823 A tr
cd20: 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
cd30: 69 6e 74 20 28 61 20 6e 6f 6e 2d 6e 65 73 74 65  int (a non-neste
cd40: 64 0a 23 20 73 61 76 65 70 6f 69 6e 74 20 74 68  d.# savepoint th
cd50: 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 77 68  at was opened wh
cd60: 69 6c 65 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ile there was no
cd70: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f  t currently an o
cd80: 70 65 6e 0a 23 20 74 72 61 6e 73 61 63 74 69 6f  pen.# transactio
cd90: 6e 29 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  n), on the other
cda0: 20 68 61 6e 64 2c 20 69 73 20 73 75 62 6a 65 63   hand, is subjec
cdb0: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65  t to the same re
cdc0: 73 74 72 69 63 74 69 6f 6e 73 0a 23 20 61 73 20  strictions.# as 
cdd0: 61 20 43 4f 4d 4d 49 54 20 2d 20 61 74 74 65 6d  a COMMIT - attem
cde0: 70 74 69 6e 67 20 74 6f 20 52 45 4c 45 41 53 45  pting to RELEASE
cdf0: 20 69 74 20 77 68 69 6c 65 20 74 68 65 20 64 61   it while the da
ce00: 74 61 62 61 73 65 20 69 73 20 69 6e 20 73 75 63  tabase is in suc
ce10: 68 20 61 0a 23 20 73 74 61 74 65 20 77 69 6c 6c  h a.# state will
ce20: 20 66 61 69 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74   fail..#.do_test
ce30: 20 65 5f 66 6b 65 79 2d 33 37 2e 31 20 7b 0a 20   e_fkey-37.1 {. 
ce40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
ce50: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
ce60: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77      SAVEPOINT tw
ce70: 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  o;.        INSER
ce80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ce90: 28 36 2c 20 37 29 3b 0a 20 20 20 20 20 20 52 45  (6, 7);.      RE
cea0: 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d  LEASE two;.  }.}
ceb0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
cec0: 65 79 2d 33 37 2e 32 20 7b 0a 20 20 63 61 74 63  ey-37.2 {.  catc
ced0: 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e  hsql {RELEASE on
cee0: 65 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  e}.} {1 {FOREIGN
cef0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
cf00: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
cf10: 20 65 5f 66 6b 65 79 2d 33 37 2e 33 20 7b 0a 20   e_fkey-37.3 {. 
cf20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
cf30: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
cf40: 20 3d 20 37 20 57 48 45 52 45 20 61 20 3d 20 36   = 7 WHERE a = 6
cf50: 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e  ;.    RELEASE on
cf60: 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  e;.  }.} {}.do_t
cf70: 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 34 20  est e_fkey-37.4 
cf80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
cf90: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
cfa0: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
cfb0: 20 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e   two;.        IN
cfc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cfd0: 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20  UES(9, 10);.    
cfe0: 20 20 52 45 4c 45 41 53 45 20 74 77 6f 3b 0a 20    RELEASE two;. 
cff0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
d000: 65 5f 66 6b 65 79 2d 33 37 2e 35 20 7b 0a 20 20  e_fkey-37.5 {.  
d010: 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53  catchsql {RELEAS
d020: 45 20 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 46 4f 52  E one}.} {1 {FOR
d030: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
d040: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
d050: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 36  test e_fkey-37.6
d060: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 52 4f   {.  execsql {RO
d070: 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 20 3b 20  LLBACK TO one ; 
d080: 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b  RELEASE one}.} {
d090: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
d0e0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 43  Test that if a C
d0f0: 4f 4d 4d 49 54 20 6f 70 65 72 61 74 69 6f 6e 20  OMMIT operation 
d100: 66 61 69 6c 73 20 64 75 65 20 74 6f 20 64 65 66  fails due to def
d110: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
d120: 79 20 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73  y .# constraints
d130: 2c 20 61 6e 79 20 6e 65 73 74 65 64 20 73 61 76  , any nested sav
d140: 65 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f  epoints remain o
d150: 70 65 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  pen..#.# EVIDENC
d160: 45 2d 4f 46 3a 20 52 2d 33 37 37 33 36 2d 34 32  E-OF: R-37736-42
d170: 36 31 36 20 49 66 20 61 20 43 4f 4d 4d 49 54 20  616 If a COMMIT 
d180: 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 74 68  statement (or th
d190: 65 20 52 45 4c 45 41 53 45 20 6f 66 20 61 0a 23  e RELEASE of a.#
d1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 53 41 56   transaction SAV
d1b0: 45 50 4f 49 4e 54 29 20 66 61 69 6c 73 20 62 65  EPOINT) fails be
d1c0: 63 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61  cause the databa
d1d0: 73 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  se is currently 
d1e0: 69 6e 20 61 0a 23 20 73 74 61 74 65 20 74 68 61  in a.# state tha
d1f0: 74 20 76 69 6f 6c 61 74 65 73 20 61 20 64 65 66  t violates a def
d200: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
d210: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  y constraint and
d220: 20 74 68 65 72 65 20 61 72 65 0a 23 20 63 75 72   there are.# cur
d230: 72 65 6e 74 6c 79 20 6e 65 73 74 65 64 20 73 61  rently nested sa
d240: 76 65 70 6f 69 6e 74 73 2c 20 74 68 65 20 6e 65  vepoints, the ne
d250: 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  sted savepoints 
d260: 72 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 64  remain open..#.d
d270: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d280: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
d290: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
d2a0: 20 74 31 20 57 48 45 52 45 20 61 3e 33 3b 0a 20   t1 WHERE a>3;. 
d2b0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
d2c0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20   t1;.  }.} {1 1 
d2d0: 32 20 32 20 33 20 33 7d 0a 64 6f 5f 74 65 73 74  2 2 3 3}.do_test
d2e0: 20 65 5f 66 6b 65 79 2d 33 38 2e 32 20 7b 0a 20   e_fkey-38.2 {. 
d2f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
d300: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
d310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d320: 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  S(4, 4);.      S
d330: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
d340: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
d350: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
d360: 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  );.        SELEC
d370: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
d380: 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 20  .} {1 1 2 2 3 3 
d390: 34 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74  4 4 5 6}.do_test
d3a0: 20 65 5f 66 6b 65 79 2d 33 38 2e 33 20 7b 0a 20   e_fkey-38.3 {. 
d3b0: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
d3c0: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
d3d0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
d3e0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
d3f0: 5f 66 6b 65 79 2d 33 38 2e 34 20 7b 0a 20 20 65  _fkey-38.4 {.  e
d400: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
d410: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
d420: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45    COMMIT;.    SE
d430: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
d440: 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33    }.} {1 1 2 2 3
d450: 20 33 20 34 20 34 7d 0a 0a 64 6f 5f 74 65 73 74   3 4 4}..do_test
d460: 20 65 5f 66 6b 65 79 2d 33 38 2e 35 20 7b 0a 20   e_fkey-38.5 {. 
d470: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
d480: 41 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20  AVEPOINT a;.    
d490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d4a0: 20 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20   VALUES(5, 5);. 
d4b0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 62       SAVEPOINT b
d4c0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
d4d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d4e0: 36 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 53  6, 7);.        S
d4f0: 41 56 45 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20  AVEPOINT c;.    
d500: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
d510: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
d520: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
d530: 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 36 20  est e_fkey-38.6 
d540: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45  {.  catchsql {RE
d550: 4c 45 41 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 46  LEASE a}.} {1 {F
d560: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
d570: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
d580: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d590: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 20  .7 {.  execsql  
d5a0: 7b 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 7d 0a  {ROLLBACK TO c}.
d5b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45    catchsql {RELE
d5c0: 41 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 46 4f 52  ASE a}.} {1 {FOR
d5d0: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
d5e0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
d5f0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 38  test e_fkey-38.8
d600: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 0a   {.  execsql  {.
d610: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
d620: 62 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 61  b;.    RELEASE a
d630: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
d640: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
d650: 20 31 20 32 20 32 20 33 20 33 20 34 20 34 20 35   1 2 2 3 3 4 4 5
d660: 20 35 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23   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: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 33  .### SECTION 4.3
d6c0: 3a 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20  : ON DELETE and 
d6d0: 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e  ON UPDATE Action
d6e0: 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
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 0a 0a 23  #############..#
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
d780: 20 74 68 61 74 20 63 6f 6e 66 69 67 75 72 65 64   that configured
d790: 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f   ON DELETE and O
d7a0: 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 73  N UPDATE actions
d7b0: 20 74 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e   take place when
d7c0: 0a 23 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 6d  .# deleting or m
d7d0: 6f 64 69 66 79 69 6e 67 20 72 6f 77 73 20 6f 66  odifying rows of
d7e0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
d7f0: 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  e, respectively.
d800: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
d810: 3a 20 52 2d 34 38 32 37 30 2d 34 34 32 38 32 20  : R-48270-44282 
d820: 46 6f 72 65 69 67 6e 20 6b 65 79 20 4f 4e 20 44  Foreign key ON D
d830: 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44  ELETE and ON UPD
d840: 41 54 45 20 63 6c 61 75 73 65 73 0a 23 20 61 72  ATE clauses.# ar
d850: 65 20 75 73 65 64 20 74 6f 20 63 6f 6e 66 69 67  e used to config
d860: 75 72 65 20 61 63 74 69 6f 6e 73 20 74 68 61 74  ure actions that
d870: 20 74 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e   take place when
d880: 20 64 65 6c 65 74 69 6e 67 20 72 6f 77 73 20 66   deleting rows f
d890: 72 6f 6d 0a 23 20 74 68 65 20 70 61 72 65 6e 74  rom.# the parent
d8a0: 20 74 61 62 6c 65 20 28 4f 4e 20 44 45 4c 45 54   table (ON DELET
d8b0: 45 29 2c 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67  E), or modifying
d8c0: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
d8d0: 76 61 6c 75 65 73 20 6f 66 0a 23 20 65 78 69 73  values of.# exis
d8e0: 74 69 6e 67 20 72 6f 77 73 20 28 4f 4e 20 55 50  ting rows (ON UP
d8f0: 44 41 54 45 29 2e 0a 23 0a 23 20 54 65 73 74 20  DATE)..#.# Test 
d900: 74 68 61 74 20 61 20 73 69 6e 67 6c 65 20 46 4b  that a single FK
d910: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20   constraint may 
d920: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 61  have different a
d930: 63 74 69 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65  ctions configure
d940: 64 0a 23 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54  d.# for ON DELET
d950: 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e  E and ON UPDATE.
d960: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
d970: 3a 20 52 2d 34 38 31 32 34 2d 36 33 32 32 35 20  : R-48124-63225 
d980: 41 20 73 69 6e 67 6c 65 20 66 6f 72 65 69 67 6e  A single foreign
d990: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
d9a0: 6d 61 79 20 68 61 76 65 0a 23 20 64 69 66 66 65  may have.# diffe
d9b0: 72 65 6e 74 20 61 63 74 69 6f 6e 73 20 63 6f 6e  rent actions con
d9c0: 66 69 67 75 72 65 64 20 66 6f 72 20 4f 4e 20 44  figured for ON D
d9d0: 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44  ELETE and ON UPD
d9e0: 41 54 45 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ATE..#.do_test e
d9f0: 5f 66 6b 65 79 2d 33 39 2e 31 20 7b 0a 20 20 65  _fkey-39.1 {.  e
da00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
da10: 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62  ATE TABLE p(a, b
da20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 29   PRIMARY KEY, c)
da30: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
da40: 4c 45 20 63 31 28 64 2c 20 65 2c 20 66 20 44 45  LE c1(d, e, f DE
da50: 46 41 55 4c 54 20 27 6b 30 27 20 52 45 46 45 52  FAULT 'k0' REFER
da60: 45 4e 43 45 53 20 70 20 0a 20 20 20 20 20 20 4f  ENCES p .      O
da70: 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46  N UPDATE SET DEF
da80: 41 55 4c 54 0a 20 20 20 20 20 20 4f 4e 20 44 45  AULT.      ON DE
da90: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20  LETE SET NULL.  
daa0: 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54    );..    INSERT
dab0: 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 30   INTO p VALUES(0
dac0: 2c 20 27 6b 30 27 2c 20 27 27 29 3b 0a 20 20 20  , 'k0', '');.   
dad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
dae0: 41 4c 55 45 53 28 31 2c 20 27 6b 31 27 2c 20 27  ALUES(1, 'k1', '
daf0: 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  I');.    INSERT 
db00: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 32 2c  INTO p VALUES(2,
db10: 20 27 6b 32 27 2c 20 27 49 49 27 29 3b 0a 20 20   'k2', 'II');.  
db20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
db30: 56 41 4c 55 45 53 28 33 2c 20 27 6b 33 27 2c 20  VALUES(3, 'k3', 
db40: 27 49 49 49 27 29 3b 0a 0a 20 20 20 20 49 4e 53  'III');..    INS
db50: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
db60: 45 53 28 31 2c 20 27 78 78 27 2c 20 27 6b 31 27  ES(1, 'xx', 'k1'
db70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
db80: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32 2c 20  TO c1 VALUES(2, 
db90: 27 78 78 27 2c 20 27 6b 32 27 29 3b 0a 20 20 20  'xx', 'k2');.   
dba0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
dbb0: 56 41 4c 55 45 53 28 33 2c 20 27 78 78 27 2c 20  VALUES(3, 'xx', 
dbc0: 27 6b 33 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  'k3');.  }.} {}.
dbd0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
dbe0: 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
dbf0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 20 53  {.    UPDATE p S
dc00: 45 54 20 62 20 3d 20 27 6b 34 27 20 57 48 45 52  ET b = 'k4' WHER
dc10: 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c  E a = 1;.    SEL
dc20: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20  ECT * FROM c1;. 
dc30: 20 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20   }.} {1 xx k0 2 
dc40: 78 78 20 6b 32 20 33 20 78 78 20 6b 33 7d 0a 64  xx k2 3 xx k3}.d
dc50: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39  o_test e_fkey-39
dc60: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
dc70: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
dc80: 20 70 20 57 48 45 52 45 20 61 20 3d 20 32 3b 0a   p WHERE a = 2;.
dc90: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
dca0: 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78  M c1;.  }.} {1 x
dcb0: 78 20 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78  x k0 2 xx {} 3 x
dcc0: 78 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  x k3}.do_test e_
dcd0: 66 6b 65 79 2d 33 39 2e 34 20 7b 0a 20 20 65 78  fkey-39.4 {.  ex
dce0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
dcf0: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
dd00: 70 69 20 4f 4e 20 70 28 63 29 3b 0a 20 20 20 20  pi ON p(c);.    
dd10: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 20 56  REPLACE INTO p V
dd20: 41 4c 55 45 53 28 35 2c 20 27 6b 35 27 2c 20 27  ALUES(5, 'k5', '
dd30: 49 49 49 27 29 3b 0a 20 20 20 20 53 45 4c 45 43  III');.    SELEC
dd40: 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  T * FROM c1;.  }
dd50: 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78  .} {1 xx k0 2 xx
dd60: 20 7b 7d 20 33 20 78 78 20 7b 7d 7d 0a 0a 23 2d   {} 3 xx {}}..#-
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 61 63 68 20  --------.# Each 
ddc0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 20 74  foreign key in t
ddd0: 68 65 20 73 79 73 74 65 6d 20 68 61 73 20 61 6e  he system has an
dde0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
ddf0: 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 2c  N DELETE action,
de00: 0a 23 20 65 69 74 68 65 72 20 22 4e 4f 20 41 43  .# either "NO AC
de10: 54 49 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54  TION", "RESTRICT
de20: 22 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22  ", "SET NULL", "
de30: 53 45 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20  SET DEFAULT" or 
de40: 22 43 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 45  "CASCADE"..#.# E
de50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
de60: 33 32 36 2d 34 35 32 35 32 20 54 68 65 20 4f 4e  326-45252 The ON
de70: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
de80: 50 44 41 54 45 20 61 63 74 69 6f 6e 0a 23 20 61  PDATE action.# a
de90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
dea0: 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
deb0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
dec0: 61 62 61 73 65 20 69 73 20 6f 6e 65 20 6f 66 20  abase is one of 
ded0: 22 4e 4f 0a 23 20 41 43 54 49 4f 4e 22 2c 20 22  "NO.# ACTION", "
dee0: 52 45 53 54 52 49 43 54 22 2c 20 22 53 45 54 20  RESTRICT", "SET 
def0: 4e 55 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41  NULL", "SET DEFA
df00: 55 4c 54 22 20 6f 72 20 22 43 41 53 43 41 44 45  ULT" or "CASCADE
df10: 22 2e 0a 23 0a 23 20 49 66 20 6e 6f 6e 65 20 69  "..#.# If none i
df20: 73 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c  s specified expl
df30: 69 63 69 74 6c 79 2c 20 22 4e 4f 20 41 43 54 49  icitly, "NO ACTI
df40: 4f 4e 22 20 69 73 20 74 68 65 20 64 65 66 61 75  ON" is the defau
df50: 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  lt..#.# EVIDENCE
df60: 2d 4f 46 3a 20 52 2d 31 39 38 30 33 2d 34 35 38  -OF: R-19803-458
df70: 38 34 20 49 66 20 61 6e 20 61 63 74 69 6f 6e 20  84 If an action 
df80: 69 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  is not explicitl
df90: 79 20 73 70 65 63 69 66 69 65 64 2c 0a 23 20 69  y specified,.# i
dfa0: 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20 22 4e  t defaults to "N
dfb0: 4f 20 41 43 54 49 4f 4e 22 2e 0a 23 20 0a 64 72  O ACTION"..# .dr
dfc0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
dfd0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e  _test e_fkey-40.
dfe0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
dff0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e000: 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52   parent(x PRIMAR
e010: 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 43  Y KEY, y);.    C
e020: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e030: 64 31 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52  d1(a, .      b R
e040: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e050: 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43   ON UPDATE NO AC
e060: 54 49 4f 4e 20 4f 4e 20 44 45 4c 45 54 45 20 52  TION ON DELETE R
e070: 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20  ESTRICT.    );. 
e080: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e090: 63 68 69 6c 64 32 28 61 2c 20 0a 20 20 20 20 20  child2(a, .     
e0a0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e0b0: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52  rent ON UPDATE R
e0c0: 45 53 54 52 49 43 54 20 4f 4e 20 44 45 4c 45 54  ESTRICT ON DELET
e0d0: 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29  E SET NULL.    )
e0e0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e0f0: 4c 45 20 63 68 69 6c 64 33 28 61 2c 20 0a 20 20  LE child3(a, .  
e100: 20 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53      b REFERENCES
e110: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
e120: 45 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45  E SET NULL ON DE
e130: 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54  LETE SET DEFAULT
e140: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
e150: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 34 28  TE TABLE child4(
e160: 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45  a, .      b REFE
e170: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
e180: 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41   UPDATE SET DEFA
e190: 55 4c 54 20 4f 4e 20 44 45 4c 45 54 45 20 43 41  ULT ON DELETE CA
e1a0: 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20  SCADE.    );..  
e1b0: 20 20 2d 2d 20 43 72 65 61 74 65 20 73 6f 6d 65    -- Create some
e1c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 74 68   foreign keys th
e1d0: 61 74 20 75 73 65 20 74 68 65 20 64 65 66 61 75  at use the defau
e1e0: 6c 74 20 61 63 74 69 6f 6e 20 2d 20 22 4e 4f 20  lt action - "NO 
e1f0: 41 43 54 49 4f 4e 22 0a 20 20 20 20 43 52 45 41  ACTION".    CREA
e200: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28  TE TABLE child5(
e210: 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  a, b REFERENCES 
e220: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
e230: 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43   CASCADE);.    C
e240: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
e250: 64 36 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43  d6(a, b REFERENC
e260: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c  ES parent ON DEL
e270: 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20  ETE RESTRICT);. 
e280: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e290: 63 68 69 6c 64 37 28 61 2c 20 62 20 52 45 46 45  child7(a, b REFE
e2a0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
e2b0: 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f   DELETE NO ACTIO
e2c0: 4e 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  N);.    CREATE T
e2d0: 41 42 4c 45 20 63 68 69 6c 64 38 28 61 2c 20 62  ABLE child8(a, b
e2e0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
e2f0: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20  nt ON UPDATE NO 
e300: 41 43 54 49 4f 4e 29 3b 0a 20 20 7d 0a 7d 20 7b  ACTION);.  }.} {
e310: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a  }..foreach {tn z
e320: 54 61 62 20 6c 52 65 73 7d 20 7b 0a 20 20 32 20  Tab lRes} {.  2 
e330: 63 68 69 6c 64 31 20 7b 30 20 30 20 70 61 72 65  child1 {0 0 pare
e340: 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49  nt b {} {NO ACTI
e350: 4f 4e 7d 20 52 45 53 54 52 49 43 54 20 4e 4f 4e  ON} RESTRICT NON
e360: 45 7d 0a 20 20 33 20 63 68 69 6c 64 32 20 7b 30  E}.  3 child2 {0
e370: 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 52   0 parent b {} R
e380: 45 53 54 52 49 43 54 20 7b 53 45 54 20 4e 55 4c  ESTRICT {SET NUL
e390: 4c 7d 20 4e 4f 4e 45 7d 0a 20 20 34 20 63 68 69  L} NONE}.  4 chi
e3a0: 6c 64 33 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld3 {0 0 parent 
e3b0: 62 20 7b 7d 20 7b 53 45 54 20 4e 55 4c 4c 7d 20  b {} {SET NULL} 
e3c0: 7b 53 45 54 20 44 45 46 41 55 4c 54 7d 20 4e 4f  {SET DEFAULT} NO
e3d0: 4e 45 7d 0a 20 20 35 20 63 68 69 6c 64 34 20 7b  NE}.  5 child4 {
e3e0: 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20  0 0 parent b {} 
e3f0: 7b 53 45 54 20 44 45 46 41 55 4c 54 7d 20 43 41  {SET DEFAULT} CA
e400: 53 43 41 44 45 20 4e 4f 4e 45 7d 0a 20 20 36 20  SCADE NONE}.  6 
e410: 63 68 69 6c 64 35 20 7b 30 20 30 20 70 61 72 65  child5 {0 0 pare
e420: 6e 74 20 62 20 7b 7d 20 43 41 53 43 41 44 45 20  nt b {} CASCADE 
e430: 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45  {NO ACTION} NONE
e440: 7d 0a 20 20 37 20 63 68 69 6c 64 36 20 7b 30 20  }.  7 child6 {0 
e450: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e  0 parent b {} {N
e460: 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53 54 52 49  O ACTION} RESTRI
e470: 43 54 20 4e 4f 4e 45 7d 0a 20 20 38 20 63 68 69  CT NONE}.  8 chi
e480: 6c 64 37 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld7 {0 0 parent 
e490: 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d  b {} {NO ACTION}
e4a0: 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e   {NO ACTION} NON
e4b0: 45 7d 0a 20 20 39 20 63 68 69 6c 64 38 20 7b 30  E}.  9 child8 {0
e4c0: 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b   0 parent b {} {
e4d0: 4e 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41  NO ACTION} {NO A
e4e0: 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 7d 20 7b  CTION} NONE}.} {
e4f0: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
e500: 79 2d 34 30 2e 24 74 6e 20 7b 20 65 78 65 63 73  y-40.$tn { execs
e510: 71 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69  ql "PRAGMA forei
e520: 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 24 7a 54 61  gn_key_list($zTa
e530: 62 29 22 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23  b)" } $lRes.}..#
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
e590: 20 74 68 61 74 20 22 4e 4f 20 41 43 54 49 4f 4e   that "NO ACTION
e5a0: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 74  " means that not
e5b0: 68 69 6e 67 20 68 61 70 70 65 6e 73 20 74 6f 20  hing happens to 
e5c0: 61 20 63 68 69 6c 64 20 72 6f 77 20 77 68 65 6e  a child row when
e5d0: 0a 23 20 69 74 27 73 20 70 61 72 65 6e 74 20 72  .# it's parent r
e5e0: 6f 77 20 69 73 20 75 70 64 61 74 65 64 20 6f 72  ow is updated or
e5f0: 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 45 56   deleted..#.# EV
e600: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
e610: 37 31 2d 35 34 39 37 36 20 43 6f 6e 66 69 67 75  71-54976 Configu
e620: 72 69 6e 67 20 22 4e 4f 20 41 43 54 49 4f 4e 22  ring "NO ACTION"
e630: 20 6d 65 61 6e 73 20 6a 75 73 74 20 74 68 61 74   means just that
e640: 3a 0a 23 20 77 68 65 6e 20 61 20 70 61 72 65 6e  :.# when a paren
e650: 74 20 6b 65 79 20 69 73 20 6d 6f 64 69 66 69 65  t key is modifie
e660: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  d or deleted fro
e670: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
e680: 6e 6f 20 73 70 65 63 69 61 6c 0a 23 20 61 63 74  no special.# act
e690: 69 6f 6e 20 69 73 20 74 61 6b 65 6e 2e 0a 23 0a  ion is taken..#.
e6a0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
e6b0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
e6c0: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
e6d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
e6e0: 4c 45 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32  LE parent(p1, p2
e6f0: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 70 31  , PRIMARY KEY(p1
e700: 2c 20 70 32 29 29 3b 0a 20 20 20 20 43 52 45 41  , p2));.    CREA
e710: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 63  TE TABLE child(c
e720: 31 2c 20 63 32 2c 20 0a 20 20 20 20 20 20 46 4f  1, c2, .      FO
e730: 52 45 49 47 4e 20 4b 45 59 28 63 31 2c 20 63 32  REIGN KEY(c1, c2
e740: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
e750: 65 6e 74 0a 20 20 20 20 20 20 4f 4e 20 55 50 44  ent.      ON UPD
e760: 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20  ATE NO ACTION.  
e770: 20 20 20 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f      ON DELETE NO
e780: 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45   ACTION.      DE
e790: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
e7a0: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
e7b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e7c0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
e7d0: 28 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20  ('j', 'k');.    
e7e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
e7f0: 6e 74 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27  nt VALUES('l', '
e800: 6d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  m');.    INSERT 
e810: 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45  INTO child VALUE
e820: 53 28 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20  S('j', 'k');.   
e830: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
e840: 6c 64 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27  ld VALUES('l', '
e850: 6d 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  m');.  }.} {}.do
e860: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e  _test e_fkey-41.
e870: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
e880: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
e890: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
e8a0: 45 54 20 70 31 3d 27 6b 27 20 57 48 45 52 45 20  ET p1='k' WHERE 
e8b0: 70 31 3d 27 6a 27 3b 0a 20 20 20 20 20 20 44 45  p1='j';.      DE
e8c0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
e8d0: 20 57 48 45 52 45 20 70 31 3d 27 6c 27 3b 0a 20   WHERE p1='l';. 
e8e0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
e8f0: 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
e900: 7b 6a 20 6b 20 6c 20 6d 7d 0a 64 6f 5f 74 65 73  {j k l m}.do_tes
e910: 74 20 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a  t e_fkey-41.3 {.
e920: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
e930: 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  T.} {1 {FOREIGN 
e940: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
e950: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
e960: 65 5f 66 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20  e_fkey-41.4 {.  
e970: 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b  execsql ROLLBACK
e980: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9d0: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 22 52  -.# Test that "R
e9e0: 45 53 54 52 49 43 54 22 20 6d 65 61 6e 73 20 74  ESTRICT" means t
e9f0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  he application i
ea00: 73 20 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f  s prohibited fro
ea10: 6d 20 64 65 6c 65 74 69 6e 67 0a 23 20 6f 72 20  m deleting.# or 
ea20: 75 70 64 61 74 69 6e 67 20 61 20 70 61 72 65 6e  updating a paren
ea30: 74 20 74 61 62 6c 65 20 72 6f 77 20 77 68 65 6e  t table row when
ea40: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ea50: 65 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20  e or more child 
ea60: 6b 65 79 73 0a 23 20 6d 61 70 70 65 64 20 74 6f  keys.# mapped to
ea70: 20 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43   it..#.# EVIDENC
ea80: 45 2d 4f 46 3a 20 52 2d 30 34 32 37 32 2d 33 38  E-OF: R-04272-38
ea90: 36 35 33 20 54 68 65 20 22 52 45 53 54 52 49 43  653 The "RESTRIC
eaa0: 54 22 20 61 63 74 69 6f 6e 20 6d 65 61 6e 73 20  T" action means 
eab0: 74 68 61 74 20 74 68 65 0a 23 20 61 70 70 6c 69  that the.# appli
eac0: 63 61 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62  cation is prohib
ead0: 69 74 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69  ited from deleti
eae0: 6e 67 20 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54  ng (for ON DELET
eaf0: 45 20 52 45 53 54 52 49 43 54 29 20 6f 72 0a 23  E RESTRICT) or.#
eb00: 20 6d 6f 64 69 66 79 69 6e 67 20 28 66 6f 72 20   modifying (for 
eb10: 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49  ON UPDATE RESTRI
eb20: 43 54 29 20 61 20 70 61 72 65 6e 74 20 6b 65 79  CT) a parent key
eb30: 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
eb40: 74 73 20 6f 6e 65 0a 23 20 6f 72 20 6d 6f 72 65  ts one.# or more
eb50: 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 61 70 70   child keys mapp
eb60: 65 64 20 74 6f 20 69 74 2e 0a 23 0a 64 72 6f 70  ed to it..#.drop
eb70: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
eb80: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20  est e_fkey-41.1 
eb90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
eba0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
ebb0: 61 72 65 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20  arent(p1, p2);. 
ebc0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
ebd0: 20 49 4e 44 45 58 20 70 61 72 65 6e 74 5f 69 20   INDEX parent_i 
ebe0: 4f 4e 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32  ON parent(p1, p2
ebf0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
ec00: 42 4c 45 20 63 68 69 6c 64 31 28 63 31 2c 20 63  BLE child1(c1, c
ec10: 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47  2, .      FOREIG
ec20: 4e 20 4b 45 59 28 63 32 2c 20 63 31 29 20 52 45  N KEY(c2, c1) RE
ec30: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
ec40: 70 31 2c 20 70 32 29 20 4f 4e 20 44 45 4c 45 54  p1, p2) ON DELET
ec50: 45 20 52 45 53 54 52 49 43 54 0a 20 20 20 20 29  E RESTRICT.    )
ec60: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ec70: 4c 45 20 63 68 69 6c 64 32 28 63 31 2c 20 63 32  LE child2(c1, c2
ec80: 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  , .      FOREIGN
ec90: 20 4b 45 59 28 63 32 2c 20 63 31 29 20 52 45 46   KEY(c2, c1) REF
eca0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70  ERENCES parent(p
ecb0: 31 2c 20 70 32 29 20 4f 4e 20 55 50 44 41 54 45  1, p2) ON UPDATE
ecc0: 20 52 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b   RESTRICT.    );
ecd0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
ece0: 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a  t e_fkey-41.2 {.
ecf0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
ed00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
ed10: 6e 74 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  nt VALUES('a', '
ed20: 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
ed30: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
ed40: 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20  ES('c', 'd');.  
ed50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
ed60: 69 6c 64 31 20 56 41 4c 55 45 53 28 27 62 27 2c  ild1 VALUES('b',
ed70: 20 27 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'a');.    INSER
ed80: 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41  T INTO child2 VA
ed90: 4c 55 45 53 28 27 64 27 2c 20 27 63 27 29 3b 0a  LUES('d', 'c');.
eda0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
edb0: 20 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20   e_fkey-41.3 {. 
edc0: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
edd0: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
ede0: 48 45 52 45 20 70 31 20 3d 20 27 61 27 20 7d 0a  HERE p1 = 'a' }.
edf0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
ee00: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
ee10: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
ee20: 66 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20 63 61  fkey-41.4 {.  ca
ee30: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
ee40: 70 61 72 65 6e 74 20 53 45 54 20 70 32 20 3d 20  parent SET p2 = 
ee50: 27 65 27 20 57 48 45 52 45 20 70 31 20 3d 20 27  'e' WHERE p1 = '
ee60: 63 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  c' }.} {1 {FOREI
ee70: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
ee80: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d  t failed}}..#---
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eed0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
eee0: 61 74 20 52 45 53 54 52 49 43 54 20 69 73 20 73  at RESTRICT is s
eef0: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
ef00: 74 20 66 72 6f 6d 20 4e 4f 20 41 43 54 49 4f 4e  t from NO ACTION
ef10: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 0a 23   for IMMEDIATE.#
ef20: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 69 6e   constraints, in
ef30: 20 74 68 61 74 20 69 74 20 69 73 20 65 6e 66 6f   that it is enfo
ef40: 72 63 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rced immediately
ef50: 2c 20 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64  , not at the end
ef60: 20 6f 66 20 74 68 65 20 0a 23 20 73 74 61 74 65   of the .# state
ef70: 6d 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ment..#.# EVIDEN
ef80: 43 45 2d 4f 46 3a 20 52 2d 33 37 39 39 37 2d 34  CE-OF: R-37997-4
ef90: 32 31 38 37 20 54 68 65 20 64 69 66 66 65 72 65  2187 The differe
efa0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
efb0: 65 66 66 65 63 74 20 6f 66 20 61 0a 23 20 52 45  effect of a.# RE
efc0: 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20 61 6e  STRICT action an
efd0: 64 20 6e 6f 72 6d 61 6c 20 66 6f 72 65 69 67 6e  d normal foreign
efe0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
eff0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 69 73 20 74  enforcement is t
f000: 68 61 74 0a 23 20 74 68 65 20 52 45 53 54 52 49  hat.# the RESTRI
f010: 43 54 20 61 63 74 69 6f 6e 20 70 72 6f 63 65 73  CT action proces
f020: 73 69 6e 67 20 68 61 70 70 65 6e 73 20 61 73 20  sing happens as 
f030: 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 65 6c  soon as the fiel
f040: 64 20 69 73 20 75 70 64 61 74 65 64 0a 23 20 2d  d is updated.# -
f050: 20 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20   not at the end 
f060: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
f070: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 77  tatement as it w
f080: 6f 75 6c 64 20 77 69 74 68 20 61 6e 0a 23 20 69  ould with an.# i
f090: 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61  mmediate constra
f0a0: 69 6e 74 2c 20 6f 72 20 61 74 20 74 68 65 20 65  int, or at the e
f0b0: 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
f0c0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 73  t transaction as
f0d0: 20 69 74 0a 23 20 77 6f 75 6c 64 20 77 69 74 68   it.# would with
f0e0: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
f0f0: 74 72 61 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61  traint..#.drop_a
f100: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
f110: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 31 20 7b 0a  t e_fkey-42.1 {.
f120: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f130: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
f140: 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
f150: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
f160: 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45  ABLE child1(c RE
f170: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
f180: 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49  ON UPDATE RESTRI
f190: 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  CT);.    CREATE 
f1a0: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52  TABLE child2(c R
f1b0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
f1c0: 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43   ON UPDATE NO AC
f1d0: 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45  TION);..    INSE
f1e0: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f1f0: 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20  ALUES('key1');. 
f200: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f210: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f220: 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y2');.    INSERT
f230: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
f240: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f260: 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ld2 VALUES('key2
f270: 27 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ');..    CREATE 
f280: 54 52 49 47 47 45 52 20 70 61 72 65 6e 74 5f 74  TRIGGER parent_t
f290: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
f2a0: 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20   parent BEGIN.  
f2b0: 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64      UPDATE child
f2c0: 31 20 73 65 74 20 63 20 3d 20 6e 65 77 2e 78 20  1 set c = new.x 
f2d0: 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b  WHERE c = old.x;
f2e0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63 68  .      UPDATE ch
f2f0: 69 6c 64 32 20 73 65 74 20 63 20 3d 20 6e 65 77  ild2 set c = new
f300: 2e 78 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64  .x WHERE c = old
f310: 2e 78 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  .x;.    END;.  }
f320: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
f330: 66 6b 65 79 2d 34 32 2e 32 20 7b 0a 20 20 63 61  fkey-42.2 {.  ca
f340: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
f350: 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27  parent SET x = '
f360: 6b 65 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78  key one' WHERE x
f370: 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31   = 'key1' }.} {1
f380: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
f390: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
f3a0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
f3b0: 2d 34 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -42.3 {.  execsq
f3c0: 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  l { .    UPDATE 
f3d0: 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27  parent SET x = '
f3e0: 6b 65 79 20 74 77 6f 27 20 57 48 45 52 45 20 78  key two' WHERE x
f3f0: 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53   = 'key2';.    S
f400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69  ELECT * FROM chi
f410: 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 6b 65 79  ld2;.  }.} {{key
f420: 20 74 77 6f 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c   two}}..drop_all
f430: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
f440: 65 5f 66 6b 65 79 2d 34 32 2e 34 20 7b 0a 20 20  e_fkey-42.4 {.  
f450: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
f460: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
f470: 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  t(x PRIMARY KEY)
f480: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f490: 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45  LE child1(c REFE
f4a0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
f4b0: 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
f4c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
f4d0: 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46  BLE child2(c REF
f4e0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
f4f0: 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49  N DELETE NO ACTI
f500: 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  ON);..    INSERT
f510: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f520: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
f540: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ent VALUES('key2
f550: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f560: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
f570: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
f580: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
f590: 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  2 VALUES('key2')
f5a0: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  ;..    CREATE TR
f5b0: 49 47 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41  IGGER parent_t A
f5c0: 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70  FTER DELETE ON p
f5d0: 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20  arent BEGIN.    
f5e0: 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 31 20    UPDATE child1 
f5f0: 53 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45  SET c = NULL WHE
f600: 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20  RE c = old.x;.  
f610: 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64      UPDATE child
f620: 32 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57  2 SET c = NULL W
f630: 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a  HERE c = old.x;.
f640: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b      END;.  }.} {
f650: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
f660: 2d 34 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  -42.5 {.  catchs
f670: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
f680: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20   parent WHERE x 
f690: 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20  = 'key1' }.} {1 
f6a0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
f6b0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
f6c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f6d0: 34 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.6 {.  execsql
f6e0: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
f6f0: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
f700: 20 78 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20   x = 'key2';.   
f710: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
f720: 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  hild2;.  }.} {{}
f730: 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  }..drop_all_tabl
f740: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
f750: 79 2d 34 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  y-42.7 {.  execs
f760: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
f770: 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50  TABLE parent(x P
f780: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
f790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
f7a0: 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45  ild1(c REFERENCE
f7b0: 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45  S parent ON DELE
f7c0: 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20  TE RESTRICT);.  
f7d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
f7e0: 68 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43  hild2(c REFERENC
f7f0: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c  ES parent ON DEL
f800: 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a  ETE NO ACTION);.
f810: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f820: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
f830: 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  key1');.    INSE
f840: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
f850: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
f860: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
f870: 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65  hild1 VALUES('ke
f880: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
f890: 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c   INTO child2 VAL
f8a0: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 7d  UES('key2');.  }
f8b0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
f8c0: 66 6b 65 79 2d 34 32 2e 38 20 7b 0a 20 20 63 61  fkey-42.8 {.  ca
f8d0: 74 63 68 73 71 6c 20 7b 20 52 45 50 4c 41 43 45  tchsql { REPLACE
f8e0: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f8f0: 55 45 53 28 27 6b 65 79 31 27 29 20 7d 0a 7d 20  UES('key1') }.} 
f900: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
f910: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
f920: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
f930: 65 79 2d 34 32 2e 39 20 7b 0a 20 20 65 78 65 63  ey-42.9 {.  exec
f940: 73 71 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c 41  sql { .    REPLA
f950: 43 45 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  CE INTO parent V
f960: 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20  ALUES('key2');. 
f970: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
f980: 20 63 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b   child2;.  }.} {
f990: 6b 65 79 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74 20 74 68 61 74 20 52 45  -.# Test that RE
f9f0: 53 54 52 49 43 54 20 69 73 20 65 6e 66 6f 72 63  STRICT is enforc
fa00: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
fa10: 65 76 65 6e 20 66 6f 72 20 61 20 44 45 46 45 52  even for a DEFER
fa20: 52 45 44 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  RED constraint..
fa30: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
fa40: 20 52 2d 32 34 31 37 39 2d 36 30 35 32 33 20 45   R-24179-60523 E
fa50: 76 65 6e 20 69 66 20 74 68 65 20 66 6f 72 65 69  ven if the forei
fa60: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
fa70: 74 20 69 74 20 69 73 0a 23 20 61 74 74 61 63 68  t it is.# attach
fa80: 65 64 20 74 6f 20 69 73 20 64 65 66 65 72 72 65  ed to is deferre
fa90: 64 2c 20 63 6f 6e 66 69 67 75 72 69 6e 67 20 61  d, configuring a
faa0: 20 52 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e   RESTRICT action
fab0: 20 63 61 75 73 65 73 20 53 51 4c 69 74 65 0a 23   causes SQLite.#
fac0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
fad0: 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ror immediately 
fae0: 69 66 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20  if a parent key 
faf0: 77 69 74 68 20 64 65 70 65 6e 64 65 6e 74 20 63  with dependent c
fb00: 68 69 6c 64 0a 23 20 6b 65 79 73 20 69 73 20 64  hild.# keys is d
fb10: 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69  eleted or modifi
fb20: 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
fb30: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
fb40: 66 6b 65 79 2d 34 33 2e 31 20 7b 0a 20 20 65 78  fkey-43.1 {.  ex
fb50: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
fb60: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
fb70: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
fb80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fb90: 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45   child1(c REFERE
fba0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
fbb0: 50 44 41 54 45 20 52 45 53 54 52 49 43 54 0a 20  PDATE RESTRICT. 
fbc0: 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20       DEFERRABLE 
fbd0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
fbe0: 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  ED.    );.    CR
fbf0: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
fc00: 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  2(c REFERENCES p
fc10: 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20  arent ON UPDATE 
fc20: 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20  NO ACTION.      
fc30: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
fc40: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
fc50: 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54    );..    INSERT
fc60: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
fc70: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
fc80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
fc90: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ent VALUES('key2
fca0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fcb0: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
fcc0: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
fcd0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
fce0: 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  2 VALUES('key2')
fcf0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d  ;.    BEGIN;.  }
fd00: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
fd10: 66 6b 65 79 2d 34 33 2e 32 20 7b 0a 20 20 63 61  fkey-43.2 {.  ca
fd20: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
fd30: 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27  parent SET x = '
fd40: 6b 65 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78  key one' WHERE x
fd50: 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31   = 'key1' }.} {1
fd60: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
fd70: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
fd80: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
fd90: 2d 34 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -43.3 {.  execsq
fda0: 6c 20 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e  l { UPDATE paren
fdb0: 74 20 53 45 54 20 78 20 3d 20 27 6b 65 79 20 74  t SET x = 'key t
fdc0: 77 6f 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b  wo' WHERE x = 'k
fdd0: 65 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ey2' }.} {}.do_t
fde0: 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 34 20  est e_fkey-43.4 
fdf0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  {.  catchsql COM
fe00: 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  MIT.} {1 {FOREIG
fe10: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
fe20: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
fe30: 74 20 65 5f 66 6b 65 79 2d 34 33 2e 35 20 7b 0a  t e_fkey-43.5 {.
fe40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fe50: 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 53 45  UPDATE child2 SE
fe60: 54 20 63 20 3d 20 27 6b 65 79 20 74 77 6f 27 3b  T c = 'key two';
fe70: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
fe80: 0a 7d 20 7b 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f  .} {}..drop_all_
fe90: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
fea0: 5f 66 6b 65 79 2d 34 33 2e 36 20 7b 0a 20 20 65  _fkey-43.6 {.  e
feb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
fec0: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
fed0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
fee0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fef0: 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52  E child1(c REFER
ff00: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
ff10: 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a  DELETE RESTRICT.
ff20: 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45        DEFERRABLE
ff30: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
ff40: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  RED.    );.    C
ff50: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
ff60: 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d2(c REFERENCES 
ff70: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
ff80: 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20   NO ACTION.     
ff90: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
ffa0: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
ffb0: 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52     );..    INSER
ffc0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
ffd0: 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20  LUES('key1');.  
ffe0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
fff0: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
10000 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  2');.    INSERT 
10010 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
10020 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
10030 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
10040 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  d2 VALUES('key2'
10050 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
10060 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
10070 5f 66 6b 65 79 2d 34 33 2e 37 20 7b 0a 20 20 63  _fkey-43.7 {.  c
10080 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
10090 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
100a0 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a  RE x = 'key1' }.
100b0 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
100c0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
100d0 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
100e0 66 6b 65 79 2d 34 33 2e 38 20 7b 0a 20 20 65 78  fkey-43.8 {.  ex
100f0 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
10100 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
10110 20 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20   x = 'key2' }.} 
10120 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
10130 79 2d 34 33 2e 39 20 7b 0a 20 20 63 61 74 63 68  y-43.9 {.  catch
10140 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
10150 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
10160 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
10170 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10180 34 33 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  43.10 {.  execsq
10190 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63  l {.    UPDATE c
101a0 68 69 6c 64 32 20 53 45 54 20 63 20 3d 20 4e 55  hild2 SET c = NU
101b0 4c 4c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  LL;.    COMMIT;.
101c0 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10210 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20  ----.# Test SET 
10220 4e 55 4c 4c 20 61 63 74 69 6f 6e 73 2e 0a 23 0a  NULL actions..#.
10230 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10240 2d 30 33 33 35 33 2d 30 35 33 32 37 20 49 66 20  -03353-05327 If 
10250 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61  the configured a
10260 63 74 69 6f 6e 20 69 73 20 22 53 45 54 20 4e 55  ction is "SET NU
10270 4c 4c 22 2c 0a 23 20 74 68 65 6e 20 77 68 65 6e  LL",.# then when
10280 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73   a parent key is
10290 20 64 65 6c 65 74 65 64 20 28 66 6f 72 20 4f 4e   deleted (for ON
102a0 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
102b0 29 20 6f 72 20 6d 6f 64 69 66 69 65 64 0a 23 20  ) or modified.# 
102c0 28 66 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 53  (for ON UPDATE S
102d0 45 54 20 4e 55 4c 4c 29 2c 20 74 68 65 20 63 68  ET NULL), the ch
102e0 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ild key columns 
102f0 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  of all rows in t
10300 68 65 0a 23 20 63 68 69 6c 64 20 74 61 62 6c 65  he.# child table
10310 20 74 68 61 74 20 6d 61 70 70 65 64 20 74 6f 20   that mapped to 
10320 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 61  the parent key a
10330 72 65 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69  re set to contai
10340 6e 20 53 51 4c 20 4e 55 4c 4c 0a 23 20 76 61 6c  n SQL NULL.# val
10350 75 65 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ues..#.drop_all_
10360 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
10370 5f 66 6b 65 79 2d 34 34 2e 31 20 7b 0a 20 20 65  _fkey-44.1 {.  e
10380 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
10390 41 54 45 20 54 41 42 4c 45 20 70 41 28 78 20 50  ATE TABLE pA(x P
103a0 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
103b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 41   CREATE TABLE cA
103c0 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 41  (c REFERENCES pA
103d0 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e   ON DELETE SET N
103e0 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ULL);.    CREATE
103f0 20 54 41 42 4c 45 20 63 42 28 63 20 52 45 46 45   TABLE cB(c REFE
10400 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 55 50 44  RENCES pA ON UPD
10410 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 0a  ATE SET NULL);..
10420 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10430 70 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44  pA VALUES(X'ABCD
10440 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
10450 4e 54 4f 20 70 41 20 56 41 4c 55 45 53 28 58 27  NTO pA VALUES(X'
10460 31 32 33 34 27 29 3b 0a 20 20 20 20 49 4e 53 45  1234');.    INSE
10470 52 54 20 49 4e 54 4f 20 63 41 20 56 41 4c 55 45  RT INTO cA VALUE
10480 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20  S(X'ABCD');.    
10490 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 42 20 56  INSERT INTO cB V
104a0 41 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a  ALUES(X'1234');.
104b0 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
104c0 20 65 5f 66 6b 65 79 2d 34 34 2e 32 20 7b 0a 20   e_fkey-44.2 {. 
104d0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
104e0 45 4c 45 54 45 20 46 52 4f 4d 20 70 41 20 57 48  ELETE FROM pA WH
104f0 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b 0a 20  ERE rowid = 1;. 
10500 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28     SELECT quote(
10510 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a  x) FROM pA;.  }.
10520 7d 20 7b 58 27 31 32 33 34 27 7d 0a 64 6f 5f 74  } {X'1234'}.do_t
10530 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 33 20  est e_fkey-44.3 
10540 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10550 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63    SELECT quote(c
10560 29 20 46 52 4f 4d 20 63 41 3b 0a 20 20 7d 0a 7d  ) FROM cA;.  }.}
10570 20 7b 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20   {NULL}.do_test 
10580 65 5f 66 6b 65 79 2d 34 34 2e 34 20 7b 0a 20 20  e_fkey-44.4 {.  
10590 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
105a0 44 41 54 45 20 70 41 20 53 45 54 20 78 20 3d 20  DATE pA SET x = 
105b0 58 27 38 37 36 35 27 20 57 48 45 52 45 20 72 6f  X'8765' WHERE ro
105c0 77 69 64 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c  wid = 2;.    SEL
105d0 45 43 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f  ECT quote(x) FRO
105e0 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 38  M pA;.  }.} {X'8
105f0 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  765'}.do_test e_
10600 66 6b 65 79 2d 34 34 2e 35 20 7b 0a 20 20 65 78  fkey-44.5 {.  ex
10610 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 71  ecsql { SELECT q
10620 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63 42 20  uote(c) FROM cB 
10630 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a 0a 23 2d 2d 2d  }.} {NULL}..#---
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45  ------.# Test SE
10690 54 20 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e  T DEFAULT action
106a0 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
106b0 4f 46 3a 20 52 2d 34 33 30 35 34 2d 35 34 38 33  OF: R-43054-5483
106c0 32 20 54 68 65 20 22 53 45 54 20 44 45 46 41 55  2 The "SET DEFAU
106d0 4c 54 22 20 61 63 74 69 6f 6e 73 20 61 72 65 20  LT" actions are 
106e0 73 69 6d 69 6c 61 72 20 74 6f 0a 23 20 22 53 45  similar to.# "SE
106f0 54 20 4e 55 4c 4c 22 2c 20 65 78 63 65 70 74 20  T NULL", except 
10700 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
10710 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d   child key colum
10720 6e 73 20 69 73 20 73 65 74 20 74 6f 0a 23 20 63  ns is set to.# c
10730 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ontain the colum
10740 6e 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ns default value
10750 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c   instead of NULL
10760 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
10770 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
10780 65 79 2d 34 35 2e 31 20 7b 0a 20 20 65 78 65 63  ey-45.1 {.  exec
10790 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
107a0 20 54 41 42 4c 45 20 70 41 28 78 20 50 52 49 4d   TABLE pA(x PRIM
107b0 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
107c0 45 41 54 45 20 54 41 42 4c 45 20 63 41 28 63 20  EATE TABLE cA(c 
107d0 44 45 46 41 55 4c 54 20 58 27 30 30 30 30 27 20  DEFAULT X'0000' 
107e0 52 45 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e  REFERENCES pA ON
107f0 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41   DELETE SET DEFA
10800 55 4c 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ULT);.    CREATE
10810 20 54 41 42 4c 45 20 63 42 28 63 20 44 45 46 41   TABLE cB(c DEFA
10820 55 4c 54 20 58 27 39 39 39 39 27 20 52 45 46 45  ULT X'9999' REFE
10830 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 55 50 44  RENCES pA ON UPD
10840 41 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 29  ATE SET DEFAULT)
10850 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
10860 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20  TO pA(rowid, x) 
10870 56 41 4c 55 45 53 28 31 2c 20 58 27 30 30 30 30  VALUES(1, X'0000
10880 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
10890 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29  NTO pA(rowid, x)
108a0 20 56 41 4c 55 45 53 28 32 2c 20 58 27 39 39 39   VALUES(2, X'999
108b0 39 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  9');.    INSERT 
108c0 49 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78  INTO pA(rowid, x
108d0 29 20 56 41 4c 55 45 53 28 33 2c 20 58 27 41 42  ) VALUES(3, X'AB
108e0 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  CD');.    INSERT
108f0 20 49 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20   INTO pA(rowid, 
10900 78 29 20 56 41 4c 55 45 53 28 34 2c 20 58 27 31  x) VALUES(4, X'1
10910 32 33 34 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45  234');..    INSE
10920 52 54 20 49 4e 54 4f 20 63 41 20 56 41 4c 55 45  RT INTO cA VALUE
10930 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20  S(X'ABCD');.    
10940 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 42 20 56  INSERT INTO cB V
10950 41 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a  ALUES(X'1234');.
10960 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
10970 20 65 5f 66 6b 65 79 2d 34 35 2e 32 20 7b 0a 20   e_fkey-45.2 {. 
10980 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
10990 45 4c 45 54 45 20 46 52 4f 4d 20 70 41 20 57 48  ELETE FROM pA WH
109a0 45 52 45 20 72 6f 77 69 64 20 3d 20 33 3b 0a 20  ERE rowid = 3;. 
109b0 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28     SELECT quote(
109c0 78 29 20 46 52 4f 4d 20 70 41 20 4f 52 44 45 52  x) FROM pA ORDER
109d0 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d   BY rowid;.  }.}
109e0 20 7b 58 27 30 30 30 30 27 20 58 27 39 39 39 39   {X'0000' X'9999
109f0 27 20 58 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65  ' X'1234'}.do_te
10a00 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 33 20 7b  st e_fkey-45.3 {
10a10 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
10a20 45 43 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f  ECT quote(c) FRO
10a30 4d 20 63 41 20 7d 0a 7d 20 7b 58 27 30 30 30 30  M cA }.} {X'0000
10a40 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  '}.do_test e_fke
10a50 79 2d 34 35 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-45.4 {.  execs
10a60 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
10a70 70 41 20 53 45 54 20 78 20 3d 20 58 27 38 37 36  pA SET x = X'876
10a80 35 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  5' WHERE rowid =
10a90 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 71   4;.    SELECT q
10aa0 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41 20  uote(x) FROM pA 
10ab0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b 0a  ORDER BY rowid;.
10ac0 20 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27 20 58    }.} {X'0000' X
10ad0 27 39 39 39 39 27 20 58 27 38 37 36 35 27 7d 0a  '9999' X'8765'}.
10ae0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10af0 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.5 {.  execsql 
10b00 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63  { SELECT quote(c
10b10 29 20 46 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 58  ) FROM cB }.} {X
10b20 27 39 39 39 39 27 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  '9999'}..#------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 44 45  ---.# Test ON DE
10b80 4c 45 54 45 20 43 41 53 43 41 44 45 20 61 63 74  LETE CASCADE act
10b90 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
10ba0 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37 36 2d 35  CE-OF: R-61376-5
10bb0 37 32 36 37 20 41 20 22 43 41 53 43 41 44 45 22  7267 A "CASCADE"
10bc0 20 61 63 74 69 6f 6e 20 70 72 6f 70 61 67 61 74   action propagat
10bd0 65 73 20 74 68 65 20 64 65 6c 65 74 65 20 6f 72  es the delete or
10be0 0a 23 20 75 70 64 61 74 65 20 6f 70 65 72 61 74  .# update operat
10bf0 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ion on the paren
10c00 74 20 6b 65 79 20 74 6f 20 65 61 63 68 20 64 65  t key to each de
10c10 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65  pendent child ke
10c20 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  y..#.# EVIDENCE-
10c30 4f 46 3a 20 52 2d 36 31 38 30 39 2d 36 32 32 30  OF: R-61809-6220
10c40 37 20 46 6f 72 20 61 6e 20 22 4f 4e 20 44 45 4c  7 For an "ON DEL
10c50 45 54 45 20 43 41 53 43 41 44 45 22 20 61 63 74  ETE CASCADE" act
10c60 69 6f 6e 2c 20 74 68 69 73 0a 23 20 6d 65 61 6e  ion, this.# mean
10c70 73 20 74 68 61 74 20 65 61 63 68 20 72 6f 77 20  s that each row 
10c80 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  in the child tab
10c90 6c 65 20 74 68 61 74 20 77 61 73 20 61 73 73 6f  le that was asso
10ca0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
10cb0 23 20 64 65 6c 65 74 65 64 20 70 61 72 65 6e 74  # deleted parent
10cc0 20 72 6f 77 20 69 73 20 61 6c 73 6f 20 64 65 6c   row is also del
10cd0 65 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  eted..#.drop_all
10ce0 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
10cf0 65 5f 66 6b 65 79 2d 34 36 2e 31 20 7b 0a 20 20  e_fkey-46.1 {.  
10d00 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
10d10 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 2c  EATE TABLE p1(a,
10d20 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
10d30 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
10d40 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 28  c REFERENCES p1(
10d50 62 29 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  b) ON DELETE CAS
10d60 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e  CADE, d);.    IN
10d70 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10d80 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
10d90 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10da0 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   p1 VALUES(4, 4)
10db0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10dc0 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O p1 VALUES(5, 5
10dd0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10de0 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO c1 VALUES(NUL
10df0 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
10e00 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
10e10 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
10e20 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10e30 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
10e40 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
10e50 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
10e60 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  3}.do_test e_fke
10e70 79 2d 34 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-46.2 {.  execs
10e80 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
10e90 46 52 4f 4d 20 70 31 20 57 48 45 52 45 20 61 20  FROM p1 WHERE a 
10ea0 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 4;.    SELECT 
10eb0 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20  d, c FROM c1;.  
10ec0 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 35 20 35 7d 0a  }.} {{} {} 5 5}.
10ed0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10ee0 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
10ef0 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
10f00 4d 20 70 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M p1;.    SELECT
10f10 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20   d, c FROM c1;. 
10f20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f   }.} {{} {}}.do_
10f30 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 34  test e_fkey-46.4
10f40 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
10f50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 31 20  ELECT * FROM p1 
10f60 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {}...#------
10f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fb0 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 55 50  ---.# Test ON UP
10fc0 44 41 54 45 20 43 41 53 43 41 44 45 20 61 63 74  DATE CASCADE act
10fd0 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
10fe0 43 45 2d 4f 46 3a 20 52 2d 31 33 38 37 37 2d 36  CE-OF: R-13877-6
10ff0 34 35 34 32 20 46 6f 72 20 61 6e 20 22 4f 4e 20  4542 For an "ON 
11000 55 50 44 41 54 45 20 43 41 53 43 41 44 45 22 20  UPDATE CASCADE" 
11010 61 63 74 69 6f 6e 2c 20 69 74 20 6d 65 61 6e 73  action, it means
11020 0a 23 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  .# that the valu
11030 65 73 20 73 74 6f 72 65 64 20 69 6e 20 65 61 63  es stored in eac
11040 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c  h dependent chil
11050 64 20 6b 65 79 20 61 72 65 20 6d 6f 64 69 66 69  d key are modifi
11060 65 64 20 74 6f 0a 23 20 6d 61 74 63 68 20 74 68  ed to.# match th
11070 65 20 6e 65 77 20 70 61 72 65 6e 74 20 6b 65 79  e new parent key
11080 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45 56 49   values..#.# EVI
11090 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37  DENCE-OF: R-6137
110a0 36 2d 35 37 32 36 37 20 41 20 22 43 41 53 43 41  6-57267 A "CASCA
110b0 44 45 22 20 61 63 74 69 6f 6e 20 70 72 6f 70 61  DE" action propa
110c0 67 61 74 65 73 20 74 68 65 20 64 65 6c 65 74 65  gates the delete
110d0 20 6f 72 0a 23 20 75 70 64 61 74 65 20 6f 70 65   or.# update ope
110e0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61  ration on the pa
110f0 72 65 6e 74 20 6b 65 79 20 74 6f 20 65 61 63 68  rent key to each
11100 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64   dependent child
11110 20 6b 65 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c   key..#.drop_all
11120 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
11130 65 5f 66 6b 65 79 2d 34 37 2e 31 20 7b 0a 20 20  e_fkey-47.1 {.  
11140 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
11150 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 2c  EATE TABLE p1(a,
11160 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
11170 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
11180 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 28  c REFERENCES p1(
11190 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  b) ON UPDATE CAS
111a0 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e  CADE, d);.    IN
111b0 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
111c0 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
111d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
111e0 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   p1 VALUES(4, 4)
111f0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11200 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O p1 VALUES(5, 5
11210 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11220 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO c1 VALUES(NUL
11230 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
11240 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
11250 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
11260 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
11270 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
11280 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
11290 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
112a0 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  3}.do_test e_fke
112b0 79 2d 34 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-47.2 {.  execs
112c0 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
112d0 70 31 20 53 45 54 20 62 20 3d 20 31 30 20 57 48  p1 SET b = 10 WH
112e0 45 52 45 20 62 20 3d 20 35 3b 0a 20 20 20 20 53  ERE b = 5;.    S
112f0 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20  ELECT d, c FROM 
11300 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
11310 20 34 20 34 20 35 20 31 30 7d 0a 64 6f 5f 74 65   4 4 5 10}.do_te
11320 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 33 20 7b  st e_fkey-47.3 {
11330 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11340 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20 62   UPDATE p1 SET b
11350 20 3d 20 31 31 20 57 48 45 52 45 20 62 20 3d 20   = 11 WHERE b = 
11360 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c  4;.    SELECT d,
11370 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   c FROM c1;.  }.
11380 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20  } {{} {} 4 11 5 
11390 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  10}.do_test e_fk
113a0 65 79 2d 34 37 2e 34 20 7b 0a 20 20 65 78 65 63  ey-47.4 {.  exec
113b0 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54  sql { .    UPDAT
113c0 45 20 70 31 20 53 45 54 20 62 20 3d 20 36 20 57  E p1 SET b = 6 W
113d0 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 3b 0a  HERE b IS NULL;.
113e0 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20      SELECT d, c 
113f0 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
11400 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20 31 30 7d  {} {} 4 11 5 10}
11410 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11420 34 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  46.5 {.  execsql
11430 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
11440 20 70 31 20 7d 0a 7d 20 7b 7b 7d 20 36 20 34 20   p1 }.} {{} 6 4 
11450 31 31 20 35 20 31 30 7d 0a 0a 23 2d 2d 2d 2d 2d  11 5 10}..#-----
11460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114a0 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
114b0 4f 46 3a 20 52 2d 36 35 30 35 38 2d 35 37 31 35  OF: R-65058-5715
114c0 38 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78  8.#.# Test an ex
114d0 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 22  ample from the "
114e0 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
114f0 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 22   UPDATE Actions"
11500 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66   section .# of f
11510 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
11520 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
11530 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
11540 79 2d 34 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-48.1 {.  execs
11550 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
11560 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
11570 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
11580 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11590 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
115a0 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
115b0 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
115c0 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
115d0 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
115e0 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61  TEGER,.      tra
115f0 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
11600 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
11610 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  t INTEGER REFERE
11620 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
11630 73 74 69 64 29 20 4f 4e 20 55 50 44 41 54 45 20  stid) ON UPDATE 
11640 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a  CASCADE.    );..
11650 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11660 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 31 2c  artist VALUES(1,
11670 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 29 3b   'Dean Martin');
11680 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11690 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 32   artist VALUES(2
116a0 2c 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72 61  , 'Frank Sinatra
116b0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
116c0 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
116d0 28 31 31 2c 20 27 54 68 61 74 27 27 73 20 41 6d  (11, 'That''s Am
116e0 6f 72 65 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ore', 1);.    IN
116f0 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
11700 56 41 4c 55 45 53 28 31 32 2c 20 27 43 68 72 69  VALUES(12, 'Chri
11710 73 74 6d 61 73 20 42 6c 75 65 73 27 2c 20 31 29  stmas Blues', 1)
11720 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11730 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
11740 33 2c 20 27 4d 79 20 57 61 79 27 2c 20 32 29 3b  3, 'My Way', 2);
11750 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
11760 74 20 65 5f 66 6b 65 79 2d 34 38 2e 32 20 7b 0a  t e_fkey-48.2 {.
11770 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11780 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
11790 54 20 61 72 74 69 73 74 69 64 20 3d 20 31 30 30  T artistid = 100
117a0 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d   WHERE artistnam
117b0 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69 6e  e = 'Dean Martin
117c0 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ';.  }.} {}.do_t
117d0 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 33 20  est e_fkey-48.3 
117e0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
117f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69  LECT * FROM arti
11800 73 74 20 7d 0a 7d 20 7b 32 20 7b 46 72 61 6e 6b  st }.} {2 {Frank
11810 20 53 69 6e 61 74 72 61 7d 20 31 30 30 20 7b 44   Sinatra} 100 {D
11820 65 61 6e 20 4d 61 72 74 69 6e 7d 7d 0a 64 6f 5f  ean Martin}}.do_
11830 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 34  test e_fkey-48.4
11840 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
11850 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 72 61  ELECT * FROM tra
11860 63 6b 20 7d 0a 7d 20 7b 31 31 20 7b 54 68 61 74  ck }.} {11 {That
11870 27 73 20 41 6d 6f 72 65 7d 20 31 30 30 20 31 32  's Amore} 100 12
11880 20 7b 43 68 72 69 73 74 6d 61 73 20 42 6c 75 65   {Christmas Blue
11890 73 7d 20 31 30 30 20 31 33 20 7b 4d 79 20 57 61  s} 100 13 {My Wa
118a0 79 7d 20 32 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  y} 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 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  --.# Verify that
11900 20 61 64 64 69 6e 67 20 61 6e 20 46 4b 20 61 63   adding an FK ac
11910 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 62  tion does not ab
11920 73 6f 6c 76 65 20 74 68 65 20 75 73 65 72 20 6f  solve the user o
11930 66 20 74 68 65 20 0a 23 20 72 65 71 75 69 72 65  f the .# require
11940 6d 65 6e 74 20 6e 6f 74 20 74 6f 20 76 69 6f 6c  ment not to viol
11950 61 74 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ate the foreign 
11960 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  key constraint..
11970 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
11980 20 52 2d 35 33 39 36 38 2d 35 31 36 34 32 20 43   R-53968-51642 C
11990 6f 6e 66 69 67 75 72 69 6e 67 20 61 6e 20 4f 4e  onfiguring an ON
119a0 20 55 50 44 41 54 45 20 6f 72 20 4f 4e 20 44 45   UPDATE or ON DE
119b0 4c 45 54 45 0a 23 20 61 63 74 69 6f 6e 20 64 6f  LETE.# action do
119c0 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74  es not mean that
119d0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
119e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 65 73   constraint does
119f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 23 20 62   not need to.# b
11a00 65 20 73 61 74 69 73 66 69 65 64 2e 0a 23 0a 64  e satisfied..#.d
11a10 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
11a20 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
11a30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
11a40 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11a50 45 20 70 61 72 65 6e 74 28 61 20 43 4f 4c 4c 41  E parent(a COLLA
11a60 54 45 20 6e 6f 63 61 73 65 2c 20 62 2c 20 63 2c  TE nocase, b, c,
11a70 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 2c 20   PRIMARY KEY(c, 
11a80 61 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  a));.    CREATE 
11a90 54 41 42 4c 45 20 63 68 69 6c 64 28 64 20 44 45  TABLE child(d DE
11aa0 46 41 55 4c 54 20 27 61 27 2c 20 65 2c 20 66 20  FAULT 'a', e, f 
11ab0 44 45 46 41 55 4c 54 20 27 63 27 2c 0a 20 20 20  DEFAULT 'c',.   
11ac0 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66     FOREIGN KEY(f
11ad0 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
11ae0 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
11af0 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
11b00 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
11b10 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
11b20 45 53 28 27 41 27 2c 20 27 62 27 2c 20 27 63 27  ES('A', 'b', 'c'
11b30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11b40 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
11b50 28 27 4f 4e 45 27 2c 20 27 74 77 6f 27 2c 20 27  ('ONE', 'two', '
11b60 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e 53  three');.    INS
11b70 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56  ERT INTO child V
11b80 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77  ALUES('one', 'tw
11b90 6f 27 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20  o', 'three');.  
11ba0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
11bb0 5f 66 6b 65 79 2d 34 39 2e 32 20 7b 0a 20 20 65  _fkey-49.2 {.  e
11bc0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
11bd0 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
11be0 20 70 61 72 65 6e 74 20 53 45 54 20 61 20 3d 20   parent SET a = 
11bf0 27 27 20 57 48 45 52 45 20 61 20 3d 20 27 6f 4e  '' WHERE a = 'oN
11c00 65 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  e';.      SELECT
11c10 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20   * FROM child;. 
11c20 20 7d 0a 7d 20 7b 61 20 74 77 6f 20 63 7d 0a 64   }.} {a two c}.d
11c30 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
11c40 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
11c50 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
11c60 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
11c70 61 72 65 6e 74 20 57 48 45 52 45 20 61 20 3d 20  arent WHERE a = 
11c80 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  'A';.    SELECT 
11c90 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20  * FROM parent;. 
11ca0 20 7d 0a 7d 20 7b 4f 4e 45 20 74 77 6f 20 74 68   }.} {ONE two th
11cb0 72 65 65 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ree}.do_test e_f
11cc0 6b 65 79 2d 34 39 2e 34 20 7b 0a 20 20 63 61 74  key-49.4 {.  cat
11cd0 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70  chsql { UPDATE p
11ce0 61 72 65 6e 74 20 53 45 54 20 61 20 3d 20 27 27  arent SET a = ''
11cf0 20 57 48 45 52 45 20 61 20 3d 20 27 6f 4e 65 27   WHERE a = 'oNe'
11d00 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
11d10 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
11d20 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d  failed}}...#----
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
11d80 2d 4f 46 3a 20 52 2d 31 31 38 35 36 2d 31 39 38  -OF: R-11856-198
11d90 33 36 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65  36.#.# Test an e
11da0 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20  xample from the 
11db0 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f  "ON DELETE and O
11dc0 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73  N UPDATE Actions
11dd0 22 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20  " section .# of 
11de0 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c  foreignkeys.html
11df0 2e 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 73  . This example s
11e00 68 6f 77 73 20 74 68 61 74 20 61 64 64 69 6e 67  hows that adding
11e10 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20 44   an "ON DELETE D
11e20 45 46 41 55 4c 54 22 0a 23 20 63 6c 61 75 73 65  EFAULT".# clause
11e30 20 64 6f 65 73 20 6e 6f 74 20 61 62 72 6f 67 61   does not abroga
11e40 74 65 20 74 68 65 20 6e 65 65 64 20 74 6f 20 73  te the need to s
11e50 61 74 69 73 66 79 20 74 68 65 20 66 6f 72 65 69  atisfy the forei
11e60 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
11e70 74 0a 23 20 28 52 2d 32 38 32 32 30 2d 34 36 36  t.# (R-28220-466
11e80 39 34 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  94)..#.# EVIDENC
11e90 45 2d 4f 46 3a 20 52 2d 32 38 32 32 30 2d 34 36  E-OF: R-28220-46
11ea0 36 39 34 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  694 For example,
11eb0 20 69 66 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54   if an "ON DELET
11ec0 45 20 53 45 54 20 44 45 46 41 55 4c 54 22 0a 23  E SET DEFAULT".#
11ed0 20 61 63 74 69 6f 6e 20 69 73 20 63 6f 6e 66 69   action is confi
11ee0 67 75 72 65 64 2c 20 62 75 74 20 74 68 65 72 65  gured, but there
11ef0 20 69 73 20 6e 6f 20 72 6f 77 20 69 6e 20 74 68   is no row in th
11f00 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 74  e parent table t
11f10 68 61 74 0a 23 20 63 6f 72 72 65 73 70 6f 6e 64  hat.# correspond
11f20 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
11f30 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 63   values of the c
11f40 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  hild key columns
11f50 2c 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 70  , deleting a.# p
11f60 61 72 65 6e 74 20 6b 65 79 20 77 68 69 6c 65 20  arent key while 
11f70 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20  dependent child 
11f80 6b 65 79 73 20 65 78 69 73 74 20 73 74 69 6c 6c  keys exist still
11f90 20 63 61 75 73 65 73 20 61 20 66 6f 72 65 69 67   causes a foreig
11fa0 6e 20 6b 65 79 0a 23 20 76 69 6f 6c 61 74 69 6f  n key.# violatio
11fb0 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  n..#.drop_all_ta
11fc0 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
11fd0 6b 65 79 2d 35 30 2e 31 20 7b 0a 20 20 65 78 65  key-50.1 {.  exe
11fe0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
11ff0 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a  E TABLE artist(.
12000 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20        artistid  
12010 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52    INTEGER PRIMAR
12020 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72  Y KEY, .      ar
12030 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20  tistname  TEXT. 
12040 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
12050 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20   TABLE track(.  
12060 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20      trackid     
12070 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74  INTEGER,.      t
12080 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
12090 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
120a0 69 73 74 20 49 4e 54 45 47 45 52 20 44 45 46 41  ist INTEGER DEFA
120b0 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45 53  ULT 0 REFERENCES
120c0 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
120d0 29 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  ) ON DELETE SET 
120e0 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20  DEFAULT.    );. 
120f0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
12100 72 74 69 73 74 20 56 41 4c 55 45 53 28 33 2c 20  rtist VALUES(3, 
12110 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e  'Sammy Davis Jr.
12120 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
12130 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
12140 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67  (14, 'Mr. Bojang
12150 6c 65 73 27 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  les', 3);.  }.} 
12160 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
12170 79 2d 35 30 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-50.2 {.  catch
12180 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
12190 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
121a0 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53 61 6d  rtistname = 'Sam
121b0 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 20 7d 0a  my Davis Jr.' }.
121c0 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
121d0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
121e0 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
121f0 66 6b 65 79 2d 35 30 2e 33 20 7b 0a 20 20 65 78  fkey-50.3 {.  ex
12200 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
12210 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
12220 41 4c 55 45 53 28 30 2c 20 27 55 6e 6b 6e 6f 77  ALUES(0, 'Unknow
12230 6e 20 41 72 74 69 73 74 27 29 3b 0a 20 20 20 20  n Artist');.    
12240 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
12250 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 6e  st WHERE artistn
12260 61 6d 65 20 3d 20 27 53 61 6d 6d 79 20 44 61 76  ame = 'Sammy Dav
12270 69 73 20 4a 72 2e 27 3b 0a 20 20 7d 0a 7d 20 7b  is Jr.';.  }.} {
12280 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
12290 2d 35 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -50.4 {.  execsq
122a0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
122b0 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b 30 20  M artist }.} {0 
122c0 7b 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74 7d  {Unknown Artist}
122d0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
122e0 2d 35 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -50.5 {.  execsq
122f0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
12300 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b 31 34 20  M track }.} {14 
12310 7b 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 7d 20  {Mr. Bojangles} 
12320 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  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 0a 23  --------------.#
12370 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12380 30 39 35 36 34 2d 32 32 31 37 30 0a 23 0a 23 20  09564-22170.#.# 
12390 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
123a0 72 64 65 72 20 6f 66 20 73 74 65 70 73 20 69 6e  rder of steps in
123b0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
123c0 4c 45 54 45 20 6f 6e 20 61 20 70 61 72 65 6e 74  LETE on a parent
123d0 20 0a 23 20 74 61 62 6c 65 20 69 73 20 61 73 20   .# table is as 
123e0 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 31  follows:.#.#   1
123f0 2e 20 45 78 65 63 75 74 65 20 61 70 70 6c 69 63  . Execute applic
12400 61 62 6c 65 20 42 45 46 4f 52 45 20 74 72 69 67  able BEFORE trig
12410 67 65 72 20 70 72 6f 67 72 61 6d 73 2c 0a 23 20  ger programs,.# 
12420 20 20 32 2e 20 43 68 65 63 6b 20 6c 6f 63 61 6c    2. Check local
12430 20 28 6e 6f 6e 20 66 6f 72 65 69 67 6e 20 6b 65   (non foreign ke
12440 79 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 0a  y) constraints,.
12450 23 20 20 20 33 2e 20 55 70 64 61 74 65 20 6f 72  #   3. Update or
12460 20 64 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20   delete the row 
12470 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
12480 62 6c 65 2c 0a 23 20 20 20 34 2e 20 50 65 72 66  ble,.#   4. Perf
12490 6f 72 6d 20 61 6e 79 20 72 65 71 75 69 72 65 64  orm any required
124a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
124b0 69 6f 6e 73 2c 0a 23 20 20 20 35 2e 20 45 78 65  ions,.#   5. Exe
124c0 63 75 74 65 20 61 70 70 6c 69 63 61 62 6c 65 20  cute applicable 
124d0 41 46 54 45 52 20 74 72 69 67 67 65 72 20 70 72  AFTER trigger pr
124e0 6f 67 72 61 6d 73 2e 20 0a 23 0a 64 72 6f 70 5f  ograms. .#.drop_
124f0 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
12500 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 31 20 7b  st e_fkey-51.1 {
12510 0a 20 20 70 72 6f 63 20 6d 61 78 70 61 72 65 6e  .  proc maxparen
12520 74 20 7b 61 72 67 73 7d 20 7b 20 64 62 20 6f 6e  t {args} { db on
12530 65 20 7b 53 45 4c 45 43 54 20 6d 61 78 28 78 29  e {SELECT max(x)
12540 20 46 52 4f 4d 20 70 61 72 65 6e 74 7d 20 7d 0a   FROM parent} }.
12550 20 20 64 62 20 66 75 6e 63 20 6d 61 78 70 61 72    db func maxpar
12560 65 6e 74 20 6d 61 78 70 61 72 65 6e 74 0a 0a 20  ent maxparent.. 
12570 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
12580 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
12590 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(x PRIMARY KEY
125a0 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
125b0 52 49 47 47 45 52 20 62 75 20 42 45 46 4f 52 45  RIGGER bu BEFORE
125c0 20 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e   UPDATE ON paren
125d0 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  t BEGIN.      IN
125e0 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
125f0 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2d 6f 6c   VALUES(new.x-ol
12600 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  d.x);.    END;. 
12610 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12620 63 68 69 6c 64 28 0a 20 20 20 20 20 20 61 20 44  child(.      a D
12630 45 46 41 55 4c 54 20 28 6d 61 78 70 61 72 65 6e  EFAULT (maxparen
12640 74 28 29 29 20 52 45 46 45 52 45 4e 43 45 53 20  t()) REFERENCES 
12650 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
12660 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
12670 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
12680 52 49 47 47 45 52 20 61 75 20 41 46 54 45 52 20  RIGGER au AFTER 
12690 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74  UPDATE ON parent
126a0 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
126b0 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
126c0 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b 6f 6c 64  VALUES(new.x+old
126d0 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20  .x);.    END;.. 
126e0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
126f0 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 29 3b  arent VALUES(1);
12700 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12710 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 31 29   child VALUES(1)
12720 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
12730 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 32 20 7b  st e_fkey-51.2 {
12740 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12750 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
12760 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20 53  ET x = 22;.    S
12770 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61 72  ELECT * FROM par
12780 65 6e 74 20 4f 52 44 45 52 20 42 59 20 72 6f 77  ent ORDER BY row
12790 69 64 3b 20 53 45 4c 45 43 54 20 27 78 78 78 27  id; SELECT 'xxx'
127a0 20 3b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ; SELECT a FROM
127b0 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32   child;.  }.} {2
127c0 32 20 32 31 20 32 33 20 78 78 78 20 32 32 7d 0a  2 21 23 xxx 22}.
127d0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
127e0 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
127f0 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
12800 4d 20 63 68 69 6c 64 3b 0a 20 20 20 20 44 45 4c  M child;.    DEL
12810 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 3b  ETE FROM parent;
12820 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12830 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 2d   parent VALUES(-
12840 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
12850 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53  NTO child VALUES
12860 28 2d 31 29 3b 0a 20 20 20 20 55 50 44 41 54 45  (-1);.    UPDATE
12870 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20   parent SET x = 
12880 32 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  22;.    SELECT *
12890 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 4f 52 44   FROM parent ORD
128a0 45 52 20 42 59 20 72 6f 77 69 64 3b 20 53 45 4c  ER BY rowid; SEL
128b0 45 43 54 20 27 78 78 78 27 20 3b 20 53 45 4c 45  ECT 'xxx' ; SELE
128c0 43 54 20 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b  CT a FROM child;
128d0 0a 20 20 7d 0a 7d 20 7b 32 32 20 32 33 20 32 31  .  }.} {22 23 21
128e0 20 78 78 78 20 32 33 7d 0a 0a 0a 23 2d 2d 2d 2d   xxx 23}...#----
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12930 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74  -----.# Verify t
12940 68 61 74 20 4f 4e 20 55 50 44 41 54 45 20 61 63  hat ON UPDATE ac
12950 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 63 74 75 61  tions only actua
12960 6c 6c 79 20 74 61 6b 65 20 70 6c 61 63 65 20 69  lly take place i
12970 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  f the parent key
12980 0a 23 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  .# is set to a n
12990 65 77 20 76 61 6c 75 65 20 74 68 61 74 20 69 73  ew value that is
129a0 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 74   distinct from t
129b0 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 20 54 68  he old value. Th
129c0 65 20 64 65 66 61 75 6c 74 0a 23 20 63 6f 6c 6c  e default.# coll
129d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
129e0 6e 64 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  nd affinity are 
129f0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
12a00 65 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c  e if the new val
12a10 75 65 0a 23 20 69 73 20 27 64 69 73 74 69 6e 63  ue.# is 'distinc
12a20 74 27 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20  t' from the old 
12a30 6f 72 20 6e 6f 74 2e 0a 23 0a 23 20 45 56 49 44  or not..#.# EVID
12a40 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 33 38 33  ENCE-OF: R-27383
12a50 2d 31 30 32 34 36 20 41 6e 20 4f 4e 20 55 50 44  -10246 An ON UPD
12a60 41 54 45 20 61 63 74 69 6f 6e 20 69 73 20 6f 6e  ATE action is on
12a70 6c 79 20 74 61 6b 65 6e 20 69 66 20 74 68 65 0a  ly taken if the.
12a80 23 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  # values of the 
12a90 70 61 72 65 6e 74 20 6b 65 79 20 61 72 65 20 6d  parent key are m
12aa0 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
12ab0 74 68 65 20 6e 65 77 20 70 61 72 65 6e 74 20 6b  the new parent k
12ac0 65 79 0a 23 20 76 61 6c 75 65 73 20 61 72 65 20  ey.# values are 
12ad0 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  not equal to the
12ae0 20 6f 6c 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c   old..#.drop_all
12af0 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
12b00 65 5f 66 6b 65 79 2d 35 32 2e 31 20 7b 0a 20 20  e_fkey-52.1 {.  
12b10 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
12b20 45 41 54 45 20 54 41 42 4c 45 20 7a 65 75 73 28  EATE TABLE zeus(
12b30 61 20 49 4e 54 45 47 45 52 20 43 4f 4c 4c 41 54  a INTEGER COLLAT
12b40 45 20 4e 4f 43 41 53 45 2c 20 62 2c 20 50 52 49  E NOCASE, b, PRI
12b50 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b  MARY KEY(a, b));
12b60 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
12b70 45 20 61 70 6f 6c 6c 6f 28 63 2c 20 64 2c 20 0a  E apollo(c, d, .
12b80 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
12b90 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
12ba0 45 53 20 7a 65 75 73 20 4f 4e 20 55 50 44 41 54  ES zeus ON UPDAT
12bb0 45 20 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b  E CASCADE.    );
12bc0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12bd0 20 7a 65 75 73 20 56 41 4c 55 45 53 28 27 61 62   zeus VALUES('ab
12be0 63 27 2c 20 27 78 79 7a 27 29 3b 0a 20 20 20 20  c', 'xyz');.    
12bf0 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 70 6f 6c  INSERT INTO apol
12c00 6c 6f 20 56 41 4c 55 45 53 28 27 41 42 43 27 2c  lo VALUES('ABC',
12c10 20 27 78 79 7a 27 29 3b 0a 20 20 7d 0a 20 20 65   'xyz');.  }.  e
12c20 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
12c30 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d  ATE zeus SET a =
12c40 20 27 61 42 63 27 3b 0a 20 20 20 20 53 45 4c 45   'aBc';.    SELE
12c50 43 54 20 2a 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f  CT * FROM apollo
12c60 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 78 79 7a  ;.  }.} {ABC xyz
12c70 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
12c80 2d 35 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -52.2 {.  execsq
12c90 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a  l {.    UPDATE z
12ca0 65 75 73 20 53 45 54 20 61 20 3d 20 31 2c 20 62  eus SET a = 1, b
12cb0 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
12cc0 20 2a 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a   * FROM apollo;.
12cd0 20 20 7d 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74    }.} {1 1}.do_t
12ce0 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 33 20  est e_fkey-52.3 
12cf0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12d00 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45    UPDATE zeus SE
12d10 54 20 61 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a  T a = 1, b = 1;.
12d20 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
12d30 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28  f(c), c, typeof(
12d40 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c  d), d FROM apoll
12d50 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  o;.  }.} {intege
12d60 72 20 31 20 69 6e 74 65 67 65 72 20 31 7d 0a 64  r 1 integer 1}.d
12d70 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32  o_test e_fkey-52
12d80 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
12d90 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73  .    UPDATE zeus
12da0 20 53 45 54 20 61 20 3d 20 27 31 27 3b 0a 20 20   SET a = '1';.  
12db0 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
12dc0 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29  c), c, typeof(d)
12dd0 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b  , d FROM apollo;
12de0 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20  .  }.} {integer 
12df0 31 20 69 6e 74 65 67 65 72 20 31 7d 0a 64 6f 5f  1 integer 1}.do_
12e00 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 35  test e_fkey-52.5
12e10 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12e20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53     UPDATE zeus S
12e30 45 54 20 62 20 3d 20 27 31 27 3b 0a 20 20 20 20  ET b = '1';.    
12e40 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29  SELECT typeof(c)
12e50 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20  , c, typeof(d), 
12e60 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20  d FROM apollo;. 
12e70 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20   }.} {integer 1 
12e80 74 65 78 74 20 31 7d 0a 64 6f 5f 74 65 73 74 20  text 1}.do_test 
12e90 65 5f 66 6b 65 79 2d 35 32 2e 36 20 7b 0a 20 20  e_fkey-52.6 {.  
12ea0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
12eb0 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 62 20  DATE zeus SET b 
12ec0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45  = NULL;.    SELE
12ed0 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c  CT typeof(c), c,
12ee0 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52   typeof(d), d FR
12ef0 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12f00 20 7b 69 6e 74 65 67 65 72 20 31 20 6e 75 6c 6c   {integer 1 null
12f10 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}}..#---------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
12f70 52 2d 33 35 31 32 39 2d 35 38 31 34 31 0a 23 0a  R-35129-58141.#.
12f80 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c  # Test an exampl
12f90 65 20 66 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44  e from the "ON D
12fa0 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44  ELETE and ON UPD
12fb0 41 54 45 20 41 63 74 69 6f 6e 73 22 20 73 65 63  ATE Actions" sec
12fc0 74 69 6f 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69  tion .# of forei
12fd0 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 54 68 69  gnkeys.html. Thi
12fe0 73 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f 6e 73  s example demons
12ff0 74 72 61 74 65 73 20 74 68 61 74 20 4f 4e 20 55  trates that ON U
13000 50 44 41 54 45 20 61 63 74 69 6f 6e 73 0a 23 20  PDATE actions.# 
13010 6f 6e 6c 79 20 74 61 6b 65 20 70 6c 61 63 65 20  only take place 
13020 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
13030 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
13040 6e 20 69 73 20 73 65 74 20 74 6f 20 61 20 76 61  n is set to a va
13050 6c 75 65 20 0a 23 20 74 68 61 74 20 69 73 20 64  lue .# that is d
13060 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 69 74 73  istinct from its
13070 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
13080 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
13090 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
130a0 79 2d 35 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-53.1 {.  execs
130b0 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
130c0 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50  TABLE parent(x P
130d0 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
130e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
130f0 69 6c 64 28 79 20 52 45 46 45 52 45 4e 43 45 53  ild(y REFERENCES
13100 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
13110 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20  E SET NULL);.   
13120 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
13130 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 27  ent VALUES('key'
13140 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
13150 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28  TO child VALUES(
13160 27 6b 65 79 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  'key');.  }.} {}
13170 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
13180 35 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  53.2 {.  execsql
13190 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61   {.    UPDATE pa
131a0 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
131b0 79 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 49  y';.    SELECT I
131c0 46 4e 55 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27 29  FNULL(y, 'null')
131d0 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d   FROM child;.  }
131e0 0a 7d 20 7b 6b 65 79 7d 0a 64 6f 5f 74 65 73 74  .} {key}.do_test
131f0 20 65 5f 66 6b 65 79 2d 35 33 2e 33 20 7b 0a 20   e_fkey-53.3 {. 
13200 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
13210 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
13220 20 78 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20   x = 'key2';.   
13230 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79   SELECT IFNULL(y
13240 2c 20 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63  , 'null') FROM c
13250 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c  hild;.  }.} {nul
13260 6c 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  l}..############
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 0a  ###############.
132b0 23 23 23 20 53 45 43 54 49 4f 4e 20 35 3a 20 43  ### SECTION 5: C
132c0 52 45 41 54 45 2c 20 41 4c 54 45 52 20 61 6e 64  REATE, ALTER and
132d0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
132e0 61 6e 64 73 0a 23 23 23 23 23 23 23 23 23 23 23  ands.###########
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 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
13380 65 73 74 20 74 68 61 74 20 70 61 72 65 6e 74 20  est that parent 
13390 6b 65 79 73 20 61 72 65 20 6e 6f 74 20 63 68 65  keys are not che
133a0 63 6b 65 64 20 77 68 65 6e 20 74 61 62 6c 65 73  cked when tables
133b0 20 61 72 65 20 63 72 65 61 74 65 64 2e 0a 23 0a   are created..#.
133c0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
133d0 2d 33 36 30 31 38 2d 32 31 37 35 35 20 54 68 65  -36018-21755 The
133e0 20 70 61 72 65 6e 74 20 6b 65 79 20 64 65 66 69   parent key defi
133f0 6e 69 74 69 6f 6e 73 20 6f 66 20 66 6f 72 65 69  nitions of forei
13400 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61  gn key.# constra
13410 69 6e 74 73 20 61 72 65 20 6e 6f 74 20 63 68 65  ints are not che
13420 63 6b 65 64 20 77 68 65 6e 20 61 20 74 61 62 6c  cked when a tabl
13430 65 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a  e is created..#.
13440 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
13450 2d 32 35 33 38 34 2d 33 39 33 33 37 20 54 68 65  -25384-39337 The
13460 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 73 74  re is nothing st
13470 6f 70 70 69 6e 67 20 74 68 65 20 75 73 65 72 20  opping the user 
13480 66 72 6f 6d 0a 23 20 63 72 65 61 74 69 6e 67 20  from.# creating 
13490 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
134a0 66 69 6e 69 74 69 6f 6e 20 74 68 61 74 20 72 65  finition that re
134b0 66 65 72 73 20 74 6f 20 61 20 70 61 72 65 6e 74  fers to a parent
134c0 20 74 61 62 6c 65 20 74 68 61 74 0a 23 20 64 6f   table that.# do
134d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
134e0 20 74 6f 20 70 61 72 65 6e 74 20 6b 65 79 20 63   to parent key c
134f0 6f 6c 75 6d 6e 73 20 74 68 61 74 20 64 6f 20 6e  olumns that do n
13500 6f 74 20 65 78 69 73 74 20 6f 72 20 61 72 65 20  ot exist or are 
13510 6e 6f 74 0a 23 20 63 6f 6c 6c 65 63 74 69 76 65  not.# collective
13520 6c 79 20 62 6f 75 6e 64 20 62 79 20 61 20 50 52  ly bound by a PR
13530 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
13540 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  QUE constraint..
13550 23 0a 23 20 43 68 69 6c 64 20 6b 65 79 73 20 61  #.# Child keys a
13560 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20 65 6e  re checked to en
13570 73 75 72 65 20 61 6c 6c 20 63 6f 6d 70 6f 6e 65  sure all compone
13580 6e 74 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74  nt columns exist
13590 2e 20 49 66 20 70 61 72 65 6e 74 0a 23 20 6b 65  . If parent.# ke
135a0 79 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 65 78  y columns are ex
135b0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
135c0 65 64 2c 20 53 51 4c 69 74 65 20 63 68 65 63 6b  ed, SQLite check
135d0 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  s to make sure t
135e0 68 65 72 65 0a 23 20 61 72 65 20 74 68 65 20 73  here.# are the s
135f0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  ame number of co
13600 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 68 69  lumns in the chi
13610 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20 6b 65  ld and parent ke
13620 79 73 2e 20 28 54 4f 44 4f 3a 20 54 68 69 73 0a  ys. (TODO: This.
13630 23 20 69 73 20 74 65 73 74 65 64 20 62 75 74 20  # is tested but 
13640 64 6f 65 73 20 6e 6f 74 20 63 6f 72 72 65 73 70  does not corresp
13650 6f 6e 64 20 74 6f 20 61 6e 79 20 74 65 73 74 61  ond to any testa
13660 62 6c 65 20 73 74 61 74 65 6d 65 6e 74 2e 29 0a  ble statement.).
13670 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68  #.# Also test th
13680 61 74 20 74 68 65 20 61 62 6f 76 65 20 73 74 61  at the above sta
13690 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
136a0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
136b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 23 20  hether or not.# 
136c0 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65  foreign keys are
136d0 20 65 6e 61 62 6c 65 64 3a 20 20 22 41 20 43 52   enabled:  "A CR
136e0 45 41 54 45 20 54 41 42 4c 45 20 63 6f 6d 6d 61  EATE TABLE comma
136f0 6e 64 20 6f 70 65 72 61 74 65 73 20 74 68 65 20  nd operates the 
13700 73 61 6d 65 20 77 68 65 74 68 65 72 0a 23 20 6f  same whether.# o
13710 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e 20 6b 65  r not foreign ke
13720 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
13730 65 20 65 6e 61 62 6c 65 64 2e 22 0a 23 0a 23 20  e enabled.".#.# 
13740 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
13750 38 39 30 38 2d 32 33 34 33 39 20 41 20 43 52 45  8908-23439 A CRE
13760 41 54 45 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ATE TABLE comman
13770 64 20 6f 70 65 72 61 74 65 73 20 74 68 65 20 73  d operates the s
13780 61 6d 65 0a 23 20 77 68 65 74 68 65 72 20 6f 72  ame.# whether or
13790 20 6e 6f 74 20 66 6f 72 65 69 67 6e 20 6b 65 79   not foreign key
137a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
137b0 20 65 6e 61 62 6c 65 64 2e 0a 23 20 0a 66 6f 72   enabled..# .for
137c0 65 61 63 68 20 7b 74 6e 20 7a 43 72 65 61 74 65  each {tn zCreate
137d0 54 62 6c 20 6c 52 65 73 7d 20 7b 0a 20 20 31 20  Tbl lRes} {.  1 
137e0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
137f0 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
13800 20 74 31 29 22 20 20 20 20 20 20 20 20 20 20 20   t1)"           
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 7b 30 20 7b 7d 7d 0a 20 20 32 20 22 43 52 45   {0 {}}.  2 "CRE
13830 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13840 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  b REFERENCES t2)
13850 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30 20               {0 
13870 7b 7d 7d 0a 20 20 33 20 22 43 52 45 41 54 45 20  {}}.  3 "CREATE 
13880 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
13890 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
138a0 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 22 20  REFERENCES t1)" 
138b0 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
138c0 20 20 34 20 22 43 52 45 41 54 45 20 54 41 42 4c    4 "CREATE TABL
138d0 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
138e0 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
138f0 52 45 4e 43 45 53 20 74 32 29 22 20 20 20 20 20  RENCES t2)"     
13900 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 35 20       {0 {}}.  5 
13910 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13920 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13930 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
13940 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20 20  ES t2)"         
13950 20 7b 30 20 7b 7d 7d 0a 20 20 36 20 22 43 52 45   {0 {}}.  6 "CRE
13960 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13970 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
13980 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13990 32 28 6e 2c 64 29 29 22 20 20 20 20 20 7b 30 20  2(n,d))"     {0 
139a0 7b 7d 7d 0a 20 20 37 20 22 43 52 45 41 54 45 20  {}}.  7 "CREATE 
139b0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
139c0 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
139d0 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61 2c  REFERENCES t1(a,
139e0 62 29 29 22 20 20 20 20 20 7b 30 20 7b 7d 7d 0a  b))"     {0 {}}.
139f0 0a 20 20 41 20 22 43 52 45 41 54 45 20 54 41 42  .  A "CREATE TAB
13a00 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45  LE t1(a, b, FORE
13a10 49 47 4e 20 4b 45 59 28 63 2c 62 29 20 52 45 46  IGN KEY(c,b) REF
13a20 45 52 45 4e 43 45 53 20 74 32 29 22 20 20 20 20  ERENCES t2)"    
13a30 20 20 20 20 20 20 0a 20 20 20 20 20 7b 31 20 7b        .     {1 {
13a40 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22  unknown column "
13a50 63 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  c" in foreign ke
13a60 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 7d 0a 20  y definition}}. 
13a70 20 42 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   B "CREATE TABLE
13a80 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47   t1(a, b, FOREIG
13a90 4e 20 4b 45 59 28 63 2c 62 29 20 52 45 46 45 52  N KEY(c,b) REFER
13aa0 45 4e 43 45 53 20 74 32 28 64 29 29 22 20 20 20  ENCES t2(d))"   
13ab0 20 20 20 20 20 20 20 0a 20 20 20 20 20 7b 31 20         .     {1 
13ac0 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  {number of colum
13ad0 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
13ae0 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
13af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
13b00 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
13b10 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 7d  ferenced table}}
13b20 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
13b30 5f 66 6b 65 79 2d 35 34 2e 24 74 6e 2e 6f 66 66  _fkey-54.$tn.off
13b40 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f   {.    drop_all_
13b50 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63 73  tables.    execs
13b60 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
13b70 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20  gn_keys = OFF}. 
13b80 20 20 20 63 61 74 63 68 73 71 6c 20 24 7a 43 72     catchsql $zCr
13b90 65 61 74 65 54 62 6c 0a 20 20 7d 20 24 6c 52 65  eateTbl.  } $lRe
13ba0 73 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  s.  do_test e_fk
13bb0 65 79 2d 35 34 2e 24 74 6e 2e 6f 6e 20 7b 0a 20  ey-54.$tn.on {. 
13bc0 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c     drop_all_tabl
13bd0 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  es.    execsql {
13be0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
13bf0 65 79 73 20 3d 20 4f 4e 7d 0a 20 20 20 20 63 61  eys = ON}.    ca
13c00 74 63 68 73 71 6c 20 24 7a 43 72 65 61 74 65 54  tchsql $zCreateT
13c10 62 6c 0a 20 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a  bl.  } $lRes.}..
13c20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
13c70 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39 35  DENCE-OF: R-4795
13c80 32 2d 36 32 34 39 38 20 49 74 20 69 73 20 6e 6f  2-62498 It is no
13c90 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
13ca0 65 20 74 68 65 20 22 41 4c 54 45 52 20 54 41 42  e the "ALTER TAB
13cb0 4c 45 0a 23 20 2e 2e 2e 20 41 44 44 20 43 4f 4c  LE.# ... ADD COL
13cc0 55 4d 4e 22 20 73 79 6e 74 61 78 20 74 6f 20 61  UMN" syntax to a
13cd0 64 64 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  dd a column that
13ce0 20 69 6e 63 6c 75 64 65 73 20 61 20 52 45 46 45   includes a REFE
13cf0 52 45 4e 43 45 53 0a 23 20 63 6c 61 75 73 65 2c  RENCES.# clause,
13d00 20 75 6e 6c 65 73 73 20 74 68 65 20 64 65 66 61   unless the defa
13d10 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ult value of the
13d20 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 69 73 20 4e   new column is N
13d30 55 4c 4c 2e 20 41 74 74 65 6d 70 74 69 6e 67 0a  ULL. Attempting.
13d40 23 20 74 6f 20 64 6f 20 73 6f 20 72 65 74 75 72  # to do so retur
13d50 6e 73 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70  ns an error..#.p
13d60 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  roc test_efkey_6
13d70 20 7b 74 6e 20 7a 41 6c 74 65 72 20 69 73 45 72   {tn zAlter isEr
13d80 72 6f 72 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  ror} {.  drop_al
13d90 6c 5f 74 61 62 6c 65 73 20 0a 0a 20 20 64 6f 5f  l_tables ..  do_
13da0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 24  test e_fkey-56.$
13db0 74 6e 2e 31 20 22 0a 20 20 20 20 65 78 65 63 73  tn.1 ".    execs
13dc0 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
13dd0 45 20 74 62 6c 28 61 2c 20 62 29 20 7d 0a 20 20  E tbl(a, b) }.  
13de0 20 20 5b 6c 69 73 74 20 63 61 74 63 68 73 71 6c    [list catchsql
13df0 20 24 7a 41 6c 74 65 72 5d 0a 20 20 22 20 5b 6c   $zAlter].  " [l
13e00 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
13e10 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 52   {Cannot add a R
13e20 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e  EFERENCES column
13e30 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64   with non-NULL d
13e40 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d 7d 20  efault value}}} 
13e50 24 69 73 45 72 72 6f 72 5d 0a 0a 7d 0a 0a 74 65  $isError]..}..te
13e60 73 74 5f 65 66 6b 65 79 5f 36 20 31 20 22 41 4c  st_efkey_6 1 "AL
13e70 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20 41 44  TER TABLE tbl AD
13e80 44 20 43 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52  D COLUMN c REFER
13e90 45 4e 43 45 53 20 78 78 22 20 30 0a 74 65 73 74  ENCES xx" 0.test
13ea0 5f 65 66 6b 65 79 5f 36 20 32 20 22 41 4c 54 45  _efkey_6 2 "ALTE
13eb0 52 20 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20  R TABLE tbl ADD 
13ec0 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54  COLUMN c DEFAULT
13ed0 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53   NULL REFERENCES
13ee0 20 78 78 22 20 30 0a 74 65 73 74 5f 65 66 6b 65   xx" 0.test_efke
13ef0 79 5f 36 20 33 20 22 41 4c 54 45 52 20 54 41 42  y_6 3 "ALTER TAB
13f00 4c 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d  LE tbl ADD COLUM
13f10 4e 20 63 20 44 45 46 41 55 4c 54 20 30 20 52 45  N c DEFAULT 0 RE
13f20 46 45 52 45 4e 43 45 53 20 78 78 22 20 31 0a 0a  FERENCES xx" 1..
13f30 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
13f80 74 20 74 68 61 74 20 41 4c 54 45 52 20 54 41 42  t that ALTER TAB
13f90 4c 45 20 61 64 6a 75 73 74 73 20 52 45 46 45 52  LE adjusts REFER
13fa0 45 4e 43 45 53 20 63 6c 61 75 73 65 73 20 77 68  ENCES clauses wh
13fb0 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  en the parent ta
13fc0 62 6c 65 0a 23 20 69 73 20 52 45 4e 41 4d 45 44  ble.# is RENAMED
13fd0 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
13fe0 46 3a 20 52 2d 34 37 30 38 30 2d 30 32 30 36 39  F: R-47080-02069
13ff0 20 49 66 20 61 6e 20 22 41 4c 54 45 52 20 54 41   If an "ALTER TA
14000 42 4c 45 20 2e 2e 2e 20 52 45 4e 41 4d 45 20 54  BLE ... RENAME T
14010 4f 22 20 63 6f 6d 6d 61 6e 64 0a 23 20 69 73 20  O" command.# is 
14020 75 73 65 64 20 74 6f 20 72 65 6e 61 6d 65 20 61  used to rename a
14030 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
14040 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
14050 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 23  of one or more.#
14060 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
14070 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 64 65  straints, the de
14080 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  finitions of the
14090 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63   foreign key.# c
140a0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6d  onstraints are m
140b0 6f 64 69 66 69 65 64 20 74 6f 20 72 65 66 65 72  odified to refer
140c0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 74   to the parent t
140d0 61 62 6c 65 20 62 79 20 69 74 73 20 6e 65 77 20  able by its new 
140e0 6e 61 6d 65 0a 23 0a 23 20 54 65 73 74 20 74 68  name.#.# Test th
140f0 61 74 20 74 68 65 73 65 20 61 64 6a 75 73 74 6d  at these adjustm
14100 65 6e 74 73 20 61 72 65 20 76 69 73 69 62 6c 65  ents are visible
14110 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
14120 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 23 0a 23  aster table..#.#
14130 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14140 36 33 38 32 37 2d 35 34 37 37 34 20 54 68 65 20  63827-54774 The 
14150 74 65 78 74 20 6f 66 20 74 68 65 20 63 68 69 6c  text of the chil
14160 64 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 23  d CREATE TABLE.#
14170 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74   statement or st
14180 61 74 65 6d 65 6e 74 73 20 73 74 6f 72 65 64 20  atements stored 
14190 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
141a0 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20 6d  ster table are m
141b0 6f 64 69 66 69 65 64 0a 23 20 74 6f 20 72 65 66  odified.# to ref
141c0 6c 65 63 74 20 74 68 65 20 6e 65 77 20 70 61 72  lect the new par
141d0 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  ent table name..
141e0 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
141f0 2d 35 36 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61  -56.1 {.  drop_a
14200 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63  ll_tables.  exec
14210 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
14220 20 54 41 42 4c 45 20 27 70 20 31 20 22 70 61 72   TABLE 'p 1 "par
14230 65 6e 74 20 6f 6e 65 22 27 28 61 20 52 45 46 45  ent one"'(a REFE
14240 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72  RENCES 'p 1 "par
14250 65 6e 74 20 6f 6e 65 22 27 2c 20 62 2c 20 50 52  ent one"', b, PR
14260 49 4d 41 52 59 20 4b 45 59 28 62 29 29 3b 0a 0a  IMARY KEY(b));..
14270 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14280 20 63 31 28 63 2c 20 64 20 52 45 46 45 52 45 4e   c1(c, d REFEREN
14290 43 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74  CES 'p 1 "parent
142a0 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45   one"' ON UPDATE
142b0 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43   CASCADE);.    C
142c0 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 65  REATE TABLE c2(e
142d0 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , f, FOREIGN KEY
142e0 28 66 29 20 52 45 46 45 52 45 4e 43 45 53 20 27  (f) REFERENCES '
142f0 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14300 27 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  ' ON UPDATE CASC
14310 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ADE);.    CREATE
14320 20 54 41 42 4c 45 20 63 33 28 65 2c 20 27 66 20   TABLE c3(e, 'f 
14330 63 6f 6c 20 32 27 2c 20 46 4f 52 45 49 47 4e 20  col 2', FOREIGN 
14340 4b 45 59 28 27 66 20 63 6f 6c 20 32 27 29 20 52  KEY('f col 2') R
14350 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20 22  EFERENCES 'p 1 "
14360 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20  parent one"' ON 
14370 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
14380 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
14390 4f 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f  O 'p 1 "parent o
143a0 6e 65 22 27 20 56 41 4c 55 45 53 28 31 2c 20 31  ne"' VALUES(1, 1
143b0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
143c0 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20  TO c1 VALUES(1, 
143d0 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
143e0 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c  NTO c2 VALUES(1,
143f0 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   1);.    INSERT 
14400 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31  INTO c3 VALUES(1
14410 2c 20 31 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 52  , 1);..    -- CR
14420 45 41 54 45 20 54 41 42 4c 45 20 71 28 61 2c 20  EATE TABLE q(a, 
14430 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62  b, PRIMARY KEY(b
14440 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ));.  }.} {}.do_
14450 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 32  test e_fkey-56.2
14460 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41   {.  execsql { A
14470 4c 54 45 52 20 54 41 42 4c 45 20 27 70 20 31 20  LTER TABLE 'p 1 
14480 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 52 45  "parent one"' RE
14490 4e 41 4d 45 20 54 4f 20 70 20 7d 0a 7d 20 7b 7d  NAME TO p }.} {}
144a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
144b0 35 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  56.3 {.  execsql
144c0 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 20   {.    UPDATE p 
144d0 53 45 54 20 61 20 3d 20 27 78 78 78 27 2c 20 62  SET a = 'xxx', b
144e0 20 3d 20 27 78 78 78 27 3b 0a 20 20 20 20 53 45   = 'xxx';.    SE
144f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 3b 0a 20  LECT * FROM p;. 
14500 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
14510 20 63 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   c1;.    SELECT 
14520 2a 20 46 52 4f 4d 20 63 32 3b 0a 20 20 20 20 53  * FROM c2;.    S
14530 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33 3b  ELECT * FROM c3;
14540 0a 20 20 7d 0a 7d 20 7b 78 78 78 20 78 78 78 20  .  }.} {xxx xxx 
14550 31 20 78 78 78 20 31 20 78 78 78 20 31 20 78 78  1 xxx 1 xxx 1 xx
14560 78 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  x}.do_test e_fke
14570 79 2d 35 36 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-56.4 {.  execs
14580 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20  ql { SELECT sql 
14590 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
145a0 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
145b0 27 74 61 62 6c 65 27 7d 0a 7d 20 5b 6c 69 73 74  'table'}.} [list
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 5c 0a 20 20 7b 43 52 45 41 54 45       \.  {CREATE
14610 20 54 41 42 4c 45 20 22 70 22 28 61 20 52 45 46   TABLE "p"(a REF
14620 45 52 45 4e 43 45 53 20 22 70 22 2c 20 62 2c 20  ERENCES "p", b, 
14630 50 52 49 4d 41 52 59 20 4b 45 59 28 62 29 29 7d  PRIMARY KEY(b))}
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54     \.  {CREATE T
14660 41 42 4c 45 20 63 31 28 63 2c 20 64 20 52 45 46  ABLE c1(c, d REF
14670 45 52 45 4e 43 45 53 20 22 70 22 20 4f 4e 20 55  ERENCES "p" ON U
14680 50 44 41 54 45 20 43 41 53 43 41 44 45 29 7d 20  PDATE CASCADE)} 
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42   \.  {CREATE TAB
146b0 4c 45 20 63 32 28 65 2c 20 66 2c 20 46 4f 52 45  LE c2(e, f, FORE
146c0 49 47 4e 20 4b 45 59 28 66 29 20 52 45 46 45 52  IGN KEY(f) REFER
146d0 45 4e 43 45 53 20 22 70 22 20 4f 4e 20 55 50 44  ENCES "p" ON UPD
146e0 41 54 45 20 43 41 53 43 41 44 45 29 7d 20 20 5c  ATE CASCADE)}  \
146f0 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  .  {CREATE TABLE
14700 20 63 33 28 65 2c 20 27 66 20 63 6f 6c 20 32 27   c3(e, 'f col 2'
14710 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 27 66  , FOREIGN KEY('f
14720 20 63 6f 6c 20 32 27 29 20 52 45 46 45 52 45 4e   col 2') REFEREN
14730 43 45 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54  CES "p" ON UPDAT
14740 45 20 43 41 53 43 41 44 45 29 7d 20 5c 0a 5d 0a  E CASCADE)} \.].
14750 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
147a0 65 63 6b 20 74 68 61 74 20 61 20 44 52 4f 50 20  eck that a DROP 
147b0 54 41 42 4c 45 20 64 6f 65 73 20 61 6e 20 69 6d  TABLE does an im
147c0 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20 46 52  plicit DELETE FR
147d0 4f 4d 2e 20 57 68 69 63 68 20 64 6f 65 73 20 6e  OM. Which does n
147e0 6f 74 0a 23 20 63 61 75 73 65 20 61 6e 79 20 74  ot.# cause any t
147f0 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65 2c  riggers to fire,
14800 20 62 75 74 20 64 6f 65 73 20 66 69 72 65 20 66   but does fire f
14810 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f  oreign key actio
14820 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ns..#.# EVIDENCE
14830 2d 4f 46 3a 20 52 2d 31 34 32 30 38 2d 32 33 39  -OF: R-14208-239
14840 38 36 20 49 66 20 66 6f 72 65 69 67 6e 20 6b 65  86 If foreign ke
14850 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
14860 65 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 0a 23  e enabled when.#
14870 20 69 74 20 69 73 20 70 72 65 70 61 72 65 64 2c   it is prepared,
14880 20 74 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20   the DROP TABLE 
14890 63 6f 6d 6d 61 6e 64 20 70 65 72 66 6f 72 6d 73  command performs
148a0 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c   an implicit DEL
148b0 45 54 45 20 74 6f 0a 23 20 72 65 6d 6f 76 65 20  ETE to.# remove 
148c0 61 6c 6c 20 72 6f 77 73 20 66 72 6f 6d 20 74 68  all rows from th
148d0 65 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 64  e table before d
148e0 72 6f 70 70 69 6e 67 20 69 74 2e 0a 23 0a 23 20  ropping it..#.# 
148f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
14900 31 30 37 38 2d 30 33 39 34 35 20 54 68 65 20 69  1078-03945 The i
14910 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20 64  mplicit DELETE d
14920 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
14930 79 20 53 51 4c 0a 23 20 74 72 69 67 67 65 72 73  y SQL.# triggers
14940 20 74 6f 20 66 69 72 65 2c 20 62 75 74 20 6d 61   to fire, but ma
14950 79 20 69 6e 76 6f 6b 65 20 66 6f 72 65 69 67 6e  y invoke foreign
14960 20 6b 65 79 20 61 63 74 69 6f 6e 73 20 6f 72 20   key actions or 
14970 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20 76 69 6f  constraint.# vio
14980 6c 61 74 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65  lations..#.do_te
14990 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 31 20 7b  st e_fkey-57.1 {
149a0 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
149b0 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
149c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
149d0 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  p(a, b, PRIMARY 
149e0 4b 45 59 28 61 2c 20 62 29 29 3b 0a 0a 20 20 20  KEY(a, b));..   
149f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
14a00 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
14a10 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
14a20 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20  CES p ON DELETE 
14a30 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 43  SET NULL);.    C
14a40 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 63  REATE TABLE c2(c
14a50 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
14a60 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
14a70 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45  S p ON DELETE SE
14a80 54 20 44 45 46 41 55 4c 54 29 3b 0a 20 20 20 20  T DEFAULT);.    
14a90 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
14aa0 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
14ab0 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
14ac0 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 43  ES p ON DELETE C
14ad0 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45  ASCADE);.    CRE
14ae0 41 54 45 20 54 41 42 4c 45 20 63 34 28 63 2c 20  ATE TABLE c4(c, 
14af0 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
14b00 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14b10 70 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54  p ON DELETE REST
14b20 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54  RICT);.    CREAT
14b30 45 20 54 41 42 4c 45 20 63 35 28 63 2c 20 64 2c  E TABLE c5(c, d,
14b40 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
14b50 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
14b60 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54  ON DELETE NO ACT
14b70 49 4f 4e 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  ION);..    CREAT
14b80 45 20 54 41 42 4c 45 20 63 36 28 63 2c 20 64 2c  E TABLE c6(c, d,
14b90 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20   .      FOREIGN 
14ba0 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45  KEY(c, d) REFERE
14bb0 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45  NCES p ON DELETE
14bc0 20 52 45 53 54 52 49 43 54 20 0a 20 20 20 20 20   RESTRICT .     
14bd0 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
14be0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
14bf0 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
14c00 20 54 41 42 4c 45 20 63 37 28 63 2c 20 64 2c 20   TABLE c7(c, d, 
14c10 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
14c20 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
14c30 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20  CES p ON DELETE 
14c40 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20  NO ACTION.      
14c50 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
14c60 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
14c70 20 20 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45    );..    CREATE
14c80 20 54 41 42 4c 45 20 6c 6f 67 28 6d 73 67 29 3b   TABLE log(msg);
14c90 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
14ca0 47 45 52 20 74 74 20 41 46 54 45 52 20 44 45 4c  GER tt AFTER DEL
14cb0 45 54 45 20 4f 4e 20 70 20 42 45 47 49 4e 0a 20  ETE ON p BEGIN. 
14cc0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
14cd0 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 64 65 6c   log VALUES('del
14ce0 65 74 65 20 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77  ete ' || old.row
14cf0 69 64 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  id);.    END;.  
14d00 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
14d10 65 5f 66 6b 65 79 2d 35 37 2e 32 20 7b 0a 20 20  e_fkey-57.2 {.  
14d20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
14d30 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
14d40 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
14d50 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
14d60 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
14d70 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14d80 54 4f 20 63 32 20 56 41 4c 55 45 53 28 27 61 27  TO c2 VALUES('a'
14d90 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'b');.    INSE
14da0 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
14db0 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
14dc0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52   BEGIN;.      DR
14dd0 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20  OP TABLE p;.    
14de0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
14df0 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
14e00 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
14e10 2d 35 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -57.3 {.  execsq
14e20 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
14e30 4d 20 63 32 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d  M c2 }.} {{} {}}
14e40 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14e50 35 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  57.4 {.  execsql
14e60 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
14e70 20 63 33 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   c3 }.} {}.do_te
14e80 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 35 20 7b  st e_fkey-57.5 {
14e90 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
14ea0 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 20 7d  ECT * FROM log }
14eb0 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
14ec0 66 6b 65 79 2d 35 37 2e 36 20 7b 0a 20 20 65 78  fkey-57.6 {.  ex
14ed0 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d  ecsql ROLLBACK.}
14ee0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
14ef0 65 79 2d 35 37 2e 37 20 7b 0a 20 20 65 78 65 63  ey-57.7 {.  exec
14f00 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
14f10 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
14f20 4f 4d 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  OM p;.      SELE
14f30 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
14f40 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
14f50 0a 7d 20 7b 7b 64 65 6c 65 74 65 20 31 7d 7d 0a  .} {{delete 1}}.
14f60 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66  -----------.# If
14fb0 20 61 6e 20 49 4d 4d 45 44 49 41 54 45 20 66 6f   an IMMEDIATE fo
14fc0 72 65 69 67 6e 20 6b 65 79 20 66 61 69 6c 73 20  reign key fails 
14fd0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
14fe0 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 74 68 65   DROP TABLE, the
14ff0 0a 23 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  .# DROP TABLE co
15000 6d 6d 61 6e 64 20 66 61 69 6c 73 2e 0a 23 0a 23  mmand fails..#.#
15010 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
15020 33 32 37 36 38 2d 34 37 39 32 35 20 49 66 20 61  32768-47925 If a
15030 6e 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  n immediate fore
15040 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
15050 6e 74 20 69 73 0a 23 20 76 69 6f 6c 61 74 65 64  nt is.# violated
15060 2c 20 74 68 65 20 44 52 4f 50 20 54 41 42 4c 45  , the DROP TABLE
15070 20 73 74 61 74 65 6d 65 6e 74 20 66 61 69 6c 73   statement fails
15080 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
15090 73 20 6e 6f 74 20 64 72 6f 70 70 65 64 2e 0a 23  s not dropped..#
150a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
150b0 35 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  58.1 {.  execsql
150c0 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
150d0 52 4f 4d 20 63 31 3b 0a 20 20 20 20 44 45 4c 45  ROM c1;.    DELE
150e0 54 45 20 46 52 4f 4d 20 63 32 3b 0a 20 20 20 20  TE FROM c2;.    
150f0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 33 3b 0a  DELETE FROM c3;.
15100 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
15110 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56  INSERT INTO c5 V
15120 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 20  ALUES('a', 'b') 
15130 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  }.  catchsql { D
15140 52 4f 50 20 54 41 42 4c 45 20 70 20 7d 0a 7d 20  ROP TABLE p }.} 
15150 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
15160 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
15170 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
15180 65 79 2d 35 38 2e 32 20 7b 0a 20 20 65 78 65 63  ey-58.2 {.  exec
15190 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
151a0 52 4f 4d 20 70 20 7d 0a 7d 20 7b 61 20 62 7d 0a  ROM p }.} {a b}.
151b0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
151c0 38 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  8.3 {.  catchsql
151d0 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
151e0 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70      DROP TABLE p
151f0 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  ;.  }.} {1 {FORE
15200 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
15210 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
15220 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 34 20  est e_fkey-58.4 
15230 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
15240 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
15250 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  p;.    SELECT * 
15260 46 52 4f 4d 20 63 35 3b 0a 20 20 20 20 52 4f 4c  FROM c5;.    ROL
15270 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 61 20  LBACK;.  }.} {a 
15280 62 20 61 20 62 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  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 0a 23 20 49 66 20 61 20 44 45 46 45 52 52  --.# If a DEFERR
152e0 45 44 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 66  ED foreign key f
152f0 61 69 6c 73 20 61 73 20 61 20 72 65 73 75 6c 74  ails as a result
15300 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
15310 2c 20 61 74 74 65 6d 70 74 69 6e 67 0a 23 20 74  , attempting.# t
15320 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
15330 6e 73 61 63 74 69 6f 6e 20 66 61 69 6c 73 20 75  nsaction fails u
15340 6e 6c 65 73 73 20 74 68 65 20 76 69 6f 6c 61 74  nless the violat
15350 69 6f 6e 20 69 73 20 66 69 78 65 64 2e 0a 23 0a  ion is fixed..#.
15360 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
15370 2d 30 35 39 30 33 2d 30 38 34 36 30 20 49 66 20  -05903-08460 If 
15380 61 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  a deferred forei
15390 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
153a0 74 20 69 73 0a 23 20 76 69 6f 6c 61 74 65 64 2c  t is.# violated,
153b0 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 69   then an error i
153c0 73 20 72 65 70 6f 72 74 65 64 20 77 68 65 6e 20  s reported when 
153d0 74 68 65 20 75 73 65 72 20 61 74 74 65 6d 70 74  the user attempt
153e0 73 20 74 6f 20 63 6f 6d 6d 69 74 0a 23 20 74 68  s to commit.# th
153f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
15400 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
15410 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
15420 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 65 78 69  ations still exi
15430 73 74 0a 23 20 61 74 20 74 68 61 74 20 70 6f 69  st.# at that poi
15440 6e 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  nt..#.do_test e_
15450 66 6b 65 79 2d 35 39 2e 31 20 7b 0a 20 20 65 78  fkey-59.1 {.  ex
15460 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c  ecsql { .    DEL
15470 45 54 45 20 46 52 4f 4d 20 63 31 20 3b 20 44 45  ETE FROM c1 ; DE
15480 4c 45 54 45 20 46 52 4f 4d 20 63 32 20 3b 20 44  LETE FROM c2 ; D
15490 45 4c 45 54 45 20 46 52 4f 4d 20 63 33 20 3b 0a  ELETE FROM c3 ;.
154a0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
154b0 63 34 20 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d  c4 ; DELETE FROM
154c0 20 63 35 20 3b 20 44 45 4c 45 54 45 20 46 52 4f   c5 ; DELETE FRO
154d0 4d 20 63 36 20 3b 0a 20 20 20 20 44 45 4c 45 54  M c6 ;.    DELET
154e0 45 20 46 52 4f 4d 20 63 37 20 0a 20 20 7d 0a 7d  E FROM c7 .  }.}
154f0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
15500 65 79 2d 35 39 2e 32 20 7b 0a 20 20 65 78 65 63  ey-59.2 {.  exec
15510 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
15520 4f 20 63 37 20 56 41 4c 55 45 53 28 27 61 27 2c  O c7 VALUES('a',
15530 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63 73 71   'b') }.  execsq
15540 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
15550 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
15560 70 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  p;.  }.} {}.do_t
15570 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 33 20  est e_fkey-59.3 
15580 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  {.  catchsql COM
15590 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  MIT.} {1 {FOREIG
155a0 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
155b0 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
155c0 74 20 65 5f 66 6b 65 79 2d 35 39 2e 34 20 7b 0a  t e_fkey-59.4 {.
155d0 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
155e0 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c  TE TABLE p(a, b,
155f0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
15600 62 29 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  b)) }.  catchsql
15610 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f   COMMIT.} {1 {FO
15620 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
15630 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
15640 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e  _test e_fkey-59.
15650 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
15660 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
15670 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d  LUES('a', 'b') }
15680 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
15690 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  T.} {}..#-------
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 0a 23 20 41 6e 79 20 22 66 6f 72 65 69 67  --.# Any "foreig
156f0 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 20  n key mismatch" 
15700 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
15710 65 64 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  ed while running
15720 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a 23 20 22   an implicit.# "
15730 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 22  DELETE FROM tbl"
15740 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a   are ignored..#.
15750 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
15760 2d 35 37 32 34 32 2d 33 37 30 30 35 20 41 6e 79  -57242-37005 Any
15770 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
15780 73 6d 61 74 63 68 22 20 65 72 72 6f 72 73 0a 23  smatch" errors.#
15790 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 20   encountered as 
157a0 70 61 72 74 20 6f 66 20 61 6e 20 69 6d 70 6c 69  part of an impli
157b0 63 69 74 20 44 45 4c 45 54 45 20 61 72 65 20 69  cit DELETE are i
157c0 67 6e 6f 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  gnored..#.drop_a
157d0 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
157e0 74 20 65 5f 66 6b 65 79 2d 36 30 2e 31 20 7b 0a  t e_fkey-60.1 {.
157f0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15800 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
15810 65 79 73 20 3d 20 4f 46 46 3b 0a 0a 20 20 20 20  eys = OFF;..    
15820 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61  CREATE TABLE p(a
15830 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
15840 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73 75 63  REFERENCES nosuc
15850 68 74 61 62 6c 65 29 3b 0a 20 20 20 20 43 52 45  htable);.    CRE
15860 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
15870 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
15880 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
15890 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  a);.    CREATE T
158a0 41 42 4c 45 20 63 32 28 63 20 52 45 46 45 52 45  ABLE c2(c REFERE
158b0 4e 43 45 53 20 70 28 62 29 2c 20 64 29 3b 0a 20  NCES p(b), d);. 
158c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
158d0 63 33 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  c3(c REFERENCES 
158e0 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  p ON DELETE SET 
158f0 4e 55 4c 4c 2c 20 64 29 3b 0a 0a 20 20 20 20 49  NULL, d);..    I
15900 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c  NSERT INTO p VAL
15910 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49  UES(1, 2);.    I
15920 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
15930 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
15940 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
15950 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
15960 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
15970 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
15980 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
15990 5f 66 6b 65 79 2d 36 30 2e 32 20 7b 0a 20 20 65  _fkey-60.2 {.  e
159a0 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
159b0 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
159c0 4e 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  N }.  catchsql {
159d0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d   DELETE FROM p }
159e0 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74  .} {1 {no such t
159f0 61 62 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63  able: main.nosuc
15a00 68 74 61 62 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74  htable}}.do_test
15a10 20 65 5f 66 6b 65 79 2d 36 30 2e 33 20 7b 0a 20   e_fkey-60.3 {. 
15a20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
15a30 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50  EGIN;.      DROP
15a40 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20   TABLE p;.      
15a50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33  SELECT * FROM c3
15a60 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
15a70 20 20 7d 0a 7d 20 7b 7b 7d 20 32 7d 0a 64 6f 5f    }.} {{} 2}.do_
15a80 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 34  test e_fkey-60.4
15a90 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
15aa0 52 45 41 54 45 20 54 41 42 4c 45 20 6e 6f 73 75  REATE TABLE nosu
15ab0 63 68 74 61 62 6c 65 28 78 20 50 52 49 4d 41 52  chtable(x PRIMAR
15ac0 59 20 4b 45 59 29 20 7d 0a 20 20 63 61 74 63 68  Y KEY) }.  catch
15ad0 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
15ae0 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  M p }.} {1 {fore
15af0 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
15b00 20 2d 20 22 63 32 22 20 72 65 66 65 72 65 6e 63   - "c2" referenc
15b10 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74 65 73  ing "p"}}.do_tes
15b20 74 20 65 5f 66 6b 65 79 2d 36 30 2e 35 20 7b 0a  t e_fkey-60.5 {.
15b30 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50    execsql { DROP
15b40 20 54 41 42 4c 45 20 63 31 20 7d 0a 20 20 63 61   TABLE c1 }.  ca
15b50 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
15b60 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 66  FROM p }.} {1 {f
15b70 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
15b80 74 63 68 20 2d 20 22 63 32 22 20 72 65 66 65 72  tch - "c2" refer
15b90 65 6e 63 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f  encing "p"}}.do_
15ba0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 36  test e_fkey-60.6
15bb0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
15bc0 52 4f 50 20 54 41 42 4c 45 20 63 32 20 7d 0a 20  ROP TABLE c2 }. 
15bd0 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
15be0 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 7d 0a  E FROM p }.} {}.
15bf0 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
15c40 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63  st that the spec
15c50 69 61 6c 20 62 65 68 61 76 69 6f 72 73 20 6f 66  ial behaviors of
15c60 20 41 4c 54 45 52 20 61 6e 64 20 44 52 4f 50 20   ALTER and DROP 
15c70 54 41 42 4c 45 20 61 72 65 20 6f 6e 6c 79 0a 23  TABLE are only.#
15c80 20 61 63 74 69 76 61 74 65 64 20 77 68 65 6e 20   activated when 
15c90 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65  foreign keys are
15ca0 20 65 6e 61 62 6c 65 64 2e 20 53 70 65 63 69 61   enabled. Specia
15cb0 6c 20 62 65 68 61 76 69 6f 72 73 20 61 72 65 3a  l behaviors are:
15cc0 0a 23 0a 23 20 20 20 31 2e 20 41 44 44 20 43 4f  .#.#   1. ADD CO
15cd0 4c 55 4d 4e 20 6e 6f 74 20 61 6c 6c 6f 77 69 6e  LUMN not allowin
15ce0 67 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  g a REFERENCES c
15cf0 6c 61 75 73 65 20 77 69 74 68 20 61 20 6e 6f 6e  lause with a non
15d00 2d 4e 55 4c 4c 20 0a 23 20 20 20 20 20 20 64 65  -NULL .#      de
15d10 66 61 75 6c 74 20 76 61 6c 75 65 2e 0a 23 20 20  fault value..#  
15d20 20 32 2e 20 4d 6f 64 69 66 79 69 6e 67 20 66 6f   2. Modifying fo
15d30 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
15d40 74 69 6f 6e 73 20 77 68 65 6e 20 61 20 70 61 72  tions when a par
15d50 65 6e 74 20 74 61 62 6c 65 20 69 73 20 52 45 4e  ent table is REN
15d60 41 4d 45 64 2e 0a 23 20 20 20 33 2e 20 52 75 6e  AMEd..#   3. Run
15d70 6e 69 6e 67 20 61 6e 20 69 6d 70 6c 69 63 69 74  ning an implicit
15d80 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6d   DELETE FROM com
15d90 6d 61 6e 64 20 61 73 20 70 61 72 74 20 6f 66 20  mand as part of 
15da0 44 52 4f 50 20 54 41 42 4c 45 2e 0a 23 0a 23 20  DROP TABLE..#.# 
15db0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
15dc0 34 31 34 32 2d 34 31 33 34 36 20 54 68 65 20 70  4142-41346 The p
15dd0 72 6f 70 65 72 74 69 65 73 20 6f 66 20 74 68 65  roperties of the
15de0 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e 64 20   DROP TABLE and 
15df0 41 4c 54 45 52 0a 23 20 54 41 42 4c 45 20 63 6f  ALTER.# TABLE co
15e00 6d 6d 61 6e 64 73 20 64 65 73 63 72 69 62 65 64  mmands described
15e10 20 61 62 6f 76 65 20 6f 6e 6c 79 20 61 70 70 6c   above only appl
15e20 79 20 69 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  y if foreign key
15e30 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23  s are enabled..#
15e40 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15e50 36 31 2e 31 2e 31 20 7b 0a 20 20 64 72 6f 70 5f  61.1.1 {.  drop_
15e60 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
15e70 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41  csql { CREATE TA
15e80 42 4c 45 20 74 31 28 61 2c 20 62 29 20 7d 0a 20  BLE t1(a, b) }. 
15e90 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
15ea0 52 20 54 41 42 4c 45 20 74 31 20 41 44 44 20 43  R TABLE t1 ADD C
15eb0 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20  OLUMN c DEFAULT 
15ec0 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45 53  'xxx' REFERENCES
15ed0 20 74 32 20 7d 0a 7d 20 7b 31 20 7b 43 61 6e 6e   t2 }.} {1 {Cann
15ee0 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45 4e  ot add a REFEREN
15ef0 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  CES column with 
15f00 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
15f10 20 76 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73 74   value}}.do_test
15f20 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 32 20 7b   e_fkey-61.1.2 {
15f30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
15f40 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
15f50 20 3d 20 4f 46 46 20 7d 0a 20 20 65 78 65 63 73   = OFF }.  execs
15f60 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
15f70 20 74 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63   t1 ADD COLUMN c
15f80 20 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52   DEFAULT 'xxx' R
15f90 45 46 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 20  EFERENCES t2 }. 
15fa0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
15fb0 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
15fc0 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
15fd0 61 6d 65 20 3d 20 27 74 31 27 20 7d 0a 7d 20 7b  ame = 't1' }.} {
15fe0 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
15ff0 28 61 2c 20 62 2c 20 63 20 44 45 46 41 55 4c 54  (a, b, c DEFAULT
16000 20 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45   'xxx' REFERENCE
16010 53 20 74 32 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  S t2)}}.do_test 
16020 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 33 20 7b 0a  e_fkey-61.1.3 {.
16030 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
16040 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
16050 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  = ON }.} {}..do_
16060 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 32  test e_fkey-61.2
16070 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
16080 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
16090 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
160a0 42 4c 45 20 70 28 61 20 55 4e 49 51 55 45 29 3b  BLE p(a UNIQUE);
160b0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
160c0 45 20 63 28 62 20 52 45 46 45 52 45 4e 43 45 53  E c(b REFERENCES
160d0 20 70 28 61 29 29 3b 0a 20 20 20 20 42 45 47 49   p(a));.    BEGI
160e0 4e 3b 0a 20 20 20 20 20 20 41 4c 54 45 52 20 54  N;.      ALTER T
160f0 41 42 4c 45 20 70 20 52 45 4e 41 4d 45 20 54 4f  ABLE p RENAME TO
16100 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 53   parent;.      S
16110 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
16120 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
16130 52 45 20 6e 61 6d 65 20 3d 20 27 63 27 3b 0a 20  RE name = 'c';. 
16140 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
16150 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c  .} {{CREATE TABL
16160 45 20 63 28 62 20 52 45 46 45 52 45 4e 43 45 53  E c(b REFERENCES
16170 20 22 70 61 72 65 6e 74 22 28 61 29 29 7d 7d 0a   "parent"(a))}}.
16180 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
16190 31 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1.2.2 {.  execsq
161a0 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66  l {.    PRAGMA f
161b0 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
161c0 46 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  F;.    ALTER TAB
161d0 4c 45 20 70 20 52 45 4e 41 4d 45 20 54 4f 20 70  LE p RENAME TO p
161e0 61 72 65 6e 74 3b 0a 20 20 20 20 53 45 4c 45 43  arent;.    SELEC
161f0 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
16200 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
16210 61 6d 65 20 3d 20 27 63 27 3b 0a 20 20 7d 0a 7d  ame = 'c';.  }.}
16220 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20   {{CREATE TABLE 
16230 63 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(b REFERENCES p
16240 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  (a))}}.do_test e
16250 5f 66 6b 65 79 2d 36 31 2e 32 2e 33 20 7b 0a 20  _fkey-61.2.3 {. 
16260 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
16270 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
16280 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74   ON }.} {}..do_t
16290 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e  est e_fkey-61.3.
162a0 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  1 {.  drop_all_t
162b0 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
162c0 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
162d0 4c 45 20 70 28 61 20 55 4e 49 51 55 45 29 3b 0a  LE p(a UNIQUE);.
162e0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
162f0 20 63 28 62 20 52 45 46 45 52 45 4e 43 45 53 20   c(b REFERENCES 
16300 70 28 61 29 20 4f 4e 20 44 45 4c 45 54 45 20 53  p(a) ON DELETE S
16310 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  ET NULL);.    IN
16320 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
16330 45 53 28 27 78 27 29 3b 0a 20 20 20 20 49 4e 53  ES('x');.    INS
16340 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45  ERT INTO c VALUE
16350 53 28 27 78 27 29 3b 0a 20 20 20 20 42 45 47 49  S('x');.    BEGI
16360 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  N;.      DROP TA
16370 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45 4c  BLE p;.      SEL
16380 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
16390 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
163a0 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  } {{}}.do_test e
163b0 5f 66 6b 65 79 2d 36 31 2e 33 2e 32 20 7b 0a 20  _fkey-61.3.2 {. 
163c0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
163d0 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
163e0 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 44 52  ys = OFF;.    DR
163f0 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20  OP TABLE p;.    
16400 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b  SELECT * FROM c;
16410 0a 20 20 7d 0a 7d 20 7b 78 7d 0a 64 6f 5f 74 65  .  }.} {x}.do_te
16420 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 33  st e_fkey-61.3.3
16430 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
16440 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
16450 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a  ys = ON }.} {}..
16460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164a0 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23 20  ###########.### 
164b0 53 45 43 54 49 4f 4e 20 36 3a 20 4c 69 6d 69 74  SECTION 6: Limit
164c0 73 20 61 6e 64 20 55 6e 73 75 70 70 6f 72 74 65  s and Unsupporte
164d0 64 20 46 65 61 74 75 72 65 73 0a 23 23 23 23 23  d Features.#####
164e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16520 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ######..#-------
16530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16570 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 4d  --.# Test that M
16580 41 54 43 48 20 63 6c 61 75 73 65 73 20 61 72 65  ATCH clauses are
16590 20 70 61 72 73 65 64 2c 20 62 75 74 20 53 51 4c   parsed, but SQL
165a0 69 74 65 20 74 72 65 61 74 73 20 65 76 65 72 79  ite treats every
165b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63   foreign key.# c
165c0 6f 6e 73 74 72 61 69 6e 74 20 61 73 20 69 66 20  onstraint as if 
165d0 69 74 20 77 65 72 65 20 22 4d 41 54 43 48 20 53  it were "MATCH S
165e0 49 4d 50 4c 45 22 2e 0a 23 0a 23 20 45 56 49 44  IMPLE"..#.# EVID
165f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 37 32 38  ENCE-OF: R-24728
16600 2d 31 33 32 33 30 20 53 51 4c 69 74 65 20 70 61  -13230 SQLite pa
16610 72 73 65 73 20 4d 41 54 43 48 20 63 6c 61 75 73  rses MATCH claus
16620 65 73 20 28 69 2e 65 2e 20 64 6f 65 73 20 6e 6f  es (i.e. does no
16630 74 0a 23 20 72 65 70 6f 72 74 20 61 20 73 79 6e  t.# report a syn
16640 74 61 78 20 65 72 72 6f 72 20 69 66 20 79 6f 75  tax error if you
16650 20 73 70 65 63 69 66 79 20 6f 6e 65 29 2c 20 62   specify one), b
16660 75 74 20 64 6f 65 73 20 6e 6f 74 20 65 6e 66 6f  ut does not enfo
16670 72 63 65 20 74 68 65 6d 2e 0a 23 0a 23 20 45 56  rce them..#.# EV
16680 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 34  IDENCE-OF: R-244
16690 35 30 2d 34 36 31 37 34 20 41 6c 6c 20 66 6f 72  50-46174 All for
166a0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
166b0 69 6e 74 73 20 69 6e 20 53 51 4c 69 74 65 20 61  ints in SQLite a
166c0 72 65 0a 23 20 68 61 6e 64 6c 65 64 20 61 73 20  re.# handled as 
166d0 69 66 20 4d 41 54 43 48 20 53 49 4d 50 4c 45 20  if MATCH SIMPLE 
166e0 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a  were specified..
166f0 23 0a 66 6f 72 65 61 63 68 20 7a 4d 61 74 63 68  #.foreach zMatch
16700 20 5b 6c 69 73 74 20 53 49 4d 50 4c 45 20 50 41   [list SIMPLE PA
16710 52 54 49 41 4c 20 46 55 4c 4c 20 53 69 6d 70 6c  RTIAL FULL Simpl
16720 65 20 70 61 72 54 49 41 4c 20 46 75 4c 4c 20 5d  e parTIAL FuLL ]
16730 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
16740 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 65  bles.  do_test e
16750 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74 63 68  _fkey-62.$zMatch
16760 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
16770 20 22 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   ".      CREATE 
16780 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 63 2c  TABLE p(a, b, c,
16790 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
167a0 63 29 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  c));.      CREAT
167b0 45 20 54 41 42 4c 45 20 63 28 64 2c 20 65 2c 20  E TABLE c(d, e, 
167c0 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 65  f, FOREIGN KEY(e
167d0 2c 20 66 29 20 52 45 46 45 52 45 4e 43 45 53 20  , f) REFERENCES 
167e0 70 20 4d 41 54 43 48 20 24 7a 4d 61 74 63 68 29  p MATCH $zMatch)
167f0 3b 0a 20 20 20 20 22 0a 20 20 7d 20 7b 7d 0a 20  ;.    ".  } {}. 
16800 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
16810 36 32 2e 24 7a 4d 61 74 63 68 2e 32 20 7b 0a 20  62.$zMatch.2 {. 
16820 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
16830 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45  ERT INTO p VALUE
16840 53 28 31 2c 20 32 2c 20 33 29 20 20 20 20 20 20  S(1, 2, 3)      
16850 20 20 20 7d 0a 0a 20 20 20 20 23 20 4d 41 54 43     }..    # MATC
16860 48 20 53 49 4d 50 4c 45 20 62 65 68 61 76 69 6f  H SIMPLE behavio
16870 72 3a 20 41 6c 6c 6f 77 20 61 6e 79 20 63 68 69  r: Allow any chi
16880 6c 64 20 6b 65 79 20 74 68 61 74 20 63 6f 6e 74  ld key that cont
16890 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
168a0 0a 20 20 20 20 23 20 4e 55 4c 4c 20 76 61 6c 75  .    # NULL valu
168b0 65 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  e to be inserted
168c0 2e 20 4e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  . Non-NULL value
168d0 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  s do not have to
168e0 20 6d 61 70 20 74 6f 20 61 6e 79 0a 20 20 20 20   map to any.    
168f0 23 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c  # parent key val
16900 75 65 73 2c 20 73 6f 20 6c 6f 6e 67 20 61 73 20  ues, so long as 
16910 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 69 65  at least one fie
16920 6c 64 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ld of the child 
16930 6b 65 79 20 69 73 0a 20 20 20 20 23 20 4e 55 4c  key is.    # NUL
16940 4c 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  L..    execsql {
16950 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56   INSERT INTO c V
16960 41 4c 55 45 53 28 27 77 27 2c 20 32 2c 20 33 29  ALUES('w', 2, 3)
16970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 65 78 65         }.    exe
16980 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
16990 54 4f 20 63 20 56 41 4c 55 45 53 28 27 78 27 2c  TO c VALUES('x',
169a0 20 27 78 27 2c 20 4e 55 4c 4c 29 20 20 7d 0a 20   'x', NULL)  }. 
169b0 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
169c0 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45  ERT INTO c VALUE
169d0 53 28 27 79 27 2c 20 4e 55 4c 4c 2c 20 27 78 27  S('y', NULL, 'x'
169e0 29 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  )  }.    execsql
169f0 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
16a00 20 56 41 4c 55 45 53 28 27 7a 27 2c 20 4e 55 4c   VALUES('z', NUL
16a10 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 0a 20 20 20 20  L, NULL) }..    
16a20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
16a30 20 46 4b 20 69 73 20 65 6e 66 6f 72 63 65 64 20   FK is enforced 
16a40 70 72 6f 70 65 72 6c 79 20 69 66 20 74 68 65 72  properly if ther
16a50 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 20 76 61  e are no NULL va
16a60 6c 75 65 73 20 0a 20 20 20 20 23 20 69 6e 20 74  lues .    # in t
16a70 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c  he child key col
16a80 75 6d 6e 73 2e 0a 20 20 20 20 63 61 74 63 68 73  umns..    catchs
16a90 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
16aa0 20 63 20 56 41 4c 55 45 53 28 27 61 27 2c 20 32   c VALUES('a', 2
16ab0 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 46  , 4) }.  } {1 {F
16ac0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
16ad0 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d  raint failed}}.}
16ae0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
16b30 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
16b40 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
16b50 20 74 68 65 20 53 45 54 20 43 4f 4e 53 54 52 41   the SET CONSTRA
16b60 49 4e 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 41  INT statement. A
16b70 6e 64 0a 23 20 74 68 61 74 20 69 74 20 69 73 20  nd.# that it is 
16b80 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
16b90 74 65 20 62 6f 74 68 20 69 6d 6d 65 64 69 61 74  te both immediat
16ba0 65 20 61 6e 64 20 64 65 66 65 72 72 65 64 20 63  e and deferred c
16bb0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20  onstraints..#.# 
16bc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
16bd0 31 35 39 39 2d 31 36 30 33 38 20 49 6e 20 53 51  1599-16038 In SQ
16be0 4c 69 74 65 2c 20 61 20 66 6f 72 65 69 67 6e 20  Lite, a foreign 
16bf0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
16c00 73 0a 23 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20  s.# permanently 
16c10 6d 61 72 6b 65 64 20 61 73 20 64 65 66 65 72 72  marked as deferr
16c20 65 64 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  ed or immediate 
16c30 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
16c40 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
16c50 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
16c60 66 6b 65 79 2d 36 32 2e 31 20 7b 0a 20 20 63 61  fkey-62.1 {.  ca
16c70 74 63 68 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e  tchsql { SET CON
16c80 53 54 52 41 49 4e 54 53 20 41 4c 4c 20 49 4d 4d  STRAINTS ALL IMM
16c90 45 44 49 41 54 45 20 7d 0a 7d 20 7b 31 20 7b 6e  EDIATE }.} {1 {n
16ca0 65 61 72 20 22 53 45 54 22 3a 20 73 79 6e 74 61  ear "SET": synta
16cb0 78 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73  x error}}.do_tes
16cc0 74 20 65 5f 66 6b 65 79 2d 36 32 2e 32 20 7b 0a  t e_fkey-62.2 {.
16cd0 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 54    catchsql { SET
16ce0 20 43 4f 4e 53 54 52 41 49 4e 54 53 20 41 4c 4c   CONSTRAINTS ALL
16cf0 20 44 45 46 45 52 52 45 44 20 7d 0a 7d 20 7b 31   DEFERRED }.} {1
16d00 20 7b 6e 65 61 72 20 22 53 45 54 22 3a 20 73 79   {near "SET": sy
16d10 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a 0a 64 6f  ntax error}}..do
16d20 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16d30 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
16d40 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16d50 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59   p(a, b, PRIMARY
16d60 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
16d70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 64   CREATE TABLE cd
16d80 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f  (c, d, .      FO
16d90 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
16da0 52 45 46 45 52 45 4e 43 45 53 20 70 20 44 45 46  REFERENCES p DEF
16db0 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
16dc0 59 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20  Y DEFERRED);.   
16dd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 69   CREATE TABLE ci
16de0 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f  (c, d, .      FO
16df0 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
16e00 52 45 46 45 52 45 4e 43 45 53 20 70 20 44 45 46  REFERENCES p DEF
16e10 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
16e20 59 20 49 4d 4d 45 44 49 41 54 45 29 3b 0a 20 20  Y IMMEDIATE);.  
16e30 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b    BEGIN;.  }.} {
16e40 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
16e50 2d 36 32 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -62.4 {.  catchs
16e60 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
16e70 20 63 69 20 56 41 4c 55 45 53 28 27 78 27 2c 20   ci VALUES('x', 
16e80 27 79 27 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  'y') }.} {1 {FOR
16e90 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
16ea0 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
16eb0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 35  test e_fkey-62.5
16ec0 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
16ed0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 64 20 56  INSERT INTO cd V
16ee0 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 20  ALUES('x', 'y') 
16ef0 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65  }.} {0 {}}.do_te
16f00 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 36 20 7b  st e_fkey-62.6 {
16f10 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 43 4f  .  catchsql { CO
16f20 4d 4d 49 54 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  MMIT }.} {1 {FOR
16f30 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
16f40 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
16f50 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 37  test e_fkey-62.7
16f60 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
16f70 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
16f80 63 64 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  cd;.    COMMIT;.
16f90 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fe0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
16ff0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 63   the maximum rec
17000 75 72 73 69 6f 6e 20 64 65 70 74 68 20 6f 66 20  ursion depth of 
17010 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69  foreign key acti
17020 6f 6e 20 70 72 6f 67 72 61 6d 73 20 69 73 0a 23  on programs is.#
17030 20 67 6f 76 65 72 6e 65 64 20 62 79 20 74 68 65   governed by the
17040 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
17050 47 45 52 5f 44 45 50 54 48 20 61 6e 64 20 53 51  GER_DEPTH and SQ
17060 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
17070 45 52 5f 44 45 50 54 48 0a 23 20 73 65 74 74 69  ER_DEPTH.# setti
17080 6e 67 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ngs..#.# EVIDENC
17090 45 2d 4f 46 3a 20 52 2d 34 32 32 36 34 2d 33 30  E-OF: R-42264-30
170a0 35 30 33 20 54 68 65 20 53 51 4c 49 54 45 5f 4d  503 The SQLITE_M
170b0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
170c0 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4c 49   and.# SQLITE_LI
170d0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
170e0 48 20 73 65 74 74 69 6e 67 73 20 64 65 74 65 72  H settings deter
170f0 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
17100 20 61 6c 6c 6f 77 61 62 6c 65 0a 23 20 64 65 70   allowable.# dep
17110 74 68 20 6f 66 20 74 72 69 67 67 65 72 20 70 72  th of trigger pr
17120 6f 67 72 61 6d 20 72 65 63 75 72 73 69 6f 6e 2e  ogram recursion.
17130 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
17140 73 20 6f 66 20 74 68 65 73 65 20 6c 69 6d 69 74  s of these limit
17150 73 2c 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79  s,.# foreign key
17160 20 61 63 74 69 6f 6e 73 20 61 72 65 20 63 6f 6e   actions are con
17170 73 69 64 65 72 65 64 20 74 72 69 67 67 65 72 20  sidered trigger 
17180 70 72 6f 67 72 61 6d 73 2e 0a 23 0a 70 72 6f 63  programs..#.proc
17190 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f   test_on_delete_
171a0 72 65 63 75 72 73 69 6f 6e 20 7b 6c 69 6d 69 74  recursion {limit
171b0 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  } {.  drop_all_t
171c0 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
171d0 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  { .    BEGIN;.  
171e0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
171f0 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  0(a PRIMARY KEY,
17200 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
17210 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27  INTO t0 VALUES('
17220 78 30 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a  x0', NULL);.  }.
17230 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20    for {set i 1} 
17240 7b 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b  {$i <= $limit} {
17250 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
17260 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 43 52  ecsql ".      CR
17270 45 41 54 45 20 54 41 42 4c 45 20 74 24 69 20 28  EATE TABLE t$i (
17280 0a 20 20 20 20 20 20 20 20 61 20 50 52 49 4d 41  .        a PRIMA
17290 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
172a0 4e 43 45 53 20 74 5b 65 78 70 72 20 24 69 2d 31  NCES t[expr $i-1
172b0 5d 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  ] ON DELETE CASC
172c0 41 44 45 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ADE.      );.   
172d0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
172e0 24 69 20 56 41 4c 55 45 53 28 27 78 24 69 27 2c  $i VALUES('x$i',
172f0 20 27 78 5b 65 78 70 72 20 24 69 2d 31 5d 27 29   'x[expr $i-1]')
17300 3b 0a 20 20 20 20 22 0a 20 20 7d 0a 20 20 65 78  ;.    ".  }.  ex
17310 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 63  ecsql COMMIT.  c
17320 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 44 45  atchsql ".    DE
17330 4c 45 54 45 20 46 52 4f 4d 20 74 30 3b 0a 20 20  LETE FROM t0;.  
17340 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
17350 29 20 46 52 4f 4d 20 74 24 6c 69 6d 69 74 3b 0a  ) FROM t$limit;.
17360 20 20 22 0a 7d 0a 70 72 6f 63 20 74 65 73 74 5f    ".}.proc test_
17370 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73  on_update_recurs
17380 69 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20  ion {limit} {.  
17390 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
173a0 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
173b0 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
173c0 54 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52  TE TABLE t0(a PR
173d0 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
173e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56  INSERT INTO t0 V
173f0 41 4c 55 45 53 28 27 78 78 78 27 29 3b 0a 20 20  ALUES('xxx');.  
17400 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  }.  for {set i 1
17410 7d 20 7b 24 69 20 3c 3d 20 24 6c 69 6d 69 74 7d  } {$i <= $limit}
17420 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
17430 73 65 74 20 6a 20 5b 65 78 70 72 20 24 69 2d 31  set j [expr $i-1
17440 5d 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  ]..    execsql "
17450 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
17460 42 4c 45 20 74 24 69 20 28 61 20 50 52 49 4d 41  BLE t$i (a PRIMA
17470 52 59 20 4b 45 59 20 52 45 46 45 52 45 4e 43 45  RY KEY REFERENCE
17480 53 20 74 24 6a 20 4f 4e 20 55 50 44 41 54 45 20  S t$j ON UPDATE 
17490 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 20 20  CASCADE);.      
174a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20  INSERT INTO t$i 
174b0 56 41 4c 55 45 53 28 27 78 78 78 27 29 3b 0a 20  VALUES('xxx');. 
174c0 20 20 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73     ".  }.  execs
174d0 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63  ql COMMIT.  catc
174e0 68 73 71 6c 20 22 0a 20 20 20 20 55 50 44 41 54  hsql ".    UPDAT
174f0 45 20 74 30 20 53 45 54 20 61 20 3d 20 27 79 79  E t0 SET a = 'yy
17500 79 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 4e  y';.    SELECT N
17510 4f 54 20 28 61 3d 27 79 79 79 27 29 20 46 52 4f  OT (a='yyy') FRO
17520 4d 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d  M t$limit;.  ".}
17530 0a 0a 23 20 49 66 20 74 68 65 20 63 75 72 72 65  ..# If the curre
17540 6e 74 20 62 75 69 6c 64 20 77 61 73 20 63 72 65  nt build was cre
17550 61 74 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67  ated using clang
17560 20 77 69 74 68 20 74 68 65 20 2d 66 73 61 6e 69   with the -fsani
17570 74 69 7a 65 3d 61 64 64 72 65 73 73 0a 23 20 73  tize=address.# s
17580 77 69 74 63 68 2c 20 74 68 65 6e 20 74 68 65 20  witch, then the 
17590 6c 69 62 72 61 72 79 20 75 73 65 73 20 63 6f 6e  library uses con
175a0 73 69 64 65 72 61 62 6c 79 20 6d 6f 72 65 20 73  siderably more s
175b0 74 61 63 6b 20 73 70 61 63 65 20 74 68 61 6e 20  tack space than 
175c0 75 73 75 61 6c 2e 0a 23 20 53 6f 20 6d 75 63 68  usual..# So much
175d0 20 6d 6f 72 65 2c 20 74 68 61 74 20 73 6f 6d 65   more, that some
175e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
175f0 67 20 74 65 73 74 73 20 63 61 75 73 65 20 73 74  g tests cause st
17600 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 0a 23 20  ack overflows.# 
17610 69 66 20 74 68 65 79 20 61 72 65 20 72 75 6e 20  if they are run 
17620 75 6e 64 65 72 20 74 68 69 73 20 63 6f 6e 66 69  under this confi
17630 67 75 72 61 74 69 6f 6e 2e 0a 23 0a 69 66 20 7b  guration..#.if {
17640 5b 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f  [clang_sanitize_
17650 61 64 64 72 65 73 73 5d 3d 3d 30 7d 20 7b 0a 20  address]==0} {. 
17660 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
17670 36 33 2e 31 2e 31 20 7b 0a 20 20 20 20 74 65 73  63.1.1 {.    tes
17680 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75  t_on_delete_recu
17690 72 73 69 6f 6e 20 24 53 51 4c 49 54 45 5f 4d 41  rsion $SQLITE_MA
176a0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 0a  X_TRIGGER_DEPTH.
176b0 20 20 7d 20 7b 30 20 30 7d 0a 20 20 64 6f 5f 74    } {0 0}.  do_t
176c0 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e  est e_fkey-63.1.
176d0 32 20 7b 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f  2 {.    test_on_
176e0 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
176f0 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d   [expr $SQLITE_M
17700 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
17710 2b 31 5d 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20  +1].  } {1 {too 
17720 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
17730 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
17740 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  }}.  do_test e_f
17750 6b 65 79 2d 36 33 2e 31 2e 33 20 7b 0a 20 20 20  key-63.1.3 {.   
17760 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64   sqlite3_limit d
17770 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  b SQLITE_LIMIT_T
17780 52 49 47 47 45 52 5f 44 45 50 54 48 20 35 0a 20  RIGGER_DEPTH 5. 
17790 20 20 20 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c       test_on_del
177a0 65 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 35 0a  ete_recursion 5.
177b0 20 20 7d 20 7b 30 20 30 7d 0a 20 20 64 6f 5f 74    } {0 0}.  do_t
177c0 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e  est e_fkey-63.1.
177d0 34 20 7b 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f  4 {.    test_on_
177e0 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
177f0 20 36 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d   6.  } {1 {too m
17800 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
17810 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
17820 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
17830 65 79 2d 36 33 2e 31 2e 35 20 7b 0a 20 20 20 20  ey-63.1.5 {.    
17840 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62  sqlite3_limit db
17850 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
17860 49 47 47 45 52 5f 44 45 50 54 48 20 31 30 30 30  IGGER_DEPTH 1000
17870 30 30 30 0a 20 20 7d 20 7b 35 7d 0a 20 20 64 6f  000.  } {5}.  do
17880 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e  _test e_fkey-63.
17890 32 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 5f 6f  2.1 {.    test_o
178a0 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69  n_update_recursi
178b0 6f 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54  on $SQLITE_MAX_T
178c0 52 49 47 47 45 52 5f 44 45 50 54 48 0a 20 20 7d  RIGGER_DEPTH.  }
178d0 20 7b 30 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74   {0 0}.  do_test
178e0 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 32 20 7b   e_fkey-63.2.2 {
178f0 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64  .    test_on_upd
17900 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 5b 65  ate_recursion [e
17910 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
17920 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 5d  TRIGGER_DEPTH+1]
17930 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e  .  } {1 {too man
17940 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67  y levels of trig
17950 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a  ger recursion}}.
17960 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
17970 2d 36 33 2e 32 2e 33 20 7b 0a 20 20 20 20 73 71  -63.2.3 {.    sq
17980 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53  lite3_limit db S
17990 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
179a0 47 45 52 5f 44 45 50 54 48 20 35 0a 20 20 20 20  GER_DEPTH 5.    
179b0 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65    test_on_update
179c0 5f 72 65 63 75 72 73 69 6f 6e 20 35 0a 20 20 7d  _recursion 5.  }
179d0 20 7b 30 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74   {0 0}.  do_test
179e0 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 34 20 7b   e_fkey-63.2.4 {
179f0 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64  .    test_on_upd
17a00 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 36 0a  ate_recursion 6.
17a10 20 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79    } {1 {too many
17a20 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67   levels of trigg
17a30 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 20  er recursion}}. 
17a40 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
17a50 36 33 2e 32 2e 35 20 7b 0a 20 20 20 20 73 71 6c  63.2.5 {.    sql
17a60 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51  ite3_limit db SQ
17a70 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
17a80 45 52 5f 44 45 50 54 48 20 31 30 30 30 30 30 30  ER_DEPTH 1000000
17a90 0a 20 20 7d 20 7b 35 7d 0a 7d 0a 0a 23 2d 2d 2d  .  } {5}.}..#---
17aa0 2d 2d 2d 2d 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 0a 23 20 54 68 65 20 73 65 74  ------.# The set
17af0 74 69 6e 67 20 6f 66 20 74 68 65 20 72 65 63 75  ting of the recu
17b00 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20 70  rsive_triggers p
17b10 72 61 67 6d 61 20 64 6f 65 73 20 6e 6f 74 20 61  ragma does not a
17b20 66 66 65 63 74 20 66 6f 72 65 69 67 6e 0a 23 20  ffect foreign.# 
17b30 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23  key actions..#.#
17b40 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17b50 34 34 33 35 35 2d 30 30 32 37 30 20 54 68 65 20  44355-00270 The 
17b60 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
17b70 5f 74 72 69 67 67 65 72 73 20 73 65 74 74 69 6e  _triggers settin
17b80 67 20 64 6f 65 73 0a 23 20 6e 6f 74 20 61 66 66  g does.# not aff
17b90 65 63 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ect the operatio
17ba0 6e 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  n of foreign key
17bb0 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65   actions..#.fore
17bc0 61 63 68 20 72 65 63 75 72 73 69 76 65 5f 74 72  ach recursive_tr
17bd0 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 20 5b  iggers_setting [
17be0 6c 69 73 74 20 30 20 31 20 4f 4e 20 4f 46 46 5d  list 0 1 ON OFF]
17bf0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
17c00 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 22  bles.  execsql "
17c10 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
17c20 5f 74 72 69 67 67 65 72 73 20 3d 20 24 72 65 63  _triggers = $rec
17c30 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f  ursive_triggers_
17c40 73 65 74 74 69 6e 67 22 0a 0a 20 20 64 6f 5f 74  setting"..  do_t
17c50 65 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72  est e_fkey-64.$r
17c60 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
17c70 73 5f 73 65 74 74 69 6e 67 2e 31 20 7b 0a 20 20  s_setting.1 {.  
17c80 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
17c90 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
17ca0 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
17cb0 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
17cc0 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
17cd0 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  DE);.      INSER
17ce0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
17cf0 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  (1, NULL);.     
17d00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
17d10 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20  VALUES(2, 1);.  
17d20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17d30 74 31 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b  t1 VALUES(3, 2);
17d40 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17d50 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
17d60 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  3);.      INSERT
17d70 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17d80 35 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c  5, 4);.      SEL
17d90 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17da0 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
17db0 7b 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {5}.  do_test e_
17dc0 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17dd0 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17de0 69 6e 67 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  ing.2 {.    exec
17df0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
17e00 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48  nt(*) FROM t1 WH
17e10 45 52 45 20 61 20 3d 20 31 20 7d 0a 20 20 7d 20  ERE a = 1 }.  } 
17e20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {1}.  do_test e_
17e30 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17e40 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17e50 69 6e 67 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  ing.3 {.    exec
17e60 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45 4c  sql { .      DEL
17e70 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
17e80 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53  E a = 1;.      S
17e90 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
17ea0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
17eb0 7d 20 7b 30 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  } {0}.}..finish_
17ec0 74 65 73 74 0a                                   test.