/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 057eed81a41a2b21b1790032f4e8aaba0b2b0e17:


0000: 23 20 32 30 30 39 20 4f 63 74 6f 62 65 72 20 37  # 2009 October 7
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 74 65 73 74 73 20 74 6f 20 76 65 72 69 66 79 20  tests to verify 
0190: 74 68 65 20 22 74 65 73 74 61 62 6c 65 20 73 74  the "testable st
01a0: 61 74 65 6d 65 6e 74 73 22 20 69 6e 20 74 68 65  atements" in the
01b0: 0a 23 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 69  .# foreignkeys.i
01c0: 6e 20 64 6f 63 75 6d 65 6e 74 2e 0a 23 0a 23 20  n document..#.# 
01d0: 54 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  The tests in thi
01e0: 73 20 66 69 6c 65 20 61 72 65 20 61 72 72 61 6e  s file are arran
01f0: 67 65 64 20 74 6f 20 6d 69 72 72 6f 72 20 74 68  ged to mirror th
0200: 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 0a  e structure of .
0210: 23 20 66 6f 72 65 69 67 6e 6b 65 79 2e 69 6e 2c  # foreignkey.in,
0220: 20 77 69 74 68 20 6f 6e 65 20 65 78 63 65 70 74   with one except
0230: 69 6f 6e 3a 20 54 68 65 20 73 74 61 74 65 6d 65  ion: The stateme
0240: 6e 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32  nts in section 2
0250: 2c 20 77 68 69 63 68 20 0a 23 20 64 65 61 6c 73  , which .# deals
0260: 20 77 69 74 68 20 65 6e 61 62 6c 69 6e 67 2f 64   with enabling/d
0270: 69 73 61 62 6c 69 6e 67 20 66 6f 72 65 69 67 6e  isabling foreign
0280: 20 6b 65 79 20 73 75 70 70 6f 72 74 2c 20 69 73   key support, is
0290: 20 74 65 73 74 65 64 20 66 69 72 73 74 2c 0a 23   tested first,.#
02a0: 20 62 65 66 6f 72 65 20 73 65 63 74 69 6f 6e 20   before section 
02b0: 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
02c0: 73 65 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  se some statemen
02d0: 74 73 20 69 6e 20 73 65 63 74 69 6f 6e 20 32 20  ts in section 2 
02e0: 64 65 61 6c 0a 23 20 77 69 74 68 20 62 75 69 6c  deal.# with buil
02f0: 64 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 69  ds that do not i
0300: 6e 63 6c 75 64 65 20 63 6f 6d 70 6c 65 74 65 20  nclude complete 
0310: 66 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  foreign key supp
0320: 6f 72 74 20 28 62 65 63 61 75 73 65 0a 23 20 65  ort (because.# e
0330: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4d 49  ither SQLITE_OMI
0340: 54 5f 54 52 49 47 47 45 52 20 6f 72 20 53 51 4c  T_TRIGGER or SQL
0350: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
0360: 5f 4b 45 59 20 77 61 73 20 64 65 66 69 6e 65 64  _KEY was defined
0370: 0a 23 20 61 74 20 62 75 69 6c 64 20 74 69 6d 65  .# at build time
0380: 29 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  )..#..set testdi
0390: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
03a0: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
03b0: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
03c0: 63 6c 0a 0a 70 72 6f 63 20 65 71 70 20 7b 73 71  cl..proc eqp {sq
03d0: 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 20 75 70 6c  l {db db}} { upl
03e0: 65 76 65 6c 20 65 78 65 63 73 71 6c 20 5b 6c 69  evel execsql [li
03f0: 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  st "EXPLAIN QUER
0400: 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 20 24 64  Y PLAN $sql"] $d
0410: 62 20 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  b }..###########
0420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0460: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 32 3a 20  .### SECTION 2: 
0470: 45 6e 61 62 6c 69 6e 67 20 46 6f 72 65 69 67 6e  Enabling Foreign
0480: 20 4b 65 79 20 53 75 70 70 6f 72 74 0a 23 23 23   Key Support.###
0490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
04d0: 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
0530: 4f 46 3a 20 52 2d 33 33 37 31 30 2d 35 36 33 34  OF: R-33710-5634
0540: 34 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 75 73  4 In order to us
0550: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
0560: 6e 73 74 72 61 69 6e 74 73 20 69 6e 0a 23 20 53  nstraints in.# S
0570: 51 4c 69 74 65 2c 20 74 68 65 20 6c 69 62 72 61  QLite, the libra
0580: 72 79 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 69  ry must be compi
0590: 6c 65 64 20 77 69 74 68 20 6e 65 69 74 68 65 72  led with neither
05a0: 0a 23 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  .# SQLITE_OMIT_F
05b0: 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53 51  OREIGN_KEY or SQ
05c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
05d0: 52 20 64 65 66 69 6e 65 64 2e 0a 23 0a 69 66 63  R defined..#.ifc
05e0: 61 70 61 62 6c 65 20 74 72 69 67 67 65 72 26 26  apable trigger&&
05f0: 66 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64  foreignkey {.  d
0600: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 20  o_test e_fkey-1 
0610: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
0620: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
0630: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
0640: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0650: 4c 45 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b  LE p(i PRIMARY K
0660: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
0670: 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45  E TABLE c(j REFE
0680: 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41  RENCES p ON UPDA
0690: 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
06a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
06b0: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
06c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
06d0: 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65  NTO c VALUES('he
06e0: 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44  llo');.      UPD
06f0: 41 54 45 20 70 20 53 45 54 20 69 20 3d 20 27 77  ATE p SET i = 'w
0700: 6f 72 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c  orld';.      SEL
0710: 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20  ECT * FROM c;.  
0720: 20 20 7d 0a 20 20 7d 20 7b 77 6f 72 6c 64 7d 0a    }.  } {world}.
0730: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0780: 54 65 73 74 20 74 68 65 20 65 66 66 65 63 74 73  Test the effects
0790: 20 6f 66 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49   of defining OMI
07a0: 54 5f 54 52 49 47 47 45 52 20 62 75 74 20 6e 6f  T_TRIGGER but no
07b0: 74 20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  t OMIT_FOREIGN_K
07c0: 45 59 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  EY..#.# EVIDENCE
07d0: 2d 4f 46 3a 20 52 2d 34 34 36 39 37 2d 36 31 35  -OF: R-44697-615
07e0: 34 33 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  43 If SQLITE_OMI
07f0: 54 5f 54 52 49 47 47 45 52 20 69 73 20 64 65 66  T_TRIGGER is def
0800: 69 6e 65 64 20 62 75 74 0a 23 20 53 51 4c 49 54  ined but.# SQLIT
0810: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
0820: 45 59 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  EY is not, then 
0830: 53 51 4c 69 74 65 20 62 65 68 61 76 65 73 20 61  SQLite behaves a
0840: 73 20 69 74 20 64 69 64 20 70 72 69 6f 72 20 74  s it did prior t
0850: 6f 0a 23 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e  o.# version 3.6.
0860: 31 39 20 2d 20 66 6f 72 65 69 67 6e 20 6b 65 79  19 - foreign key
0870: 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 61 72 65   definitions are
0880: 20 70 61 72 73 65 64 20 61 6e 64 20 6d 61 79 20   parsed and may 
0890: 62 65 20 71 75 65 72 69 65 64 0a 23 20 75 73 69  be queried.# usi
08a0: 6e 67 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  ng PRAGMA foreig
08b0: 6e 5f 6b 65 79 5f 6c 69 73 74 2c 20 62 75 74 20  n_key_list, but 
08c0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
08d0: 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74 0a  traints are not.
08e0: 23 20 65 6e 66 6f 72 63 65 64 2e 0a 23 0a 23 20  # enforced..#.# 
08f0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 65  Specifically, te
0900: 73 74 20 74 68 61 74 20 22 50 52 41 47 4d 41 20  st that "PRAGMA 
0910: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 69 73  foreign_keys" is
0920: 20 61 20 6e 6f 2d 6f 70 20 69 6e 20 74 68 69 73   a no-op in this
0930: 20 63 61 73 65 2e 0a 23 20 57 68 65 6e 20 75 73   case..# When us
0940: 69 6e 67 20 74 68 65 20 70 72 61 67 6d 61 20 74  ing the pragma t
0950: 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
0960: 65 6e 74 20 73 65 74 74 69 6e 67 2c 20 30 20 72  ent setting, 0 r
0970: 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  ows are returned
0980: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
0990: 46 3a 20 52 2d 32 32 35 36 37 2d 34 34 30 33 39  F: R-22567-44039
09a0: 20 54 68 65 20 50 52 41 47 4d 41 20 66 6f 72 65   The PRAGMA fore
09b0: 69 67 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64  ign_keys command
09c0: 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 23 20 69 6e   is a no-op.# in
09d0: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
09e0: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
09f0: 45 2d 4f 46 3a 20 52 2d 34 31 37 38 34 2d 31 33  E-OF: R-41784-13
0a00: 33 33 39 20 54 69 70 3a 20 49 66 20 74 68 65 20  339 Tip: If the 
0a10: 63 6f 6d 6d 61 6e 64 20 22 50 52 41 47 4d 41 20  command "PRAGMA 
0a20: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 0a 23 20  foreign_keys".# 
0a30: 72 65 74 75 72 6e 73 20 6e 6f 20 64 61 74 61 20  returns no data 
0a40: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e  instead of a sin
0a50: 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
0a60: 6e 67 20 22 30 22 20 6f 72 20 22 31 22 2c 20 74  ng "0" or "1", t
0a70: 68 65 6e 0a 23 20 74 68 65 20 76 65 72 73 69 6f  hen.# the versio
0a80: 6e 20 6f 66 20 53 51 4c 69 74 65 20 79 6f 75 20  n of SQLite you 
0a90: 61 72 65 20 75 73 69 6e 67 20 64 6f 65 73 20 6e  are using does n
0aa0: 6f 74 20 73 75 70 70 6f 72 74 20 66 6f 72 65 69  ot support forei
0ab0: 67 6e 20 6b 65 79 73 0a 23 20 28 65 69 74 68 65  gn keys.# (eithe
0ac0: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
0ad0: 6f 6c 64 65 72 20 74 68 61 6e 20 33 2e 36 2e 31  older than 3.6.1
0ae0: 39 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  9 or because it 
0af0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 23 20 77  was compiled.# w
0b00: 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
0b10: 46 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72 20 53  FOREIGN_KEY or S
0b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
0b30: 45 52 20 64 65 66 69 6e 65 64 29 2e 0a 23 0a 72  ER defined)..#.r
0b40: 65 73 65 74 5f 64 62 0a 69 66 63 61 70 61 62 6c  eset_db.ifcapabl
0b50: 65 20 21 74 72 69 67 67 65 72 26 26 66 6f 72 65  e !trigger&&fore
0b60: 69 67 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65  ignkey {.  do_te
0b70: 73 74 20 65 5f 66 6b 65 79 2d 32 2e 31 20 7b 0a  st e_fkey-2.1 {.
0b80: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0b90: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
0ba0: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
0bb0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0bc0: 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59   p(i PRIMARY KEY
0bd0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
0be0: 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45  TABLE c(j REFERE
0bf0: 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41 54 45  NCES p ON UPDATE
0c00: 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 20   CASCADE);.     
0c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
0c20: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a  ALUES('hello');.
0c30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0c40: 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  O c VALUES('hell
0c50: 6f 27 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54  o');.      UPDAT
0c60: 45 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72  E p SET i = 'wor
0c70: 6c 64 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ld';.      SELEC
0c80: 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20  T * FROM c;.    
0c90: 7d 0a 20 20 7d 20 7b 68 65 6c 6c 6f 7d 0a 20 20  }.  } {hello}.  
0ca0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
0cb0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
0cc0: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
0cd0: 6e 5f 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a  n_key_list(c) }.
0ce0: 20 20 7d 20 7b 30 20 30 20 70 20 6a 20 7b 7d 20    } {0 0 p j {} 
0cf0: 43 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54 49  CASCADE {NO ACTI
0d00: 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 64 6f 5f 74  ON} NONE}.  do_t
0d10: 65 73 74 20 65 5f 66 6b 65 79 2d 32 2e 33 20 7b  est e_fkey-2.3 {
0d20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
0d30: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0d40: 79 73 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 0a  ys }.  } {}.}...
0d50: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
0da0: 74 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  t the effects of
0db0: 20 64 65 66 69 6e 69 6e 67 20 4f 4d 49 54 5f 46   defining OMIT_F
0dc0: 4f 52 45 49 47 4e 5f 4b 45 59 2e 0a 23 0a 23 20  OREIGN_KEY..#.# 
0dd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
0de0: 38 34 32 38 2d 33 36 36 36 30 20 49 66 20 4f 4d  8428-36660 If OM
0df0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 69  IT_FOREIGN_KEY i
0e00: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a  s defined, then.
0e10: 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  # foreign key de
0e20: 66 69 6e 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74  finitions cannot
0e30: 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64 20   even be parsed 
0e40: 28 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73  (attempting to s
0e50: 70 65 63 69 66 79 20 61 0a 23 20 66 6f 72 65 69  pecify a.# forei
0e60: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
0e70: 6e 20 69 73 20 61 20 73 79 6e 74 61 78 20 65 72  n is a syntax er
0e80: 72 6f 72 29 2e 0a 23 0a 23 20 53 70 65 63 69 66  ror)..#.# Specif
0e90: 69 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61  ically, test tha
0ea0: 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  t foreign key co
0eb0: 6e 73 74 72 61 69 6e 74 73 20 63 61 6e 6e 6f 74  nstraints cannot
0ec0: 20 65 76 65 6e 20 62 65 20 70 61 72 73 65 64 20   even be parsed 
0ed0: 0a 23 20 69 6e 20 73 75 63 68 20 61 20 62 75 69  .# in such a bui
0ee0: 6c 64 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 69  ld..#.reset_db.i
0ef0: 66 63 61 70 61 62 6c 65 20 21 66 6f 72 65 69 67  fcapable !foreig
0f00: 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74  nkey {.  do_test
0f10: 20 65 5f 66 6b 65 79 2d 33 2e 31 20 7b 0a 20 20   e_fkey-3.1 {.  
0f20: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
0f30: 54 45 20 54 41 42 4c 45 20 70 28 69 20 50 52 49  TE TABLE p(i PRI
0f40: 4d 41 52 59 20 4b 45 59 29 20 7d 0a 20 20 20 20  MARY KEY) }.    
0f50: 63 61 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54  catchsql { CREAT
0f60: 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45 46 45  E TABLE c(j REFE
0f70: 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50 44 41  RENCES p ON UPDA
0f80: 54 45 20 43 41 53 43 41 44 45 29 20 7d 0a 20 20  TE CASCADE) }.  
0f90: 7d 20 7b 31 20 7b 6e 65 61 72 20 22 4f 4e 22 3a  } {1 {near "ON":
0fa0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a   syntax error}}.
0fb0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
0fc0: 2d 33 2e 32 20 7b 0a 20 20 20 20 23 20 54 68 69  -3.2 {.    # Thi
0fd0: 73 20 69 73 20 61 6c 6c 6f 77 65 64 2c 20 61 73  s is allowed, as
0fe0: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
0ff0: 22 52 45 46 45 52 45 4e 43 45 53 22 20 69 73 20  "REFERENCES" is 
1000: 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2e 0a 20  not a keyword.. 
1010: 20 20 20 23 20 54 68 65 20 64 65 63 6c 61 72 65     # The declare
1020: 64 20 64 61 74 61 74 79 70 65 20 6f 66 20 63 6f  d datatype of co
1030: 6c 75 6d 6e 20 6a 20 69 73 20 22 52 45 46 45 52  lumn j is "REFER
1040: 45 4e 43 45 53 20 70 22 2e 0a 20 20 20 20 65 78  ENCES p"..    ex
1050: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
1060: 41 42 4c 45 20 63 28 6a 20 52 45 46 45 52 45 4e  ABLE c(j REFEREN
1070: 43 45 53 20 70 29 20 7d 0a 20 20 7d 20 7b 7d 0a  CES p) }.  } {}.
1080: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
1090: 2d 33 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  -3.3 {.    execs
10a0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c  ql { PRAGMA tabl
10b0: 65 5f 69 6e 66 6f 28 63 29 20 7d 0a 20 20 7d 20  e_info(c) }.  } 
10c0: 7b 30 20 6a 20 7b 52 45 46 45 52 45 4e 43 45 53  {0 j {REFERENCES
10d0: 20 70 7d 20 30 20 7b 7d 20 30 7d 0a 20 20 64 6f   p} 0 {} 0}.  do
10e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e 34  _test e_fkey-3.4
10f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1100: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1110: 6b 65 79 5f 6c 69 73 74 28 63 29 20 7d 0a 20 20  key_list(c) }.  
1120: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65  } {}.  do_test e
1130: 5f 66 6b 65 79 2d 33 2e 35 20 7b 0a 20 20 20 20  _fkey-3.5 {.    
1140: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1150: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a   foreign_keys }.
1160: 20 20 7d 20 7b 7d 0a 7d 0a 0a 69 66 63 61 70 61    } {}.}..ifcapa
1170: 62 6c 65 20 21 66 6f 72 65 69 67 6e 6b 65 79 7c  ble !foreignkey|
1180: 7c 21 74 72 69 67 67 65 72 20 7b 20 66 69 6e 69  |!trigger { fini
1190: 73 68 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e  sh_test ; return
11a0: 20 7d 0a 72 65 73 65 74 5f 64 62 0a 0a 0a 23 2d   }.reset_db...#-
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
1200: 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 38 30 2d  NCE-OF: R-07280-
1210: 36 30 35 31 30 20 41 73 73 75 6d 69 6e 67 20 74  60510 Assuming t
1220: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
1230: 6d 70 69 6c 65 64 20 77 69 74 68 0a 23 20 66 6f  mpiled with.# fo
1240: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1250: 61 69 6e 74 73 20 65 6e 61 62 6c 65 64 2c 20 69  aints enabled, i
1260: 74 20 6d 75 73 74 20 73 74 69 6c 6c 20 62 65 20  t must still be 
1270: 65 6e 61 62 6c 65 64 20 62 79 20 74 68 65 0a 23  enabled by the.#
1280: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 74 20   application at 
1290: 72 75 6e 74 69 6d 65 2c 20 75 73 69 6e 67 20 74  runtime, using t
12a0: 68 65 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  he PRAGMA foreig
12b0: 6e 5f 6b 65 79 73 20 63 6f 6d 6d 61 6e 64 2e 0a  n_keys command..
12c0: 23 0a 23 20 54 68 69 73 20 61 6c 73 6f 20 74 65  #.# This also te
12d0: 73 74 73 20 74 68 61 74 20 66 6f 72 65 69 67 6e  sts that foreign
12e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
12f0: 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62 79   are disabled by
1300: 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56   default..#.# EV
1310: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 35  IDENCE-OF: R-595
1320: 37 38 2d 30 34 39 39 30 20 46 6f 72 65 69 67 6e  78-04990 Foreign
1330: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
1340: 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 62 79   are disabled by
1350: 0a 23 20 64 65 66 61 75 6c 74 20 28 66 6f 72 20  .# default (for 
1360: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1370: 69 62 69 6c 69 74 79 29 2c 20 73 6f 20 6d 75 73  ibility), so mus
1380: 74 20 62 65 20 65 6e 61 62 6c 65 64 20 73 65 70  t be enabled sep
1390: 61 72 61 74 65 6c 79 0a 23 20 66 6f 72 20 65 61  arately.# for ea
13a0: 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ch database conn
13b0: 65 63 74 69 6f 6e 20 73 65 70 61 72 61 74 65 6c  ection separatel
13c0: 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  y..#.drop_all_ta
13d0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
13e0: 6b 65 79 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63  key-4.1 {.  exec
13f0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1400: 20 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d 41   TABLE p(i PRIMA
1410: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
1420: 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20 52 45  ATE TABLE c(j RE
1430: 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 55 50  FERENCES p ON UP
1440: 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  DATE CASCADE);. 
1450: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
1460: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
1470: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1480: 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c  O c VALUES('hell
1490: 6f 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  o');.    UPDATE 
14a0: 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72 6c 64  p SET i = 'world
14b0: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
14c0: 46 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b  FROM c;.  } .} {
14d0: 68 65 6c 6c 6f 7d 0a 64 6f 5f 74 65 73 74 20 65  hello}.do_test e
14e0: 5f 66 6b 65 79 2d 34 2e 32 20 7b 0a 20 20 65 78  _fkey-4.2 {.  ex
14f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
1500: 54 45 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20 44  TE FROM c;.    D
1510: 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20 20  ELETE FROM p;.  
1520: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
1530: 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20  _keys = ON;.    
1540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
1550: 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20  LUES('hello');. 
1560: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
1570: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29   VALUES('hello')
1580: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 20 53  ;.    UPDATE p S
1590: 45 54 20 69 20 3d 20 27 77 6f 72 6c 64 27 3b 0a  ET i = 'world';.
15a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
15b0: 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b 77 6f 72  M c;.  } .} {wor
15c0: 6c 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ld}..#----------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1610: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
1620: 2d 31 35 32 37 38 2d 35 34 34 35 36 20 54 68 65  -15278-54456 The
1630: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e   application can
1640: 20 63 61 6e 20 61 6c 73 6f 20 75 73 65 20 61 20   can also use a 
1650: 50 52 41 47 4d 41 0a 23 20 66 6f 72 65 69 67 6e  PRAGMA.# foreign
1660: 5f 6b 65 79 73 20 73 74 61 74 65 6d 65 6e 74 20  _keys statement 
1670: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1680: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65  foreign keys are
1690: 20 63 75 72 72 65 6e 74 6c 79 0a 23 20 65 6e 61   currently.# ena
16a0: 62 6c 65 64 2e 0a 23 0a 23 20 54 68 69 73 20 61  bled..#.# This a
16b0: 6c 73 6f 20 74 65 73 74 73 20 74 68 65 20 65 78  lso tests the ex
16c0: 61 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 73 65  ample code in se
16d0: 63 74 69 6f 6e 20 32 20 6f 66 20 66 6f 72 65 69  ction 2 of forei
16e0: 67 6e 6b 65 79 73 2e 69 6e 2e 0a 23 0a 23 20 45  gnkeys.in..#.# E
16f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
1700: 32 35 35 2d 31 39 39 30 37 0a 23 20 0a 72 65 73  255-19907.# .res
1710: 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 65 5f  et_db.do_test e_
1720: 66 6b 65 79 2d 35 2e 31 20 7b 0a 20 20 65 78 65  fkey-5.1 {.  exe
1730: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
1740: 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 7d 20 7b  reign_keys }.} {
1750: 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  0}.do_test e_fke
1760: 79 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  y-5.2 {.  execsq
1770: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
1780: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
1790: 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f  N;.    PRAGMA fo
17a0: 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d 0a  reign_keys;.  }.
17b0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {1}.do_test e_
17c0: 66 6b 65 79 2d 35 2e 33 20 7b 0a 20 20 65 78 65  fkey-5.3 {.  exe
17d0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
17e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
17f0: 3d 20 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d  = OFF;.    PRAGM
1800: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a  A foreign_keys;.
1810: 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d    }.} {0}..#----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
1870: 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  t it is not poss
1880: 69 62 6c 65 20 74 6f 20 65 6e 61 62 6c 65 20 6f  ible to enable o
1890: 72 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  r disable foreig
18a0: 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 0a 23 20  n key support.# 
18b0: 77 68 69 6c 65 20 6e 6f 74 20 69 6e 20 61 75 74  while not in aut
18c0: 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 23  o-commit mode..#
18d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
18e0: 52 2d 34 36 36 34 39 2d 35 38 35 33 37 20 49 74  R-46649-58537 It
18f0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1900: 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69   to enable or di
1910: 73 61 62 6c 65 0a 23 20 66 6f 72 65 69 67 6e 20  sable.# foreign 
1920: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
1930: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
1940: 20 61 20 6d 75 6c 74 69 2d 73 74 61 74 65 6d 65   a multi-stateme
1950: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23  nt transaction.#
1960: 20 28 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73   (when SQLite is
1970: 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d   not in autocomm
1980: 69 74 20 6d 6f 64 65 29 2e 20 41 74 74 65 6d 70  it mode). Attemp
1990: 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f 20 64 6f  ting to do so do
19a0: 65 73 20 6e 6f 74 0a 23 20 72 65 74 75 72 6e 20  es not.# return 
19b0: 61 6e 20 65 72 72 6f 72 3b 20 69 74 20 73 69 6d  an error; it sim
19c0: 70 6c 79 20 68 61 73 20 6e 6f 20 65 66 66 65 63  ply has no effec
19d0: 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f  t..#.reset_db.do
19e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e 31  _test e_fkey-6.1
19f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1a00: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
1a10: 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20  n_keys = ON;.   
1a20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1a30: 28 61 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a 20  (a UNIQUE, b);. 
1a40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1a50: 74 32 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43  t2(c, d REFERENC
1a60: 45 53 20 74 31 28 61 29 29 3b 0a 20 20 20 20 49  ES t1(a));.    I
1a70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1a80: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
1a90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1aa0: 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20  ALUES(2, 1);.   
1ab0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 52   BEGIN;.      PR
1ac0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1ad0: 73 20 3d 20 4f 46 46 3b 0a 20 20 7d 0a 20 20 63  s = OFF;.  }.  c
1ae0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
1af0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a 20  DELETE FROM t1. 
1b00: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
1b10: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
1b20: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
1b30: 20 65 5f 66 6b 65 79 2d 36 2e 32 20 7b 0a 20 20   e_fkey-6.2 {.  
1b40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1b50: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a   foreign_keys }.
1b60: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {1}.do_test e_
1b70: 66 6b 65 79 2d 36 2e 33 20 7b 0a 20 20 65 78 65  fkey-6.3 {.  exe
1b80: 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49  csql {.    COMMI
1b90: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f  T;.    PRAGMA fo
1ba0: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
1bb0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
1bc0: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
1bd0: 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20  n_keys = ON;.   
1be0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1bf0: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
1c00: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20  foreign_keys;.  
1c10: 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  }.} {0}.do_test 
1c20: 65 5f 66 6b 65 79 2d 36 2e 34 20 7b 0a 20 20 65  e_fkey-6.4 {.  e
1c30: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
1c40: 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  {}..############
1c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
1c90: 23 23 23 20 53 45 43 54 49 4f 4e 20 31 3a 20 49  ### SECTION 1: I
1ca0: 6e 74 72 6f 64 75 63 74 69 6f 6e 20 74 6f 20 46  ntroduction to F
1cb0: 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74  oreign Key Const
1cc0: 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23  raints.#########
1cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d10: 23 23 0a 65 78 65 63 73 71 6c 20 22 50 52 41 47  ##.execsql "PRAG
1d20: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
1d30: 3d 20 4f 4e 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  = ON"..#--------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  -.# Verify that 
1d90: 74 68 65 20 73 79 6e 74 61 78 20 69 6e 20 74 68  the syntax in th
1da0: 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20  e first example 
1db0: 69 6e 20 73 65 63 74 69 6f 6e 20 31 20 69 73 20  in section 1 is 
1dc0: 76 61 6c 69 64 2e 0a 23 0a 23 20 45 56 49 44 45  valid..#.# EVIDE
1dd0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 30 34 32 2d  NCE-OF: R-04042-
1de0: 32 34 38 32 35 20 54 6f 20 64 6f 20 73 6f 2c 20  24825 To do so, 
1df0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
1e00: 66 69 6e 69 74 69 6f 6e 20 6d 61 79 20 62 65 0a  finition may be.
1e10: 23 20 61 64 64 65 64 20 62 79 20 6d 6f 64 69 66  # added by modif
1e20: 79 69 6e 67 20 74 68 65 20 64 65 63 6c 61 72 61  ying the declara
1e30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 61 63  tion of the trac
1e40: 6b 20 74 61 62 6c 65 20 74 6f 20 74 68 65 0a 23  k table to the.#
1e50: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 43 52 45 41   following: CREA
1e60: 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 20  TE TABLE track( 
1e70: 74 72 61 63 6b 69 64 20 49 4e 54 45 47 45 52 2c  trackid INTEGER,
1e80: 20 74 72 61 63 6b 6e 61 6d 65 20 54 45 58 54 2c   trackname TEXT,
1e90: 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74 20 49  .# trackartist I
1ea0: 4e 54 45 47 45 52 2c 20 46 4f 52 45 49 47 4e 20  NTEGER, FOREIGN 
1eb0: 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74 29  KEY(trackartist)
1ec0: 20 52 45 46 45 52 45 4e 43 45 53 0a 23 20 61 72   REFERENCES.# ar
1ed0: 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20 29  tist(artistid) )
1ee0: 3b 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ;.#.do_test e_fk
1ef0: 65 79 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73  ey-7.1 {.  execs
1f00: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f10: 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
1f20: 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
1f30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1f40: 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
1f50: 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
1f60: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
1f70: 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
1f80: 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
1f90: 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74 72  TEGER, .      tr
1fa0: 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20  ackname   TEXT, 
1fb0: 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69  .      trackarti
1fc0: 73 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20  st INTEGER,.    
1fd0: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72    FOREIGN KEY(tr
1fe0: 61 63 6b 61 72 74 69 73 74 29 20 52 45 46 45 52  ackartist) REFER
1ff0: 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74  ENCES artist(art
2000: 69 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20 20  istid).    );.  
2010: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
2070: 3a 20 52 2d 36 31 33 36 32 2d 33 32 30 38 37 20  : R-61362-32087 
2080: 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69 6e  Attempting to in
2090: 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20  sert a row into 
20a0: 74 68 65 20 74 72 61 63 6b 0a 23 20 74 61 62 6c  the track.# tabl
20b0: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
20c0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e  correspond to an
20d0: 79 20 72 6f 77 20 69 6e 20 74 68 65 20 61 72 74  y row in the art
20e0: 69 73 74 20 74 61 62 6c 65 20 77 69 6c 6c 0a 23  ist table will.#
20f0: 20 66 61 69 6c 2c 0a 23 0a 64 6f 5f 74 65 73 74   fail,.#.do_test
2100: 20 65 5f 66 6b 65 79 2d 38 2e 31 20 7b 0a 20 20   e_fkey-8.1 {.  
2110: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
2120: 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
2130: 55 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27  UES(1, 'track 1'
2140: 2c 20 31 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 1) }.} {1 {for
2150: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2160: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
2170: 74 65 73 74 20 65 5f 66 6b 65 79 2d 38 2e 32 20  test e_fkey-8.2 
2180: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
2190: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
21a0: 20 56 41 4c 55 45 53 28 32 2c 20 27 61 72 74 69   VALUES(2, 'arti
21b0: 73 74 20 31 27 29 20 7d 0a 20 20 63 61 74 63 68  st 1') }.  catch
21c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
21d0: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
21e0: 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 31 29 20  , 'track 1', 1) 
21f0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2200: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2210: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
2220: 65 5f 66 6b 65 79 2d 38 2e 32 20 7b 0a 20 20 65  e_fkey-8.2 {.  e
2230: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
2240: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
2250: 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20  S(1, 'track 1', 
2260: 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  2) }.} {}..#----
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d 70 74 69  -----.# Attempti
22c0: 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 20 72  ng to delete a r
22d0: 6f 77 20 66 72 6f 6d 20 74 68 65 20 27 61 72 74  ow from the 'art
22e0: 69 73 74 27 20 74 61 62 6c 65 20 77 68 69 6c 65  ist' table while
22f0: 20 74 68 65 72 65 20 61 72 65 20 0a 23 20 64 65   there are .# de
2300: 70 65 6e 64 65 6e 74 20 72 6f 77 73 20 69 6e 20  pendent rows in 
2310: 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20  the track table 
2320: 61 6c 73 6f 20 66 61 69 6c 73 2e 0a 23 0a 23 20  also fails..#.# 
2330: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2340: 34 34 30 31 2d 35 32 34 30 30 20 61 73 20 77 69  4401-52400 as wi
2350: 6c 6c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ll attempting to
2360: 20 64 65 6c 65 74 65 20 61 20 72 6f 77 20 66 72   delete a row fr
2370: 6f 6d 20 74 68 65 0a 23 20 61 72 74 69 73 74 20  om the.# artist 
2380: 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65 72 65  table when there
2390: 20 65 78 69 73 74 20 64 65 70 65 6e 64 65 6e 74   exist dependent
23a0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61   rows in the tra
23b0: 63 6b 20 74 61 62 6c 65 0a 23 0a 64 6f 5f 74 65  ck table.#.do_te
23c0: 73 74 20 65 5f 66 6b 65 79 2d 39 2e 31 20 7b 0a  st e_fkey-9.1 {.
23d0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
23e0: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
23f0: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
2400: 20 32 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   2 }.} {1 {forei
2410: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
2420: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
2430: 73 74 20 65 5f 66 6b 65 79 2d 39 2e 32 20 7b 0a  st e_fkey-9.2 {.
2440: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
2450: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61   DELETE FROM tra
2460: 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72  ck WHERE trackar
2470: 74 69 73 74 20 3d 20 32 3b 0a 20 20 20 20 44 45  tist = 2;.    DE
2480: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
2490: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
24a0: 3d 20 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  = 2;.  }.} {}..#
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 74  ---------.# If t
2500: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
2510: 6f 6c 75 6d 6e 20 28 74 72 61 63 6b 61 72 74 69  olumn (trackarti
2520: 73 74 29 20 69 6e 20 74 61 62 6c 65 20 27 74 72  st) in table 'tr
2530: 61 63 6b 27 20 69 73 20 73 65 74 20 74 6f 20 4e  ack' is set to N
2540: 55 4c 4c 2c 0a 23 20 74 68 65 72 65 20 69 73 20  ULL,.# there is 
2550: 6e 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66  no requirement f
2560: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 72 6f  or a matching ro
2570: 77 20 69 6e 20 74 68 65 20 27 61 72 74 69 73 74  w in the 'artist
2580: 27 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49  ' table..#.# EVI
2590: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39 38  DENCE-OF: R-2398
25a0: 30 2d 34 38 38 35 39 20 54 68 65 72 65 20 69 73  0-48859 There is
25b0: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 3a 20   one exception: 
25c0: 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  if the foreign k
25d0: 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ey.# column in t
25e0: 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20 69  he track table i
25f0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6e 6f 20  s NULL, then no 
2600: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
2610: 74 72 79 20 69 6e 20 74 68 65 0a 23 20 61 72 74  try in the.# art
2620: 69 73 74 20 74 61 62 6c 65 20 69 73 20 72 65 71  ist table is req
2630: 75 69 72 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  uired..#.do_test
2640: 20 65 5f 66 6b 65 79 2d 31 30 2e 31 20 7b 0a 20   e_fkey-10.1 {. 
2650: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
2660: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
2670: 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63   VALUES(1, 'trac
2680: 6b 20 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  k 1', NULL);.   
2690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
26a0: 63 6b 20 56 41 4c 55 45 53 28 32 2c 20 27 74 72  ck VALUES(2, 'tr
26b0: 61 63 6b 20 32 27 2c 20 4e 55 4c 4c 29 3b 0a 20  ack 2', NULL);. 
26c0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
26d0: 65 5f 66 6b 65 79 2d 31 30 2e 32 20 7b 0a 20 20  e_fkey-10.2 {.  
26e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
26f0: 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20 7d   * FROM artist }
2700: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
2710: 66 6b 65 79 2d 31 30 2e 33 20 7b 0a 20 20 23 20  fkey-10.3 {.  # 
2720: 53 65 74 74 69 6e 67 20 74 68 65 20 74 72 61 63  Setting the trac
2730: 6b 69 64 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  kid to a non-NUL
2740: 4c 20 76 61 6c 75 65 20 66 61 69 6c 73 2c 20 6f  L value fails, o
2750: 66 20 63 6f 75 72 73 65 2e 0a 20 20 63 61 74 63  f course..  catc
2760: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 72  hsql { UPDATE tr
2770: 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74  ack SET trackart
2780: 69 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72  ist = 5 WHERE tr
2790: 61 63 6b 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31  ackid = 1 }.} {1
27a0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
27b0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
27c0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
27d0: 2d 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -10.4 {.  execsq
27e0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
27f0: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
2800: 53 28 35 2c 20 27 61 72 74 69 73 74 20 35 27 29  S(5, 'artist 5')
2810: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 72 61  ;.    UPDATE tra
2820: 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69  ck SET trackarti
2830: 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72 61  st = 5 WHERE tra
2840: 63 6b 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ckid = 1;.  }.  
2850: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
2860: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
2870: 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35  ERE artistid = 5
2880: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2890: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
28a0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
28b0: 65 5f 66 6b 65 79 2d 31 30 2e 35 20 7b 0a 20 20  e_fkey-10.5 {.  
28c0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55  execsql { .    U
28d0: 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20  PDATE track SET 
28e0: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 4e 55  trackartist = NU
28f0: 4c 4c 20 57 48 45 52 45 20 74 72 61 63 6b 69 64  LL WHERE trackid
2900: 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45   = 1;.    DELETE
2910: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
2920: 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35 3b  RE artistid = 5;
2930: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2990: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
29a0: 69 73 20 74 72 75 65 20 66 6f 20 61 6c 6c 20 72  is true fo all r
29b0: 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61 63 6b  ows in the track
29c0: 20 74 61 62 6c 65 3a 0a 23 0a 23 20 20 20 74 72   table:.#.#   tr
29d0: 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55 4c  ackartist IS NUL
29e0: 4c 20 4f 52 20 0a 23 20 20 20 45 58 49 53 54 53  L OR .#   EXISTS
29f0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61  (SELECT 1 FROM a
2a00: 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
2a10: 73 74 69 64 3d 74 72 61 63 6b 61 72 74 69 73 74  stid=trackartist
2a20: 29 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ).#.# EVIDENCE-O
2a30: 46 3a 20 52 2d 35 32 34 38 36 2d 32 31 33 35 32  F: R-52486-21352
2a40: 20 45 78 70 72 65 73 73 65 64 20 69 6e 20 53 51   Expressed in SQ
2a50: 4c 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  L, this means th
2a60: 61 74 20 66 6f 72 20 65 76 65 72 79 0a 23 20 72  at for every.# r
2a70: 6f 77 20 69 6e 20 74 68 65 20 74 72 61 63 6b 20  ow in the track 
2a80: 74 61 62 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  table, the follo
2a90: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  wing expression 
2aa0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
2ab0: 65 3a 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74  e:.# trackartist
2ac0: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 45 58 49 53   IS NULL OR EXIS
2ad0: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
2ae0: 20 61 72 74 69 73 74 20 57 48 45 52 45 0a 23 20   artist WHERE.# 
2af0: 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61 72  artistid=trackar
2b00: 74 69 73 74 29 0a 0a 23 20 54 68 69 73 20 70 72  tist)..# This pr
2b10: 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65 73  ocedure executes
2b20: 20 61 20 74 65 73 74 20 63 61 73 65 20 74 6f 20   a test case to 
2b30: 63 68 65 63 6b 20 74 68 61 74 20 73 74 61 74 65  check that state
2b40: 6d 65 6e 74 20 0a 23 20 52 2d 35 32 34 38 36 2d  ment .# R-52486-
2b50: 32 31 33 35 32 20 69 73 20 74 72 75 65 20 61 66  21352 is true af
2b60: 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68  ter executing th
2b70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2b80: 70 61 73 73 65 64 2e 0a 23 20 61 73 20 74 68 65  passed..# as the
2b90: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ba0: 2e 0a 70 72 6f 63 20 74 65 73 74 5f 72 35 32 34  ..proc test_r524
2bb0: 38 36 5f 32 31 33 35 32 20 7b 74 6e 20 73 71 6c  86_21352 {tn sql
2bc0: 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b 63  } {.  set res [c
2bd0: 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 0a 20 20  atchsql $sql].  
2be0: 73 65 74 20 72 65 73 75 6c 74 73 20 7b 0a 20 20  set results {.  
2bf0: 20 20 7b 30 20 7b 7d 7d 20 0a 20 20 20 20 7b 31    {0 {}} .    {1
2c00: 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75   {PRIMARY KEY mu
2c10: 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 20 0a  st be unique}} .
2c20: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
2c30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2c40: 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20 69 66  ailed}}.  }.  if
2c50: 20 7b 5b 6c 73 65 61 72 63 68 20 24 72 65 73 75   {[lsearch $resu
2c60: 6c 74 73 20 24 72 65 73 5d 3c 30 7d 20 7b 0a 20  lts $res]<0} {. 
2c70: 20 20 20 65 72 72 6f 72 20 24 72 65 73 0a 20 20     error $res.  
2c80: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  }..  do_test e_f
2c90: 6b 65 79 2d 31 31 2e 24 74 6e 20 7b 0a 20 20 20  key-11.$tn {.   
2ca0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2cb0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2cc0: 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52   FROM track WHER
2cd0: 45 20 4e 4f 54 20 28 0a 20 20 20 20 20 20 20 20  E NOT (.        
2ce0: 74 72 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e  trackartist IS N
2cf0: 55 4c 4c 20 4f 52 20 0a 20 20 20 20 20 20 20 20  ULL OR .        
2d00: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
2d10: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
2d20: 45 20 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b  E artistid=track
2d30: 61 72 74 69 73 74 29 0a 20 20 20 20 20 20 29 0a  artist).      ).
2d40: 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a      }.  } {0}.}.
2d50: 0a 23 20 45 78 65 63 75 74 65 20 61 20 73 65 72  .# Execute a ser
2d60: 69 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 49 4e  ies of random IN
2d70: 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64  SERT, UPDATE and
2d80: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2d90: 6e 73 0a 23 20 28 73 6f 6d 65 20 6f 66 20 77 68  ns.# (some of wh
2da0: 69 63 68 20 6d 61 79 20 66 61 69 6c 20 64 75 65  ich may fail due
2db0: 20 74 6f 20 46 4b 20 6f 72 20 50 4b 20 63 6f 6e   to FK or PK con
2dc0: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
2dd0: 6e 73 29 20 6f 6e 20 0a 23 20 74 68 65 20 74 77  ns) on .# the tw
2de0: 6f 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  o tables in the 
2df0: 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 2e 20  example schema. 
2e00: 54 65 73 74 20 74 68 61 74 20 52 2d 35 32 34 38  Test that R-5248
2e10: 36 2d 32 31 33 35 32 0a 23 20 69 73 20 74 72 75  6-21352.# is tru
2e20: 65 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e  e after executin
2e30: 67 20 65 61 63 68 20 6f 70 65 72 61 74 69 6f 6e  g each operation
2e40: 2e 0a 23 0a 73 65 74 20 54 65 6d 70 6c 61 74 65  ..#.set Template
2e50: 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   {.  {INSERT INT
2e60: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 24  O track VALUES($
2e70: 74 2c 20 27 74 72 61 63 6b 20 24 74 27 2c 20 24  t, 'track $t', $
2e80: 61 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52  a)}.  {DELETE FR
2e90: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
2ea0: 72 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20 7b  rackid = $t}.  {
2eb0: 55 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54  UPDATE track SET
2ec0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 24   trackartist = $
2ed0: 61 20 57 48 45 52 45 20 74 72 61 63 6b 69 64 20  a WHERE trackid 
2ee0: 3d 20 24 74 7d 0a 20 20 7b 49 4e 53 45 52 54 20  = $t}.  {INSERT 
2ef0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
2f00: 45 53 28 24 61 2c 20 27 61 72 74 69 73 74 20 24  ES($a, 'artist $
2f10: 61 27 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46  a')}.  {DELETE F
2f20: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
2f30: 20 61 72 74 69 73 74 69 64 20 3d 20 24 61 7d 0a   artistid = $a}.
2f40: 20 20 7b 55 50 44 41 54 45 20 61 72 74 69 73 74    {UPDATE artist
2f50: 20 53 45 54 20 61 72 74 69 73 74 69 64 20 3d 20   SET artistid = 
2f60: 24 61 32 20 57 48 45 52 45 20 61 72 74 69 73 74  $a2 WHERE artist
2f70: 69 64 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72 20 7b  id = $a}.}.for {
2f80: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35  set i 0} {$i < 5
2f90: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
2fa0: 20 73 65 74 20 61 20 20 20 5b 65 78 70 72 20 69   set a   [expr i
2fb0: 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20  nt(rand()*10)]. 
2fc0: 20 73 65 74 20 61 32 20 20 5b 65 78 70 72 20 69   set a2  [expr i
2fd0: 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20  nt(rand()*10)]. 
2fe0: 20 73 65 74 20 74 20 20 20 5b 65 78 70 72 20 69   set t   [expr i
2ff0: 6e 74 28 72 61 6e 64 28 29 2a 35 30 29 5d 0a 20  nt(rand()*50)]. 
3000: 20 73 65 74 20 73 71 6c 20 5b 73 75 62 73 74 20   set sql [subst 
3010: 5b 6c 69 6e 64 65 78 20 24 54 65 6d 70 6c 61 74  [lindex $Templat
3020: 65 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64  e [expr int(rand
3030: 28 29 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65 73 74  ()*6)]]]..  test
3040: 5f 72 35 32 34 38 36 5f 32 31 33 35 32 20 24 69  _r52486_21352 $i
3050: 20 24 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   $sql.}..#------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
30b0: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
30c0: 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20 61 64  traint can be ad
30d0: 64 65 64 20 74 6f 20 74 68 65 20 65 78 61 6d 70  ded to the examp
30e0: 6c 65 20 73 63 68 65 6d 61 0a 23 20 74 6f 20 70  le schema.# to p
30f0: 72 6f 68 69 62 69 74 20 4e 55 4c 4c 20 63 68 69  rohibit NULL chi
3100: 6c 64 20 6b 65 79 73 20 66 72 6f 6d 20 62 65 69  ld keys from bei
3110: 6e 67 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a 23  ng inserted..#.#
3120: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3130: 34 32 34 31 32 2d 35 39 33 32 31 20 54 69 70 3a  42412-59321 Tip:
3140: 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
3150: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 20 73  ion requires a s
3160: 74 72 69 63 74 65 72 0a 23 20 72 65 6c 61 74 69  tricter.# relati
3170: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 61  onship between a
3180: 72 74 69 73 74 20 61 6e 64 20 74 72 61 63 6b 2c  rtist and track,
3190: 20 77 68 65 72 65 20 4e 55 4c 4c 20 76 61 6c 75   where NULL valu
31a0: 65 73 20 61 72 65 20 6e 6f 74 0a 23 20 70 65 72  es are not.# per
31b0: 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20 74 72  mitted in the tr
31c0: 61 63 6b 61 72 74 69 73 74 20 63 6f 6c 75 6d 6e  ackartist column
31d0: 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68 65  , simply add the
31e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 22 4e 4f   appropriate "NO
31f0: 54 0a 23 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  T.# NULL" constr
3200: 61 69 6e 74 20 74 6f 20 74 68 65 20 73 63 68 65  aint to the sche
3210: 6d 61 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ma..#.drop_all_t
3220: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
3230: 66 6b 65 79 2d 31 32 2e 31 20 7b 0a 20 20 65 78  fkey-12.1 {.  ex
3240: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3250: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
3260: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
3270: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
3280: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
3290: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
32a0: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
32b0: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
32c0: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
32d0: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
32e0: 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58   trackname   TEX
32f0: 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61  T, .      tracka
3300: 72 74 69 73 74 20 49 4e 54 45 47 45 52 20 4e 4f  rtist INTEGER NO
3310: 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 46 4f  T NULL,.      FO
3320: 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61  REIGN KEY(tracka
3330: 72 74 69 73 74 29 20 52 45 46 45 52 45 4e 43 45  rtist) REFERENCE
3340: 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
3350: 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  d).    );.  }.} 
3360: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
3370: 79 2d 31 32 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-12.2 {.  catch
3380: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
3390: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
33a0: 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65  4, 'Mr. Bojangle
33b0: 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31  s', NULL) }.} {1
33c0: 20 7b 74 72 61 63 6b 2e 74 72 61 63 6b 61 72 74   {track.trackart
33d0: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e  ist may not be N
33e0: 55 4c 4c 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ULL}}..#--------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
3440: 20 52 2d 31 36 31 32 37 2d 33 35 34 34 32 0a 23   R-16127-35442.#
3450: 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70  .# Test an examp
3460: 6c 65 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b  le from foreignk
3470: 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70  eys.html..#.drop
3480: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
3490: 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 31 20  est e_fkey-13.1 
34a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
34b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
34c0: 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74  rtist(.      art
34d0: 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52  istid    INTEGER
34e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
34f0: 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20       artistname 
3500: 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20   TEXT.    );.   
3510: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
3520: 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b  ack(.      track
3530: 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20  id     INTEGER, 
3540: 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
3550: 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
3560: 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
3570: 47 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  GER,.      FOREI
3580: 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69  GN KEY(trackarti
3590: 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20 61  st) REFERENCES a
35a0: 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29 0a  rtist(artistid).
35b0: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
35c0: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
35d0: 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d 61  LUES(1, 'Dean Ma
35e0: 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  rtin');.    INSE
35f0: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
3600: 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b 20  ALUES(2, 'Frank 
3610: 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20 49  Sinatra');.    I
3620: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3630: 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68 61   VALUES(11, 'Tha
3640: 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29 3b  t''s Amore', 1);
3650: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3660: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 32   track VALUES(12
3670: 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c 75  , 'Christmas Blu
3680: 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  es', 1);.    INS
3690: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
36a0: 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57 61  ALUES(13, 'My Wa
36b0: 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  y', 2);.  }.} {}
36c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
36d0: 31 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  13.2 {.  catchsq
36e0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
36f0: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34 2c  track VALUES(14,
3700: 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27   'Mr. Bojangles'
3710: 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 3) }.} {1 {for
3720: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
3730: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
3740: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 33  test e_fkey-13.3
3750: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
3760: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3770: 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e   VALUES(14, 'Mr.
3780: 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 4e 55 4c   Bojangles', NUL
3790: 4c 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  L) }.} {}.do_tes
37a0: 74 20 65 5f 66 6b 65 79 2d 31 33 2e 34 20 7b 0a  t e_fkey-13.4 {.
37b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20    catchsql { .  
37c0: 20 20 55 50 44 41 54 45 20 74 72 61 63 6b 20 53    UPDATE track S
37d0: 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d  ET trackartist =
37e0: 20 33 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61   3 WHERE trackna
37f0: 6d 65 20 3d 20 27 4d 72 2e 20 42 6f 6a 61 6e 67  me = 'Mr. Bojang
3800: 6c 65 73 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  les';.  }.} {1 {
3810: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3820: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
3830: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
3840: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
3850: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
3860: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
3870: 33 2c 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20  3, 'Sammy Davis 
3880: 4a 72 2e 27 29 3b 0a 20 20 20 20 55 50 44 41 54  Jr.');.    UPDAT
3890: 45 20 74 72 61 63 6b 20 53 45 54 20 74 72 61 63  E track SET trac
38a0: 6b 61 72 74 69 73 74 20 3d 20 33 20 57 48 45 52  kartist = 3 WHER
38b0: 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d  E trackname = 'M
38c0: 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a 20  r. Bojangles';. 
38d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
38e0: 72 61 63 6b 20 56 41 4c 55 45 53 28 31 35 2c 20  rack VALUES(15, 
38f0: 27 42 6f 6f 67 69 65 20 57 6f 6f 67 69 65 27 2c  'Boogie Woogie',
3900: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23   3);.  }.} {}..#
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3960: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 39 35 38  ENCE-OF: R-15958
3970: 2d 35 30 32 33 33 0a 23 0a 23 20 54 65 73 74 20  -50233.#.# Test 
3980: 74 68 65 20 73 65 63 6f 6e 64 20 65 78 61 6d 70  the second examp
3990: 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  le from the firs
39a0: 74 20 73 65 63 74 69 6f 6e 20 6f 66 20 66 6f 72  t section of for
39b0: 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23  eignkeys.html..#
39c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
39d0: 31 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  14.1 {.  catchsq
39e0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
39f0: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
3a00: 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 46   artistname = 'F
3a10: 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 3b 0a 20  rank Sinatra';. 
3a20: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
3a30: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
3a40: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
3a50: 20 65 5f 66 6b 65 79 2d 31 34 2e 32 20 7b 0a 20   e_fkey-14.2 {. 
3a60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3a70: 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63 6b  ELETE FROM track
3a80: 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61 6d 65   WHERE trackname
3a90: 20 3d 20 27 4d 79 20 57 61 79 27 3b 0a 20 20 20   = 'My Way';.   
3aa0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
3ab0: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
3ac0: 6e 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53 69  name = 'Frank Si
3ad0: 6e 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b 7d  natra';.  }.} {}
3ae0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3af0: 31 34 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  14.3 {.  catchsq
3b00: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  l {.    UPDATE a
3b10: 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74  rtist SET artist
3b20: 69 64 3d 34 20 57 48 45 52 45 20 61 72 74 69 73  id=4 WHERE artis
3b30: 74 6e 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61  tname = 'Dean Ma
3b40: 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  rtin';.  }.} {1 
3b50: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
3b60: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
3b70: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3b80: 31 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  14.4 {.  execsql
3b90: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
3ba0: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
3bb0: 72 61 63 6b 6e 61 6d 65 20 49 4e 28 27 54 68 61  rackname IN('Tha
3bc0: 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 27 43 68  t''s Amore', 'Ch
3bd0: 72 69 73 74 6d 61 73 20 42 6c 75 65 73 27 29 3b  ristmas Blues');
3be0: 0a 20 20 20 20 55 50 44 41 54 45 20 61 72 74 69  .    UPDATE arti
3bf0: 73 74 20 53 45 54 20 61 72 74 69 73 74 69 64 3d  st SET artistid=
3c00: 34 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61  4 WHERE artistna
3c10: 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69  me = 'Dean Marti
3c20: 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23  n';.  }.} {}...#
3c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3c80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 30 33 32  ENCE-OF: R-56032
3c90: 2d 32 34 39 32 33 20 54 68 65 20 66 6f 72 65 69  -24923 The forei
3ca0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3cb0: 74 20 69 73 20 73 61 74 69 73 66 69 65 64 20 69  t is satisfied i
3cc0: 66 0a 23 20 66 6f 72 20 65 61 63 68 20 72 6f 77  f.# for each row
3cd0: 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61   in the child ta
3ce0: 62 6c 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ble either one o
3cf0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 63 68  r more of the ch
3d00: 69 6c 64 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e  ild key.# column
3d10: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6f 72 20 74  s are NULL, or t
3d20: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 72 6f  here exists a ro
3d30: 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  w in the parent 
3d40: 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 0a  table for which.
3d50: 23 20 65 61 63 68 20 70 61 72 65 6e 74 20 6b 65  # each parent ke
3d60: 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  y column contain
3d70: 73 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20  s a value equal 
3d80: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
3d90: 69 74 73 0a 23 20 61 73 73 6f 63 69 61 74 65 64  its.# associated
3da0: 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d   child key colum
3db0: 6e 2e 0a 23 0a 23 20 54 65 73 74 20 61 6c 73 6f  n..#.# Test also
3dc0: 20 74 68 61 74 20 74 68 65 20 75 73 75 61 6c 20   that the usual 
3dd0: 63 6f 6d 70 61 72 69 73 6f 6e 20 72 75 6c 65 73  comparison rules
3de0: 20 61 72 65 20 75 73 65 64 20 77 68 65 6e 20 74   are used when t
3df0: 65 73 74 69 6e 67 20 69 66 20 74 68 65 72 65 20  esting if there 
3e00: 0a 23 20 69 73 20 61 20 6d 61 74 63 68 69 6e 67  .# is a matching
3e10: 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65   row in the pare
3e20: 6e 74 20 74 61 62 6c 65 20 6f 66 20 61 20 66 6f  nt table of a fo
3e30: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
3e40: 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  aint..#.# EVIDEN
3e50: 43 45 2d 4f 46 3a 20 52 2d 35 37 37 36 35 2d 31  CE-OF: R-57765-1
3e60: 32 33 38 30 20 49 6e 20 74 68 65 20 61 62 6f 76  2380 In the abov
3e70: 65 20 70 61 72 61 67 72 61 70 68 2c 20 74 68 65  e paragraph, the
3e80: 20 74 65 72 6d 20 22 65 71 75 61 6c 22 0a 23 20   term "equal".# 
3e90: 6d 65 61 6e 73 20 65 71 75 61 6c 20 77 68 65 6e  means equal when
3ea0: 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70   values are comp
3eb0: 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 72  ared using the r
3ec0: 75 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 68  ules specified h
3ed0: 65 72 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ere..#.drop_all_
3ee0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
3ef0: 5f 66 6b 65 79 2d 31 35 2e 31 20 7b 0a 20 20 65  _fkey-15.1 {.  e
3f00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
3f10: 41 54 45 20 54 41 42 4c 45 20 70 61 72 28 70 20  ATE TABLE par(p 
3f20: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
3f30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
3f40: 68 69 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  hi(c REFERENCES 
3f50: 70 61 72 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  par);..    INSER
3f60: 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45  T INTO par VALUE
3f70: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
3f80: 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45 53   INTO par VALUES
3f90: 28 27 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ('1');.    INSER
3fa0: 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45  T INTO par VALUE
3fb0: 53 28 58 27 33 31 27 29 3b 0a 20 20 20 20 53 45  S(X'31');.    SE
3fc0: 4c 45 43 54 20 74 79 70 65 6f 66 28 70 29 20 46  LECT typeof(p) F
3fd0: 52 4f 4d 20 70 61 72 3b 0a 20 20 7d 0a 7d 20 7b  ROM par;.  }.} {
3fe0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 62 6c 6f  integer text blo
3ff0: 62 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66  b}..proc test_ef
4000: 6b 65 79 5f 34 35 20 7b 74 6e 20 69 73 45 72 72  key_45 {tn isErr
4010: 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74  or sql} {.  do_t
4020: 65 73 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24 74  est e_fkey-15.$t
4030: 6e 2e 31 20 22 0a 20 20 20 20 63 61 74 63 68 73  n.1 ".    catchs
4040: 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c  ql {$sql}.  " [l
4050: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
4060: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
4070: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4080: 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 0a 20 20  }} $isError]..  
4090: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
40a0: 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  5.$tn.2 {.    ex
40b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
40c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 20  LECT * FROM chi 
40d0: 57 48 45 52 45 20 63 20 49 53 20 4e 4f 54 20 4e  WHERE c IS NOT N
40e0: 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 49 4e  ULL AND c NOT IN
40f0: 20 28 53 45 4c 45 43 54 20 70 20 46 52 4f 4d 20   (SELECT p FROM 
4100: 70 61 72 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  par).    }.  } {
4110: 7d 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f  }.}..test_efkey_
4120: 34 35 20 31 20 30 20 22 49 4e 53 45 52 54 20 49  45 1 0 "INSERT I
4130: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 31  NTO chi VALUES(1
4140: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  )".test_efkey_45
4150: 20 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54   2 1 "INSERT INT
4160: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27 31 2e  O chi VALUES('1.
4170: 30 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  0')".test_efkey_
4180: 34 35 20 33 20 30 20 22 49 4e 53 45 52 54 20 49  45 3 0 "INSERT I
4190: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27  NTO chi VALUES('
41a0: 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  1')".test_efkey_
41b0: 34 35 20 34 20 31 20 22 44 45 4c 45 54 45 20 46  45 4 1 "DELETE F
41c0: 52 4f 4d 20 70 61 72 20 57 48 45 52 45 20 70 20  ROM par WHERE p 
41d0: 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65  = '1'".test_efke
41e0: 79 5f 34 35 20 35 20 30 20 22 44 45 4c 45 54 45  y_45 5 0 "DELETE
41f0: 20 46 52 4f 4d 20 63 68 69 20 57 48 45 52 45 20   FROM chi WHERE 
4200: 63 20 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66  c = '1'".test_ef
4210: 6b 65 79 5f 34 35 20 36 20 30 20 22 44 45 4c 45  key_45 6 0 "DELE
4220: 54 45 20 46 52 4f 4d 20 70 61 72 20 57 48 45 52  TE FROM par WHER
4230: 45 20 70 20 3d 20 27 31 27 22 0a 74 65 73 74 5f  E p = '1'".test_
4240: 65 66 6b 65 79 5f 34 35 20 37 20 31 20 22 49 4e  efkey_45 7 1 "IN
4250: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
4260: 4c 55 45 53 28 27 31 27 29 22 0a 74 65 73 74 5f  LUES('1')".test_
4270: 65 66 6b 65 79 5f 34 35 20 38 20 30 20 22 49 4e  efkey_45 8 0 "IN
4280: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
4290: 4c 55 45 53 28 58 27 33 31 27 29 22 0a 74 65 73  LUES(X'31')".tes
42a0: 74 5f 65 66 6b 65 79 5f 34 35 20 39 20 31 20 22  t_efkey_45 9 1 "
42b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20  INSERT INTO chi 
42c0: 56 41 4c 55 45 53 28 58 27 33 32 27 29 22 0a 0a  VALUES(X'32')"..
42d0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65  ----------.# Spe
4320: 63 69 66 69 63 61 6c 6c 79 2c 20 74 65 73 74 20  cifically, test 
4330: 74 68 61 74 20 77 68 65 6e 20 63 6f 6d 70 61 72  that when compar
4340: 69 6e 67 20 63 68 69 6c 64 20 61 6e 64 20 70 61  ing child and pa
4350: 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20  rent key values 
4360: 74 68 65 0a 23 20 64 65 66 61 75 6c 74 20 63 6f  the.# default co
4370: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4380: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   of the parent k
4390: 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ey column is use
43a0: 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  d..#.# EVIDENCE-
43b0: 4f 46 3a 20 52 2d 31 35 37 39 36 2d 34 37 35 31  OF: R-15796-4751
43c0: 33 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  3 When comparing
43d0: 20 74 65 78 74 20 76 61 6c 75 65 73 2c 20 74 68   text values, th
43e0: 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 23 20 73 65  e collating.# se
43f0: 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65  quence associate
4400: 64 20 77 69 74 68 20 74 68 65 20 70 61 72 65 6e  d with the paren
4410: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20  t key column is 
4420: 61 6c 77 61 79 73 20 75 73 65 64 2e 0a 23 0a 64  always used..#.d
4430: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
4440: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36  o_test e_fkey-16
4450: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
4460: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4470: 45 20 74 31 28 61 20 43 4f 4c 4c 41 54 45 20 6e  E t1(a COLLATE n
4480: 6f 63 61 73 65 20 50 52 49 4d 41 52 59 20 4b 45  ocase PRIMARY KE
4490: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
44a0: 41 42 4c 45 20 74 32 28 62 20 52 45 46 45 52 45  ABLE t2(b REFERE
44b0: 4e 43 45 53 20 74 31 29 3b 0a 20 20 7d 0a 7d 20  NCES t1);.  }.} 
44c0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
44d0: 79 2d 31 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-16.2 {.  execs
44e0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
44f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4500: 6f 4e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  oNe');.    INSER
4510: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
4520: 28 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53  ('one');.    INS
4530: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
4540: 45 53 28 27 4f 4e 45 27 29 3b 0a 20 20 20 20 55  ES('ONE');.    U
4550: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
4560: 20 27 4f 6e 45 27 3b 0a 20 20 20 20 55 50 44 41   'OnE';.    UPDA
4570: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 27 4f  TE t1 SET a = 'O
4580: 4e 45 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  NE';.  }.} {}.do
4590: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e  _test e_fkey-16.
45a0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
45b0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62   UPDATE t2 SET b
45c0: 20 3d 20 27 74 77 6f 27 20 57 48 45 52 45 20 72   = 'two' WHERE r
45d0: 6f 77 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31 20  owid = 1 }.} {1 
45e0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
45f0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
4600: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
4610: 31 36 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  16.4 {.  catchsq
4620: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
4630: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  t1 WHERE rowid =
4640: 20 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   1 }.} {1 {forei
4650: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
4660: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d  t failed}}..#---
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66 69  ------.# Specifi
46c0: 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74  cally, test that
46d0: 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   when comparing 
46e0: 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74  child and parent
46f0: 20 6b 65 79 20 76 61 6c 75 65 73 20 74 68 65 0a   key values the.
4700: 23 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  # affinity of th
4710: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
4720: 75 6d 6e 20 69 73 20 61 70 70 6c 69 65 64 20 74  umn is applied t
4730: 6f 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  o the child key 
4740: 76 61 6c 75 65 0a 23 20 62 65 66 6f 72 65 20 74  value.# before t
4750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61  he comparison ta
4760: 6b 65 73 20 70 6c 61 63 65 2e 0a 23 0a 23 20 45  kes place..#.# E
4770: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
4780: 32 34 30 2d 31 33 38 36 30 20 57 68 65 6e 20 63  240-13860 When c
4790: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 2c  omparing values,
47a0: 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   if the parent k
47b0: 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ey.# column has 
47c0: 61 6e 20 61 66 66 69 6e 69 74 79 2c 20 74 68 65  an affinity, the
47d0: 6e 20 74 68 61 74 20 61 66 66 69 6e 69 74 79 20  n that affinity 
47e0: 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  is applied to th
47f0: 65 20 63 68 69 6c 64 20 6b 65 79 0a 23 20 76 61  e child key.# va
4800: 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  lue before the c
4810: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 65 72  omparison is per
4820: 66 6f 72 6d 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  formed..#.drop_a
4830: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
4840: 74 20 65 5f 66 6b 65 79 2d 31 37 2e 31 20 7b 0a  t e_fkey-17.1 {.
4850: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4870: 61 20 4e 55 4d 45 52 49 43 20 50 52 49 4d 41 52  a NUMERIC PRIMAR
4880: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
4890: 54 45 20 54 41 42 4c 45 20 74 32 28 62 20 54 45  TE TABLE t2(b TE
48a0: 58 54 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  XT REFERENCES t1
48b0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
48c0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 32 20  est e_fkey-17.2 
48d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
48e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
48f0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
4900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4910: 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e  ALUES(2);.    IN
4920: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4930: 55 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20  UES('three');.  
4940: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
4950: 20 56 41 4c 55 45 53 28 27 32 2e 30 27 29 3b 0a   VALUES('2.0');.
4960: 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20 74 79      SELECT b, ty
4970: 70 65 6f 66 28 62 29 20 46 52 4f 4d 20 74 32 3b  peof(b) FROM t2;
4980: 0a 20 20 7d 0a 7d 20 7b 32 2e 30 20 74 65 78 74  .  }.} {2.0 text
4990: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
49a0: 2d 31 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -17.3 {.  execsq
49b0: 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  l { SELECT typeo
49c0: 66 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  f(a) FROM t1 }.}
49d0: 20 7b 69 6e 74 65 67 65 72 20 69 6e 74 65 67 65   {integer intege
49e0: 72 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74 20  r text}.do_test 
49f0: 65 5f 66 6b 65 79 2d 31 37 2e 34 20 7b 0a 20 20  e_fkey-17.4 {.  
4a00: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
4a10: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
4a20: 72 6f 77 69 64 20 3d 20 32 20 7d 0a 7d 20 7b 31  rowid = 2 }.} {1
4a30: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
4a40: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4a50: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
4a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
4aa0: 23 23 20 53 45 43 54 49 4f 4e 20 33 3a 20 52 65  ## SECTION 3: Re
4ab0: 71 75 69 72 65 64 20 61 6e 64 20 53 75 67 67 65  quired and Sugge
4ac0: 73 74 65 64 20 44 61 74 61 62 61 73 65 20 49 6e  sted Database In
4ad0: 64 65 78 65 73 0a 23 23 23 23 23 23 23 23 23 23  dexes.##########
4ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #..#------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4b70: 41 20 70 61 72 65 6e 74 20 6b 65 79 20 6d 75 73  A parent key mus
4b80: 74 20 62 65 20 65 69 74 68 65 72 20 61 20 50 52  t be either a PR
4b90: 49 4d 41 52 59 20 4b 45 59 2c 20 73 75 62 6a 65  IMARY KEY, subje
4ba0: 63 74 20 74 6f 20 61 20 55 4e 49 51 55 45 20 0a  ct to a UNIQUE .
4bb0: 23 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72  # constraint, or
4bc0: 20 68 61 76 65 20 61 20 55 4e 49 51 55 45 20 69   have a UNIQUE i
4bd0: 6e 64 65 78 20 63 72 65 61 74 65 64 20 6f 6e 20  ndex created on 
4be0: 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  it..#.# EVIDENCE
4bf0: 2d 4f 46 3a 20 52 2d 31 33 34 33 35 2d 32 36 33  -OF: R-13435-263
4c00: 31 31 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  11 Usually, the 
4c10: 70 61 72 65 6e 74 20 6b 65 79 20 6f 66 20 61 20  parent key of a 
4c20: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f  foreign key.# co
4c30: 6e 73 74 72 61 69 6e 74 20 69 73 20 74 68 65 20  nstraint is the 
4c40: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
4c50: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
4c60: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
4c70: 20 74 68 65 0a 23 20 70 72 69 6d 61 72 79 20 6b   the.# primary k
4c80: 65 79 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72  ey, then the par
4c90: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
4ca0: 6d 75 73 74 20 62 65 20 63 6f 6c 6c 65 63 74 69  must be collecti
4cb0: 76 65 6c 79 20 73 75 62 6a 65 63 74 0a 23 20 74  vely subject.# t
4cc0: 6f 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  o a UNIQUE const
4cd0: 72 61 69 6e 74 20 6f 72 20 68 61 76 65 20 61 20  raint or have a 
4ce0: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 20  UNIQUE index..# 
4cf0: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
4d00: 74 20 69 66 20 61 20 70 61 72 65 6e 74 20 6b 65  t if a parent ke
4d10: 79 20 69 73 20 6e 6f 74 20 73 75 62 6a 65 63 74  y is not subject
4d20: 20 74 6f 20 61 20 50 52 49 4d 41 52 59 20 4b 45   to a PRIMARY KE
4d30: 59 20 6f 72 20 55 4e 49 51 55 45 0a 23 20 63 6f  Y or UNIQUE.# co
4d40: 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 64 6f  nstraint, but do
4d50: 65 73 20 68 61 76 65 20 61 20 55 4e 49 51 55 45  es have a UNIQUE
4d60: 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 6f   index created o
4d70: 6e 20 69 74 2c 20 74 68 65 6e 20 74 68 65 20 55  n it, then the U
4d80: 4e 49 51 55 45 20 69 6e 64 65 78 0a 23 20 6d 75  NIQUE index.# mu
4d90: 73 74 20 75 73 65 20 74 68 65 20 64 65 66 61 75  st use the defau
4da0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
4db0: 75 65 6e 63 65 73 20 61 73 73 6f 63 69 61 74 65  uences associate
4dc0: 64 20 77 69 74 68 20 74 68 65 20 70 61 72 65 6e  d with the paren
4dd0: 74 20 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 2e  t key.# columns.
4de0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
4df0: 3a 20 52 2d 30 30 33 37 36 2d 33 39 32 31 32 20  : R-00376-39212 
4e00: 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  If the parent ke
4e10: 79 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 61  y columns have a
4e20: 20 55 4e 49 51 55 45 0a 23 20 69 6e 64 65 78 2c   UNIQUE.# index,
4e30: 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
4e40: 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 63 6f   must use the co
4e50: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4e60: 73 20 74 68 61 74 20 61 72 65 0a 23 20 73 70 65  s that are.# spe
4e70: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 43 52  cified in the CR
4e80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4e90: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 61 72  ment for the par
4ea0: 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 64 72 6f  ent table..#.dro
4eb0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
4ec0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 38 2e 31  test e_fkey-18.1
4ed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4ef0: 74 32 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t2(a REFERENCES 
4f00: 74 31 28 78 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  t1(x));.  }.} {}
4f10: 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79  .proc test_efkey
4f20: 5f 35 37 20 7b 74 6e 20 69 73 45 72 72 6f 72 20  _57 {tn isError 
4f30: 73 71 6c 7d 20 7b 0a 20 20 63 61 74 63 68 73 71  sql} {.  catchsq
4f40: 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74  l { DROP TABLE t
4f50: 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 24 73  1 }.  execsql $s
4f60: 71 6c 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  ql.  do_test e_f
4f70: 6b 65 79 2d 31 38 2e 24 74 6e 20 7b 0a 20 20 20  key-18.$tn {.   
4f80: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
4f90: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4fa0: 53 28 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 5b 6c  S(NULL) }.  } [l
4fb0: 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31  index {{0 {}} {1
4fc0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
4fd0: 73 6d 61 74 63 68 7d 7d 7d 20 24 69 73 45 72 72  smatch}}} $isErr
4fe0: 6f 72 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79  or].}.test_efkey
4ff0: 5f 35 37 20 32 20 30 20 7b 20 43 52 45 41 54 45  _57 2 0 { CREATE
5000: 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d   TABLE t1(x PRIM
5010: 41 52 59 20 4b 45 59 29 20 7d 0a 74 65 73 74 5f  ARY KEY) }.test_
5020: 65 66 6b 65 79 5f 35 37 20 33 20 30 20 7b 20 43  efkey_57 3 0 { C
5030: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5040: 20 55 4e 49 51 55 45 29 20 7d 0a 74 65 73 74 5f   UNIQUE) }.test_
5050: 65 66 6b 65 79 5f 35 37 20 34 20 30 20 7b 20 43  efkey_57 4 0 { C
5060: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5070: 29 3b 20 43 52 45 41 54 45 20 55 4e 49 51 55 45  ); CREATE UNIQUE
5080: 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31   INDEX t1i ON t1
5090: 28 78 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79  (x) }.test_efkey
50a0: 5f 35 37 20 35 20 31 20 7b 20 0a 20 20 43 52 45  _57 5 1 { .  CRE
50b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
50c0: 20 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55   .  CREATE UNIQU
50d0: 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74  E INDEX t1i ON t
50e0: 31 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  1(x COLLATE noca
50f0: 73 65 29 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65  se);.}.test_efke
5100: 79 5f 35 37 20 36 20 31 20 7b 20 43 52 45 41 54  y_57 6 1 { CREAT
5110: 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 7d 0a  E TABLE t1(x) }.
5120: 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 37 20  test_efkey_57 7 
5130: 31 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  1 { CREATE TABLE
5140: 20 74 31 28 78 2c 20 79 2c 20 50 52 49 4d 41 52   t1(x, y, PRIMAR
5150: 59 20 4b 45 59 28 78 2c 20 79 29 29 20 7d 0a 74  Y KEY(x, y)) }.t
5160: 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 38 20 31  est_efkey_57 8 1
5170: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
5180: 74 31 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28  t1(x, y, UNIQUE(
5190: 78 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f 65 66  x, y)) }.test_ef
51a0: 6b 65 79 5f 35 37 20 39 20 31 20 7b 20 0a 20 20  key_57 9 1 { .  
51b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
51c0: 78 2c 20 79 29 3b 20 0a 20 20 43 52 45 41 54 45  x, y); .  CREATE
51d0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 31   UNIQUE INDEX t1
51e0: 69 20 4f 4e 20 74 31 28 78 2c 20 79 29 3b 0a 7d  i ON t1(x, y);.}
51f0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5240: 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
5250: 20 61 6e 20 65 78 61 6d 70 6c 65 20 69 6e 20 66   an example in f
5260: 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
5270: 20 53 65 76 65 72 61 6c 20 74 65 73 74 61 62 6c   Several testabl
5280: 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 72  e.# statements r
5290: 65 66 65 72 20 74 6f 20 74 68 69 73 20 65 78 61  efer to this exa
52a0: 6d 70 6c 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  mple, as follows
52b0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
52c0: 3a 20 52 2d 32 37 34 38 34 2d 30 31 34 36 37 0a  : R-27484-01467.
52d0: 23 0a 23 20 46 4b 20 43 6f 6e 73 74 72 61 69 6e  #.# FK Constrain
52e0: 74 73 20 6f 6e 20 63 68 69 6c 64 31 2c 20 63 68  ts on child1, ch
52f0: 69 6c 64 32 20 61 6e 64 20 63 68 69 6c 64 33 20  ild2 and child3 
5300: 61 72 65 20 4f 6b 2e 0a 23 0a 23 20 50 72 6f 62  are Ok..#.# Prob
5310: 6c 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63  lem with FK on c
5320: 68 69 6c 64 34 3a 0a 23 0a 23 20 45 56 49 44 45  hild4:.#.# EVIDE
5330: 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 30 33 39 2d  NCE-OF: R-51039-
5340: 34 34 38 34 30 20 54 68 65 20 66 6f 72 65 69 67  44840 The foreig
5350: 6e 20 6b 65 79 20 64 65 63 6c 61 72 65 64 20 61  n key declared a
5360: 73 20 70 61 72 74 20 6f 66 20 74 61 62 6c 65 0a  s part of table.
5370: 23 20 63 68 69 6c 64 34 20 69 73 20 61 6e 20 65  # child4 is an e
5380: 72 72 6f 72 20 62 65 63 61 75 73 65 20 65 76 65  rror because eve
5390: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 70 61 72  n though the par
53a0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ent key column i
53b0: 73 0a 23 20 69 6e 64 65 78 65 64 2c 20 74 68 65  s.# indexed, the
53c0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 55 4e   index is not UN
53d0: 49 51 55 45 2e 0a 23 0a 23 20 50 72 6f 62 6c 65  IQUE..#.# Proble
53e0: 6d 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68 69  m with FK on chi
53f0: 6c 64 35 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43  ld5:.#.# EVIDENC
5400: 45 2d 4f 46 3a 20 52 2d 30 31 30 36 30 2d 34 38  E-OF: R-01060-48
5410: 37 38 38 20 54 68 65 20 66 6f 72 65 69 67 6e 20  788 The foreign 
5420: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 20 63 68  key for table ch
5430: 69 6c 64 35 20 69 73 20 61 6e 0a 23 20 65 72 72  ild5 is an.# err
5440: 6f 72 20 62 65 63 61 75 73 65 20 65 76 65 6e 20  or because even 
5450: 74 68 6f 75 67 68 20 74 68 65 20 70 61 72 65 6e  though the paren
5460: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 68 61 73  t key column has
5470: 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2c   a unique index,
5480: 0a 23 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  .# the index use
5490: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6f  s a different co
54a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
54b0: 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69  ..#.# Problem wi
54c0: 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 36 20  th FK on child6 
54d0: 61 6e 64 20 63 68 69 6c 64 37 3a 0a 23 0a 23 20  and child7:.#.# 
54e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
54f0: 33 30 38 38 2d 33 37 34 36 39 20 54 61 62 6c 65  3088-37469 Table
5500: 73 20 63 68 69 6c 64 36 20 61 6e 64 20 63 68 69  s child6 and chi
5510: 6c 64 37 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ld7 are incorrec
5520: 74 0a 23 20 62 65 63 61 75 73 65 20 77 68 69 6c  t.# because whil
5530: 65 20 62 6f 74 68 20 68 61 76 65 20 55 4e 49 51  e both have UNIQ
5540: 55 45 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  UE indices on th
5550: 65 69 72 20 70 61 72 65 6e 74 20 6b 65 79 73 2c  eir parent keys,
5560: 20 74 68 65 20 6b 65 79 73 0a 23 20 61 72 65 20   the keys.# are 
5570: 6e 6f 74 20 61 6e 20 65 78 61 63 74 20 6d 61 74  not an exact mat
5580: 63 68 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ch to the column
5590: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 4e  s of a single UN
55a0: 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 64 72  IQUE index..#.dr
55b0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
55c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e  _test e_fkey-19.
55d0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
55e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
55f0: 20 70 61 72 65 6e 74 28 61 20 50 52 49 4d 41 52   parent(a PRIMAR
5600: 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 2c  Y KEY, b UNIQUE,
5610: 20 63 2c 20 64 2c 20 65 2c 20 66 29 3b 0a 20 20   c, d, e, f);.  
5620: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
5630: 49 4e 44 45 58 20 69 31 20 4f 4e 20 70 61 72 65  INDEX i1 ON pare
5640: 6e 74 28 63 2c 20 64 29 3b 0a 20 20 20 20 43 52  nt(c, d);.    CR
5650: 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
5660: 20 70 61 72 65 6e 74 28 65 29 3b 0a 20 20 20 20   parent(e);.    
5670: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
5680: 44 45 58 20 69 33 20 4f 4e 20 70 61 72 65 6e 74  DEX i3 ON parent
5690: 28 66 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (f COLLATE nocas
56a0: 65 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  e);..    CREATE 
56b0: 54 41 42 4c 45 20 63 68 69 6c 64 31 28 66 2c 20  TABLE child1(f, 
56c0: 67 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  g REFERENCES par
56d0: 65 6e 74 28 61 29 29 3b 20 20 20 20 20 20 20 20  ent(a));        
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
56f0: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
5700: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 68 2c 20  TABLE child2(h, 
5710: 69 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  i REFERENCES par
5720: 65 6e 74 28 62 29 29 3b 20 20 20 20 20 20 20 20  ent(b));        
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
5740: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
5750: 54 41 42 4c 45 20 63 68 69 6c 64 33 28 6a 2c 20  TABLE child3(j, 
5760: 6b 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  k, FOREIGN KEY(j
5770: 2c 20 6b 29 20 52 45 46 45 52 45 4e 43 45 53 20  , k) REFERENCES 
5780: 70 61 72 65 6e 74 28 63 2c 20 64 29 29 3b 20 2d  parent(c, d)); -
5790: 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45 20  - Ok.    CREATE 
57a0: 54 41 42 4c 45 20 63 68 69 6c 64 34 28 6c 2c 20  TABLE child4(l, 
57b0: 6d 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  m REFERENCES par
57c0: 65 6e 74 28 65 29 29 3b 20 20 20 20 20 20 20 20  ent(e));        
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
57e0: 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45  - Err.    CREATE
57f0: 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28 6e 2c   TABLE child5(n,
5800: 20 6f 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   o REFERENCES pa
5810: 72 65 6e 74 28 66 29 29 3b 20 20 20 20 20 20 20  rent(f));       
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41 54  -- Err.    CREAT
5840: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36 28 70  E TABLE child6(p
5850: 2c 20 71 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , q, FOREIGN KEY
5860: 28 70 2c 71 29 20 52 45 46 45 52 45 4e 43 45 53  (p,q) REFERENCES
5870: 20 70 61 72 65 6e 74 28 62 2c 20 63 29 29 3b 20   parent(b, c)); 
5880: 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52 45 41   -- Err.    CREA
5890: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28  TE TABLE child7(
58a0: 72 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  r REFERENCES par
58b0: 65 6e 74 28 63 29 29 3b 20 20 20 20 20 20 20 20  ent(c));        
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b    -- Err.  }.} {
58e0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
58f0: 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -19.2 {.  execsq
5900: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
5910: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
5920: 53 28 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c  S(1, 2, 3, 4, 5,
5930: 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   6);.    INSERT 
5940: 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
5950: 45 53 28 27 78 78 78 27 2c 20 31 29 3b 0a 20 20  ES('xxx', 1);.  
5960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
5970: 69 6c 64 32 20 56 41 4c 55 45 53 28 27 78 78 78  ild2 VALUES('xxx
5980: 27 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 2);.    INSER
5990: 54 20 49 4e 54 4f 20 63 68 69 6c 64 33 20 56 41  T INTO child3 VA
59a0: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a  LUES(3, 4);.  }.
59b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
59c0: 6b 65 79 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74  key-19.2 {.  cat
59d0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
59e0: 4e 54 4f 20 63 68 69 6c 64 34 20 56 41 4c 55 45  NTO child4 VALUE
59f0: 53 28 27 78 78 78 27 2c 20 35 29 20 7d 0a 7d 20  S('xxx', 5) }.} 
5a00: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
5a10: 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65  mismatch}}.do_te
5a20: 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 33 20 7b  st e_fkey-19.3 {
5a30: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
5a40: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 35  SERT INTO child5
5a50: 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20 36   VALUES('xxx', 6
5a60: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
5a70: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
5a80: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
5a90: 31 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  19.4 {.  catchsq
5aa0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
5ab0: 63 68 69 6c 64 36 20 56 41 4c 55 45 53 28 32 2c  child6 VALUES(2,
5ac0: 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65   3) }.} {1 {fore
5ad0: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
5ae0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
5af0: 79 2d 31 39 2e 35 20 7b 0a 20 20 63 61 74 63 68  y-19.5 {.  catch
5b00: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5b10: 4f 20 63 68 69 6c 64 37 20 56 41 4c 55 45 53 28  O child7 VALUES(
5b20: 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  3) }.} {1 {forei
5b30: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d  gn key mismatch}
5b40: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
5b90: 54 65 73 74 20 65 72 72 6f 72 73 20 69 6e 20 74  Test errors in t
5ba0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
5bb0: 6d 61 20 74 68 61 74 20 61 72 65 20 64 65 74 65  ma that are dete
5bc0: 63 74 65 64 20 77 68 69 6c 65 20 70 72 65 70 61  cted while prepa
5bd0: 72 69 6e 67 0a 23 20 44 4d 4c 20 73 74 61 74 65  ring.# DML state
5be0: 6d 65 6e 74 73 2e 20 54 68 65 20 65 72 72 6f 72  ments. The error
5bf0: 20 74 65 78 74 20 66 6f 72 20 74 68 65 73 65 20   text for these 
5c00: 6d 65 73 73 61 67 65 73 20 61 6c 77 61 79 73 20  messages always 
5c10: 6d 61 74 63 68 65 73 20 0a 23 20 65 69 74 68 65  matches .# eithe
5c20: 72 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  r "foreign key m
5c30: 69 73 6d 61 74 63 68 22 20 6f 72 20 22 6e 6f 20  ismatch" or "no 
5c40: 73 75 63 68 20 74 61 62 6c 65 2a 22 20 28 75 73  such table*" (us
5c50: 69 6e 67 20 5b 73 74 72 69 6e 67 20 6d 61 74 63  ing [string matc
5c60: 68 5d 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  h])..#.# EVIDENC
5c70: 45 2d 4f 46 3a 20 52 2d 34 35 34 38 38 2d 30 38  E-OF: R-45488-08
5c80: 35 30 34 20 49 66 20 74 68 65 20 64 61 74 61 62  504 If the datab
5c90: 61 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74 61  ase schema conta
5ca0: 69 6e 73 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a  ins foreign key.
5cb0: 23 20 65 72 72 6f 72 73 20 74 68 61 74 20 72 65  # errors that re
5cc0: 71 75 69 72 65 20 6c 6f 6f 6b 69 6e 67 20 61 74  quire looking at
5cd0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74   more than one t
5ce0: 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  able definition 
5cf0: 74 6f 0a 23 20 69 64 65 6e 74 69 66 79 2c 20 74  to.# identify, t
5d00: 68 65 6e 20 74 68 6f 73 65 20 65 72 72 6f 72 73  hen those errors
5d10: 20 61 72 65 20 6e 6f 74 20 64 65 74 65 63 74 65   are not detecte
5d20: 64 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  d when the table
5d30: 73 20 61 72 65 0a 23 20 63 72 65 61 74 65 64 2e  s are.# created.
5d40: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
5d50: 3a 20 52 2d 34 38 33 39 31 2d 33 38 34 37 32 20  : R-48391-38472 
5d60: 49 6e 73 74 65 61 64 2c 20 73 75 63 68 20 65 72  Instead, such er
5d70: 72 6f 72 73 20 70 72 65 76 65 6e 74 20 74 68 65  rors prevent the
5d80: 0a 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 66  .# application f
5d90: 72 6f 6d 20 70 72 65 70 61 72 69 6e 67 20 53 51  rom preparing SQ
5da0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  L statements tha
5db0: 74 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e  t modify the con
5dc0: 74 65 6e 74 20 6f 66 0a 23 20 74 68 65 20 63 68  tent of.# the ch
5dd0: 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 74 61  ild or parent ta
5de0: 62 6c 65 73 20 69 6e 20 77 61 79 73 20 74 68 61  bles in ways tha
5df0: 74 20 75 73 65 20 74 68 65 20 66 6f 72 65 69 67  t use the foreig
5e00: 6e 20 6b 65 79 73 2e 0a 23 0a 23 20 45 56 49 44  n keys..#.# EVID
5e10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 31 30 38  ENCE-OF: R-03108
5e20: 2d 36 33 36 35 39 20 54 68 65 20 45 6e 67 6c 69  -63659 The Engli
5e30: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
5e40: 72 20 6d 65 73 73 61 67 65 20 66 6f 72 0a 23 20  r message for.# 
5e50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20  foreign key DML 
5e60: 65 72 72 6f 72 73 20 69 73 20 75 73 75 61 6c 6c  errors is usuall
5e70: 79 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  y "foreign key m
5e80: 69 73 6d 61 74 63 68 22 20 62 75 74 20 63 61 6e  ismatch" but can
5e90: 20 61 6c 73 6f 0a 23 20 62 65 20 22 6e 6f 20 73   also.# be "no s
5ea0: 75 63 68 20 74 61 62 6c 65 22 20 69 66 20 74 68  uch table" if th
5eb0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64  e parent table d
5ec0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23  oes not exist..#
5ed0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5ee0: 52 2d 36 30 37 38 31 2d 32 36 35 37 36 20 46 6f  R-60781-26576 Fo
5ef0: 72 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72  reign key DML er
5f00: 72 6f 72 73 20 61 72 65 20 6d 61 79 20 62 65 20  rors are may be 
5f10: 72 65 70 6f 72 74 65 64 0a 23 20 69 66 3a 20 54  reported.# if: T
5f20: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
5f30: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
5f40: 6f 72 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65  or The parent ke
5f50: 79 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 0a  y columns named.
5f60: 23 20 69 6e 20 74 68 65 20 66 6f 72 65 69 67 6e  # in the foreign
5f70: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
5f80: 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  do not exist, or
5f90: 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   The parent key 
5fa0: 63 6f 6c 75 6d 6e 73 0a 23 20 6e 61 6d 65 64 20  columns.# named 
5fb0: 69 6e 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  in the foreign k
5fc0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72  ey constraint ar
5fd0: 65 20 6e 6f 74 20 74 68 65 20 70 72 69 6d 61 72  e not the primar
5fe0: 79 20 6b 65 79 20 6f 66 20 74 68 65 0a 23 20 70  y key of the.# p
5ff0: 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
6000: 61 72 65 20 6e 6f 74 20 73 75 62 6a 65 63 74 20  are not subject 
6010: 74 6f 20 61 20 75 6e 69 71 75 65 20 63 6f 6e 73  to a unique cons
6020: 74 72 61 69 6e 74 20 75 73 69 6e 67 0a 23 20 63  traint using.# c
6030: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
6040: 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
6050: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 2c  he CREATE TABLE,
6060: 20 6f 72 20 54 68 65 20 63 68 69 6c 64 20 74 61   or The child ta
6070: 62 6c 65 0a 23 20 72 65 66 65 72 65 6e 63 65 73  ble.# references
6080: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
6090: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 77   of the parent w
60a0: 69 74 68 6f 75 74 20 73 70 65 63 69 66 79 69 6e  ithout specifyin
60b0: 67 20 74 68 65 0a 23 20 70 72 69 6d 61 72 79 20  g the.# primary 
60c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  key columns and 
60d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  the number of pr
60e0: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
60f0: 73 20 69 6e 20 74 68 65 0a 23 20 70 61 72 65 6e  s in the.# paren
6100: 74 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  t do not match t
6110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 69  he number of chi
6120: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a  ld key columns..
6130: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
6140: 2d 32 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -20.1 {.  execsq
6150: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
6160: 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
6170: 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65  NCES nosuchtable
6180: 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  , d);..    CREAT
6190: 45 20 54 41 42 4c 45 20 70 32 28 61 2c 20 62 2c  E TABLE p2(a, b,
61a0: 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a   UNIQUE(a, b));.
61b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
61c0: 20 63 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c2(c, d, FOREIG
61d0: 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
61e0: 52 45 4e 43 45 53 20 70 32 28 61 2c 20 78 29 29  RENCES p2(a, x))
61f0: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6200: 42 4c 45 20 70 33 28 61 20 50 52 49 4d 41 52 59  BLE p3(a PRIMARY
6210: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
6220: 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 63 20  EATE TABLE c3(c 
6230: 52 45 46 45 52 45 4e 43 45 53 20 70 33 28 62 29  REFERENCES p3(b)
6240: 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41 54  , d);..    CREAT
6250: 45 20 54 41 42 4c 45 20 70 34 28 61 20 50 52 49  E TABLE p4(a PRI
6260: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
6270: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
6280: 49 4e 44 45 58 20 70 34 69 20 4f 4e 20 70 34 28  INDEX p4i ON p4(
6290: 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  b COLLATE nocase
62a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
62b0: 42 4c 45 20 63 34 28 63 20 52 45 46 45 52 45 4e  BLE c4(c REFEREN
62c0: 43 45 53 20 70 34 28 62 29 2c 20 64 29 3b 0a 0a  CES p4(b), d);..
62d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
62e0: 20 70 35 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p5(a PRIMARY KE
62f0: 59 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  Y, b COLLATE noc
6300: 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ase);.    CREATE
6310: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 35   UNIQUE INDEX p5
6320: 69 20 4f 4e 20 70 35 28 62 20 43 4f 4c 4c 41 54  i ON p5(b COLLAT
6330: 45 20 62 69 6e 61 72 79 29 3b 0a 20 20 20 20 43  E binary);.    C
6340: 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28 63  REATE TABLE c5(c
6350: 20 52 45 46 45 52 45 4e 43 45 53 20 70 35 28 62   REFERENCES p5(b
6360: 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  ), d);..    CREA
6370: 54 45 20 54 41 42 4c 45 20 70 36 28 61 20 50 52  TE TABLE p6(a PR
6380: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
6390: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
63a0: 63 36 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c6(c, d, FOREIGN
63b0: 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
63c0: 45 4e 43 45 53 20 70 36 29 3b 0a 0a 20 20 20 20  ENCES p6);..    
63d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 37 28  CREATE TABLE p7(
63e0: 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
63f0: 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52  Y(a, b));.    CR
6400: 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 63 2c  EATE TABLE c7(c,
6410: 20 64 20 52 45 46 45 52 45 4e 43 45 53 20 70 37   d REFERENCES p7
6420: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72  );.  }.} {}..for
6430: 65 61 63 68 20 7b 74 6e 20 74 62 6c 20 70 74 62  each {tn tbl ptb
6440: 6c 20 65 72 72 7d 20 7b 0a 20 20 32 20 63 31 20  l err} {.  2 c1 
6450: 7b 7d 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  {} "no such tabl
6460: 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61  e: main.nosuchta
6470: 62 6c 65 22 0a 20 20 33 20 63 32 20 70 32 20 22  ble".  3 c2 p2 "
6480: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6490: 61 74 63 68 22 0a 20 20 34 20 63 33 20 70 33 20  atch".  4 c3 p3 
64a0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
64b0: 6d 61 74 63 68 22 0a 20 20 35 20 63 34 20 70 34  match".  5 c4 p4
64c0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
64d0: 73 6d 61 74 63 68 22 0a 20 20 36 20 63 35 20 70  smatch".  6 c5 p
64e0: 35 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  5 "foreign key m
64f0: 69 73 6d 61 74 63 68 22 0a 20 20 37 20 63 36 20  ismatch".  7 c6 
6500: 70 36 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  p6 "foreign key 
6510: 6d 69 73 6d 61 74 63 68 22 0a 20 20 38 20 63 37  mismatch".  8 c7
6520: 20 70 37 20 22 66 6f 72 65 69 67 6e 20 6b 65 79   p7 "foreign key
6530: 20 6d 69 73 6d 61 74 63 68 22 0a 7d 20 7b 0a 20   mismatch".} {. 
6540: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
6550: 32 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63  20.$tn.1 {.    c
6560: 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54 20  atchsql "INSERT 
6570: 49 4e 54 4f 20 24 74 62 6c 20 56 41 4c 55 45 53  INTO $tbl VALUES
6580: 28 27 61 27 2c 20 27 62 27 29 22 0a 20 20 7d 20  ('a', 'b')".  } 
6590: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
65a0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
65b0: 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63 61  0.$tn.2 {.    ca
65c0: 74 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 24  tchsql "UPDATE $
65d0: 74 62 6c 20 53 45 54 20 63 20 3d 20 3f 2c 20 64  tbl SET c = ?, d
65e0: 20 3d 20 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20   = ?".  } [list 
65f0: 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73  1 $err].  do_tes
6600: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
6610: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
6620: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74   "INSERT INTO $t
6630: 62 6c 20 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a  bl SELECT ?, ?".
6640: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
6650: 5d 0a 0a 20 20 69 66 20 7b 24 70 74 62 6c 20 6e  ]..  if {$ptbl n
6660: 65 20 22 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74  e ""} {.    do_t
6670: 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74  est e_fkey-20.$t
6680: 6e 2e 34 20 7b 0a 20 20 20 20 20 20 63 61 74 63  n.4 {.      catc
6690: 68 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  hsql "DELETE FRO
66a0: 4d 20 24 70 74 62 6c 22 0a 20 20 20 20 7d 20 5b  M $ptbl".    } [
66b0: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20 20  list 1 $err].   
66c0: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
66d0: 32 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 20  20.$tn.5 {.     
66e0: 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41 54   catchsql "UPDAT
66f0: 45 20 24 70 74 62 6c 20 53 45 54 20 61 20 3d 20  E $ptbl SET a = 
6700: 3f 2c 20 62 20 3d 20 3f 22 0a 20 20 20 20 7d 20  ?, b = ?".    } 
6710: 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20  [list 1 $err].  
6720: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
6730: 2d 32 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -20.$tn.6 {.    
6740: 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45    catchsql "INSE
6750: 52 54 20 49 4e 54 4f 20 24 70 74 62 6c 20 53 45  RT INTO $ptbl SE
6760: 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20 20 20 7d  LECT ?, ?".    }
6770: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 20   [list 1 $err]. 
6780: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
67e0: 52 2d 31 39 33 35 33 2d 34 33 36 34 33 0a 23 0a  R-19353-43643.#.
67f0: 23 20 54 65 73 74 20 74 68 65 20 65 78 61 6d 70  # Test the examp
6800: 6c 65 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65  le of foreign ke
6810: 79 20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72  y mismatch error
6820: 73 20 63 61 75 73 65 64 20 62 79 20 69 6d 70 6c  s caused by impl
6830: 69 63 69 74 6c 79 0a 23 20 6d 61 70 70 69 6e 67  icitly.# mapping
6840: 20 61 20 63 68 69 6c 64 20 6b 65 79 20 74 6f 20   a child key to 
6850: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
6860: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  of the parent ta
6870: 62 6c 65 20 77 68 65 6e 20 74 68 65 0a 23 20 63  ble when the.# c
6880: 68 69 6c 64 20 6b 65 79 20 63 6f 6e 73 69 73 74  hild key consist
6890: 73 20 6f 66 20 61 20 64 69 66 66 65 72 65 6e 74  s of a different
68a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
68b0: 6e 73 20 74 6f 20 74 68 61 74 20 70 72 69 6d 61  ns to that prima
68c0: 72 79 20 6b 65 79 2e 0a 23 20 0a 64 72 6f 70 5f  ry key..# .drop_
68d0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
68e0: 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 31 20 7b  st e_fkey-21.1 {
68f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6900: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
6910: 72 65 6e 74 32 28 61 2c 20 62 2c 20 50 52 49 4d  rent2(a, b, PRIM
6920: 41 52 59 20 4b 45 59 28 61 2c 62 29 29 3b 0a 0a  ARY KEY(a,b));..
6930: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6940: 20 63 68 69 6c 64 38 28 78 2c 20 79 2c 20 46 4f   child8(x, y, FO
6950: 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20 52  REIGN KEY(x,y) R
6960: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
6970: 32 29 3b 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20  2);     -- Ok.  
6980: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
6990: 68 69 6c 64 39 28 78 20 52 45 46 45 52 45 4e 43  hild9(x REFERENC
69a0: 45 53 20 70 61 72 65 6e 74 32 29 3b 20 20 20 20  ES parent2);    
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 20 20 20 20 2d 2d 20 45 72 72 0a 20 20 20        -- Err.   
69d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
69e0: 69 6c 64 31 30 28 78 2c 79 2c 7a 2c 20 46 4f 52  ild10(x,y,z, FOR
69f0: 45 49 47 4e 20 4b 45 59 28 78 2c 79 2c 7a 29 20  EIGN KEY(x,y,z) 
6a00: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
6a10: 74 32 29 3b 20 2d 2d 20 45 72 72 0a 20 20 7d 0a  t2); -- Err.  }.
6a20: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6a30: 6b 65 79 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65  key-21.2 {.  exe
6a40: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
6a50: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 32 20 56  T INTO parent2 V
6a60: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
6a70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6a80: 4f 20 63 68 69 6c 64 38 20 56 41 4c 55 45 53 28  O child8 VALUES(
6a90: 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 7d 0a  'I', 'II');.  }.
6aa0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
6ab0: 6b 65 79 2d 32 31 2e 33 20 7b 0a 20 20 63 61 74  key-21.3 {.  cat
6ac0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
6ad0: 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45  NTO child9 VALUE
6ae0: 53 28 27 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66  S('I') }.} {1 {f
6af0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6b00: 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  tch}}.do_test e_
6b10: 66 6b 65 79 2d 32 31 2e 34 20 7b 0a 20 20 63 61  fkey-21.4 {.  ca
6b20: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6b30: 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55  INTO child9 VALU
6b40: 45 53 28 27 49 49 27 29 20 7d 0a 7d 20 7b 31 20  ES('II') }.} {1 
6b50: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6b60: 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20  match}}.do_test 
6b70: 65 5f 66 6b 65 79 2d 32 31 2e 35 20 7b 0a 20 20  e_fkey-21.5 {.  
6b80: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
6b90: 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20 56 41  T INTO child9 VA
6ba0: 4c 55 45 53 28 4e 55 4c 4c 29 20 7d 0a 7d 20 7b  LUES(NULL) }.} {
6bb0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
6bc0: 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73  ismatch}}.do_tes
6bd0: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 36 20 7b 0a  t e_fkey-21.6 {.
6be0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6bf0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30  ERT INTO child10
6c00: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
6c10: 27 2c 20 27 49 49 49 27 29 20 7d 0a 7d 20 7b 31  ', 'III') }.} {1
6c20: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6c30: 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74  smatch}}.do_test
6c40: 20 65 5f 66 6b 65 79 2d 32 31 2e 37 20 7b 0a 20   e_fkey-21.7 {. 
6c50: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
6c60: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20  RT INTO child10 
6c70: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 20  VALUES(1, 2, 3) 
6c80: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
6c90: 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64  key mismatch}}.d
6ca0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31  o_test e_fkey-21
6cb0: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
6cc0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68  { INSERT INTO ch
6cd0: 69 6c 64 31 30 20 56 41 4c 55 45 53 28 4e 55 4c  ild10 VALUES(NUL
6ce0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d  L, NULL, NULL) }
6cf0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
6d00: 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 23  ey mismatch}}..#
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
6d60: 20 65 72 72 6f 72 73 20 74 68 61 74 20 61 72 65   errors that are
6d70: 20 72 65 70 6f 72 74 65 64 20 77 68 65 6e 20 63   reported when c
6d80: 72 65 61 74 69 6e 67 20 74 68 65 20 63 68 69 6c  reating the chil
6d90: 64 20 74 61 62 6c 65 2e 20 0a 23 20 53 70 65 63  d table. .# Spec
6da0: 69 66 69 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20  ifically:.#.#   
6db0: 2a 20 64 69 66 66 65 72 65 6e 74 20 6e 75 6d 62  * different numb
6dc0: 65 72 20 6f 66 20 63 68 69 6c 64 20 61 6e 64 20  er of child and 
6dd0: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
6de0: 6e 73 2c 20 61 6e 64 0a 23 20 20 20 2a 20 63 68  ns, and.#   * ch
6df0: 69 6c 64 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ild columns that
6e00: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23   do not exist..#
6e10: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
6e20: 52 2d 32 33 36 38 32 2d 35 39 38 32 30 20 42 79  R-23682-59820 By
6e30: 20 63 6f 6e 74 72 61 73 74 2c 20 69 66 20 66 6f   contrast, if fo
6e40: 72 65 69 67 6e 20 6b 65 79 20 65 72 72 6f 72 73  reign key errors
6e50: 20 63 61 6e 20 62 65 0a 23 20 72 65 63 6f 67 6e   can be.# recogn
6e60: 69 7a 65 64 20 73 69 6d 70 6c 79 20 62 79 20 6c  ized simply by l
6e70: 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 64 65  ooking at the de
6e80: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
6e90: 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 0a  child table and.
6ea0: 23 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  # without having
6eb0: 20 74 6f 20 63 6f 6e 73 75 6c 74 20 74 68 65 20   to consult the 
6ec0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 65 66  parent table def
6ed0: 69 6e 69 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  inition, then th
6ee0: 65 20 43 52 45 41 54 45 0a 23 20 54 41 42 4c 45  e CREATE.# TABLE
6ef0: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74   statement for t
6f00: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 66  he child table f
6f10: 61 69 6c 73 2e 0a 23 0a 23 20 54 68 65 73 65 20  ails..#.# These 
6f20: 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72  errors are repor
6f30: 74 65 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ted whether or n
6f40: 6f 74 20 46 4b 20 73 75 70 70 6f 72 74 20 69 73  ot FK support is
6f50: 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 23 20 45 56   enabled..#.# EV
6f60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 38  IDENCE-OF: R-338
6f70: 38 33 2d 32 38 38 33 33 20 46 6f 72 65 69 67 6e  83-28833 Foreign
6f80: 20 6b 65 79 20 44 44 4c 20 65 72 72 6f 72 73 20   key DDL errors 
6f90: 61 72 65 20 72 65 70 6f 72 74 65 64 0a 23 20 72  are reported.# r
6fa0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
6fb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65  ther or not fore
6fc0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
6fd0: 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20  nts are enabled 
6fe0: 77 68 65 6e 0a 23 20 74 68 65 20 74 61 62 6c 65  when.# the table
6ff0: 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64   is created..#.d
7000: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 66  rop_all_tables.f
7010: 6f 72 65 61 63 68 20 66 6b 20 5b 6c 69 73 74 20  oreach fk [list 
7020: 4f 46 46 20 4f 4e 5d 20 7b 0a 20 20 65 78 65 63  OFF ON] {.  exec
7030: 73 71 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  sql "PRAGMA fore
7040: 69 67 6e 5f 6b 65 79 73 20 3d 20 24 66 6b 22 0a  ign_keys = $fk".
7050: 20 20 73 65 74 20 69 20 30 0a 20 20 66 6f 72 65    set i 0.  fore
7060: 61 63 68 20 7b 73 71 6c 20 65 72 72 6f 72 7d 20  ach {sql error} 
7070: 7b 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  {.    "CREATE TA
7080: 42 4c 45 20 63 68 69 6c 64 31 28 61 2c 20 62 2c  BLE child1(a, b,
7090: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
70a0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  b) REFERENCES p(
70b0: 63 29 29 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62  c))".      {numb
70c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
70d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
70e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
70f0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7100: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
7110: 63 65 64 20 74 61 62 6c 65 7d 0a 20 20 20 20 22  ced table}.    "
7120: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
7130: 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47  ld2(a, b, FOREIG
7140: 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45  N KEY(a, b) REFE
7150: 52 45 4e 43 45 53 20 70 28 63 2c 20 64 2c 20 65  RENCES p(c, d, e
7160: 29 29 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65  ))".      {numbe
7170: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
7180: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
7190: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
71a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
71b0: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
71c0: 65 64 20 74 61 62 6c 65 7d 0a 20 20 20 20 22 43  ed table}.    "C
71d0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
71e0: 64 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  d2(a, b, FOREIGN
71f0: 20 4b 45 59 28 61 2c 20 63 29 20 52 45 46 45 52   KEY(a, c) REFER
7200: 45 4e 43 45 53 20 70 28 63 2c 20 64 29 29 22 0a  ENCES p(c, d))".
7210: 20 20 20 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63        {unknown c
7220: 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72  olumn "c" in for
7230: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
7240: 69 6f 6e 7d 0a 20 20 20 20 22 43 52 45 41 54 45  ion}.    "CREATE
7250: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c   TABLE child2(a,
7260: 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
7270: 63 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  c, b) REFERENCES
7280: 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20 20 20   p(c, d))".     
7290: 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   {unknown column
72a0: 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67 6e 20   "c" in foreign 
72b0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a  key definition}.
72c0: 20 20 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73    } {.    do_tes
72d0: 74 20 65 5f 66 6b 65 79 2d 32 32 2e 24 66 6b 2e  t e_fkey-22.$fk.
72e0: 5b 69 6e 63 72 20 69 5d 20 7b 0a 20 20 20 20 20  [incr i] {.     
72f0: 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c 0a 20   catchsql $sql. 
7300: 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72     } [list 1 $er
7310: 72 6f 72 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  ror].  }.}..#---
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7360: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
7370: 61 74 20 61 20 52 45 46 45 52 45 4e 43 49 4e 47  at a REFERENCING
7380: 20 63 6c 61 75 73 65 20 74 68 61 74 20 64 6f 65   clause that doe
7390: 73 20 6e 6f 74 20 73 70 65 63 69 66 79 20 70 61  s not specify pa
73a0: 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  rent key columns
73b0: 0a 23 20 69 6d 70 6c 69 63 69 74 6c 79 20 6d 61  .# implicitly ma
73c0: 70 73 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72  ps to the primar
73d0: 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72  y key of the par
73e0: 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45  ent table..#.# E
73f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
7400: 38 37 39 2d 30 38 30 32 35 20 41 74 74 61 63 68  879-08025 Attach
7410: 69 6e 67 20 61 20 22 52 45 46 45 52 45 4e 43 45  ing a "REFERENCE
7420: 53 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e  S <parent-table>
7430: 22 0a 23 20 63 6c 61 75 73 65 20 74 6f 20 61 20  ".# clause to a 
7440: 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
7450: 6e 20 63 72 65 61 74 65 73 20 61 20 66 6f 72 65  n creates a fore
7460: 69 67 6e 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72  ign.# key constr
7470: 61 69 6e 74 20 74 68 61 74 20 6d 61 70 73 20 74  aint that maps t
7480: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  he column to the
7490: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 0a   primary key of.
74a0: 23 20 3c 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e  # <parent-table>
74b0: 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ..# .do_test e_f
74c0: 6b 65 79 2d 32 33 2e 31 20 7b 0a 20 20 65 78 65  key-23.1 {.  exe
74d0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
74e0: 45 20 54 41 42 4c 45 20 70 31 28 61 2c 20 62 2c  E TABLE p1(a, b,
74f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
7500: 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
7510: 54 41 42 4c 45 20 70 32 28 61 2c 20 62 20 50 52  TABLE p2(a, b PR
7520: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
7530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
7540: 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
7550: 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
7560: 45 53 20 70 31 29 3b 0a 20 20 20 20 43 52 45 41  ES p1);.    CREA
7570: 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62  TE TABLE c2(a, b
7580: 20 52 45 46 45 52 45 4e 43 45 53 20 70 32 29 3b   REFERENCES p2);
7590: 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74  .  }.} {}.proc t
75a0: 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 7b 74 6e  est_efkey_60 {tn
75b0: 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a   isError sql} {.
75c0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
75d0: 2d 32 33 2e 24 74 6e 20 22 0a 20 20 20 20 63 61  -23.$tn ".    ca
75e0: 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20  tchsql {$sql}.  
75f0: 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d  " [lindex {{0 {}
7600: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
7610: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
7620: 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d  led}}} $isError]
7630: 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  .}..test_efkey_6
7640: 30 20 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e  0 2 1 "INSERT IN
7650: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32 33 39  TO c1 VALUES(239
7660: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
7670: 65 79 5f 36 30 20 33 20 30 20 22 49 4e 53 45 52  ey_60 3 0 "INSER
7680: 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53  T INTO p1 VALUES
7690: 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74  (239, 231)".test
76a0: 5f 65 66 6b 65 79 5f 36 30 20 34 20 30 20 22 49  _efkey_60 4 0 "I
76b0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
76c0: 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a  LUES(239, 231)".
76d0: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 35 20  test_efkey_60 5 
76e0: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  1 "INSERT INTO c
76f0: 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  2 VALUES(239, 23
7700: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  1)".test_efkey_6
7710: 30 20 36 20 30 20 22 49 4e 53 45 52 54 20 49 4e  0 6 0 "INSERT IN
7720: 54 4f 20 70 32 20 56 41 4c 55 45 53 28 32 33 39  TO p2 VALUES(239
7730: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
7740: 65 79 5f 36 30 20 37 20 30 20 22 49 4e 53 45 52  ey_60 7 0 "INSER
7750: 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53  T INTO c2 VALUES
7760: 28 32 33 39 2c 20 32 33 31 29 22 0a 0a 23 2d 2d  (239, 231)"..#--
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
77c0: 68 61 74 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20  hat an index on 
77d0: 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  on the child key
77e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46   columns of an F
77f0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23 20 69  K constraint.# i
7800: 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 23 0a 23 20  s optional..#.# 
7810: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7820: 35 34 31 37 2d 32 38 30 31 34 20 49 6e 64 69 63  5417-28014 Indic
7830: 65 73 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  es are not requi
7840: 72 65 64 20 66 6f 72 20 63 68 69 6c 64 20 6b 65  red for child ke
7850: 79 0a 23 20 63 6f 6c 75 6d 6e 73 0a 23 0a 23 20  y.# columns.#.# 
7860: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69  Also test that i
7870: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 72  f an index is cr
7880: 65 61 74 65 64 20 6f 6e 20 74 68 65 20 63 68 69  eated on the chi
7890: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20  ld key columns, 
78a0: 69 74 20 64 6f 65 73 0a 23 20 6e 6f 74 20 6d 61  it does.# not ma
78b0: 6b 65 20 61 20 64 69 66 66 65 72 65 6e 63 65 20  ke a difference 
78c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69  whether or not i
78d0: 74 20 69 73 20 61 20 55 4e 49 51 55 45 20 69 6e  t is a UNIQUE in
78e0: 64 65 78 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  dex..#.# EVIDENC
78f0: 45 2d 4f 46 3a 20 52 2d 31 35 37 34 31 2d 35 30  E-OF: R-15741-50
7900: 38 39 33 20 54 68 65 20 63 68 69 6c 64 20 6b 65  893 The child ke
7910: 79 20 69 6e 64 65 78 20 64 6f 65 73 20 6e 6f 74  y index does not
7920: 20 68 61 76 65 20 74 6f 20 62 65 0a 23 20 28 61   have to be.# (a
7930: 6e 64 20 75 73 75 61 6c 6c 79 20 77 69 6c 6c 20  nd usually will 
7940: 6e 6f 74 20 62 65 29 20 61 20 55 4e 49 51 55 45  not be) a UNIQUE
7950: 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61   index..#.drop_a
7960: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
7970: 74 20 65 5f 66 6b 65 79 2d 32 34 2e 31 20 7b 0a  t e_fkey-24.1 {.
7980: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7990: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
79a0: 65 6e 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  ent(x, y, UNIQUE
79b0: 28 79 2c 20 78 29 29 3b 0a 20 20 20 20 43 52 45  (y, x));.    CRE
79c0: 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 2c 20  ATE TABLE c1(a, 
79d0: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
79e0: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
79f0: 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20  parent(x, y));. 
7a00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7a10: 63 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  c2(a, b, FOREIGN
7a20: 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52   KEY(a, b) REFER
7a30: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20  ENCES parent(x, 
7a40: 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  y));.    CREATE 
7a50: 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c 20 46  TABLE c3(a, b, F
7a60: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
7a70: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
7a80: 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43  nt(x, y));.    C
7a90: 52 45 41 54 45 20 49 4e 44 45 58 20 63 32 69 20  REATE INDEX c2i 
7aa0: 4f 4e 20 63 32 28 61 2c 20 62 29 3b 0a 20 20 20  ON c2(a, b);.   
7ab0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
7ac0: 4e 44 45 58 20 63 33 69 20 4f 4e 20 63 32 28 62  NDEX c3i ON c2(b
7ad0: 2c 20 61 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70  , a);.  }.} {}.p
7ae0: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  roc test_efkey_6
7af0: 31 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  1 {tn isError sq
7b00: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
7b10: 5f 66 6b 65 79 2d 32 34 2e 24 74 6e 20 22 0a 20  _fkey-24.$tn ". 
7b20: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71     catchsql {$sq
7b30: 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b  l}.  " [lindex {
7b40: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69  {0 {}} {1 {forei
7b50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
7b60: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
7b70: 72 72 6f 72 5d 0a 7d 0a 66 6f 72 65 61 63 68 20  rror].}.foreach 
7b80: 7b 74 6e 20 63 7d 20 5b 6c 69 73 74 20 32 20 63  {tn c} [list 2 c
7b90: 31 20 33 20 63 32 20 34 20 63 33 5d 20 7b 0a 20  1 3 c2 4 c3] {. 
7ba0: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24   test_efkey_61 $
7bb0: 74 6e 2e 31 20 31 20 22 49 4e 53 45 52 54 20 49  tn.1 1 "INSERT I
7bc0: 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28 31 2c  NTO $c VALUES(1,
7bd0: 20 32 29 22 0a 20 20 74 65 73 74 5f 65 66 6b 65   2)".  test_efke
7be0: 79 5f 36 31 20 24 74 6e 2e 32 20 30 20 22 49 4e  y_61 $tn.2 0 "IN
7bf0: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
7c00: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 20   VALUES(1, 2)". 
7c10: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24   test_efkey_61 $
7c20: 74 6e 2e 33 20 30 20 22 49 4e 53 45 52 54 20 49  tn.3 0 "INSERT I
7c30: 4e 54 4f 20 24 63 20 56 41 4c 55 45 53 28 31 2c  NTO $c VALUES(1,
7c40: 20 32 29 22 0a 0a 20 20 65 78 65 63 73 71 6c 20   2)"..  execsql 
7c50: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 24 63 20  "DELETE FROM $c 
7c60: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61  ; DELETE FROM pa
7c70: 72 65 6e 74 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  rent".}..#------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
7cd0: 46 3a 20 52 2d 30 30 32 37 39 2d 35 32 32 38 33  F: R-00279-52283
7ce0: 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61  .#.# Test an exa
7cf0: 6d 70 6c 65 20 73 68 6f 77 69 6e 67 20 74 68 61  mple showing tha
7d00: 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  t when a row is 
7d10: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
7d20: 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62 6c 65   parent .# table
7d30: 2c 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  , the child tabl
7d40: 65 20 69 73 20 71 75 65 72 69 65 64 20 66 6f 72  e is queried for
7d50: 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 73 20 61   orphaned rows a
7d60: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
7d70: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
7d80: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
7d90: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 3f 0a 23  rackartist = ?.#
7da0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7db0: 52 2d 32 33 33 30 32 2d 33 30 39 35 36 20 49 66  R-23302-30956 If
7dc0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65 74   this SELECT ret
7dd0: 75 72 6e 73 20 61 6e 79 20 72 6f 77 73 20 61 74  urns any rows at
7de0: 20 61 6c 6c 2c 0a 23 20 74 68 65 6e 20 53 51 4c   all,.# then SQL
7df0: 69 74 65 20 63 6f 6e 63 6c 75 64 65 73 20 74 68  ite concludes th
7e00: 61 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  at deleting the 
7e10: 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 70 61 72  row from the par
7e20: 65 6e 74 20 74 61 62 6c 65 0a 23 20 77 6f 75 6c  ent table.# woul
7e30: 64 20 76 69 6f 6c 61 74 65 20 74 68 65 20 66 6f  d violate the fo
7e40: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7e50: 61 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 73  aint and returns
7e60: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f   an error..#.do_
7e70: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e 31  test e_fkey-25.1
7e80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7e90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7ea0: 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
7eb0: 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
7ec0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
7ed0: 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
7ee0: 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
7ef0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7f00: 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
7f10: 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
7f20: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d   .      tracknam
7f30: 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
7f40: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
7f50: 45 47 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45  EGER,.      FORE
7f60: 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74  IGN KEY(trackart
7f70: 69 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20  ist) REFERENCES 
7f80: 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29  artist(artistid)
7f90: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
7fa0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7fb0: 20 65 5f 66 6b 65 79 2d 32 35 2e 32 20 7b 0a 20   e_fkey-25.2 {. 
7fc0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
7fd0: 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 45 58  keys = OFF;.  EX
7fe0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
7ff0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
8000: 69 73 74 20 57 48 45 52 45 20 31 3b 0a 20 20 45  ist WHERE 1;.  E
8010: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
8020: 4e 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46  N SELECT rowid F
8030: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
8040: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 3f 3b  trackartist = ?;
8050: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
8060: 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74 20  AN TABLE artist 
8070: 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d  (~1000000 rows)}
8080: 20 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20   .  0 0 0 {SCAN 
8090: 54 41 42 4c 45 20 74 72 61 63 6b 20 28 7e 31 30  TABLE track (~10
80a0: 30 30 30 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f  0000 rows)}.}.do
80b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
80c0: 66 6b 65 79 2d 32 35 2e 33 20 7b 0a 20 20 50 52  fkey-25.3 {.  PR
80d0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
80e0: 73 20 3d 20 4f 4e 3b 0a 20 20 45 58 50 4c 41 49  s = ON;.  EXPLAI
80f0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c  N QUERY PLAN DEL
8100: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
8110: 57 48 45 52 45 20 31 3b 0a 7d 20 7b 0a 20 20 30  WHERE 1;.} {.  0
8120: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
8130: 20 61 72 74 69 73 74 20 28 7e 31 30 30 30 30 30   artist (~100000
8140: 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 30 20  0 rows)} .  0 0 
8150: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 72  0 {SCAN TABLE tr
8160: 61 63 6b 20 28 7e 31 30 30 30 30 30 20 72 6f 77  ack (~100000 row
8170: 73 29 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  s)}.}.do_test e_
8180: 66 6b 65 79 2d 32 35 2e 34 20 7b 0a 20 20 65 78  fkey-25.4 {.  ex
8190: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
81a0: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
81b0: 41 4c 55 45 53 28 35 2c 20 27 61 72 74 69 73 74  ALUES(5, 'artist
81c0: 20 35 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   5');.    INSERT
81d0: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
81e0: 55 45 53 28 36 2c 20 27 61 72 74 69 73 74 20 36  UES(6, 'artist 6
81f0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
8200: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
8210: 53 28 37 2c 20 27 61 72 74 69 73 74 20 37 27 29  S(7, 'artist 7')
8220: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8230: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
8240: 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 35 29 3b  , 'track 1', 5);
8250: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8260: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 32 2c   track VALUES(2,
8270: 20 27 74 72 61 63 6b 20 32 27 2c 20 36 29 3b 0a   'track 2', 6);.
8280: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
8290: 74 20 65 5f 66 6b 65 79 2d 32 35 2e 35 20 7b 0a  t e_fkey-25.5 {.
82a0: 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b    concat \.    [
82b0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
82c0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63   rowid FROM trac
82d0: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
82e0: 69 73 74 20 3d 20 35 20 7d 5d 20 20 20 5c 0a 20  ist = 5 }]   \. 
82f0: 20 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44     [catchsql { D
8300: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
8310: 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64  t WHERE artistid
8320: 20 3d 20 35 20 7d 5d 0a 7d 20 7b 31 20 31 20 7b   = 5 }].} {1 1 {
8330: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
8340: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
8350: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
8360: 32 35 2e 36 20 7b 0a 20 20 63 6f 6e 63 61 74 20  25.6 {.  concat 
8370: 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b  \.    [execsql {
8380: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
8390: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
83a0: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 37 20 7d  rackartist = 7 }
83b0: 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68  ]   \.    [catch
83c0: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
83d0: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
83e0: 72 74 69 73 74 69 64 20 3d 20 37 20 7d 5d 0a 7d  rtistid = 7 }].}
83f0: 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74   {0 {}}..do_test
8400: 20 65 5f 66 6b 65 79 2d 32 35 2e 37 20 7b 0a 20   e_fkey-25.7 {. 
8410: 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65   concat \.    [e
8420: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
8430: 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b  rowid FROM track
8440: 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69   WHERE trackarti
8450: 73 74 20 3d 20 36 20 7d 5d 20 20 20 5c 0a 20 20  st = 6 }]   \.  
8460: 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45    [catchsql { DE
8470: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
8480: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
8490: 3d 20 36 20 7d 5d 0a 7d 20 7b 32 20 31 20 7b 66  = 6 }].} {2 1 {f
84a0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
84b0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
84c0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
8510: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39 33  DENCE-OF: R-4793
8520: 36 2d 31 30 30 34 34 20 4f 72 2c 20 6d 6f 72 65  6-10044 Or, more
8530: 20 67 65 6e 65 72 61 6c 6c 79 3a 0a 23 20 53 45   generally:.# SE
8540: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
8550: 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48  <child-table> WH
8560: 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20  ERE <child-key> 
8570: 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61  = :parent_key_va
8580: 6c 75 65 0a 23 0a 23 20 54 65 73 74 20 74 68 61  lue.#.# Test tha
8590: 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  t when a row is 
85a0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
85b0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66   parent table of
85c0: 20 61 6e 20 46 4b 20 0a 23 20 63 6f 6e 73 74 72   an FK .# constr
85d0: 61 69 6e 74 2c 20 74 68 65 20 63 68 69 6c 64 20  aint, the child 
85e0: 74 61 62 6c 65 20 69 73 20 71 75 65 72 69 65 64  table is queried
85f0: 20 66 6f 72 20 6f 72 70 68 61 6e 65 64 20 72 6f   for orphaned ro
8600: 77 73 2e 20 54 68 65 0a 23 20 71 75 65 72 79 20  ws. The.# query 
8610: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8620: 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72  :.#.#   SELECT r
8630: 6f 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64  owid FROM <child
8640: 2d 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63  -table> WHERE <c
8650: 68 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72  hild-key> = :par
8660: 65 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a  ent_key_value.#.
8670: 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74  # Also test that
8680: 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 69   when a row is i
8690: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
86a0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 6f   parent table, o
86b0: 72 20 77 68 65 6e 20 74 68 65 20 0a 23 20 70 61  r when the .# pa
86c0: 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20  rent key values 
86d0: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72  of an existing r
86e0: 6f 77 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2c  ow are modified,
86f0: 20 61 20 71 75 65 72 79 20 65 71 75 69 76 61 6c   a query equival
8700: 65 6e 74 0a 23 20 74 6f 20 74 68 65 20 66 6f 6c  ent.# to the fol
8710: 6c 6f 77 69 6e 67 20 69 73 20 70 6c 61 6e 6e 65  lowing is planne
8720: 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  d. In some cases
8730: 20 69 74 20 69 73 20 6e 6f 74 20 65 78 65 63 75   it is not execu
8740: 74 65 64 2c 20 62 75 74 20 69 74 0a 23 20 69 73  ted, but it.# is
8750: 20 61 6c 77 61 79 73 20 70 6c 61 6e 6e 65 64 2e   always planned.
8760: 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f  .#.#   SELECT ro
8770: 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d  wid FROM <child-
8780: 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68  table> WHERE <ch
8790: 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65  ild-key> = :pare
87a0: 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23  nt_key_value.#.#
87b0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
87c0: 36 31 36 31 36 2d 34 36 37 30 30 20 53 69 6d 69  61616-46700 Simi
87d0: 6c 61 72 20 71 75 65 72 69 65 73 20 6d 61 79 20  lar queries may 
87e0: 62 65 20 72 75 6e 20 69 66 20 74 68 65 20 63 6f  be run if the co
87f0: 6e 74 65 6e 74 0a 23 20 6f 66 20 74 68 65 20 70  ntent.# of the p
8800: 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f 64  arent key is mod
8810: 69 66 69 65 64 20 6f 72 20 61 20 6e 65 77 20 72  ified or a new r
8820: 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 69  ow is inserted i
8830: 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 23  nto the parent.#
8840: 20 74 61 62 6c 65 2e 0a 23 0a 23 0a 64 72 6f 70   table..#.#.drop
8850: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
8860: 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 31 20  est e_fkey-26.1 
8870: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  {.  execsql { CR
8880: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
8890: 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79  t(x, y, UNIQUE(y
88a0: 2c 20 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66 6f 72  , x)) }.} {}.for
88b0: 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a  each {tn sql} {.
88c0: 20 20 32 20 7b 20 0a 20 20 20 20 43 52 45 41 54    2 { .    CREAT
88d0: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c  E TABLE child(a,
88e0: 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
88f0: 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53  a, b) REFERENCES
8900: 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 0a 20   parent(x, y)). 
8910: 20 7d 0a 20 20 33 20 7b 20 0a 20 20 20 20 43 52   }.  3 { .    CR
8920: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
8930: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
8940: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
8950: 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29  CES parent(x, y)
8960: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
8970: 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20 63 68  DEX childi ON ch
8980: 69 6c 64 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20  ild(a, b);.  }. 
8990: 20 34 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45   4 { .    CREATE
89a0: 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20   TABLE child(a, 
89b0: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
89c0: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
89d0: 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20  parent(x, y));. 
89e0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
89f0: 20 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e   INDEX childi ON
8a00: 20 63 68 69 6c 64 28 62 2c 20 61 29 3b 0a 20 20   child(b, a);.  
8a10: 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  }.} {.  execsql 
8a20: 24 73 71 6c 0a 0a 20 20 65 78 65 63 73 71 6c 20  $sql..  execsql 
8a30: 7b 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  {PRAGMA foreign_
8a40: 6b 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 73 65  keys = OFF}.  se
8a50: 74 20 64 65 6c 65 74 65 20 5b 63 6f 6e 63 61 74  t delete [concat
8a60: 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 44   \.      [eqp "D
8a70: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
8a80: 74 20 57 48 45 52 45 20 31 22 5d 20 5c 0a 20 20  t WHERE 1"] \.  
8a90: 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54      [eqp "SELECT
8aa0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c   rowid FROM chil
8ab0: 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  d WHERE a = ? AN
8ac0: 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20  D b = ?"].  ].  
8ad0: 73 65 74 20 75 70 64 61 74 65 20 5b 63 6f 6e 63  set update [conc
8ae0: 61 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20  at \.      [eqp 
8af0: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
8b00: 45 54 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20 5c 0a  ET x=?, y=?"] \.
8b10: 20 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45        [eqp "SELE
8b20: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68  CT rowid FROM ch
8b30: 69 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20  ild WHERE a = ? 
8b40: 41 4e 44 20 62 20 3d 20 3f 22 5d 20 5c 0a 20 20  AND b = ?"] \.  
8b50: 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54      [eqp "SELECT
8b60: 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c   rowid FROM chil
8b70: 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  d WHERE a = ? AN
8b80: 44 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20  D b = ?"].  ].  
8b90: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
8ba0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
8bb0: 4e 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  N}..  do_test e_
8bc0: 66 6b 65 79 2d 32 36 2e 24 74 6e 2e 31 20 7b 20  fkey-26.$tn.1 { 
8bd0: 65 71 70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  eqp "DELETE FROM
8be0: 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 31 22   parent WHERE 1"
8bf0: 20 7d 20 24 64 65 6c 65 74 65 0a 20 20 64 6f 5f   } $delete.  do_
8c00: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24  test e_fkey-26.$
8c10: 74 6e 2e 32 20 7b 20 65 71 70 20 22 55 50 44 41  tn.2 { eqp "UPDA
8c20: 54 45 20 70 61 72 65 6e 74 20 73 65 74 20 78 3d  TE parent set x=
8c30: 3f 2c 20 79 3d 3f 22 20 7d 20 24 75 70 64 61 74  ?, y=?" } $updat
8c40: 65 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52  e..  execsql {DR
8c50: 4f 50 20 54 41 42 4c 45 20 63 68 69 6c 64 7d 0a  OP TABLE child}.
8c60: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
8cb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
8cc0: 34 35 35 33 2d 33 34 30 31 33 0a 23 0a 23 20 54  4553-34013.#.# T
8cd0: 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20  est the example 
8ce0: 73 63 68 65 6d 61 20 61 74 20 74 68 65 20 65 6e  schema at the en
8cf0: 64 20 6f 66 20 73 65 63 74 69 6f 6e 20 33 2e 20  d of section 3. 
8d00: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69  Also test that i
8d10: 73 0a 23 20 69 73 20 22 65 66 66 69 63 69 65 6e  s.# is "efficien
8d20: 74 22 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  t". In this case
8d30: 20 22 65 66 66 69 63 69 65 6e 74 22 20 6d 65 61   "efficient" mea
8d40: 6e 73 20 74 68 61 74 20 66 6f 72 65 69 67 6e 20  ns that foreign 
8d50: 6b 65 79 0a 23 20 72 65 6c 61 74 65 64 20 6f 70  key.# related op
8d60: 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  erations on the 
8d70: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 20  parent table do 
8d80: 6e 6f 74 20 70 72 6f 76 6f 6b 65 20 6c 69 6e 65  not provoke line
8d90: 61 72 20 73 63 61 6e 73 2e 0a 23 0a 64 72 6f 70  ar scans..#.drop
8da0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
8db0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 31 20  est e_fkey-27.1 
8dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
8dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
8de0: 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74  rtist(.      art
8df0: 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52  istid    INTEGER
8e00: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20   PRIMARY KEY, . 
8e10: 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20       artistname 
8e20: 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20   TEXT.    );.   
8e30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72   CREATE TABLE tr
8e40: 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b  ack(.      track
8e50: 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a  id     INTEGER,.
8e60: 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20        trackname 
8e70: 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74    TEXT, .      t
8e80: 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47  rackartist INTEG
8e90: 45 52 20 52 45 46 45 52 45 4e 43 45 53 20 61 72  ER REFERENCES ar
8ea0: 74 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  tist.    );.    
8eb0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 72 61  CREATE INDEX tra
8ec0: 63 6b 69 6e 64 65 78 20 4f 4e 20 74 72 61 63 6b  ckindex ON track
8ed0: 28 74 72 61 63 6b 61 72 74 69 73 74 29 3b 0a 20  (trackartist);. 
8ee0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
8ef0: 65 5f 66 6b 65 79 2d 32 37 2e 32 20 7b 0a 20 20  e_fkey-27.2 {.  
8f00: 65 71 70 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  eqp { INSERT INT
8f10: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
8f20: 3f 2c 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ?, ?) }.} {}.do_
8f30: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66  execsql_test e_f
8f40: 6b 65 79 2d 32 37 2e 33 20 7b 0a 20 20 45 58 50  key-27.3 {.  EXP
8f50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
8f60: 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
8f70: 54 20 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20  T artistid = ?, 
8f80: 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 3f 0a 7d  artistname = ?.}
8f90: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
8fa0: 20 54 41 42 4c 45 20 61 72 74 69 73 74 20 28 7e   TABLE artist (~
8fb0: 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a  1000000 rows)} .
8fc0: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
8fd0: 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53 49 4e  TABLE track USIN
8fe0: 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
8ff0: 20 74 72 61 63 6b 69 6e 64 65 78 20 28 74 72 61   trackindex (tra
9000: 63 6b 61 72 74 69 73 74 3d 3f 29 20 28 7e 31 30  ckartist=?) (~10
9010: 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 30 20 30   rows)} .  0 0 0
9020: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
9030: 72 61 63 6b 20 55 53 49 4e 47 20 43 4f 56 45 52  rack USING COVER
9040: 49 4e 47 20 49 4e 44 45 58 20 74 72 61 63 6b 69  ING INDEX tracki
9050: 6e 64 65 78 20 28 74 72 61 63 6b 61 72 74 69 73  ndex (trackartis
9060: 74 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d  t=?) (~10 rows)}
9070: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
9080: 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 34 20 7b  st e_fkey-27.4 {
9090: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
90a0: 20 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52 4f   PLAN DELETE FRO
90b0: 4d 20 61 72 74 69 73 74 0a 7d 20 7b 0a 20 20 30  M artist.} {.  0
90c0: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
90d0: 20 61 72 74 69 73 74 20 28 7e 31 30 30 30 30 30   artist (~100000
90e0: 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 30 20  0 rows)} .  0 0 
90f0: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
9100: 74 72 61 63 6b 20 55 53 49 4e 47 20 43 4f 56 45  track USING COVE
9110: 52 49 4e 47 20 49 4e 44 45 58 20 74 72 61 63 6b  RING INDEX track
9120: 69 6e 64 65 78 20 28 74 72 61 63 6b 61 72 74 69  index (trackarti
9130: 73 74 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29  st=?) (~10 rows)
9140: 7d 0a 7d 0a 0a 0a 23 23 23 23 23 23 23 23 23 23  }.}...##########
9150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9190: 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e  #.### SECTION 4.
91a0: 31 3a 20 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72  1: Composite For
91b0: 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61  eign Key Constra
91c0: 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23 23  ints.###########
91d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
91e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
91f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9210: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
9260: 68 65 63 6b 20 74 68 61 74 20 70 61 72 65 6e 74  heck that parent
9270: 20 61 6e 64 20 63 68 69 6c 64 20 6b 65 79 73 20   and child keys 
9280: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
9290: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  me number of col
92a0: 75 6d 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  umns..#.# EVIDEN
92b0: 43 45 2d 4f 46 3a 20 52 2d 34 31 30 36 32 2d 33  CE-OF: R-41062-3
92c0: 34 34 33 31 20 50 61 72 65 6e 74 20 61 6e 64 20  4431 Parent and 
92d0: 63 68 69 6c 64 20 6b 65 79 73 20 6d 75 73 74 20  child keys must 
92e0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a 23 20  have the same.# 
92f0: 63 61 72 64 69 6e 61 6c 69 74 79 2e 0a 23 0a 66  cardinality..#.f
9300: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 65  oreach {tn sql e
9310: 72 72 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54  rr} {.  1 "CREAT
9320: 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45 46  E TABLE c(jj REF
9330: 45 52 45 4e 43 45 53 20 70 28 78 2c 20 79 29 29  ERENCES p(x, y))
9340: 22 20 0a 20 20 20 20 7b 66 6f 72 65 69 67 6e 20  " .    {foreign 
9350: 6b 65 79 20 6f 6e 20 6a 6a 20 73 68 6f 75 6c 64  key on jj should
9360: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
9370: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
9380: 62 6c 65 20 70 7d 0a 0a 20 20 32 20 22 43 52 45  ble p}..  2 "CRE
9390: 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52  ATE TABLE c(jj R
93a0: 45 46 45 52 45 4e 43 45 53 20 70 28 29 29 22 20  EFERENCES p())" 
93b0: 7b 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61  {near ")": synta
93c0: 78 20 65 72 72 6f 72 7d 0a 0a 20 20 33 20 22 43  x error}..  3 "C
93d0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a  REATE TABLE c(jj
93e0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a  , FOREIGN KEY(jj
93f0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 78  ) REFERENCES p(x
9400: 2c 20 79 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d  , y))" .    {num
9410: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9420: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
9430: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
9440: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9450: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
9460: 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 34  nced table}..  4
9470: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
9480: 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  (jj, FOREIGN KEY
9490: 28 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20  (jj) REFERENCES 
94a0: 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72  p())" .    {near
94b0: 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72   ")": syntax err
94c0: 6f 72 7d 0a 0a 20 20 35 20 22 43 52 45 41 54 45  or}..  5 "CREATE
94d0: 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c   TABLE c(ii, jj,
94e0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c   FOREIGN KEY(jj,
94f0: 20 69 69 29 20 52 45 46 45 52 45 4e 43 45 53 20   ii) REFERENCES 
9500: 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72  p())" .    {near
9510: 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72   ")": syntax err
9520: 6f 72 7d 0a 0a 20 20 36 20 22 43 52 45 41 54 45  or}..  6 "CREATE
9530: 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c   TABLE c(ii, jj,
9540: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c   FOREIGN KEY(jj,
9550: 20 69 69 29 20 52 45 46 45 52 45 4e 43 45 53 20   ii) REFERENCES 
9560: 70 28 78 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d  p(x))" .    {num
9570: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9580: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
9590: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
95a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
95b0: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
95c0: 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 37  nced table}..  7
95d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
95e0: 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e  (ii, jj, FOREIGN
95f0: 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46   KEY(jj, ii) REF
9600: 45 52 45 4e 43 45 53 20 70 28 78 2c 79 2c 7a 29  ERENCES p(x,y,z)
9610: 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72 20  )" .    {number 
9620: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
9630: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
9640: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
9650: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9660: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
9670: 20 74 61 62 6c 65 7d 0a 7d 20 7b 0a 20 20 64 72   table}.} {.  dr
9680: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
9690: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
96a0: 38 2e 24 74 6e 20 5b 6c 69 73 74 20 63 61 74 63  8.$tn [list catc
96b0: 68 73 71 6c 20 24 73 71 6c 5d 20 5b 6c 69 73 74  hsql $sql] [list
96c0: 20 31 20 24 65 72 72 5d 0a 7d 0a 64 6f 5f 74 65   1 $err].}.do_te
96d0: 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 38 20 7b  st e_fkey-28.8 {
96e0: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
96f0: 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
9700: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9710: 70 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  p(x PRIMARY KEY)
9720: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9730: 4c 45 20 63 28 61 2c 20 62 2c 20 46 4f 52 45 49  LE c(a, b, FOREI
9740: 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
9750: 52 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a 20  RENCES p);.  }. 
9760: 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54   catchsql {DELET
9770: 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b  E FROM p}.} {1 {
9780: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
9790: 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  atch}}.do_test e
97a0: 5f 66 6b 65 79 2d 32 38 2e 39 20 7b 0a 20 20 64  _fkey-28.9 {.  d
97b0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
97c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
97d0: 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 78 2c  REATE TABLE p(x,
97e0: 20 79 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   y, PRIMARY KEY(
97f0: 78 2c 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  x,y));.    CREAT
9800: 45 20 54 41 42 4c 45 20 63 28 61 20 52 45 46 45  E TABLE c(a REFE
9810: 52 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a 20  RENCES p);.  }. 
9820: 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54   catchsql {DELET
9830: 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b  E FROM p}.} {1 {
9840: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
9850: 61 74 63 68 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  atch}}...#------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
98b0: 46 3a 20 52 2d 32 34 36 37 36 2d 30 39 38 35 39  F: R-24676-09859
98c0: 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 65 78  .#.# Test the ex
98d0: 61 6d 70 6c 65 20 73 63 68 65 6d 61 20 69 6e 20  ample schema in 
98e0: 74 68 65 20 22 43 6f 6d 70 6f 73 69 74 65 20 46  the "Composite F
98f0: 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74  oreign Key Const
9900: 72 61 69 6e 74 73 22 20 0a 23 20 73 65 63 74 69  raints" .# secti
9910: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  on..#.do_test e_
9920: 66 6b 65 79 2d 32 39 2e 31 20 7b 0a 20 20 65 78  fkey-29.1 {.  ex
9930: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
9940: 54 45 20 54 41 42 4c 45 20 61 6c 62 75 6d 28 0a  TE TABLE album(.
9950: 20 20 20 20 20 20 61 6c 62 75 6d 61 72 74 69 73        albumartis
9960: 74 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c  t TEXT,.      al
9970: 62 75 6d 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20  bumname TEXT,.  
9980: 20 20 20 20 61 6c 62 75 6d 63 6f 76 65 72 20 42      albumcover B
9990: 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 50 52 49  INARY,.      PRI
99a0: 4d 41 52 59 20 4b 45 59 28 61 6c 62 75 6d 61 72  MARY KEY(albumar
99b0: 74 69 73 74 2c 20 61 6c 62 75 6d 6e 61 6d 65 29  tist, albumname)
99c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
99d0: 54 45 20 54 41 42 4c 45 20 73 6f 6e 67 28 0a 20  TE TABLE song(. 
99e0: 20 20 20 20 20 73 6f 6e 67 69 64 20 49 4e 54 45       songid INTE
99f0: 47 45 52 2c 0a 20 20 20 20 20 20 73 6f 6e 67 61  GER,.      songa
9a00: 72 74 69 73 74 20 54 45 58 54 2c 0a 20 20 20 20  rtist TEXT,.    
9a10: 20 20 73 6f 6e 67 61 6c 62 75 6d 20 54 45 58 54    songalbum TEXT
9a20: 2c 0a 20 20 20 20 20 20 73 6f 6e 67 6e 61 6d 65  ,.      songname
9a30: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 46 4f 52   TEXT,.      FOR
9a40: 45 49 47 4e 20 4b 45 59 28 73 6f 6e 67 61 72 74  EIGN KEY(songart
9a50: 69 73 74 2c 20 73 6f 6e 67 61 6c 62 75 6d 29 20  ist, songalbum) 
9a60: 52 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75 6d  REFERENCES album
9a70: 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 61 6c 62  (albumartist,alb
9a80: 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b 0a 20  umname).    );. 
9a90: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
9aa0: 20 65 5f 66 6b 65 79 2d 32 39 2e 32 20 7b 0a 20   e_fkey-29.2 {. 
9ab0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
9ac0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 6c 62 75 6d  NSERT INTO album
9ad0: 20 56 41 4c 55 45 53 28 27 45 6c 76 69 73 20 50   VALUES('Elvis P
9ae0: 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73 27  resley', 'Elvis'
9af0: 27 20 43 68 72 69 73 74 6d 61 73 20 41 6c 62 75  ' Christmas Albu
9b00: 6d 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49  m', NULL);.    I
9b10: 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20  NSERT INTO song 
9b20: 56 41 4c 55 45 53 28 0a 20 20 20 20 20 20 31 2c  VALUES(.      1,
9b30: 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27   'Elvis Presley'
9b40: 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72 69 73  , 'Elvis'' Chris
9b50: 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 27 48 65  tmas Album', 'He
9b60: 72 65 20 43 6f 6d 65 73 20 53 61 6e 74 61 20 43  re Comes Santa C
9b70: 6c 61 75 73 65 27 0a 20 20 20 20 29 3b 0a 20 20  lause'.    );.  
9b80: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
9b90: 5f 66 6b 65 79 2d 32 39 2e 33 20 7b 0a 20 20 63  _fkey-29.3 {.  c
9ba0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
9bb0: 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56  SERT INTO song V
9bc0: 41 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20  ALUES(2, 'Elvis 
9bd0: 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73  Presley', 'Elvis
9be0: 20 49 73 20 42 61 63 6b 21 27 2c 20 27 46 65 76   Is Back!', 'Fev
9bf0: 65 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  er');.  }.} {1 {
9c00: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
9c10: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
9c20: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
9c70: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
9c80: 36 32 36 2d 34 38 34 31 38 20 49 6e 20 53 51 4c  626-48418 In SQL
9c90: 69 74 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ite, if any of t
9ca0: 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c  he child key col
9cb0: 75 6d 6e 73 0a 23 20 28 69 6e 20 74 68 69 73 20  umns.# (in this 
9cc0: 63 61 73 65 20 73 6f 6e 67 61 72 74 69 73 74 20  case songartist 
9cd0: 61 6e 64 20 73 6f 6e 67 61 6c 62 75 6d 29 20 61  and songalbum) a
9ce0: 72 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  re NULL, then th
9cf0: 65 72 65 20 69 73 20 6e 6f 0a 23 20 72 65 71 75  ere is no.# requ
9d00: 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 20 63 6f  irement for a co
9d10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77 20  rresponding row 
9d20: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
9d30: 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ble..#.do_test e
9d40: 5f 66 6b 65 79 2d 33 30 2e 31 20 7b 0a 20 20 65  _fkey-30.1 {.  e
9d50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
9d60: 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41  ERT INTO song VA
9d70: 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20 50  LUES(2, 'Elvis P
9d80: 72 65 73 6c 65 79 27 2c 20 4e 55 4c 4c 2c 20 27  resley', NULL, '
9d90: 46 65 76 65 72 27 29 3b 0a 20 20 20 20 49 4e 53  Fever');.    INS
9da0: 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56 41  ERT INTO song VA
9db0: 4c 55 45 53 28 33 2c 20 4e 55 4c 4c 2c 20 27 45  LUES(3, NULL, 'E
9dc0: 6c 76 69 73 20 49 73 20 42 61 63 6b 27 2c 20 27  lvis Is Back', '
9dd0: 53 6f 6c 64 69 65 72 20 42 6f 79 27 29 3b 0a 20  Soldier Boy');. 
9de0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23   }.} {}..#######
9df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e30: 23 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e  ####.### SECTION
9e40: 20 34 2e 32 3a 20 44 65 66 65 72 72 65 64 20 46   4.2: Deferred F
9e50: 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74  oreign Key Const
9e60: 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23  raints.#########
9e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9eb0: 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ##..#-----------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9f00: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20   Test that if a 
9f10: 73 74 61 74 65 6d 65 6e 74 20 76 69 6f 6c 61 74  statement violat
9f20: 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
9f30: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 61  FK constraint, a
9f40: 6e 64 20 74 68 65 0a 23 20 64 61 74 61 62 61 73  nd the.# databas
9f50: 65 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73  e does not satis
9f60: 66 79 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72  fy the FK constr
9f70: 61 69 6e 74 20 6f 6e 63 65 20 61 6c 6c 20 65 66  aint once all ef
9f80: 66 65 63 74 73 20 6f 66 20 74 68 65 0a 23 20 73  fects of the.# s
9f90: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 62 65  tatement have be
9fa0: 65 6e 20 61 70 70 6c 69 65 64 2c 20 61 6e 20 65  en applied, an e
9fb0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
9fc0: 20 61 6e 64 20 74 68 65 20 65 66 66 65 63 74 73   and the effects
9fd0: 20 6f 66 0a 23 20 74 68 65 20 73 74 61 74 65 6d   of.# the statem
9fe0: 65 6e 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ent rolled back.
9ff0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a000: 3a 20 52 2d 30 39 33 32 33 2d 33 30 34 37 30 20  : R-09323-30470 
a010: 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6d  If a statement m
a020: 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74  odifies the cont
a030: 65 6e 74 73 20 6f 66 20 74 68 65 0a 23 20 64 61  ents of the.# da
a040: 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 61  tabase so that a
a050: 6e 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  n immediate fore
a060: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
a070: 6e 74 20 69 73 20 69 6e 20 76 69 6f 6c 61 74 69  nt is in violati
a080: 6f 6e 0a 23 20 61 74 20 74 68 65 20 63 6f 6e 63  on.# at the conc
a090: 6c 75 73 69 6f 6e 20 74 68 65 20 73 74 61 74 65  lusion the state
a0a0: 6d 65 6e 74 2c 20 61 6e 20 65 78 63 65 70 74 69  ment, an excepti
a0b0: 6f 6e 20 69 73 20 74 68 72 6f 77 6e 20 61 6e 64  on is thrown and
a0c0: 20 74 68 65 0a 23 20 65 66 66 65 63 74 73 20 6f   the.# effects o
a0d0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
a0e0: 61 72 65 20 72 65 76 65 72 74 65 64 2e 0a 23 0a  are reverted..#.
a0f0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
a100: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
a110: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
a120: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
a130: 4c 45 20 6b 69 6e 67 28 61 2c 20 62 2c 20 50 52  LE king(a, b, PR
a140: 49 4d 41 52 59 20 4b 45 59 28 61 29 29 3b 0a 20  IMARY KEY(a));. 
a150: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a160: 70 72 69 6e 63 65 28 63 20 52 45 46 45 52 45 4e  prince(c REFEREN
a170: 43 45 53 20 6b 69 6e 67 2c 20 64 29 3b 0a 20 20  CES king, d);.  
a180: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
a190: 65 5f 66 6b 65 79 2d 33 31 2e 32 20 7b 0a 20 20  e_fkey-31.2 {.  
a1a0: 23 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74  # Execute a stat
a1b0: 65 6d 65 6e 74 20 74 68 61 74 20 76 69 6f 6c 61  ement that viola
a1c0: 74 65 73 20 74 68 65 20 69 6d 6d 65 64 69 61 74  tes the immediat
a1d0: 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e  e FK constraint.
a1e0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
a1f0: 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65  SERT INTO prince
a200: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
a210: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
a220: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
a230: 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  led}}..do_test e
a240: 5f 66 6b 65 79 2d 33 31 2e 33 20 7b 0a 20 20 23  _fkey-31.3 {.  #
a250: 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20   This time, use 
a260: 61 20 74 72 69 67 67 65 72 20 74 6f 20 66 69 78  a trigger to fix
a270: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
a280: 76 69 6f 6c 61 74 69 6f 6e 20 62 65 66 6f 72 65  violation before
a290: 20 74 68 65 0a 20 20 23 20 73 74 61 74 65 6d 65   the.  # stateme
a2a0: 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  nt has finished 
a2b0: 65 78 65 63 75 74 69 6e 67 2e 20 54 68 65 6e 20  executing. Then 
a2c0: 65 78 65 63 75 74 65 20 74 68 65 20 73 61 6d 65  execute the same
a2d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 0a 20 20   statement as.  
a2e0: 23 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  # in the previou
a2f0: 73 20 74 65 73 74 20 63 61 73 65 2e 20 54 68 69  s test case. Thi
a300: 73 20 74 69 6d 65 2c 20 6e 6f 20 65 72 72 6f 72  s time, no error
a310: 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
a320: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
a330: 20 6b 74 20 41 46 54 45 52 20 49 4e 53 45 52 54   kt AFTER INSERT
a340: 20 4f 4e 20 70 72 69 6e 63 65 20 57 48 45 4e 0a   ON prince WHEN.
a350: 20 20 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53        NOT EXISTS
a360: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
a370: 6b 69 6e 67 20 57 48 45 52 45 20 61 20 3d 20 6e  king WHERE a = n
a380: 65 77 2e 63 29 0a 20 20 20 20 42 45 47 49 4e 0a  ew.c).    BEGIN.
a390: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a3a0: 4f 20 6b 69 6e 67 20 56 41 4c 55 45 53 28 6e 65  O king VALUES(ne
a3b0: 77 2e 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  w.c, NULL);.    
a3c0: 45 4e 44 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  END.  }.  execsq
a3d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
a3e0: 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28 31 2c  prince VALUES(1,
a3f0: 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65   2) }.} {}..# Te
a400: 73 74 20 74 68 61 74 20 6f 70 65 72 61 74 69 6e  st that operatin
a410: 67 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73  g inside a trans
a420: 61 63 74 69 6f 6e 20 6d 61 6b 65 73 20 6e 6f 20  action makes no 
a430: 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 0a 23  difference to .#
a440: 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74   immediate const
a450: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20  raint violation 
a460: 68 61 6e 64 6c 69 6e 67 2e 0a 64 6f 5f 74 65 73  handling..do_tes
a470: 74 20 65 5f 66 6b 65 79 2d 33 31 2e 34 20 7b 0a  t e_fkey-31.4 {.
a480: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a490: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
a4a0: 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41  T INTO prince VA
a4b0: 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 20 20  LUES(2, 3);.    
a4c0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 6b 74 3b  DROP TRIGGER kt;
a4d0: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
a4e0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 72  { INSERT INTO pr
a4f0: 69 6e 63 65 20 56 41 4c 55 45 53 28 33 2c 20 34  ince VALUES(3, 4
a500: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
a510: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a520: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
a530: 74 20 65 5f 66 6b 65 79 2d 33 31 2e 35 20 7b 0a  t e_fkey-31.5 {.
a540: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a550: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
a560: 43 54 20 2a 20 46 52 4f 4d 20 6b 69 6e 67 3b 0a  CT * FROM king;.
a570: 20 20 7d 0a 7d 20 7b 31 20 7b 7d 20 32 20 7b 7d    }.} {1 {} 2 {}
a580: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
a5d0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 64  Test that if a d
a5e0: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
a5f0: 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 20 77  nt is violated w
a600: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
a610: 69 6f 6e 2c 0a 23 20 6e 6f 74 68 69 6e 67 20 68  ion,.# nothing h
a620: 61 70 70 65 6e 73 20 69 6d 6d 65 64 69 61 74 65  appens immediate
a630: 6c 79 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ly and the datab
a640: 61 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ase is allowed t
a650: 6f 20 70 65 72 73 69 73 74 0a 23 20 69 6e 20 61  o persist.# in a
a660: 20 73 74 61 74 65 20 74 68 61 74 20 64 6f 65 73   state that does
a670: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
a680: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20   FK constraint. 
a690: 48 6f 77 65 76 65 72 20 61 74 74 65 6d 70 74 73  However attempts
a6a0: 0a 23 20 74 6f 20 43 4f 4d 4d 49 54 20 74 68 65  .# to COMMIT the
a6b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 61 69   transaction fai
a6c0: 6c 20 75 6e 74 69 6c 20 74 68 65 20 46 4b 20 63  l until the FK c
a6d0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61 74  onstraint is sat
a6e0: 69 73 66 69 65 64 2e 0a 23 0a 23 20 45 56 49 44  isfied..#.# EVID
a6f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 31 37 38  ENCE-OF: R-49178
a700: 2d 32 31 33 35 38 20 42 79 20 63 6f 6e 74 72 61  -21358 By contra
a710: 73 74 2c 20 69 66 20 61 20 73 74 61 74 65 6d 65  st, if a stateme
a720: 6e 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a  nt modifies the.
a730: 23 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  # contents of th
a740: 65 20 64 61 74 61 62 61 73 65 20 73 75 63 68 20  e database such 
a750: 74 68 61 74 20 61 20 64 65 66 65 72 72 65 64 20  that a deferred 
a760: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a770: 74 72 61 69 6e 74 0a 23 20 69 73 20 76 69 6f 6c  traint.# is viol
a780: 61 74 65 64 2c 20 74 68 65 20 76 69 6f 6c 61 74  ated, the violat
a790: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 65 70 6f 72  ion is not repor
a7a0: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ted immediately.
a7b0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a7c0: 3a 20 52 2d 33 39 36 39 32 2d 31 32 34 38 38 20  : R-39692-12488 
a7d0: 44 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  Deferred foreign
a7e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
a7f0: 20 61 72 65 20 6e 6f 74 0a 23 20 63 68 65 63 6b   are not.# check
a800: 65 64 20 75 6e 74 69 6c 20 74 68 65 20 74 72 61  ed until the tra
a810: 6e 73 61 63 74 69 6f 6e 20 74 72 69 65 73 20 74  nsaction tries t
a820: 6f 20 43 4f 4d 4d 49 54 2e 0a 23 0a 23 20 45 56  o COMMIT..#.# EV
a830: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 31  IDENCE-OF: R-551
a840: 34 37 2d 34 37 36 36 34 20 46 6f 72 20 61 73 20  47-47664 For as 
a850: 6c 6f 6e 67 20 61 73 20 74 68 65 20 75 73 65 72  long as the user
a860: 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 23 20 74   has an open.# t
a870: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
a880: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 6c 6f  database is allo
a890: 77 65 64 20 74 6f 20 65 78 69 73 74 20 69 6e 20  wed to exist in 
a8a0: 61 20 73 74 61 74 65 20 74 68 61 74 20 76 69 6f  a state that vio
a8b0: 6c 61 74 65 73 0a 23 20 61 6e 79 20 6e 75 6d 62  lates.# any numb
a8c0: 65 72 20 6f 66 20 64 65 66 65 72 72 65 64 20 66  er of deferred f
a8d0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a8e0: 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44  raints..#.# EVID
a8f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 36 30 34  ENCE-OF: R-29604
a900: 2d 33 30 33 39 35 20 48 6f 77 65 76 65 72 2c 20  -30395 However, 
a910: 43 4f 4d 4d 49 54 20 77 69 6c 6c 20 66 61 69 6c  COMMIT will fail
a920: 20 61 73 20 6c 6f 6e 67 20 61 73 0a 23 20 66 6f   as long as.# fo
a930: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a940: 61 69 6e 74 73 20 72 65 6d 61 69 6e 20 69 6e 20  aints remain in 
a950: 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 70 72 6f  violation..#.pro
a960: 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  c test_efkey_34 
a970: 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d  {tn isError sql}
a980: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   {.  do_test e_f
a990: 6b 65 79 2d 33 32 2e 24 74 6e 20 22 0a 20 20 20  key-32.$tn ".   
a9a0: 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d   catchsql {$sql}
a9b0: 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30  .  " [lindex {{0
a9c0: 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   {}} {1 {foreign
a9d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a9e0: 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72  failed}}} $isErr
a9f0: 6f 72 5d 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74  or].}.drop_all_t
aa00: 61 62 6c 65 73 0a 0a 74 65 73 74 5f 65 66 6b 65  ables..test_efke
aa10: 79 5f 33 34 20 20 31 20 30 20 7b 0a 20 20 43 52  y_34  1 0 {.  CR
aa20: 45 41 54 45 20 54 41 42 4c 45 20 6c 6c 28 6b 20  EATE TABLE ll(k 
aa30: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
aa40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6b 28  CREATE TABLE kk(
aa50: 63 20 52 45 46 45 52 45 4e 43 45 53 20 6c 6c 20  c REFERENCES ll 
aa60: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
aa70: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a  ALLY DEFERRED);.
aa80: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  }.test_efkey_34 
aa90: 20 32 20 30 20 22 42 45 47 49 4e 22 0a 74 65 73   2 0 "BEGIN".tes
aaa0: 74 5f 65 66 6b 65 79 5f 33 34 20 20 33 20 30 20  t_efkey_34  3 0 
aab0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b    "INSERT INTO k
aac0: 6b 20 56 41 4c 55 45 53 28 35 29 22 0a 74 65 73  k VALUES(5)".tes
aad0: 74 5f 65 66 6b 65 79 5f 33 34 20 20 34 20 30 20  t_efkey_34  4 0 
aae0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b    "INSERT INTO k
aaf0: 6b 20 56 41 4c 55 45 53 28 31 30 29 22 0a 74 65  k VALUES(10)".te
ab00: 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 35 20 31  st_efkey_34  5 1
ab10: 20 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65   "COMMIT".test_e
ab20: 66 6b 65 79 5f 33 34 20 20 36 20 30 20 20 20 22  fkey_34  6 0   "
ab30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56  INSERT INTO ll V
ab40: 41 4c 55 45 53 28 31 30 29 22 0a 74 65 73 74 5f  ALUES(10)".test_
ab50: 65 66 6b 65 79 5f 33 34 20 20 37 20 31 20 22 43  efkey_34  7 1 "C
ab60: 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66 6b 65  OMMIT".test_efke
ab70: 79 5f 33 34 20 20 38 20 30 20 20 20 22 49 4e 53  y_34  8 0   "INS
ab80: 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41 4c 55  ERT INTO ll VALU
ab90: 45 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65  ES(5)".test_efke
aba0: 79 5f 33 34 20 20 39 20 30 20 22 43 4f 4d 4d 49  y_34  9 0 "COMMI
abb0: 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  T"..#-----------
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
ac00: 20 57 68 65 6e 20 6e 6f 74 20 72 75 6e 6e 69 6e   When not runnin
ac10: 67 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73  g inside a trans
ac20: 61 63 74 69 6f 6e 2c 20 61 20 64 65 66 65 72 72  action, a deferr
ac30: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ed constraint is
ac40: 20 73 69 6d 69 6c 61 72 0a 23 20 74 6f 20 61 6e   similar.# to an
ac50: 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74   immediate const
ac60: 72 61 69 6e 74 20 28 76 69 6f 6c 61 74 69 6f 6e  raint (violation
ac70: 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 69  s are reported i
ac80: 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 23 0a 23  mmediately)..#.#
ac90: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
aca0: 35 36 38 34 34 2d 36 31 37 30 35 20 49 66 20 74  56844-61705 If t
acb0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
acc0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 69 6e 73 69  ment is not insi
acd0: 64 65 20 61 6e 0a 23 20 65 78 70 6c 69 63 69 74  de an.# explicit
ace0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 61 20   transaction (a 
acf0: 42 45 47 49 4e 2f 43 4f 4d 4d 49 54 2f 52 4f 4c  BEGIN/COMMIT/ROL
ad00: 4c 42 41 43 4b 20 62 6c 6f 63 6b 29 2c 20 74 68  LBACK block), th
ad10: 65 6e 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a 23  en an implicit.#
ad20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ad30: 63 6f 6d 6d 69 74 74 65 64 20 61 73 20 73 6f 6f  committed as soo
ad40: 6e 20 61 73 20 74 68 65 20 73 74 61 74 65 6d 65  n as the stateme
ad50: 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 0a  nt has finished.
ad60: 23 20 65 78 65 63 75 74 69 6e 67 2e 20 49 6e 20  # executing. In 
ad70: 74 68 69 73 20 63 61 73 65 20 64 65 66 65 72 72  this case deferr
ad80: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  ed constraints b
ad90: 65 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 61  ehave the same a
ada0: 73 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63 6f  s.# immediate co
adb0: 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64 72 6f  nstraints..#.dro
adc0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 70 72 6f  p_all_tables.pro
add0: 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20  c test_efkey_35 
ade0: 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d  {tn isError sql}
adf0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   {.  do_test e_f
ae00: 6b 65 79 2d 33 33 2e 24 74 6e 20 22 0a 20 20 20  key-33.$tn ".   
ae10: 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d   catchsql {$sql}
ae20: 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30  .  " [lindex {{0
ae30: 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   {}} {1 {foreign
ae40: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
ae50: 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72  failed}}} $isErr
ae60: 6f 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  or].}.do_test e_
ae70: 66 6b 65 79 2d 33 33 2e 31 20 7b 0a 20 20 65 78  fkey-33.1 {.  ex
ae80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
ae90: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
aea0: 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54  x, y);.    CREAT
aeb0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70  E UNIQUE INDEX p
aec0: 69 20 4f 4e 20 70 61 72 65 6e 74 28 78 2c 20 79  i ON parent(x, y
aed0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
aee0: 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c 0a  BLE child(a, b,.
aef0: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
af00: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
af10: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 20  ES parent(x, y) 
af20: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
af30: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
af40: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 74 65    );.  }.} {}.te
af50: 73 74 5f 65 66 6b 65 79 5f 33 35 20 32 20 31 20  st_efkey_35 2 1 
af60: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69  "INSERT INTO chi
af70: 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20  ld  VALUES('x', 
af80: 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  'y')".test_efkey
af90: 5f 33 35 20 33 20 30 20 22 49 4e 53 45 52 54 20  _35 3 0 "INSERT 
afa0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
afb0: 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 74 65  ES('x', 'y')".te
afc0: 73 74 5f 65 66 6b 65 79 5f 33 35 20 34 20 30 20  st_efkey_35 4 0 
afd0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69  "INSERT INTO chi
afe0: 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c 20  ld  VALUES('x', 
aff0: 27 79 27 29 22 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  'y')"...#-------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b040: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
b050: 3a 20 52 2d 31 32 37 38 32 2d 36 31 38 34 31 0a  : R-12782-61841.
b060: 23 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e  #.# Test that an
b070: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 69   FK constraint i
b080: 73 20 6d 61 64 65 20 64 65 66 65 72 72 65 64 20  s made deferred 
b090: 62 79 20 61 64 64 69 6e 67 20 74 68 65 20 66 6f  by adding the fo
b0a0: 6c 6c 6f 77 69 6e 67 0a 23 20 74 6f 20 74 68 65  llowing.# to the
b0b0: 20 64 65 66 69 6e 69 74 69 6f 6e 3a 0a 23 0a 23   definition:.#.#
b0c0: 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e     DEFERRABLE IN
b0d0: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
b0e0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
b0f0: 3a 20 52 2d 30 39 30 30 35 2d 32 38 37 39 31 0a  : R-09005-28791.
b100: 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68  #.# Also test th
b110: 61 74 20 61 64 64 69 6e 67 20 61 6e 79 20 6f 66  at adding any of
b120: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
b130: 6f 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  o a foreign key 
b140: 64 65 66 69 6e 69 74 69 6f 6e 20 0a 23 20 6d 61  definition .# ma
b150: 6b 65 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  kes the constrai
b160: 6e 74 20 49 4d 4d 45 44 49 41 54 45 3a 0a 23 0a  nt IMMEDIATE:.#.
b170: 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42  #   NOT DEFERRAB
b180: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
b190: 45 52 52 45 44 0a 23 20 20 20 4e 4f 54 20 44 45  ERRED.#   NOT DE
b1a0: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
b1b0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20  LY IMMEDIATE.#  
b1c0: 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 0a   NOT DEFERRABLE.
b1d0: 23 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49  #   DEFERRABLE I
b1e0: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
b1f0: 54 45 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c  TE.#   DEFERRABL
b200: 45 0a 23 0a 23 20 46 6f 72 65 69 67 6e 20 6b 65  E.#.# Foreign ke
b210: 79 73 20 61 72 65 20 49 4d 4d 45 44 49 41 54 45  ys are IMMEDIATE
b220: 20 62 79 20 64 65 66 61 75 6c 74 20 28 69 66 20   by default (if 
b230: 74 68 65 72 65 20 69 73 20 6e 6f 20 44 45 46 45  there is no DEFE
b240: 52 52 41 42 4c 45 20 6f 72 20 4e 4f 54 0a 23 20  RRABLE or NOT.# 
b250: 44 45 46 45 52 52 41 42 4c 45 20 63 6c 61 75 73  DEFERRABLE claus
b260: 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  e)..#.# EVIDENCE
b270: 2d 4f 46 3a 20 52 2d 33 35 32 39 30 2d 31 36 34  -OF: R-35290-164
b280: 36 30 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 63  60 Foreign key c
b290: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 69  onstraints are i
b2a0: 6d 6d 65 64 69 61 74 65 20 62 79 0a 23 20 64 65  mmediate by.# de
b2b0: 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45  fault..#.# EVIDE
b2c0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 32 33 2d  NCE-OF: R-30323-
b2d0: 32 31 39 31 37 20 45 61 63 68 20 66 6f 72 65 69  21917 Each forei
b2e0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
b2f0: 74 20 69 6e 20 53 51 4c 69 74 65 20 69 73 0a 23  t in SQLite is.#
b300: 20 63 6c 61 73 73 69 66 69 65 64 20 61 73 20 65   classified as e
b310: 69 74 68 65 72 20 69 6d 6d 65 64 69 61 74 65 20  ither immediate 
b320: 6f 72 20 64 65 66 65 72 72 65 64 2e 0a 23 0a 64  or deferred..#.d
b330: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
b340: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 34  o_test e_fkey-34
b350: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
b360: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b370: 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20 7a  E parent(x, y, z
b380: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c  , PRIMARY KEY(x,
b390: 79 2c 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54  y,z));.    CREAT
b3a0: 45 20 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c  E TABLE c1(a, b,
b3b0: 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   c,.      FOREIG
b3c0: 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52  N KEY(a, b, c) R
b3d0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
b3e0: 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20   NOT DEFERRABLE 
b3f0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
b400: 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  ED.    );.    CR
b410: 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 61 2c  EATE TABLE c2(a,
b420: 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52   b, c,.      FOR
b430: 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63  EIGN KEY(a, b, c
b440: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
b450: 65 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42  ent NOT DEFERRAB
b460: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  LE INITIALLY IMM
b470: 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20  EDIATE.    );.  
b480: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b490: 33 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20  3(a, b, c,.     
b4a0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b4b0: 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53  b, c) REFERENCES
b4c0: 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45 46 45   parent NOT DEFE
b4d0: 52 52 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20  RRABLE.    );.  
b4e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b4f0: 34 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20  4(a, b, c,.     
b500: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b510: 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53  b, c) REFERENCES
b520: 20 70 61 72 65 6e 74 20 44 45 46 45 52 52 41 42   parent DEFERRAB
b530: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  LE INITIALLY IMM
b540: 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20 20  EDIATE.    );.  
b550: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
b560: 35 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20  5(a, b, c,.     
b570: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b580: 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53  b, c) REFERENCES
b590: 20 70 61 72 65 6e 74 20 44 45 46 45 52 52 41 42   parent DEFERRAB
b5a0: 4c 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  LE.    );.    CR
b5b0: 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 61 2c  EATE TABLE c6(a,
b5c0: 20 62 2c 20 63 2c 20 46 4f 52 45 49 47 4e 20 4b   b, c, FOREIGN K
b5d0: 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45  EY(a, b, c) REFE
b5e0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 29 3b 0a  RENCES parent);.
b5f0: 0a 20 20 20 20 2d 2d 20 54 68 69 73 20 46 4b 20  .    -- This FK 
b600: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 74 68  constraint is th
b610: 65 20 6f 6e 6c 79 20 64 65 66 65 72 72 61 62 6c  e only deferrabl
b620: 65 20 6f 6e 65 2e 0a 20 20 20 20 43 52 45 41 54  e one..    CREAT
b630: 45 20 54 41 42 4c 45 20 63 37 28 61 2c 20 62 2c  E TABLE c7(a, b,
b640: 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47   c,.      FOREIG
b650: 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52  N KEY(a, b, c) R
b660: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
b670: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
b680: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
b690: 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52     );..    INSER
b6a0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b6b0: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27  LUES('a', 'b', '
b6c0: 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  c');.    INSERT 
b6d0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b6e0: 45 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66 27  ES('d', 'e', 'f'
b6f0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b700: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b710: 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b  ('g', 'h', 'i');
b720: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b730: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
b740: 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a 20  j', 'k', 'l');. 
b750: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b760: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6d 27  arent VALUES('m'
b770: 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20  , 'n', 'o');.   
b780: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
b790: 65 6e 74 20 56 41 4c 55 45 53 28 27 70 27 2c 20  ent VALUES('p', 
b7a0: 27 71 27 2c 20 27 72 27 29 3b 0a 20 20 20 20 49  'q', 'r');.    I
b7b0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
b7c0: 74 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27 74  t VALUES('s', 't
b7d0: 27 2c 20 27 75 27 29 3b 0a 0a 20 20 20 20 49 4e  ', 'u');..    IN
b7e0: 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
b7f0: 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63  UES('a', 'b', 'c
b800: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
b810: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 27 64  NTO c2 VALUES('d
b820: 27 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20  ', 'e', 'f');.  
b830: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33    INSERT INTO c3
b840: 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
b850: 2c 20 27 69 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'i');.    INSE
b860: 52 54 20 49 4e 54 4f 20 63 34 20 56 41 4c 55 45  RT INTO c4 VALUE
b870: 53 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29  S('j', 'k', 'l')
b880: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b890: 4f 20 63 35 20 56 41 4c 55 45 53 28 27 6d 27 2c  O c5 VALUES('m',
b8a0: 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20 20   'n', 'o');.    
b8b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 36 20 56  INSERT INTO c6 V
b8c0: 41 4c 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20  ALUES('p', 'q', 
b8d0: 27 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'r');.    INSERT
b8e0: 20 49 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28   INTO c7 VALUES(
b8f0: 27 73 27 2c 20 27 74 27 2c 20 27 75 27 29 3b 0a  's', 't', 'u');.
b900: 20 20 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 74    }.} {}..proc t
b910: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 7b 74 6e  est_efkey_29 {tn
b920: 20 73 71 6c 20 69 73 45 72 72 6f 72 7d 20 7b 0a   sql isError} {.
b930: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
b940: 2d 33 34 2e 24 74 6e 20 22 63 61 74 63 68 73 71  -34.$tn "catchsq
b950: 6c 20 7b 24 73 71 6c 7d 22 20 5b 0a 20 20 20 20  l {$sql}" [.    
b960: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
b970: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
b980: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
b990: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 0a 20 20 5d  }}} $isError.  ]
b9a0: 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39  .}.test_efkey_29
b9b0: 20 20 32 20 22 42 45 47 49 4e 22 20 20 20 20 20    2 "BEGIN"     
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
b9e0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 33  test_efkey_29  3
b9f0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61   "DELETE FROM pa
ba00: 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
ba10: 61 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73  a'"        1.tes
ba20: 74 5f 65 66 6b 65 79 5f 32 39 20 20 34 20 22 44  t_efkey_29  4 "D
ba30: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
ba40: 74 20 57 48 45 52 45 20 78 20 3d 20 27 64 27 22  t WHERE x = 'd'"
ba50: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
ba60: 66 6b 65 79 5f 32 39 20 20 35 20 22 44 45 4c 45  fkey_29  5 "DELE
ba70: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
ba80: 48 45 52 45 20 78 20 3d 20 27 67 27 22 20 20 20  HERE x = 'g'"   
ba90: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
baa0: 79 5f 32 39 20 20 36 20 22 44 45 4c 45 54 45 20  y_29  6 "DELETE 
bab0: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
bac0: 45 20 78 20 3d 20 27 6a 27 22 20 20 20 20 20 20  E x = 'j'"      
bad0: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
bae0: 39 20 20 37 20 22 44 45 4c 45 54 45 20 46 52 4f  9  7 "DELETE FRO
baf0: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
bb00: 20 3d 20 27 6d 27 22 20 20 20 20 20 20 20 20 31   = 'm'"        1
bb10: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
bb20: 38 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  8 "DELETE FROM p
bb30: 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
bb40: 27 70 27 22 20 20 20 20 20 20 20 20 31 0a 74 65  'p'"        1.te
bb50: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39 20 22  st_efkey_29  9 "
bb60: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
bb70: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 73 27  nt WHERE x = 's'
bb80: 22 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f  "        0.test_
bb90: 65 66 6b 65 79 5f 32 39 20 31 30 20 22 43 4f 4d  efkey_29 10 "COM
bba0: 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20  MIT"            
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bbd0: 65 79 5f 32 39 20 31 31 20 22 52 4f 4c 4c 42 41  ey_29 11 "ROLLBA
bbe0: 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20  CK"             
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79     0..test_efkey
bc10: 5f 32 39 20 20 39 20 22 42 45 47 49 4e 22 20 20  _29  9 "BEGIN"  
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   0.test_efkey_29
bc50: 20 31 30 20 22 55 50 44 41 54 45 20 70 61 72 65   10 "UPDATE pare
bc60: 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57  nt SET z = 'z' W
bc70: 48 45 52 45 20 7a 20 3d 20 27 63 27 22 20 31 0a  HERE z = 'c'" 1.
bc80: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 31  test_efkey_29 11
bc90: 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20   "UPDATE parent 
bca0: 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52  SET z = 'z' WHER
bcb0: 45 20 7a 20 3d 20 27 66 27 22 20 31 0a 74 65 73  E z = 'f'" 1.tes
bcc0: 74 5f 65 66 6b 65 79 5f 32 39 20 31 32 20 22 55  t_efkey_29 12 "U
bcd0: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
bce0: 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a   z = 'z' WHERE z
bcf0: 20 3d 20 27 69 27 22 20 31 0a 74 65 73 74 5f 65   = 'i'" 1.test_e
bd00: 66 6b 65 79 5f 32 39 20 31 33 20 22 55 50 44 41  fkey_29 13 "UPDA
bd10: 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20  TE parent SET z 
bd20: 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20  = 'z' WHERE z = 
bd30: 27 6c 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65  'l'" 1.test_efke
bd40: 79 5f 32 39 20 31 34 20 22 55 50 44 41 54 45 20  y_29 14 "UPDATE 
bd50: 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27  parent SET z = '
bd60: 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 6f 27  z' WHERE z = 'o'
bd70: 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32  " 1.test_efkey_2
bd80: 39 20 31 35 20 22 55 50 44 41 54 45 20 70 61 72  9 15 "UPDATE par
bd90: 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20  ent SET z = 'z' 
bda0: 57 48 45 52 45 20 7a 20 3d 20 27 72 27 22 20 31  WHERE z = 'r'" 1
bdb0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
bdc0: 36 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  6 "UPDATE parent
bdd0: 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45   SET z = 'z' WHE
bde0: 52 45 20 7a 20 3d 20 27 75 27 22 20 30 0a 74 65  RE z = 'u'" 0.te
bdf0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 37 20 22  st_efkey_29 17 "
be00: 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20  COMMIT"         
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
be30: 65 66 6b 65 79 5f 32 39 20 31 38 20 22 52 4f 4c  efkey_29 18 "ROL
be40: 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20  LBACK"          
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66        0..test_ef
be70: 6b 65 79 5f 32 39 20 31 37 20 22 42 45 47 49 4e  key_29 17 "BEGIN
be80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79      0.test_efkey
beb0: 5f 32 39 20 31 38 20 22 49 4e 53 45 52 54 20 49  _29 18 "INSERT I
bec0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c  NTO c1 VALUES(1,
bed0: 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20   2, 3)"         
bee0: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
bef0: 20 31 39 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   19 "INSERT INTO
bf00: 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   c2 VALUES(1, 2,
bf10: 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a   3)"          1.
bf20: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 30  test_efkey_29 20
bf30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33   "INSERT INTO c3
bf40: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
bf50: 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73  "          1.tes
bf60: 74 5f 65 66 6b 65 79 5f 32 39 20 32 31 20 22 49  t_efkey_29 21 "I
bf70: 4e 53 45 52 54 20 49 4e 54 4f 20 63 34 20 56 41  NSERT INTO c4 VA
bf80: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20  LUES(1, 2, 3)"  
bf90: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
bfa0: 66 6b 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45  fkey_29 22 "INSE
bfb0: 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45  RT INTO c5 VALUE
bfc0: 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  S(1, 2, 3)"     
bfd0: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
bfe0: 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54 20  y_29 22 "INSERT 
bff0: 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28 31  INTO c6 VALUES(1
c000: 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20  , 2, 3)"        
c010: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c020: 39 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54  9 22 "INSERT INT
c030: 4f 20 63 37 20 56 41 4c 55 45 53 28 31 2c 20 32  O c7 VALUES(1, 2
c040: 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20 30  , 3)"          0
c050: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
c060: 33 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20  3 "COMMIT"      
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c090: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 34 20 22  st_efkey_29 24 "
c0a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
c0b0: 6e 74 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  nt VALUES(1, 2, 
c0c0: 33 29 22 20 20 20 20 20 20 30 0a 74 65 73 74 5f  3)"      0.test_
c0d0: 65 66 6b 65 79 5f 32 39 20 32 35 20 22 43 4f 4d  efkey_29 25 "COM
c0e0: 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20  MIT"            
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66        0..test_ef
c110: 6b 65 79 5f 32 39 20 32 36 20 22 42 45 47 49 4e  key_29 26 "BEGIN
c120: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79      0.test_efkey
c150: 5f 32 39 20 32 37 20 22 55 50 44 41 54 45 20 63  _29 27 "UPDATE c
c160: 31 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20  1 SET a = 10"   
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
c190: 20 32 38 20 22 55 50 44 41 54 45 20 63 32 20 53   28 "UPDATE c2 S
c1a0: 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20  ET a = 10"      
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
c1c0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 39  test_efkey_29 29
c1d0: 20 22 55 50 44 41 54 45 20 63 33 20 53 45 54 20   "UPDATE c3 SET 
c1e0: 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20  a = 10"         
c1f0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73             1.tes
c200: 74 5f 65 66 6b 65 79 5f 32 39 20 33 30 20 22 55  t_efkey_29 30 "U
c210: 50 44 41 54 45 20 63 34 20 53 45 54 20 61 20 3d  PDATE c4 SET a =
c220: 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20   10"            
c230: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
c240: 66 6b 65 79 5f 32 39 20 33 31 20 22 55 50 44 41  fkey_29 31 "UPDA
c250: 54 45 20 63 35 20 53 45 54 20 61 20 3d 20 31 30  TE c5 SET a = 10
c260: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c270: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c280: 79 5f 32 39 20 33 31 20 22 55 50 44 41 54 45 20  y_29 31 "UPDATE 
c290: 63 36 20 53 45 54 20 61 20 3d 20 31 30 22 20 20  c6 SET a = 10"  
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c2c0: 39 20 33 31 20 22 55 50 44 41 54 45 20 63 37 20  9 31 "UPDATE c7 
c2d0: 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20  SET a = 10"     
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c2f0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33  .test_efkey_29 3
c300: 32 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20  2 "COMMIT"      
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c330: 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 33 20 22  st_efkey_29 33 "
c340: 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20  ROLLBACK"       
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 20 20 20 20 20 20 20 30 0a 0a 23 2d 2d 2d           0..#---
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3b0: 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
c3c0: 45 2d 4f 46 3a 20 52 2d 32 34 34 39 39 2d 35 37  E-OF: R-24499-57
c3d0: 30 37 31 0a 23 0a 23 20 54 65 73 74 20 61 6e 20  071.#.# Test an 
c3e0: 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 66 6f 72  example from for
c3f0: 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 20 64 65  eignkeys.html de
c400: 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 65 66  aling with a def
c410: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 0a 23  erred foreign .#
c420: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e   key constraint.
c430: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
c440: 79 2d 33 35 2e 31 20 7b 0a 20 20 64 72 6f 70 5f  y-35.1 {.  drop_
c450: 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
c460: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
c470: 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a  E TABLE artist(.
c480: 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20        artistid  
c490: 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52    INTEGER PRIMAR
c4a0: 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72  Y KEY, .      ar
c4b0: 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20  tistname  TEXT. 
c4c0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
c4d0: 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20   TABLE track(.  
c4e0: 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20      trackid     
c4f0: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74  INTEGER,.      t
c500: 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
c510: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
c520: 69 73 74 20 49 4e 54 45 47 45 52 20 52 45 46 45  ist INTEGER REFE
c530: 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72  RENCES artist(ar
c540: 74 69 73 74 69 64 29 20 44 45 46 45 52 52 41 42  tistid) DEFERRAB
c550: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
c560: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d  ERRED.    );.  }
c570: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
c580: 66 6b 65 79 2d 33 35 2e 32 20 7b 0a 20 20 65 78  fkey-35.2 {.  ex
c590: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
c5a0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
c5b0: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
c5c0: 53 28 31 2c 20 27 57 68 69 74 65 20 43 68 72 69  S(1, 'White Chri
c5d0: 73 74 6d 61 73 27 2c 20 35 29 3b 0a 20 20 7d 0a  stmas', 5);.  }.
c5e0: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
c5f0: 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  T.} {1 {foreign 
c600: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
c610: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
c620: 65 5f 66 6b 65 79 2d 33 35 2e 33 20 7b 0a 20 20  e_fkey-35.3 {.  
c630: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
c640: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
c650: 20 56 41 4c 55 45 53 28 35 2c 20 27 42 69 6e 67   VALUES(5, 'Bing
c660: 20 43 72 6f 73 62 79 27 29 3b 0a 20 20 20 20 43   Crosby');.    C
c670: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
c680: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65  -----------.# Ve
c6d0: 72 69 66 79 20 74 68 61 74 20 61 20 6e 65 73 74  rify that a nest
c6e0: 65 64 20 73 61 76 65 70 6f 69 6e 74 20 6d 61 79  ed savepoint may
c6f0: 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
c700: 68 6f 75 74 20 73 61 74 69 73 66 79 69 6e 67 20  hout satisfying 
c710: 0a 23 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  .# deferred fore
c720: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
c730: 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  nts..#.# EVIDENC
c740: 45 2d 4f 46 3a 20 52 2d 30 37 32 32 33 2d 34 38  E-OF: R-07223-48
c750: 33 32 33 20 41 20 6e 65 73 74 65 64 20 73 61 76  323 A nested sav
c760: 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
c770: 6f 6e 20 6d 61 79 20 62 65 0a 23 20 52 45 4c 45  on may be.# RELE
c780: 41 53 45 64 20 77 68 69 6c 65 20 74 68 65 20 64  ASEd while the d
c790: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 20  atabase is in a 
c7a0: 73 74 61 74 65 20 74 68 61 74 20 64 6f 65 73 20  state that does 
c7b0: 6e 6f 74 20 73 61 74 69 73 66 79 20 61 0a 23 20  not satisfy a.# 
c7c0: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
c7d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e   key constraint.
c7e0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
c7f0: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
c800: 79 2d 33 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-36.1 {.  execs
c810: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
c820: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
c830: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 62 20  RY KEY,.      b 
c840: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45  REFERENCES t1 DE
c850: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
c860: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
c870: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
c880: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
c890: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
c8a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
c8b0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
c8c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
c8d0: 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 3);.  }.} {}.d
c8e0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36  o_test e_fkey-36
c8f0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
c900: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
c910: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
c920: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
c930: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
c940: 2c 20 35 29 3b 0a 20 20 20 20 20 20 52 45 4c 45  , 5);.      RELE
c950: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b  ASE one;.  }.} {
c960: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
c970: 2d 33 36 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -36.3 {.  catchs
c980: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
c990: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
c9a0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
c9b0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
c9c0: 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.4 {.  execsql 
c9d0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  {.    UPDATE t1 
c9e0: 53 45 54 20 61 20 3d 20 35 20 57 48 45 52 45 20  SET a = 5 WHERE 
c9f0: 61 20 3d 20 34 3b 0a 20 20 20 20 43 4f 4d 4d 49  a = 4;.    COMMI
ca00: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d  T;.  }.} {}...#-
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
ca60: 20 74 68 61 74 20 61 20 74 72 61 6e 73 61 63 74   that a transact
ca70: 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 28 61  ion savepoint (a
ca80: 6e 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  n outermost save
ca90: 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20 77 68 65  point opened whe
caa0: 6e 0a 23 20 74 68 65 20 64 61 74 61 62 61 73 65  n.# the database
cab0: 20 77 61 73 20 69 6e 20 61 75 74 6f 2d 63 6f 6d   was in auto-com
cac0: 6d 69 74 20 6d 6f 64 65 29 20 63 61 6e 6e 6f 74  mit mode) cannot
cad0: 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
cae0: 68 6f 75 74 0a 23 20 73 61 74 69 73 66 79 69 6e  hout.# satisfyin
caf0: 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
cb00: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
cb10: 74 73 2e 20 49 74 20 6d 61 79 20 62 65 20 72 6f  ts. It may be ro
cb20: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45  lled back..#.# E
cb30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
cb40: 32 39 35 2d 31 33 38 32 33 20 41 20 74 72 61 6e  295-13823 A tran
cb50: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
cb60: 74 20 28 61 20 6e 6f 6e 2d 6e 65 73 74 65 64 0a  t (a non-nested.
cb70: 23 20 73 61 76 65 70 6f 69 6e 74 20 74 68 61 74  # savepoint that
cb80: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 68 69 6c   was opened whil
cb90: 65 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  e there was not 
cba0: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65  currently an ope
cbb0: 6e 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n.# transaction)
cbc0: 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  , on the other h
cbd0: 61 6e 64 2c 20 69 73 20 73 75 62 6a 65 63 74 20  and, is subject 
cbe0: 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 73 74  to the same rest
cbf0: 72 69 63 74 69 6f 6e 73 0a 23 20 61 73 20 61 20  rictions.# as a 
cc00: 43 4f 4d 4d 49 54 20 2d 20 61 74 74 65 6d 70 74  COMMIT - attempt
cc10: 69 6e 67 20 74 6f 20 52 45 4c 45 41 53 45 20 69  ing to RELEASE i
cc20: 74 20 77 68 69 6c 65 20 74 68 65 20 64 61 74 61  t while the data
cc30: 62 61 73 65 20 69 73 20 69 6e 20 73 75 63 68 20  base is in such 
cc40: 61 0a 23 20 73 74 61 74 65 20 77 69 6c 6c 20 66  a.# state will f
cc50: 61 69 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ail..#.do_test e
cc60: 5f 66 6b 65 79 2d 33 37 2e 31 20 7b 0a 20 20 65  _fkey-37.1 {.  e
cc70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56  xecsql {.    SAV
cc80: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
cc90: 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b    SAVEPOINT two;
cca0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
ccb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
ccc0: 2c 20 37 29 3b 0a 20 20 20 20 20 20 52 45 4c 45  , 7);.      RELE
ccd0: 41 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b  ASE two;.  }.} {
cce0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
ccf0: 2d 33 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -37.2 {.  catchs
cd00: 71 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d  ql {RELEASE one}
cd10: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
cd20: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
cd30: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
cd40: 5f 66 6b 65 79 2d 33 37 2e 33 20 7b 0a 20 20 65  _fkey-37.3 {.  e
cd50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 55  xecsql {.      U
cd60: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
cd70: 20 37 20 57 48 45 52 45 20 61 20 3d 20 36 3b 0a   7 WHERE a = 6;.
cd80: 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b      RELEASE one;
cd90: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
cda0: 74 20 65 5f 66 6b 65 79 2d 33 37 2e 34 20 7b 0a  t e_fkey-37.4 {.
cdb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
cdc0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
cdd0: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74       SAVEPOINT t
cde0: 77 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  wo;.        INSE
cdf0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
ce00: 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  S(9, 10);.      
ce10: 52 45 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d  RELEASE two;.  }
ce20: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
ce30: 66 6b 65 79 2d 33 37 2e 35 20 7b 0a 20 20 63 61  fkey-37.5 {.  ca
ce40: 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20  tchsql {RELEASE 
ce50: 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  one}.} {1 {forei
ce60: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
ce70: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
ce80: 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 36 20 7b  st e_fkey-37.6 {
ce90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c 4c  .  execsql {ROLL
cea0: 42 41 43 4b 20 54 4f 20 6f 6e 65 20 3b 20 52 45  BACK TO one ; RE
ceb0: 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 7d 0a  LEASE one}.} {}.
cec0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
cf10: 73 74 20 74 68 61 74 20 69 66 20 61 20 43 4f 4d  st that if a COM
cf20: 4d 49 54 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  MIT operation fa
cf30: 69 6c 73 20 64 75 65 20 74 6f 20 64 65 66 65 72  ils due to defer
cf40: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
cf50: 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  .# constraints, 
cf60: 61 6e 79 20 6e 65 73 74 65 64 20 73 61 76 65 70  any nested savep
cf70: 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70 65  oints remain ope
cf80: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
cf90: 4f 46 3a 20 52 2d 33 37 37 33 36 2d 34 32 36 31  OF: R-37736-4261
cfa0: 36 20 49 66 20 61 20 43 4f 4d 4d 49 54 20 73 74  6 If a COMMIT st
cfb0: 61 74 65 6d 65 6e 74 20 28 6f 72 20 74 68 65 20  atement (or the 
cfc0: 52 45 4c 45 41 53 45 20 6f 66 20 61 0a 23 20 74  RELEASE of a.# t
cfd0: 72 61 6e 73 61 63 74 69 6f 6e 20 53 41 56 45 50  ransaction SAVEP
cfe0: 4f 49 4e 54 29 20 66 61 69 6c 73 20 62 65 63 61  OINT) fails beca
cff0: 75 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  use the database
d000: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
d010: 20 61 0a 23 20 73 74 61 74 65 20 74 68 61 74 20   a.# state that 
d020: 76 69 6f 6c 61 74 65 73 20 61 20 64 65 66 65 72  violates a defer
d030: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
d040: 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
d050: 68 65 72 65 20 61 72 65 0a 23 20 63 75 72 72 65  here are.# curre
d060: 6e 74 6c 79 20 6e 65 73 74 65 64 20 73 61 76 65  ntly nested save
d070: 70 6f 69 6e 74 73 2c 20 74 68 65 20 6e 65 73 74  points, the nest
d080: 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20 72 65  ed savepoints re
d090: 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f  main open..#.do_
d0a0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 31  test e_fkey-38.1
d0b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
d0c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
d0d0: 31 20 57 48 45 52 45 20 61 3e 33 3b 0a 20 20 20  1 WHERE a>3;.   
d0e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
d0f0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20  1;.  }.} {1 1 2 
d100: 32 20 33 20 33 7d 0a 64 6f 5f 74 65 73 74 20 65  2 3 3}.do_test e
d110: 5f 66 6b 65 79 2d 33 38 2e 32 20 7b 0a 20 20 65  _fkey-38.2 {.  e
d120: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
d130: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
d140: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d150: 34 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 41 56  4, 4);.      SAV
d160: 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20  EPOINT one;.    
d170: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d180: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
d190: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
d1a0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
d1b0: 20 7b 31 20 31 20 32 20 32 20 33 20 33 20 34 20   {1 1 2 2 3 3 4 
d1c0: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 65  4 5 6}.do_test e
d1d0: 5f 66 6b 65 79 2d 33 38 2e 33 20 7b 0a 20 20 63  _fkey-38.3 {.  c
d1e0: 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  atchsql COMMIT.}
d1f0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
d200: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
d210: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
d220: 6b 65 79 2d 33 38 2e 34 20 7b 0a 20 20 65 78 65  key-38.4 {.  exe
d230: 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42  csql {.    ROLLB
d240: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20  ACK TO one;.    
d250: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45  COMMIT;.    SELE
d260: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
d270: 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33  }.} {1 1 2 2 3 3
d280: 20 34 20 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 65   4 4}..do_test e
d290: 5f 66 6b 65 79 2d 33 38 2e 35 20 7b 0a 20 20 65  _fkey-38.5 {.  e
d2a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41 56  xecsql {.    SAV
d2b0: 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20 20 20  EPOINT a;.      
d2c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
d2d0: 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20  ALUES(5, 5);.   
d2e0: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 62 3b 0a     SAVEPOINT b;.
d2f0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
d300: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c  NTO t1 VALUES(6,
d310: 20 37 29 3b 0a 20 20 20 20 20 20 20 20 53 41 56   7);.        SAV
d320: 45 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20 20 20  EPOINT c;.      
d330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d340: 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29 3b  t1 VALUES(7, 8);
d350: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
d360: 74 20 65 5f 66 6b 65 79 2d 33 38 2e 36 20 7b 0a  t e_fkey-38.6 {.
d370: 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45    catchsql {RELE
d380: 41 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72  ASE a}.} {1 {for
d390: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
d3a0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
d3b0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 37  test e_fkey-38.7
d3c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 52   {.  execsql  {R
d3d0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 7d 0a 20 20  OLLBACK TO c}.  
d3e0: 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53  catchsql {RELEAS
d3f0: 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  E a}.} {1 {forei
d400: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
d410: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
d420: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 38 20 7b  st e_fkey-38.8 {
d430: 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 0a 20 20  .  execsql  {.  
d440: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 62 3b    ROLLBACK TO b;
d450: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 61 3b 0a  .    RELEASE a;.
d460: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
d470: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31  M t1;.  }.} {1 1
d480: 20 32 20 32 20 33 20 33 20 34 20 34 20 35 20 35   2 2 3 3 4 4 5 5
d490: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
d4a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
d4e0: 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 33 3a 20  ## SECTION 4.3: 
d4f0: 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
d500: 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 0a   UPDATE Actions.
d510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d550: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d  ###########..#--
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
d5b0: 68 61 74 20 63 6f 6e 66 69 67 75 72 65 64 20 4f  hat configured O
d5c0: 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20  N DELETE and ON 
d5d0: 55 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20 74  UPDATE actions t
d5e0: 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 0a 23  ake place when.#
d5f0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 6d 6f 64   deleting or mod
d600: 69 66 79 69 6e 67 20 72 6f 77 73 20 6f 66 20 74  ifying rows of t
d610: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2c  he parent table,
d620: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23   respectively..#
d630: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
d640: 52 2d 34 38 32 37 30 2d 34 34 32 38 32 20 46 6f  R-48270-44282 Fo
d650: 72 65 69 67 6e 20 6b 65 79 20 4f 4e 20 44 45 4c  reign key ON DEL
d660: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
d670: 45 20 63 6c 61 75 73 65 73 0a 23 20 61 72 65 20  E clauses.# are 
d680: 75 73 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72  used to configur
d690: 65 20 61 63 74 69 6f 6e 73 20 74 68 61 74 20 74  e actions that t
d6a0: 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 20 64  ake place when d
d6b0: 65 6c 65 74 69 6e 67 20 72 6f 77 73 20 66 72 6f  eleting rows fro
d6c0: 6d 0a 23 20 74 68 65 20 70 61 72 65 6e 74 20 74  m.# the parent t
d6d0: 61 62 6c 65 20 28 4f 4e 20 44 45 4c 45 54 45 29  able (ON DELETE)
d6e0: 2c 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  , or modifying t
d6f0: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61  he parent key va
d700: 6c 75 65 73 20 6f 66 0a 23 20 65 78 69 73 74 69  lues of.# existi
d710: 6e 67 20 72 6f 77 73 20 28 4f 4e 20 55 50 44 41  ng rows (ON UPDA
d720: 54 45 29 2e 0a 23 0a 23 20 54 65 73 74 20 74 68  TE)..#.# Test th
d730: 61 74 20 61 20 73 69 6e 67 6c 65 20 46 4b 20 63  at a single FK c
d740: 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 68 61  onstraint may ha
d750: 76 65 20 64 69 66 66 65 72 65 6e 74 20 61 63 74  ve different act
d760: 69 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 0a  ions configured.
d770: 23 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20  # for ON DELETE 
d780: 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23  and ON UPDATE..#
d790: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
d7a0: 52 2d 34 38 31 32 34 2d 36 33 32 32 35 20 41 20  R-48124-63225 A 
d7b0: 73 69 6e 67 6c 65 20 66 6f 72 65 69 67 6e 20 6b  single foreign k
d7c0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61  ey constraint ma
d7d0: 79 20 68 61 76 65 0a 23 20 64 69 66 66 65 72 65  y have.# differe
d7e0: 6e 74 20 61 63 74 69 6f 6e 73 20 63 6f 6e 66 69  nt actions confi
d7f0: 67 75 72 65 64 20 66 6f 72 20 4f 4e 20 44 45 4c  gured for ON DEL
d800: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
d810: 45 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  E..#.do_test e_f
d820: 6b 65 79 2d 33 39 2e 31 20 7b 0a 20 20 65 78 65  key-39.1 {.  exe
d830: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
d840: 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 20 50  E TABLE p(a, b P
d850: 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b 0a  RIMARY KEY, c);.
d860: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d870: 20 63 31 28 64 2c 20 65 2c 20 66 20 44 45 46 41   c1(d, e, f DEFA
d880: 55 4c 54 20 27 6b 30 27 20 52 45 46 45 52 45 4e  ULT 'k0' REFEREN
d890: 43 45 53 20 70 20 0a 20 20 20 20 20 20 4f 4e 20  CES p .      ON 
d8a0: 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55  UPDATE SET DEFAU
d8b0: 4c 54 0a 20 20 20 20 20 20 4f 4e 20 44 45 4c 45  LT.      ON DELE
d8c0: 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20  TE SET NULL.    
d8d0: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
d8e0: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 30 2c 20  NTO p VALUES(0, 
d8f0: 27 6b 30 27 2c 20 27 27 29 3b 0a 20 20 20 20 49  'k0', '');.    I
d900: 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c  NSERT INTO p VAL
d910: 55 45 53 28 31 2c 20 27 6b 31 27 2c 20 27 49 27  UES(1, 'k1', 'I'
d920: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d930: 54 4f 20 70 20 56 41 4c 55 45 53 28 32 2c 20 27  TO p VALUES(2, '
d940: 6b 32 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20  k2', 'II');.    
d950: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
d960: 4c 55 45 53 28 33 2c 20 27 6b 33 27 2c 20 27 49  LUES(3, 'k3', 'I
d970: 49 49 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  II');..    INSER
d980: 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
d990: 28 31 2c 20 27 78 78 27 2c 20 27 6b 31 27 29 3b  (1, 'xx', 'k1');
d9a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d9b0: 20 63 31 20 56 41 4c 55 45 53 28 32 2c 20 27 78   c1 VALUES(2, 'x
d9c0: 78 27 2c 20 27 6b 32 27 29 3b 0a 20 20 20 20 49  x', 'k2');.    I
d9d0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
d9e0: 4c 55 45 53 28 33 2c 20 27 78 78 27 2c 20 27 6b  LUES(3, 'xx', 'k
d9f0: 33 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  3');.  }.} {}.do
da00: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e  _test e_fkey-39.
da10: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
da20: 20 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54      UPDATE p SET
da30: 20 62 20 3d 20 27 6b 34 27 20 57 48 45 52 45 20   b = 'k4' WHERE 
da40: 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43  a = 1;.    SELEC
da50: 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  T * FROM c1;.  }
da60: 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78  .} {1 xx k0 2 xx
da70: 20 6b 32 20 33 20 78 78 20 6b 33 7d 0a 64 6f 5f   k2 3 xx k3}.do_
da80: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 33  test e_fkey-39.3
da90: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
daa0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
dab0: 20 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20   WHERE a = 2;.  
dac0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
dad0: 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20  c1;.  }.} {1 xx 
dae0: 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78 20  k0 2 xx {} 3 xx 
daf0: 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  k3}.do_test e_fk
db00: 65 79 2d 33 39 2e 34 20 7b 0a 20 20 65 78 65 63  ey-39.4 {.  exec
db10: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
db20: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 69   UNIQUE INDEX pi
db30: 20 4f 4e 20 70 28 63 29 3b 0a 20 20 20 20 52 45   ON p(c);.    RE
db40: 50 4c 41 43 45 20 49 4e 54 4f 20 70 20 56 41 4c  PLACE INTO p VAL
db50: 55 45 53 28 35 2c 20 27 6b 35 27 2c 20 27 49 49  UES(5, 'k5', 'II
db60: 49 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  I');.    SELECT 
db70: 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d  * FROM c1;.  }.}
db80: 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20 7b   {1 xx k0 2 xx {
db90: 7d 20 33 20 78 78 20 7b 7d 7d 0a 0a 23 2d 2d 2d  } 3 xx {}}..#---
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbe0: 2d 2d 2d 2d 2d 2d 0a 23 20 45 61 63 68 20 66 6f  ------.# Each fo
dbf0: 72 65 69 67 6e 20 6b 65 79 20 69 6e 20 74 68 65  reign key in the
dc00: 20 73 79 73 74 65 6d 20 68 61 73 20 61 6e 20 4f   system has an O
dc10: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
dc20: 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 2c 0a 23  DELETE action,.#
dc30: 20 65 69 74 68 65 72 20 22 4e 4f 20 41 43 54 49   either "NO ACTI
dc40: 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c  ON", "RESTRICT",
dc50: 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53 45   "SET NULL", "SE
dc60: 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20 22 43  T DEFAULT" or "C
dc70: 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 45 56 49  ASCADE"..#.# EVI
dc80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 33 32  DENCE-OF: R-3332
dc90: 36 2d 34 35 32 35 32 20 54 68 65 20 4f 4e 20 44  6-45252 The ON D
dca0: 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44  ELETE and ON UPD
dcb0: 41 54 45 20 61 63 74 69 6f 6e 0a 23 20 61 73 73  ATE action.# ass
dcc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
dcd0: 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  h foreign key in
dce0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
dcf0: 61 73 65 20 69 73 20 6f 6e 65 20 6f 66 20 22 4e  ase is one of "N
dd00: 4f 0a 23 20 41 43 54 49 4f 4e 22 2c 20 22 52 45  O.# ACTION", "RE
dd10: 53 54 52 49 43 54 22 2c 20 22 53 45 54 20 4e 55  STRICT", "SET NU
dd20: 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41 55 4c  LL", "SET DEFAUL
dd30: 54 22 20 6f 72 20 22 43 41 53 43 41 44 45 22 2e  T" or "CASCADE".
dd40: 0a 23 0a 23 20 49 66 20 6e 6f 6e 65 20 69 73 20  .#.# If none is 
dd50: 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69 63  specified explic
dd60: 69 74 6c 79 2c 20 22 4e 4f 20 41 43 54 49 4f 4e  itly, "NO ACTION
dd70: 22 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  " is the default
dd80: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
dd90: 46 3a 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34  F: R-19803-45884
dda0: 20 49 66 20 61 6e 20 61 63 74 69 6f 6e 20 69 73   If an action is
ddb0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
ddc0: 73 70 65 63 69 66 69 65 64 2c 0a 23 20 69 74 20  specified,.# it 
ddd0: 64 65 66 61 75 6c 74 73 20 74 6f 20 22 4e 4f 20  defaults to "NO 
dde0: 41 43 54 49 4f 4e 22 2e 0a 23 20 0a 64 72 6f 70  ACTION"..# .drop
ddf0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
de00: 65 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e 31 20  est e_fkey-40.1 
de10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
de20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
de30: 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20  arent(x PRIMARY 
de40: 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  KEY, y);.    CRE
de50: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
de60: 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46  (a, .      b REF
de70: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
de80: 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49  N UPDATE NO ACTI
de90: 4f 4e 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53  ON ON DELETE RES
dea0: 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20  TRICT.    );.   
deb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
dec0: 69 6c 64 32 28 61 2c 20 0a 20 20 20 20 20 20 62  ild2(a, .      b
ded0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
dee0: 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53  nt ON UPDATE RES
def0: 54 52 49 43 54 20 4f 4e 20 44 45 4c 45 54 45 20  TRICT ON DELETE 
df00: 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a  SET NULL.    );.
df10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
df20: 20 63 68 69 6c 64 33 28 61 2c 20 0a 20 20 20 20   child3(a, .    
df30: 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70    b REFERENCES p
df40: 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20  arent ON UPDATE 
df50: 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c 45  SET NULL ON DELE
df60: 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20  TE SET DEFAULT. 
df70: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
df80: 20 54 41 42 4c 45 20 63 68 69 6c 64 34 28 61 2c   TABLE child4(a,
df90: 20 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45   .      b REFERE
dfa0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
dfb0: 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c  PDATE SET DEFAUL
dfc0: 54 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  T ON DELETE CASC
dfd0: 41 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  ADE.    );..    
dfe0: 2d 2d 20 43 72 65 61 74 65 20 73 6f 6d 65 20 66  -- Create some f
dff0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 74 68 61 74  oreign keys that
e000: 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   use the default
e010: 20 61 63 74 69 6f 6e 20 2d 20 22 4e 4f 20 41 43   action - "NO AC
e020: 54 49 4f 4e 22 0a 20 20 20 20 43 52 45 41 54 45  TION".    CREATE
e030: 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28 61 2c   TABLE child5(a,
e040: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61   b REFERENCES pa
e050: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 43  rent ON UPDATE C
e060: 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45  ASCADE);.    CRE
e070: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 36  ATE TABLE child6
e080: 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
e090: 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54   parent ON DELET
e0a0: 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20  E RESTRICT);.   
e0b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
e0c0: 69 6c 64 37 28 61 2c 20 62 20 52 45 46 45 52 45  ild7(a, b REFERE
e0d0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
e0e0: 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  ELETE NO ACTION)
e0f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e100: 4c 45 20 63 68 69 6c 64 38 28 61 2c 20 62 20 52  LE child8(a, b R
e110: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
e120: 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43   ON UPDATE NO AC
e130: 54 49 4f 4e 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  TION);.  }.} {}.
e140: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a 54 61  .foreach {tn zTa
e150: 62 20 6c 52 65 73 7d 20 7b 0a 20 20 32 20 63 68  b lRes} {.  2 ch
e160: 69 6c 64 31 20 7b 30 20 30 20 70 61 72 65 6e 74  ild1 {0 0 parent
e170: 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e   b {} {NO ACTION
e180: 7d 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d  } RESTRICT NONE}
e190: 0a 20 20 33 20 63 68 69 6c 64 32 20 7b 30 20 30  .  3 child2 {0 0
e1a0: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 52 45 53   parent b {} RES
e1b0: 54 52 49 43 54 20 7b 53 45 54 20 4e 55 4c 4c 7d  TRICT {SET NULL}
e1c0: 20 4e 4f 4e 45 7d 0a 20 20 34 20 63 68 69 6c 64   NONE}.  4 child
e1d0: 33 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20  3 {0 0 parent b 
e1e0: 7b 7d 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 7b 53  {} {SET NULL} {S
e1f0: 45 54 20 44 45 46 41 55 4c 54 7d 20 4e 4f 4e 45  ET DEFAULT} NONE
e200: 7d 0a 20 20 35 20 63 68 69 6c 64 34 20 7b 30 20  }.  5 child4 {0 
e210: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53  0 parent b {} {S
e220: 45 54 20 44 45 46 41 55 4c 54 7d 20 43 41 53 43  ET DEFAULT} CASC
e230: 41 44 45 20 4e 4f 4e 45 7d 0a 20 20 36 20 63 68  ADE NONE}.  6 ch
e240: 69 6c 64 35 20 7b 30 20 30 20 70 61 72 65 6e 74  ild5 {0 0 parent
e250: 20 62 20 7b 7d 20 43 41 53 43 41 44 45 20 7b 4e   b {} CASCADE {N
e260: 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a  O ACTION} NONE}.
e270: 20 20 37 20 63 68 69 6c 64 36 20 7b 30 20 30 20    7 child6 {0 0 
e280: 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20  parent b {} {NO 
e290: 41 43 54 49 4f 4e 7d 20 52 45 53 54 52 49 43 54  ACTION} RESTRICT
e2a0: 20 4e 4f 4e 45 7d 0a 20 20 38 20 63 68 69 6c 64   NONE}.  8 child
e2b0: 37 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62 20  7 {0 0 parent b 
e2c0: 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 7b  {} {NO ACTION} {
e2d0: 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d  NO ACTION} NONE}
e2e0: 0a 20 20 39 20 63 68 69 6c 64 38 20 7b 30 20 30  .  9 child8 {0 0
e2f0: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f   parent b {} {NO
e300: 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54   ACTION} {NO ACT
e310: 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 7d 20 7b 0a 20  ION} NONE}.} {. 
e320: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
e330: 34 30 2e 24 74 6e 20 7b 20 65 78 65 63 73 71 6c  40.$tn { execsql
e340: 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
e350: 5f 6b 65 79 5f 6c 69 73 74 28 24 7a 54 61 62 29  _key_list($zTab)
e360: 22 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d  " } $lRes.}..#--
e370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
e3c0: 68 61 74 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20  hat "NO ACTION" 
e3d0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 74 68 69  means that nothi
e3e0: 6e 67 20 68 61 70 70 65 6e 73 20 74 6f 20 61 20  ng happens to a 
e3f0: 63 68 69 6c 64 20 72 6f 77 20 77 68 65 6e 0a 23  child row when.#
e400: 20 69 74 27 73 20 70 61 72 65 6e 74 20 72 6f 77   it's parent row
e410: 20 69 73 20 75 70 64 61 74 65 64 20 6f 72 20 64   is updated or d
e420: 65 6c 65 74 65 64 2e 0a 23 0a 23 20 45 56 49 44  eleted..#.# EVID
e430: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 37 31  ENCE-OF: R-19971
e440: 2d 35 34 39 37 36 20 43 6f 6e 66 69 67 75 72 69  -54976 Configuri
e450: 6e 67 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20 6d  ng "NO ACTION" m
e460: 65 61 6e 73 20 6a 75 73 74 20 74 68 61 74 3a 0a  eans just that:.
e470: 23 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74 20  # when a parent 
e480: 6b 65 79 20 69 73 20 6d 6f 64 69 66 69 65 64 20  key is modified 
e490: 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
e4a0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
e4b0: 20 73 70 65 63 69 61 6c 0a 23 20 61 63 74 69 6f   special.# actio
e4c0: 6e 20 69 73 20 74 61 6b 65 6e 2e 0a 23 0a 64 72  n is taken..#.dr
e4d0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
e4e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e  _test e_fkey-41.
e4f0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
e500: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e510: 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 2c 20   parent(p1, p2, 
e520: 50 52 49 4d 41 52 59 20 4b 45 59 28 70 31 2c 20  PRIMARY KEY(p1, 
e530: 70 32 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45  p2));.    CREATE
e540: 20 54 41 42 4c 45 20 63 68 69 6c 64 28 63 31 2c   TABLE child(c1,
e550: 20 63 32 2c 20 0a 20 20 20 20 20 20 46 4f 52 45   c2, .      FORE
e560: 49 47 4e 20 4b 45 59 28 63 31 2c 20 63 32 29 20  IGN KEY(c1, c2) 
e570: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
e580: 74 0a 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54  t.      ON UPDAT
e590: 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20  E NO ACTION.    
e5a0: 20 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41    ON DELETE NO A
e5b0: 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45  CTION.      DEFE
e5c0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
e5d0: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
e5e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e5f0: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
e600: 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49 4e  j', 'k');.    IN
e610: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
e620: 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27   VALUES('l', 'm'
e630: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e640: 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28  TO child VALUES(
e650: 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49  'j', 'k');.    I
e660: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
e670: 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d 27   VALUES('l', 'm'
e680: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
e690: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20  est e_fkey-41.2 
e6a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
e6b0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
e6c0: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
e6d0: 20 70 31 3d 27 6b 27 20 57 48 45 52 45 20 70 31   p1='k' WHERE p1
e6e0: 3d 27 6a 27 3b 0a 20 20 20 20 20 20 44 45 4c 45  ='j';.      DELE
e6f0: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
e700: 48 45 52 45 20 70 31 3d 27 6c 27 3b 0a 20 20 20  HERE p1='l';.   
e710: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
e720: 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6a   child;.  }.} {j
e730: 20 6b 20 6c 20 6d 7d 0a 64 6f 5f 74 65 73 74 20   k l m}.do_test 
e740: 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20  e_fkey-41.3 {.  
e750: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
e760: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
e770: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
e780: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
e790: 66 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20 65 78  fkey-41.4 {.  ex
e7a0: 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d  ecsql ROLLBACK.}
e7b0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e800: 23 20 54 65 73 74 20 74 68 61 74 20 22 52 45 53  # Test that "RES
e810: 54 52 49 43 54 22 20 6d 65 61 6e 73 20 74 68 65  TRICT" means the
e820: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20   application is 
e830: 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f 6d 20  prohibited from 
e840: 64 65 6c 65 74 69 6e 67 0a 23 20 6f 72 20 75 70  deleting.# or up
e850: 64 61 74 69 6e 67 20 61 20 70 61 72 65 6e 74 20  dating a parent 
e860: 74 61 62 6c 65 20 72 6f 77 20 77 68 65 6e 20 74  table row when t
e870: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20  here exists one 
e880: 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b 65  or more child ke
e890: 79 73 0a 23 20 6d 61 70 70 65 64 20 74 6f 20 69  ys.# mapped to i
e8a0: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
e8b0: 4f 46 3a 20 52 2d 30 34 32 37 32 2d 33 38 36 35  OF: R-04272-3865
e8c0: 33 20 54 68 65 20 22 52 45 53 54 52 49 43 54 22  3 The "RESTRICT"
e8d0: 20 61 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68   action means th
e8e0: 61 74 20 74 68 65 0a 23 20 61 70 70 6c 69 63 61  at the.# applica
e8f0: 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62 69 74  tion is prohibit
e900: 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  ed from deleting
e910: 20 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20   (for ON DELETE 
e920: 52 45 53 54 52 49 43 54 29 20 6f 72 0a 23 20 6d  RESTRICT) or.# m
e930: 6f 64 69 66 79 69 6e 67 20 28 66 6f 72 20 4f 4e  odifying (for ON
e940: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
e950: 29 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77  ) a parent key w
e960: 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
e970: 20 6f 6e 65 0a 23 20 6f 72 20 6d 6f 72 65 20 63   one.# or more c
e980: 68 69 6c 64 20 6b 65 79 73 20 6d 61 70 70 65 64  hild keys mapped
e990: 20 74 6f 20 69 74 2e 0a 23 0a 64 72 6f 70 5f 61   to it..#.drop_a
e9a0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
e9b0: 74 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a  t e_fkey-41.1 {.
e9c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e9d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
e9e0: 65 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20 20 20  ent(p1, p2);.   
e9f0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
ea00: 4e 44 45 58 20 70 61 72 65 6e 74 5f 69 20 4f 4e  NDEX parent_i ON
ea10: 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 3b   parent(p1, p2);
ea20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ea30: 45 20 63 68 69 6c 64 31 28 63 31 2c 20 63 32 2c  E child1(c1, c2,
ea40: 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20   .      FOREIGN 
ea50: 4b 45 59 28 63 32 2c 20 63 31 29 20 52 45 46 45  KEY(c2, c1) REFE
ea60: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31  RENCES parent(p1
ea70: 2c 20 70 32 29 20 4f 4e 20 44 45 4c 45 54 45 20  , p2) ON DELETE 
ea80: 52 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a  RESTRICT.    );.
ea90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
eaa0: 20 63 68 69 6c 64 32 28 63 31 2c 20 63 32 2c 20   child2(c1, c2, 
eab0: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
eac0: 45 59 28 63 32 2c 20 63 31 29 20 52 45 46 45 52  EY(c2, c1) REFER
ead0: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31 2c  ENCES parent(p1,
eae0: 20 70 32 29 20 4f 4e 20 55 50 44 41 54 45 20 52   p2) ON UPDATE R
eaf0: 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20  ESTRICT.    );. 
eb00: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
eb10: 65 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20  e_fkey-41.2 {.  
eb20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
eb30: 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
eb40: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
eb50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
eb60: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
eb70: 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
eb80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
eb90: 64 31 20 56 41 4c 55 45 53 28 27 62 27 2c 20 27  d1 VALUES('b', '
eba0: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
ebb0: 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55  INTO child2 VALU
ebc0: 45 53 28 27 64 27 2c 20 27 63 27 29 3b 0a 20 20  ES('d', 'c');.  
ebd0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
ebe0: 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20 63  _fkey-41.3 {.  c
ebf0: 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
ec00: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
ec10: 52 45 20 70 31 20 3d 20 27 61 27 20 7d 0a 7d 20  RE p1 = 'a' }.} 
ec20: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
ec30: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ec40: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
ec50: 65 79 2d 34 31 2e 34 20 7b 0a 20 20 63 61 74 63  ey-41.4 {.  catc
ec60: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61  hsql { UPDATE pa
ec70: 72 65 6e 74 20 53 45 54 20 70 32 20 3d 20 27 65  rent SET p2 = 'e
ec80: 27 20 57 48 45 52 45 20 70 31 20 3d 20 27 63 27  ' WHERE p1 = 'c'
ec90: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
eca0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
ecb0: 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  failed}}..#-----
ecc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed00: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
ed10: 20 52 45 53 54 52 49 43 54 20 69 73 20 73 6c 69   RESTRICT is sli
ed20: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20  ghtly different 
ed30: 66 72 6f 6d 20 4e 4f 20 41 43 54 49 4f 4e 20 66  from NO ACTION f
ed40: 6f 72 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 63  or IMMEDIATE.# c
ed50: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 69 6e 20 74  onstraints, in t
ed60: 68 61 74 20 69 74 20 69 73 20 65 6e 66 6f 72 63  hat it is enforc
ed70: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
ed80: 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  not at the end o
ed90: 66 20 74 68 65 20 0a 23 20 73 74 61 74 65 6d 65  f the .# stateme
eda0: 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  nt..#.# EVIDENCE
edb0: 2d 4f 46 3a 20 52 2d 33 37 39 39 37 2d 34 32 31  -OF: R-37997-421
edc0: 38 37 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  87 The differenc
edd0: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 66  e between the ef
ede0: 66 65 63 74 20 6f 66 20 61 0a 23 20 52 45 53 54  fect of a.# REST
edf0: 52 49 43 54 20 61 63 74 69 6f 6e 20 61 6e 64 20  RICT action and 
ee00: 6e 6f 72 6d 61 6c 20 66 6f 72 65 69 67 6e 20 6b  normal foreign k
ee10: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e  ey constraint en
ee20: 66 6f 72 63 65 6d 65 6e 74 20 69 73 20 74 68 61  forcement is tha
ee30: 74 0a 23 20 74 68 65 20 52 45 53 54 52 49 43 54  t.# the RESTRICT
ee40: 20 61 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 69   action processi
ee50: 6e 67 20 68 61 70 70 65 6e 73 20 61 73 20 73 6f  ng happens as so
ee60: 6f 6e 20 61 73 20 74 68 65 20 66 69 65 6c 64 20  on as the field 
ee70: 69 73 20 75 70 64 61 74 65 64 0a 23 20 2d 20 6e  is updated.# - n
ee80: 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ot at the end of
ee90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
eea0: 74 65 6d 65 6e 74 20 61 73 20 69 74 20 77 6f 75  tement as it wou
eeb0: 6c 64 20 77 69 74 68 20 61 6e 0a 23 20 69 6d 6d  ld with an.# imm
eec0: 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e  ediate constrain
eed0: 74 2c 20 6f 72 20 61 74 20 74 68 65 20 65 6e 64  t, or at the end
eee0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
eef0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 73 20 69  transaction as i
ef00: 74 0a 23 20 77 6f 75 6c 64 20 77 69 74 68 20 61  t.# would with a
ef10: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
ef20: 61 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  aint..#.drop_all
ef30: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
ef40: 65 5f 66 6b 65 79 2d 34 32 2e 31 20 7b 0a 20 20  e_fkey-42.1 {.  
ef50: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
ef60: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
ef70: 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  t(x PRIMARY KEY)
ef80: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ef90: 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45  LE child1(c REFE
efa0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
efb0: 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54   UPDATE RESTRICT
efc0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
efd0: 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46  BLE child2(c REF
efe0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
eff0: 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49  N UPDATE NO ACTI
f000: 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  ON);..    INSERT
f010: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f020: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
f030: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
f040: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ent VALUES('key2
f050: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f060: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
f070: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
f080: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
f090: 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  2 VALUES('key2')
f0a0: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  ;..    CREATE TR
f0b0: 49 47 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41  IGGER parent_t A
f0c0: 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 70  FTER UPDATE ON p
f0d0: 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20  arent BEGIN.    
f0e0: 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 31 20    UPDATE child1 
f0f0: 73 65 74 20 63 20 3d 20 6e 65 77 2e 78 20 57 48  set c = new.x WH
f100: 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20  ERE c = old.x;. 
f110: 20 20 20 20 20 55 50 44 41 54 45 20 63 68 69 6c       UPDATE chil
f120: 64 32 20 73 65 74 20 63 20 3d 20 6e 65 77 2e 78  d2 set c = new.x
f130: 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78   WHERE c = old.x
f140: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
f150: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
f160: 65 79 2d 34 32 2e 32 20 7b 0a 20 20 63 61 74 63  ey-42.2 {.  catc
f170: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61  hsql { UPDATE pa
f180: 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
f190: 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d  y one' WHERE x =
f1a0: 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b   'key1' }.} {1 {
f1b0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f1c0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
f1d0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f1e0: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
f1f0: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 70 61  { .    UPDATE pa
f200: 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
f210: 79 20 74 77 6f 27 20 57 48 45 52 45 20 78 20 3d  y two' WHERE x =
f220: 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c   'key2';.    SEL
f230: 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64  ECT * FROM child
f240: 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 6b 65 79 20 74  2;.  }.} {{key t
f250: 77 6f 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74  wo}}..drop_all_t
f260: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
f270: 66 6b 65 79 2d 34 32 2e 34 20 7b 0a 20 20 65 78  fkey-42.4 {.  ex
f280: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
f290: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
f2a0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
f2b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f2c0: 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45   child1(c REFERE
f2d0: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
f2e0: 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 29 3b  ELETE RESTRICT);
f2f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f300: 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52  E child2(c REFER
f310: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
f320: 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
f330: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
f340: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f350: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
f360: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
f370: 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  t VALUES('key2')
f380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f390: 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28  O child1 VALUES(
f3a0: 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
f3b0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
f3c0: 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
f3d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
f3e0: 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41 46 54  GER parent_t AFT
f3f0: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70 61 72  ER DELETE ON par
f400: 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20  ent BEGIN.      
f410: 55 50 44 41 54 45 20 63 68 69 6c 64 31 20 53 45  UPDATE child1 SE
f420: 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45  T c = NULL WHERE
f430: 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20   c = old.x;.    
f440: 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 32 20    UPDATE child2 
f450: 53 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45  SET c = NULL WHE
f460: 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20  RE c = old.x;.  
f470: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
f480: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f490: 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.5 {.  catchsql
f4a0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
f4b0: 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
f4c0: 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66  'key1' }.} {1 {f
f4d0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
f4e0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
f4f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32  o_test e_fkey-42
f500: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
f510: 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f   .    DELETE FRO
f520: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
f530: 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53   = 'key2';.    S
f540: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69  ELECT * FROM chi
f550: 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a  ld2;.  }.} {{}}.
f560: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
f570: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f580: 34 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.7 {.  execsql
f590: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
f5a0: 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49  BLE parent(x PRI
f5b0: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
f5c0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
f5d0: 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d1(c REFERENCES 
f5e0: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
f5f0: 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20   RESTRICT);.    
f600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f610: 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld2(c REFERENCES
f620: 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54   parent ON DELET
f630: 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20  E NO ACTION);.. 
f640: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
f650: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
f660: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
f670: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f680: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
f690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
f6a0: 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ld1 VALUES('key1
f6b0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
f6c0: 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
f6d0: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 7d 0a 7d  S('key2');.  }.}
f6e0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
f6f0: 65 79 2d 34 32 2e 38 20 7b 0a 20 20 63 61 74 63  ey-42.8 {.  catc
f700: 68 73 71 6c 20 7b 20 52 45 50 4c 41 43 45 20 49  hsql { REPLACE I
f710: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
f720: 53 28 27 6b 65 79 31 27 29 20 7d 0a 7d 20 7b 31  S('key1') }.} {1
f730: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
f740: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
f750: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
f760: 2d 34 32 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  -42.9 {.  execsq
f770: 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c 41 43 45  l { .    REPLACE
f780: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
f790: 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
f7a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
f7b0: 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 6b 65  hild2;.  }.} {ke
f7c0: 79 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y2}..#----------
f7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f810: 23 20 54 65 73 74 20 74 68 61 74 20 52 45 53 54  # Test that REST
f820: 52 49 43 54 20 69 73 20 65 6e 66 6f 72 63 65 64  RICT is enforced
f830: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 65 76   immediately, ev
f840: 65 6e 20 66 6f 72 20 61 20 44 45 46 45 52 52 45  en for a DEFERRE
f850: 44 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a  D constraint..#.
f860: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
f870: 2d 32 34 31 37 39 2d 36 30 35 32 33 20 45 76 65  -24179-60523 Eve
f880: 6e 20 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e  n if the foreign
f890: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
f8a0: 69 74 20 69 73 0a 23 20 61 74 74 61 63 68 65 64  it is.# attached
f8b0: 20 74 6f 20 69 73 20 64 65 66 65 72 72 65 64 2c   to is deferred,
f8c0: 20 63 6f 6e 66 69 67 75 72 69 6e 67 20 61 20 52   configuring a R
f8d0: 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20 63  ESTRICT action c
f8e0: 61 75 73 65 73 20 53 51 4c 69 74 65 0a 23 20 74  auses SQLite.# t
f8f0: 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
f900: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  r immediately if
f910: 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77 69   a parent key wi
f920: 74 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69  th dependent chi
f930: 6c 64 0a 23 20 6b 65 79 73 20 69 73 20 64 65 6c  ld.# keys is del
f940: 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
f950: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
f960: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
f970: 65 79 2d 34 33 2e 31 20 7b 0a 20 20 65 78 65 63  ey-43.1 {.  exec
f980: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
f990: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20   TABLE parent(x 
f9a0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
f9b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
f9c0: 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43  hild1(c REFERENC
f9d0: 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44  ES parent ON UPD
f9e0: 41 54 45 20 52 45 53 54 52 49 43 54 0a 20 20 20  ATE RESTRICT.   
f9f0: 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e     DEFERRABLE IN
fa00: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
fa10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
fa20: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
fa30: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  c REFERENCES par
fa40: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f  ent ON UPDATE NO
fa50: 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45   ACTION.      DE
fa60: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
fa70: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
fa80: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
fa90: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
faa0: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
fab0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
fac0: 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  t VALUES('key2')
fad0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fae0: 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28  O child1 VALUES(
faf0: 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53  'key1');.    INS
fb00: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32 20  ERT INTO child2 
fb10: 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a  VALUES('key2');.
fb20: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a 7d      BEGIN;.  }.}
fb30: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
fb40: 65 79 2d 34 33 2e 32 20 7b 0a 20 20 63 61 74 63  ey-43.2 {.  catc
fb50: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70 61  hsql { UPDATE pa
fb60: 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
fb70: 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20 3d  y one' WHERE x =
fb80: 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b   'key1' }.} {1 {
fb90: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
fba0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
fbb0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
fbc0: 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
fbd0: 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20  { UPDATE parent 
fbe0: 53 45 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f  SET x = 'key two
fbf0: 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79  ' WHERE x = 'key
fc00: 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  2' }.} {}.do_tes
fc10: 74 20 65 5f 66 6b 65 79 2d 34 33 2e 34 20 7b 0a  t e_fkey-43.4 {.
fc20: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
fc30: 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  T.} {1 {foreign 
fc40: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
fc50: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
fc60: 65 5f 66 6b 65 79 2d 34 33 2e 35 20 7b 0a 20 20  e_fkey-43.5 {.  
fc70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
fc80: 44 41 54 45 20 63 68 69 6c 64 32 20 53 45 54 20  DATE child2 SET 
fc90: 63 20 3d 20 27 6b 65 79 20 74 77 6f 27 3b 0a 20  c = 'key two';. 
fca0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
fcb0: 20 7b 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61   {}..drop_all_ta
fcc0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
fcd0: 6b 65 79 2d 34 33 2e 36 20 7b 0a 20 20 65 78 65  key-43.6 {.  exe
fce0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
fcf0: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
fd00: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
fd10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fd20: 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e  child1(c REFEREN
fd30: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45  CES parent ON DE
fd40: 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a 20 20  LETE RESTRICT.  
fd50: 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49      DEFERRABLE I
fd60: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
fd70: 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  D.    );.    CRE
fd80: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
fd90: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
fda0: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e  rent ON DELETE N
fdb0: 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44  O ACTION.      D
fdc0: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
fdd0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
fde0: 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
fdf0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
fe00: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
fe10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
fe20: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  nt VALUES('key2'
fe30: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
fe40: 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53  TO child1 VALUES
fe50: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
fe60: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32  SERT INTO child2
fe70: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
fe80: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a  .    BEGIN;.  }.
fe90: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
fea0: 6b 65 79 2d 34 33 2e 37 20 7b 0a 20 20 63 61 74  key-43.7 {.  cat
feb0: 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
fec0: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
fed0: 20 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20   x = 'key1' }.} 
fee0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
fef0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ff00: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
ff10: 65 79 2d 34 33 2e 38 20 7b 0a 20 20 65 78 65 63  ey-43.8 {.  exec
ff20: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
ff30: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
ff40: 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20 7b 7d   = 'key2' }.} {}
ff50: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ff60: 34 33 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71  43.9 {.  catchsq
ff70: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66  l COMMIT.} {1 {f
ff80: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
ff90: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
ffa0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
ffb0: 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .10 {.  execsql 
ffc0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63 68 69  {.    UPDATE chi
ffd0: 6c 64 32 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c  ld2 SET c = NULL
ffe0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
fff0: 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  }.} {}..#-------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20 4e 55  --.# Test SET NU
10050 4c 4c 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20  LL actions..#.# 
10060 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
10070 33 33 35 33 2d 30 35 33 32 37 20 49 66 20 74 68  3353-05327 If th
10080 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 63 74  e configured act
10090 69 6f 6e 20 69 73 20 22 53 45 54 20 4e 55 4c 4c  ion is "SET NULL
100a0 22 2c 0a 23 20 74 68 65 6e 20 77 68 65 6e 20 61  ",.# then when a
100b0 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 64   parent key is d
100c0 65 6c 65 74 65 64 20 28 66 6f 72 20 4f 4e 20 44  eleted (for ON D
100d0 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 20  ELETE SET NULL) 
100e0 6f 72 20 6d 6f 64 69 66 69 65 64 0a 23 20 28 66  or modified.# (f
100f0 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54  or ON UPDATE SET
10100 20 4e 55 4c 4c 29 2c 20 74 68 65 20 63 68 69 6c   NULL), the chil
10110 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66  d key columns of
10120 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65   all rows in the
10130 0a 23 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74  .# child table t
10140 68 61 74 20 6d 61 70 70 65 64 20 74 6f 20 74 68  hat mapped to th
10150 65 20 70 61 72 65 6e 74 20 6b 65 79 20 61 72 65  e parent key are
10160 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
10170 53 51 4c 20 4e 55 4c 4c 0a 23 20 76 61 6c 75 65  SQL NULL.# value
10180 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  s..#.drop_all_ta
10190 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
101a0 6b 65 79 2d 34 34 2e 31 20 7b 0a 20 20 65 78 65  key-44.1 {.  exe
101b0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
101c0 45 20 54 41 42 4c 45 20 70 41 28 78 20 50 52 49  E TABLE pA(x PRI
101d0 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
101e0 52 45 41 54 45 20 54 41 42 4c 45 20 63 41 28 63  REATE TABLE cA(c
101f0 20 52 45 46 45 52 45 4e 43 45 53 20 70 41 20 4f   REFERENCES pA O
10200 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c  N DELETE SET NUL
10210 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  L);.    CREATE T
10220 41 42 4c 45 20 63 42 28 63 20 52 45 46 45 52 45  ABLE cB(c REFERE
10230 4e 43 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54  NCES pA ON UPDAT
10240 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 0a 20 20  E SET NULL);..  
10250 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41    INSERT INTO pA
10260 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27 29   VALUES(X'ABCD')
10270 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10280 4f 20 70 41 20 56 41 4c 55 45 53 28 58 27 31 32  O pA VALUES(X'12
10290 33 34 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  34');.    INSERT
102a0 20 49 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28   INTO cA VALUES(
102b0 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e  X'ABCD');.    IN
102c0 53 45 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c  SERT INTO cB VAL
102d0 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20  UES(X'1234');.  
102e0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
102f0 5f 66 6b 65 79 2d 34 34 2e 32 20 7b 0a 20 20 65  _fkey-44.2 {.  e
10300 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
10310 45 54 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52  ETE FROM pA WHER
10320 45 20 72 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  E rowid = 1;.   
10330 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29   SELECT quote(x)
10340 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20   FROM pA;.  }.} 
10350 7b 58 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73  {X'1234'}.do_tes
10360 74 20 65 5f 66 6b 65 79 2d 34 34 2e 33 20 7b 0a  t e_fkey-44.3 {.
10370 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10380 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20  SELECT quote(c) 
10390 46 52 4f 4d 20 63 41 3b 0a 20 20 7d 0a 7d 20 7b  FROM cA;.  }.} {
103a0 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  NULL}.do_test e_
103b0 66 6b 65 79 2d 34 34 2e 34 20 7b 0a 20 20 65 78  fkey-44.4 {.  ex
103c0 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
103d0 54 45 20 70 41 20 53 45 54 20 78 20 3d 20 58 27  TE pA SET x = X'
103e0 38 37 36 35 27 20 57 48 45 52 45 20 72 6f 77 69  8765' WHERE rowi
103f0 64 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43  d = 2;.    SELEC
10400 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20  T quote(x) FROM 
10410 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 38 37 36  pA;.  }.} {X'876
10420 35 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  5'}.do_test e_fk
10430 65 79 2d 34 34 2e 35 20 7b 0a 20 20 65 78 65 63  ey-44.5 {.  exec
10440 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f  sql { SELECT quo
10450 74 65 28 63 29 20 46 52 4f 4d 20 63 42 20 7d 0a  te(c) FROM cB }.
10460 7d 20 7b 4e 55 4c 4c 7d 0a 0a 23 2d 2d 2d 2d 2d  } {NULL}..#-----
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104b0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20  ----.# Test SET 
104c0 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e  DEFAULT actions.
104d0 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
104e0 3a 20 52 2d 34 33 30 35 34 2d 35 34 38 33 32 20  : R-43054-54832 
104f0 54 68 65 20 22 53 45 54 20 44 45 46 41 55 4c 54  The "SET DEFAULT
10500 22 20 61 63 74 69 6f 6e 73 20 61 72 65 20 73 69  " actions are si
10510 6d 69 6c 61 72 20 74 6f 0a 23 20 22 53 45 54 20  milar to.# "SET 
10520 4e 55 4c 4c 22 2c 20 65 78 63 65 70 74 20 74 68  NULL", except th
10530 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  at each of the c
10540 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  hild key columns
10550 20 69 73 20 73 65 74 20 74 6f 0a 23 20 63 6f 6e   is set to.# con
10560 74 61 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73  tain the columns
10570 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 69   default value i
10580 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 2e 0a  nstead of NULL..
10590 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
105a0 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
105b0 2d 34 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -45.1 {.  execsq
105c0 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
105d0 41 42 4c 45 20 70 41 28 78 20 50 52 49 4d 41 52  ABLE pA(x PRIMAR
105e0 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
105f0 54 45 20 54 41 42 4c 45 20 63 41 28 63 20 44 45  TE TABLE cA(c DE
10600 46 41 55 4c 54 20 58 27 30 30 30 30 27 20 52 45  FAULT X'0000' RE
10610 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20 44  FERENCES pA ON D
10620 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c  ELETE SET DEFAUL
10630 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
10640 41 42 4c 45 20 63 42 28 63 20 44 45 46 41 55 4c  ABLE cB(c DEFAUL
10650 54 20 58 27 39 39 39 39 27 20 52 45 46 45 52 45  T X'9999' REFERE
10660 4e 43 45 53 20 70 41 20 4f 4e 20 55 50 44 41 54  NCES pA ON UPDAT
10670 45 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a  E SET DEFAULT);.
10680 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10690 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56 41   pA(rowid, x) VA
106a0 4c 55 45 53 28 31 2c 20 58 27 30 30 30 30 27 29  LUES(1, X'0000')
106b0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
106c0 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20 56  O pA(rowid, x) V
106d0 41 4c 55 45 53 28 32 2c 20 58 27 39 39 39 39 27  ALUES(2, X'9999'
106e0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
106f0 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29 20  TO pA(rowid, x) 
10700 56 41 4c 55 45 53 28 33 2c 20 58 27 41 42 43 44  VALUES(3, X'ABCD
10710 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
10720 4e 54 4f 20 70 41 28 72 6f 77 69 64 2c 20 78 29  NTO pA(rowid, x)
10730 20 56 41 4c 55 45 53 28 34 2c 20 58 27 31 32 33   VALUES(4, X'123
10740 34 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  4');..    INSERT
10750 20 49 4e 54 4f 20 63 41 20 56 41 4c 55 45 53 28   INTO cA VALUES(
10760 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e  X'ABCD');.    IN
10770 53 45 52 54 20 49 4e 54 4f 20 63 42 20 56 41 4c  SERT INTO cB VAL
10780 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20  UES(X'1234');.  
10790 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
107a0 5f 66 6b 65 79 2d 34 35 2e 32 20 7b 0a 20 20 65  _fkey-45.2 {.  e
107b0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
107c0 45 54 45 20 46 52 4f 4d 20 70 41 20 57 48 45 52  ETE FROM pA WHER
107d0 45 20 72 6f 77 69 64 20 3d 20 33 3b 0a 20 20 20  E rowid = 3;.   
107e0 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29   SELECT quote(x)
107f0 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20   FROM pA;.  }.} 
10800 7b 58 27 30 30 30 30 27 20 58 27 39 39 39 39 27  {X'0000' X'9999'
10810 20 58 27 31 32 33 34 27 7d 0a 64 6f 5f 74 65 73   X'1234'}.do_tes
10820 74 20 65 5f 66 6b 65 79 2d 34 35 2e 33 20 7b 0a  t e_fkey-45.3 {.
10830 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
10840 43 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d  CT quote(c) FROM
10850 20 63 41 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27   cA }.} {X'0000'
10860 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10870 2d 34 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -45.4 {.  execsq
10880 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70  l {.    UPDATE p
10890 41 20 53 45 54 20 78 20 3d 20 58 27 38 37 36 35  A SET x = X'8765
108a0 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  ' WHERE rowid = 
108b0 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75  4;.    SELECT qu
108c0 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a  ote(x) FROM pA;.
108d0 20 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27 20 58    }.} {X'0000' X
108e0 27 39 39 39 39 27 20 58 27 38 37 36 35 27 7d 0a  '9999' X'8765'}.
108f0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10900 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.5 {.  execsql 
10910 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63  { SELECT quote(c
10920 29 20 46 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 58  ) FROM cB }.} {X
10930 27 39 39 39 39 27 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  '9999'}..#------
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10980 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 44 45  ---.# Test ON DE
10990 4c 45 54 45 20 43 41 53 43 41 44 45 20 61 63 74  LETE CASCADE act
109a0 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
109b0 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37 36 2d 35  CE-OF: R-61376-5
109c0 37 32 36 37 20 41 20 22 43 41 53 43 41 44 45 22  7267 A "CASCADE"
109d0 20 61 63 74 69 6f 6e 20 70 72 6f 70 61 67 61 74   action propagat
109e0 65 73 20 74 68 65 20 64 65 6c 65 74 65 20 6f 72  es the delete or
109f0 0a 23 20 75 70 64 61 74 65 20 6f 70 65 72 61 74  .# update operat
10a00 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ion on the paren
10a10 74 20 6b 65 79 20 74 6f 20 65 61 63 68 20 64 65  t key to each de
10a20 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b 65  pendent child ke
10a30 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  y..#.# EVIDENCE-
10a40 4f 46 3a 20 52 2d 36 31 38 30 39 2d 36 32 32 30  OF: R-61809-6220
10a50 37 20 46 6f 72 20 61 6e 20 22 4f 4e 20 44 45 4c  7 For an "ON DEL
10a60 45 54 45 20 43 41 53 43 41 44 45 22 20 61 63 74  ETE CASCADE" act
10a70 69 6f 6e 2c 20 74 68 69 73 0a 23 20 6d 65 61 6e  ion, this.# mean
10a80 73 20 74 68 61 74 20 65 61 63 68 20 72 6f 77 20  s that each row 
10a90 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  in the child tab
10aa0 6c 65 20 74 68 61 74 20 77 61 73 20 61 73 73 6f  le that was asso
10ab0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
10ac0 23 20 64 65 6c 65 74 65 64 20 70 61 72 65 6e 74  # deleted parent
10ad0 20 72 6f 77 20 69 73 20 61 6c 73 6f 20 64 65 6c   row is also del
10ae0 65 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  eted..#.drop_all
10af0 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
10b00 65 5f 66 6b 65 79 2d 34 36 2e 31 20 7b 0a 20 20  e_fkey-46.1 {.  
10b10 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
10b20 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 2c  EATE TABLE p1(a,
10b30 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
10b40 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
10b50 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 28  c REFERENCES p1(
10b60 62 29 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  b) ON DELETE CAS
10b70 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e  CADE, d);.    IN
10b80 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10b90 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
10ba0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10bb0 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   p1 VALUES(4, 4)
10bc0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10bd0 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O p1 VALUES(5, 5
10be0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10bf0 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO c1 VALUES(NUL
10c00 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
10c10 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
10c20 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
10c30 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10c40 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
10c50 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
10c60 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
10c70 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  3}.do_test e_fke
10c80 79 2d 34 36 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-46.2 {.  execs
10c90 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
10ca0 46 52 4f 4d 20 70 31 20 57 48 45 52 45 20 61 20  FROM p1 WHERE a 
10cb0 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 4;.    SELECT 
10cc0 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20  d, c FROM c1;.  
10cd0 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 35 20 35 7d 0a  }.} {{} {} 5 5}.
10ce0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10cf0 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
10d00 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
10d10 4d 20 70 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M p1;.    SELECT
10d20 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20   d, c FROM c1;. 
10d30 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f   }.} {{} {}}.do_
10d40 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 34  test e_fkey-46.4
10d50 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
10d60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 31 20  ELECT * FROM p1 
10d70 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {}...#------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 55 50  ---.# Test ON UP
10dd0 44 41 54 45 20 43 41 53 43 41 44 45 20 61 63 74  DATE CASCADE act
10de0 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
10df0 43 45 2d 4f 46 3a 20 52 2d 31 33 38 37 37 2d 36  CE-OF: R-13877-6
10e00 34 35 34 32 20 46 6f 72 20 61 6e 20 22 4f 4e 20  4542 For an "ON 
10e10 55 50 44 41 54 45 20 43 41 53 43 41 44 45 22 20  UPDATE CASCADE" 
10e20 61 63 74 69 6f 6e 2c 20 69 74 20 6d 65 61 6e 73  action, it means
10e30 0a 23 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  .# that the valu
10e40 65 73 20 73 74 6f 72 65 64 20 69 6e 20 65 61 63  es stored in eac
10e50 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c  h dependent chil
10e60 64 20 6b 65 79 20 61 72 65 20 6d 6f 64 69 66 69  d key are modifi
10e70 65 64 20 74 6f 0a 23 20 6d 61 74 63 68 20 74 68  ed to.# match th
10e80 65 20 6e 65 77 20 70 61 72 65 6e 74 20 6b 65 79  e new parent key
10e90 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45 56 49   values..#.# EVI
10ea0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37  DENCE-OF: R-6137
10eb0 36 2d 35 37 32 36 37 20 41 20 22 43 41 53 43 41  6-57267 A "CASCA
10ec0 44 45 22 20 61 63 74 69 6f 6e 20 70 72 6f 70 61  DE" action propa
10ed0 67 61 74 65 73 20 74 68 65 20 64 65 6c 65 74 65  gates the delete
10ee0 20 6f 72 0a 23 20 75 70 64 61 74 65 20 6f 70 65   or.# update ope
10ef0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61  ration on the pa
10f00 72 65 6e 74 20 6b 65 79 20 74 6f 20 65 61 63 68  rent key to each
10f10 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64   dependent child
10f20 20 6b 65 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c   key..#.drop_all
10f30 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
10f40 65 5f 66 6b 65 79 2d 34 37 2e 31 20 7b 0a 20 20  e_fkey-47.1 {.  
10f50 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
10f60 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 2c  EATE TABLE p1(a,
10f70 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
10f80 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
10f90 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 28  c REFERENCES p1(
10fa0 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  b) ON UPDATE CAS
10fb0 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49 4e  CADE, d);.    IN
10fc0 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10fd0 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
10fe0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10ff0 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29   p1 VALUES(4, 4)
11000 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11010 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20 35  O p1 VALUES(5, 5
11020 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11030 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO c1 VALUES(NUL
11040 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  L, NULL);.    IN
11050 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
11060 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49  UES(4, 4);.    I
11070 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
11080 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20  LUES(5, 5);.    
11090 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
110a0 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
110b0 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  3}.do_test e_fke
110c0 79 2d 34 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-47.2 {.  execs
110d0 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
110e0 70 31 20 53 45 54 20 62 20 3d 20 31 30 20 57 48  p1 SET b = 10 WH
110f0 45 52 45 20 62 20 3d 20 35 3b 0a 20 20 20 20 53  ERE b = 5;.    S
11100 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20  ELECT d, c FROM 
11110 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
11120 20 34 20 34 20 35 20 31 30 7d 0a 64 6f 5f 74 65   4 4 5 10}.do_te
11130 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 33 20 7b  st e_fkey-47.3 {
11140 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11150 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20 62   UPDATE p1 SET b
11160 20 3d 20 31 31 20 57 48 45 52 45 20 62 20 3d 20   = 11 WHERE b = 
11170 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c  4;.    SELECT d,
11180 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   c FROM c1;.  }.
11190 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20  } {{} {} 4 11 5 
111a0 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  10}.do_test e_fk
111b0 65 79 2d 34 37 2e 34 20 7b 0a 20 20 65 78 65 63  ey-47.4 {.  exec
111c0 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54  sql { .    UPDAT
111d0 45 20 70 31 20 53 45 54 20 62 20 3d 20 36 20 57  E p1 SET b = 6 W
111e0 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 3b 0a  HERE b IS NULL;.
111f0 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20      SELECT d, c 
11200 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM c1;.  }.} {
11210 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20 31 30 7d  {} {} 4 11 5 10}
11220 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
11230 34 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  46.5 {.  execsql
11240 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
11250 20 70 31 20 7d 0a 7d 20 7b 7b 7d 20 36 20 34 20   p1 }.} {{} 6 4 
11260 31 31 20 35 20 31 30 7d 0a 0a 23 2d 2d 2d 2d 2d  11 5 10}..#-----
11270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112b0 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
112c0 4f 46 3a 20 52 2d 36 35 30 35 38 2d 35 37 31 35  OF: R-65058-5715
112d0 38 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78  8.#.# Test an ex
112e0 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 22  ample from the "
112f0 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
11300 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 22   UPDATE Actions"
11310 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66   section .# of f
11320 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
11330 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
11340 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
11350 79 2d 34 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-48.1 {.  execs
11360 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
11370 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20 20  TABLE artist(.  
11380 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20 20      artistid    
11390 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
113a0 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74 69  KEY, .      arti
113b0 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20 20  stname  TEXT.   
113c0 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
113d0 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20 20  ABLE track(.    
113e0 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49 4e    trackid     IN
113f0 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72 61  TEGER,.      tra
11400 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20 0a  ckname   TEXT, .
11410 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69 73        trackartis
11420 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52 45  t INTEGER REFERE
11430 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74 69  NCES artist(arti
11440 73 74 69 64 29 20 4f 4e 20 55 50 44 41 54 45 20  stid) ON UPDATE 
11450 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a  CASCADE.    );..
11460 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11470 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 31 2c  artist VALUES(1,
11480 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 29 3b   'Dean Martin');
11490 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
114a0 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 32   artist VALUES(2
114b0 2c 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72 61  , 'Frank Sinatra
114c0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
114d0 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
114e0 28 31 31 2c 20 27 54 68 61 74 27 27 73 20 41 6d  (11, 'That''s Am
114f0 6f 72 65 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ore', 1);.    IN
11500 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
11510 56 41 4c 55 45 53 28 31 32 2c 20 27 43 68 72 69  VALUES(12, 'Chri
11520 73 74 6d 61 73 20 42 6c 75 65 73 27 2c 20 31 29  stmas Blues', 1)
11530 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11540 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
11550 33 2c 20 27 4d 79 20 57 61 79 27 2c 20 32 29 3b  3, 'My Way', 2);
11560 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
11570 74 20 65 5f 66 6b 65 79 2d 34 38 2e 32 20 7b 0a  t e_fkey-48.2 {.
11580 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11590 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
115a0 54 20 61 72 74 69 73 74 69 64 20 3d 20 31 30 30  T artistid = 100
115b0 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d   WHERE artistnam
115c0 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69 6e  e = 'Dean Martin
115d0 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ';.  }.} {}.do_t
115e0 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 33 20  est e_fkey-48.3 
115f0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
11600 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69  LECT * FROM arti
11610 73 74 20 7d 0a 7d 20 7b 32 20 7b 46 72 61 6e 6b  st }.} {2 {Frank
11620 20 53 69 6e 61 74 72 61 7d 20 31 30 30 20 7b 44   Sinatra} 100 {D
11630 65 61 6e 20 4d 61 72 74 69 6e 7d 7d 0a 64 6f 5f  ean Martin}}.do_
11640 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 34  test e_fkey-48.4
11650 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
11660 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 72 61  ELECT * FROM tra
11670 63 6b 20 7d 0a 7d 20 7b 31 31 20 7b 54 68 61 74  ck }.} {11 {That
11680 27 73 20 41 6d 6f 72 65 7d 20 31 30 30 20 31 32  's Amore} 100 12
11690 20 7b 43 68 72 69 73 74 6d 61 73 20 42 6c 75 65   {Christmas Blue
116a0 73 7d 20 31 30 30 20 31 33 20 7b 4d 79 20 57 61  s} 100 13 {My Wa
116b0 79 7d 20 32 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  y} 2}...#-------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11700 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  --.# Verify that
11710 20 61 64 64 69 6e 67 20 61 6e 20 46 4b 20 61 63   adding an FK ac
11720 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 62  tion does not ab
11730 73 6f 6c 76 65 20 74 68 65 20 75 73 65 72 20 6f  solve the user o
11740 66 20 74 68 65 20 0a 23 20 72 65 71 75 69 72 65  f the .# require
11750 6d 65 6e 74 20 6e 6f 74 20 74 6f 20 76 69 6f 6c  ment not to viol
11760 61 74 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ate the foreign 
11770 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  key constraint..
11780 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
11790 20 52 2d 35 33 39 36 38 2d 35 31 36 34 32 20 43   R-53968-51642 C
117a0 6f 6e 66 69 67 75 72 69 6e 67 20 61 6e 20 4f 4e  onfiguring an ON
117b0 20 55 50 44 41 54 45 20 6f 72 20 4f 4e 20 44 45   UPDATE or ON DE
117c0 4c 45 54 45 0a 23 20 61 63 74 69 6f 6e 20 64 6f  LETE.# action do
117d0 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74  es not mean that
117e0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
117f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 65 73   constraint does
11800 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 23 20 62   not need to.# b
11810 65 20 73 61 74 69 73 66 69 65 64 2e 0a 23 0a 64  e satisfied..#.d
11820 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
11830 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
11840 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
11850 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
11860 45 20 70 61 72 65 6e 74 28 61 20 43 4f 4c 4c 41  E parent(a COLLA
11870 54 45 20 6e 6f 63 61 73 65 2c 20 62 2c 20 63 2c  TE nocase, b, c,
11880 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 2c 20   PRIMARY KEY(c, 
11890 61 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  a));.    CREATE 
118a0 54 41 42 4c 45 20 63 68 69 6c 64 28 64 20 44 45  TABLE child(d DE
118b0 46 41 55 4c 54 20 27 61 27 2c 20 65 2c 20 66 20  FAULT 'a', e, f 
118c0 44 45 46 41 55 4c 54 20 27 63 27 2c 0a 20 20 20  DEFAULT 'c',.   
118d0 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66     FOREIGN KEY(f
118e0 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
118f0 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
11900 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
11910 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
11920 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
11930 45 53 28 27 41 27 2c 20 27 62 27 2c 20 27 63 27  ES('A', 'b', 'c'
11940 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11950 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
11960 28 27 4f 4e 45 27 2c 20 27 74 77 6f 27 2c 20 27  ('ONE', 'two', '
11970 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e 53  three');.    INS
11980 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56  ERT INTO child V
11990 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77  ALUES('one', 'tw
119a0 6f 27 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20  o', 'three');.  
119b0 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
119c0 5f 66 6b 65 79 2d 34 39 2e 32 20 7b 0a 20 20 65  _fkey-49.2 {.  e
119d0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
119e0 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
119f0 20 70 61 72 65 6e 74 20 53 45 54 20 61 20 3d 20   parent SET a = 
11a00 27 27 20 57 48 45 52 45 20 61 20 3d 20 27 6f 4e  '' WHERE a = 'oN
11a10 65 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  e';.      SELECT
11a20 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20   * FROM child;. 
11a30 20 7d 0a 7d 20 7b 61 20 74 77 6f 20 63 7d 0a 64   }.} {a two c}.d
11a40 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
11a50 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
11a60 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
11a70 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
11a80 61 72 65 6e 74 20 57 48 45 52 45 20 61 20 3d 20  arent WHERE a = 
11a90 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  'A';.    SELECT 
11aa0 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20  * FROM parent;. 
11ab0 20 7d 0a 7d 20 7b 4f 4e 45 20 74 77 6f 20 74 68   }.} {ONE two th
11ac0 72 65 65 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ree}.do_test e_f
11ad0 6b 65 79 2d 34 39 2e 34 20 7b 0a 20 20 63 61 74  key-49.4 {.  cat
11ae0 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70  chsql { UPDATE p
11af0 61 72 65 6e 74 20 53 45 54 20 61 20 3d 20 27 27  arent SET a = ''
11b00 20 57 48 45 52 45 20 61 20 3d 20 27 6f 4e 65 27   WHERE a = 'oNe'
11b10 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
11b20 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
11b30 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d  failed}}...#----
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b80 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
11b90 2d 4f 46 3a 20 52 2d 31 31 38 35 36 2d 31 39 38  -OF: R-11856-198
11ba0 33 36 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65  36.#.# Test an e
11bb0 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20  xample from the 
11bc0 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f  "ON DELETE and O
11bd0 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73  N UPDATE Actions
11be0 22 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20  " section .# of 
11bf0 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c  foreignkeys.html
11c00 2e 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 73  . This example s
11c10 68 6f 77 73 20 74 68 61 74 20 61 64 64 69 6e 67  hows that adding
11c20 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20 44   an "ON DELETE D
11c30 45 46 41 55 4c 54 22 0a 23 20 63 6c 61 75 73 65  EFAULT".# clause
11c40 20 64 6f 65 73 20 6e 6f 74 20 61 62 72 6f 67 61   does not abroga
11c50 74 65 20 74 68 65 20 6e 65 65 64 20 74 6f 20 73  te the need to s
11c60 61 74 69 73 66 79 20 74 68 65 20 66 6f 72 65 69  atisfy the forei
11c70 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
11c80 74 0a 23 20 28 52 2d 32 38 32 32 30 2d 34 36 36  t.# (R-28220-466
11c90 39 34 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  94)..#.# EVIDENC
11ca0 45 2d 4f 46 3a 20 52 2d 32 38 32 32 30 2d 34 36  E-OF: R-28220-46
11cb0 36 39 34 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  694 For example,
11cc0 20 69 66 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54   if an "ON DELET
11cd0 45 20 53 45 54 20 44 45 46 41 55 4c 54 22 0a 23  E SET DEFAULT".#
11ce0 20 61 63 74 69 6f 6e 20 69 73 20 63 6f 6e 66 69   action is confi
11cf0 67 75 72 65 64 2c 20 62 75 74 20 74 68 65 72 65  gured, but there
11d00 20 69 73 20 6e 6f 20 72 6f 77 20 69 6e 20 74 68   is no row in th
11d10 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 74  e parent table t
11d20 68 61 74 0a 23 20 63 6f 72 72 65 73 70 6f 6e 64  hat.# correspond
11d30 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
11d40 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 63   values of the c
11d50 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  hild key columns
11d60 2c 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 70  , deleting a.# p
11d70 61 72 65 6e 74 20 6b 65 79 20 77 68 69 6c 65 20  arent key while 
11d80 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20  dependent child 
11d90 6b 65 79 73 20 65 78 69 73 74 20 73 74 69 6c 6c  keys exist still
11da0 20 63 61 75 73 65 73 20 61 20 66 6f 72 65 69 67   causes a foreig
11db0 6e 20 6b 65 79 0a 23 20 76 69 6f 6c 61 74 69 6f  n key.# violatio
11dc0 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  n..#.drop_all_ta
11dd0 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
11de0 6b 65 79 2d 35 30 2e 31 20 7b 0a 20 20 65 78 65  key-50.1 {.  exe
11df0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
11e00 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a  E TABLE artist(.
11e10 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20        artistid  
11e20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52    INTEGER PRIMAR
11e30 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72  Y KEY, .      ar
11e40 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20  tistname  TEXT. 
11e50 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
11e60 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20   TABLE track(.  
11e70 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20      trackid     
11e80 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74  INTEGER,.      t
11e90 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
11ea0 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
11eb0 69 73 74 20 49 4e 54 45 47 45 52 20 44 45 46 41  ist INTEGER DEFA
11ec0 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45 53  ULT 0 REFERENCES
11ed0 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
11ee0 29 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  ) ON DELETE SET 
11ef0 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20  DEFAULT.    );. 
11f00 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
11f10 72 74 69 73 74 20 56 41 4c 55 45 53 28 33 2c 20  rtist VALUES(3, 
11f20 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e  'Sammy Davis Jr.
11f30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
11f40 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
11f50 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67  (14, 'Mr. Bojang
11f60 6c 65 73 27 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  les', 3);.  }.} 
11f70 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
11f80 79 2d 35 30 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-50.2 {.  catch
11f90 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
11fa0 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
11fb0 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53 61 6d  rtistname = 'Sam
11fc0 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 20 7d 0a  my Davis Jr.' }.
11fd0 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
11fe0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
11ff0 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
12000 66 6b 65 79 2d 35 30 2e 33 20 7b 0a 20 20 65 78  fkey-50.3 {.  ex
12010 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
12020 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
12030 41 4c 55 45 53 28 30 2c 20 27 55 6e 6b 6e 6f 77  ALUES(0, 'Unknow
12040 6e 20 41 72 74 69 73 74 27 29 3b 0a 20 20 20 20  n Artist');.    
12050 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
12060 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 6e  st WHERE artistn
12070 61 6d 65 20 3d 20 27 53 61 6d 6d 79 20 44 61 76  ame = 'Sammy Dav
12080 69 73 20 4a 72 2e 27 3b 0a 20 20 7d 0a 7d 20 7b  is Jr.';.  }.} {
12090 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
120a0 2d 35 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -50.4 {.  execsq
120b0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
120c0 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b 30 20  M artist }.} {0 
120d0 7b 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74 7d  {Unknown Artist}
120e0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
120f0 2d 35 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -50.5 {.  execsq
12100 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
12110 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b 31 34 20  M track }.} {14 
12120 7b 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 7d 20  {Mr. Bojangles} 
12130 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}..#-----------
12140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
12180 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12190 30 39 35 36 34 2d 32 32 31 37 30 0a 23 0a 23 20  09564-22170.#.# 
121a0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
121b0 72 64 65 72 20 6f 66 20 73 74 65 70 73 20 69 6e  rder of steps in
121c0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
121d0 4c 45 54 45 20 6f 6e 20 61 20 70 61 72 65 6e 74  LETE on a parent
121e0 20 0a 23 20 74 61 62 6c 65 20 69 73 20 61 73 20   .# table is as 
121f0 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 31  follows:.#.#   1
12200 2e 20 45 78 65 63 75 74 65 20 61 70 70 6c 69 63  . Execute applic
12210 61 62 6c 65 20 42 45 46 4f 52 45 20 74 72 69 67  able BEFORE trig
12220 67 65 72 20 70 72 6f 67 72 61 6d 73 2c 0a 23 20  ger programs,.# 
12230 20 20 32 2e 20 43 68 65 63 6b 20 6c 6f 63 61 6c    2. Check local
12240 20 28 6e 6f 6e 20 66 6f 72 65 69 67 6e 20 6b 65   (non foreign ke
12250 79 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 0a  y) constraints,.
12260 23 20 20 20 33 2e 20 55 70 64 61 74 65 20 6f 72  #   3. Update or
12270 20 64 65 6c 65 74 65 20 74 68 65 20 72 6f 77 20   delete the row 
12280 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
12290 62 6c 65 2c 0a 23 20 20 20 34 2e 20 50 65 72 66  ble,.#   4. Perf
122a0 6f 72 6d 20 61 6e 79 20 72 65 71 75 69 72 65 64  orm any required
122b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
122c0 69 6f 6e 73 2c 0a 23 20 20 20 35 2e 20 45 78 65  ions,.#   5. Exe
122d0 63 75 74 65 20 61 70 70 6c 69 63 61 62 6c 65 20  cute applicable 
122e0 41 46 54 45 52 20 74 72 69 67 67 65 72 20 70 72  AFTER trigger pr
122f0 6f 67 72 61 6d 73 2e 20 0a 23 0a 64 72 6f 70 5f  ograms. .#.drop_
12300 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
12310 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 31 20 7b  st e_fkey-51.1 {
12320 0a 20 20 70 72 6f 63 20 6d 61 78 70 61 72 65 6e  .  proc maxparen
12330 74 20 7b 61 72 67 73 7d 20 7b 20 64 62 20 6f 6e  t {args} { db on
12340 65 20 7b 53 45 4c 45 43 54 20 6d 61 78 28 78 29  e {SELECT max(x)
12350 20 46 52 4f 4d 20 70 61 72 65 6e 74 7d 20 7d 0a   FROM parent} }.
12360 20 20 64 62 20 66 75 6e 63 20 6d 61 78 70 61 72    db func maxpar
12370 65 6e 74 20 6d 61 78 70 61 72 65 6e 74 0a 0a 20  ent maxparent.. 
12380 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
12390 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
123a0 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(x PRIMARY KEY
123b0 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
123c0 52 49 47 47 45 52 20 62 75 20 42 45 46 4f 52 45  RIGGER bu BEFORE
123d0 20 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e   UPDATE ON paren
123e0 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  t BEGIN.      IN
123f0 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
12400 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2d 6f 6c   VALUES(new.x-ol
12410 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  d.x);.    END;. 
12420 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12430 63 68 69 6c 64 28 0a 20 20 20 20 20 20 61 20 44  child(.      a D
12440 45 46 41 55 4c 54 20 28 6d 61 78 70 61 72 65 6e  EFAULT (maxparen
12450 74 28 29 29 20 52 45 46 45 52 45 4e 43 45 53 20  t()) REFERENCES 
12460 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
12470 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
12480 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
12490 52 49 47 47 45 52 20 61 75 20 41 46 54 45 52 20  RIGGER au AFTER 
124a0 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74  UPDATE ON parent
124b0 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
124c0 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
124d0 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b 6f 6c 64  VALUES(new.x+old
124e0 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20  .x);.    END;.. 
124f0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
12500 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 29 3b  arent VALUES(1);
12510 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12520 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 31 29   child VALUES(1)
12530 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
12540 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 32 20 7b  st e_fkey-51.2 {
12550 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12560 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
12570 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20 53  ET x = 22;.    S
12580 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61 72  ELECT * FROM par
12590 65 6e 74 20 3b 20 53 45 4c 45 43 54 20 27 78 78  ent ; SELECT 'xx
125a0 78 27 20 3b 20 53 45 4c 45 43 54 20 61 20 46 52  x' ; SELECT a FR
125b0 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
125c0 7b 32 32 20 32 31 20 32 33 20 78 78 78 20 32 32  {22 21 23 xxx 22
125d0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
125e0 2d 35 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -51.3 {.  execsq
125f0 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
12600 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 20 20 44  ROM child;.    D
12610 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
12620 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  t;.    INSERT IN
12630 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
12640 28 2d 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  (-1);.    INSERT
12650 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55   INTO child VALU
12660 45 53 28 2d 31 29 3b 0a 20 20 20 20 55 50 44 41  ES(-1);.    UPDA
12670 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20  TE parent SET x 
12680 3d 20 32 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  = 22;.    SELECT
12690 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 3b   * FROM parent ;
126a0 20 53 45 4c 45 43 54 20 27 78 78 78 27 20 3b 20   SELECT 'xxx' ; 
126b0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 63 68  SELECT a FROM ch
126c0 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32 32 20 32  ild;.  }.} {22 2
126d0 33 20 32 31 20 78 78 78 20 32 33 7d 0a 0a 0a 23  3 21 xxx 23}...#
126e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
12730 66 79 20 74 68 61 74 20 4f 4e 20 55 50 44 41 54  fy that ON UPDAT
12740 45 20 61 63 74 69 6f 6e 73 20 6f 6e 6c 79 20 61  E actions only a
12750 63 74 75 61 6c 6c 79 20 74 61 6b 65 20 70 6c 61  ctually take pla
12760 63 65 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  ce if the parent
12770 20 6b 65 79 0a 23 20 69 73 20 73 65 74 20 74 6f   key.# is set to
12780 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 68 61   a new value tha
12790 74 20 69 73 20 64 69 73 74 69 6e 63 74 20 66 72  t is distinct fr
127a0 6f 6d 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  om the old value
127b0 2e 20 54 68 65 20 64 65 66 61 75 6c 74 0a 23 20  . The default.# 
127c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
127d0 63 65 20 61 6e 64 20 61 66 66 69 6e 69 74 79 20  ce and affinity 
127e0 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65  are used to dete
127f0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 77  rmine if the new
12800 20 76 61 6c 75 65 0a 23 20 69 73 20 27 64 69 73   value.# is 'dis
12810 74 69 6e 63 74 27 20 66 72 6f 6d 20 74 68 65 20  tinct' from the 
12820 6f 6c 64 20 6f 72 20 6e 6f 74 2e 0a 23 0a 23 20  old or not..#.# 
12830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
12840 37 33 38 33 2d 31 30 32 34 36 20 41 6e 20 4f 4e  7383-10246 An ON
12850 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 69   UPDATE action i
12860 73 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 69 66 20  s only taken if 
12870 74 68 65 0a 23 20 76 61 6c 75 65 73 20 6f 66 20  the.# values of 
12880 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 61  the parent key a
12890 72 65 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  re modified so t
128a0 68 61 74 20 74 68 65 20 6e 65 77 20 70 61 72 65  hat the new pare
128b0 6e 74 20 6b 65 79 0a 23 20 76 61 6c 75 65 73 20  nt key.# values 
128c0 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f  are not equal to
128d0 20 74 68 65 20 6f 6c 64 2e 0a 23 0a 64 72 6f 70   the old..#.drop
128e0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
128f0 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 31 20  est e_fkey-52.1 
12900 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12910 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a    CREATE TABLE z
12920 65 75 73 28 61 20 49 4e 54 45 47 45 52 20 43 4f  eus(a INTEGER CO
12930 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62 2c  LLATE NOCASE, b,
12940 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
12950 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
12960 54 41 42 4c 45 20 61 70 6f 6c 6c 6f 28 63 2c 20  TABLE apollo(c, 
12970 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47  d, .      FOREIG
12980 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
12990 52 45 4e 43 45 53 20 7a 65 75 73 20 4f 4e 20 55  RENCES zeus ON U
129a0 50 44 41 54 45 20 43 41 53 43 41 44 45 0a 20 20  PDATE CASCADE.  
129b0 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
129c0 49 4e 54 4f 20 7a 65 75 73 20 56 41 4c 55 45 53  INTO zeus VALUES
129d0 28 27 61 62 63 27 2c 20 27 78 79 7a 27 29 3b 0a  ('abc', 'xyz');.
129e0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
129f0 61 70 6f 6c 6c 6f 20 56 41 4c 55 45 53 28 27 41  apollo VALUES('A
12a00 42 43 27 2c 20 27 78 79 7a 27 29 3b 0a 20 20 7d  BC', 'xyz');.  }
12a10 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12a20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54   UPDATE zeus SET
12a30 20 61 20 3d 20 27 61 42 63 27 3b 0a 20 20 20 20   a = 'aBc';.    
12a40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 70  SELECT * FROM ap
12a50 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43  ollo;.  }.} {ABC
12a60 20 78 79 7a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f   xyz}.do_test e_
12a70 66 6b 65 79 2d 35 32 2e 32 20 7b 0a 20 20 65 78  fkey-52.2 {.  ex
12a80 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
12a90 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20  TE zeus SET a = 
12aa0 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20 20 53 45  1, b = 1;.    SE
12ab0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 70 6f 6c  LECT * FROM apol
12ac0 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 7d 0a  lo;.  }.} {1 1}.
12ad0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12ae0 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
12af0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75  {.    UPDATE zeu
12b00 73 20 53 45 54 20 61 20 3d 20 31 2c 20 62 20 3d  s SET a = 1, b =
12b10 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74   1;.    SELECT t
12b20 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70  ypeof(c), c, typ
12b30 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61  eof(d), d FROM a
12b40 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  pollo;.  }.} {in
12b50 74 65 67 65 72 20 31 20 69 6e 74 65 67 65 72 20  teger 1 integer 
12b60 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  1}.do_test e_fke
12b70 79 2d 35 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-52.4 {.  execs
12b80 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12b90 7a 65 75 73 20 53 45 54 20 61 20 3d 20 27 31 27  zeus SET a = '1'
12ba0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  ;.    SELECT typ
12bb0 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f  eof(c), c, typeo
12bc0 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f  f(d), d FROM apo
12bd0 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65  llo;.  }.} {inte
12be0 67 65 72 20 31 20 69 6e 74 65 67 65 72 20 31 7d  ger 1 integer 1}
12bf0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
12c00 35 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  52.5 {.  execsql
12c10 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65   {.    UPDATE ze
12c20 75 73 20 53 45 54 20 62 20 3d 20 27 31 27 3b 0a  us SET b = '1';.
12c30 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
12c40 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28  f(c), c, typeof(
12c50 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c  d), d FROM apoll
12c60 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  o;.  }.} {intege
12c70 72 20 31 20 74 65 78 74 20 31 7d 0a 64 6f 5f 74  r 1 text 1}.do_t
12c80 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 36 20  est e_fkey-52.6 
12c90 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12ca0 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45    UPDATE zeus SE
12cb0 54 20 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  T b = NULL;.    
12cc0 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29  SELECT typeof(c)
12cd0 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20  , c, typeof(d), 
12ce0 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20  d FROM apollo;. 
12cf0 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20   }.} {integer 1 
12d00 6e 75 6c 6c 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  null {}}..#-----
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d50 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
12d60 4f 46 3a 20 52 2d 33 35 31 32 39 2d 35 38 31 34  OF: R-35129-5814
12d70 31 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78  1.#.# Test an ex
12d80 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 22  ample from the "
12d90 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
12da0 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 22   UPDATE Actions"
12db0 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66   section .# of f
12dc0 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
12dd0 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 64 65   This example de
12de0 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 61 74 20  monstrates that 
12df0 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
12e00 73 0a 23 20 6f 6e 6c 79 20 74 61 6b 65 20 70 6c  s.# only take pl
12e10 61 63 65 20 69 66 20 61 74 20 6c 65 61 73 74 20  ace if at least 
12e20 6f 6e 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63  one parent key c
12e30 6f 6c 75 6d 6e 20 69 73 20 73 65 74 20 74 6f 20  olumn is set to 
12e40 61 20 76 61 6c 75 65 20 0a 23 20 74 68 61 74 20  a value .# that 
12e50 69 73 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  is distinct from
12e60 20 69 74 73 20 70 72 65 76 69 6f 75 73 20 76 61   its previous va
12e70 6c 75 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  lue..#.drop_all_
12e80 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
12e90 5f 66 6b 65 79 2d 35 33 2e 31 20 7b 0a 20 20 65  _fkey-53.1 {.  e
12ea0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
12eb0 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
12ec0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
12ed0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
12ee0 45 20 63 68 69 6c 64 28 79 20 52 45 46 45 52 45  E child(y REFERE
12ef0 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
12f00 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b  PDATE SET NULL);
12f10 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12f20 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
12f30 6b 65 79 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  key');.    INSER
12f40 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c  T INTO child VAL
12f50 55 45 53 28 27 6b 65 79 27 29 3b 0a 20 20 7d 0a  UES('key');.  }.
12f60 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
12f70 6b 65 79 2d 35 33 2e 32 20 7b 0a 20 20 65 78 65  key-53.2 {.  exe
12f80 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12f90 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
12fa0 20 27 6b 65 79 27 3b 0a 20 20 20 20 53 45 4c 45   'key';.    SELE
12fb0 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20 27 6e 75  CT IFNULL(y, 'nu
12fc0 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69 6c 64 3b  ll') FROM child;
12fd0 0a 20 20 7d 0a 7d 20 7b 6b 65 79 7d 0a 64 6f 5f  .  }.} {key}.do_
12fe0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 33  test e_fkey-53.3
12ff0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
13000 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
13010 20 53 45 54 20 78 20 3d 20 27 6b 65 79 32 27 3b   SET x = 'key2';
13020 0a 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55  .    SELECT IFNU
13030 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27 29 20 46 52  LL(y, 'null') FR
13040 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
13050 7b 6e 75 6c 6c 7d 0a 0a 23 23 23 23 23 23 23 23  {null}..########
13060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130a0 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
130b0 35 3a 20 43 52 45 41 54 45 2c 20 41 4c 54 45 52  5: CREATE, ALTER
130c0 20 61 6e 64 20 44 52 4f 50 20 54 41 42 4c 45 20   and DROP TABLE 
130d0 63 6f 6d 6d 61 6e 64 73 0a 23 23 23 23 23 23 23  commands.#######
130e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13100 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13120 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 0a 23 20 54 65 73 74 20 74 68 61 74 20 70 61 72  .# Test that par
13180 65 6e 74 20 6b 65 79 73 20 61 72 65 20 6e 6f 74  ent keys are not
13190 20 63 68 65 63 6b 65 64 20 77 68 65 6e 20 74 61   checked when ta
131a0 62 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  bles are created
131b0 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
131c0 46 3a 20 52 2d 33 36 30 31 38 2d 32 31 37 35 35  F: R-36018-21755
131d0 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   The parent key 
131e0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 66  definitions of f
131f0 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e  oreign key.# con
13200 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74  straints are not
13210 20 63 68 65 63 6b 65 64 20 77 68 65 6e 20 61 20   checked when a 
13220 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
13230 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
13240 46 3a 20 52 2d 32 35 33 38 34 2d 33 39 33 33 37  F: R-25384-39337
13250 20 54 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   There is nothin
13260 67 20 73 74 6f 70 70 69 6e 67 20 74 68 65 20 75  g stopping the u
13270 73 65 72 20 66 72 6f 6d 0a 23 20 63 72 65 61 74  ser from.# creat
13280 69 6e 67 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  ing a foreign ke
13290 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 68 61  y definition tha
132a0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 61  t refers to a pa
132b0 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a  rent table that.
132c0 23 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  # does not exist
132d0 2c 20 6f 72 20 74 6f 20 70 61 72 65 6e 74 20 6b  , or to parent k
132e0 65 79 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ey columns that 
132f0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  do not exist or 
13300 61 72 65 20 6e 6f 74 0a 23 20 63 6f 6c 6c 65 63  are not.# collec
13310 74 69 76 65 6c 79 20 62 6f 75 6e 64 20 62 79 20  tively bound by 
13320 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
13330 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13340 6e 74 2e 0a 23 0a 23 20 43 68 69 6c 64 20 6b 65  nt..#.# Child ke
13350 79 73 20 61 72 65 20 63 68 65 63 6b 65 64 20 74  ys are checked t
13360 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6d  o ensure all com
13370 70 6f 6e 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 65  ponent columns e
13380 78 69 73 74 2e 20 49 66 20 70 61 72 65 6e 74 0a  xist. If parent.
13390 23 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 72  # key columns ar
133a0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  e explicitly spe
133b0 63 69 66 69 65 64 2c 20 53 51 4c 69 74 65 20 63  cified, SQLite c
133c0 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65 20 73 75  hecks to make su
133d0 72 65 20 74 68 65 72 65 0a 23 20 61 72 65 20 74  re there.# are t
133e0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
133f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
13400 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e   child and paren
13410 74 20 6b 65 79 73 2e 20 28 54 4f 44 4f 3a 20 54  t keys. (TODO: T
13420 68 69 73 0a 23 20 69 73 20 74 65 73 74 65 64 20  his.# is tested 
13430 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 72  but does not cor
13440 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e 79 20 74  respond to any t
13450 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e  estable statemen
13460 74 2e 29 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73  t.).#.# Also tes
13470 74 20 74 68 61 74 20 74 68 65 20 61 62 6f 76 65  t that the above
13480 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
13490 74 72 75 65 20 72 65 67 61 72 64 6c 65 73 73 20  true regardless 
134a0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
134b0 74 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  t.# foreign keys
134c0 20 61 72 65 20 65 6e 61 62 6c 65 64 3a 20 20 22   are enabled:  "
134d0 41 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63  A CREATE TABLE c
134e0 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74 65 73 20  ommand operates 
134f0 74 68 65 20 73 61 6d 65 20 77 68 65 74 68 65 72  the same whether
13500 0a 23 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67  .# or not foreig
13510 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13520 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 22 0a  s are enabled.".
13530 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
13540 20 52 2d 30 38 39 30 38 2d 32 33 34 33 39 20 41   R-08908-23439 A
13550 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f   CREATE TABLE co
13560 6d 6d 61 6e 64 20 6f 70 65 72 61 74 65 73 20 74  mmand operates t
13570 68 65 20 73 61 6d 65 0a 23 20 77 68 65 74 68 65  he same.# whethe
13580 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e  r or not foreign
13590 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
135a0 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23 20   are enabled..# 
135b0 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a 43 72  .foreach {tn zCr
135c0 65 61 74 65 54 62 6c 20 6c 52 65 73 7d 20 7b 0a  eateTbl lRes} {.
135d0 20 20 31 20 22 43 52 45 41 54 45 20 54 41 42 4c    1 "CREATE TABL
135e0 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45  E t1(a, b REFERE
135f0 4e 43 45 53 20 74 31 29 22 20 20 20 20 20 20 20  NCES t1)"       
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 32 20       {0 {}}.  2 
13620 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13630 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
13640 20 74 32 29 22 20 20 20 20 20 20 20 20 20 20 20   t2)"           
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 7b 30 20 7b 7d 7d 0a 20 20 33 20 22 43 52 45   {0 {}}.  3 "CRE
13670 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13680 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
13690 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
136a0 31 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  1)"          {0 
136b0 7b 7d 7d 0a 20 20 34 20 22 43 52 45 41 54 45 20  {}}.  4 "CREATE 
136c0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
136d0 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
136e0 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20  REFERENCES t2)" 
136f0 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13700 20 20 35 20 22 43 52 45 41 54 45 20 54 41 42 4c    5 "CREATE TABL
13710 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13720 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13730 52 45 4e 43 45 53 20 74 32 29 22 20 20 20 20 20  RENCES t2)"     
13740 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 36 20       {0 {}}.  6 
13750 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13760 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13770 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
13780 45 53 20 74 32 28 6e 2c 64 29 29 22 20 20 20 20  ES t2(n,d))"    
13790 20 7b 30 20 7b 7d 7d 0a 20 20 37 20 22 43 52 45   {0 {}}.  7 "CRE
137a0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
137b0 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
137c0 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
137d0 31 28 61 2c 62 29 29 22 20 20 20 20 20 7b 30 20  1(a,b))"     {0 
137e0 7b 7d 7d 0a 0a 20 20 41 20 22 43 52 45 41 54 45  {}}..  A "CREATE
137f0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
13800 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 62 29  FOREIGN KEY(c,b)
13810 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22   REFERENCES t2)"
13820 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
13830 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  {1 {unknown colu
13840 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67  mn "c" in foreig
13850 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
13860 7d 7d 0a 20 20 42 20 22 43 52 45 41 54 45 20 54  }}.  B "CREATE T
13870 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f  ABLE t1(a, b, FO
13880 52 45 49 47 4e 20 4b 45 59 28 63 2c 62 29 20 52  REIGN KEY(c,b) R
13890 45 46 45 52 45 4e 43 45 53 20 74 32 28 64 29 29  EFERENCES t2(d))
138a0 22 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  "          .    
138b0 20 7b 31 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63   {1 {number of c
138c0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
138d0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
138e0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
138f0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
13900 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
13910 6c 65 7d 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  le}}.} {.  do_te
13920 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24 74 6e  st e_fkey-54.$tn
13930 2e 6f 66 66 20 7b 0a 20 20 20 20 64 72 6f 70 5f  .off {.    drop_
13940 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65  all_tables.    e
13950 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
13960 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
13970 46 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  F}.    catchsql 
13980 24 7a 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20  $zCreateTbl.  } 
13990 24 6c 52 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  $lRes.  do_test 
139a0 65 5f 66 6b 65 79 2d 35 34 2e 24 74 6e 2e 6f 6e  e_fkey-54.$tn.on
139b0 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f   {.    drop_all_
139c0 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63 73  tables.    execs
139d0 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
139e0 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 7d 0a 20 20  gn_keys = ON}.  
139f0 20 20 63 61 74 63 68 73 71 6c 20 24 7a 43 72 65    catchsql $zCre
13a00 61 74 65 54 62 6c 0a 20 20 7d 20 24 6c 52 65 73  ateTbl.  } $lRes
13a10 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
13a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
13a60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13a70 34 37 39 35 32 2d 36 32 34 39 38 20 49 74 20 69  47952-62498 It i
13a80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13a90 6f 20 75 73 65 20 74 68 65 20 22 41 4c 54 45 52  o use the "ALTER
13aa0 20 54 41 42 4c 45 0a 23 20 2e 2e 2e 20 41 44 44   TABLE.# ... ADD
13ab0 20 43 4f 4c 55 4d 4e 22 20 73 79 6e 74 61 78 20   COLUMN" syntax 
13ac0 74 6f 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20  to add a column 
13ad0 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 61 20  that includes a 
13ae0 52 45 46 45 52 45 4e 43 45 53 0a 23 20 63 6c 61  REFERENCES.# cla
13af0 75 73 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  use, unless the 
13b00 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
13b10 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
13b20 69 73 20 4e 55 4c 4c 2e 20 41 74 74 65 6d 70 74  is NULL. Attempt
13b30 69 6e 67 0a 23 20 74 6f 20 64 6f 20 73 6f 20 72  ing.# to do so r
13b40 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e  eturns an error.
13b50 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b  .#.proc test_efk
13b60 65 79 5f 36 20 7b 74 6e 20 7a 41 6c 74 65 72 20  ey_6 {tn zAlter 
13b70 69 73 45 72 72 6f 72 7d 20 7b 0a 20 20 64 72 6f  isError} {.  dro
13b80 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 20 0a 0a 20  p_all_tables .. 
13b90 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
13ba0 35 36 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 65  56.$tn.1 ".    e
13bb0 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
13bc0 54 41 42 4c 45 20 74 62 6c 28 61 2c 20 62 29 20  TABLE tbl(a, b) 
13bd0 7d 0a 20 20 20 20 5b 6c 69 73 74 20 63 61 74 63  }.    [list catc
13be0 68 73 71 6c 20 24 7a 41 6c 74 65 72 5d 0a 20 20  hsql $zAlter].  
13bf0 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d  " [lindex {{0 {}
13c00 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64  } {1 {Cannot add
13c10 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f   a REFERENCES co
13c20 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55  lumn with non-NU
13c30 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
13c40 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 0a 7d  }}} $isError]..}
13c50 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 31  ..test_efkey_6 1
13c60 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 62   "ALTER TABLE tb
13c70 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 52  l ADD COLUMN c R
13c80 45 46 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a  EFERENCES xx" 0.
13c90 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 32 20 22  test_efkey_6 2 "
13ca0 41 4c 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20  ALTER TABLE tbl 
13cb0 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46  ADD COLUMN c DEF
13cc0 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45  AULT NULL REFERE
13cd0 4e 43 45 53 20 78 78 22 20 30 0a 74 65 73 74 5f  NCES xx" 0.test_
13ce0 65 66 6b 65 79 5f 36 20 33 20 22 41 4c 54 45 52  efkey_6 3 "ALTER
13cf0 20 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43   TABLE tbl ADD C
13d00 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20  OLUMN c DEFAULT 
13d10 30 20 52 45 46 45 52 45 4e 43 45 53 20 78 78 22  0 REFERENCES xx"
13d20 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   1..#-----------
13d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
13d70 20 54 65 73 74 20 74 68 61 74 20 41 4c 54 45 52   Test that ALTER
13d80 20 54 41 42 4c 45 20 61 64 6a 75 73 74 73 20 52   TABLE adjusts R
13d90 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65  EFERENCES clause
13da0 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 65 6e  s when the paren
13db0 74 20 74 61 62 6c 65 0a 23 20 69 73 20 52 45 4e  t table.# is REN
13dc0 41 4d 45 44 2e 0a 23 0a 23 20 45 56 49 44 45 4e  AMED..#.# EVIDEN
13dd0 43 45 2d 4f 46 3a 20 52 2d 34 37 30 38 30 2d 30  CE-OF: R-47080-0
13de0 32 30 36 39 20 49 66 20 61 6e 20 22 41 4c 54 45  2069 If an "ALTE
13df0 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52 45 4e 41  R TABLE ... RENA
13e00 4d 45 20 54 4f 22 20 63 6f 6d 6d 61 6e 64 0a 23  ME TO" command.#
13e10 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 6e 61   is used to rena
13e20 6d 65 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  me a table that 
13e30 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  is the parent ta
13e40 62 6c 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  ble of one or mo
13e50 72 65 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79  re.# foreign key
13e60 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
13e70 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  e definitions of
13e80 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
13e90 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  .# constraints a
13ea0 72 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  re modified to r
13eb0 65 66 65 72 20 74 6f 20 74 68 65 20 70 61 72 65  efer to the pare
13ec0 6e 74 20 74 61 62 6c 65 20 62 79 20 69 74 73 20  nt table by its 
13ed0 6e 65 77 20 6e 61 6d 65 0a 23 0a 23 20 54 65 73  new name.#.# Tes
13ee0 74 20 74 68 61 74 20 74 68 65 73 65 20 61 64 6a  t that these adj
13ef0 75 73 74 6d 65 6e 74 73 20 61 72 65 20 76 69 73  ustments are vis
13f00 69 62 6c 65 20 69 6e 20 74 68 65 20 73 71 6c 69  ible in the sqli
13f10 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
13f20 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
13f30 3a 20 52 2d 36 33 38 32 37 2d 35 34 37 37 34 20  : R-63827-54774 
13f40 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
13f50 63 68 69 6c 64 20 43 52 45 41 54 45 20 54 41 42  child CREATE TAB
13f60 4c 45 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 6f  LE.# statement o
13f70 72 20 73 74 61 74 65 6d 65 6e 74 73 20 73 74 6f  r statements sto
13f80 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
13f90 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13fa0 72 65 20 6d 6f 64 69 66 69 65 64 0a 23 20 74 6f  re modified.# to
13fb0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
13fc0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
13fd0 6d 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  me..#.do_test e_
13fe0 66 6b 65 79 2d 35 36 2e 31 20 7b 0a 20 20 64 72  fkey-56.1 {.  dr
13ff0 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
14000 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
14010 45 41 54 45 20 54 41 42 4c 45 20 27 70 20 31 20  EATE TABLE 'p 1 
14020 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 28 61 20  "parent one"'(a 
14030 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20  REFERENCES 'p 1 
14040 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 2c 20 62  "parent one"', b
14050 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 29  , PRIMARY KEY(b)
14060 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
14070 41 42 4c 45 20 63 31 28 63 2c 20 64 20 52 45 46  ABLE c1(c, d REF
14080 45 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61  ERENCES 'p 1 "pa
14090 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50  rent one"' ON UP
140a0 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  DATE CASCADE);. 
140b0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
140c0 63 32 28 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e  c2(e, f, FOREIGN
140d0 20 4b 45 59 28 66 29 20 52 45 46 45 52 45 4e 43   KEY(f) REFERENC
140e0 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  ES 'p 1 "parent 
140f0 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20  one"' ON UPDATE 
14100 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52  CASCADE);.    CR
14110 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 65 2c  EATE TABLE c3(e,
14120 20 27 66 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45   'f col 2', FORE
14130 49 47 4e 20 4b 45 59 28 27 66 20 63 6f 6c 20 32  IGN KEY('f col 2
14140 27 29 20 52 45 46 45 52 45 4e 43 45 53 20 27 70  ') REFERENCES 'p
14150 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
14160 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
14170 44 45 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  DE);..    INSERT
14180 20 49 4e 54 4f 20 27 70 20 31 20 22 70 61 72 65   INTO 'p 1 "pare
14190 6e 74 20 6f 6e 65 22 27 20 56 41 4c 55 45 53 28  nt one"' VALUES(
141a0 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 1);.    INSER
141b0 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
141c0 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 1);.    INSE
141d0 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
141e0 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  S(1, 1);.    INS
141f0 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
14200 45 53 28 31 2c 20 31 29 3b 0a 0a 20 20 20 20 2d  ES(1, 1);..    -
14210 2d 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 71  - CREATE TABLE q
14220 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  (a, b, PRIMARY K
14230 45 59 28 62 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  EY(b));.  }.} {}
14240 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14250 35 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  56.2 {.  execsql
14260 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 27   { ALTER TABLE '
14270 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14280 27 20 52 45 4e 41 4d 45 20 54 4f 20 70 20 7d 0a  ' RENAME TO p }.
14290 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
142a0 6b 65 79 2d 35 36 2e 33 20 7b 0a 20 20 65 78 65  key-56.3 {.  exe
142b0 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
142c0 45 20 70 20 53 45 54 20 61 20 3d 20 27 78 78 78  E p SET a = 'xxx
142d0 27 2c 20 62 20 3d 20 27 78 78 78 27 3b 0a 20 20  ', b = 'xxx';.  
142e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
142f0 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  p;.    SELECT * 
14300 46 52 4f 4d 20 63 31 3b 0a 20 20 20 20 53 45 4c  FROM c1;.    SEL
14310 45 43 54 20 2a 20 46 52 4f 4d 20 63 32 3b 0a 20  ECT * FROM c2;. 
14320 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
14330 20 63 33 3b 0a 20 20 7d 0a 7d 20 7b 78 78 78 20   c3;.  }.} {xxx 
14340 78 78 78 20 31 20 78 78 78 20 31 20 78 78 78 20  xxx 1 xxx 1 xxx 
14350 31 20 78 78 78 7d 0a 64 6f 5f 74 65 73 74 20 65  1 xxx}.do_test e
14360 5f 66 6b 65 79 2d 35 36 2e 34 20 7b 0a 20 20 65  _fkey-56.4 {.  e
14370 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
14380 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
14390 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
143a0 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 7d 20 5b  e = 'table'}.} [
143b0 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52           \.  {CR
14400 45 41 54 45 20 54 41 42 4c 45 20 22 70 22 28 61  EATE TABLE "p"(a
14410 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 2c   REFERENCES "p",
14420 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
14430 62 29 29 7d 20 20 20 20 20 20 20 20 20 20 20 20  b))}            
14440 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52 45 41         \.  {CREA
14450 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64  TE TABLE c1(c, d
14460 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 20   REFERENCES "p" 
14470 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
14480 45 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  E)}             
14490 20 20 20 20 20 5c 0a 20 20 7b 43 52 45 41 54 45       \.  {CREATE
144a0 20 54 41 42 4c 45 20 63 32 28 65 2c 20 66 2c 20   TABLE c2(e, f, 
144b0 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 29 20 52  FOREIGN KEY(f) R
144c0 45 46 45 52 45 4e 43 45 53 20 22 70 22 20 4f 4e  EFERENCES "p" ON
144d0 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
144e0 7d 20 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54  }  \.  {CREATE T
144f0 41 42 4c 45 20 63 33 28 65 2c 20 27 66 20 63 6f  ABLE c3(e, 'f co
14500 6c 20 32 27 2c 20 46 4f 52 45 49 47 4e 20 4b 45  l 2', FOREIGN KE
14510 59 28 27 66 20 63 6f 6c 20 32 27 29 20 52 45 46  Y('f col 2') REF
14520 45 52 45 4e 43 45 53 20 22 70 22 20 4f 4e 20 55  ERENCES "p" ON U
14530 50 44 41 54 45 20 43 41 53 43 41 44 45 29 7d 20  PDATE CASCADE)} 
14540 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  \.]..#----------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14590 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 20 44  # Check that a D
145a0 52 4f 50 20 54 41 42 4c 45 20 64 6f 65 73 20 61  ROP TABLE does a
145b0 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54  n implicit DELET
145c0 45 20 46 52 4f 4d 2e 20 57 68 69 63 68 20 64 6f  E FROM. Which do
145d0 65 73 20 6e 6f 74 0a 23 20 63 61 75 73 65 20 61  es not.# cause a
145e0 6e 79 20 74 72 69 67 67 65 72 73 20 74 6f 20 66  ny triggers to f
145f0 69 72 65 2c 20 62 75 74 20 64 6f 65 73 20 66 69  ire, but does fi
14600 72 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  re foreign key a
14610 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44  ctions..#.# EVID
14620 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 32 30 38  ENCE-OF: R-14208
14630 2d 32 33 39 38 36 20 49 66 20 66 6f 72 65 69 67  -23986 If foreig
14640 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
14650 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20 77 68  s are enabled wh
14660 65 6e 0a 23 20 69 74 20 69 73 20 70 72 65 70 61  en.# it is prepa
14670 72 65 64 2c 20 74 68 65 20 44 52 4f 50 20 54 41  red, the DROP TA
14680 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 70 65 72 66  BLE command perf
14690 6f 72 6d 73 20 61 6e 20 69 6d 70 6c 69 63 69 74  orms an implicit
146a0 20 44 45 4c 45 54 45 20 74 6f 0a 23 20 72 65 6d   DELETE to.# rem
146b0 6f 76 65 20 61 6c 6c 20 72 6f 77 73 20 66 72 6f  ove all rows fro
146c0 6d 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  m the table befo
146d0 72 65 20 64 72 6f 70 70 69 6e 67 20 69 74 2e 0a  re dropping it..
146e0 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
146f0 20 52 2d 31 31 30 37 38 2d 30 33 39 34 35 20 54   R-11078-03945 T
14700 68 65 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45  he implicit DELE
14710 54 45 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  TE does not caus
14720 65 20 61 6e 79 20 53 51 4c 0a 23 20 74 72 69 67  e any SQL.# trig
14730 67 65 72 73 20 74 6f 20 66 69 72 65 2c 20 62 75  gers to fire, bu
14740 74 20 6d 61 79 20 69 6e 76 6f 6b 65 20 66 6f 72  t may invoke for
14750 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73  eign key actions
14760 20 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23   or constraint.#
14770 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 0a 23 0a 64   violations..#.d
14780 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14790 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
147a0 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
147b0 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
147c0 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52 49 4d  BLE p(a, b, PRIM
147d0 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
147e0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
147f0 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c1(c, d, FOREI
14800 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
14810 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14820 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20  ETE SET NULL);. 
14830 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14840 63 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c2(c, d, FOREIGN
14850 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
14860 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54  ENCES p ON DELET
14870 45 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a  E SET DEFAULT);.
14880 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14890 20 63 33 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c3(c, d, FOREIG
148a0 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
148b0 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45  RENCES p ON DELE
148c0 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
148d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 34   CREATE TABLE c4
148e0 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
148f0 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
14900 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20  CES p ON DELETE 
14910 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
14920 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28 63  REATE TABLE c5(c
14930 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
14940 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
14950 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f  S p ON DELETE NO
14960 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 43   ACTION);..    C
14970 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 63  REATE TABLE c6(c
14980 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45  , d, .      FORE
14990 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45  IGN KEY(c, d) RE
149a0 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
149b0 4c 45 54 45 20 52 45 53 54 52 49 43 54 20 0a 20  LETE RESTRICT . 
149c0 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20       DEFERRABLE 
149d0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
149e0 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  ED.    );.    CR
149f0 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 63 2c  EATE TABLE c7(c,
14a00 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
14a10 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
14a20 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14a30 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20  ETE NO ACTION.  
14a40 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49      DEFERRABLE I
14a50 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
14a60 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 43 52  D.    );..    CR
14a70 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 6d  EATE TABLE log(m
14a80 73 67 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  sg);.    CREATE 
14a90 54 52 49 47 47 45 52 20 74 74 20 41 46 54 45 52  TRIGGER tt AFTER
14aa0 20 44 45 4c 45 54 45 20 4f 4e 20 70 20 42 45 47   DELETE ON p BEG
14ab0 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
14ac0 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
14ad0 27 64 65 6c 65 74 65 20 27 20 7c 7c 20 6f 6c 64  'delete ' || old
14ae0 2e 72 6f 77 69 64 29 3b 0a 20 20 20 20 45 4e 44  .rowid);.    END
14af0 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
14b00 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 32 20  est e_fkey-57.2 
14b10 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
14b20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
14b30 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
14b40 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
14b50 4f 20 63 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O c1 VALUES('a',
14b60 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
14b70 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53  T INTO c2 VALUES
14b80 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
14b90 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20 56  INSERT INTO c3 V
14ba0 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
14bb0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
14bc0 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a    DROP TABLE p;.
14bd0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
14be0 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b  ROM c1;.  }.} {{
14bf0 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {}}.do_test e_
14c00 66 6b 65 79 2d 35 37 2e 33 20 7b 0a 20 20 65 78  fkey-57.3 {.  ex
14c10 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
14c20 20 46 52 4f 4d 20 63 32 20 7d 0a 7d 20 7b 7b 7d   FROM c2 }.} {{}
14c30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}}.do_test e_f
14c40 6b 65 79 2d 35 37 2e 34 20 7b 0a 20 20 65 78 65  key-57.4 {.  exe
14c50 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
14c60 46 52 4f 4d 20 63 33 20 7d 0a 7d 20 7b 7d 0a 64  FROM c3 }.} {}.d
14c70 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14c80 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
14c90 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
14ca0 6f 67 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  og }.} {}.do_tes
14cb0 74 20 65 5f 66 6b 65 79 2d 35 37 2e 36 20 7b 0a  t e_fkey-57.6 {.
14cc0 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
14cd0 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  CK.} {}.do_test 
14ce0 65 5f 66 6b 65 79 2d 35 37 2e 37 20 7b 0a 20 20  e_fkey-57.7 {.  
14cf0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
14d00 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
14d10 45 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 20 20  E FROM p;.      
14d20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f  SELECT * FROM lo
14d30 67 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  g;.    ROLLBACK;
14d40 0a 20 20 7d 0a 7d 20 7b 7b 64 65 6c 65 74 65 20  .  }.} {{delete 
14d50 31 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1}}..#----------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14da0 23 20 49 66 20 61 6e 20 49 4d 4d 45 44 49 41 54  # If an IMMEDIAT
14db0 45 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 66 61  E foreign key fa
14dc0 69 6c 73 20 61 73 20 61 20 72 65 73 75 6c 74 20  ils as a result 
14dd0 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 2c  of a DROP TABLE,
14de0 20 74 68 65 0a 23 20 44 52 4f 50 20 54 41 42 4c   the.# DROP TABL
14df0 45 20 63 6f 6d 6d 61 6e 64 20 66 61 69 6c 73 2e  E command fails.
14e00 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
14e10 3a 20 52 2d 33 32 37 36 38 2d 34 37 39 32 35 20  : R-32768-47925 
14e20 49 66 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  If an immediate 
14e30 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
14e40 74 72 61 69 6e 74 20 69 73 0a 23 20 76 69 6f 6c  traint is.# viol
14e50 61 74 65 64 2c 20 74 68 65 20 44 52 4f 50 20 54  ated, the DROP T
14e60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66  ABLE statement f
14e70 61 69 6c 73 20 61 6e 64 20 74 68 65 20 74 61 62  ails and the tab
14e80 6c 65 20 69 73 20 6e 6f 74 20 64 72 6f 70 70 65  le is not droppe
14e90 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  d..#.do_test e_f
14ea0 6b 65 79 2d 35 38 2e 31 20 7b 0a 20 20 65 78 65  key-58.1 {.  exe
14eb0 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45  csql { .    DELE
14ec0 54 45 20 46 52 4f 4d 20 63 31 3b 0a 20 20 20 20  TE FROM c1;.    
14ed0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 32 3b 0a  DELETE FROM c2;.
14ee0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
14ef0 63 33 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  c3;.  }.  execsq
14f00 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
14f10 63 35 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  c5 VALUES('a', '
14f20 62 27 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  b') }.  catchsql
14f30 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 70 20   { DROP TABLE p 
14f40 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
14f50 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
14f60 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
14f70 65 5f 66 6b 65 79 2d 35 38 2e 32 20 7b 0a 20 20  e_fkey-58.2 {.  
14f80 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
14f90 20 2a 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 61   * FROM p }.} {a
14fa0 20 62 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   b}.do_test e_fk
14fb0 65 79 2d 35 38 2e 33 20 7b 0a 20 20 63 61 74 63  ey-58.3 {.  catc
14fc0 68 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  hsql {.    BEGIN
14fd0 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
14fe0 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  LE p;.  }.} {1 {
14ff0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
15000 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
15010 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
15020 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.4 {.  execsql 
15030 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
15040 52 4f 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45 43  ROM p;.    SELEC
15050 54 20 2a 20 46 52 4f 4d 20 63 35 3b 0a 20 20 20  T * FROM c5;.   
15060 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
15070 20 7b 61 20 62 20 61 20 62 7d 0a 0a 23 2d 2d 2d   {a b a b}..#---
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 20 44 45  ------.# If a DE
150d0 46 45 52 52 45 44 20 66 6f 72 65 69 67 6e 20 6b  FERRED foreign k
150e0 65 79 20 66 61 69 6c 73 20 61 73 20 61 20 72 65  ey fails as a re
150f0 73 75 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54  sult of a DROP T
15100 41 42 4c 45 2c 20 61 74 74 65 6d 70 74 69 6e 67  ABLE, attempting
15110 0a 23 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  .# to commit the
15120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 61 69   transaction fai
15130 6c 73 20 75 6e 6c 65 73 73 20 74 68 65 20 76 69  ls unless the vi
15140 6f 6c 61 74 69 6f 6e 20 69 73 20 66 69 78 65 64  olation is fixed
15150 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
15160 46 3a 20 52 2d 30 35 39 30 33 2d 30 38 34 36 30  F: R-05903-08460
15170 20 49 66 20 61 20 64 65 66 65 72 72 65 64 20 66   If a deferred f
15180 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
15190 72 61 69 6e 74 20 69 73 0a 23 20 76 69 6f 6c 61  raint is.# viola
151a0 74 65 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72  ted, then an err
151b0 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 77  or is reported w
151c0 68 65 6e 20 74 68 65 20 75 73 65 72 20 61 74 74  hen the user att
151d0 65 6d 70 74 73 20 74 6f 20 63 6f 6d 6d 69 74 0a  empts to commit.
151e0 23 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  # the transactio
151f0 6e 20 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e  n if the foreign
15200 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
15210 76 69 6f 6c 61 74 69 6f 6e 73 20 73 74 69 6c 6c  violations still
15220 20 65 78 69 73 74 0a 23 20 61 74 20 74 68 61 74   exist.# at that
15230 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f 5f 74 65 73   point..#.do_tes
15240 74 20 65 5f 66 6b 65 79 2d 35 39 2e 31 20 7b 0a  t e_fkey-59.1 {.
15250 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
15260 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 20   DELETE FROM c1 
15270 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 32  ; DELETE FROM c2
15280 20 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63   ; DELETE FROM c
15290 33 20 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  3 ;.    DELETE F
152a0 52 4f 4d 20 63 34 20 3b 20 44 45 4c 45 54 45 20  ROM c4 ; DELETE 
152b0 46 52 4f 4d 20 63 35 20 3b 20 44 45 4c 45 54 45  FROM c5 ; DELETE
152c0 20 46 52 4f 4d 20 63 36 20 3b 0a 20 20 20 20 44   FROM c6 ;.    D
152d0 45 4c 45 54 45 20 46 52 4f 4d 20 63 37 20 0a 20  ELETE FROM c7 . 
152e0 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
152f0 65 5f 66 6b 65 79 2d 35 39 2e 32 20 7b 0a 20 20  e_fkey-59.2 {.  
15300 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
15310 20 49 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28   INTO c7 VALUES(
15320 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20 65 78  'a', 'b') }.  ex
15330 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
15340 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  N;.      DROP TA
15350 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  BLE p;.  }.} {}.
15360 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
15370 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.3 {.  catchsql
15380 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f   COMMIT.} {1 {fo
15390 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
153a0 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
153b0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e  _test e_fkey-59.
153c0 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
153d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61  CREATE TABLE p(a
153e0 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
153f0 28 61 2c 20 62 29 29 20 7d 0a 20 20 63 61 74 63  (a, b)) }.  catc
15400 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
15410 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
15420 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
15430 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15440 2d 35 39 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -59.5 {.  execsq
15450 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
15460 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  p VALUES('a', 'b
15470 27 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43  ') }.  execsql C
15480 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  OMMIT.} {}..#---
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2d 2d 0a 23 20 41 6e 79 20 22 66 6f  ------.# Any "fo
154e0 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
154f0 63 68 22 20 65 72 72 6f 72 73 20 65 6e 63 6f 75  ch" errors encou
15500 6e 74 65 72 65 64 20 77 68 69 6c 65 20 72 75 6e  ntered while run
15510 6e 69 6e 67 20 61 6e 20 69 6d 70 6c 69 63 69 74  ning an implicit
15520 0a 23 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  .# "DELETE FROM 
15530 74 62 6c 22 20 61 72 65 20 69 67 6e 6f 72 65 64  tbl" are ignored
15540 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
15550 46 3a 20 52 2d 35 37 32 34 32 2d 33 37 30 30 35  F: R-57242-37005
15560 20 41 6e 79 20 22 66 6f 72 65 69 67 6e 20 6b 65   Any "foreign ke
15570 79 20 6d 69 73 6d 61 74 63 68 22 20 65 72 72 6f  y mismatch" erro
15580 72 73 0a 23 20 65 6e 63 6f 75 6e 74 65 72 65 64  rs.# encountered
15590 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   as part of an i
155a0 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20 61  mplicit DELETE a
155b0 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 72  re ignored..#.dr
155c0 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
155d0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e  _test e_fkey-60.
155e0 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
155f0 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
15600 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 0a  gn_keys = OFF;..
15610 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
15620 20 70 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59   p(a PRIMARY KEY
15630 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 6e  , b REFERENCES n
15640 6f 73 75 63 68 74 61 62 6c 65 29 3b 0a 20 20 20  osuchtable);.   
15650 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
15660 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
15670 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
15680 43 45 53 20 61 29 3b 0a 20 20 20 20 43 52 45 41  CES a);.    CREA
15690 54 45 20 54 41 42 4c 45 20 63 32 28 63 20 52 45  TE TABLE c2(c RE
156a0 46 45 52 45 4e 43 45 53 20 70 28 62 29 2c 20 64  FERENCES p(b), d
156b0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
156c0 42 4c 45 20 63 33 28 63 20 52 45 46 45 52 45 4e  BLE c3(c REFEREN
156d0 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20  CES p ON DELETE 
156e0 53 45 54 20 4e 55 4c 4c 2c 20 64 29 3b 0a 0a 20  SET NULL, d);.. 
156f0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
15700 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
15710 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
15720 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
15730 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
15740 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  c2 VALUES(1, 2);
15750 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
15760 20 63 33 20 56 41 4c 55 45 53 28 31 2c 20 32 29   c3 VALUES(1, 2)
15770 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
15780 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 32 20 7b  st e_fkey-60.2 {
15790 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
157a0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
157b0 20 3d 20 4f 4e 20 7d 0a 20 20 63 61 74 63 68 73   = ON }.  catchs
157c0 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
157d0 20 70 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75   p }.} {1 {no su
157e0 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 6e  ch table: main.n
157f0 6f 73 75 63 68 74 61 62 6c 65 7d 7d 0a 64 6f 5f  osuchtable}}.do_
15800 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 33  test e_fkey-60.3
15810 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
15820 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
15830 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
15840 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
15850 4d 20 63 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M c3;.    ROLLBA
15860 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 32 7d  CK;.  }.} {{} 2}
15870 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15880 36 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.4 {.  execsql
15890 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
158a0 6e 6f 73 75 63 68 74 61 62 6c 65 28 78 20 50 52  nosuchtable(x PR
158b0 49 4d 41 52 59 20 4b 45 59 29 20 7d 0a 20 20 63  IMARY KEY) }.  c
158c0 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
158d0 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b   FROM p }.} {1 {
158e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
158f0 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  atch}}.do_test e
15900 5f 66 6b 65 79 2d 36 30 2e 35 20 7b 0a 20 20 65  _fkey-60.5 {.  e
15910 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  xecsql { DROP TA
15920 42 4c 45 20 63 31 20 7d 0a 20 20 63 61 74 63 68  BLE c1 }.  catch
15930 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
15940 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  M p }.} {1 {fore
15950 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
15960 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
15970 79 2d 36 30 2e 36 20 7b 0a 20 20 65 78 65 63 73  y-60.6 {.  execs
15980 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
15990 63 32 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  c2 }.  execsql {
159a0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d   DELETE FROM p }
159b0 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a00 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68  -.# Test that th
15a10 65 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69  e special behavi
15a20 6f 75 72 73 20 6f 66 20 41 4c 54 45 52 20 61 6e  ours of ALTER an
15a30 64 20 44 52 4f 50 20 54 41 42 4c 45 20 61 72 65  d DROP TABLE are
15a40 20 6f 6e 6c 79 0a 23 20 61 63 74 69 76 61 74 65   only.# activate
15a50 64 20 77 68 65 6e 20 66 6f 72 65 69 67 6e 20 6b  d when foreign k
15a60 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e  eys are enabled.
15a70 20 53 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   Special behavio
15a80 75 72 73 20 61 72 65 3a 0a 23 0a 23 20 20 20 31  urs are:.#.#   1
15a90 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6e 6f 74  . ADD COLUMN not
15aa0 20 61 6c 6c 6f 77 69 6e 67 20 61 20 52 45 46 45   allowing a REFE
15ab0 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 77 69  RENCES clause wi
15ac0 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 0a 23  th a non-NULL .#
15ad0 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
15ae0 6c 75 65 2e 0a 23 20 20 20 32 2e 20 4d 6f 64 69  lue..#   2. Modi
15af0 66 79 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  fying foreign ke
15b00 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 77 68  y definitions wh
15b10 65 6e 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c  en a parent tabl
15b20 65 20 69 73 20 52 45 4e 41 4d 45 64 2e 0a 23 20  e is RENAMEd..# 
15b30 20 20 33 2e 20 52 75 6e 6e 69 6e 67 20 61 6e 20    3. Running an 
15b40 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20  implicit DELETE 
15b50 46 52 4f 4d 20 63 6f 6d 6d 61 6e 64 20 61 73 20  FROM command as 
15b60 70 61 72 74 20 6f 66 20 44 52 4f 50 20 54 41 42  part of DROP TAB
15b70 4c 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  LE..#.# EVIDENCE
15b80 2d 4f 46 3a 20 52 2d 35 34 31 34 32 2d 34 31 33  -OF: R-54142-413
15b90 34 36 20 54 68 65 20 70 72 6f 70 65 72 74 69 65  46 The propertie
15ba0 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54 41  s of the DROP TA
15bb0 42 4c 45 20 61 6e 64 20 41 4c 54 45 52 0a 23 20  BLE and ALTER.# 
15bc0 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 20 64  TABLE commands d
15bd0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 6f  escribed above o
15be0 6e 6c 79 20 61 70 70 6c 79 20 69 66 20 66 6f 72  nly apply if for
15bf0 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e  eign keys are en
15c00 61 62 6c 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  abled..#.do_test
15c10 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 31 20 7b   e_fkey-61.1.1 {
15c20 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
15c30 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43  es.  execsql { C
15c40 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
15c50 2c 20 62 29 20 7d 0a 20 20 63 61 74 63 68 73 71  , b) }.  catchsq
15c60 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
15c70 74 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  t1 ADD COLUMN c 
15c80 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45  DEFAULT 'xxx' RE
15c90 46 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 7d 20  FERENCES t2 }.} 
15ca0 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61  {1 {Cannot add a
15cb0 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75   REFERENCES colu
15cc0 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c  mn with non-NULL
15cd0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d   default value}}
15ce0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15cf0 36 31 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  61.1.2 {.  execs
15d00 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  ql { PRAGMA fore
15d10 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 20 7d  ign_keys = OFF }
15d20 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54  .  execsql { ALT
15d30 45 52 20 54 41 42 4c 45 20 74 31 20 41 44 44 20  ER TABLE t1 ADD 
15d40 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54  COLUMN c DEFAULT
15d50 20 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45   'xxx' REFERENCE
15d60 53 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71 6c  S t2 }.  execsql
15d70 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52   { SELECT sql FR
15d80 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
15d90 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 74   WHERE name = 't
15da0 31 27 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20  1' }.} {{CREATE 
15db0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
15dc0 20 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52   DEFAULT 'xxx' R
15dd0 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d 0a  EFERENCES t2)}}.
15de0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15df0 31 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  1.1.3 {.  execsq
15e00 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
15e10 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d  gn_keys = ON }.}
15e20 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}..do_test e_f
15e30 6b 65 79 2d 36 31 2e 32 2e 31 20 7b 0a 20 20 64  key-61.2.1 {.  d
15e40 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
15e50 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
15e60 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20  REATE TABLE p(a 
15e70 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45  UNIQUE);.    CRE
15e80 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45  ATE TABLE c(b RE
15e90 46 45 52 45 4e 43 45 53 20 70 28 61 29 29 3b 0a  FERENCES p(a));.
15ea0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
15eb0 20 41 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52   ALTER TABLE p R
15ec0 45 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b  ENAME TO parent;
15ed0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 71  .      SELECT sq
15ee0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
15ef0 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20  ster WHERE name 
15f00 3d 20 27 63 27 3b 0a 20 20 20 20 52 4f 4c 4c 42  = 'c';.    ROLLB
15f10 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45  ACK;.  }.} {{CRE
15f20 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45  ATE TABLE c(b RE
15f30 46 45 52 45 4e 43 45 53 20 22 70 61 72 65 6e 74  FERENCES "parent
15f40 22 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  "(a))}}.do_test 
15f50 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 32 20 7b 0a  e_fkey-61.2.2 {.
15f60 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15f70 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
15f80 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 41  eys = OFF;.    A
15f90 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52 45 4e  LTER TABLE p REN
15fa0 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a 20  AME TO parent;. 
15fb0 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
15fc0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
15fd0 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 63   WHERE name = 'c
15fe0 27 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41 54  ';.  }.} {{CREAT
15ff0 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45  E TABLE c(b REFE
16000 52 45 4e 43 45 53 20 70 28 61 29 29 7d 7d 0a 64  RENCES p(a))}}.d
16010 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
16020 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.3 {.  execsql
16030 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
16040 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20  n_keys = ON }.} 
16050 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
16060 65 79 2d 36 31 2e 33 2e 31 20 7b 0a 20 20 64 72  ey-61.3.1 {.  dr
16070 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
16080 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
16090 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55  EATE TABLE p(a U
160a0 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
160b0 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
160c0 45 52 45 4e 43 45 53 20 70 28 61 29 20 4f 4e 20  ERENCES p(a) ON 
160d0 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29  DELETE SET NULL)
160e0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
160f0 4f 20 70 20 56 41 4c 55 45 53 28 27 78 27 29 3b  O p VALUES('x');
16100 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
16110 20 63 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a   c VALUES('x');.
16120 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
16130 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20   DROP TABLE p;. 
16140 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
16150 4f 4d 20 63 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  OM c;.    ROLLBA
16160 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64  CK;.  }.} {{}}.d
16170 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
16180 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
16190 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f   {.    PRAGMA fo
161a0 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
161b0 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
161c0 20 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   p;.    SELECT *
161d0 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a 7d 20 7b   FROM c;.  }.} {
161e0 78 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  x}.do_test e_fke
161f0 79 2d 36 31 2e 33 2e 33 20 7b 0a 20 20 65 78 65  y-61.3.3 {.  exe
16200 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
16210 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20  reign_keys = ON 
16220 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23  }.} {}..########
16230 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16270 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
16280 36 3a 20 4c 69 6d 69 74 73 20 61 6e 64 20 55 6e  6: Limits and Un
16290 73 75 70 70 6f 72 74 65 64 20 46 65 61 74 75 72  supported Featur
162a0 65 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  es.#############
162b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
162f0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
16340 74 20 74 68 61 74 20 4d 41 54 43 48 20 63 6c 61  t that MATCH cla
16350 75 73 65 73 20 61 72 65 20 70 61 72 73 65 64 2c  uses are parsed,
16360 20 62 75 74 20 53 51 4c 69 74 65 20 74 72 65 61   but SQLite trea
16370 74 73 20 65 76 65 72 79 20 66 6f 72 65 69 67 6e  ts every foreign
16380 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e   key.# constrain
16390 74 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  t as if it were 
163a0 22 4d 41 54 43 48 20 53 49 4d 50 4c 45 22 2e 0a  "MATCH SIMPLE"..
163b0 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
163c0 20 52 2d 32 34 37 32 38 2d 31 33 32 33 30 20 53   R-24728-13230 S
163d0 51 4c 69 74 65 20 70 61 72 73 65 73 20 4d 41 54  QLite parses MAT
163e0 43 48 20 63 6c 61 75 73 65 73 20 28 69 2e 65 2e  CH clauses (i.e.
163f0 20 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 70 6f   does not.# repo
16400 72 74 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  rt a syntax erro
16410 72 20 69 66 20 79 6f 75 20 73 70 65 63 69 66 79  r if you specify
16420 20 6f 6e 65 29 2c 20 62 75 74 20 64 6f 65 73 20   one), but does 
16430 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 65 6d  not enforce them
16440 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
16450 46 3a 20 52 2d 32 34 34 35 30 2d 34 36 31 37 34  F: R-24450-46174
16460 20 41 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79   All foreign key
16470 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
16480 53 51 4c 69 74 65 20 61 72 65 0a 23 20 68 61 6e  SQLite are.# han
16490 64 6c 65 64 20 61 73 20 69 66 20 4d 41 54 43 48  dled as if MATCH
164a0 20 53 49 4d 50 4c 45 20 77 65 72 65 20 73 70 65   SIMPLE were spe
164b0 63 69 66 69 65 64 2e 0a 23 0a 66 6f 72 65 61 63  cified..#.foreac
164c0 68 20 7a 4d 61 74 63 68 20 5b 6c 69 73 74 20 53  h zMatch [list S
164d0 49 4d 50 4c 45 20 50 41 52 54 49 41 4c 20 46 55  IMPLE PARTIAL FU
164e0 4c 4c 20 53 69 6d 70 6c 65 20 70 61 72 54 49 41  LL Simple parTIA
164f0 4c 20 46 75 4c 4c 20 5d 20 7b 0a 20 20 64 72 6f  L FuLL ] {.  dro
16500 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64  p_all_tables.  d
16510 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16520 2e 24 7a 4d 61 74 63 68 2e 31 20 7b 0a 20 20 20  .$zMatch.1 {.   
16530 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
16540 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
16550 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  a, b, c, PRIMARY
16560 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 20   KEY(b, c));.   
16570 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
16580 63 28 64 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49  c(d, e, f, FOREI
16590 47 4e 20 4b 45 59 28 65 2c 20 66 29 20 52 45 46  GN KEY(e, f) REF
165a0 45 52 45 4e 43 45 53 20 70 20 4d 41 54 43 48 20  ERENCES p MATCH 
165b0 24 7a 4d 61 74 63 68 29 3b 0a 20 20 20 20 22 0a  $zMatch);.    ".
165c0 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
165d0 20 65 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74   e_fkey-62.$zMat
165e0 63 68 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  ch.2 {.    execs
165f0 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
16600 20 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20   p VALUES(1, 2, 
16610 33 29 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  3)         }..  
16620 20 20 23 20 4d 41 54 43 48 20 53 49 4d 50 4c 45    # MATCH SIMPLE
16630 20 62 65 68 61 76 69 6f 75 72 3a 20 41 6c 6c 6f   behaviour: Allo
16640 77 20 61 6e 79 20 63 68 69 6c 64 20 6b 65 79 20  w any child key 
16650 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
16660 65 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 23 20  e or more.    # 
16670 4e 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 65  NULL value to be
16680 20 69 6e 73 65 72 74 65 64 2e 20 4e 6f 6e 2d 4e   inserted. Non-N
16690 55 4c 4c 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f  ULL values do no
166a0 74 20 68 61 76 65 20 74 6f 20 6d 61 70 20 74 6f  t have to map to
166b0 20 61 6e 79 0a 20 20 20 20 23 20 70 61 72 65 6e   any.    # paren
166c0 74 20 6b 65 79 20 76 61 6c 75 65 73 2c 20 73 6f  t key values, so
166d0 20 6c 6f 6e 67 20 61 73 20 61 74 20 6c 65 61 73   long as at leas
166e0 74 20 6f 6e 65 20 66 69 65 6c 64 20 6f 66 20 74  t one field of t
166f0 68 65 20 63 68 69 6c 64 20 6b 65 79 20 69 73 0a  he child key is.
16700 20 20 20 20 23 20 4e 55 4c 4c 2e 0a 20 20 20 20      # NULL..    
16710 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
16720 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
16730 77 27 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20  w', 2, 3)       
16740 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
16750 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
16760 4c 55 45 53 28 27 78 27 2c 20 27 78 27 2c 20 4e  LUES('x', 'x', N
16770 55 4c 4c 29 20 20 7d 0a 20 20 20 20 65 78 65 63  ULL)  }.    exec
16780 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
16790 4f 20 63 20 56 41 4c 55 45 53 28 27 79 27 2c 20  O c VALUES('y', 
167a0 4e 55 4c 4c 2c 20 27 78 27 29 20 20 7d 0a 20 20  NULL, 'x')  }.  
167b0 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
167c0 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
167d0 28 27 7a 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ('z', NULL, NULL
167e0 29 20 7d 0a 0a 20 20 20 20 23 20 43 68 65 63 6b  ) }..    # Check
167f0 20 74 68 61 74 20 74 68 65 20 46 4b 20 69 73 20   that the FK is 
16800 65 6e 66 6f 72 63 65 64 20 70 72 6f 70 65 72 6c  enforced properl
16810 79 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  y if there are n
16820 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 0a 20  o NULL values . 
16830 20 20 20 23 20 69 6e 20 74 68 65 20 63 68 69 6c     # in the chil
16840 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 20  d key columns.. 
16850 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
16860 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
16870 45 53 28 27 61 27 2c 20 32 2c 20 34 29 20 7d 0a  ES('a', 2, 4) }.
16880 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20    } {1 {foreign 
16890 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
168a0 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  ailed}}.}..#----
168b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168f0 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
16900 74 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  t SQLite does no
16910 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
16920 54 20 43 4f 4e 53 54 52 41 49 4e 54 20 73 74 61  T CONSTRAINT sta
16930 74 65 6d 65 6e 74 2e 20 41 6e 64 0a 23 20 74 68  tement. And.# th
16940 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  at it is possibl
16950 65 20 74 6f 20 63 72 65 61 74 65 20 62 6f 74 68  e to create both
16960 20 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 64   immediate and d
16970 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
16980 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  nts..#.# EVIDENC
16990 45 2d 4f 46 3a 20 52 2d 32 31 35 39 39 2d 31 36  E-OF: R-21599-16
169a0 30 33 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 61  038 In SQLite, a
169b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
169c0 73 74 72 61 69 6e 74 20 69 73 0a 23 20 70 65 72  straint is.# per
169d0 6d 61 6e 65 6e 74 6c 79 20 6d 61 72 6b 65 64 20  manently marked 
169e0 61 73 20 64 65 66 65 72 72 65 64 20 6f 72 20 69  as deferred or i
169f0 6d 6d 65 64 69 61 74 65 20 77 68 65 6e 20 69 74  mmediate when it
16a00 20 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64   is created..#.d
16a10 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
16a20 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16a30 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
16a40 7b 20 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54  { SET CONSTRAINT
16a50 53 20 41 4c 4c 20 49 4d 4d 45 44 49 41 54 45 20  S ALL IMMEDIATE 
16a60 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 45  }.} {1 {near "SE
16a70 54 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  T": syntax error
16a80 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
16a90 79 2d 36 32 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-62.2 {.  catch
16aa0 73 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52  sql { SET CONSTR
16ab0 41 49 4e 54 53 20 41 4c 4c 20 44 45 46 45 52 52  AINTS ALL DEFERR
16ac0 45 44 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20  ED }.} {1 {near 
16ad0 22 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65 72  "SET": syntax er
16ae0 72 6f 72 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  ror}}..do_test e
16af0 5f 66 6b 65 79 2d 36 32 2e 33 20 7b 0a 20 20 65  _fkey-62.3 {.  e
16b00 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
16b10 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62  ATE TABLE p(a, b
16b20 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
16b30 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   b));.    CREATE
16b40 20 54 41 42 4c 45 20 63 64 28 63 2c 20 64 2c 20   TABLE cd(c, d, 
16b50 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
16b60 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
16b70 43 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45  CES p DEFERRABLE
16b80 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
16b90 52 45 44 29 3b 0a 20 20 20 20 43 52 45 41 54 45  RED);.    CREATE
16ba0 20 54 41 42 4c 45 20 63 69 28 63 2c 20 64 2c 20   TABLE ci(c, d, 
16bb0 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
16bc0 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
16bd0 43 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45  CES p DEFERRABLE
16be0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
16bf0 49 41 54 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IATE);.    BEGIN
16c00 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
16c10 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 34 20 7b  st e_fkey-62.4 {
16c20 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
16c30 53 45 52 54 20 49 4e 54 4f 20 63 69 20 56 41 4c  SERT INTO ci VAL
16c40 55 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a  UES('x', 'y') }.
16c50 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
16c60 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
16c70 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
16c80 66 6b 65 79 2d 36 32 2e 35 20 7b 0a 20 20 63 61  fkey-62.5 {.  ca
16c90 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
16ca0 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 28 27  INTO cd VALUES('
16cb0 78 27 2c 20 27 79 27 29 20 7d 0a 7d 20 7b 30 20  x', 'y') }.} {0 
16cc0 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}}.do_test e_fk
16cd0 65 79 2d 36 32 2e 36 20 7b 0a 20 20 63 61 74 63  ey-62.6 {.  catc
16ce0 68 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  hsql { COMMIT }.
16cf0 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
16d00 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
16d10 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
16d20 66 6b 65 79 2d 36 32 2e 37 20 7b 0a 20 20 65 78  fkey-62.7 {.  ex
16d30 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c  ecsql { .    DEL
16d40 45 54 45 20 46 52 4f 4d 20 63 64 3b 0a 20 20 20  ETE FROM cd;.   
16d50 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
16d60 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
16d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
16db0 54 65 73 74 20 74 68 61 74 20 74 68 65 20 6d 61  Test that the ma
16dc0 78 69 6d 75 6d 20 72 65 63 75 72 73 69 6f 6e 20  ximum recursion 
16dd0 64 65 70 74 68 20 6f 66 20 66 6f 72 65 69 67 6e  depth of foreign
16de0 20 6b 65 79 20 61 63 74 69 6f 6e 20 70 72 6f 67   key action prog
16df0 72 61 6d 73 20 69 73 0a 23 20 67 6f 76 65 72 6e  rams is.# govern
16e00 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
16e10 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
16e20 54 48 20 61 6e 64 20 53 51 4c 49 54 45 5f 4c 49  TH and SQLITE_LI
16e30 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
16e40 48 0a 23 20 73 65 74 74 69 6e 67 73 2e 0a 23 0a  H.# settings..#.
16e50 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
16e60 2d 34 32 32 36 34 2d 33 30 35 30 33 20 54 68 65  -42264-30503 The
16e70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
16e80 47 45 52 5f 44 45 50 54 48 20 61 6e 64 0a 23 20  GER_DEPTH and.# 
16e90 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
16ea0 47 47 45 52 5f 44 45 50 54 48 20 73 65 74 74 69  GGER_DEPTH setti
16eb0 6e 67 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ngs determine th
16ec0 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61  e maximum allowa
16ed0 62 6c 65 0a 23 20 64 65 70 74 68 20 6f 66 20 74  ble.# depth of t
16ee0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 72  rigger program r
16ef0 65 63 75 72 73 69 6f 6e 2e 20 46 6f 72 20 74 68  ecursion. For th
16f00 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
16f10 65 73 65 20 6c 69 6d 69 74 73 2c 0a 23 20 66 6f  ese limits,.# fo
16f20 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
16f30 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
16f40 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
16f50 73 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 6f  s..#.proc test_o
16f60 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69  n_delete_recursi
16f70 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64  on {limit} {.  d
16f80 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
16f90 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
16fa0 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
16fb0 45 20 54 41 42 4c 45 20 74 30 28 61 20 50 52 49  E TABLE t0(a PRI
16fc0 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
16fd0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30    INSERT INTO t0
16fe0 20 56 41 4c 55 45 53 28 27 78 30 27 2c 20 4e 55   VALUES('x0', NU
16ff0 4c 4c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b  LL);.  }.  for {
17000 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20  set i 1} {$i <= 
17010 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d  $limit} {incr i}
17020 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
17030 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
17040 42 4c 45 20 74 24 69 20 28 0a 20 20 20 20 20 20  BLE t$i (.      
17050 20 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c    a PRIMARY KEY,
17060 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 5b   b REFERENCES t[
17070 65 78 70 72 20 24 69 2d 31 5d 20 4f 4e 20 44 45  expr $i-1] ON DE
17080 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20  LETE CASCADE.   
17090 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45     );.      INSE
170a0 52 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55  RT INTO t$i VALU
170b0 45 53 28 27 78 24 69 27 2c 20 27 78 5b 65 78 70  ES('x$i', 'x[exp
170c0 72 20 24 69 2d 31 5d 27 29 3b 0a 20 20 20 20 22  r $i-1]');.    "
170d0 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43  .  }.  execsql C
170e0 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c  OMMIT.  catchsql
170f0 20 22 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   ".    DELETE FR
17100 4f 4d 20 74 30 3b 0a 20 20 20 20 53 45 4c 45 43  OM t0;.    SELEC
17110 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
17120 74 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 70  t$limit;.  ".}.p
17130 72 6f 63 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61  roc test_on_upda
17140 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 7b 6c 69  te_recursion {li
17150 6d 69 74 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  mit} {.  drop_al
17160 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73  l_tables.  execs
17170 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
17180 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
17190 45 20 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b  E t0(a PRIMARY K
171a0 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
171b0 49 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27  INTO t0 VALUES('
171c0 78 78 78 27 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  xxx');.  }.  for
171d0 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c   {set i 1} {$i <
171e0 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20  = $limit} {incr 
171f0 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 6a 20 5b  i} {.    set j [
17200 65 78 70 72 20 24 69 2d 31 5d 0a 0a 20 20 20 20  expr $i-1]..    
17210 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
17220 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 69  CREATE TABLE t$i
17230 20 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20   (a PRIMARY KEY 
17240 52 45 46 45 52 45 4e 43 45 53 20 74 24 6a 20 4f  REFERENCES t$j O
17250 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
17260 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
17270 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45 53 28  INTO t$i VALUES(
17280 27 78 78 78 27 29 3b 0a 20 20 20 20 22 0a 20 20  'xxx');.    ".  
17290 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  }.  execsql COMM
172a0 49 54 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a  IT.  catchsql ".
172b0 20 20 20 20 55 50 44 41 54 45 20 74 30 20 53 45      UPDATE t0 SE
172c0 54 20 61 20 3d 20 27 79 79 79 27 3b 0a 20 20 20  T a = 'yyy';.   
172d0 20 53 45 4c 45 43 54 20 4e 4f 54 20 28 61 3d 27   SELECT NOT (a='
172e0 79 79 79 27 29 20 46 52 4f 4d 20 74 24 6c 69 6d  yyy') FROM t$lim
172f0 69 74 3b 0a 20 20 22 0a 7d 0a 0a 64 6f 5f 74 65  it;.  ".}..do_te
17300 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 31  st e_fkey-63.1.1
17310 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c   {.  test_on_del
17320 65 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53  ete_recursion $S
17330 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
17340 52 5f 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d 0a  R_DEPTH.} {0 0}.
17350 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
17360 33 2e 31 2e 32 20 7b 0a 20 20 74 65 73 74 5f 6f  3.1.2 {.  test_o
17370 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69  n_delete_recursi
17380 6f 6e 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45  on [expr $SQLITE
17390 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
173a0 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f 20  TH+1].} {1 {too 
173b0 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
173c0 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
173d0 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
173e0 79 2d 36 33 2e 31 2e 33 20 7b 0a 20 20 73 71 6c  y-63.1.3 {.  sql
173f0 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51  ite3_limit db SQ
17400 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
17410 45 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65 73  ER_DEPTH 5.  tes
17420 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75  t_on_delete_recu
17430 72 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d 0a  rsion 5.} {0 0}.
17440 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
17450 33 2e 31 2e 34 20 7b 0a 20 20 74 65 73 74 5f 6f  3.1.4 {.  test_o
17460 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69  n_delete_recursi
17470 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d  on 6.} {1 {too m
17480 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
17490 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
174a0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
174b0 2d 36 33 2e 31 2e 35 20 7b 0a 20 20 73 71 6c 69  -63.1.5 {.  sqli
174c0 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te3_limit db SQL
174d0 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
174e0 52 5f 44 45 50 54 48 20 31 30 30 30 30 30 30 0a  R_DEPTH 1000000.
174f0 7d 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {5}.do_test e_
17500 66 6b 65 79 2d 36 33 2e 32 2e 31 20 7b 0a 20 20  fkey-63.2.1 {.  
17510 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72  test_on_update_r
17520 65 63 75 72 73 69 6f 6e 20 24 53 51 4c 49 54 45  ecursion $SQLITE
17530 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
17540 54 48 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74 65  TH.} {0 0}.do_te
17550 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 32  st e_fkey-63.2.2
17560 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64   {.  test_on_upd
17570 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 5b 65  ate_recursion [e
17580 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
17590 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 5d  TRIGGER_DEPTH+1]
175a0 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  .} {1 {too many 
175b0 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
175c0 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f  r recursion}}.do
175d0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e  _test e_fkey-63.
175e0 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.3 {.  sqlite3_
175f0 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f  limit db SQLITE_
17600 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
17610 50 54 48 20 35 0a 20 20 74 65 73 74 5f 6f 6e 5f  PTH 5.  test_on_
17620 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e  update_recursion
17630 20 35 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74 65   5.} {0 0}.do_te
17640 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 34  st e_fkey-63.2.4
17650 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64   {.  test_on_upd
17660 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 36 0a  ate_recursion 6.
17670 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c  } {1 {too many l
17680 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
17690 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f   recursion}}.do_
176a0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32  test e_fkey-63.2
176b0 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  .5 {.  sqlite3_l
176c0 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
176d0 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
176e0 54 48 20 31 30 30 30 30 30 30 0a 7d 20 7b 35 7d  TH 1000000.} {5}
176f0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
17700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
17740 68 65 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  he setting of th
17750 65 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  e recursive_trig
17760 67 65 72 73 20 70 72 61 67 6d 61 20 64 6f 65 73  gers pragma does
17770 20 6e 6f 74 20 61 66 66 65 63 74 20 66 6f 72 65   not affect fore
17780 69 67 6e 0a 23 20 6b 65 79 20 61 63 74 69 6f 6e  ign.# key action
17790 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
177a0 4f 46 3a 20 52 2d 35 31 37 36 39 2d 33 32 37 33  OF: R-51769-3273
177b0 30 20 54 68 65 20 50 52 41 47 4d 41 20 72 65 63  0 The PRAGMA rec
177c0 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20  ursive_triggers 
177d0 73 65 74 74 69 6e 67 20 64 6f 65 73 0a 23 20 6e  setting does.# n
177e0 6f 74 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  ot not affect th
177f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 66  e operation of f
17800 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f  oreign key actio
17810 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 72 65  ns..#.foreach re
17820 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
17830 5f 73 65 74 74 69 6e 67 20 5b 6c 69 73 74 20 30  _setting [list 0
17840 20 31 20 4f 4e 20 4f 46 46 5d 20 7b 0a 20 20 64   1 ON OFF] {.  d
17850 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
17860 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
17870 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
17880 65 72 73 20 3d 20 24 72 65 63 75 72 73 69 76 65  ers = $recursive
17890 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e  _triggers_settin
178a0 67 22 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  g"..  do_test e_
178b0 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
178c0 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
178d0 69 6e 67 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  ing.1 {.    exec
178e0 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
178f0 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
17900 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
17910 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 44 45  ERENCES t1 ON DE
17920 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  LETE CASCADE);. 
17930 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17940 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55   t1 VALUES(1, NU
17950 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  LL);.      INSER
17960 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
17970 28 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 49 4e  (2, 1);.      IN
17980 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
17990 55 45 53 28 33 2c 20 32 29 3b 0a 20 20 20 20 20  UES(3, 2);.     
179a0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
179b0 56 41 4c 55 45 53 28 34 2c 20 33 29 3b 0a 20 20  VALUES(4, 3);.  
179c0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
179d0 74 31 20 56 41 4c 55 45 53 28 35 2c 20 34 29 3b  t1 VALUES(5, 4);
179e0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
179f0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
17a00 20 20 20 20 7d 0a 20 20 7d 20 7b 35 7d 0a 20 20      }.  } {5}.  
17a10 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
17a20 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74 72 69  4.$recursive_tri
17a30 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e 32 20  ggers_setting.2 
17a40 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
17a50 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
17a60 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17a70 3d 20 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20  = 1 }.  } {1}.  
17a80 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
17a90 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74 72 69  4.$recursive_tri
17aa0 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e 33 20  ggers_setting.3 
17ab0 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
17ac0 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
17ad0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
17ae0 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  1;.      SELECT 
17af0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
17b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a  ;.    }.  } {0}.
17b10 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.