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

Artifact 630597377549af579d34faaf64c6959a5a68ef76:


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 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
1b10: 20 4b 45 59 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 46 4f 52  , 1) }.} {1 {FOR
2150: 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
2200: 4b 45 59 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 46 4f 52 45 49   2 }.} {1 {FOREI
2410: 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
2890: 4b 45 59 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 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   {UNIQUE constra
2c10: 69 6e 74 20 66 61 69 6c 65 64 3a 20 61 72 74 69  int failed: arti
2c20: 73 74 2e 61 72 74 69 73 74 69 64 7d 7d 20 0a 20  st.artistid}} . 
2c30: 20 20 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b     {1 {FOREIGN K
2c40: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
2c50: 69 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20 69 66 20  iled}}.  }.  if 
2c60: 7b 5b 6c 73 65 61 72 63 68 20 24 72 65 73 75 6c  {[lsearch $resul
2c70: 74 73 20 24 72 65 73 5d 3c 30 7d 20 7b 0a 20 20  ts $res]<0} {.  
2c80: 20 20 65 72 72 6f 72 20 24 72 65 73 0a 20 20 7d    error $res.  }
2c90: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..  do_test e_fk
2ca0: 65 79 2d 31 31 2e 24 74 6e 20 7b 0a 20 20 20 20  ey-11.$tn {.    
2cb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2cc0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2cd0: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
2ce0: 20 4e 4f 54 20 28 0a 20 20 20 20 20 20 20 20 74   NOT (.        t
2cf0: 72 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55  rackartist IS NU
2d00: 4c 4c 20 4f 52 20 0a 20 20 20 20 20 20 20 20 45  LL OR .        E
2d10: 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46  XISTS(SELECT 1 F
2d20: 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
2d30: 20 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61   artistid=tracka
2d40: 72 74 69 73 74 29 0a 20 20 20 20 20 20 29 0a 20  rtist).      ). 
2d50: 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a 0a     }.  } {0}.}..
2d60: 23 20 45 78 65 63 75 74 65 20 61 20 73 65 72 69  # Execute a seri
2d70: 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 49 4e 53  es of random INS
2d80: 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64 20  ERT, UPDATE and 
2d90: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2da0: 73 0a 23 20 28 73 6f 6d 65 20 6f 66 20 77 68 69  s.# (some of whi
2db0: 63 68 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ch may fail due 
2dc0: 74 6f 20 46 4b 20 6f 72 20 50 4b 20 63 6f 6e 73  to FK or PK cons
2dd0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
2de0: 73 29 20 6f 6e 20 0a 23 20 74 68 65 20 74 77 6f  s) on .# the two
2df0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 65   tables in the e
2e00: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 2e 20 54  xample schema. T
2e10: 65 73 74 20 74 68 61 74 20 52 2d 35 32 34 38 36  est that R-52486
2e20: 2d 32 31 33 35 32 0a 23 20 69 73 20 74 72 75 65  -21352.# is true
2e30: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
2e40: 20 65 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 2e   each operation.
2e50: 0a 23 0a 73 65 74 20 54 65 6d 70 6c 61 74 65 20  .#.set Template 
2e60: 7b 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  {.  {INSERT INTO
2e70: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 24 74   track VALUES($t
2e80: 2c 20 27 74 72 61 63 6b 20 24 74 27 2c 20 24 61  , 'track $t', $a
2e90: 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f  )}.  {DELETE FRO
2ea0: 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72  M track WHERE tr
2eb0: 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20 7b 55  ackid = $t}.  {U
2ec0: 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20  PDATE track SET 
2ed0: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 24 61  trackartist = $a
2ee0: 20 57 48 45 52 45 20 74 72 61 63 6b 69 64 20 3d   WHERE trackid =
2ef0: 20 24 74 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49   $t}.  {INSERT I
2f00: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
2f10: 53 28 24 61 2c 20 27 61 72 74 69 73 74 20 24 61  S($a, 'artist $a
2f20: 27 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46 52  ')}.  {DELETE FR
2f30: 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
2f40: 61 72 74 69 73 74 69 64 20 3d 20 24 61 7d 0a 20  artistid = $a}. 
2f50: 20 7b 55 50 44 41 54 45 20 61 72 74 69 73 74 20   {UPDATE artist 
2f60: 53 45 54 20 61 72 74 69 73 74 69 64 20 3d 20 24  SET artistid = $
2f70: 61 32 20 57 48 45 52 45 20 61 72 74 69 73 74 69  a2 WHERE artisti
2f80: 64 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72 20 7b 73  d = $a}.}.for {s
2f90: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35 30  et i 0} {$i < 50
2fa0: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
2fb0: 73 65 74 20 61 20 20 20 5b 65 78 70 72 20 69 6e  set a   [expr in
2fc0: 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20 20  t(rand()*10)].  
2fd0: 73 65 74 20 61 32 20 20 5b 65 78 70 72 20 69 6e  set a2  [expr in
2fe0: 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a 20 20  t(rand()*10)].  
2ff0: 73 65 74 20 74 20 20 20 5b 65 78 70 72 20 69 6e  set t   [expr in
3000: 74 28 72 61 6e 64 28 29 2a 35 30 29 5d 0a 20 20  t(rand()*50)].  
3010: 73 65 74 20 73 71 6c 20 5b 73 75 62 73 74 20 5b  set sql [subst [
3020: 6c 69 6e 64 65 78 20 24 54 65 6d 70 6c 61 74 65  lindex $Template
3030: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
3040: 29 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65 73 74 5f  )*6)]]]..  test_
3050: 72 35 32 34 38 36 5f 32 31 33 35 32 20 24 69 20  r52486_21352 $i 
3060: 24 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  $sql.}..#-------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
30c0: 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  a NOT NULL const
30d0: 72 61 69 6e 74 20 63 61 6e 20 62 65 20 61 64 64  raint can be add
30e0: 65 64 20 74 6f 20 74 68 65 20 65 78 61 6d 70 6c  ed to the exampl
30f0: 65 20 73 63 68 65 6d 61 0a 23 20 74 6f 20 70 72  e schema.# to pr
3100: 6f 68 69 62 69 74 20 4e 55 4c 4c 20 63 68 69 6c  ohibit NULL chil
3110: 64 20 6b 65 79 73 20 66 72 6f 6d 20 62 65 69 6e  d keys from bein
3120: 67 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a 23 20  g inserted..#.# 
3130: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
3140: 32 34 31 32 2d 35 39 33 32 31 20 54 69 70 3a 20  2412-59321 Tip: 
3150: 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  If the applicati
3160: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 20 73 74  on requires a st
3170: 72 69 63 74 65 72 0a 23 20 72 65 6c 61 74 69 6f  ricter.# relatio
3180: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 61 72  nship between ar
3190: 74 69 73 74 20 61 6e 64 20 74 72 61 63 6b 2c 20  tist and track, 
31a0: 77 68 65 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65  where NULL value
31b0: 73 20 61 72 65 20 6e 6f 74 0a 23 20 70 65 72 6d  s are not.# perm
31c0: 69 74 74 65 64 20 69 6e 20 74 68 65 20 74 72 61  itted in the tra
31d0: 63 6b 61 72 74 69 73 74 20 63 6f 6c 75 6d 6e 2c  ckartist column,
31e0: 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68 65 20   simply add the 
31f0: 61 70 70 72 6f 70 72 69 61 74 65 20 22 4e 4f 54  appropriate "NOT
3200: 0a 23 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  .# NULL" constra
3210: 69 6e 74 20 74 6f 20 74 68 65 20 73 63 68 65 6d  int to the schem
3220: 61 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  a..#.drop_all_ta
3230: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
3240: 6b 65 79 2d 31 32 2e 31 20 7b 0a 20 20 65 78 65  key-12.1 {.  exe
3250: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
3260: 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a  E TABLE artist(.
3270: 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20        artistid  
3280: 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52    INTEGER PRIMAR
3290: 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72  Y KEY, .      ar
32a0: 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20  tistname  TEXT. 
32b0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
32c0: 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20   TABLE track(.  
32d0: 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20      trackid     
32e0: 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20  INTEGER, .      
32f0: 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54  trackname   TEXT
3300: 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72  , .      trackar
3310: 74 69 73 74 20 49 4e 54 45 47 45 52 20 4e 4f 54  tist INTEGER NOT
3320: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 46 4f 52   NULL,.      FOR
3330: 45 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72  EIGN KEY(trackar
3340: 74 69 73 74 29 20 52 45 46 45 52 45 4e 43 45 53  tist) REFERENCES
3350: 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
3360: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  ).    );.  }.} {
3370: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
3380: 2d 31 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -12.2 {.  catchs
3390: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
33a0: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34   track VALUES(14
33b0: 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73  , 'Mr. Bojangles
33c0: 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20  ', NULL) }.} {1 
33d0: 7b 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  {NOT NULL constr
33e0: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 72 61  aint failed: tra
33f0: 63 6b 2e 74 72 61 63 6b 61 72 74 69 73 74 7d 7d  ck.trackartist}}
3400: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
3450: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36  VIDENCE-OF: R-16
3460: 31 32 37 2d 33 35 34 34 32 0a 23 0a 23 20 54 65  127-35442.#.# Te
3470: 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
3480: 6f 6d 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68  om foreignkeys.h
3490: 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  tml..#.drop_all_
34a0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
34b0: 5f 66 6b 65 79 2d 31 33 2e 31 20 7b 0a 20 20 65  _fkey-13.1 {.  e
34c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
34d0: 41 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74  ATE TABLE artist
34e0: 28 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64  (.      artistid
34f0: 20 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d      INTEGER PRIM
3500: 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20  ARY KEY, .      
3510: 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54  artistname  TEXT
3520: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
3530: 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a  TE TABLE track(.
3540: 20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20        trackid   
3550: 20 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20    INTEGER, .    
3560: 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45    trackname   TE
3570: 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b  XT, .      track
3580: 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 2c 0a  artist INTEGER,.
3590: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
35a0: 59 28 74 72 61 63 6b 61 72 74 69 73 74 29 20 52  Y(trackartist) R
35b0: 45 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74  EFERENCES artist
35c0: 28 61 72 74 69 73 74 69 64 29 0a 20 20 20 20 29  (artistid).    )
35d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
35e0: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
35f0: 31 2c 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27  1, 'Dean Martin'
3600: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3610: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
3620: 28 32 2c 20 27 46 72 61 6e 6b 20 53 69 6e 61 74  (2, 'Frank Sinat
3630: 72 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ra');.    INSERT
3640: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
3650: 45 53 28 31 31 2c 20 27 54 68 61 74 27 27 73 20  ES(11, 'That''s 
3660: 41 6d 6f 72 65 27 2c 20 31 29 3b 0a 20 20 20 20  Amore', 1);.    
3670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
3680: 6b 20 56 41 4c 55 45 53 28 31 32 2c 20 27 43 68  k VALUES(12, 'Ch
3690: 72 69 73 74 6d 61 73 20 42 6c 75 65 73 27 2c 20  ristmas Blues', 
36a0: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
36b0: 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53  NTO track VALUES
36c0: 28 31 33 2c 20 27 4d 79 20 57 61 79 27 2c 20 32  (13, 'My Way', 2
36d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
36e0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 32 20  est e_fkey-13.2 
36f0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
3700: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
3710: 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e   VALUES(14, 'Mr.
3720: 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33 29 20   Bojangles', 3) 
3730: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
3740: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
3750: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
3760: 65 5f 66 6b 65 79 2d 31 33 2e 33 20 7b 0a 20 20  e_fkey-13.3 {.  
3770: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3780: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
3790: 45 53 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61  ES(14, 'Mr. Boja
37a0: 6e 67 6c 65 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a  ngles', NULL) }.
37b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
37c0: 6b 65 79 2d 31 33 2e 34 20 7b 0a 20 20 63 61 74  key-13.4 {.  cat
37d0: 63 68 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44  chsql { .    UPD
37e0: 41 54 45 20 74 72 61 63 6b 20 53 45 54 20 74 72  ATE track SET tr
37f0: 61 63 6b 61 72 74 69 73 74 20 3d 20 33 20 57 48  ackartist = 3 WH
3800: 45 52 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20  ERE trackname = 
3810: 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b  'Mr. Bojangles';
3820: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  .  }.} {1 {FOREI
3830: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
3840: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
3850: 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 35 20 7b  st e_fkey-13.5 {
3860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3870: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74   INSERT INTO art
3880: 69 73 74 20 56 41 4c 55 45 53 28 33 2c 20 27 53  ist VALUES(3, 'S
3890: 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 29  ammy Davis Jr.')
38a0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 72 61  ;.    UPDATE tra
38b0: 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74 69  ck SET trackarti
38c0: 73 74 20 3d 20 33 20 57 48 45 52 45 20 74 72 61  st = 3 WHERE tra
38d0: 63 6b 6e 61 6d 65 20 3d 20 27 4d 72 2e 20 42 6f  ckname = 'Mr. Bo
38e0: 6a 61 6e 67 6c 65 73 27 3b 0a 20 20 20 20 49 4e  jangles';.    IN
38f0: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
3900: 56 41 4c 55 45 53 28 31 35 2c 20 27 42 6f 6f 67  VALUES(15, 'Boog
3910: 69 65 20 57 6f 6f 67 69 65 27 2c 20 33 29 3b 0a  ie Woogie', 3);.
3920: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
3980: 4f 46 3a 20 52 2d 31 35 39 35 38 2d 35 30 32 33  OF: R-15958-5023
3990: 33 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 73  3.#.# Test the s
39a0: 65 63 6f 6e 64 20 65 78 61 6d 70 6c 65 20 66 72  econd example fr
39b0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 73 65 63  om the first sec
39c0: 74 69 6f 6e 20 6f 66 20 66 6f 72 65 69 67 6e 6b  tion of foreignk
39d0: 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 6f 5f 74  eys.html..#.do_t
39e0: 65 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 31 20  est e_fkey-14.1 
39f0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
3a00: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61     DELETE FROM a
3a10: 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
3a20: 73 74 6e 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20  stname = 'Frank 
3a30: 53 69 6e 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20  Sinatra';.  }.} 
3a40: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
3a50: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
3a60: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
3a70: 65 79 2d 31 34 2e 32 20 7b 0a 20 20 65 78 65 63  ey-14.2 {.  exec
3a80: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
3a90: 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52   FROM track WHER
3aa0: 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d  E trackname = 'M
3ab0: 79 20 57 61 79 27 3b 0a 20 20 20 20 44 45 4c 45  y Way';.    DELE
3ac0: 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
3ad0: 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20  HERE artistname 
3ae0: 3d 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72 61  = 'Frank Sinatra
3af0: 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ';.  }.} {}.do_t
3b00: 65 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 33 20  est e_fkey-14.3 
3b10: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
3b20: 20 20 20 55 50 44 41 54 45 20 61 72 74 69 73 74     UPDATE artist
3b30: 20 53 45 54 20 61 72 74 69 73 74 69 64 3d 34 20   SET artistid=4 
3b40: 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d 65  WHERE artistname
3b50: 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27   = 'Dean Martin'
3b60: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  ;.  }.} {1 {FORE
3b70: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
3b80: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
3b90: 65 73 74 20 65 5f 66 6b 65 79 2d 31 34 2e 34 20  est e_fkey-14.4 
3ba0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3bb0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72    DELETE FROM tr
3bc0: 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 6e  ack WHERE trackn
3bd0: 61 6d 65 20 49 4e 28 27 54 68 61 74 27 27 73 20  ame IN('That''s 
3be0: 41 6d 6f 72 65 27 2c 20 27 43 68 72 69 73 74 6d  Amore', 'Christm
3bf0: 61 73 20 42 6c 75 65 73 27 29 3b 0a 20 20 20 20  as Blues');.    
3c00: 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
3c10: 54 20 61 72 74 69 73 74 69 64 3d 34 20 57 48 45  T artistid=4 WHE
3c20: 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20  RE artistname = 
3c30: 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20  'Dean Martin';. 
3c40: 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d   }.} {}...#-----
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
3ca0: 4f 46 3a 20 52 2d 35 36 30 33 32 2d 32 34 39 32  OF: R-56032-2492
3cb0: 33 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  3 The foreign ke
3cc0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  y constraint is 
3cd0: 73 61 74 69 73 66 69 65 64 20 69 66 0a 23 20 66  satisfied if.# f
3ce0: 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
3cf0: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 65  he child table e
3d00: 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 6d 6f 72  ither one or mor
3d10: 65 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  e of the child k
3d20: 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 20 61 72 65  ey.# columns are
3d30: 20 4e 55 4c 4c 2c 20 6f 72 20 74 68 65 72 65 20   NULL, or there 
3d40: 65 78 69 73 74 73 20 61 20 72 6f 77 20 69 6e 20  exists a row in 
3d50: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
3d60: 20 66 6f 72 20 77 68 69 63 68 0a 23 20 65 61 63   for which.# eac
3d70: 68 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  h parent key col
3d80: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 76  umn contains a v
3d90: 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 74 68  alue equal to th
3da0: 65 20 76 61 6c 75 65 20 69 6e 20 69 74 73 0a 23  e value in its.#
3db0: 20 61 73 73 6f 63 69 61 74 65 64 20 63 68 69 6c   associated chil
3dc0: 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  d key column..#.
3dd0: 23 20 54 65 73 74 20 61 6c 73 6f 20 74 68 61 74  # Test also that
3de0: 20 74 68 65 20 75 73 75 61 6c 20 63 6f 6d 70 61   the usual compa
3df0: 72 69 73 6f 6e 20 72 75 6c 65 73 20 61 72 65 20  rison rules are 
3e00: 75 73 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  used when testin
3e10: 67 20 69 66 20 74 68 65 72 65 20 0a 23 20 69 73  g if there .# is
3e20: 20 61 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20   a matching row 
3e30: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
3e40: 62 6c 65 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  ble of a foreign
3e50: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e   key constraint.
3e60: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3e70: 3a 20 52 2d 35 37 37 36 35 2d 31 32 33 38 30 20  : R-57765-12380 
3e80: 49 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  In the above par
3e90: 61 67 72 61 70 68 2c 20 74 68 65 20 74 65 72 6d  agraph, the term
3ea0: 20 22 65 71 75 61 6c 22 0a 23 20 6d 65 61 6e 73   "equal".# means
3eb0: 20 65 71 75 61 6c 20 77 68 65 6e 20 76 61 6c 75   equal when valu
3ec0: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  es are compared 
3ed0: 75 73 69 6e 67 20 74 68 65 20 72 75 6c 65 73 20  using the rules 
3ee0: 73 70 65 63 69 66 69 65 64 20 68 65 72 65 2e 0a  specified here..
3ef0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
3f00: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
3f10: 2d 31 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -15.1 {.  execsq
3f20: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
3f30: 41 42 4c 45 20 70 61 72 28 70 20 50 52 49 4d 41  ABLE par(p PRIMA
3f40: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
3f50: 41 54 45 20 54 41 42 4c 45 20 63 68 69 28 63 20  ATE TABLE chi(c 
3f60: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 29 3b  REFERENCES par);
3f70: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
3f80: 4f 20 70 61 72 20 56 41 4c 55 45 53 28 31 29 3b  O par VALUES(1);
3f90: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3fa0: 20 70 61 72 20 56 41 4c 55 45 53 28 27 31 27 29   par VALUES('1')
3fb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3fc0: 4f 20 70 61 72 20 56 41 4c 55 45 53 28 58 27 33  O par VALUES(X'3
3fd0: 31 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  1');.    SELECT 
3fe0: 74 79 70 65 6f 66 28 70 29 20 46 52 4f 4d 20 70  typeof(p) FROM p
3ff0: 61 72 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67  ar;.  }.} {integ
4000: 65 72 20 74 65 78 74 20 62 6c 6f 62 7d 0a 0a 70  er text blob}..p
4010: 72 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 34  roc test_efkey_4
4020: 35 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71  5 {tn isError sq
4030: 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  l} {.  do_test e
4040: 5f 66 6b 65 79 2d 31 35 2e 24 74 6e 2e 31 20 22  _fkey-15.$tn.1 "
4050: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 24  .    catchsql {$
4060: 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78  sql}.  " [lindex
4070: 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52   {{0 {}} {1 {FOR
4080: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
4090: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69  int failed}}} $i
40a0: 73 45 72 72 6f 72 5d 0a 0a 20 20 64 6f 5f 74 65  sError]..  do_te
40b0: 73 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24 74 6e  st e_fkey-15.$tn
40c0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
40d0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
40e0: 2a 20 46 52 4f 4d 20 63 68 69 20 57 48 45 52 45  * FROM chi WHERE
40f0: 20 63 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41   c IS NOT NULL A
4100: 4e 44 20 63 20 4e 4f 54 20 49 4e 20 28 53 45 4c  ND c NOT IN (SEL
4110: 45 43 54 20 70 20 46 52 4f 4d 20 70 61 72 29 0a  ECT p FROM par).
4120: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a      }.  } {}.}..
4130: 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 31 20  test_efkey_45 1 
4140: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  0 "INSERT INTO c
4150: 68 69 20 56 41 4c 55 45 53 28 31 29 22 0a 74 65  hi VALUES(1)".te
4160: 73 74 5f 65 66 6b 65 79 5f 34 35 20 32 20 31 20  st_efkey_45 2 1 
4170: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69  "INSERT INTO chi
4180: 20 56 41 4c 55 45 53 28 27 31 2e 30 27 29 22 0a   VALUES('1.0')".
4190: 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 33 20  test_efkey_45 3 
41a0: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  0 "INSERT INTO c
41b0: 68 69 20 56 41 4c 55 45 53 28 27 31 27 29 22 0a  hi VALUES('1')".
41c0: 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 34 20  test_efkey_45 4 
41d0: 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  1 "DELETE FROM p
41e0: 61 72 20 57 48 45 52 45 20 70 20 3d 20 27 31 27  ar WHERE p = '1'
41f0: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20  ".test_efkey_45 
4200: 35 20 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  5 0 "DELETE FROM
4210: 20 63 68 69 20 57 48 45 52 45 20 63 20 3d 20 27   chi WHERE c = '
4220: 31 27 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34  1'".test_efkey_4
4230: 35 20 36 20 30 20 22 44 45 4c 45 54 45 20 46 52  5 6 0 "DELETE FR
4240: 4f 4d 20 70 61 72 20 57 48 45 52 45 20 70 20 3d  OM par WHERE p =
4250: 20 27 31 27 22 0a 74 65 73 74 5f 65 66 6b 65 79   '1'".test_efkey
4260: 5f 34 35 20 37 20 31 20 22 49 4e 53 45 52 54 20  _45 7 1 "INSERT 
4270: 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28  INTO chi VALUES(
4280: 27 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  '1')".test_efkey
4290: 5f 34 35 20 38 20 30 20 22 49 4e 53 45 52 54 20  _45 8 0 "INSERT 
42a0: 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28  INTO chi VALUES(
42b0: 58 27 33 31 27 29 22 0a 74 65 73 74 5f 65 66 6b  X'31')".test_efk
42c0: 65 79 5f 34 35 20 39 20 31 20 22 49 4e 53 45 52  ey_45 9 1 "INSER
42d0: 54 20 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45  T INTO chi VALUE
42e0: 53 28 58 27 33 32 27 29 22 0a 0a 23 2d 2d 2d 2d  S(X'32')"..#----
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66 69 63  -----.# Specific
4340: 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61 74 20  ally, test that 
4350: 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 63  when comparing c
4360: 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20  hild and parent 
4370: 6b 65 79 20 76 61 6c 75 65 73 20 74 68 65 0a 23  key values the.#
4380: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
4390: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  on sequence of t
43a0: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  he parent key co
43b0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 2e 0a 23 0a  lumn is used..#.
43c0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
43d0: 2d 31 35 37 39 36 2d 34 37 35 31 33 20 57 68 65  -15796-47513 Whe
43e0: 6e 20 63 6f 6d 70 61 72 69 6e 67 20 74 65 78 74  n comparing text
43f0: 20 76 61 6c 75 65 73 2c 20 74 68 65 20 63 6f 6c   values, the col
4400: 6c 61 74 69 6e 67 0a 23 20 73 65 71 75 65 6e 63  lating.# sequenc
4410: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
4420: 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  h the parent key
4430: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79   column is alway
4440: 73 20 75 73 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  s used..#.drop_a
4450: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
4460: 74 20 65 5f 66 6b 65 79 2d 31 36 2e 31 20 7b 0a  t e_fkey-16.1 {.
4470: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4480: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4490: 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  a COLLATE nocase
44a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
44b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
44c0: 74 32 28 62 20 52 45 46 45 52 45 4e 43 45 53 20  t2(b REFERENCES 
44d0: 74 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  t1);.  }.} {}.do
44e0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e  _test e_fkey-16.
44f0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
4500: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4510: 74 31 20 56 41 4c 55 45 53 28 27 6f 4e 65 27 29  t1 VALUES('oNe')
4520: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4530: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6f 6e 65  O t2 VALUES('one
4540: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4550: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 4f  NTO t2 VALUES('O
4560: 4e 45 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45  NE');.    UPDATE
4570: 20 74 32 20 53 45 54 20 62 20 3d 20 27 4f 6e 45   t2 SET b = 'OnE
4580: 27 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  ';.    UPDATE t1
4590: 20 53 45 54 20 61 20 3d 20 27 4f 4e 45 27 3b 0a   SET a = 'ONE';.
45a0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
45b0: 20 65 5f 66 6b 65 79 2d 31 36 2e 33 20 7b 0a 20   e_fkey-16.3 {. 
45c0: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
45d0: 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 74  TE t2 SET b = 't
45e0: 77 6f 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  wo' WHERE rowid 
45f0: 3d 20 31 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  = 1 }.} {1 {FORE
4600: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
4610: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
4620: 65 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 34 20  est e_fkey-16.4 
4630: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  {.  catchsql { D
4640: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
4650: 45 52 45 20 72 6f 77 69 64 20 3d 20 31 20 7d 0a  ERE rowid = 1 }.
4660: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
4670: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
4680: 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  led}}..#--------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c 79  -.# Specifically
46e0: 2c 20 74 65 73 74 20 74 68 61 74 20 77 68 65 6e  , test that when
46f0: 20 63 6f 6d 70 61 72 69 6e 67 20 63 68 69 6c 64   comparing child
4700: 20 61 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 20   and parent key 
4710: 76 61 6c 75 65 73 20 74 68 65 0a 23 20 61 66 66  values the.# aff
4720: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 70 61 72  inity of the par
4730: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69  ent key column i
4740: 73 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  s applied to the
4750: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
4760: 0a 23 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  .# before the co
4770: 6d 70 61 72 69 73 6f 6e 20 74 61 6b 65 73 20 70  mparison takes p
4780: 6c 61 63 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e  lace..#.# EVIDEN
4790: 43 45 2d 4f 46 3a 20 52 2d 30 34 32 34 30 2d 31  CE-OF: R-04240-1
47a0: 33 38 36 30 20 57 68 65 6e 20 63 6f 6d 70 61 72  3860 When compar
47b0: 69 6e 67 20 76 61 6c 75 65 73 2c 20 69 66 20 74  ing values, if t
47c0: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20  he parent key.# 
47d0: 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 61 66  column has an af
47e0: 66 69 6e 69 74 79 2c 20 74 68 65 6e 20 74 68 61  finity, then tha
47f0: 74 20 61 66 66 69 6e 69 74 79 20 69 73 20 61 70  t affinity is ap
4800: 70 6c 69 65 64 20 74 6f 20 74 68 65 20 63 68 69  plied to the chi
4810: 6c 64 20 6b 65 79 0a 23 20 76 61 6c 75 65 20 62  ld key.# value b
4820: 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 61 72  efore the compar
4830: 69 73 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  ison is performe
4840: 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
4850: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
4860: 6b 65 79 2d 31 37 2e 31 20 7b 0a 20 20 65 78 65  key-17.1 {.  exe
4870: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4880: 45 20 54 41 42 4c 45 20 74 31 28 61 20 4e 55 4d  E TABLE t1(a NUM
4890: 45 52 49 43 20 50 52 49 4d 41 52 59 20 4b 45 59  ERIC PRIMARY KEY
48a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
48b0: 42 4c 45 20 74 32 28 62 20 54 45 58 54 20 52 45  BLE t2(b TEXT RE
48c0: 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20  FERENCES t1);.  
48d0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
48e0: 5f 66 6b 65 79 2d 31 37 2e 32 20 7b 0a 20 20 65  _fkey-17.2 {.  e
48f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
4900: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4910: 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(1);.    INSER
4920: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4930: 28 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (2);.    INSERT 
4940: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4950: 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e 53  three');.    INS
4960: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
4970: 45 53 28 27 32 2e 30 27 29 3b 0a 20 20 20 20 53  ES('2.0');.    S
4980: 45 4c 45 43 54 20 62 2c 20 74 79 70 65 6f 66 28  ELECT b, typeof(
4990: 62 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a  b) FROM t2;.  }.
49a0: 7d 20 7b 32 2e 30 20 74 65 78 74 7d 0a 64 6f 5f  } {2.0 text}.do_
49b0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 33  test e_fkey-17.3
49c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
49d0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 61 29 20  ELECT typeof(a) 
49e0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 69 6e 74  FROM t1 }.} {int
49f0: 65 67 65 72 20 69 6e 74 65 67 65 72 20 74 65 78  eger integer tex
4a00: 74 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  t}.do_test e_fke
4a10: 79 2d 31 37 2e 34 20 7b 0a 20 20 63 61 74 63 68  y-17.4 {.  catch
4a20: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
4a30: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
4a40: 20 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52   = 2 }.} {1 {FOR
4a50: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
4a60: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 23  int failed}}..##
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4aa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4ab0: 23 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45  #########.### SE
4ac0: 43 54 49 4f 4e 20 33 3a 20 52 65 71 75 69 72 65  CTION 3: Require
4ad0: 64 20 61 6e 64 20 53 75 67 67 65 73 74 65 64 20  d and Suggested 
4ae0: 44 61 74 61 62 61 73 65 20 49 6e 64 65 78 65 73  Database Indexes
4af0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
4b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b30: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 20 70 61 72  --------.# A par
4b90: 65 6e 74 20 6b 65 79 20 6d 75 73 74 20 62 65 20  ent key must be 
4ba0: 65 69 74 68 65 72 20 61 20 50 52 49 4d 41 52 59  either a PRIMARY
4bb0: 20 4b 45 59 2c 20 73 75 62 6a 65 63 74 20 74 6f   KEY, subject to
4bc0: 20 61 20 55 4e 49 51 55 45 20 0a 23 20 63 6f 6e   a UNIQUE .# con
4bd0: 73 74 72 61 69 6e 74 2c 20 6f 72 20 68 61 76 65  straint, or have
4be0: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20   a UNIQUE index 
4bf0: 63 72 65 61 74 65 64 20 6f 6e 20 69 74 2e 0a 23  created on it..#
4c00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4c10: 52 2d 31 33 34 33 35 2d 32 36 33 31 31 20 55 73  R-13435-26311 Us
4c20: 75 61 6c 6c 79 2c 20 74 68 65 20 70 61 72 65 6e  ually, the paren
4c30: 74 20 6b 65 79 20 6f 66 20 61 20 66 6f 72 65 69  t key of a forei
4c40: 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61  gn key.# constra
4c50: 69 6e 74 20 69 73 20 74 68 65 20 70 72 69 6d 61  int is the prima
4c60: 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70 61  ry key of the pa
4c70: 72 65 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 74  rent table. If t
4c80: 68 65 79 20 61 72 65 20 6e 6f 74 20 74 68 65 0a  hey are not the.
4c90: 23 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74  # primary key, t
4ca0: 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b  hen the parent k
4cb0: 65 79 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  ey columns must 
4cc0: 62 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20  be collectively 
4cd0: 73 75 62 6a 65 63 74 0a 23 20 74 6f 20 61 20 55  subject.# to a U
4ce0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
4cf0: 20 6f 72 20 68 61 76 65 20 61 20 55 4e 49 51 55   or have a UNIQU
4d00: 45 20 69 6e 64 65 78 2e 0a 23 20 0a 23 20 41 6c  E index..# .# Al
4d10: 73 6f 20 74 65 73 74 20 74 68 61 74 20 69 66 20  so test that if 
4d20: 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20  a parent key is 
4d30: 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20 61  not subject to a
4d40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
4d50: 55 4e 49 51 55 45 0a 23 20 63 6f 6e 73 74 72 61  UNIQUE.# constra
4d60: 69 6e 74 2c 20 62 75 74 20 64 6f 65 73 20 68 61  int, but does ha
4d70: 76 65 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65  ve a UNIQUE inde
4d80: 78 20 63 72 65 61 74 65 64 20 6f 6e 20 69 74 2c  x created on it,
4d90: 20 74 68 65 6e 20 74 68 65 20 55 4e 49 51 55 45   then the UNIQUE
4da0: 20 69 6e 64 65 78 0a 23 20 6d 75 73 74 20 75 73   index.# must us
4db0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  e the default co
4dc0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4dd0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4de0: 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  h the parent key
4df0: 0a 23 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20  .# columns..#.# 
4e00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
4e10: 30 33 37 36 2d 33 39 32 31 32 20 49 66 20 74 68  0376-39212 If th
4e20: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
4e30: 75 6d 6e 73 20 68 61 76 65 20 61 20 55 4e 49 51  umns have a UNIQ
4e40: 55 45 0a 23 20 69 6e 64 65 78 2c 20 74 68 65 6e  UE.# index, then
4e50: 20 74 68 61 74 20 69 6e 64 65 78 20 6d 75 73 74   that index must
4e60: 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
4e70: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 74 68 61  on sequences tha
4e80: 74 20 61 72 65 0a 23 20 73 70 65 63 69 66 69 65  t are.# specifie
4e90: 64 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  d in the CREATE 
4ea0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4eb0: 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74  for the parent t
4ec0: 61 62 6c 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  able..#.drop_all
4ed0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
4ee0: 65 5f 66 6b 65 79 2d 31 38 2e 31 20 7b 0a 20 20  e_fkey-18.1 {.  
4ef0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4f00: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
4f10: 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 78 29  REFERENCES t1(x)
4f20: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63  );.  }.} {}.proc
4f30: 20 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 7b   test_efkey_57 {
4f40: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
4f50: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  {.  catchsql { D
4f60: 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 20  ROP TABLE t1 }. 
4f70: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20   execsql $sql.  
4f80: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
4f90: 38 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61 74 63  8.$tn {.    catc
4fa0: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
4fb0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 4e 55 4c  TO t2 VALUES(NUL
4fc0: 4c 29 20 7d 0a 20 20 7d 20 5b 6c 69 6e 64 65 78  L) }.  } [lindex
4fd0: 20 7b 7b 30 20 7b 7d 7d 20 7b 2f 31 20 7b 66 6f   {{0 {}} {/1 {fo
4fe0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
4ff0: 63 68 20 2d 20 22 2e 2a 22 20 72 65 66 65 72 65  ch - ".*" refere
5000: 6e 63 69 6e 67 20 22 2e 2a 22 7d 2f 7d 7d 20 5c  ncing ".*"}/}} \
5010: 0a 20 20 20 20 20 24 69 73 45 72 72 6f 72 5d 0a  .     $isError].
5020: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20  }.test_efkey_57 
5030: 32 20 30 20 7b 20 43 52 45 41 54 45 20 54 41 42  2 0 { CREATE TAB
5040: 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  LE t1(x PRIMARY 
5050: 4b 45 59 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65  KEY) }.test_efke
5060: 79 5f 35 37 20 33 20 30 20 7b 20 43 52 45 41 54  y_57 3 0 { CREAT
5070: 45 20 54 41 42 4c 45 20 74 31 28 78 20 55 4e 49  E TABLE t1(x UNI
5080: 51 55 45 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65  QUE) }.test_efke
5090: 79 5f 35 37 20 34 20 30 20 7b 20 43 52 45 41 54  y_57 4 0 { CREAT
50a0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20 43  E TABLE t1(x); C
50b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
50c0: 45 58 20 74 31 69 20 4f 4e 20 74 31 28 78 29 20  EX t1i ON t1(x) 
50d0: 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20  }.test_efkey_57 
50e0: 35 20 31 20 7b 20 0a 20 20 43 52 45 41 54 45 20  5 1 { .  CREATE 
50f0: 54 41 42 4c 45 20 74 31 28 78 29 3b 20 0a 20 20  TABLE t1(x); .  
5100: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
5110: 44 45 58 20 74 31 69 20 4f 4e 20 74 31 28 78 20  DEX t1i ON t1(x 
5120: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b  COLLATE nocase);
5130: 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37  .}.test_efkey_57
5140: 20 36 20 31 20 7b 20 43 52 45 41 54 45 20 54 41   6 1 { CREATE TA
5150: 42 4c 45 20 74 31 28 78 29 20 7d 0a 74 65 73 74  BLE t1(x) }.test
5160: 5f 65 66 6b 65 79 5f 35 37 20 37 20 31 20 7b 20  _efkey_57 7 1 { 
5170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5180: 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b 45  x, y, PRIMARY KE
5190: 59 28 78 2c 20 79 29 29 20 7d 0a 74 65 73 74 5f  Y(x, y)) }.test_
51a0: 65 66 6b 65 79 5f 35 37 20 38 20 31 20 7b 20 43  efkey_57 8 1 { C
51b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
51c0: 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
51d0: 29 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f  )) }.test_efkey_
51e0: 35 37 20 39 20 31 20 7b 20 0a 20 20 43 52 45 41  57 9 1 { .  CREA
51f0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5200: 29 3b 20 0a 20 20 43 52 45 41 54 45 20 55 4e 49  ); .  CREATE UNI
5210: 51 55 45 20 49 4e 44 45 58 20 74 31 69 20 4f 4e  QUE INDEX t1i ON
5220: 20 74 31 28 78 2c 20 79 29 3b 0a 7d 0a 0a 0a 23   t1(x, y);.}...#
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
5280: 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 61 6e 20   block tests an 
5290: 65 78 61 6d 70 6c 65 20 69 6e 20 66 6f 72 65 69  example in forei
52a0: 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 53 65 76  gnkeys.html. Sev
52b0: 65 72 61 6c 20 74 65 73 74 61 62 6c 65 0a 23 20  eral testable.# 
52c0: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 66 65 72  statements refer
52d0: 20 74 6f 20 74 68 69 73 20 65 78 61 6d 70 6c 65   to this example
52e0: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 0a 23 0a 23  , as follows.#.#
52f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5300: 32 37 34 38 34 2d 30 31 34 36 37 0a 23 0a 23 20  27484-01467.#.# 
5310: 46 4b 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 6f  FK Constraints o
5320: 6e 20 63 68 69 6c 64 31 2c 20 63 68 69 6c 64 32  n child1, child2
5330: 20 61 6e 64 20 63 68 69 6c 64 33 20 61 72 65 20   and child3 are 
5340: 4f 6b 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20  Ok..#.# Problem 
5350: 77 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64  with FK on child
5360: 34 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  4:.#.# EVIDENCE-
5370: 4f 46 3a 20 52 2d 35 31 30 33 39 2d 34 34 38 34  OF: R-51039-4484
5380: 30 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  0 The foreign ke
5390: 79 20 64 65 63 6c 61 72 65 64 20 61 73 20 70 61  y declared as pa
53a0: 72 74 20 6f 66 20 74 61 62 6c 65 0a 23 20 63 68  rt of table.# ch
53b0: 69 6c 64 34 20 69 73 20 61 6e 20 65 72 72 6f 72  ild4 is an error
53c0: 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74 68   because even th
53d0: 6f 75 67 68 20 74 68 65 20 70 61 72 65 6e 74 20  ough the parent 
53e0: 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 0a 23 20  key column is.# 
53f0: 69 6e 64 65 78 65 64 2c 20 74 68 65 20 69 6e 64  indexed, the ind
5400: 65 78 20 69 73 20 6e 6f 74 20 55 4e 49 51 55 45  ex is not UNIQUE
5410: 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69  ..#.# Problem wi
5420: 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 35 3a  th FK on child5:
5430: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
5440: 3a 20 52 2d 30 31 30 36 30 2d 34 38 37 38 38 20  : R-01060-48788 
5450: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
5460: 66 6f 72 20 74 61 62 6c 65 20 63 68 69 6c 64 35  for table child5
5470: 20 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 20 62   is an.# error b
5480: 65 63 61 75 73 65 20 65 76 65 6e 20 74 68 6f 75  ecause even thou
5490: 67 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  gh the parent ke
54a0: 79 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 20 75  y column has a u
54b0: 6e 69 71 75 65 20 69 6e 64 65 78 2c 0a 23 20 74  nique index,.# t
54c0: 68 65 20 69 6e 64 65 78 20 75 73 65 73 20 61 20  he index uses a 
54d0: 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
54e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 23 0a  ing sequence..#.
54f0: 23 20 50 72 6f 62 6c 65 6d 20 77 69 74 68 20 46  # Problem with F
5500: 4b 20 6f 6e 20 63 68 69 6c 64 36 20 61 6e 64 20  K on child6 and 
5510: 63 68 69 6c 64 37 3a 0a 23 0a 23 20 45 56 49 44  child7:.#.# EVID
5520: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 30 38 38  ENCE-OF: R-63088
5530: 2d 33 37 34 36 39 20 54 61 62 6c 65 73 20 63 68  -37469 Tables ch
5540: 69 6c 64 36 20 61 6e 64 20 63 68 69 6c 64 37 20  ild6 and child7 
5550: 61 72 65 20 69 6e 63 6f 72 72 65 63 74 0a 23 20  are incorrect.# 
5560: 62 65 63 61 75 73 65 20 77 68 69 6c 65 20 62 6f  because while bo
5570: 74 68 20 68 61 76 65 20 55 4e 49 51 55 45 20 69  th have UNIQUE i
5580: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 69 72 20  ndices on their 
5590: 70 61 72 65 6e 74 20 6b 65 79 73 2c 20 74 68 65  parent keys, the
55a0: 20 6b 65 79 73 0a 23 20 61 72 65 20 6e 6f 74 20   keys.# are not 
55b0: 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 74  an exact match t
55c0: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  o the columns of
55d0: 20 61 20 73 69 6e 67 6c 65 20 55 4e 49 51 55 45   a single UNIQUE
55e0: 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61   index..#.drop_a
55f0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
5600: 74 20 65 5f 66 6b 65 79 2d 31 39 2e 31 20 7b 0a  t e_fkey-19.1 {.
5610: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5620: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
5630: 65 6e 74 28 61 20 50 52 49 4d 41 52 59 20 4b 45  ent(a PRIMARY KE
5640: 59 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 2c 20  Y, b UNIQUE, c, 
5650: 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 43 52  d, e, f);.    CR
5660: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5670: 58 20 69 31 20 4f 4e 20 70 61 72 65 6e 74 28 63  X i1 ON parent(c
5680: 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , d);.    CREATE
5690: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 70 61 72   INDEX i2 ON par
56a0: 65 6e 74 28 65 29 3b 0a 20 20 20 20 43 52 45 41  ent(e);.    CREA
56b0: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
56c0: 69 33 20 4f 4e 20 70 61 72 65 6e 74 28 66 20 43  i3 ON parent(f C
56d0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
56e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
56f0: 45 20 63 68 69 6c 64 31 28 66 2c 20 67 20 52 45  E child1(f, g RE
5700: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
5710: 61 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  a));            
5720: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f 6b             -- Ok
5730: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5740: 45 20 63 68 69 6c 64 32 28 68 2c 20 69 20 52 45  E child2(h, i RE
5750: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
5760: 62 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  b));            
5770: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f 6b             -- Ok
5780: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5790: 45 20 63 68 69 6c 64 33 28 6a 2c 20 6b 2c 20 46  E child3(j, k, F
57a0: 4f 52 45 49 47 4e 20 4b 45 59 28 6a 2c 20 6b 29  OREIGN KEY(j, k)
57b0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
57c0: 6e 74 28 63 2c 20 64 29 29 3b 20 2d 2d 20 4f 6b  nt(c, d)); -- Ok
57d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
57e0: 45 20 63 68 69 6c 64 34 28 6c 2c 20 6d 20 52 45  E child4(l, m RE
57f0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
5800: 65 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  e));            
5810: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72             -- Er
5820: 72 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  r.    CREATE TAB
5830: 4c 45 20 63 68 69 6c 64 35 28 6e 2c 20 6f 20 52  LE child5(n, o R
5840: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
5850: 28 66 29 29 3b 20 20 20 20 20 20 20 20 20 20 20  (f));           
5860: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45              -- E
5870: 72 72 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  rr.    CREATE TA
5880: 42 4c 45 20 63 68 69 6c 64 36 28 70 2c 20 71 2c  BLE child6(p, q,
5890: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 70 2c 71   FOREIGN KEY(p,q
58a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
58b0: 65 6e 74 28 62 2c 20 63 29 29 3b 20 20 2d 2d 20  ent(b, c));  -- 
58c0: 45 72 72 0a 20 20 20 20 43 52 45 41 54 45 20 54  Err.    CREATE T
58d0: 41 42 4c 45 20 63 68 69 6c 64 37 28 72 20 52 45  ABLE child7(r RE
58e0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
58f0: 63 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  c));            
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
5910: 20 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   Err.  }.} {}.do
5920: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e  _test e_fkey-19.
5930: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
5940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5950: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 2c  parent VALUES(1,
5960: 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 29 3b   2, 3, 4, 5, 6);
5970: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5980: 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28 27   child1 VALUES('
5990: 78 78 78 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  xxx', 1);.    IN
59a0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32  SERT INTO child2
59b0: 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20 32   VALUES('xxx', 2
59c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
59d0: 54 4f 20 63 68 69 6c 64 33 20 56 41 4c 55 45 53  TO child3 VALUES
59e0: 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (3, 4);.  }.} {}
59f0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
5a00: 31 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  19.2 {.  catchsq
5a10: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
5a20: 63 68 69 6c 64 34 20 56 41 4c 55 45 53 28 27 78  child4 VALUES('x
5a30: 78 78 27 2c 20 35 29 20 7d 0a 7d 20 7b 31 20 7b  xx', 5) }.} {1 {
5a40: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
5a50: 61 74 63 68 20 2d 20 22 63 68 69 6c 64 34 22 20  atch - "child4" 
5a60: 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 61 72  referencing "par
5a70: 65 6e 74 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  ent"}}.do_test e
5a80: 5f 66 6b 65 79 2d 31 39 2e 33 20 7b 0a 20 20 63  _fkey-19.3 {.  c
5a90: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
5aa0: 20 49 4e 54 4f 20 63 68 69 6c 64 35 20 56 41 4c   INTO child5 VAL
5ab0: 55 45 53 28 27 78 78 78 27 2c 20 36 29 20 7d 0a  UES('xxx', 6) }.
5ac0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
5ad0: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68  y mismatch - "ch
5ae0: 69 6c 64 35 22 20 72 65 66 65 72 65 6e 63 69 6e  ild5" referencin
5af0: 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a 64 6f 5f  g "parent"}}.do_
5b00: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 34  test e_fkey-19.4
5b10: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
5b20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
5b30: 64 36 20 56 41 4c 55 45 53 28 32 2c 20 33 29 20  d6 VALUES(2, 3) 
5b40: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
5b50: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
5b60: 63 68 69 6c 64 36 22 20 72 65 66 65 72 65 6e 63  child6" referenc
5b70: 69 6e 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a 64  ing "parent"}}.d
5b80: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39  o_test e_fkey-19
5b90: 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .5 {.  catchsql 
5ba0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68  { INSERT INTO ch
5bb0: 69 6c 64 37 20 56 41 4c 55 45 53 28 33 29 20 7d  ild7 VALUES(3) }
5bc0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
5bd0: 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63  ey mismatch - "c
5be0: 68 69 6c 64 37 22 20 72 65 66 65 72 65 6e 63 69  hild7" referenci
5bf0: 6e 67 20 22 70 61 72 65 6e 74 22 7d 7d 0a 0a 23  ng "parent"}}..#
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
5c50: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 64   errors in the d
5c60: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 74  atabase schema t
5c70: 68 61 74 20 61 72 65 20 64 65 74 65 63 74 65 64  hat are detected
5c80: 20 77 68 69 6c 65 20 70 72 65 70 61 72 69 6e 67   while preparing
5c90: 0a 23 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74  .# DML statement
5ca0: 73 2e 20 54 68 65 20 65 72 72 6f 72 20 74 65 78  s. The error tex
5cb0: 74 20 66 6f 72 20 74 68 65 73 65 20 6d 65 73 73  t for these mess
5cc0: 61 67 65 73 20 61 6c 77 61 79 73 20 6d 61 74 63  ages always matc
5cd0: 68 65 73 20 0a 23 20 65 69 74 68 65 72 20 22 66  hes .# either "f
5ce0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
5cf0: 74 63 68 22 20 6f 72 20 22 6e 6f 20 73 75 63 68  tch" or "no such
5d00: 20 74 61 62 6c 65 2a 22 20 28 75 73 69 6e 67 20   table*" (using 
5d10: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 5d 29 2e  [string match]).
5d20: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
5d30: 3a 20 52 2d 34 35 34 38 38 2d 30 38 35 30 34 20  : R-45488-08504 
5d40: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
5d50: 73 63 68 65 6d 61 20 63 6f 6e 74 61 69 6e 73 20  schema contains 
5d60: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 65 72  foreign key.# er
5d70: 72 6f 72 73 20 74 68 61 74 20 72 65 71 75 69 72  rors that requir
5d80: 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 6d 6f 72  e looking at mor
5d90: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
5da0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 6f 0a 23   definition to.#
5db0: 20 69 64 65 6e 74 69 66 79 2c 20 74 68 65 6e 20   identify, then 
5dc0: 74 68 6f 73 65 20 65 72 72 6f 72 73 20 61 72 65  those errors are
5dd0: 20 6e 6f 74 20 64 65 74 65 63 74 65 64 20 77 68   not detected wh
5de0: 65 6e 20 74 68 65 20 74 61 62 6c 65 73 20 61 72  en the tables ar
5df0: 65 0a 23 20 63 72 65 61 74 65 64 2e 0a 23 0a 23  e.# created..#.#
5e00: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5e10: 34 38 33 39 31 2d 33 38 34 37 32 20 49 6e 73 74  48391-38472 Inst
5e20: 65 61 64 2c 20 73 75 63 68 20 65 72 72 6f 72 73  ead, such errors
5e30: 20 70 72 65 76 65 6e 74 20 74 68 65 0a 23 20 61   prevent the.# a
5e40: 70 70 6c 69 63 61 74 69 6f 6e 20 66 72 6f 6d 20  pplication from 
5e50: 70 72 65 70 61 72 69 6e 67 20 53 51 4c 20 73 74  preparing SQL st
5e60: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 6d 6f  atements that mo
5e70: 64 69 66 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  dify the content
5e80: 20 6f 66 0a 23 20 74 68 65 20 63 68 69 6c 64 20   of.# the child 
5e90: 6f 72 20 70 61 72 65 6e 74 20 74 61 62 6c 65 73  or parent tables
5ea0: 20 69 6e 20 77 61 79 73 20 74 68 61 74 20 75 73   in ways that us
5eb0: 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  e the foreign ke
5ec0: 79 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ys..#.# EVIDENCE
5ed0: 2d 4f 46 3a 20 52 2d 30 33 31 30 38 2d 36 33 36  -OF: R-03108-636
5ee0: 35 39 20 54 68 65 20 45 6e 67 6c 69 73 68 20 6c  59 The English l
5ef0: 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65  anguage error me
5f00: 73 73 61 67 65 20 66 6f 72 0a 23 20 66 6f 72 65  ssage for.# fore
5f10: 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72 6f  ign key DML erro
5f20: 72 73 20 69 73 20 75 73 75 61 6c 6c 79 20 22 66  rs is usually "f
5f30: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
5f40: 74 63 68 22 20 62 75 74 20 63 61 6e 20 61 6c 73  tch" but can als
5f50: 6f 0a 23 20 62 65 20 22 6e 6f 20 73 75 63 68 20  o.# be "no such 
5f60: 74 61 62 6c 65 22 20 69 66 20 74 68 65 20 70 61  table" if the pa
5f70: 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73 20  rent table does 
5f80: 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20 45  not exist..#.# E
5f90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
5fa0: 37 38 31 2d 32 36 35 37 36 20 46 6f 72 65 69 67  781-26576 Foreig
5fb0: 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72 6f 72 73  n key DML errors
5fc0: 20 61 72 65 20 6d 61 79 20 62 65 20 72 65 70 6f   are may be repo
5fd0: 72 74 65 64 0a 23 20 69 66 3a 20 54 68 65 20 70  rted.# if: The p
5fe0: 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73  arent table does
5ff0: 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 54   not exist, or T
6000: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  he parent key co
6010: 6c 75 6d 6e 73 20 6e 61 6d 65 64 0a 23 20 69 6e  lumns named.# in
6020: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
6030: 20 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 20 6e   constraint do n
6040: 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 54 68 65  ot exist, or The
6050: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75   parent key colu
6060: 6d 6e 73 0a 23 20 6e 61 6d 65 64 20 69 6e 20 74  mns.# named in t
6070: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
6080: 6f 6e 73 74 72 61 69 6e 74 20 61 72 65 20 6e 6f  onstraint are no
6090: 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  t the primary ke
60a0: 79 20 6f 66 20 74 68 65 0a 23 20 70 61 72 65 6e  y of the.# paren
60b0: 74 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20  t table and are 
60c0: 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20 61  not subject to a
60d0: 20 75 6e 69 71 75 65 20 63 6f 6e 73 74 72 61 69   unique constrai
60e0: 6e 74 20 75 73 69 6e 67 0a 23 20 63 6f 6c 6c 61  nt using.# colla
60f0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 73 70  ting sequence sp
6100: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 43  ecified in the C
6110: 52 45 41 54 45 20 54 41 42 4c 45 2c 20 6f 72 20  REATE TABLE, or 
6120: 54 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 0a  The child table.
6130: 23 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  # references the
6140: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20   primary key of 
6150: 74 68 65 20 70 61 72 65 6e 74 20 77 69 74 68 6f  the parent witho
6160: 75 74 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  ut specifying th
6170: 65 0a 23 20 70 72 69 6d 61 72 79 20 6b 65 79 20  e.# primary key 
6180: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
6190: 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6d 61 72  number of primar
61a0: 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  y key columns in
61b0: 20 74 68 65 0a 23 20 70 61 72 65 6e 74 20 64 6f   the.# parent do
61c0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
61d0: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 6b  umber of child k
61e0: 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 6f  ey columns..#.do
61f0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e  _test e_fkey-20.
6200: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
6210: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6220: 20 63 31 28 63 20 52 45 46 45 52 45 4e 43 45 53   c1(c REFERENCES
6230: 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20 64 29   nosuchtable, d)
6240: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6250: 42 4c 45 20 70 32 28 61 2c 20 62 2c 20 55 4e 49  BLE p2(a, b, UNI
6260: 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20  QUE(a, b));.    
6270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
6280: 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
6290: 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
62a0: 45 53 20 70 32 28 61 2c 20 78 29 29 3b 0a 0a 20  ES p2(a, x));.. 
62b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
62c0: 70 33 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p3(a PRIMARY KEY
62d0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
62e0: 20 54 41 42 4c 45 20 63 33 28 63 20 52 45 46 45   TABLE c3(c REFE
62f0: 52 45 4e 43 45 53 20 70 33 28 62 29 2c 20 64 29  RENCES p3(b), d)
6300: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
6310: 42 4c 45 20 70 34 28 61 20 50 52 49 4d 41 52 59  BLE p4(a PRIMARY
6320: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
6330: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
6340: 58 20 70 34 69 20 4f 4e 20 70 34 28 62 20 43 4f  X p4i ON p4(b CO
6350: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20  LLATE nocase);. 
6360: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6370: 63 34 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  c4(c REFERENCES 
6380: 70 34 28 62 29 2c 20 64 29 3b 0a 0a 20 20 20 20  p4(b), d);..    
6390: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 35 28  CREATE TABLE p5(
63a0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
63b0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
63c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
63d0: 51 55 45 20 49 4e 44 45 58 20 70 35 69 20 4f 4e  QUE INDEX p5i ON
63e0: 20 70 35 28 62 20 43 4f 4c 4c 41 54 45 20 62 69   p5(b COLLATE bi
63f0: 6e 61 72 79 29 3b 0a 20 20 20 20 43 52 45 41 54  nary);.    CREAT
6400: 45 20 54 41 42 4c 45 20 63 35 28 63 20 52 45 46  E TABLE c5(c REF
6410: 45 52 45 4e 43 45 53 20 70 35 28 62 29 2c 20 64  ERENCES p5(b), d
6420: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6430: 41 42 4c 45 20 70 36 28 61 20 50 52 49 4d 41 52  ABLE p6(a PRIMAR
6440: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
6450: 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 63  REATE TABLE c6(c
6460: 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
6470: 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
6480: 53 20 70 36 29 3b 0a 0a 20 20 20 20 43 52 45 41  S p6);..    CREA
6490: 54 45 20 54 41 42 4c 45 20 70 37 28 61 2c 20 62  TE TABLE p7(a, b
64a0: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
64b0: 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   b));.    CREATE
64c0: 20 54 41 42 4c 45 20 63 37 28 63 2c 20 64 20 52   TABLE c7(c, d R
64d0: 45 46 45 52 45 4e 43 45 53 20 70 37 29 3b 0a 20  EFERENCES p7);. 
64e0: 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68   }.} {}..foreach
64f0: 20 7b 74 6e 20 74 62 6c 20 70 74 62 6c 20 65 72   {tn tbl ptbl er
6500: 72 7d 20 7b 0a 20 20 32 20 63 31 20 7b 7d 20 22  r} {.  2 c1 {} "
6510: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d  no such table: m
6520: 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 22  ain.nosuchtable"
6530: 0a 20 20 33 20 63 32 20 70 32 20 22 66 6f 72 65  .  3 c2 p2 "fore
6540: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
6550: 20 2d 20 5c 22 63 32 5c 22 20 72 65 66 65 72 65   - \"c2\" refere
6560: 6e 63 69 6e 67 20 5c 22 70 32 5c 22 22 0a 20 20  ncing \"p2\"".  
6570: 34 20 63 33 20 70 33 20 22 66 6f 72 65 69 67 6e  4 c3 p3 "foreign
6580: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
6590: 5c 22 63 33 5c 22 20 72 65 66 65 72 65 6e 63 69  \"c3\" referenci
65a0: 6e 67 20 5c 22 70 33 5c 22 22 0a 20 20 35 20 63  ng \"p3\"".  5 c
65b0: 34 20 70 34 20 22 66 6f 72 65 69 67 6e 20 6b 65  4 p4 "foreign ke
65c0: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 5c 22 63  y mismatch - \"c
65d0: 34 5c 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20  4\" referencing 
65e0: 5c 22 70 34 5c 22 22 0a 20 20 36 20 63 35 20 70  \"p4\"".  6 c5 p
65f0: 35 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  5 "foreign key m
6600: 69 73 6d 61 74 63 68 20 2d 20 5c 22 63 35 5c 22  ismatch - \"c5\"
6610: 20 72 65 66 65 72 65 6e 63 69 6e 67 20 5c 22 70   referencing \"p
6620: 35 5c 22 22 0a 20 20 37 20 63 36 20 70 36 20 22  5\"".  7 c6 p6 "
6630: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6640: 61 74 63 68 20 2d 20 5c 22 63 36 5c 22 20 72 65  atch - \"c6\" re
6650: 66 65 72 65 6e 63 69 6e 67 20 5c 22 70 36 5c 22  ferencing \"p6\"
6660: 22 0a 20 20 38 20 63 37 20 70 37 20 22 66 6f 72  ".  8 c7 p7 "for
6670: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
6680: 68 20 2d 20 5c 22 63 37 5c 22 20 72 65 66 65 72  h - \"c7\" refer
6690: 65 6e 63 69 6e 67 20 5c 22 70 37 5c 22 22 0a 7d  encing \"p7\"".}
66a0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   {.  do_test e_f
66b0: 6b 65 79 2d 32 30 2e 24 74 6e 2e 31 20 7b 0a 20  key-20.$tn.1 {. 
66c0: 20 20 20 63 61 74 63 68 73 71 6c 20 22 49 4e 53     catchsql "INS
66d0: 45 52 54 20 49 4e 54 4f 20 24 74 62 6c 20 56 41  ERT INTO $tbl VA
66e0: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 22 0a  LUES('a', 'b')".
66f0: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
6700: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ].  do_test e_fk
6710: 65 79 2d 32 30 2e 24 74 6e 2e 32 20 7b 0a 20 20  ey-20.$tn.2 {.  
6720: 20 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41    catchsql "UPDA
6730: 54 45 20 24 74 62 6c 20 53 45 54 20 63 20 3d 20  TE $tbl SET c = 
6740: 3f 2c 20 64 20 3d 20 3f 22 0a 20 20 7d 20 5b 6c  ?, d = ?".  } [l
6750: 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20 64 6f  ist 1 $err].  do
6760: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e  _test e_fkey-20.
6770: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 63 61 74 63  $tn.3 {.    catc
6780: 68 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  hsql "INSERT INT
6790: 4f 20 24 74 62 6c 20 53 45 4c 45 43 54 20 3f 2c  O $tbl SELECT ?,
67a0: 20 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20   ?".  } [list 1 
67b0: 24 65 72 72 5d 0a 0a 20 20 69 66 20 7b 24 70 74  $err]..  if {$pt
67c0: 62 6c 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20  bl ne ""} {.    
67d0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
67e0: 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20  0.$tn.4 {.      
67f0: 63 61 74 63 68 73 71 6c 20 22 44 45 4c 45 54 45  catchsql "DELETE
6800: 20 46 52 4f 4d 20 24 70 74 62 6c 22 0a 20 20 20   FROM $ptbl".   
6810: 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d   } [list 1 $err]
6820: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  .    do_test e_f
6830: 6b 65 79 2d 32 30 2e 24 74 6e 2e 35 20 7b 0a 20  key-20.$tn.5 {. 
6840: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 55       catchsql "U
6850: 50 44 41 54 45 20 24 70 74 62 6c 20 53 45 54 20  PDATE $ptbl SET 
6860: 61 20 3d 20 3f 2c 20 62 20 3d 20 3f 22 0a 20 20  a = ?, b = ?".  
6870: 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72    } [list 1 $err
6880: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f  ].    do_test e_
6890: 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 36 20 7b 0a  fkey-20.$tn.6 {.
68a0: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22        catchsql "
68b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 70 74 62  INSERT INTO $ptb
68c0: 6c 20 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a 20  l SELECT ?, ?". 
68d0: 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65 72     } [list 1 $er
68e0: 72 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  r].  }.}..#-----
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
6940: 4f 46 3a 20 52 2d 31 39 33 35 33 2d 34 33 36 34  OF: R-19353-4364
6950: 33 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 65  3.#.# Test the e
6960: 78 61 6d 70 6c 65 20 6f 66 20 66 6f 72 65 69 67  xample of foreig
6970: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 65  n key mismatch e
6980: 72 72 6f 72 73 20 63 61 75 73 65 64 20 62 79 20  rrors caused by 
6990: 69 6d 70 6c 69 63 69 74 6c 79 0a 23 20 6d 61 70  implicitly.# map
69a0: 70 69 6e 67 20 61 20 63 68 69 6c 64 20 6b 65 79  ping a child key
69b0: 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20   to the primary 
69c0: 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e  key of the paren
69d0: 74 20 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65  t table when the
69e0: 0a 23 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6e  .# child key con
69f0: 73 69 73 74 73 20 6f 66 20 61 20 64 69 66 66 65  sists of a diffe
6a00: 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63  rent number of c
6a10: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 61 74 20 70  olumns to that p
6a20: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 23 20 0a 64  rimary key..# .d
6a30: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
6a40: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31  o_test e_fkey-21
6a50: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
6a60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6a70: 45 20 70 61 72 65 6e 74 32 28 61 2c 20 62 2c 20  E parent2(a, b, 
6a80: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 29  PRIMARY KEY(a,b)
6a90: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6aa0: 41 42 4c 45 20 63 68 69 6c 64 38 28 78 2c 20 79  ABLE child8(x, y
6ab0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c  , FOREIGN KEY(x,
6ac0: 79 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  y) REFERENCES pa
6ad0: 72 65 6e 74 32 29 3b 20 20 20 20 20 2d 2d 20 4f  rent2);     -- O
6ae0: 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  k.    CREATE TAB
6af0: 4c 45 20 63 68 69 6c 64 39 28 78 20 52 45 46 45  LE child9(x REFE
6b00: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29 3b  RENCES parent2);
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72 72            -- Err
6b30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6b40: 45 20 63 68 69 6c 64 31 30 28 78 2c 79 2c 7a 2c  E child10(x,y,z,
6b50: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79   FOREIGN KEY(x,y
6b60: 2c 7a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  ,z) REFERENCES p
6b70: 61 72 65 6e 74 32 29 3b 20 2d 2d 20 45 72 72 0a  arent2); -- Err.
6b80: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
6b90: 20 65 5f 66 6b 65 79 2d 32 31 2e 32 20 7b 0a 20   e_fkey-21.2 {. 
6ba0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
6bb0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
6bc0: 74 32 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27  t2 VALUES('I', '
6bd0: 49 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  II');.    INSERT
6be0: 20 49 4e 54 4f 20 63 68 69 6c 64 38 20 56 41 4c   INTO child8 VAL
6bf0: 55 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a  UES('I', 'II');.
6c00: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
6c10: 20 65 5f 66 6b 65 79 2d 32 31 2e 33 20 7b 0a 20   e_fkey-21.3 {. 
6c20: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
6c30: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 39 20 56  RT INTO child9 V
6c40: 41 4c 55 45 53 28 27 49 27 29 20 7d 0a 7d 20 7b  ALUES('I') }.} {
6c50: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
6c60: 69 73 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64  ismatch - "child
6c70: 39 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  9" referencing "
6c80: 70 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65  parent2"}}.do_te
6c90: 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 34 20 7b  st e_fkey-21.4 {
6ca0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
6cb0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 39  SERT INTO child9
6cc0: 20 56 41 4c 55 45 53 28 27 49 49 27 29 20 7d 0a   VALUES('II') }.
6cd0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
6ce0: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 68  y mismatch - "ch
6cf0: 69 6c 64 39 22 20 72 65 66 65 72 65 6e 63 69 6e  ild9" referencin
6d00: 67 20 22 70 61 72 65 6e 74 32 22 7d 7d 0a 64 6f  g "parent2"}}.do
6d10: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6d20: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
6d30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
6d40: 6c 64 39 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29  ld9 VALUES(NULL)
6d50: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
6d60: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
6d70: 22 63 68 69 6c 64 39 22 20 72 65 66 65 72 65 6e  "child9" referen
6d80: 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d 7d  cing "parent2"}}
6d90: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
6da0: 32 31 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71  21.6 {.  catchsq
6db0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
6dc0: 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28 27  child10 VALUES('
6dd0: 49 27 2c 20 27 49 49 27 2c 20 27 49 49 49 27 29  I', 'II', 'III')
6de0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
6df0: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
6e00: 22 63 68 69 6c 64 31 30 22 20 72 65 66 65 72 65  "child10" refere
6e10: 6e 63 69 6e 67 20 22 70 61 72 65 6e 74 32 22 7d  ncing "parent2"}
6e20: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
6e30: 2d 32 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  -21.7 {.  catchs
6e40: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
6e50: 20 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28   child10 VALUES(
6e60: 31 2c 20 32 2c 20 33 29 20 7d 0a 7d 20 7b 31 20  1, 2, 3) }.} {1 
6e70: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
6e80: 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 31 30  match - "child10
6e90: 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70  " referencing "p
6ea0: 61 72 65 6e 74 32 22 7d 7d 0a 64 6f 5f 74 65 73  arent2"}}.do_tes
6eb0: 74 20 65 5f 66 6b 65 79 2d 32 31 2e 38 20 7b 0a  t e_fkey-21.8 {.
6ec0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6ed0: 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 30  ERT INTO child10
6ee0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
6ef0: 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31  LL, NULL) }.} {1
6f00: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
6f10: 73 6d 61 74 63 68 20 2d 20 22 63 68 69 6c 64 31  smatch - "child1
6f20: 30 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  0" referencing "
6f30: 70 61 72 65 6e 74 32 22 7d 7d 0a 0a 23 2d 2d 2d  parent2"}}..#---
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 65 72  ------.# Test er
6f90: 72 6f 72 73 20 74 68 61 74 20 61 72 65 20 72 65  rors that are re
6fa0: 70 6f 72 74 65 64 20 77 68 65 6e 20 63 72 65 61  ported when crea
6fb0: 74 69 6e 67 20 74 68 65 20 63 68 69 6c 64 20 74  ting the child t
6fc0: 61 62 6c 65 2e 20 0a 23 20 53 70 65 63 69 66 69  able. .# Specifi
6fd0: 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20 2a 20 64  cally:.#.#   * d
6fe0: 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
6ff0: 6f 66 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72  of child and par
7000: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c  ent key columns,
7010: 20 61 6e 64 0a 23 20 20 20 2a 20 63 68 69 6c 64   and.#   * child
7020: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 64 6f   columns that do
7030: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20   not exist..#.# 
7040: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
7050: 33 36 38 32 2d 35 39 38 32 30 20 42 79 20 63 6f  3682-59820 By co
7060: 6e 74 72 61 73 74 2c 20 69 66 20 66 6f 72 65 69  ntrast, if forei
7070: 67 6e 20 6b 65 79 20 65 72 72 6f 72 73 20 63 61  gn key errors ca
7080: 6e 20 62 65 0a 23 20 72 65 63 6f 67 6e 69 7a 65  n be.# recognize
7090: 64 20 73 69 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b  d simply by look
70a0: 69 6e 67 20 61 74 20 74 68 65 20 64 65 66 69 6e  ing at the defin
70b0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 69  ition of the chi
70c0: 6c 64 20 74 61 62 6c 65 20 61 6e 64 0a 23 20 77  ld table and.# w
70d0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
70e0: 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 70 61 72   consult the par
70f0: 65 6e 74 20 74 61 62 6c 65 20 64 65 66 69 6e 69  ent table defini
7100: 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 43  tion, then the C
7110: 52 45 41 54 45 0a 23 20 54 41 42 4c 45 20 73 74  REATE.# TABLE st
7120: 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  atement for the 
7130: 63 68 69 6c 64 20 74 61 62 6c 65 20 66 61 69 6c  child table fail
7140: 73 2e 0a 23 0a 23 20 54 68 65 73 65 20 65 72 72  s..#.# These err
7150: 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  ors are reported
7160: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
7170: 46 4b 20 73 75 70 70 6f 72 74 20 69 73 20 65 6e  FK support is en
7180: 61 62 6c 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  abled..#.# EVIDE
7190: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 38 38 33 2d  NCE-OF: R-33883-
71a0: 32 38 38 33 33 20 46 6f 72 65 69 67 6e 20 6b 65  28833 Foreign ke
71b0: 79 20 44 44 4c 20 65 72 72 6f 72 73 20 61 72 65  y DDL errors are
71c0: 20 72 65 70 6f 72 74 65 64 0a 23 20 72 65 67 61   reported.# rega
71d0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
71e0: 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e  r or not foreign
71f0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
7200: 20 61 72 65 20 65 6e 61 62 6c 65 64 20 77 68 65   are enabled whe
7210: 6e 0a 23 20 74 68 65 20 74 61 62 6c 65 20 69 73  n.# the table is
7220: 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 72 6f 70   created..#.drop
7230: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 66 6f 72 65  _all_tables.fore
7240: 61 63 68 20 66 6b 20 5b 6c 69 73 74 20 4f 46 46  ach fk [list OFF
7250: 20 4f 4e 5d 20 7b 0a 20 20 65 78 65 63 73 71 6c   ON] {.  execsql
7260: 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
7270: 5f 6b 65 79 73 20 3d 20 24 66 6b 22 0a 20 20 73  _keys = $fk".  s
7280: 65 74 20 69 20 30 0a 20 20 66 6f 72 65 61 63 68  et i 0.  foreach
7290: 20 7b 73 71 6c 20 65 72 72 6f 72 7d 20 7b 0a 20   {sql error} {. 
72a0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
72b0: 20 63 68 69 6c 64 31 28 61 2c 20 62 2c 20 46 4f   child1(a, b, FO
72c0: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20  REIGN KEY(a, b) 
72d0: 52 45 46 45 52 45 4e 43 45 53 20 70 28 63 29 29  REFERENCES p(c))
72e0: 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20  ".      {number 
72f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
7300: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
7310: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
7320: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
7330: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
7340: 20 74 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45   table}.    "CRE
7350: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
7360: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
7370: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
7380: 43 45 53 20 70 28 63 2c 20 64 2c 20 65 29 29 22  CES p(c, d, e))"
7390: 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f  .      {number o
73a0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
73b0: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
73c0: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
73d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
73e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
73f0: 74 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45 41  table}.    "CREA
7400: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
7410: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7420: 59 28 61 2c 20 63 29 20 52 45 46 45 52 45 4e 43  Y(a, c) REFERENC
7430: 45 53 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20  ES p(c, d))".   
7440: 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     {unknown colu
7450: 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67  mn "c" in foreig
7460: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
7470: 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  }.    "CREATE TA
7480: 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62 2c  BLE child2(a, b,
7490: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
74a0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  b) REFERENCES p(
74b0: 63 2c 20 64 29 29 22 0a 20 20 20 20 20 20 7b 75  c, d))".      {u
74c0: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63  nknown column "c
74d0: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
74e0: 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a 20 20 7d   definition}.  }
74f0: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65   {.    do_test e
7500: 5f 66 6b 65 79 2d 32 32 2e 24 66 6b 2e 5b 69 6e  _fkey-22.$fk.[in
7510: 63 72 20 69 5d 20 7b 0a 20 20 20 20 20 20 63 61  cr i] {.      ca
7520: 74 63 68 73 71 6c 20 24 73 71 6c 0a 20 20 20 20  tchsql $sql.    
7530: 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6f 72  } [list 1 $error
7540: 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ].  }.}..#------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7590: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
75a0: 61 20 52 45 46 45 52 45 4e 43 49 4e 47 20 63 6c  a REFERENCING cl
75b0: 61 75 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  ause that does n
75c0: 6f 74 20 73 70 65 63 69 66 79 20 70 61 72 65 6e  ot specify paren
75d0: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23 20  t key columns.# 
75e0: 69 6d 70 6c 69 63 69 74 6c 79 20 6d 61 70 73 20  implicitly maps 
75f0: 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  to the primary k
7600: 65 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ey of the parent
7610: 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44   table..#.# EVID
7620: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 38 37 39  ENCE-OF: R-43879
7630: 2d 30 38 30 32 35 20 41 74 74 61 63 68 69 6e 67  -08025 Attaching
7640: 20 61 20 22 52 45 46 45 52 45 4e 43 45 53 20 3c   a "REFERENCES <
7650: 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e 22 0a 23  parent-table>".#
7660: 20 63 6c 61 75 73 65 20 74 6f 20 61 20 63 6f 6c   clause to a col
7670: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 63  umn definition c
7680: 72 65 61 74 65 73 20 61 20 66 6f 72 65 69 67 6e  reates a foreign
7690: 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  .# key constrain
76a0: 74 20 74 68 61 74 20 6d 61 70 73 20 74 68 65 20  t that maps the 
76b0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 70 72  column to the pr
76c0: 69 6d 61 72 79 20 6b 65 79 20 6f 66 0a 23 20 3c  imary key of.# <
76d0: 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e 2e 0a 23  parent-table>..#
76e0: 20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79   .do_test e_fkey
76f0: 2d 32 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -23.1 {.  execsq
7700: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
7710: 41 42 4c 45 20 70 31 28 61 2c 20 62 2c 20 50 52  ABLE p1(a, b, PR
7720: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
7730: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7740: 4c 45 20 70 32 28 61 2c 20 62 20 50 52 49 4d 41  LE p2(a, b PRIMA
7750: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
7760: 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
7770: 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
7780: 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
7790: 70 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  p1);.    CREATE 
77a0: 54 41 42 4c 45 20 63 32 28 61 2c 20 62 20 52 45  TABLE c2(a, b RE
77b0: 46 45 52 45 4e 43 45 53 20 70 32 29 3b 0a 20 20  FERENCES p2);.  
77c0: 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65 73 74  }.} {}.proc test
77d0: 5f 65 66 6b 65 79 5f 36 30 20 7b 74 6e 20 69 73  _efkey_60 {tn is
77e0: 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64  Error sql} {.  d
77f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 33  o_test e_fkey-23
7800: 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68  .$tn ".    catch
7810: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
7820: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
7830: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
7840: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
7850: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a  }}} $isError].}.
7860: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 32  .test_efkey_60 2
7870: 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   1 "INSERT INTO 
7880: 63 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  c1 VALUES(239, 2
7890: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
78a0: 36 30 20 33 20 30 20 22 49 4e 53 45 52 54 20 49  60 3 0 "INSERT I
78b0: 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 32 33  NTO p1 VALUES(23
78c0: 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66  9, 231)".test_ef
78d0: 6b 65 79 5f 36 30 20 34 20 30 20 22 49 4e 53 45  key_60 4 0 "INSE
78e0: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
78f0: 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73  S(239, 231)".tes
7900: 74 5f 65 66 6b 65 79 5f 36 30 20 35 20 31 20 22  t_efkey_60 5 1 "
7910: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
7920: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
7930: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 36  .test_efkey_60 6
7940: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
7950: 70 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  p2 VALUES(239, 2
7960: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
7970: 36 30 20 37 20 30 20 22 49 4e 53 45 52 54 20 49  60 7 0 "INSERT I
7980: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 33  NTO c2 VALUES(23
7990: 39 2c 20 32 33 31 29 22 0a 0a 23 2d 2d 2d 2d 2d  9, 231)"..#-----
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
79f0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 6f 6e 20   an index on on 
7a00: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f  the child key co
7a10: 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46 4b 20 63  lumns of an FK c
7a20: 6f 6e 73 74 72 61 69 6e 74 0a 23 20 69 73 20 6f  onstraint.# is o
7a30: 70 74 69 6f 6e 61 6c 2e 0a 23 0a 23 20 45 56 49  ptional..#.# EVI
7a40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 31  DENCE-OF: R-1541
7a50: 37 2d 32 38 30 31 34 20 49 6e 64 69 63 65 73 20  7-28014 Indices 
7a60: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
7a70: 20 66 6f 72 20 63 68 69 6c 64 20 6b 65 79 0a 23   for child key.#
7a80: 20 63 6f 6c 75 6d 6e 73 0a 23 0a 23 20 41 6c 73   columns.#.# Als
7a90: 6f 20 74 65 73 74 20 74 68 61 74 20 69 66 20 61  o test that if a
7aa0: 6e 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  n index is creat
7ab0: 65 64 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ed on the child 
7ac0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20  key columns, it 
7ad0: 64 6f 65 73 0a 23 20 6e 6f 74 20 6d 61 6b 65 20  does.# not make 
7ae0: 61 20 64 69 66 66 65 72 65 6e 63 65 20 77 68 65  a difference whe
7af0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69  ther or not it i
7b00: 73 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  s a UNIQUE index
7b10: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7b20: 46 3a 20 52 2d 31 35 37 34 31 2d 35 30 38 39 33  F: R-15741-50893
7b30: 20 54 68 65 20 63 68 69 6c 64 20 6b 65 79 20 69   The child key i
7b40: 6e 64 65 78 20 64 6f 65 73 20 6e 6f 74 20 68 61  ndex does not ha
7b50: 76 65 20 74 6f 20 62 65 0a 23 20 28 61 6e 64 20  ve to be.# (and 
7b60: 75 73 75 61 6c 6c 79 20 77 69 6c 6c 20 6e 6f 74  usually will not
7b70: 20 62 65 29 20 61 20 55 4e 49 51 55 45 20 69 6e   be) a UNIQUE in
7b80: 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  dex..#.drop_all_
7b90: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
7ba0: 5f 66 6b 65 79 2d 32 34 2e 31 20 7b 0a 20 20 65  _fkey-24.1 {.  e
7bb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
7bc0: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
7bd0: 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c  (x, y, UNIQUE(y,
7be0: 20 78 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   x));.    CREATE
7bf0: 20 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20   TABLE c1(a, b, 
7c00: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
7c10: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
7c20: 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  ent(x, y));.    
7c30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
7c40: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7c50: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
7c60: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29  ES parent(x, y))
7c70: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7c80: 4c 45 20 63 33 28 61 2c 20 62 2c 20 46 4f 52 45  LE c3(a, b, FORE
7c90: 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45  IGN KEY(a, b) RE
7ca0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
7cb0: 78 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41  x, y));.    CREA
7cc0: 54 45 20 49 4e 44 45 58 20 63 32 69 20 4f 4e 20  TE INDEX c2i ON 
7cd0: 63 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  c2(a, b);.    CR
7ce0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
7cf0: 58 20 63 33 69 20 4f 4e 20 63 32 28 62 2c 20 61  X c3i ON c2(b, a
7d00: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63  );.  }.} {}.proc
7d10: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 7b   test_efkey_61 {
7d20: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
7d30: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
7d40: 65 79 2d 32 34 2e 24 74 6e 20 22 0a 20 20 20 20  ey-24.$tn ".    
7d50: 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a  catchsql {$sql}.
7d60: 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20    " [lindex {{0 
7d70: 7b 7d 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  {}} {1 {FOREIGN 
7d80: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
7d90: 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f  ailed}}} $isErro
7da0: 72 5d 0a 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  r].}.foreach {tn
7db0: 20 63 7d 20 5b 6c 69 73 74 20 32 20 63 31 20 33   c} [list 2 c1 3
7dc0: 20 63 32 20 34 20 63 33 5d 20 7b 0a 20 20 74 65   c2 4 c3] {.  te
7dd0: 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e  st_efkey_61 $tn.
7de0: 31 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  1 1 "INSERT INTO
7df0: 20 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29   $c VALUES(1, 2)
7e00: 22 0a 20 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  ".  test_efkey_6
7e10: 31 20 24 74 6e 2e 32 20 30 20 22 49 4e 53 45 52  1 $tn.2 0 "INSER
7e20: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
7e30: 4c 55 45 53 28 31 2c 20 32 29 22 0a 20 20 74 65  LUES(1, 2)".  te
7e40: 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e  st_efkey_61 $tn.
7e50: 33 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  3 0 "INSERT INTO
7e60: 20 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29   $c VALUES(1, 2)
7e70: 22 0a 0a 20 20 65 78 65 63 73 71 6c 20 22 44 45  "..  execsql "DE
7e80: 4c 45 54 45 20 46 52 4f 4d 20 24 63 20 3b 20 44  LETE FROM $c ; D
7e90: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
7ea0: 74 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  t".}..#---------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7f00: 52 2d 30 30 32 37 39 2d 35 32 32 38 33 0a 23 0a  R-00279-52283.#.
7f10: 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c  # Test an exampl
7f20: 65 20 73 68 6f 77 69 6e 67 20 74 68 61 74 20 77  e showing that w
7f30: 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c  hen a row is del
7f40: 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  eted from the pa
7f50: 72 65 6e 74 20 0a 23 20 74 61 62 6c 65 2c 20 74  rent .# table, t
7f60: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69  he child table i
7f70: 73 20 71 75 65 72 69 65 64 20 66 6f 72 20 6f 72  s queried for or
7f80: 70 68 61 6e 65 64 20 72 6f 77 73 20 61 73 20 66  phaned rows as f
7f90: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 53 45  ollows:.#.#   SE
7fa0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
7fb0: 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63  track WHERE trac
7fc0: 6b 61 72 74 69 73 74 20 3d 20 3f 0a 23 0a 23 20  kartist = ?.#.# 
7fd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
7fe0: 33 33 30 32 2d 33 30 39 35 36 20 49 66 20 74 68  3302-30956 If th
7ff0: 69 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  is SELECT return
8000: 73 20 61 6e 79 20 72 6f 77 73 20 61 74 20 61 6c  s any rows at al
8010: 6c 2c 0a 23 20 74 68 65 6e 20 53 51 4c 69 74 65  l,.# then SQLite
8020: 20 63 6f 6e 63 6c 75 64 65 73 20 74 68 61 74 20   concludes that 
8030: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 72 6f 77  deleting the row
8040: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
8050: 20 74 61 62 6c 65 0a 23 20 77 6f 75 6c 64 20 76   table.# would v
8060: 69 6f 6c 61 74 65 20 74 68 65 20 66 6f 72 65 69  iolate the forei
8070: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
8080: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e  t and returns an
8090: 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73   error..#.do_tes
80a0: 74 20 65 5f 66 6b 65 79 2d 32 35 2e 31 20 7b 0a  t e_fkey-25.1 {.
80b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
80c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
80d0: 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
80e0: 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
80f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
8100: 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
8110: 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
8120: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
8130: 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
8140: 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 0a 20       INTEGER, . 
8150: 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
8160: 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
8170: 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
8180: 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  R,.      FOREIGN
8190: 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74   KEY(trackartist
81a0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  ) REFERENCES art
81b0: 69 73 74 28 61 72 74 69 73 74 69 64 29 0a 20 20  ist(artistid).  
81c0: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
81d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
81e0: 66 6b 65 79 2d 32 35 2e 32 20 7b 0a 20 20 50 52  fkey-25.2 {.  PR
81f0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
8200: 73 20 3d 20 4f 46 46 3b 0a 20 20 45 58 50 4c 41  s = OFF;.  EXPLA
8210: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45  IN QUERY PLAN DE
8220: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
8230: 20 57 48 45 52 45 20 31 3b 0a 20 20 45 58 50 4c   WHERE 1;.  EXPL
8240: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
8250: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8260: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
8270: 63 6b 61 72 74 69 73 74 20 3d 20 3f 3b 0a 7d 20  ckartist = ?;.} 
8280: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
8290: 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20  TABLE artist} . 
82a0: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
82b0: 4c 45 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f 65  LE track}.}.do_e
82c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b  xecsql_test e_fk
82d0: 65 79 2d 32 35 2e 33 20 7b 0a 20 20 50 52 41 47  ey-25.3 {.  PRAG
82e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
82f0: 3d 20 4f 4e 3b 0a 20 20 45 58 50 4c 41 49 4e 20  = ON;.  EXPLAIN 
8300: 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54  QUERY PLAN DELET
8310: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
8320: 45 52 45 20 31 3b 0a 7d 20 7b 0a 20 20 30 20 30  ERE 1;.} {.  0 0
8330: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61   0 {SCAN TABLE a
8340: 72 74 69 73 74 7d 20 0a 20 20 30 20 30 20 30 20  rtist} .  0 0 0 
8350: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 72 61 63  {SCAN TABLE trac
8360: 6b 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  k}.}.do_test e_f
8370: 6b 65 79 2d 32 35 2e 34 20 7b 0a 20 20 65 78 65  key-25.4 {.  exe
8380: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
8390: 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
83a0: 4c 55 45 53 28 35 2c 20 27 61 72 74 69 73 74 20  LUES(5, 'artist 
83b0: 35 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  5');.    INSERT 
83c0: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
83d0: 45 53 28 36 2c 20 27 61 72 74 69 73 74 20 36 27  ES(6, 'artist 6'
83e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
83f0: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
8400: 28 37 2c 20 27 61 72 74 69 73 74 20 37 27 29 3b  (7, 'artist 7');
8410: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8420: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c   track VALUES(1,
8430: 20 27 74 72 61 63 6b 20 31 27 2c 20 35 29 3b 0a   'track 1', 5);.
8440: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8450: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 32 2c 20  track VALUES(2, 
8460: 27 74 72 61 63 6b 20 32 27 2c 20 36 29 3b 0a 20  'track 2', 6);. 
8470: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
8480: 20 65 5f 66 6b 65 79 2d 32 35 2e 35 20 7b 0a 20   e_fkey-25.5 {. 
8490: 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65   concat \.    [e
84a0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
84b0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b  rowid FROM track
84c0: 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69   WHERE trackarti
84d0: 73 74 20 3d 20 35 20 7d 5d 20 20 20 5c 0a 20 20  st = 5 }]   \.  
84e0: 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45    [catchsql { DE
84f0: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
8500: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
8510: 3d 20 35 20 7d 5d 0a 7d 20 7b 31 20 31 20 7b 46  = 5 }].} {1 1 {F
8520: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
8530: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
8540: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8550: 35 2e 36 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c  5.6 {.  concat \
8560: 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 20  .    [execsql { 
8570: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
8580: 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72  M track WHERE tr
8590: 61 63 6b 61 72 74 69 73 74 20 3d 20 37 20 7d 5d  ackartist = 7 }]
85a0: 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68 73     \.    [catchs
85b0: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
85c0: 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72   artist WHERE ar
85d0: 74 69 73 74 69 64 20 3d 20 37 20 7d 5d 0a 7d 20  tistid = 7 }].} 
85e0: 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  {0 {}}..do_test 
85f0: 65 5f 66 6b 65 79 2d 32 35 2e 37 20 7b 0a 20 20  e_fkey-25.7 {.  
8600: 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78  concat \.    [ex
8610: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72  ecsql { SELECT r
8620: 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20  owid FROM track 
8630: 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73  WHERE trackartis
8640: 74 20 3d 20 36 20 7d 5d 20 20 20 5c 0a 20 20 20  t = 6 }]   \.   
8650: 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c   [catchsql { DEL
8660: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
8670: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
8680: 20 36 20 7d 5d 0a 7d 20 7b 32 20 31 20 7b 46 4f   6 }].} {2 1 {FO
8690: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
86a0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23  aint failed}}..#
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
8700: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39 33 36  ENCE-OF: R-47936
8710: 2d 31 30 30 34 34 20 4f 72 2c 20 6d 6f 72 65 20  -10044 Or, more 
8720: 67 65 6e 65 72 61 6c 6c 79 3a 0a 23 20 53 45 4c  generally:.# SEL
8730: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c  ECT rowid FROM <
8740: 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45  child-table> WHE
8750: 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d  RE <child-key> =
8760: 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c   :parent_key_val
8770: 75 65 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74  ue.#.# Test that
8780: 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64   when a row is d
8790: 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
87a0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20  parent table of 
87b0: 61 6e 20 46 4b 20 0a 23 20 63 6f 6e 73 74 72 61  an FK .# constra
87c0: 69 6e 74 2c 20 74 68 65 20 63 68 69 6c 64 20 74  int, the child t
87d0: 61 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20  able is queried 
87e0: 66 6f 72 20 6f 72 70 68 61 6e 65 64 20 72 6f 77  for orphaned row
87f0: 73 2e 20 54 68 65 0a 23 20 71 75 65 72 79 20 69  s. The.# query i
8800: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
8810: 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f  .#.#   SELECT ro
8820: 77 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d  wid FROM <child-
8830: 74 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68  table> WHERE <ch
8840: 69 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65  ild-key> = :pare
8850: 6e 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23  nt_key_value.#.#
8860: 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20   Also test that 
8870: 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 69 6e  when a row is in
8880: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
8890: 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 6f 72  parent table, or
88a0: 20 77 68 65 6e 20 74 68 65 20 0a 23 20 70 61 72   when the .# par
88b0: 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f  ent key values o
88c0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72 6f  f an existing ro
88d0: 77 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2c 20  w are modified, 
88e0: 61 20 71 75 65 72 79 20 65 71 75 69 76 61 6c 65  a query equivale
88f0: 6e 74 0a 23 20 74 6f 20 74 68 65 20 66 6f 6c 6c  nt.# to the foll
8900: 6f 77 69 6e 67 20 69 73 20 70 6c 61 6e 6e 65 64  owing is planned
8910: 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  . In some cases 
8920: 69 74 20 69 73 20 6e 6f 74 20 65 78 65 63 75 74  it is not execut
8930: 65 64 2c 20 62 75 74 20 69 74 0a 23 20 69 73 20  ed, but it.# is 
8940: 61 6c 77 61 79 73 20 70 6c 61 6e 6e 65 64 2e 0a  always planned..
8950: 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77  #.#   SELECT row
8960: 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74  id FROM <child-t
8970: 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69  able> WHERE <chi
8980: 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e  ld-key> = :paren
8990: 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20  t_key_value.#.# 
89a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
89b0: 31 36 31 36 2d 34 36 37 30 30 20 53 69 6d 69 6c  1616-46700 Simil
89c0: 61 72 20 71 75 65 72 69 65 73 20 6d 61 79 20 62  ar queries may b
89d0: 65 20 72 75 6e 20 69 66 20 74 68 65 20 63 6f 6e  e run if the con
89e0: 74 65 6e 74 0a 23 20 6f 66 20 74 68 65 20 70 61  tent.# of the pa
89f0: 72 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f 64 69  rent key is modi
8a00: 66 69 65 64 20 6f 72 20 61 20 6e 65 77 20 72 6f  fied or a new ro
8a10: 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e  w is inserted in
8a20: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 23 20  to the parent.# 
8a30: 74 61 62 6c 65 2e 0a 23 0a 23 0a 64 72 6f 70 5f  table..#.#.drop_
8a40: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
8a50: 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 31 20 7b  st e_fkey-26.1 {
8a60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
8a70: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
8a80: 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c  (x, y, UNIQUE(y,
8a90: 20 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65   x)) }.} {}.fore
8aa0: 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20  ach {tn sql} {. 
8ab0: 20 32 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45   2 { .    CREATE
8ac0: 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20   TABLE child(a, 
8ad0: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
8ae0: 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  , b) REFERENCES 
8af0: 70 61 72 65 6e 74 28 78 2c 20 79 29 29 0a 20 20  parent(x, y)).  
8b00: 7d 0a 20 20 33 20 7b 20 0a 20 20 20 20 43 52 45  }.  3 { .    CRE
8b10: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
8b20: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
8b30: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
8b40: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29  ES parent(x, y))
8b50: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
8b60: 45 58 20 63 68 69 6c 64 69 20 4f 4e 20 63 68 69  EX childi ON chi
8b70: 6c 64 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20  ld(a, b);.  }.  
8b80: 34 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  4 { .    CREATE 
8b90: 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62  TABLE child(a, b
8ba0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
8bb0: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
8bc0: 61 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20  arent(x, y));.  
8bd0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
8be0: 49 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20  INDEX childi ON 
8bf0: 63 68 69 6c 64 28 62 2c 20 61 29 3b 0a 20 20 7d  child(b, a);.  }
8c00: 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24  .} {.  execsql $
8c10: 73 71 6c 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  sql..  execsql {
8c20: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
8c30: 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 73 65 74  eys = OFF}.  set
8c40: 20 64 65 6c 65 74 65 20 5b 63 6f 6e 63 61 74 20   delete [concat 
8c50: 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 44 45  \.      [eqp "DE
8c60: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
8c70: 20 57 48 45 52 45 20 31 22 5d 20 5c 0a 20 20 20   WHERE 1"] \.   
8c80: 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20     [eqp "SELECT 
8c90: 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64  rowid FROM child
8ca0: 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
8cb0: 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 73   b = ?"].  ].  s
8cc0: 65 74 20 75 70 64 61 74 65 20 5b 63 6f 6e 63 61  et update [conca
8cd0: 74 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22  t \.      [eqp "
8ce0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
8cf0: 54 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20 5c 0a 20  T x=?, y=?"] \. 
8d00: 20 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43       [eqp "SELEC
8d10: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69  T rowid FROM chi
8d20: 6c 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  ld WHERE a = ? A
8d30: 4e 44 20 62 20 3d 20 3f 22 5d 20 5c 0a 20 20 20  ND b = ?"] \.   
8d40: 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20     [eqp "SELECT 
8d50: 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64  rowid FROM child
8d60: 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
8d70: 20 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 65   b = ?"].  ].  e
8d80: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
8d90: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
8da0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  }..  do_test e_f
8db0: 6b 65 79 2d 32 36 2e 24 74 6e 2e 31 20 7b 20 65  key-26.$tn.1 { e
8dc0: 71 70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  qp "DELETE FROM 
8dd0: 70 61 72 65 6e 74 20 57 48 45 52 45 20 31 22 20  parent WHERE 1" 
8de0: 7d 20 24 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74  } $delete.  do_t
8df0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24 74  est e_fkey-26.$t
8e00: 6e 2e 32 20 7b 20 65 71 70 20 22 55 50 44 41 54  n.2 { eqp "UPDAT
8e10: 45 20 70 61 72 65 6e 74 20 73 65 74 20 78 3d 3f  E parent set x=?
8e20: 2c 20 79 3d 3f 22 20 7d 20 24 75 70 64 61 74 65  , y=?" } $update
8e30: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52 4f  ..  execsql {DRO
8e40: 50 20 54 41 42 4c 45 20 63 68 69 6c 64 7d 0a 7d  P TABLE child}.}
8e50: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
8ea0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
8eb0: 35 35 33 2d 33 34 30 31 33 0a 23 0a 23 20 54 65  553-34013.#.# Te
8ec0: 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73  st the example s
8ed0: 63 68 65 6d 61 20 61 74 20 74 68 65 20 65 6e 64  chema at the end
8ee0: 20 6f 66 20 73 65 63 74 69 6f 6e 20 33 2e 20 41   of section 3. A
8ef0: 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69 73  lso test that is
8f00: 0a 23 20 69 73 20 22 65 66 66 69 63 69 65 6e 74  .# is "efficient
8f10: 22 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ". In this case 
8f20: 22 65 66 66 69 63 69 65 6e 74 22 20 6d 65 61 6e  "efficient" mean
8f30: 73 20 74 68 61 74 20 66 6f 72 65 69 67 6e 20 6b  s that foreign k
8f40: 65 79 0a 23 20 72 65 6c 61 74 65 64 20 6f 70 65  ey.# related ope
8f50: 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  rations on the p
8f60: 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 20 6e  arent table do n
8f70: 6f 74 20 70 72 6f 76 6f 6b 65 20 6c 69 6e 65 61  ot provoke linea
8f80: 72 20 73 63 61 6e 73 2e 0a 23 0a 64 72 6f 70 5f  r scans..#.drop_
8f90: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
8fa0: 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 31 20 7b  st e_fkey-27.1 {
8fb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8fc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72   CREATE TABLE ar
8fd0: 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69  tist(.      arti
8fe0: 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20  stid    INTEGER 
8ff0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20  PRIMARY KEY, .  
9000: 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20      artistname  
9010: 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  TEXT.    );.    
9020: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61  CREATE TABLE tra
9030: 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69  ck(.      tracki
9040: 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20  d     INTEGER,. 
9050: 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
9060: 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
9070: 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
9080: 52 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  R REFERENCES art
9090: 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  ist.    );.    C
90a0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63  REATE INDEX trac
90b0: 6b 69 6e 64 65 78 20 4f 4e 20 74 72 61 63 6b 28  kindex ON track(
90c0: 74 72 61 63 6b 61 72 74 69 73 74 29 3b 0a 20 20  trackartist);.  
90d0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
90e0: 5f 66 6b 65 79 2d 32 37 2e 32 20 7b 0a 20 20 65  _fkey-27.2 {.  e
90f0: 71 70 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  qp { INSERT INTO
9100: 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 3f   artist VALUES(?
9110: 2c 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65  , ?) }.} {}.do_e
9120: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b  xecsql_test e_fk
9130: 65 79 2d 32 37 2e 33 20 7b 0a 20 20 45 58 50 4c  ey-27.3 {.  EXPL
9140: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 55  AIN QUERY PLAN U
9150: 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45 54  PDATE artist SET
9160: 20 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20 61   artistid = ?, a
9170: 72 74 69 73 74 6e 61 6d 65 20 3d 20 3f 0a 7d 20  rtistname = ?.} 
9180: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
9190: 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20  TABLE artist} . 
91a0: 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   0 0 0 {SEARCH T
91b0: 41 42 4c 45 20 74 72 61 63 6b 20 55 53 49 4e 47  ABLE track USING
91c0: 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
91d0: 74 72 61 63 6b 69 6e 64 65 78 20 28 74 72 61 63  trackindex (trac
91e0: 6b 61 72 74 69 73 74 3d 3f 29 7d 20 0a 20 20 30  kartist=?)} .  0
91f0: 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   0 0 {SEARCH TAB
9200: 4c 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20 43  LE track USING C
9210: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 74 72  OVERING INDEX tr
9220: 61 63 6b 69 6e 64 65 78 20 28 74 72 61 63 6b 61  ackindex (tracka
9230: 72 74 69 73 74 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65  rtist=?)}.}.do_e
9240: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b  xecsql_test e_fk
9250: 65 79 2d 32 37 2e 34 20 7b 0a 20 20 45 58 50 4c  ey-27.4 {.  EXPL
9260: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44  AIN QUERY PLAN D
9270: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
9280: 74 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  t.} {.  0 0 0 {S
9290: 43 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74  CAN TABLE artist
92a0: 7d 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52  } .  0 0 0 {SEAR
92b0: 43 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55  CH TABLE track U
92c0: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
92d0: 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20 28  DEX trackindex (
92e0: 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d 0a  trackartist=?)}.
92f0: 7d 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  }...############
9300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
9340: 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 31 3a  ### SECTION 4.1:
9350: 20 43 6f 6d 70 6f 73 69 74 65 20 46 6f 72 65 69   Composite Forei
9360: 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e  gn Key Constrain
9370: 74 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  ts.#############
9380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
93b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
93c0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65  ----------.# Che
9410: 63 6b 20 74 68 61 74 20 70 61 72 65 6e 74 20 61  ck that parent a
9420: 6e 64 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 75  nd child keys mu
9430: 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
9440: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9450: 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ns..#.# EVIDENCE
9460: 2d 4f 46 3a 20 52 2d 34 31 30 36 32 2d 33 34 34  -OF: R-41062-344
9470: 33 31 20 50 61 72 65 6e 74 20 61 6e 64 20 63 68  31 Parent and ch
9480: 69 6c 64 20 6b 65 79 73 20 6d 75 73 74 20 68 61  ild keys must ha
9490: 76 65 20 74 68 65 20 73 61 6d 65 0a 23 20 63 61  ve the same.# ca
94a0: 72 64 69 6e 61 6c 69 74 79 2e 0a 23 0a 66 6f 72  rdinality..#.for
94b0: 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 65 72 72  each {tn sql err
94c0: 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45 20  } {.  1 "CREATE 
94d0: 54 41 42 4c 45 20 63 28 6a 6a 20 52 45 46 45 52  TABLE c(jj REFER
94e0: 45 4e 43 45 53 20 70 28 78 2c 20 79 29 29 22 20  ENCES p(x, y))" 
94f0: 0a 20 20 20 20 7b 66 6f 72 65 69 67 6e 20 6b 65  .    {foreign ke
9500: 79 20 6f 6e 20 6a 6a 20 73 68 6f 75 6c 64 20 72  y on jj should r
9510: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
9520: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
9530: 65 20 70 7d 0a 0a 20 20 32 20 22 43 52 45 41 54  e p}..  2 "CREAT
9540: 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45 46  E TABLE c(jj REF
9550: 45 52 45 4e 43 45 53 20 70 28 29 29 22 20 7b 6e  ERENCES p())" {n
9560: 65 61 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20  ear ")": syntax 
9570: 65 72 72 6f 72 7d 0a 0a 20 20 33 20 22 43 52 45  error}..  3 "CRE
9580: 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 2c 20  ATE TABLE c(jj, 
9590: 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 29 20  FOREIGN KEY(jj) 
95a0: 52 45 46 45 52 45 4e 43 45 53 20 70 28 78 2c 20  REFERENCES p(x, 
95b0: 79 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65  y))" .    {numbe
95c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
95d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
95e0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
95f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9600: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
9610: 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 34 20 22  ed table}..  4 "
9620: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a  CREATE TABLE c(j
9630: 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  j, FOREIGN KEY(j
9640: 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  j) REFERENCES p(
9650: 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20 22  ))" .    {near "
9660: 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  )": syntax error
9670: 7d 0a 0a 20 20 35 20 22 43 52 45 41 54 45 20 54  }..  5 "CREATE T
9680: 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46  ABLE c(ii, jj, F
9690: 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69  OREIGN KEY(jj, i
96a0: 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  i) REFERENCES p(
96b0: 29 29 22 20 0a 20 20 20 20 7b 6e 65 61 72 20 22  ))" .    {near "
96c0: 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  )": syntax error
96d0: 7d 0a 0a 20 20 36 20 22 43 52 45 41 54 45 20 54  }..  6 "CREATE T
96e0: 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c 20 46  ABLE c(ii, jj, F
96f0: 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c 20 69  OREIGN KEY(jj, i
9700: 69 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  i) REFERENCES p(
9710: 78 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65  x))" .    {numbe
9720: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9730: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
9740: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
9750: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9760: 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
9770: 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20 37 20 22  ed table}..  7 "
9780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 69  CREATE TABLE c(i
9790: 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b  i, jj, FOREIGN K
97a0: 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46 45 52  EY(jj, ii) REFER
97b0: 45 4e 43 45 53 20 70 28 78 2c 79 2c 7a 29 29 22  ENCES p(x,y,z))"
97c0: 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66   .    {number of
97d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
97e0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
97f0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
9800: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9810: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
9820: 61 62 6c 65 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70  able}.} {.  drop
9830: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f  _all_tables.  do
9840: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e  _test e_fkey-28.
9850: 24 74 6e 20 5b 6c 69 73 74 20 63 61 74 63 68 73  $tn [list catchs
9860: 71 6c 20 24 73 71 6c 5d 20 5b 6c 69 73 74 20 31  ql $sql] [list 1
9870: 20 24 65 72 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74   $err].}.do_test
9880: 20 65 5f 66 6b 65 79 2d 32 38 2e 38 20 7b 0a 20   e_fkey-28.8 {. 
9890: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
98a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
98b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
98c0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
98d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
98e0: 20 63 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e   c(a, b, FOREIGN
98f0: 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45 52 45   KEY(a,b) REFERE
9900: 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a 20 20 63  NCES p);.  }.  c
9910: 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45 20  atchsql {DELETE 
9920: 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20 7b 66 6f  FROM p}.} {1 {fo
9930: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
9940: 63 68 20 2d 20 22 63 22 20 72 65 66 65 72 65 6e  ch - "c" referen
9950: 63 69 6e 67 20 22 70 22 7d 7d 0a 64 6f 5f 74 65  cing "p"}}.do_te
9960: 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 39 20 7b  st e_fkey-28.9 {
9970: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
9980: 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
9990: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
99a0: 70 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20  p(x, y, PRIMARY 
99b0: 4b 45 59 28 78 2c 79 29 29 3b 0a 20 20 20 20 43  KEY(x,y));.    C
99c0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 61 20  REATE TABLE c(a 
99d0: 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 20  REFERENCES p);. 
99e0: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44   }.  catchsql {D
99f0: 45 4c 45 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20  ELETE FROM p}.} 
9a00: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
9a10: 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 22 20 72  mismatch - "c" r
9a20: 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d 7d  eferencing "p"}}
9a30: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
9a80: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
9a90: 34 36 37 36 2d 30 39 38 35 39 0a 23 0a 23 20 54  4676-09859.#.# T
9aa0: 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20  est the example 
9ab0: 73 63 68 65 6d 61 20 69 6e 20 74 68 65 20 22 43  schema in the "C
9ac0: 6f 6d 70 6f 73 69 74 65 20 46 6f 72 65 69 67 6e  omposite Foreign
9ad0: 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73   Key Constraints
9ae0: 22 20 0a 23 20 73 65 63 74 69 6f 6e 2e 0a 23 0a  " .# section..#.
9af0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
9b00: 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.1 {.  execsql 
9b10: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
9b20: 4c 45 20 61 6c 62 75 6d 28 0a 20 20 20 20 20 20  LE album(.      
9b30: 61 6c 62 75 6d 61 72 74 69 73 74 20 54 45 58 54  albumartist TEXT
9b40: 2c 0a 20 20 20 20 20 20 61 6c 62 75 6d 6e 61 6d  ,.      albumnam
9b50: 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c  e TEXT,.      al
9b60: 62 75 6d 63 6f 76 65 72 20 42 49 4e 41 52 59 2c  bumcover BINARY,
9b70: 0a 20 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b  .      PRIMARY K
9b80: 45 59 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 20  EY(albumartist, 
9b90: 61 6c 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29  albumname).    )
9ba0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9bb0: 4c 45 20 73 6f 6e 67 28 0a 20 20 20 20 20 20 73  LE song(.      s
9bc0: 6f 6e 67 69 64 20 49 4e 54 45 47 45 52 2c 0a 20  ongid INTEGER,. 
9bd0: 20 20 20 20 20 73 6f 6e 67 61 72 74 69 73 74 20       songartist 
9be0: 54 45 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67  TEXT,.      song
9bf0: 61 6c 62 75 6d 20 54 45 58 54 2c 0a 20 20 20 20  album TEXT,.    
9c00: 20 20 73 6f 6e 67 6e 61 6d 65 20 54 45 58 54 2c    songname TEXT,
9c10: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
9c20: 45 59 28 73 6f 6e 67 61 72 74 69 73 74 2c 20 73  EY(songartist, s
9c30: 6f 6e 67 61 6c 62 75 6d 29 20 52 45 46 45 52 45  ongalbum) REFERE
9c40: 4e 43 45 53 20 61 6c 62 75 6d 28 61 6c 62 75 6d  NCES album(album
9c50: 61 72 74 69 73 74 2c 61 6c 62 75 6d 6e 61 6d 65  artist,albumname
9c60: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  ).    );.  }.} {
9c70: 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }..do_test e_fke
9c80: 79 2d 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-29.2 {.  execs
9c90: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
9ca0: 49 4e 54 4f 20 61 6c 62 75 6d 20 56 41 4c 55 45  INTO album VALUE
9cb0: 53 28 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79  S('Elvis Presley
9cc0: 27 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72 69  ', 'Elvis'' Chri
9cd0: 73 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 4e 55  stmas Album', NU
9ce0: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
9cf0: 49 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53  INTO song VALUES
9d00: 28 0a 20 20 20 20 20 20 31 2c 20 27 45 6c 76 69  (.      1, 'Elvi
9d10: 73 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76  s Presley', 'Elv
9d20: 69 73 27 27 20 43 68 72 69 73 74 6d 61 73 20 41  is'' Christmas A
9d30: 6c 62 75 6d 27 2c 20 27 48 65 72 65 20 43 6f 6d  lbum', 'Here Com
9d40: 65 73 20 53 61 6e 74 61 20 43 6c 61 75 73 65 27  es Santa Clause'
9d50: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
9d60: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9d70: 32 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  29.3 {.  catchsq
9d80: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
9d90: 4e 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28  NTO song VALUES(
9da0: 32 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65  2, 'Elvis Presle
9db0: 79 27 2c 20 27 45 6c 76 69 73 20 49 73 20 42 61  y', 'Elvis Is Ba
9dc0: 63 6b 21 27 2c 20 27 46 65 76 65 72 27 29 3b 0a  ck!', 'Fever');.
9dd0: 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47    }.} {1 {FOREIG
9de0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
9df0: 20 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d   failed}}...#---
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e40: 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
9e50: 45 2d 4f 46 3a 20 52 2d 33 33 36 32 36 2d 34 38  E-OF: R-33626-48
9e60: 34 31 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 69  418 In SQLite, i
9e70: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69  f any of the chi
9e80: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23  ld key columns.#
9e90: 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 73   (in this case s
9ea0: 6f 6e 67 61 72 74 69 73 74 20 61 6e 64 20 73 6f  ongartist and so
9eb0: 6e 67 61 6c 62 75 6d 29 20 61 72 65 20 4e 55 4c  ngalbum) are NUL
9ec0: 4c 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  L, then there is
9ed0: 20 6e 6f 0a 23 20 72 65 71 75 69 72 65 6d 65 6e   no.# requiremen
9ee0: 74 20 66 6f 72 20 61 20 63 6f 72 72 65 73 70 6f  t for a correspo
9ef0: 6e 64 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65  nding row in the
9f00: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 23   parent table..#
9f10: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9f20: 33 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  30.1 {.  execsql
9f30: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
9f40: 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 32  TO song VALUES(2
9f50: 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79  , 'Elvis Presley
9f60: 27 2c 20 4e 55 4c 4c 2c 20 27 46 65 76 65 72 27  ', NULL, 'Fever'
9f70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9f80: 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 33  TO song VALUES(3
9f90: 2c 20 4e 55 4c 4c 2c 20 27 45 6c 76 69 73 20 49  , NULL, 'Elvis I
9fa0: 73 20 42 61 63 6b 27 2c 20 27 53 6f 6c 64 69 65  s Back', 'Soldie
9fb0: 72 20 42 6f 79 27 29 3b 0a 20 20 7d 0a 7d 20 7b  r Boy');.  }.} {
9fc0: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
9fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
a010: 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 32 3a 20  ## SECTION 4.2: 
a020: 44 65 66 65 72 72 65 64 20 46 6f 72 65 69 67 6e  Deferred Foreign
a030: 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73   Key Constraints
a040: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
a050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a070: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
a080: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
a0e0: 74 68 61 74 20 69 66 20 61 20 73 74 61 74 65 6d  that if a statem
a0f0: 65 6e 74 20 76 69 6f 6c 61 74 65 73 20 61 6e 20  ent violates an 
a100: 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63 6f 6e  immediate FK con
a110: 73 74 72 61 69 6e 74 2c 20 61 6e 64 20 74 68 65  straint, and the
a120: 0a 23 20 64 61 74 61 62 61 73 65 20 64 6f 65 73  .# database does
a130: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65   not satisfy the
a140: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f   FK constraint o
a150: 6e 63 65 20 61 6c 6c 20 65 66 66 65 63 74 73 20  nce all effects 
a160: 6f 66 20 74 68 65 0a 23 20 73 74 61 74 65 6d 65  of the.# stateme
a170: 6e 74 20 68 61 76 65 20 62 65 65 6e 20 61 70 70  nt have been app
a180: 6c 69 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 69  lied, an error i
a190: 73 20 72 65 70 6f 72 74 65 64 20 61 6e 64 20 74  s reported and t
a1a0: 68 65 20 65 66 66 65 63 74 73 20 6f 66 0a 23 20  he effects of.# 
a1b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
a1c0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45  lled back..#.# E
a1d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
a1e0: 33 32 33 2d 33 30 34 37 30 20 49 66 20 61 20 73  323-30470 If a s
a1f0: 74 61 74 65 6d 65 6e 74 20 6d 6f 64 69 66 69 65  tatement modifie
a200: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
a210: 66 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65  f the.# database
a220: 20 73 6f 20 74 68 61 74 20 61 6e 20 69 6d 6d 65   so that an imme
a230: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
a240: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  y constraint is 
a250: 69 6e 20 76 69 6f 6c 61 74 69 6f 6e 0a 23 20 61  in violation.# a
a260: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
a270: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
a280: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  an exception is 
a290: 74 68 72 6f 77 6e 20 61 6e 64 20 74 68 65 0a 23  thrown and the.#
a2a0: 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65 20   effects of the 
a2b0: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 72 65  statement are re
a2c0: 76 65 72 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61  verted..#.drop_a
a2d0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
a2e0: 74 20 65 5f 66 6b 65 79 2d 33 31 2e 31 20 7b 0a  t e_fkey-31.1 {.
a2f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 69 6e  CREATE TABLE kin
a310: 67 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  g(a, b, PRIMARY 
a320: 4b 45 59 28 61 29 29 3b 0a 20 20 20 20 43 52 45  KEY(a));.    CRE
a330: 41 54 45 20 54 41 42 4c 45 20 70 72 69 6e 63 65  ATE TABLE prince
a340: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 6b 69  (c REFERENCES ki
a350: 6e 67 2c 20 64 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  ng, d);.  }.} {}
a360: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
a370: 2d 33 31 2e 32 20 7b 0a 20 20 23 20 45 78 65 63  -31.2 {.  # Exec
a380: 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ute a statement 
a390: 74 68 61 74 20 76 69 6f 6c 61 74 65 73 20 74 68  that violates th
a3a0: 65 20 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63  e immediate FK c
a3b0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 63 61 74  onstraint..  cat
a3c0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
a3d0: 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45  NTO prince VALUE
a3e0: 53 28 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b  S(1, 2) }.} {1 {
a3f0: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
a400: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
a410: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
a420: 33 31 2e 33 20 7b 0a 20 20 23 20 54 68 69 73 20  31.3 {.  # This 
a430: 74 69 6d 65 2c 20 75 73 65 20 61 20 74 72 69 67  time, use a trig
a440: 67 65 72 20 74 6f 20 66 69 78 20 74 68 65 20 63  ger to fix the c
a450: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
a460: 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ion before the. 
a470: 20 23 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73   # statement has
a480: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
a490: 69 6e 67 2e 20 54 68 65 6e 20 65 78 65 63 75 74  ing. Then execut
a4a0: 65 20 74 68 65 20 73 61 6d 65 20 73 74 61 74 65  e the same state
a4b0: 6d 65 6e 74 20 61 73 0a 20 20 23 20 69 6e 20 74  ment as.  # in t
a4c0: 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74  he previous test
a4d0: 20 63 61 73 65 2e 20 54 68 69 73 20 74 69 6d 65   case. This time
a4e0: 2c 20 6e 6f 20 65 72 72 6f 72 2e 0a 20 20 65 78  , no error..  ex
a4f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
a500: 54 45 20 54 52 49 47 47 45 52 20 6b 74 20 41 46  TE TRIGGER kt AF
a510: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 70 72  TER INSERT ON pr
a520: 69 6e 63 65 20 57 48 45 4e 0a 20 20 20 20 20 20  ince WHEN.      
a530: 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45  NOT EXISTS (SELE
a540: 43 54 20 61 20 46 52 4f 4d 20 6b 69 6e 67 20 57  CT a FROM king W
a550: 48 45 52 45 20 61 20 3d 20 6e 65 77 2e 63 29 0a  HERE a = new.c).
a560: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
a570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 69 6e 67  INSERT INTO king
a580: 20 56 41 4c 55 45 53 28 6e 65 77 2e 63 2c 20 4e   VALUES(new.c, N
a590: 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 0a 20 20  ULL);.    END.  
a5a0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
a5b0: 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65  SERT INTO prince
a5c0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
a5d0: 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61  } {}..# Test tha
a5e0: 74 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 73 69  t operating insi
a5f0: 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  de a transaction
a600: 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
a610: 65 6e 63 65 20 74 6f 20 0a 23 20 69 6d 6d 65 64  ence to .# immed
a620: 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  iate constraint 
a630: 76 69 6f 6c 61 74 69 6f 6e 20 68 61 6e 64 6c 69  violation handli
a640: 6e 67 2e 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ng..do_test e_fk
a650: 65 79 2d 33 31 2e 34 20 7b 0a 20 20 65 78 65 63  ey-31.4 {.  exec
a660: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
a670: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a680: 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28 32   prince VALUES(2
a690: 2c 20 33 29 3b 0a 20 20 20 20 44 52 4f 50 20 54  , 3);.    DROP T
a6a0: 52 49 47 47 45 52 20 6b 74 3b 0a 20 20 7d 0a 20  RIGGER kt;.  }. 
a6b0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
a6c0: 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56  RT INTO prince V
a6d0: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 7d 20  ALUES(3, 4) }.} 
a6e0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
a6f0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a700: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
a710: 65 79 2d 33 31 2e 35 20 7b 0a 20 20 65 78 65 63  ey-31.5 {.  exec
a720: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
a730: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
a740: 52 4f 4d 20 6b 69 6e 67 3b 0a 20 20 7d 0a 7d 20  ROM king;.  }.} 
a750: 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 0a 23 2d 2d  {1 {} 2 {}}..#--
a760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
a7b0: 68 61 74 20 69 66 20 61 20 64 65 66 65 72 72 65  hat if a deferre
a7c0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  d constraint is 
a7d0: 76 69 6f 6c 61 74 65 64 20 77 69 74 68 69 6e 20  violated within 
a7e0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 23  a transaction,.#
a7f0: 20 6e 6f 74 68 69 6e 67 20 68 61 70 70 65 6e 73   nothing happens
a800: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64   immediately and
a810: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
a820: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
a830: 69 73 74 0a 23 20 69 6e 20 61 20 73 74 61 74 65  ist.# in a state
a840: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73   that does not s
a850: 61 74 69 73 66 79 20 74 68 65 20 46 4b 20 63 6f  atisfy the FK co
a860: 6e 73 74 72 61 69 6e 74 2e 20 48 6f 77 65 76 65  nstraint. Howeve
a870: 72 20 61 74 74 65 6d 70 74 73 0a 23 20 74 6f 20  r attempts.# to 
a880: 43 4f 4d 4d 49 54 20 74 68 65 20 74 72 61 6e 73  COMMIT the trans
a890: 61 63 74 69 6f 6e 20 66 61 69 6c 20 75 6e 74 69  action fail unti
a8a0: 6c 20 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61  l the FK constra
a8b0: 69 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64  int is satisfied
a8c0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
a8d0: 46 3a 20 52 2d 34 39 31 37 38 2d 32 31 33 35 38  F: R-49178-21358
a8e0: 20 42 79 20 63 6f 6e 74 72 61 73 74 2c 20 69 66   By contrast, if
a8f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64   a statement mod
a900: 69 66 69 65 73 20 74 68 65 0a 23 20 63 6f 6e 74  ifies the.# cont
a910: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
a920: 62 61 73 65 20 73 75 63 68 20 74 68 61 74 20 61  base such that a
a930: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
a940: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a950: 0a 23 20 69 73 20 76 69 6f 6c 61 74 65 64 2c 20  .# is violated, 
a960: 74 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73  the violation is
a970: 20 6e 6f 74 20 72 65 70 6f 72 74 65 64 20 69 6d   not reported im
a980: 6d 65 64 69 61 74 65 6c 79 2e 0a 23 0a 23 20 45  mediately..#.# E
a990: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
a9a0: 36 39 32 2d 31 32 34 38 38 20 44 65 66 65 72 72  692-12488 Deferr
a9b0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
a9c0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e  onstraints are n
a9d0: 6f 74 0a 23 20 63 68 65 63 6b 65 64 20 75 6e 74  ot.# checked unt
a9e0: 69 6c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  il the transacti
a9f0: 6f 6e 20 74 72 69 65 73 20 74 6f 20 43 4f 4d 4d  on tries to COMM
aa00: 49 54 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  IT..#.# EVIDENCE
aa10: 2d 4f 46 3a 20 52 2d 35 35 31 34 37 2d 34 37 36  -OF: R-55147-476
aa20: 36 34 20 46 6f 72 20 61 73 20 6c 6f 6e 67 20 61  64 For as long a
aa30: 73 20 74 68 65 20 75 73 65 72 20 68 61 73 20 61  s the user has a
aa40: 6e 20 6f 70 65 6e 0a 23 20 74 72 61 6e 73 61 63  n open.# transac
aa50: 74 69 6f 6e 2c 20 74 68 65 20 64 61 74 61 62 61  tion, the databa
aa60: 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  se is allowed to
aa70: 20 65 78 69 73 74 20 69 6e 20 61 20 73 74 61 74   exist in a stat
aa80: 65 20 74 68 61 74 20 76 69 6f 6c 61 74 65 73 0a  e that violates.
aa90: 23 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  # any number of 
aaa0: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
aab0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
aac0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
aad0: 46 3a 20 52 2d 32 39 36 30 34 2d 33 30 33 39 35  F: R-29604-30395
aae0: 20 48 6f 77 65 76 65 72 2c 20 43 4f 4d 4d 49 54   However, COMMIT
aaf0: 20 77 69 6c 6c 20 66 61 69 6c 20 61 73 20 6c 6f   will fail as lo
ab00: 6e 67 20 61 73 0a 23 20 66 6f 72 65 69 67 6e 20  ng as.# foreign 
ab10: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
ab20: 72 65 6d 61 69 6e 20 69 6e 20 76 69 6f 6c 61 74  remain in violat
ab30: 69 6f 6e 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74  ion..#.proc test
ab40: 5f 65 66 6b 65 79 5f 33 34 20 7b 74 6e 20 69 73  _efkey_34 {tn is
ab50: 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64  Error sql} {.  d
ab60: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 32  o_test e_fkey-32
ab70: 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68  .$tn ".    catch
ab80: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
ab90: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
aba0: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
abb0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
abc0: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a  }}} $isError].}.
abd0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
abe0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
abf0: 31 20 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1 0 {.  CREATE T
ac00: 41 42 4c 45 20 6c 6c 28 6b 20 50 52 49 4d 41 52  ABLE ll(k PRIMAR
ac10: 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45  Y KEY);.  CREATE
ac20: 20 54 41 42 4c 45 20 6b 6b 28 63 20 52 45 46 45   TABLE kk(c REFE
ac30: 52 45 4e 43 45 53 20 6c 6c 20 44 45 46 45 52 52  RENCES ll DEFERR
ac40: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
ac50: 45 46 45 52 52 45 44 29 3b 0a 7d 0a 74 65 73 74  EFERRED);.}.test
ac60: 5f 65 66 6b 65 79 5f 33 34 20 20 32 20 30 20 22  _efkey_34  2 0 "
ac70: 42 45 47 49 4e 22 0a 74 65 73 74 5f 65 66 6b 65  BEGIN".test_efke
ac80: 79 5f 33 34 20 20 33 20 30 20 20 20 22 49 4e 53  y_34  3 0   "INS
ac90: 45 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55  ERT INTO kk VALU
aca0: 45 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65  ES(5)".test_efke
acb0: 79 5f 33 34 20 20 34 20 30 20 20 20 22 49 4e 53  y_34  4 0   "INS
acc0: 45 52 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55  ERT INTO kk VALU
acd0: 45 53 28 31 30 29 22 0a 74 65 73 74 5f 65 66 6b  ES(10)".test_efk
ace0: 65 79 5f 33 34 20 20 35 20 31 20 22 43 4f 4d 4d  ey_34  5 1 "COMM
acf0: 49 54 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33  IT".test_efkey_3
ad00: 34 20 20 36 20 30 20 20 20 22 49 4e 53 45 52 54  4  6 0   "INSERT
ad10: 20 49 4e 54 4f 20 6c 6c 20 56 41 4c 55 45 53 28   INTO ll VALUES(
ad20: 31 30 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  10)".test_efkey_
ad30: 33 34 20 20 37 20 31 20 22 43 4f 4d 4d 49 54 22  34  7 1 "COMMIT"
ad40: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
ad50: 38 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e  8 0   "INSERT IN
ad60: 54 4f 20 6c 6c 20 56 41 4c 55 45 53 28 35 29 22  TO ll VALUES(5)"
ad70: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20  .test_efkey_34  
ad80: 39 20 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 23 2d  9 0 "COMMIT"..#-
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e 20  --------.# When 
ade0: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 69 6e 73 69  not running insi
adf0: 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  de a transaction
ae00: 2c 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e  , a deferred con
ae10: 73 74 72 61 69 6e 74 20 69 73 20 73 69 6d 69 6c  straint is simil
ae20: 61 72 0a 23 20 74 6f 20 61 6e 20 69 6d 6d 65 64  ar.# to an immed
ae30: 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  iate constraint 
ae40: 28 76 69 6f 6c 61 74 69 6f 6e 73 20 61 72 65 20  (violations are 
ae50: 72 65 70 6f 72 74 65 64 20 69 6d 6d 65 64 69 61  reported immedia
ae60: 74 65 6c 79 29 2e 0a 23 0a 23 20 45 56 49 44 45  tely)..#.# EVIDE
ae70: 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 38 34 34 2d  NCE-OF: R-56844-
ae80: 36 31 37 30 35 20 49 66 20 74 68 65 20 63 75 72  61705 If the cur
ae90: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69  rent statement i
aea0: 73 20 6e 6f 74 20 69 6e 73 69 64 65 20 61 6e 0a  s not inside an.
aeb0: 23 20 65 78 70 6c 69 63 69 74 20 74 72 61 6e 73  # explicit trans
aec0: 61 63 74 69 6f 6e 20 28 61 20 42 45 47 49 4e 2f  action (a BEGIN/
aed0: 43 4f 4d 4d 49 54 2f 52 4f 4c 4c 42 41 43 4b 20  COMMIT/ROLLBACK 
aee0: 62 6c 6f 63 6b 29 2c 20 74 68 65 6e 20 61 6e 20  block), then an 
aef0: 69 6d 70 6c 69 63 69 74 0a 23 20 74 72 61 6e 73  implicit.# trans
af00: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
af10: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
af20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  he statement has
af30: 20 66 69 6e 69 73 68 65 64 0a 23 20 65 78 65 63   finished.# exec
af40: 75 74 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63  uting. In this c
af50: 61 73 65 20 64 65 66 65 72 72 65 64 20 63 6f 6e  ase deferred con
af60: 73 74 72 61 69 6e 74 73 20 62 65 68 61 76 65 20  straints behave 
af70: 74 68 65 20 73 61 6d 65 20 61 73 0a 23 20 69 6d  the same as.# im
af80: 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69  mediate constrai
af90: 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  nts..#.drop_all_
afa0: 74 61 62 6c 65 73 0a 70 72 6f 63 20 74 65 73 74  tables.proc test
afb0: 5f 65 66 6b 65 79 5f 33 35 20 7b 74 6e 20 69 73  _efkey_35 {tn is
afc0: 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64  Error sql} {.  d
afd0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 33  o_test e_fkey-33
afe0: 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68  .$tn ".    catch
aff0: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
b000: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
b010: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
b020: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
b030: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a  }}} $isError].}.
b040: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
b050: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
b060: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
b070: 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79 29 3b  LE parent(x, y);
b080: 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51  .    CREATE UNIQ
b090: 55 45 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70  UE INDEX pi ON p
b0a0: 61 72 65 6e 74 28 78 2c 20 79 29 3b 0a 20 20 20  arent(x, y);.   
b0b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
b0c0: 69 6c 64 28 61 2c 20 62 2c 0a 20 20 20 20 20 20  ild(a, b,.      
b0d0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
b0e0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
b0f0: 65 6e 74 28 78 2c 20 79 29 20 44 45 46 45 52 52  ent(x, y) DEFERR
b100: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
b110: 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20  EFERRED.    );. 
b120: 20 7d 0a 7d 20 7b 7d 0a 74 65 73 74 5f 65 66 6b   }.} {}.test_efk
b130: 65 79 5f 33 35 20 32 20 31 20 22 49 4e 53 45 52  ey_35 2 1 "INSER
b140: 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41  T INTO child  VA
b150: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a  LUES('x', 'y')".
b160: 74 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 33 20  test_efkey_35 3 
b170: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  0 "INSERT INTO p
b180: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 78 27  arent VALUES('x'
b190: 2c 20 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b  , 'y')".test_efk
b1a0: 65 79 5f 33 35 20 34 20 30 20 22 49 4e 53 45 52  ey_35 4 0 "INSER
b1b0: 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41  T INTO child  VA
b1c0: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a  LUES('x', 'y')".
b1d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
b220: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
b230: 37 38 32 2d 36 31 38 34 31 0a 23 0a 23 20 54 65  782-61841.#.# Te
b240: 73 74 20 74 68 61 74 20 61 6e 20 46 4b 20 63 6f  st that an FK co
b250: 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 64 65  nstraint is made
b260: 20 64 65 66 65 72 72 65 64 20 62 79 20 61 64 64   deferred by add
b270: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
b280: 67 0a 23 20 74 6f 20 74 68 65 20 64 65 66 69 6e  g.# to the defin
b290: 69 74 69 6f 6e 3a 0a 23 0a 23 20 20 20 44 45 46  ition:.#.#   DEF
b2a0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
b2b0: 59 20 44 45 46 45 52 52 45 44 0a 23 0a 23 20 45  Y DEFERRED.#.# E
b2c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
b2d0: 30 30 35 2d 32 38 37 39 31 0a 23 0a 23 20 41 6c  005-28791.#.# Al
b2e0: 73 6f 20 74 65 73 74 20 74 68 61 74 20 61 64 64  so test that add
b2f0: 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 66  ing any of the f
b300: 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 61 20 66 6f  ollowing to a fo
b310: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
b320: 74 69 6f 6e 20 0a 23 20 6d 61 6b 65 73 20 74 68  tion .# makes th
b330: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 49 4d 4d  e constraint IMM
b340: 45 44 49 41 54 45 3a 0a 23 0a 23 20 20 20 4e 4f  EDIATE:.#.#   NO
b350: 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  T DEFERRABLE INI
b360: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
b370: 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42  #   NOT DEFERRAB
b380: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  LE INITIALLY IMM
b390: 45 44 49 41 54 45 0a 23 20 20 20 4e 4f 54 20 44  EDIATE.#   NOT D
b3a0: 45 46 45 52 52 41 42 4c 45 0a 23 20 20 20 44 45  EFERRABLE.#   DE
b3b0: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
b3c0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20  LY IMMEDIATE.#  
b3d0: 20 44 45 46 45 52 52 41 42 4c 45 0a 23 0a 23 20   DEFERRABLE.#.# 
b3e0: 46 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65  Foreign keys are
b3f0: 20 49 4d 4d 45 44 49 41 54 45 20 62 79 20 64 65   IMMEDIATE by de
b400: 66 61 75 6c 74 20 28 69 66 20 74 68 65 72 65 20  fault (if there 
b410: 69 73 20 6e 6f 20 44 45 46 45 52 52 41 42 4c 45  is no DEFERRABLE
b420: 20 6f 72 20 4e 4f 54 0a 23 20 44 45 46 45 52 52   or NOT.# DEFERR
b430: 41 42 4c 45 20 63 6c 61 75 73 65 29 2e 0a 23 0a  ABLE clause)..#.
b440: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b450: 2d 33 35 32 39 30 2d 31 36 34 36 30 20 46 6f 72  -35290-16460 For
b460: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
b470: 69 6e 74 73 20 61 72 65 20 69 6d 6d 65 64 69 61  ints are immedia
b480: 74 65 20 62 79 0a 23 20 64 65 66 61 75 6c 74 2e  te by.# default.
b490: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
b4a0: 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
b4b0: 45 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  Each foreign key
b4c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53   constraint in S
b4d0: 51 4c 69 74 65 20 69 73 0a 23 20 63 6c 61 73 73  QLite is.# class
b4e0: 69 66 69 65 64 20 61 73 20 65 69 74 68 65 72 20  ified as either 
b4f0: 69 6d 6d 65 64 69 61 74 65 20 6f 72 20 64 65 66  immediate or def
b500: 65 72 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c  erred..#.drop_al
b510: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
b520: 20 65 5f 66 6b 65 79 2d 33 34 2e 31 20 7b 0a 20   e_fkey-34.1 {. 
b530: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
b540: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
b550: 6e 74 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  nt(x, y, z, PRIM
b560: 41 52 59 20 4b 45 59 28 78 2c 79 2c 7a 29 29 3b  ARY KEY(x,y,z));
b570: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b580: 45 20 63 31 28 61 2c 20 62 2c 20 63 2c 0a 20 20  E c1(a, b, c,.  
b590: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
b5a0: 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e  a, b, c) REFEREN
b5b0: 43 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20 44  CES parent NOT D
b5c0: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
b5d0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
b5e0: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
b5f0: 41 42 4c 45 20 63 32 28 61 2c 20 62 2c 20 63 2c  ABLE c2(a, b, c,
b600: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
b610: 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45  EY(a, b, c) REFE
b620: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4e 4f  RENCES parent NO
b630: 54 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  T DEFERRABLE INI
b640: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b650: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
b660: 54 45 20 54 41 42 4c 45 20 63 33 28 61 2c 20 62  TE TABLE c3(a, b
b670: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b680: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b690: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b6a0: 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  t NOT DEFERRABLE
b6b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
b6c0: 54 45 20 54 41 42 4c 45 20 63 34 28 61 2c 20 62  TE TABLE c4(a, b
b6d0: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b6e0: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b6f0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b700: 74 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  t DEFERRABLE INI
b710: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
b720: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
b730: 54 45 20 54 41 42 4c 45 20 63 35 28 61 2c 20 62  TE TABLE c5(a, b
b740: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b750: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b760: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b770: 74 20 44 45 46 45 52 52 41 42 4c 45 0a 20 20 20  t DEFERRABLE.   
b780: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   );.    CREATE T
b790: 41 42 4c 45 20 63 36 28 61 2c 20 62 2c 20 63 2c  ABLE c6(a, b, c,
b7a0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
b7b0: 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45 53  b, c) REFERENCES
b7c0: 20 70 61 72 65 6e 74 29 3b 0a 0a 20 20 20 20 2d   parent);..    -
b7d0: 2d 20 54 68 69 73 20 46 4b 20 63 6f 6e 73 74 72  - This FK constr
b7e0: 61 69 6e 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  aint is the only
b7f0: 20 64 65 66 65 72 72 61 62 6c 65 20 6f 6e 65 2e   deferrable one.
b800: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b810: 45 20 63 37 28 61 2c 20 62 2c 20 63 2c 0a 20 20  E c7(a, b, c,.  
b820: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
b830: 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e  a, b, c) REFEREN
b840: 43 45 53 20 70 61 72 65 6e 74 20 44 45 46 45 52  CES parent DEFER
b850: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
b860: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
b870: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b880: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
b890: 61 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20  a', 'b', 'c');. 
b8a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b8b0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 64 27  arent VALUES('d'
b8c0: 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 20  , 'e', 'f');.   
b8d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
b8e0: 65 6e 74 20 56 41 4c 55 45 53 28 27 67 27 2c 20  ent VALUES('g', 
b8f0: 27 68 27 2c 20 27 69 27 29 3b 0a 20 20 20 20 49  'h', 'i');.    I
b900: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
b910: 74 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b  t VALUES('j', 'k
b920: 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'l');.    INS
b930: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
b940: 56 41 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c  VALUES('m', 'n',
b950: 20 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'o');.    INSER
b960: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b970: 4c 55 45 53 28 27 70 27 2c 20 27 71 27 2c 20 27  LUES('p', 'q', '
b980: 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  r');.    INSERT 
b990: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b9a0: 45 53 28 27 73 27 2c 20 27 74 27 2c 20 27 75 27  ES('s', 't', 'u'
b9b0: 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  );..    INSERT I
b9c0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 61  NTO c1 VALUES('a
b9d0: 27 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20  ', 'b', 'c');.  
b9e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32    INSERT INTO c2
b9f0: 20 56 41 4c 55 45 53 28 27 64 27 2c 20 27 65 27   VALUES('d', 'e'
ba00: 2c 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'f');.    INSE
ba10: 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
ba20: 53 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29  S('g', 'h', 'i')
ba30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ba40: 4f 20 63 34 20 56 41 4c 55 45 53 28 27 6a 27 2c  O c4 VALUES('j',
ba50: 20 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20   'k', 'l');.    
ba60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56  INSERT INTO c5 V
ba70: 41 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c 20  ALUES('m', 'n', 
ba80: 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'o');.    INSERT
ba90: 20 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28   INTO c6 VALUES(
baa0: 27 70 27 2c 20 27 71 27 2c 20 27 72 27 29 3b 0a  'p', 'q', 'r');.
bab0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bac0: 63 37 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27  c7 VALUES('s', '
bad0: 74 27 2c 20 27 75 27 29 3b 0a 20 20 7d 0a 7d 20  t', 'u');.  }.} 
bae0: 7b 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66  {}..proc test_ef
baf0: 6b 65 79 5f 32 39 20 7b 74 6e 20 73 71 6c 20 69  key_29 {tn sql i
bb00: 73 45 72 72 6f 72 7d 20 7b 0a 20 20 64 6f 5f 74  sError} {.  do_t
bb10: 65 73 74 20 65 5f 66 6b 65 79 2d 33 34 2e 24 74  est e_fkey-34.$t
bb20: 6e 20 22 63 61 74 63 68 73 71 6c 20 7b 24 73 71  n "catchsql {$sq
bb30: 6c 7d 22 20 5b 0a 20 20 20 20 6c 69 6e 64 65 78  l}" [.    lindex
bb40: 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 46 4f 52   {{0 {}} {1 {FOR
bb50: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
bb60: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69  int failed}}} $i
bb70: 73 45 72 72 6f 72 0a 20 20 5d 0a 7d 0a 74 65 73  sError.  ].}.tes
bb80: 74 5f 65 66 6b 65 79 5f 32 39 20 20 32 20 22 42  t_efkey_29  2 "B
bb90: 45 47 49 4e 22 20 20 20 20 20 20 20 20 20 20 20  EGIN"           
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65          0.test_e
bbc0: 66 6b 65 79 5f 32 39 20 20 33 20 22 44 45 4c 45  fkey_29  3 "DELE
bbd0: 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57  TE FROM parent W
bbe0: 48 45 52 45 20 78 20 3d 20 27 61 27 22 20 20 20  HERE x = 'a'"   
bbf0: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
bc00: 79 5f 32 39 20 20 34 20 22 44 45 4c 45 54 45 20  y_29  4 "DELETE 
bc10: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
bc20: 45 20 78 20 3d 20 27 64 27 22 20 20 20 20 20 20  E x = 'd'"      
bc30: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
bc40: 39 20 20 35 20 22 44 45 4c 45 54 45 20 46 52 4f  9  5 "DELETE FRO
bc50: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 78  M parent WHERE x
bc60: 20 3d 20 27 67 27 22 20 20 20 20 20 20 20 20 31   = 'g'"        1
bc70: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
bc80: 36 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  6 "DELETE FROM p
bc90: 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
bca0: 27 6a 27 22 20 20 20 20 20 20 20 20 31 0a 74 65  'j'"        1.te
bcb0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 37 20 22  st_efkey_29  7 "
bcc0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
bcd0: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6d 27  nt WHERE x = 'm'
bce0: 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f  "        1.test_
bcf0: 65 66 6b 65 79 5f 32 39 20 20 38 20 22 44 45 4c  efkey_29  8 "DEL
bd00: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
bd10: 57 48 45 52 45 20 78 20 3d 20 27 70 27 22 20 20  WHERE x = 'p'"  
bd20: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bd30: 65 79 5f 32 39 20 20 39 20 22 44 45 4c 45 54 45  ey_29  9 "DELETE
bd40: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
bd50: 52 45 20 78 20 3d 20 27 73 27 22 20 20 20 20 20  RE x = 's'"     
bd60: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
bd70: 32 39 20 31 30 20 22 43 4f 4d 4d 49 54 22 20 20  29 10 "COMMIT"  
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bdb0: 31 31 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20  11 "ROLLBACK"   
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 0a               0..
bde0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39  test_efkey_29  9
bdf0: 20 22 42 45 47 49 4e 22 20 20 20 20 20 20 20 20   "BEGIN"        
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 20 20 30 0a 74 65 73             0.tes
be20: 74 5f 65 66 6b 65 79 5f 32 39 20 31 30 20 22 55  t_efkey_29 10 "U
be30: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
be40: 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a   z = 'z' WHERE z
be50: 20 3d 20 27 63 27 22 20 31 0a 74 65 73 74 5f 65   = 'c'" 1.test_e
be60: 66 6b 65 79 5f 32 39 20 31 31 20 22 55 50 44 41  fkey_29 11 "UPDA
be70: 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20  TE parent SET z 
be80: 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20  = 'z' WHERE z = 
be90: 27 66 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65  'f'" 1.test_efke
bea0: 79 5f 32 39 20 31 32 20 22 55 50 44 41 54 45 20  y_29 12 "UPDATE 
beb0: 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27  parent SET z = '
bec0: 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 69 27  z' WHERE z = 'i'
bed0: 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32  " 1.test_efkey_2
bee0: 39 20 31 33 20 22 55 50 44 41 54 45 20 70 61 72  9 13 "UPDATE par
bef0: 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20  ent SET z = 'z' 
bf00: 57 48 45 52 45 20 7a 20 3d 20 27 6c 27 22 20 31  WHERE z = 'l'" 1
bf10: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
bf20: 34 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  4 "UPDATE parent
bf30: 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45   SET z = 'z' WHE
bf40: 52 45 20 7a 20 3d 20 27 6f 27 22 20 31 0a 74 65  RE z = 'o'" 1.te
bf50: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 35 20 22  st_efkey_29 15 "
bf60: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
bf70: 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20  T z = 'z' WHERE 
bf80: 7a 20 3d 20 27 72 27 22 20 31 0a 74 65 73 74 5f  z = 'r'" 1.test_
bf90: 65 66 6b 65 79 5f 32 39 20 31 36 20 22 55 50 44  efkey_29 16 "UPD
bfa0: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
bfb0: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bfc0: 20 27 75 27 22 20 30 0a 74 65 73 74 5f 65 66 6b   'u'" 0.test_efk
bfd0: 65 79 5f 32 39 20 31 37 20 22 43 4f 4d 4d 49 54  ey_29 17 "COMMIT
bfe0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c010: 32 39 20 31 38 20 22 52 4f 4c 4c 42 41 43 4b 22  29 18 "ROLLBACK"
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39  0..test_efkey_29
c050: 20 31 37 20 22 42 45 47 49 4e 22 20 20 20 20 20   17 "BEGIN"     
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
c080: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 38  test_efkey_29 18
c090: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31   "INSERT INTO c1
c0a0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
c0b0: 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73  "          1.tes
c0c0: 74 5f 65 66 6b 65 79 5f 32 39 20 31 39 20 22 49  t_efkey_29 19 "I
c0d0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
c0e0: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20  LUES(1, 2, 3)"  
c0f0: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
c100: 66 6b 65 79 5f 32 39 20 32 30 20 22 49 4e 53 45  fkey_29 20 "INSE
c110: 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
c120: 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  S(1, 2, 3)"     
c130: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c140: 79 5f 32 39 20 32 31 20 22 49 4e 53 45 52 54 20  y_29 21 "INSERT 
c150: 49 4e 54 4f 20 63 34 20 56 41 4c 55 45 53 28 31  INTO c4 VALUES(1
c160: 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20  , 2, 3)"        
c170: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c180: 39 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54  9 22 "INSERT INT
c190: 4f 20 63 35 20 56 41 4c 55 45 53 28 31 2c 20 32  O c5 VALUES(1, 2
c1a0: 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31  , 3)"          1
c1b0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
c1c0: 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  2 "INSERT INTO c
c1d0: 36 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  6 VALUES(1, 2, 3
c1e0: 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65  )"          1.te
c1f0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 32 20 22  st_efkey_29 22 "
c200: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56  INSERT INTO c7 V
c210: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
c220: 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f           0.test_
c230: 65 66 6b 65 79 5f 32 39 20 32 33 20 22 43 4f 4d  efkey_29 23 "COM
c240: 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20  MIT"            
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c270: 65 79 5f 32 39 20 32 34 20 22 49 4e 53 45 52 54  ey_29 24 "INSERT
c280: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
c290: 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20  UES(1, 2, 3)"   
c2a0: 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f     0.test_efkey_
c2b0: 32 39 20 32 35 20 22 43 4f 4d 4d 49 54 22 20 20  29 25 "COMMIT"  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39  0..test_efkey_29
c2f0: 20 32 36 20 22 42 45 47 49 4e 22 20 20 20 20 20   26 "BEGIN"     
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
c320: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 37  test_efkey_29 27
c330: 20 22 55 50 44 41 54 45 20 63 31 20 53 45 54 20   "UPDATE c1 SET 
c340: 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20  a = 10"         
c350: 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73             1.tes
c360: 74 5f 65 66 6b 65 79 5f 32 39 20 32 38 20 22 55  t_efkey_29 28 "U
c370: 50 44 41 54 45 20 63 32 20 53 45 54 20 61 20 3d  PDATE c2 SET a =
c380: 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20   10"            
c390: 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65          1.test_e
c3a0: 66 6b 65 79 5f 32 39 20 32 39 20 22 55 50 44 41  fkey_29 29 "UPDA
c3b0: 54 45 20 63 33 20 53 45 54 20 61 20 3d 20 31 30  TE c3 SET a = 10
c3c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c3d0: 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65       1.test_efke
c3e0: 79 5f 32 39 20 33 30 20 22 55 50 44 41 54 45 20  y_29 30 "UPDATE 
c3f0: 63 34 20 53 45 54 20 61 20 3d 20 31 30 22 20 20  c4 SET a = 10"  
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
c420: 39 20 33 31 20 22 55 50 44 41 54 45 20 63 35 20  9 31 "UPDATE c5 
c430: 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20  SET a = 10"     
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
c450: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33  .test_efkey_29 3
c460: 31 20 22 55 50 44 41 54 45 20 63 36 20 53 45 54  1 "UPDATE c6 SET
c470: 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20   a = 10"        
c480: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
c490: 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 31 20 22  st_efkey_29 31 "
c4a0: 55 50 44 41 54 45 20 63 37 20 53 45 54 20 61 20  UPDATE c7 SET a 
c4b0: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c4c0: 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f           0.test_
c4d0: 65 66 6b 65 79 5f 32 39 20 33 32 20 22 43 4f 4d  efkey_29 32 "COM
c4e0: 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20 20  MIT"            
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c510: 65 79 5f 32 39 20 33 33 20 22 52 4f 4c 4c 42 41  ey_29 33 "ROLLBA
c520: 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20  CK"             
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d     0..#---------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c590: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
c5a0: 52 2d 32 34 34 39 39 2d 35 37 30 37 31 0a 23 0a  R-24499-57071.#.
c5b0: 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c  # Test an exampl
c5c0: 65 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b 65  e from foreignke
c5d0: 79 73 2e 68 74 6d 6c 20 64 65 61 6c 69 6e 67 20  ys.html dealing 
c5e0: 77 69 74 68 20 61 20 64 65 66 65 72 72 65 64 20  with a deferred 
c5f0: 66 6f 72 65 69 67 6e 20 0a 23 20 6b 65 79 20 63  foreign .# key c
c600: 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 6f 5f  onstraint..#.do_
c610: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e 31  test e_fkey-35.1
c620: 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
c630: 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  bles.  execsql {
c640: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
c650: 45 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20  E artist(.      
c660: 61 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45  artistid    INTE
c670: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
c680: 20 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61   .      artistna
c690: 6d 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a  me  TEXT.    );.
c6a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
c6b0: 20 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72   track(.      tr
c6c0: 61 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45  ackid     INTEGE
c6d0: 52 2c 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61  R,.      trackna
c6e0: 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20  me   TEXT, .    
c6f0: 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e    trackartist IN
c700: 54 45 47 45 52 20 52 45 46 45 52 45 4e 43 45 53  TEGER REFERENCES
c710: 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64   artist(artistid
c720: 29 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  ) DEFERRABLE INI
c730: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
c740: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
c750: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
c760: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
c770: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
c780: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
c790: 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27  rack VALUES(1, '
c7a0: 57 68 69 74 65 20 43 68 72 69 73 74 6d 61 73 27  White Christmas'
c7b0: 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63  , 5);.  }.  catc
c7c0: 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
c7d0: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
c7e0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
c7f0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
c800: 2d 33 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -35.3 {.  execsq
c810: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
c820: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
c830: 53 28 35 2c 20 27 42 69 6e 67 20 43 72 6f 73 62  S(5, 'Bing Crosb
c840: 79 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  y');.    COMMIT;
c850: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74  -----.# Verify t
c8b0: 68 61 74 20 61 20 6e 65 73 74 65 64 20 73 61 76  hat a nested sav
c8c0: 65 70 6f 69 6e 74 20 6d 61 79 20 62 65 20 72 65  epoint may be re
c8d0: 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 73  leased without s
c8e0: 61 74 69 73 66 79 69 6e 67 20 0a 23 20 64 65 66  atisfying .# def
c8f0: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
c900: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23  y constraints..#
c910: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
c920: 52 2d 30 37 32 32 33 2d 34 38 33 32 33 20 41 20  R-07223-48323 A 
c930: 6e 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74  nested savepoint
c940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
c950: 20 62 65 0a 23 20 52 45 4c 45 41 53 45 64 20 77   be.# RELEASEd w
c960: 68 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  hile the databas
c970: 65 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20  e is in a state 
c980: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 61  that does not sa
c990: 74 69 73 66 79 20 61 0a 23 20 64 65 66 65 72 72  tisfy a.# deferr
c9a0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
c9b0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 64 72 6f  onstraint..#.dro
c9c0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
c9d0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 31  test e_fkey-36.1
c9e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
c9f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ca00: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
ca10: 2c 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45  ,.      b REFERE
ca20: 4e 43 45 53 20 74 31 20 44 45 46 45 52 52 41 42  NCES t1 DEFERRAB
ca30: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
ca40: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20  ERRED.    );.   
ca50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ca60: 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20  VALUES(1, 1);.  
ca70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ca80: 20 56 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a 20   VALUES(2, 2);. 
ca90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
caa0: 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a  1 VALUES(3, 3);.
cab0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
cac0: 20 65 5f 66 6b 65 79 2d 33 36 2e 32 20 7b 0a 20   e_fkey-36.2 {. 
cad0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
cae0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45  EGIN;.      SAVE
caf0: 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20  POINT one;.     
cb00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
cb10: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 29 3b 0a  1 VALUES(4, 5);.
cb20: 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e        RELEASE on
cb30: 65 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  e;.  }.} {}.do_t
cb40: 65 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 33 20  est e_fkey-36.3 
cb50: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  {.  catchsql COM
cb60: 4d 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  MIT.} {1 {FOREIG
cb70: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
cb80: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
cb90: 74 20 65 5f 66 6b 65 79 2d 33 36 2e 34 20 7b 0a  t e_fkey-36.4 {.
cba0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
cbb0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
cbc0: 3d 20 35 20 57 48 45 52 45 20 61 20 3d 20 34 3b  = 5 WHERE a = 4;
cbd0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
cbe0: 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .} {}...#-------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
cc40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  a transaction sa
cc50: 76 65 70 6f 69 6e 74 20 28 61 6e 20 6f 75 74 65  vepoint (an oute
cc60: 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 20  rmost savepoint 
cc70: 6f 70 65 6e 65 64 20 77 68 65 6e 0a 23 20 74 68  opened when.# th
cc80: 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 69  e database was i
cc90: 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f  n auto-commit mo
cca0: 64 65 29 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  de) cannot be re
ccb0: 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 0a 23  leased without.#
ccc0: 20 73 61 74 69 73 66 79 69 6e 67 20 64 65 66 65   satisfying defe
ccd0: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
cce0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 74   constraints. It
ccf0: 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
cd00: 61 63 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ack..#.# EVIDENC
cd10: 45 2d 4f 46 3a 20 52 2d 34 34 32 39 35 2d 31 33  E-OF: R-44295-13
cd20: 38 32 33 20 41 20 74 72 61 6e 73 61 63 74 69 6f  823 A transactio
cd30: 6e 20 73 61 76 65 70 6f 69 6e 74 20 28 61 20 6e  n savepoint (a n
cd40: 6f 6e 2d 6e 65 73 74 65 64 0a 23 20 73 61 76 65  on-nested.# save
cd50: 70 6f 69 6e 74 20 74 68 61 74 20 77 61 73 20 6f  point that was o
cd60: 70 65 6e 65 64 20 77 68 69 6c 65 20 74 68 65 72  pened while ther
cd70: 65 20 77 61 73 20 6e 6f 74 20 63 75 72 72 65 6e  e was not curren
cd80: 74 6c 79 20 61 6e 20 6f 70 65 6e 0a 23 20 74 72  tly an open.# tr
cd90: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 6f 6e 20 74  ansaction), on t
cda0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
cdb0: 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  s subject to the
cdc0: 20 73 61 6d 65 20 72 65 73 74 72 69 63 74 69 6f   same restrictio
cdd0: 6e 73 0a 23 20 61 73 20 61 20 43 4f 4d 4d 49 54  ns.# as a COMMIT
cde0: 20 2d 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f   - attempting to
cdf0: 20 52 45 4c 45 41 53 45 20 69 74 20 77 68 69 6c   RELEASE it whil
ce00: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
ce10: 73 20 69 6e 20 73 75 63 68 20 61 0a 23 20 73 74  s in such a.# st
ce20: 61 74 65 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 23  ate will fail..#
ce30: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
ce40: 33 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  37.1 {.  execsql
ce50: 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
ce60: 20 6f 6e 65 3b 0a 20 20 20 20 20 20 53 41 56 45   one;.      SAVE
ce70: 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20  POINT two;.     
ce80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ce90: 31 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a  1 VALUES(6, 7);.
cea0: 20 20 20 20 20 20 52 45 4c 45 41 53 45 20 74 77        RELEASE tw
ceb0: 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  o;.  }.} {}.do_t
cec0: 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 32 20  est e_fkey-37.2 
ced0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45  {.  catchsql {RE
cee0: 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 31 20  LEASE one}.} {1 
cef0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
cf00: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
cf10: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
cf20: 33 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  37.3 {.  execsql
cf30: 20 7b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20   {.      UPDATE 
cf40: 74 31 20 53 45 54 20 61 20 3d 20 37 20 57 48 45  t1 SET a = 7 WHE
cf50: 52 45 20 61 20 3d 20 36 3b 0a 20 20 20 20 52 45  RE a = 6;.    RE
cf60: 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d  LEASE one;.  }.}
cf70: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
cf80: 65 79 2d 33 37 2e 34 20 7b 0a 20 20 65 78 65 63  ey-37.4 {.  exec
cf90: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
cfa0: 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 53  INT one;.      S
cfb0: 41 56 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20  AVEPOINT two;.  
cfc0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
cfd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
cfe0: 30 29 3b 0a 20 20 20 20 20 20 52 45 4c 45 41 53  0);.      RELEAS
cff0: 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  E two;.  }.} {}.
d000: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
d010: 37 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  7.5 {.  catchsql
d020: 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d   {RELEASE one}.}
d030: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
d040: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
d050: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
d060: 6b 65 79 2d 33 37 2e 36 20 7b 0a 20 20 65 78 65  key-37.6 {.  exe
d070: 63 73 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 20 54  csql {ROLLBACK T
d080: 4f 20 6f 6e 65 20 3b 20 52 45 4c 45 41 53 45 20  O one ; RELEASE 
d090: 6f 6e 65 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  one}.} {}..#----
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0e0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
d0f0: 74 20 69 66 20 61 20 43 4f 4d 4d 49 54 20 6f 70  t if a COMMIT op
d100: 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 64 75  eration fails du
d110: 65 20 74 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e to deferred fo
d120: 72 65 69 67 6e 20 6b 65 79 20 0a 23 20 63 6f 6e  reign key .# con
d130: 73 74 72 61 69 6e 74 73 2c 20 61 6e 79 20 6e 65  straints, any ne
d140: 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20  sted savepoints 
d150: 72 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 23  remain open..#.#
d160: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d170: 33 37 37 33 36 2d 34 32 36 31 36 20 49 66 20 61  37736-42616 If a
d180: 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e   COMMIT statemen
d190: 74 20 28 6f 72 20 74 68 65 20 52 45 4c 45 41 53  t (or the RELEAS
d1a0: 45 20 6f 66 20 61 0a 23 20 74 72 61 6e 73 61 63  E of a.# transac
d1b0: 74 69 6f 6e 20 53 41 56 45 50 4f 49 4e 54 29 20  tion SAVEPOINT) 
d1c0: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 74 68  fails because th
d1d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 75  e database is cu
d1e0: 72 72 65 6e 74 6c 79 20 69 6e 20 61 0a 23 20 73  rrently in a.# s
d1f0: 74 61 74 65 20 74 68 61 74 20 76 69 6f 6c 61 74  tate that violat
d200: 65 73 20 61 20 64 65 66 65 72 72 65 64 20 66 6f  es a deferred fo
d210: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
d220: 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
d230: 72 65 0a 23 20 63 75 72 72 65 6e 74 6c 79 20 6e  re.# currently n
d240: 65 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73  ested savepoints
d250: 2c 20 74 68 65 20 6e 65 73 74 65 64 20 73 61 76  , the nested sav
d260: 65 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f  epoints remain o
d270: 70 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  pen..#.do_test e
d280: 5f 66 6b 65 79 2d 33 38 2e 31 20 7b 0a 20 20 65  _fkey-38.1 {.  e
d290: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
d2a0: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
d2b0: 45 20 61 3e 33 3b 0a 20 20 20 20 53 45 4c 45 43  E a>3;.    SELEC
d2c0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
d2d0: 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 7d  .} {1 1 2 2 3 3}
d2e0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d2f0: 33 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  38.2 {.  execsql
d300: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
d310: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d320: 74 31 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b  t1 VALUES(4, 4);
d330: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
d340: 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 49 4e   one;.        IN
d350: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d360: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 20  UES(5, 6);.     
d370: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
d380: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20   t1;.  }.} {1 1 
d390: 32 20 32 20 33 20 33 20 34 20 34 20 35 20 36 7d  2 2 3 3 4 4 5 6}
d3a0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d3b0: 33 38 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  38.3 {.  catchsq
d3c0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 46  l COMMIT.} {1 {F
d3d0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
d3e0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
d3f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d400: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
d410: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
d420: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
d430: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
d440: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
d450: 20 31 20 32 20 32 20 33 20 33 20 34 20 34 7d 0a   1 2 2 3 3 4 4}.
d460: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
d470: 33 38 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  38.5 {.  execsql
d480: 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
d490: 20 61 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54   a;.      INSERT
d4a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d4b0: 35 2c 20 35 29 3b 0a 20 20 20 20 20 20 53 41 56  5, 5);.      SAV
d4c0: 45 50 4f 49 4e 54 20 62 3b 0a 20 20 20 20 20 20  EPOINT b;.      
d4d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d4e0: 20 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20   VALUES(6, 7);. 
d4f0: 20 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54         SAVEPOINT
d500: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e   c;.          IN
d510: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
d520: 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 7d  UES(7, 8);.  }.}
d530: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
d540: 65 79 2d 33 38 2e 36 20 7b 0a 20 20 63 61 74 63  ey-38.6 {.  catc
d550: 68 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d  hsql {RELEASE a}
d560: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
d570: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
d580: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
d590: 5f 66 6b 65 79 2d 33 38 2e 37 20 7b 0a 20 20 65  _fkey-38.7 {.  e
d5a0: 78 65 63 73 71 6c 20 20 7b 52 4f 4c 4c 42 41 43  xecsql  {ROLLBAC
d5b0: 4b 20 54 4f 20 63 7d 0a 20 20 63 61 74 63 68 73  K TO c}.  catchs
d5c0: 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a 7d  ql {RELEASE a}.}
d5d0: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
d5e0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
d5f0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
d600: 6b 65 79 2d 33 38 2e 38 20 7b 0a 20 20 65 78 65  key-38.8 {.  exe
d610: 63 73 71 6c 20 20 7b 0a 20 20 20 20 52 4f 4c 4c  csql  {.    ROLL
d620: 42 41 43 4b 20 54 4f 20 62 3b 0a 20 20 20 20 52  BACK TO b;.    R
d630: 45 4c 45 41 53 45 20 61 3b 0a 20 20 20 20 53 45  ELEASE a;.    SE
d640: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
d650: 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33    }.} {1 1 2 2 3
d660: 20 33 20 34 20 34 20 35 20 35 7d 0a 0a 23 23 23   3 4 4 5 5}..###
d670: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d680: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d6b0: 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43  ########.### SEC
d6c0: 54 49 4f 4e 20 34 2e 33 3a 20 4f 4e 20 44 45 4c  TION 4.3: ON DEL
d6d0: 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54  ETE and ON UPDAT
d6e0: 45 20 41 63 74 69 6f 6e 73 0a 23 23 23 23 23 23  E Actions.######
d6f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d730: 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  #####..#--------
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d780: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 63 6f  -.# Test that co
d790: 6e 66 69 67 75 72 65 64 20 4f 4e 20 44 45 4c 45  nfigured ON DELE
d7a0: 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
d7b0: 20 61 63 74 69 6f 6e 73 20 74 61 6b 65 20 70 6c   actions take pl
d7c0: 61 63 65 20 77 68 65 6e 0a 23 20 64 65 6c 65 74  ace when.# delet
d7d0: 69 6e 67 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67  ing or modifying
d7e0: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 70 61 72   rows of the par
d7f0: 65 6e 74 20 74 61 62 6c 65 2c 20 72 65 73 70 65  ent table, respe
d800: 63 74 69 76 65 6c 79 2e 0a 23 0a 23 20 45 56 49  ctively..#.# EVI
d810: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 32 37  DENCE-OF: R-4827
d820: 30 2d 34 34 32 38 32 20 46 6f 72 65 69 67 6e 20  0-44282 Foreign 
d830: 6b 65 79 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e  key ON DELETE an
d840: 64 20 4f 4e 20 55 50 44 41 54 45 20 63 6c 61 75  d ON UPDATE clau
d850: 73 65 73 0a 23 20 61 72 65 20 75 73 65 64 20 74  ses.# are used t
d860: 6f 20 63 6f 6e 66 69 67 75 72 65 20 61 63 74 69  o configure acti
d870: 6f 6e 73 20 74 68 61 74 20 74 61 6b 65 20 70 6c  ons that take pl
d880: 61 63 65 20 77 68 65 6e 20 64 65 6c 65 74 69 6e  ace when deletin
d890: 67 20 72 6f 77 73 20 66 72 6f 6d 0a 23 20 74 68  g rows from.# th
d8a0: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 28  e parent table (
d8b0: 4f 4e 20 44 45 4c 45 54 45 29 2c 20 6f 72 20 6d  ON DELETE), or m
d8c0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 70 61 72  odifying the par
d8d0: 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f  ent key values o
d8e0: 66 0a 23 20 65 78 69 73 74 69 6e 67 20 72 6f 77  f.# existing row
d8f0: 73 20 28 4f 4e 20 55 50 44 41 54 45 29 2e 0a 23  s (ON UPDATE)..#
d900: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 73  .# Test that a s
d910: 69 6e 67 6c 65 20 46 4b 20 63 6f 6e 73 74 72 61  ingle FK constra
d920: 69 6e 74 20 6d 61 79 20 68 61 76 65 20 64 69 66  int may have dif
d930: 66 65 72 65 6e 74 20 61 63 74 69 6f 6e 73 20 63  ferent actions c
d940: 6f 6e 66 69 67 75 72 65 64 0a 23 20 66 6f 72 20  onfigured.# for 
d950: 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
d960: 20 55 50 44 41 54 45 2e 0a 23 0a 23 20 45 56 49   UPDATE..#.# EVI
d970: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 31 32  DENCE-OF: R-4812
d980: 34 2d 36 33 32 32 35 20 41 20 73 69 6e 67 6c 65  4-63225 A single
d990: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
d9a0: 73 74 72 61 69 6e 74 20 6d 61 79 20 68 61 76 65  straint may have
d9b0: 0a 23 20 64 69 66 66 65 72 65 6e 74 20 61 63 74  .# different act
d9c0: 69 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 20  ions configured 
d9d0: 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e  for ON DELETE an
d9e0: 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a 64  d ON UPDATE..#.d
d9f0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39  o_test e_fkey-39
da00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
da10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
da20: 45 20 70 28 61 2c 20 62 20 50 52 49 4d 41 52 59  E p(a, b PRIMARY
da30: 20 4b 45 59 2c 20 63 29 3b 0a 20 20 20 20 43 52   KEY, c);.    CR
da40: 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 64 2c  EATE TABLE c1(d,
da50: 20 65 2c 20 66 20 44 45 46 41 55 4c 54 20 27 6b   e, f DEFAULT 'k
da60: 30 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  0' REFERENCES p 
da70: 0a 20 20 20 20 20 20 4f 4e 20 55 50 44 41 54 45  .      ON UPDATE
da80: 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20   SET DEFAULT.   
da90: 20 20 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54     ON DELETE SET
daa0: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 0a 20 20   NULL.    );..  
dab0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20    INSERT INTO p 
dac0: 56 41 4c 55 45 53 28 30 2c 20 27 6b 30 27 2c 20  VALUES(0, 'k0', 
dad0: 27 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  '');.    INSERT 
dae0: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c  INTO p VALUES(1,
daf0: 20 27 6b 31 27 2c 20 27 49 27 29 3b 0a 20 20 20   'k1', 'I');.   
db00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
db10: 41 4c 55 45 53 28 32 2c 20 27 6b 32 27 2c 20 27  ALUES(2, 'k2', '
db20: 49 49 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  II');.    INSERT
db30: 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 33   INTO p VALUES(3
db40: 2c 20 27 6b 33 27 2c 20 27 49 49 49 27 29 3b 0a  , 'k3', 'III');.
db50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
db60: 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20 27 78   c1 VALUES(1, 'x
db70: 78 27 2c 20 27 6b 31 27 29 3b 0a 20 20 20 20 49  x', 'k1');.    I
db80: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
db90: 4c 55 45 53 28 32 2c 20 27 78 78 27 2c 20 27 6b  LUES(2, 'xx', 'k
dba0: 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  2');.    INSERT 
dbb0: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 33  INTO c1 VALUES(3
dbc0: 2c 20 27 78 78 27 2c 20 27 6b 33 27 29 3b 0a 20  , 'xx', 'k3');. 
dbd0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
dbe0: 65 5f 66 6b 65 79 2d 33 39 2e 32 20 7b 0a 20 20  e_fkey-39.2 {.  
dbf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
dc00: 44 41 54 45 20 70 20 53 45 54 20 62 20 3d 20 27  DATE p SET b = '
dc10: 6b 34 27 20 57 48 45 52 45 20 61 20 3d 20 31 3b  k4' WHERE a = 1;
dc20: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
dc30: 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM c1;.  }.} {1 
dc40: 78 78 20 6b 30 20 32 20 78 78 20 6b 32 20 33 20  xx k0 2 xx k2 3 
dc50: 78 78 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65  xx k3}.do_test e
dc60: 5f 66 6b 65 79 2d 33 39 2e 33 20 7b 0a 20 20 65  _fkey-39.3 {.  e
dc70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
dc80: 45 54 45 20 46 52 4f 4d 20 70 20 57 48 45 52 45  ETE FROM p WHERE
dc90: 20 61 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45   a = 2;.    SELE
dca0: 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20  CT * FROM c1;.  
dcb0: 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78  }.} {1 xx k0 2 x
dcc0: 78 20 7b 7d 20 33 20 78 78 20 6b 33 7d 0a 64 6f  x {} 3 xx k3}.do
dcd0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e  _test e_fkey-39.
dce0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
dcf0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
dd00: 45 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70 28  E INDEX pi ON p(
dd10: 63 29 3b 0a 20 20 20 20 52 45 50 4c 41 43 45 20  c);.    REPLACE 
dd20: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 35 2c  INTO p VALUES(5,
dd30: 20 27 6b 35 27 2c 20 27 49 49 49 27 29 3b 0a 20   'k5', 'III');. 
dd40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
dd50: 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78   c1;.  }.} {1 xx
dd60: 20 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78   k0 2 xx {} 3 xx
dd70: 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}}..#---------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddc0: 0a 23 20 45 61 63 68 20 66 6f 72 65 69 67 6e 20  .# Each foreign 
ddd0: 6b 65 79 20 69 6e 20 74 68 65 20 73 79 73 74 65  key in the syste
dde0: 6d 20 68 61 73 20 61 6e 20 4f 4e 20 55 50 44 41  m has an ON UPDA
ddf0: 54 45 20 61 6e 64 20 4f 4e 20 44 45 4c 45 54 45  TE and ON DELETE
de00: 20 61 63 74 69 6f 6e 2c 0a 23 20 65 69 74 68 65   action,.# eithe
de10: 72 20 22 4e 4f 20 41 43 54 49 4f 4e 22 2c 20 22  r "NO ACTION", "
de20: 52 45 53 54 52 49 43 54 22 2c 20 22 53 45 54 20  RESTRICT", "SET 
de30: 4e 55 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41  NULL", "SET DEFA
de40: 55 4c 54 22 20 6f 72 20 22 43 41 53 43 41 44 45  ULT" or "CASCADE
de50: 22 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  "..#.# EVIDENCE-
de60: 4f 46 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35  OF: R-33326-4525
de70: 32 20 54 68 65 20 4f 4e 20 44 45 4c 45 54 45 20  2 The ON DELETE 
de80: 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 61 63  and ON UPDATE ac
de90: 74 69 6f 6e 0a 23 20 61 73 73 6f 63 69 61 74 65  tion.# associate
dea0: 64 20 77 69 74 68 20 65 61 63 68 20 66 6f 72 65  d with each fore
deb0: 69 67 6e 20 6b 65 79 20 69 6e 20 61 6e 20 53 51  ign key in an SQ
dec0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73  Lite database is
ded0: 20 6f 6e 65 20 6f 66 20 22 4e 4f 0a 23 20 41 43   one of "NO.# AC
dee0: 54 49 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54  TION", "RESTRICT
def0: 22 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22  ", "SET NULL", "
df00: 53 45 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20  SET DEFAULT" or 
df10: 22 43 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 49  "CASCADE"..#.# I
df20: 66 20 6e 6f 6e 65 20 69 73 20 73 70 65 63 69 66  f none is specif
df30: 69 65 64 20 65 78 70 6c 69 63 69 74 6c 79 2c 20  ied explicitly, 
df40: 22 4e 4f 20 41 43 54 49 4f 4e 22 20 69 73 20 74  "NO ACTION" is t
df50: 68 65 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20  he default..#.# 
df60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
df70: 39 38 30 33 2d 34 35 38 38 34 20 49 66 20 61 6e  9803-45884 If an
df80: 20 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65   action is not e
df90: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
dfa0: 69 65 64 2c 0a 23 20 69 74 20 64 65 66 61 75 6c  ied,.# it defaul
dfb0: 74 73 20 74 6f 20 22 4e 4f 20 41 43 54 49 4f 4e  ts to "NO ACTION
dfc0: 22 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74  "..# .drop_all_t
dfd0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
dfe0: 66 6b 65 79 2d 34 30 2e 31 20 7b 0a 20 20 65 78  fkey-40.1 {.  ex
dff0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
e000: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
e010: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
e020: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
e030: 42 4c 45 20 63 68 69 6c 64 31 28 61 2c 20 0a 20  BLE child1(a, . 
e040: 20 20 20 20 20 62 20 52 45 46 45 52 45 4e 43 45       b REFERENCE
e050: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
e060: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 20 4f 4e 20  TE NO ACTION ON 
e070: 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a  DELETE RESTRICT.
e080: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
e090: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61  E TABLE child2(a
e0a0: 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45 52  , .      b REFER
e0b0: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
e0c0: 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54 20  UPDATE RESTRICT 
e0d0: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
e0e0: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  LL.    );.    CR
e0f0: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
e100: 33 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45  3(a, .      b RE
e110: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
e120: 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55  ON UPDATE SET NU
e130: 4c 4c 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54  LL ON DELETE SET
e140: 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a   DEFAULT.    );.
e150: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e160: 20 63 68 69 6c 64 34 28 61 2c 20 0a 20 20 20 20   child4(a, .    
e170: 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70    b REFERENCES p
e180: 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20  arent ON UPDATE 
e190: 53 45 54 20 44 45 46 41 55 4c 54 20 4f 4e 20 44  SET DEFAULT ON D
e1a0: 45 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20 20  ELETE CASCADE.  
e1b0: 20 20 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 72 65    );..    -- Cre
e1c0: 61 74 65 20 73 6f 6d 65 20 66 6f 72 65 69 67 6e  ate some foreign
e1d0: 20 6b 65 79 73 20 74 68 61 74 20 75 73 65 20 74   keys that use t
e1e0: 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
e1f0: 6e 20 2d 20 22 4e 4f 20 41 43 54 49 4f 4e 22 0a  n - "NO ACTION".
e200: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e210: 20 63 68 69 6c 64 35 28 61 2c 20 62 20 52 45 46   child5(a, b REF
e220: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
e230: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
e240: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
e250: 42 4c 45 20 63 68 69 6c 64 36 28 61 2c 20 62 20  BLE child6(a, b 
e260: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
e270: 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54  t ON DELETE REST
e280: 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54  RICT);.    CREAT
e290: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 37 28 61  E TABLE child7(a
e2a0: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  , b REFERENCES p
e2b0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
e2c0: 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 20 20 20 20  NO ACTION);.    
e2d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
e2e0: 6c 64 38 28 61 2c 20 62 20 52 45 46 45 52 45 4e  ld8(a, b REFEREN
e2f0: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
e300: 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b  DATE NO ACTION);
e310: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61  .  }.} {}..forea
e320: 63 68 20 7b 74 6e 20 7a 54 61 62 20 6c 52 65 73  ch {tn zTab lRes
e330: 7d 20 7b 0a 20 20 32 20 63 68 69 6c 64 31 20 7b  } {.  2 child1 {
e340: 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20  0 0 parent b {} 
e350: 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53 54  {NO ACTION} REST
e360: 52 49 43 54 20 4e 4f 4e 45 7d 0a 20 20 33 20 63  RICT NONE}.  3 c
e370: 68 69 6c 64 32 20 7b 30 20 30 20 70 61 72 65 6e  hild2 {0 0 paren
e380: 74 20 62 20 7b 7d 20 52 45 53 54 52 49 43 54 20  t b {} RESTRICT 
e390: 7b 53 45 54 20 4e 55 4c 4c 7d 20 4e 4f 4e 45 7d  {SET NULL} NONE}
e3a0: 0a 20 20 34 20 63 68 69 6c 64 33 20 7b 30 20 30  .  4 child3 {0 0
e3b0: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53 45   parent b {} {SE
e3c0: 54 20 4e 55 4c 4c 7d 20 7b 53 45 54 20 44 45 46  T NULL} {SET DEF
e3d0: 41 55 4c 54 7d 20 4e 4f 4e 45 7d 0a 20 20 35 20  AULT} NONE}.  5 
e3e0: 63 68 69 6c 64 34 20 7b 30 20 30 20 70 61 72 65  child4 {0 0 pare
e3f0: 6e 74 20 62 20 7b 7d 20 7b 53 45 54 20 44 45 46  nt b {} {SET DEF
e400: 41 55 4c 54 7d 20 43 41 53 43 41 44 45 20 4e 4f  AULT} CASCADE NO
e410: 4e 45 7d 0a 20 20 36 20 63 68 69 6c 64 35 20 7b  NE}.  6 child5 {
e420: 30 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20  0 0 parent b {} 
e430: 43 41 53 43 41 44 45 20 7b 4e 4f 20 41 43 54 49  CASCADE {NO ACTI
e440: 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 37 20 63 68  ON} NONE}.  7 ch
e450: 69 6c 64 36 20 7b 30 20 30 20 70 61 72 65 6e 74  ild6 {0 0 parent
e460: 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e   b {} {NO ACTION
e470: 7d 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d  } RESTRICT NONE}
e480: 0a 20 20 38 20 63 68 69 6c 64 37 20 7b 30 20 30  .  8 child7 {0 0
e490: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f   parent b {} {NO
e4a0: 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54   ACTION} {NO ACT
e4b0: 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 39 20 63  ION} NONE}.  9 c
e4c0: 68 69 6c 64 38 20 7b 30 20 30 20 70 61 72 65 6e  hild8 {0 0 paren
e4d0: 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f  t b {} {NO ACTIO
e4e0: 4e 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e  N} {NO ACTION} N
e4f0: 4f 4e 45 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  ONE}.} {.  do_te
e500: 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e 24 74 6e  st e_fkey-40.$tn
e510: 20 7b 20 65 78 65 63 73 71 6c 20 22 50 52 41 47   { execsql "PRAG
e520: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c  MA foreign_key_l
e530: 69 73 74 28 24 7a 54 61 62 29 22 20 7d 20 24 6c  ist($zTab)" } $l
e540: 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  Res.}..#--------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e590: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 22 4e  -.# Test that "N
e5a0: 4f 20 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20  O ACTION" means 
e5b0: 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 68 61 70  that nothing hap
e5c0: 70 65 6e 73 20 74 6f 20 61 20 63 68 69 6c 64 20  pens to a child 
e5d0: 72 6f 77 20 77 68 65 6e 0a 23 20 69 74 27 73 20  row when.# it's 
e5e0: 70 61 72 65 6e 74 20 72 6f 77 20 69 73 20 75 70  parent row is up
e5f0: 64 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  dated or deleted
e600: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
e610: 46 3a 20 52 2d 31 39 39 37 31 2d 35 34 39 37 36  F: R-19971-54976
e620: 20 43 6f 6e 66 69 67 75 72 69 6e 67 20 22 4e 4f   Configuring "NO
e630: 20 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20 6a   ACTION" means j
e640: 75 73 74 20 74 68 61 74 3a 0a 23 20 77 68 65 6e  ust that:.# when
e650: 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73   a parent key is
e660: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c   modified or del
e670: 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
e680: 74 61 62 61 73 65 2c 20 6e 6f 20 73 70 65 63 69  tabase, no speci
e690: 61 6c 0a 23 20 61 63 74 69 6f 6e 20 69 73 20 74  al.# action is t
e6a0: 61 6b 65 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  aken..#.drop_all
e6b0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
e6c0: 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20 20  e_fkey-41.1 {.  
e6d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
e6e0: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
e6f0: 74 28 70 31 2c 20 70 32 2c 20 50 52 49 4d 41 52  t(p1, p2, PRIMAR
e700: 59 20 4b 45 59 28 70 31 2c 20 70 32 29 29 3b 0a  Y KEY(p1, p2));.
e710: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e720: 20 63 68 69 6c 64 28 63 31 2c 20 63 32 2c 20 0a   child(c1, c2, .
e730: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
e740: 59 28 63 31 2c 20 63 32 29 20 52 45 46 45 52 45  Y(c1, c2) REFERE
e750: 4e 43 45 53 20 70 61 72 65 6e 74 0a 20 20 20 20  NCES parent.    
e760: 20 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41    ON UPDATE NO A
e770: 43 54 49 4f 4e 0a 20 20 20 20 20 20 4f 4e 20 44  CTION.      ON D
e780: 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a  ELETE NO ACTION.
e790: 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45        DEFERRABLE
e7a0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
e7b0: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 49  RED.    );.    I
e7c0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
e7d0: 74 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b  t VALUES('j', 'k
e7e0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
e7f0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
e800: 53 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 20  S('l', 'm');.   
e810: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
e820: 6c 64 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27  ld VALUES('j', '
e830: 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  k');.    INSERT 
e840: 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45  INTO child VALUE
e850: 53 28 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 7d  S('l', 'm');.  }
e860: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
e870: 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65 78  fkey-41.2 {.  ex
e880: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
e890: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
e8a0: 70 61 72 65 6e 74 20 53 45 54 20 70 31 3d 27 6b  parent SET p1='k
e8b0: 27 20 57 48 45 52 45 20 70 31 3d 27 6a 27 3b 0a  ' WHERE p1='j';.
e8c0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
e8d0: 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20 70  M parent WHERE p
e8e0: 31 3d 27 6c 27 3b 0a 20 20 20 20 20 20 53 45 4c  1='l';.      SEL
e8f0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64  ECT * FROM child
e900: 3b 0a 20 20 7d 0a 7d 20 7b 6a 20 6b 20 6c 20 6d  ;.  }.} {j k l m
e910: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
e920: 2d 34 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -41.3 {.  catchs
e930: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
e940: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
e950: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
e960: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
e970: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
e980: 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 0a 23  ROLLBACK.} {}..#
e990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
e9e0: 20 74 68 61 74 20 22 52 45 53 54 52 49 43 54 22   that "RESTRICT"
e9f0: 20 6d 65 61 6e 73 20 74 68 65 20 61 70 70 6c 69   means the appli
ea00: 63 61 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62  cation is prohib
ea10: 69 74 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69  ited from deleti
ea20: 6e 67 0a 23 20 6f 72 20 75 70 64 61 74 69 6e 67  ng.# or updating
ea30: 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20   a parent table 
ea40: 72 6f 77 20 77 68 65 6e 20 74 68 65 72 65 20 65  row when there e
ea50: 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
ea60: 65 20 63 68 69 6c 64 20 6b 65 79 73 0a 23 20 6d  e child keys.# m
ea70: 61 70 70 65 64 20 74 6f 20 69 74 2e 0a 23 0a 23  apped to it..#.#
ea80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ea90: 30 34 32 37 32 2d 33 38 36 35 33 20 54 68 65 20  04272-38653 The 
eaa0: 22 52 45 53 54 52 49 43 54 22 20 61 63 74 69 6f  "RESTRICT" actio
eab0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  n means that the
eac0: 0a 23 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  .# application i
ead0: 73 20 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f  s prohibited fro
eae0: 6d 20 64 65 6c 65 74 69 6e 67 20 28 66 6f 72 20  m deleting (for 
eaf0: 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
eb00: 43 54 29 20 6f 72 0a 23 20 6d 6f 64 69 66 79 69  CT) or.# modifyi
eb10: 6e 67 20 28 66 6f 72 20 4f 4e 20 55 50 44 41 54  ng (for ON UPDAT
eb20: 45 20 52 45 53 54 52 49 43 54 29 20 61 20 70 61  E RESTRICT) a pa
eb30: 72 65 6e 74 20 6b 65 79 20 77 68 65 6e 20 74 68  rent key when th
eb40: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 23  ere exists one.#
eb50: 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b   or more child k
eb60: 65 79 73 20 6d 61 70 70 65 64 20 74 6f 20 69 74  eys mapped to it
eb70: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
eb80: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
eb90: 65 79 2d 34 31 2e 31 20 7b 0a 20 20 65 78 65 63  ey-41.1 {.  exec
eba0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
ebb0: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 70 31   TABLE parent(p1
ebc0: 2c 20 70 32 29 3b 0a 20 20 20 20 43 52 45 41 54  , p2);.    CREAT
ebd0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70  E UNIQUE INDEX p
ebe0: 61 72 65 6e 74 5f 69 20 4f 4e 20 70 61 72 65 6e  arent_i ON paren
ebf0: 74 28 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 43  t(p1, p2);.    C
ec00: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
ec10: 64 31 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20  d1(c1, c2, .    
ec20: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32    FOREIGN KEY(c2
ec30: 2c 20 63 31 29 20 52 45 46 45 52 45 4e 43 45 53  , c1) REFERENCES
ec40: 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20   parent(p1, p2) 
ec50: 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
ec60: 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  CT.    );.    CR
ec70: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
ec80: 32 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20  2(c1, c2, .     
ec90: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32 2c   FOREIGN KEY(c2,
eca0: 20 63 31 29 20 52 45 46 45 52 45 4e 43 45 53 20   c1) REFERENCES 
ecb0: 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20 4f  parent(p1, p2) O
ecc0: 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43  N UPDATE RESTRIC
ecd0: 54 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  T.    );.  }.} {
ece0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
ecf0: 2d 34 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -41.2 {.  execsq
ed00: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
ed10: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
ed20: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
ed30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
ed40: 65 6e 74 20 56 41 4c 55 45 53 28 27 63 27 2c 20  ent VALUES('c', 
ed50: 27 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'd');.    INSERT
ed60: 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c   INTO child1 VAL
ed70: 55 45 53 28 27 62 27 2c 20 27 61 27 29 3b 0a 20  UES('b', 'a');. 
ed80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
ed90: 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27 64 27  hild2 VALUES('d'
eda0: 2c 20 27 63 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  , 'c');.  }.} {}
edb0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
edc0: 34 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71  41.3 {.  catchsq
edd0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
ede0: 70 61 72 65 6e 74 20 57 48 45 52 45 20 70 31 20  parent WHERE p1 
edf0: 3d 20 27 61 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f  = 'a' }.} {1 {FO
ee00: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
ee10: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
ee20: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e  _test e_fkey-41.
ee30: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
ee40: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
ee50: 45 54 20 70 32 20 3d 20 27 65 27 20 57 48 45 52  ET p2 = 'e' WHER
ee60: 45 20 70 31 20 3d 20 27 63 27 20 7d 0a 7d 20 7b  E p1 = 'c' }.} {
ee70: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
ee80: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
ee90: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
eee0: 20 54 65 73 74 20 74 68 61 74 20 52 45 53 54 52   Test that RESTR
eef0: 49 43 54 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ICT is slightly 
ef00: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 4e  different from N
ef10: 4f 20 41 43 54 49 4f 4e 20 66 6f 72 20 49 4d 4d  O ACTION for IMM
ef20: 45 44 49 41 54 45 0a 23 20 63 6f 6e 73 74 72 61  EDIATE.# constra
ef30: 69 6e 74 73 2c 20 69 6e 20 74 68 61 74 20 69 74  ints, in that it
ef40: 20 69 73 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d   is enforced imm
ef50: 65 64 69 61 74 65 6c 79 2c 20 6e 6f 74 20 61 74  ediately, not at
ef60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ef70: 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a  .# statement..#.
ef80: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
ef90: 2d 33 37 39 39 37 2d 34 32 31 38 37 20 54 68 65  -37997-42187 The
efa0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
efb0: 65 65 6e 20 74 68 65 20 65 66 66 65 63 74 20 6f  een the effect o
efc0: 66 20 61 0a 23 20 52 45 53 54 52 49 43 54 20 61  f a.# RESTRICT a
efd0: 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 72 6d 61 6c  ction and normal
efe0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
eff0: 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d  straint enforcem
f000: 65 6e 74 20 69 73 20 74 68 61 74 0a 23 20 74 68  ent is that.# th
f010: 65 20 52 45 53 54 52 49 43 54 20 61 63 74 69 6f  e RESTRICT actio
f020: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 70  n processing hap
f030: 70 65 6e 73 20 61 73 20 73 6f 6f 6e 20 61 73 20  pens as soon as 
f040: 74 68 65 20 66 69 65 6c 64 20 69 73 20 75 70 64  the field is upd
f050: 61 74 65 64 0a 23 20 2d 20 6e 6f 74 20 61 74 20  ated.# - not at 
f060: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
f070: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
f080: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 77 69 74   as it would wit
f090: 68 20 61 6e 0a 23 20 69 6d 6d 65 64 69 61 74 65  h an.# immediate
f0a0: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20   constraint, or 
f0b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
f0c0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
f0d0: 63 74 69 6f 6e 20 61 73 20 69 74 0a 23 20 77 6f  ction as it.# wo
f0e0: 75 6c 64 20 77 69 74 68 20 61 20 64 65 66 65 72  uld with a defer
f0f0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  red constraint..
f100: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
f110: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
f120: 2d 34 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -42.1 {.  execsq
f130: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
f140: 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52  ABLE parent(x PR
f150: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
f160: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f170: 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld1(c REFERENCES
f180: 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
f190: 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20  E RESTRICT);.   
f1a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
f1b0: 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45  ild2(c REFERENCE
f1c0: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
f1d0: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a  TE NO ACTION);..
f1e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f1f0: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
f200: 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey1');.    INSER
f210: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
f220: 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20  LUES('key2');.  
f230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
f240: 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79  ild1 VALUES('key
f250: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
f260: 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55  INTO child2 VALU
f270: 45 53 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20  ES('key2');..   
f280: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
f290: 70 61 72 65 6e 74 5f 74 20 41 46 54 45 52 20 55  parent_t AFTER U
f2a0: 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20  PDATE ON parent 
f2b0: 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41  BEGIN.      UPDA
f2c0: 54 45 20 63 68 69 6c 64 31 20 73 65 74 20 63 20  TE child1 set c 
f2d0: 3d 20 6e 65 77 2e 78 20 57 48 45 52 45 20 63 20  = new.x WHERE c 
f2e0: 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20 55  = old.x;.      U
f2f0: 50 44 41 54 45 20 63 68 69 6c 64 32 20 73 65 74  PDATE child2 set
f300: 20 63 20 3d 20 6e 65 77 2e 78 20 57 48 45 52 45   c = new.x WHERE
f310: 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20   c = old.x;.    
f320: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  END;.  }.} {}.do
f330: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f340: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
f350: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
f360: 45 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27  ET x = 'key one'
f370: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31   WHERE x = 'key1
f380: 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ' }.} {1 {FOREIG
f390: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
f3a0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
f3b0: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 33 20 7b 0a  t e_fkey-42.3 {.
f3c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
f3d0: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
f3e0: 45 54 20 78 20 3d 20 27 6b 65 79 20 74 77 6f 27  ET x = 'key two'
f3f0: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32   WHERE x = 'key2
f400: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
f410: 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20 7d  FROM child2;.  }
f420: 0a 7d 20 7b 7b 6b 65 79 20 74 77 6f 7d 7d 0a 0a  .} {{key two}}..
f430: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
f440: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f450: 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.4 {.  execsql 
f460: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
f470: 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
f480: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
f490: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
f4a0: 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(c REFERENCES p
f4b0: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
f4c0: 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
f4d0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
f4e0: 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d2(c REFERENCES 
f4f0: 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45  parent ON DELETE
f500: 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20   NO ACTION);..  
f510: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
f520: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f530: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
f540: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f550: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
f560: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
f570: 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  d1 VALUES('key1'
f580: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f590: 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
f5a0: 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20 43  ('key2');..    C
f5b0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 70 61  REATE TRIGGER pa
f5c0: 72 65 6e 74 5f 74 20 41 46 54 45 52 20 44 45 4c  rent_t AFTER DEL
f5d0: 45 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45  ETE ON parent BE
f5e0: 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45  GIN.      UPDATE
f5f0: 20 63 68 69 6c 64 31 20 53 45 54 20 63 20 3d 20   child1 SET c = 
f600: 4e 55 4c 4c 20 57 48 45 52 45 20 63 20 3d 20 6f  NULL WHERE c = o
f610: 6c 64 2e 78 3b 0a 20 20 20 20 20 20 55 50 44 41  ld.x;.      UPDA
f620: 54 45 20 63 68 69 6c 64 32 20 53 45 54 20 63 20  TE child2 SET c 
f630: 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 63 20 3d  = NULL WHERE c =
f640: 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 45 4e 44 3b   old.x;.    END;
f650: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
f660: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 35 20 7b 0a  t e_fkey-42.5 {.
f670: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
f680: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
f690: 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27  WHERE x = 'key1'
f6a0: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
f6b0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
f6c0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
f6d0: 20 65 5f 66 6b 65 79 2d 34 32 2e 36 20 7b 0a 20   e_fkey-42.6 {. 
f6e0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
f6f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
f700: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65  nt WHERE x = 'ke
f710: 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  y2';.    SELECT 
f720: 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20  * FROM child2;. 
f730: 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 64 72 6f 70 5f   }.} {{}}..drop_
f740: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
f750: 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 37 20 7b  st e_fkey-42.7 {
f760: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f770: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
f780: 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b  rent(x PRIMARY K
f790: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
f7a0: 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52  TABLE child1(c R
f7b0: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
f7c0: 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52   ON DELETE RESTR
f7d0: 49 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ICT);.    CREATE
f7e0: 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20   TABLE child2(c 
f7f0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
f800: 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41  t ON DELETE NO A
f810: 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53  CTION);..    INS
f820: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
f830: 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a  VALUES('key1');.
f840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f850: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
f860: 65 79 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey2');.    INSER
f870: 54 20 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41  T INTO child1 VA
f880: 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20  LUES('key1');.  
f890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
f8a0: 69 6c 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79  ild2 VALUES('key
f8b0: 32 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  2');.  }.} {}.do
f8c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f8d0: 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  8 {.  catchsql {
f8e0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 61   REPLACE INTO pa
f8f0: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f900: 31 27 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  1') }.} {1 {FORE
f910: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
f920: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
f930: 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 39 20  est e_fkey-42.9 
f940: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
f950: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
f960: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
f970: 65 79 32 27 29 3b 0a 20 20 20 20 53 45 4c 45 43  ey2');.    SELEC
f980: 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b  T * FROM child2;
f990: 0a 20 20 7d 0a 7d 20 7b 6b 65 79 32 7d 0a 0a 23  .  }.} {key2}..#
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
f9f0: 20 74 68 61 74 20 52 45 53 54 52 49 43 54 20 69   that RESTRICT i
fa00: 73 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65 64  s enforced immed
fa10: 69 61 74 65 6c 79 2c 20 65 76 65 6e 20 66 6f 72  iately, even for
fa20: 20 61 20 44 45 46 45 52 52 45 44 20 63 6f 6e 73   a DEFERRED cons
fa30: 74 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44  traint..#.# EVID
fa40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 31 37 39  ENCE-OF: R-24179
fa50: 2d 36 30 35 32 33 20 45 76 65 6e 20 69 66 20 74  -60523 Even if t
fa60: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
fa70: 6f 6e 73 74 72 61 69 6e 74 20 69 74 20 69 73 0a  onstraint it is.
fa80: 23 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 73  # attached to is
fa90: 20 64 65 66 65 72 72 65 64 2c 20 63 6f 6e 66 69   deferred, confi
faa0: 67 75 72 69 6e 67 20 61 20 52 45 53 54 52 49 43  guring a RESTRIC
fab0: 54 20 61 63 74 69 6f 6e 20 63 61 75 73 65 73 20  T action causes 
fac0: 53 51 4c 69 74 65 0a 23 20 74 6f 20 72 65 74 75  SQLite.# to retu
fad0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
fae0: 64 69 61 74 65 6c 79 20 69 66 20 61 20 70 61 72  diately if a par
faf0: 65 6e 74 20 6b 65 79 20 77 69 74 68 20 64 65 70  ent key with dep
fb00: 65 6e 64 65 6e 74 20 63 68 69 6c 64 0a 23 20 6b  endent child.# k
fb10: 65 79 73 20 69 73 20 64 65 6c 65 74 65 64 20 6f  eys is deleted o
fb20: 72 20 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 64 72  r modified..#.dr
fb30: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
fb40: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
fb50: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
fb60: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fb70: 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52   parent(x PRIMAR
fb80: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
fb90: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28  TE TABLE child1(
fba0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  c REFERENCES par
fbb0: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45  ent ON UPDATE RE
fbc0: 53 54 52 49 43 54 0a 20 20 20 20 20 20 44 45 46  STRICT.      DEF
fbd0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
fbe0: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
fbf0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
fc00: 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45  LE child2(c REFE
fc10: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
fc20: 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f   UPDATE NO ACTIO
fc30: 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42  N.      DEFERRAB
fc40: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
fc50: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20  ERRED.    );..  
fc60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
fc70: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
fc80: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
fc90: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
fca0: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
fcb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
fcc0: 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  d1 VALUES('key1'
fcd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
fce0: 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
fcf0: 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42 45  ('key2');.    BE
fd00: 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  GIN;.  }.} {}.do
fd10: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
fd20: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
fd30: 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53   UPDATE parent S
fd40: 45 54 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27  ET x = 'key one'
fd50: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31   WHERE x = 'key1
fd60: 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ' }.} {1 {FOREIG
fd70: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
fd80: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
fd90: 74 20 65 5f 66 6b 65 79 2d 34 33 2e 33 20 7b 0a  t e_fkey-43.3 {.
fda0: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
fdb0: 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20  TE parent SET x 
fdc0: 3d 20 27 6b 65 79 20 74 77 6f 27 20 57 48 45 52  = 'key two' WHER
fdd0: 45 20 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d  E x = 'key2' }.}
fde0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
fdf0: 65 79 2d 34 33 2e 34 20 7b 0a 20 20 63 61 74 63  ey-43.4 {.  catc
fe00: 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
fe10: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
fe20: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
fe30: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
fe40: 2d 34 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -43.5 {.  execsq
fe50: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63  l {.    UPDATE c
fe60: 68 69 6c 64 32 20 53 45 54 20 63 20 3d 20 27 6b  hild2 SET c = 'k
fe70: 65 79 20 74 77 6f 27 3b 0a 20 20 20 20 43 4f 4d  ey two';.    COM
fe80: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  MIT;.  }.} {}..d
fe90: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
fea0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
feb0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
fec0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fed0: 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
fee0: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
fef0: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
ff00: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
ff10: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52  rent ON DELETE R
ff20: 45 53 54 52 49 43 54 0a 20 20 20 20 20 20 44 45  ESTRICT.      DE
ff30: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
ff40: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20  LY DEFERRED.    
ff50: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
ff60: 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46  BLE child2(c REF
ff70: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
ff80: 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49  N DELETE NO ACTI
ff90: 4f 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41  ON.      DEFERRA
ffa0: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
ffb0: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20  FERRED.    );.. 
ffc0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
ffd0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65  arent VALUES('ke
ffe0: 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  y1');.    INSERT
fff0: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
10000 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20  UES('key2');.   
10010 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
10020 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ld1 VALUES('key1
10030 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
10040 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45  NTO child2 VALUE
10050 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42  S('key2');.    B
10060 45 47 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  EGIN;.  }.} {}.d
10070 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33  o_test e_fkey-43
10080 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .7 {.  catchsql 
10090 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61  { DELETE FROM pa
100a0 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27  rent WHERE x = '
100b0 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f  key1' }.} {1 {FO
100c0 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
100d0 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
100e0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e  _test e_fkey-43.
100f0 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  8 {.  execsql { 
10100 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
10110 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65  nt WHERE x = 'ke
10120 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  y2' }.} {}.do_te
10130 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 39 20 7b  st e_fkey-43.9 {
10140 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
10150 49 54 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  IT.} {1 {FOREIGN
10160 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
10170 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
10180 20 65 5f 66 6b 65 79 2d 34 33 2e 31 30 20 7b 0a   e_fkey-43.10 {.
10190 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
101a0 55 50 44 41 54 45 20 63 68 69 6c 64 32 20 53 45  UPDATE child2 SE
101b0 54 20 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  T c = NULL;.    
101c0 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
101d0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
10220 65 73 74 20 53 45 54 20 4e 55 4c 4c 20 61 63 74  est SET NULL act
10230 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
10240 43 45 2d 4f 46 3a 20 52 2d 30 33 33 35 33 2d 30  CE-OF: R-03353-0
10250 35 33 32 37 20 49 66 20 74 68 65 20 63 6f 6e 66  5327 If the conf
10260 69 67 75 72 65 64 20 61 63 74 69 6f 6e 20 69 73  igured action is
10270 20 22 53 45 54 20 4e 55 4c 4c 22 2c 0a 23 20 74   "SET NULL",.# t
10280 68 65 6e 20 77 68 65 6e 20 61 20 70 61 72 65 6e  hen when a paren
10290 74 20 6b 65 79 20 69 73 20 64 65 6c 65 74 65 64  t key is deleted
102a0 20 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20   (for ON DELETE 
102b0 53 45 54 20 4e 55 4c 4c 29 20 6f 72 20 6d 6f 64  SET NULL) or mod
102c0 69 66 69 65 64 0a 23 20 28 66 6f 72 20 4f 4e 20  ified.# (for ON 
102d0 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29  UPDATE SET NULL)
102e0 2c 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  , the child key 
102f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72  columns of all r
10300 6f 77 73 20 69 6e 20 74 68 65 0a 23 20 63 68 69  ows in the.# chi
10310 6c 64 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  ld table that ma
10320 70 70 65 64 20 74 6f 20 74 68 65 20 70 61 72 65  pped to the pare
10330 6e 74 20 6b 65 79 20 61 72 65 20 73 65 74 20 74  nt key are set t
10340 6f 20 63 6f 6e 74 61 69 6e 20 53 51 4c 20 4e 55  o contain SQL NU
10350 4c 4c 0a 23 20 76 61 6c 75 65 73 2e 0a 23 0a 64  LL.# values..#.d
10360 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
10370 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34  o_test e_fkey-44
10380 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
10390 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
103a0 45 20 70 41 28 78 20 50 52 49 4d 41 52 59 20 4b  E pA(x PRIMARY K
103b0 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
103c0 54 41 42 4c 45 20 63 41 28 63 20 52 45 46 45 52  TABLE cA(c REFER
103d0 45 4e 43 45 53 20 70 41 20 4f 4e 20 44 45 4c 45  ENCES pA ON DELE
103e0 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20  TE SET NULL);.  
103f0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
10400 42 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  B(c REFERENCES p
10410 41 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20  A ON UPDATE SET 
10420 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 49 4e 53 45  NULL);..    INSE
10430 52 54 20 49 4e 54 4f 20 70 41 20 56 41 4c 55 45  RT INTO pA VALUE
10440 53 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20  S(X'ABCD');.    
10450 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 20 56  INSERT INTO pA V
10460 41 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a  ALUES(X'1234');.
10470 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10480 63 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44  cA VALUES(X'ABCD
10490 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
104a0 4e 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27  NTO cB VALUES(X'
104b0 31 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  1234');.  }.} {}
104c0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
104d0 34 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  44.2 {.  execsql
104e0 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
104f0 4f 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77 69  OM pA WHERE rowi
10500 64 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43  d = 1;.    SELEC
10510 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20  T quote(x) FROM 
10520 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58 27 31 32 33  pA;.  }.} {X'123
10530 34 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  4'}.do_test e_fk
10540 65 79 2d 34 34 2e 33 20 7b 0a 20 20 65 78 65 63  ey-44.3 {.  exec
10550 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
10560 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63   quote(c) FROM c
10570 41 3b 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a  A;.  }.} {NULL}.
10580 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10590 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.4 {.  execsql 
105a0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 41 20  {.    UPDATE pA 
105b0 53 45 54 20 78 20 3d 20 58 27 38 37 36 35 27 20  SET x = X'8765' 
105c0 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32 3b  WHERE rowid = 2;
105d0 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74  .    SELECT quot
105e0 65 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20  e(x) FROM pA;.  
105f0 7d 0a 7d 20 7b 58 27 38 37 36 35 27 7d 0a 64 6f  }.} {X'8765'}.do
10600 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e  _test e_fkey-44.
10610 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
10620 53 45 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20  SELECT quote(c) 
10630 46 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b 4e 55 4c  FROM cB }.} {NUL
10640 4c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  L}..#-----------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10690 20 54 65 73 74 20 53 45 54 20 44 45 46 41 55 4c   Test SET DEFAUL
106a0 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45  T actions..#.# E
106b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
106c0 30 35 34 2d 35 34 38 33 32 20 54 68 65 20 22 53  054-54832 The "S
106d0 45 54 20 44 45 46 41 55 4c 54 22 20 61 63 74 69  ET DEFAULT" acti
106e0 6f 6e 73 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ons are similar 
106f0 74 6f 0a 23 20 22 53 45 54 20 4e 55 4c 4c 22 2c  to.# "SET NULL",
10700 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61 63   except that eac
10710 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  h of the child k
10720 65 79 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73 65  ey columns is se
10730 74 20 74 6f 0a 23 20 63 6f 6e 74 61 69 6e 20 74  t to.# contain t
10740 68 65 20 63 6f 6c 75 6d 6e 73 20 64 65 66 61 75  he columns defau
10750 6c 74 20 76 61 6c 75 65 20 69 6e 73 74 65 61 64  lt value instead
10760 20 6f 66 20 4e 55 4c 4c 2e 0a 23 0a 64 72 6f 70   of NULL..#.drop
10770 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
10780 65 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 31 20  est e_fkey-45.1 
10790 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
107a0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
107b0 41 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  A(x PRIMARY KEY)
107c0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
107d0 4c 45 20 63 41 28 63 20 44 45 46 41 55 4c 54 20  LE cA(c DEFAULT 
107e0 58 27 30 30 30 30 27 20 52 45 46 45 52 45 4e 43  X'0000' REFERENC
107f0 45 53 20 70 41 20 4f 4e 20 44 45 4c 45 54 45 20  ES pA ON DELETE 
10800 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 20 20  SET DEFAULT);.  
10810 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
10820 42 28 63 20 44 45 46 41 55 4c 54 20 58 27 39 39  B(c DEFAULT X'99
10830 39 39 27 20 52 45 46 45 52 45 4e 43 45 53 20 70  99' REFERENCES p
10840 41 20 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20  A ON UPDATE SET 
10850 44 45 46 41 55 4c 54 29 3b 0a 0a 20 20 20 20 49  DEFAULT);..    I
10860 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f  NSERT INTO pA(ro
10870 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 31  wid, x) VALUES(1
10880 2c 20 58 27 30 30 30 30 27 29 3b 0a 20 20 20 20  , X'0000');.    
10890 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72  INSERT INTO pA(r
108a0 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28  owid, x) VALUES(
108b0 32 2c 20 58 27 39 39 39 39 27 29 3b 0a 20 20 20  2, X'9999');.   
108c0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28   INSERT INTO pA(
108d0 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53  rowid, x) VALUES
108e0 28 33 2c 20 58 27 41 42 43 44 27 29 3b 0a 20 20  (3, X'ABCD');.  
108f0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41    INSERT INTO pA
10900 28 72 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45  (rowid, x) VALUE
10910 53 28 34 2c 20 58 27 31 32 33 34 27 29 3b 0a 0a  S(4, X'1234');..
10920 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10930 63 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44  cA VALUES(X'ABCD
10940 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
10950 4e 54 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27  NTO cB VALUES(X'
10960 31 32 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  1234');.  }.} {}
10970 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10980 34 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  45.2 {.  execsql
10990 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
109a0 4f 4d 20 70 41 20 57 48 45 52 45 20 72 6f 77 69  OM pA WHERE rowi
109b0 64 20 3d 20 33 3b 0a 20 20 20 20 53 45 4c 45 43  d = 3;.    SELEC
109c0 54 20 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20  T quote(x) FROM 
109d0 70 41 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  pA ORDER BY rowi
109e0 64 3b 0a 20 20 7d 0a 7d 20 7b 58 27 30 30 30 30  d;.  }.} {X'0000
109f0 27 20 58 27 39 39 39 39 27 20 58 27 31 32 33 34  ' X'9999' X'1234
10a00 27 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  '}.do_test e_fke
10a10 79 2d 34 35 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-45.3 {.  execs
10a20 71 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74  ql { SELECT quot
10a30 65 28 63 29 20 46 52 4f 4d 20 63 41 20 7d 0a 7d  e(c) FROM cA }.}
10a40 20 7b 58 27 30 30 30 30 27 7d 0a 64 6f 5f 74 65   {X'0000'}.do_te
10a50 73 74 20 65 5f 66 6b 65 79 2d 34 35 2e 34 20 7b  st e_fkey-45.4 {
10a60 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10a70 20 55 50 44 41 54 45 20 70 41 20 53 45 54 20 78   UPDATE pA SET x
10a80 20 3d 20 58 27 38 37 36 35 27 20 57 48 45 52 45   = X'8765' WHERE
10a90 20 72 6f 77 69 64 20 3d 20 34 3b 0a 20 20 20 20   rowid = 4;.    
10aa0 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
10ab0 46 52 4f 4d 20 70 41 20 4f 52 44 45 52 20 42 59  FROM pA ORDER BY
10ac0 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b 58   rowid;.  }.} {X
10ad0 27 30 30 30 30 27 20 58 27 39 39 39 39 27 20 58  '0000' X'9999' X
10ae0 27 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74 20  '8765'}.do_test 
10af0 65 5f 66 6b 65 79 2d 34 35 2e 35 20 7b 0a 20 20  e_fkey-45.5 {.  
10b00 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10b10 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63   quote(c) FROM c
10b20 42 20 7d 0a 7d 20 7b 58 27 39 39 39 39 27 7d 0a  B }.} {X'9999'}.
10b30 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
10b80 73 74 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  st ON DELETE CAS
10b90 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a  CADE actions..#.
10ba0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10bb0 2d 36 31 33 37 36 2d 35 37 32 36 37 20 41 20 22  -61376-57267 A "
10bc0 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 20  CASCADE" action 
10bd0 70 72 6f 70 61 67 61 74 65 73 20 74 68 65 20 64  propagates the d
10be0 65 6c 65 74 65 20 6f 72 0a 23 20 75 70 64 61 74  elete or.# updat
10bf0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  e operation on t
10c00 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 74 6f  he parent key to
10c10 20 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74 20   each dependent 
10c20 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 23 20 45  child key..#.# E
10c30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
10c40 38 30 39 2d 36 32 32 30 37 20 46 6f 72 20 61 6e  809-62207 For an
10c50 20 22 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43   "ON DELETE CASC
10c60 41 44 45 22 20 61 63 74 69 6f 6e 2c 20 74 68 69  ADE" action, thi
10c70 73 0a 23 20 6d 65 61 6e 73 20 74 68 61 74 20 65  s.# means that e
10c80 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 63  ach row in the c
10c90 68 69 6c 64 20 74 61 62 6c 65 20 74 68 61 74 20  hild table that 
10ca0 77 61 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  was associated w
10cb0 69 74 68 20 74 68 65 0a 23 20 64 65 6c 65 74 65  ith the.# delete
10cc0 64 20 70 61 72 65 6e 74 20 72 6f 77 20 69 73 20  d parent row is 
10cd0 61 6c 73 6f 20 64 65 6c 65 74 65 64 2e 0a 23 0a  also deleted..#.
10ce0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
10cf0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10d00 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
10d10 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10d20 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55  LE p1(a, b UNIQU
10d30 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
10d40 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
10d50 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 44 45  NCES p1(b) ON DE
10d60 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20 64 29  LETE CASCADE, d)
10d70 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10d80 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O p1 VALUES(NULL
10d90 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
10da0 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
10db0 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(4, 4);.    IN
10dc0 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10dd0 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49  UES(5, 5);.    I
10de0 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10df0 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
10e00 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10e10 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O c1 VALUES(4, 4
10e20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10e30 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20  TO c1 VALUES(5, 
10e40 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  5);.    SELECT c
10e50 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b  ount(*) FROM c1;
10e60 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65  .  }.} {3}.do_te
10e70 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 32 20 7b  st e_fkey-46.2 {
10e80 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10e90 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 20   DELETE FROM p1 
10ea0 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20  WHERE a = 4;.   
10eb0 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
10ec0 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  M c1;.  }.} {{} 
10ed0 7b 7d 20 35 20 35 7d 0a 64 6f 5f 74 65 73 74 20  {} 5 5}.do_test 
10ee0 65 5f 66 6b 65 79 2d 34 36 2e 33 20 7b 0a 20 20  e_fkey-46.3 {.  
10ef0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
10f00 4c 45 54 45 20 46 52 4f 4d 20 70 31 3b 0a 20 20  LETE FROM p1;.  
10f10 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52    SELECT d, c FR
10f20 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  OM c1;.  }.} {{}
10f30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}}.do_test e_f
10f40 6b 65 79 2d 34 36 2e 34 20 7b 0a 20 20 65 78 65  key-46.4 {.  exe
10f50 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10f60 46 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b 7d 0a 0a  FROM p1 }.} {}..
10f70 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
10fc0 73 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  st ON UPDATE CAS
10fd0 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a  CADE actions..#.
10fe0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10ff0 2d 31 33 38 37 37 2d 36 34 35 34 32 20 46 6f 72  -13877-64542 For
11000 20 61 6e 20 22 4f 4e 20 55 50 44 41 54 45 20 43   an "ON UPDATE C
11010 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 2c 20  ASCADE" action, 
11020 69 74 20 6d 65 61 6e 73 0a 23 20 74 68 61 74 20  it means.# that 
11030 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
11040 64 20 69 6e 20 65 61 63 68 20 64 65 70 65 6e 64  d in each depend
11050 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 20 61 72  ent child key ar
11060 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 0a 23 20  e modified to.# 
11070 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 70 61  match the new pa
11080 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 2e  rent key values.
11090 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
110a0 3a 20 52 2d 36 31 33 37 36 2d 35 37 32 36 37 20  : R-61376-57267 
110b0 41 20 22 43 41 53 43 41 44 45 22 20 61 63 74 69  A "CASCADE" acti
110c0 6f 6e 20 70 72 6f 70 61 67 61 74 65 73 20 74 68  on propagates th
110d0 65 20 64 65 6c 65 74 65 20 6f 72 0a 23 20 75 70  e delete or.# up
110e0 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f  date operation o
110f0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  n the parent key
11100 20 74 6f 20 65 61 63 68 20 64 65 70 65 6e 64 65   to each depende
11110 6e 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a  nt child key..#.
11120 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
11130 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
11140 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
11150 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
11160 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55  LE p1(a, b UNIQU
11170 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
11180 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
11190 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 55 50  NCES p1(b) ON UP
111a0 44 41 54 45 20 43 41 53 43 41 44 45 2c 20 64 29  DATE CASCADE, d)
111b0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
111c0 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O p1 VALUES(NULL
111d0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
111e0 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
111f0 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(4, 4);.    IN
11200 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
11210 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49  UES(5, 5);.    I
11220 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
11230 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
11240 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11250 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O c1 VALUES(4, 4
11260 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11270 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20  TO c1 VALUES(5, 
11280 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  5);.    SELECT c
11290 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b  ount(*) FROM c1;
112a0 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65  .  }.} {3}.do_te
112b0 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 32 20 7b  st e_fkey-47.2 {
112c0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
112d0 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20 62   UPDATE p1 SET b
112e0 20 3d 20 31 30 20 57 48 45 52 45 20 62 20 3d 20   = 10 WHERE b = 
112f0 35 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c  5;.    SELECT d,
11300 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   c FROM c1;.  }.
11310 7d 20 7b 7b 7d 20 7b 7d 20 34 20 34 20 35 20 31  } {{} {} 4 4 5 1
11320 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  0}.do_test e_fke
11330 79 2d 34 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-47.3 {.  execs
11340 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
11350 70 31 20 53 45 54 20 62 20 3d 20 31 31 20 57 48  p1 SET b = 11 WH
11360 45 52 45 20 62 20 3d 20 34 3b 0a 20 20 20 20 53  ERE b = 4;.    S
11370 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20  ELECT d, c FROM 
11380 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
11390 20 34 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74   4 11 5 10}.do_t
113a0 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 34 20  est e_fkey-47.4 
113b0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
113c0 20 20 20 55 50 44 41 54 45 20 70 31 20 53 45 54     UPDATE p1 SET
113d0 20 62 20 3d 20 36 20 57 48 45 52 45 20 62 20 49   b = 6 WHERE b I
113e0 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45  S NULL;.    SELE
113f0 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b  CT d, c FROM c1;
11400 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20  .  }.} {{} {} 4 
11410 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74  11 5 10}.do_test
11420 20 65 5f 66 6b 65 79 2d 34 36 2e 35 20 7b 0a 20   e_fkey-46.5 {. 
11430 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
11440 54 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d 20  T * FROM p1 }.} 
11450 7b 7b 7d 20 36 20 34 20 31 31 20 35 20 31 30 7d  {{} 6 4 11 5 10}
11460 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
114b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
114c0 30 35 38 2d 35 37 31 35 38 0a 23 0a 23 20 54 65  058-57158.#.# Te
114d0 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
114e0 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54  om the "ON DELET
114f0 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
11500 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e  Actions" section
11510 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65   .# of foreignke
11520 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f  ys.html..#.drop_
11530 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
11540 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 31 20 7b  st e_fkey-48.1 {
11550 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11560 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72   CREATE TABLE ar
11570 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69  tist(.      arti
11580 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20  stid    INTEGER 
11590 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20  PRIMARY KEY, .  
115a0 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20      artistname  
115b0 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  TEXT.    );.    
115c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61  CREATE TABLE tra
115d0 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69  ck(.      tracki
115e0 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20  d     INTEGER,. 
115f0 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
11600 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
11610 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
11620 52 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  R REFERENCES art
11630 69 73 74 28 61 72 74 69 73 74 69 64 29 20 4f 4e  ist(artistid) ON
11640 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a   UPDATE CASCADE.
11650 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45      );..    INSE
11660 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
11670 41 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d  ALUES(1, 'Dean M
11680 61 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  artin');.    INS
11690 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
116a0 56 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b  VALUES(2, 'Frank
116b0 20 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20   Sinatra');.    
116c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
116d0 6b 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68  k VALUES(11, 'Th
116e0 61 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29  at''s Amore', 1)
116f0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11700 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
11710 32 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c  2, 'Christmas Bl
11720 75 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ues', 1);.    IN
11730 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
11740 56 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57  VALUES(13, 'My W
11750 61 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ay', 2);.  }.} {
11760 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
11770 2d 34 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -48.2 {.  execsq
11780 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  l {.    UPDATE a
11790 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74  rtist SET artist
117a0 69 64 20 3d 20 31 30 30 20 57 48 45 52 45 20 61  id = 100 WHERE a
117b0 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 44 65 61  rtistname = 'Dea
117c0 6e 20 4d 61 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d  n Martin';.  }.}
117d0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
117e0 65 79 2d 34 38 2e 33 20 7b 0a 20 20 65 78 65 63  ey-48.3 {.  exec
117f0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
11800 52 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b  ROM artist }.} {
11810 32 20 7b 46 72 61 6e 6b 20 53 69 6e 61 74 72 61  2 {Frank Sinatra
11820 7d 20 31 30 30 20 7b 44 65 61 6e 20 4d 61 72 74  } 100 {Dean Mart
11830 69 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  in}}.do_test e_f
11840 6b 65 79 2d 34 38 2e 34 20 7b 0a 20 20 65 78 65  key-48.4 {.  exe
11850 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
11860 46 52 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b  FROM track }.} {
11870 31 31 20 7b 54 68 61 74 27 73 20 41 6d 6f 72 65  11 {That's Amore
11880 7d 20 31 30 30 20 31 32 20 7b 43 68 72 69 73 74  } 100 12 {Christ
11890 6d 61 73 20 42 6c 75 65 73 7d 20 31 30 30 20 31  mas Blues} 100 1
118a0 33 20 7b 4d 79 20 57 61 79 7d 20 32 7d 0a 0a 0a  3 {My Way} 2}...
118b0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72  ----------.# Ver
11900 69 66 79 20 74 68 61 74 20 61 64 64 69 6e 67 20  ify that adding 
11910 61 6e 20 46 4b 20 61 63 74 69 6f 6e 20 64 6f 65  an FK action doe
11920 73 20 6e 6f 74 20 61 62 73 6f 6c 76 65 20 74 68  s not absolve th
11930 65 20 75 73 65 72 20 6f 66 20 74 68 65 20 0a 23  e user of the .#
11940 20 72 65 71 75 69 72 65 6d 65 6e 74 20 6e 6f 74   requirement not
11950 20 74 6f 20 76 69 6f 6c 61 74 65 20 74 68 65 20   to violate the 
11960 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
11970 74 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44  traint..#.# EVID
11980 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 36 38  ENCE-OF: R-53968
11990 2d 35 31 36 34 32 20 43 6f 6e 66 69 67 75 72 69  -51642 Configuri
119a0 6e 67 20 61 6e 20 4f 4e 20 55 50 44 41 54 45 20  ng an ON UPDATE 
119b0 6f 72 20 4f 4e 20 44 45 4c 45 54 45 0a 23 20 61  or ON DELETE.# a
119c0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
119d0 65 61 6e 20 74 68 61 74 20 74 68 65 20 66 6f 72  ean that the for
119e0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
119f0 69 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  int does not nee
11a00 64 20 74 6f 0a 23 20 62 65 20 73 61 74 69 73 66  d to.# be satisf
11a10 69 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ied..#.drop_all_
11a20 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
11a30 5f 66 6b 65 79 2d 34 39 2e 31 20 7b 0a 20 20 65  _fkey-49.1 {.  e
11a40 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
11a50 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
11a60 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
11a70 65 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  e, b, c, PRIMARY
11a80 20 4b 45 59 28 63 2c 20 61 29 29 3b 0a 20 20 20   KEY(c, a));.   
11a90 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
11aa0 69 6c 64 28 64 20 44 45 46 41 55 4c 54 20 27 61  ild(d DEFAULT 'a
11ab0 27 2c 20 65 2c 20 66 20 44 45 46 41 55 4c 54 20  ', e, f DEFAULT 
11ac0 27 63 27 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  'c',.      FOREI
11ad0 47 4e 20 4b 45 59 28 66 2c 20 64 29 20 52 45 46  GN KEY(f, d) REF
11ae0 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
11af0 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46  N UPDATE SET DEF
11b00 41 55 4c 54 0a 20 20 20 20 29 3b 0a 0a 20 20 20  AULT.    );..   
11b10 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
11b20 65 6e 74 20 56 41 4c 55 45 53 28 27 41 27 2c 20  ent VALUES('A', 
11b30 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 49  'b', 'c');.    I
11b40 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
11b50 74 20 56 41 4c 55 45 53 28 27 4f 4e 45 27 2c 20  t VALUES('ONE', 
11b60 27 74 77 6f 27 2c 20 27 74 68 72 65 65 27 29 3b  'two', 'three');
11b70 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11b80 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6f   child VALUES('o
11b90 6e 65 27 2c 20 27 74 77 6f 27 2c 20 27 74 68 72  ne', 'two', 'thr
11ba0 65 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ee');.  }.} {}.d
11bb0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
11bc0 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
11bd0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
11be0 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20    UPDATE parent 
11bf0 53 45 54 20 61 20 3d 20 27 27 20 57 48 45 52 45  SET a = '' WHERE
11c00 20 61 20 3d 20 27 6f 4e 65 27 3b 0a 20 20 20 20   a = 'oNe';.    
11c10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11c20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 61 20  child;.  }.} {a 
11c30 74 77 6f 20 63 7d 0a 64 6f 5f 74 65 73 74 20 65  two c}.do_test e
11c40 5f 66 6b 65 79 2d 34 39 2e 33 20 7b 0a 20 20 65  _fkey-49.3 {.  e
11c50 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
11c60 4c 42 41 43 4b 3b 0a 20 20 20 20 44 45 4c 45 54  LBACK;.    DELET
11c70 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
11c80 45 52 45 20 61 20 3d 20 27 41 27 3b 0a 20 20 20  ERE a = 'A';.   
11c90 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
11ca0 61 72 65 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 4f 4e  arent;.  }.} {ON
11cb0 45 20 74 77 6f 20 74 68 72 65 65 7d 0a 64 6f 5f  E two three}.do_
11cc0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 34  test e_fkey-49.4
11cd0 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
11ce0 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
11cf0 54 20 61 20 3d 20 27 27 20 57 48 45 52 45 20 61  T a = '' WHERE a
11d00 20 3d 20 27 6f 4e 65 27 20 7d 0a 7d 20 7b 31 20   = 'oNe' }.} {1 
11d10 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
11d20 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
11d30 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
11d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11d80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
11d90 31 38 35 36 2d 31 39 38 33 36 0a 23 0a 23 20 54  1856-19836.#.# T
11da0 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66  est an example f
11db0 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45  rom the "ON DELE
11dc0 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
11dd0 20 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f   Actions" sectio
11de0 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b  n .# of foreignk
11df0 65 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65  eys.html. This e
11e00 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 74 68 61  xample shows tha
11e10 74 20 61 64 64 69 6e 67 20 61 6e 20 22 4f 4e 20  t adding an "ON 
11e20 44 45 4c 45 54 45 20 44 45 46 41 55 4c 54 22 0a  DELETE DEFAULT".
11e30 23 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  # clause does no
11e40 74 20 61 62 72 6f 67 61 74 65 20 74 68 65 20 6e  t abrogate the n
11e50 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
11e60 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
11e70 6f 6e 73 74 72 61 69 6e 74 0a 23 20 28 52 2d 32  onstraint.# (R-2
11e80 38 32 32 30 2d 34 36 36 39 34 29 2e 0a 23 0a 23  8220-46694)..#.#
11e90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11ea0 32 38 32 32 30 2d 34 36 36 39 34 20 46 6f 72 20  28220-46694 For 
11eb0 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 22  example, if an "
11ec0 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
11ed0 46 41 55 4c 54 22 0a 23 20 61 63 74 69 6f 6e 20  FAULT".# action 
11ee0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 62  is configured, b
11ef0 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  ut there is no r
11f00 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ow in the parent
11f10 20 74 61 62 6c 65 20 74 68 61 74 0a 23 20 63 6f   table that.# co
11f20 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
11f30 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
11f40 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
11f50 20 63 6f 6c 75 6d 6e 73 2c 20 64 65 6c 65 74 69   columns, deleti
11f60 6e 67 20 61 0a 23 20 70 61 72 65 6e 74 20 6b 65  ng a.# parent ke
11f70 79 20 77 68 69 6c 65 20 64 65 70 65 6e 64 65 6e  y while dependen
11f80 74 20 63 68 69 6c 64 20 6b 65 79 73 20 65 78 69  t child keys exi
11f90 73 74 20 73 74 69 6c 6c 20 63 61 75 73 65 73 20  st still causes 
11fa0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20  a foreign key.# 
11fb0 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 64 72 6f  violation..#.dro
11fc0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
11fd0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 31  test e_fkey-50.1
11fe0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11ff0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12000 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
12010 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
12020 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
12030 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
12040 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
12050 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
12060 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
12070 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
12080 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
12090 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
120a0 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
120b0 47 45 52 20 44 45 46 41 55 4c 54 20 30 20 52 45  GER DEFAULT 0 RE
120c0 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
120d0 61 72 74 69 73 74 69 64 29 20 4f 4e 20 44 45 4c  artistid) ON DEL
120e0 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a  ETE SET DEFAULT.
120f0 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
12100 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
12110 4c 55 45 53 28 33 2c 20 27 53 61 6d 6d 79 20 44  LUES(3, 'Sammy D
12120 61 76 69 73 20 4a 72 2e 27 29 3b 0a 20 20 20 20  avis Jr.');.    
12130 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
12140 6b 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72  k VALUES(14, 'Mr
12150 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33 29  . Bojangles', 3)
12160 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
12170 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 32 20 7b  st e_fkey-50.2 {
12180 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
12190 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
121a0 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d   WHERE artistnam
121b0 65 20 3d 20 27 53 61 6d 6d 79 20 44 61 76 69 73  e = 'Sammy Davis
121c0 20 4a 72 2e 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f   Jr.' }.} {1 {FO
121d0 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
121e0 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
121f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e  _test e_fkey-50.
12200 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
12210 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12220 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 30 2c  artist VALUES(0,
12230 20 27 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74   'Unknown Artist
12240 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  ');.    DELETE F
12250 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
12260 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53   artistname = 'S
12270 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 3b  ammy Davis Jr.';
12280 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
12290 74 20 65 5f 66 6b 65 79 2d 35 30 2e 34 20 7b 0a  t e_fkey-50.4 {.
122a0 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
122b0 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74  CT * FROM artist
122c0 20 7d 0a 7d 20 7b 30 20 7b 55 6e 6b 6e 6f 77 6e   }.} {0 {Unknown
122d0 20 41 72 74 69 73 74 7d 7d 0a 64 6f 5f 74 65 73   Artist}}.do_tes
122e0 74 20 65 5f 66 6b 65 79 2d 35 30 2e 35 20 7b 0a  t e_fkey-50.5 {.
122f0 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
12300 43 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b 20  CT * FROM track 
12310 7d 0a 7d 20 7b 31 34 20 7b 4d 72 2e 20 42 6f 6a  }.} {14 {Mr. Boj
12320 61 6e 67 6c 65 73 7d 20 30 7d 0a 0a 23 2d 2d 2d  angles} 0}..#---
12330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12370 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
12380 45 2d 4f 46 3a 20 52 2d 30 39 35 36 34 2d 32 32  E-OF: R-09564-22
12390 31 37 30 0a 23 0a 23 20 43 68 65 63 6b 20 74 68  170.#.# Check th
123a0 61 74 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  at the order of 
123b0 73 74 65 70 73 20 69 6e 20 61 6e 20 55 50 44 41  steps in an UPDA
123c0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 6e 20  TE or DELETE on 
123d0 61 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62 6c  a parent .# tabl
123e0 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
123f0 0a 23 0a 23 20 20 20 31 2e 20 45 78 65 63 75 74  .#.#   1. Execut
12400 65 20 61 70 70 6c 69 63 61 62 6c 65 20 42 45 46  e applicable BEF
12410 4f 52 45 20 74 72 69 67 67 65 72 20 70 72 6f 67  ORE trigger prog
12420 72 61 6d 73 2c 0a 23 20 20 20 32 2e 20 43 68 65  rams,.#   2. Che
12430 63 6b 20 6c 6f 63 61 6c 20 28 6e 6f 6e 20 66 6f  ck local (non fo
12440 72 65 69 67 6e 20 6b 65 79 29 20 63 6f 6e 73 74  reign key) const
12450 72 61 69 6e 74 73 2c 0a 23 20 20 20 33 2e 20 55  raints,.#   3. U
12460 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
12470 74 68 65 20 72 6f 77 20 69 6e 20 74 68 65 20 70  the row in the p
12480 61 72 65 6e 74 20 74 61 62 6c 65 2c 0a 23 20 20  arent table,.#  
12490 20 34 2e 20 50 65 72 66 6f 72 6d 20 61 6e 79 20   4. Perform any 
124a0 72 65 71 75 69 72 65 64 20 66 6f 72 65 69 67 6e  required foreign
124b0 20 6b 65 79 20 61 63 74 69 6f 6e 73 2c 0a 23 20   key actions,.# 
124c0 20 20 35 2e 20 45 78 65 63 75 74 65 20 61 70 70    5. Execute app
124d0 6c 69 63 61 62 6c 65 20 41 46 54 45 52 20 74 72  licable AFTER tr
124e0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
124f0 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
12500 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
12510 79 2d 35 31 2e 31 20 7b 0a 20 20 70 72 6f 63 20  y-51.1 {.  proc 
12520 6d 61 78 70 61 72 65 6e 74 20 7b 61 72 67 73 7d  maxparent {args}
12530 20 7b 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43   { db one {SELEC
12540 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 70 61  T max(x) FROM pa
12550 72 65 6e 74 7d 20 7d 0a 20 20 64 62 20 66 75 6e  rent} }.  db fun
12560 63 20 6d 61 78 70 61 72 65 6e 74 20 6d 61 78 70  c maxparent maxp
12570 61 72 65 6e 74 0a 0a 20 20 65 78 65 63 73 71 6c  arent..  execsql
12580 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
12590 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49  BLE parent(x PRI
125a0 4d 41 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20 20  MARY KEY);..    
125b0 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 62  CREATE TRIGGER b
125c0 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  u BEFORE UPDATE 
125d0 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a  ON parent BEGIN.
125e0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
125f0 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
12600 6e 65 77 2e 78 2d 6f 6c 64 2e 78 29 3b 0a 20 20  new.x-old.x);.  
12610 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
12620 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 0a 20  E TABLE child(. 
12630 20 20 20 20 20 61 20 44 45 46 41 55 4c 54 20 28       a DEFAULT (
12640 6d 61 78 70 61 72 65 6e 74 28 29 29 20 52 45 46  maxparent()) REF
12650 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
12660 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46  N UPDATE SET DEF
12670 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  AULT.    );.    
12680 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61  CREATE TRIGGER a
12690 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  u AFTER UPDATE O
126a0 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20  N parent BEGIN. 
126b0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
126c0 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 6e   parent VALUES(n
126d0 65 77 2e 78 2b 6f 6c 64 2e 78 29 3b 0a 20 20 20  ew.x+old.x);.   
126e0 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52   END;..    INSER
126f0 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
12700 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53  LUES(1);.    INS
12710 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56  ERT INTO child V
12720 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 7d 20  ALUES(1);.  }.} 
12730 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
12740 79 2d 35 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-51.2 {.  execs
12750 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12760 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 32  parent SET x = 2
12770 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
12780 46 52 4f 4d 20 70 61 72 65 6e 74 20 4f 52 44 45  FROM parent ORDE
12790 52 20 42 59 20 72 6f 77 69 64 3b 20 53 45 4c 45  R BY rowid; SELE
127a0 43 54 20 27 78 78 78 27 20 3b 20 53 45 4c 45 43  CT 'xxx' ; SELEC
127b0 54 20 61 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a  T a FROM child;.
127c0 20 20 7d 0a 7d 20 7b 32 32 20 32 31 20 32 33 20    }.} {22 21 23 
127d0 78 78 78 20 32 32 7d 0a 64 6f 5f 74 65 73 74 20  xxx 22}.do_test 
127e0 65 5f 66 6b 65 79 2d 35 31 2e 33 20 7b 0a 20 20  e_fkey-51.3 {.  
127f0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
12800 4c 45 54 45 20 46 52 4f 4d 20 63 68 69 6c 64 3b  LETE FROM child;
12810 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
12820 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 49 4e 53   parent;.    INS
12830 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
12840 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20 20 20  VALUES(-1);.    
12850 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
12860 64 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20  d VALUES(-1);.  
12870 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20    UPDATE parent 
12880 53 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20  SET x = 22;.    
12890 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61  SELECT * FROM pa
128a0 72 65 6e 74 20 4f 52 44 45 52 20 42 59 20 72 6f  rent ORDER BY ro
128b0 77 69 64 3b 20 53 45 4c 45 43 54 20 27 78 78 78  wid; SELECT 'xxx
128c0 27 20 3b 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ' ; SELECT a FRO
128d0 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b  M child;.  }.} {
128e0 32 32 20 32 33 20 32 31 20 78 78 78 20 32 33 7d  22 23 21 xxx 23}
128f0 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12940 56 65 72 69 66 79 20 74 68 61 74 20 4f 4e 20 55  Verify that ON U
12950 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20 6f 6e  PDATE actions on
12960 6c 79 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65  ly actually take
12970 20 70 6c 61 63 65 20 69 66 20 74 68 65 20 70 61   place if the pa
12980 72 65 6e 74 20 6b 65 79 0a 23 20 69 73 20 73 65  rent key.# is se
12990 74 20 74 6f 20 61 20 6e 65 77 20 76 61 6c 75 65  t to a new value
129a0 20 74 68 61 74 20 69 73 20 64 69 73 74 69 6e 63   that is distinc
129b0 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 20 76  t from the old v
129c0 61 6c 75 65 2e 20 54 68 65 20 64 65 66 61 75 6c  alue. The defaul
129d0 74 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  t.# collation se
129e0 71 75 65 6e 63 65 20 61 6e 64 20 61 66 66 69 6e  quence and affin
129f0 69 74 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  ity are used to 
12a00 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
12a10 20 6e 65 77 20 76 61 6c 75 65 0a 23 20 69 73 20   new value.# is 
12a20 27 64 69 73 74 69 6e 63 74 27 20 66 72 6f 6d 20  'distinct' from 
12a30 74 68 65 20 6f 6c 64 20 6f 72 20 6e 6f 74 2e 0a  the old or not..
12a40 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
12a50 20 52 2d 32 37 33 38 33 2d 31 30 32 34 36 20 41   R-27383-10246 A
12a60 6e 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  n ON UPDATE acti
12a70 6f 6e 20 69 73 20 6f 6e 6c 79 20 74 61 6b 65 6e  on is only taken
12a80 20 69 66 20 74 68 65 0a 23 20 76 61 6c 75 65 73   if the.# values
12a90 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b   of the parent k
12aa0 65 79 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  ey are modified 
12ab0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
12ac0 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 76 61 6c  parent key.# val
12ad0 75 65 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  ues are not equa
12ae0 6c 20 74 6f 20 74 68 65 20 6f 6c 64 2e 0a 23 0a  l to the old..#.
12af0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
12b00 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12b10 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
12b20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
12b30 4c 45 20 7a 65 75 73 28 61 20 49 4e 54 45 47 45  LE zeus(a INTEGE
12b40 52 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  R COLLATE NOCASE
12b50 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , b, PRIMARY KEY
12b60 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45  (a, b));.    CRE
12b70 41 54 45 20 54 41 42 4c 45 20 61 70 6f 6c 6c 6f  ATE TABLE apollo
12b80 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f  (c, d, .      FO
12b90 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
12ba0 52 45 46 45 52 45 4e 43 45 53 20 7a 65 75 73 20  REFERENCES zeus 
12bb0 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
12bc0 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  E.    );.    INS
12bd0 45 52 54 20 49 4e 54 4f 20 7a 65 75 73 20 56 41  ERT INTO zeus VA
12be0 4c 55 45 53 28 27 61 62 63 27 2c 20 27 78 79 7a  LUES('abc', 'xyz
12bf0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
12c00 4e 54 4f 20 61 70 6f 6c 6c 6f 20 56 41 4c 55 45  NTO apollo VALUE
12c10 53 28 27 41 42 43 27 2c 20 27 78 79 7a 27 29 3b  S('ABC', 'xyz');
12c20 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
12c30 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73  .    UPDATE zeus
12c40 20 53 45 54 20 61 20 3d 20 27 61 42 63 27 3b 0a   SET a = 'aBc';.
12c50 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12c60 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20  M apollo;.  }.} 
12c70 7b 41 42 43 20 78 79 7a 7d 0a 64 6f 5f 74 65 73  {ABC xyz}.do_tes
12c80 74 20 65 5f 66 6b 65 79 2d 35 32 2e 32 20 7b 0a  t e_fkey-52.2 {.
12c90 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12ca0 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20  UPDATE zeus SET 
12cb0 61 20 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20  a = 1, b = 1;.  
12cc0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
12cd0 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 31  apollo;.  }.} {1
12ce0 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
12cf0 65 79 2d 35 32 2e 33 20 7b 0a 20 20 65 78 65 63  ey-52.3 {.  exec
12d00 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12d10 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20 31 2c   zeus SET a = 1,
12d20 20 62 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   b = 1;.    SELE
12d30 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c  CT typeof(c), c,
12d40 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52   typeof(d), d FR
12d50 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12d60 20 7b 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65   {integer 1 inte
12d70 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65  ger 1}.do_test e
12d80 5f 66 6b 65 79 2d 35 32 2e 34 20 7b 0a 20 20 65  _fkey-52.4 {.  e
12d90 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
12da0 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d  ATE zeus SET a =
12db0 20 27 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54   '1';.    SELECT
12dc0 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74   typeof(c), c, t
12dd0 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d  ypeof(d), d FROM
12de0 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b   apollo;.  }.} {
12df0 69 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67 65  integer 1 intege
12e00 72 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  r 1}.do_test e_f
12e10 6b 65 79 2d 35 32 2e 35 20 7b 0a 20 20 65 78 65  key-52.5 {.  exe
12e20 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12e30 45 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 27  E zeus SET b = '
12e40 31 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  1';.    SELECT t
12e50 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70  ypeof(c), c, typ
12e60 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61  eof(d), d FROM a
12e70 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  pollo;.  }.} {in
12e80 74 65 67 65 72 20 31 20 74 65 78 74 20 31 7d 0a  teger 1 text 1}.
12e90 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
12ea0 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
12eb0 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65 75  {.    UPDATE zeu
12ec0 73 20 53 45 54 20 62 20 3d 20 4e 55 4c 4c 3b 0a  s SET b = NULL;.
12ed0 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
12ee0 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28  f(c), c, typeof(
12ef0 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c 6c  d), d FROM apoll
12f00 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  o;.  }.} {intege
12f10 72 20 31 20 6e 75 6c 6c 20 7b 7d 7d 0a 0a 23 2d  r 1 null {}}..#-
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
12f70 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 31 32 39 2d  NCE-OF: R-35129-
12f80 35 38 31 34 31 0a 23 0a 23 20 54 65 73 74 20 61  58141.#.# Test a
12f90 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74  n example from t
12fa0 68 65 20 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e  he "ON DELETE an
12fb0 64 20 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69  d ON UPDATE Acti
12fc0 6f 6e 73 22 20 73 65 63 74 69 6f 6e 20 0a 23 20  ons" section .# 
12fd0 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68  of foreignkeys.h
12fe0 74 6d 6c 2e 20 54 68 69 73 20 65 78 61 6d 70 6c  tml. This exampl
12ff0 65 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74  e demonstrates t
13000 68 61 74 20 4f 4e 20 55 50 44 41 54 45 20 61 63  hat ON UPDATE ac
13010 74 69 6f 6e 73 0a 23 20 6f 6e 6c 79 20 74 61 6b  tions.# only tak
13020 65 20 70 6c 61 63 65 20 69 66 20 61 74 20 6c 65  e place if at le
13030 61 73 74 20 6f 6e 65 20 70 61 72 65 6e 74 20 6b  ast one parent k
13040 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 73 65 74  ey column is set
13050 20 74 6f 20 61 20 76 61 6c 75 65 20 0a 23 20 74   to a value .# t
13060 68 61 74 20 69 73 20 64 69 73 74 69 6e 63 74 20  hat is distinct 
13070 66 72 6f 6d 20 69 74 73 20 70 72 65 76 69 6f 75  from its previou
13080 73 20 76 61 6c 75 65 2e 0a 23 0a 64 72 6f 70 5f  s value..#.drop_
13090 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
130a0 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 31 20 7b  st e_fkey-53.1 {
130b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
130c0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
130d0 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b  rent(x PRIMARY K
130e0 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
130f0 54 41 42 4c 45 20 63 68 69 6c 64 28 79 20 52 45  TABLE child(y RE
13100 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
13110 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55  ON UPDATE SET NU
13120 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
13130 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
13140 45 53 28 27 6b 65 79 27 29 3b 0a 20 20 20 20 49  ES('key');.    I
13150 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
13160 20 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a   VALUES('key');.
13170 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
13180 20 65 5f 66 6b 65 79 2d 35 33 2e 32 20 7b 0a 20   e_fkey-53.2 {. 
13190 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
131a0 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
131b0 20 78 20 3d 20 27 6b 65 79 27 3b 0a 20 20 20 20   x = 'key';.    
131c0 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c  SELECT IFNULL(y,
131d0 20 27 6e 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68   'null') FROM ch
131e0 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 6b 65 79 7d  ild;.  }.} {key}
131f0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
13200 35 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  53.3 {.  execsql
13210 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 61   {.    UPDATE pa
13220 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b 65  rent SET x = 'ke
13230 79 32 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  y2';.    SELECT 
13240 49 46 4e 55 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27  IFNULL(y, 'null'
13250 29 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20  ) FROM child;.  
13260 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 23 23 23  }.} {null}..####
13270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
132a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
132b0 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
132c0 49 4f 4e 20 35 3a 20 43 52 45 41 54 45 2c 20 41  ION 5: CREATE, A
132d0 4c 54 45 52 20 61 6e 64 20 44 52 4f 50 20 54 41  LTER and DROP TA
132e0 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 0a 23 23 23  BLE commands.###
132f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13330 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13380 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
13390 20 70 61 72 65 6e 74 20 6b 65 79 73 20 61 72 65   parent keys are
133a0 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65   not checked whe
133b0 6e 20 74 61 62 6c 65 73 20 61 72 65 20 63 72 65  n tables are cre
133c0 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ated..#.# EVIDEN
133d0 43 45 2d 4f 46 3a 20 52 2d 33 36 30 31 38 2d 32  CE-OF: R-36018-2
133e0 31 37 35 35 20 54 68 65 20 70 61 72 65 6e 74 20  1755 The parent 
133f0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  key definitions 
13400 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23  of foreign key.#
13410 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
13420 20 6e 6f 74 20 63 68 65 63 6b 65 64 20 77 68 65   not checked whe
13430 6e 20 61 20 74 61 62 6c 65 20 69 73 20 63 72 65  n a table is cre
13440 61 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ated..#.# EVIDEN
13450 43 45 2d 4f 46 3a 20 52 2d 32 35 33 38 34 2d 33  CE-OF: R-25384-3
13460 39 33 33 37 20 54 68 65 72 65 20 69 73 20 6e 6f  9337 There is no
13470 74 68 69 6e 67 20 73 74 6f 70 70 69 6e 67 20 74  thing stopping t
13480 68 65 20 75 73 65 72 20 66 72 6f 6d 0a 23 20 63  he user from.# c
13490 72 65 61 74 69 6e 67 20 61 20 66 6f 72 65 69 67  reating a foreig
134a0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
134b0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
134c0 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 74  a parent table t
134d0 68 61 74 0a 23 20 64 6f 65 73 20 6e 6f 74 20 65  hat.# does not e
134e0 78 69 73 74 2c 20 6f 72 20 74 6f 20 70 61 72 65  xist, or to pare
134f0 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 74  nt key columns t
13500 68 61 74 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  hat do not exist
13510 20 6f 72 20 61 72 65 20 6e 6f 74 0a 23 20 63 6f   or are not.# co
13520 6c 6c 65 63 74 69 76 65 6c 79 20 62 6f 75 6e 64  llectively bound
13530 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
13540 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
13550 74 72 61 69 6e 74 2e 0a 23 0a 23 20 43 68 69 6c  traint..#.# Chil
13560 64 20 6b 65 79 73 20 61 72 65 20 63 68 65 63 6b  d keys are check
13570 65 64 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c  ed to ensure all
13580 20 63 6f 6d 70 6f 6e 65 6e 74 20 63 6f 6c 75 6d   component colum
13590 6e 73 20 65 78 69 73 74 2e 20 49 66 20 70 61 72  ns exist. If par
135a0 65 6e 74 0a 23 20 6b 65 79 20 63 6f 6c 75 6d 6e  ent.# key column
135b0 73 20 61 72 65 20 65 78 70 6c 69 63 69 74 6c 79  s are explicitly
135c0 20 73 70 65 63 69 66 69 65 64 2c 20 53 51 4c 69   specified, SQLi
135d0 74 65 20 63 68 65 63 6b 73 20 74 6f 20 6d 61 6b  te checks to mak
135e0 65 20 73 75 72 65 20 74 68 65 72 65 0a 23 20 61  e sure there.# a
135f0 72 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  re the same numb
13600 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13610 20 74 68 65 20 63 68 69 6c 64 20 61 6e 64 20 70   the child and p
13620 61 72 65 6e 74 20 6b 65 79 73 2e 20 28 54 4f 44  arent keys. (TOD
13630 4f 3a 20 54 68 69 73 0a 23 20 69 73 20 74 65 73  O: This.# is tes
13640 74 65 64 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ted but does not
13650 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61   correspond to a
13660 6e 79 20 74 65 73 74 61 62 6c 65 20 73 74 61 74  ny testable stat
13670 65 6d 65 6e 74 2e 29 0a 23 0a 23 20 41 6c 73 6f  ement.).#.# Also
13680 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20 61   test that the a
13690 62 6f 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  bove statements 
136a0 61 72 65 20 74 72 75 65 20 72 65 67 61 72 64 6c  are true regardl
136b0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
136c0 72 20 6e 6f 74 0a 23 20 66 6f 72 65 69 67 6e 20  r not.# foreign 
136d0 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64  keys are enabled
136e0 3a 20 20 22 41 20 43 52 45 41 54 45 20 54 41 42  :  "A CREATE TAB
136f0 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61  LE command opera
13700 74 65 73 20 74 68 65 20 73 61 6d 65 20 77 68 65  tes the same whe
13710 74 68 65 72 0a 23 20 6f 72 20 6e 6f 74 20 66 6f  ther.# or not fo
13720 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
13730 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
13740 64 2e 22 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  d.".#.# EVIDENCE
13750 2d 4f 46 3a 20 52 2d 30 38 39 30 38 2d 32 33 34  -OF: R-08908-234
13760 33 39 20 41 20 43 52 45 41 54 45 20 54 41 42 4c  39 A CREATE TABL
13770 45 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74  E command operat
13780 65 73 20 74 68 65 20 73 61 6d 65 0a 23 20 77 68  es the same.# wh
13790 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 6f 72  ether or not for
137a0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
137b0 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ints are enabled
137c0 2e 0a 23 20 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ..# .foreach {tn
137d0 20 7a 43 72 65 61 74 65 54 62 6c 20 6c 52 65 73   zCreateTbl lRes
137e0 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45 20  } {.  1 "CREATE 
137f0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52 45  TABLE t1(a, b RE
13800 46 45 52 45 4e 43 45 53 20 74 31 29 22 20 20 20  FERENCES t1)"   
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13830 20 20 32 20 22 43 52 45 41 54 45 20 54 41 42 4c    2 "CREATE TABL
13840 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45  E t1(a, b REFERE
13850 4e 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20  NCES t2)"       
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 33 20       {0 {}}.  3 
13880 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13890 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
138a0 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
138b0 45 53 20 74 31 29 22 20 20 20 20 20 20 20 20 20  ES t1)"         
138c0 20 7b 30 20 7b 7d 7d 0a 20 20 34 20 22 43 52 45   {0 {}}.  4 "CRE
138d0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
138e0 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
138f0 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13900 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  2)"          {0 
13910 7b 7d 7d 0a 20 20 35 20 22 43 52 45 41 54 45 20  {}}.  5 "CREATE 
13920 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
13930 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
13940 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20  REFERENCES t2)" 
13950 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13960 20 20 36 20 22 43 52 45 41 54 45 20 54 41 42 4c    6 "CREATE TABL
13970 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13980 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13990 52 45 4e 43 45 53 20 74 32 28 6e 2c 64 29 29 22  RENCES t2(n,d))"
139a0 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 37 20       {0 {}}.  7 
139b0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
139c0 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
139d0 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
139e0 45 53 20 74 31 28 61 2c 62 29 29 22 20 20 20 20  ES t1(a,b))"    
139f0 20 7b 30 20 7b 7d 7d 0a 0a 20 20 41 20 22 43 52   {0 {}}..  A "CR
13a00 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
13a10 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   b, FOREIGN KEY(
13a20 63 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20  c,b) REFERENCES 
13a30 74 32 29 22 20 20 20 20 20 20 20 20 20 20 0a 20  t2)"          . 
13a40 20 20 20 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20      {1 {unknown 
13a50 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20 66 6f  column "c" in fo
13a60 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
13a70 74 69 6f 6e 7d 7d 0a 20 20 42 20 22 43 52 45 41  tion}}.  B "CREA
13a80 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
13a90 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
13aa0 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  b) REFERENCES t2
13ab0 28 64 29 29 22 20 20 20 20 20 20 20 20 20 20 0a  (d))"          .
13ac0 20 20 20 20 20 7b 31 20 7b 6e 75 6d 62 65 72 20       {1 {number 
13ad0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
13ae0 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
13af0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
13b00 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
13b10 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
13b20 20 74 61 62 6c 65 7d 7d 0a 7d 20 7b 0a 20 20 64   table}}.} {.  d
13b30 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 34  o_test e_fkey-54
13b40 2e 24 74 6e 2e 6f 66 66 20 7b 0a 20 20 20 20 64  .$tn.off {.    d
13b50 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
13b60 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47     execsql {PRAG
13b70 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
13b80 3d 20 4f 46 46 7d 0a 20 20 20 20 63 61 74 63 68  = OFF}.    catch
13b90 73 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a  sql $zCreateTbl.
13ba0 20 20 7d 20 24 6c 52 65 73 0a 20 20 64 6f 5f 74    } $lRes.  do_t
13bb0 65 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24 74  est e_fkey-54.$t
13bc0 6e 2e 6f 6e 20 7b 0a 20 20 20 20 64 72 6f 70 5f  n.on {.    drop_
13bd0 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65  all_tables.    e
13be0 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
13bf0 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
13c00 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 24  }.    catchsql $
13c10 7a 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20 24  zCreateTbl.  } $
13c20 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lRes.}..#-------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c70 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
13c80 3a 20 52 2d 34 37 39 35 32 2d 36 32 34 39 38 20  : R-47952-62498 
13c90 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
13ca0 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20 22 41  le to use the "A
13cb0 4c 54 45 52 20 54 41 42 4c 45 0a 23 20 2e 2e 2e  LTER TABLE.# ...
13cc0 20 41 44 44 20 43 4f 4c 55 4d 4e 22 20 73 79 6e   ADD COLUMN" syn
13cd0 74 61 78 20 74 6f 20 61 64 64 20 61 20 63 6f 6c  tax to add a col
13ce0 75 6d 6e 20 74 68 61 74 20 69 6e 63 6c 75 64 65  umn that include
13cf0 73 20 61 20 52 45 46 45 52 45 4e 43 45 53 0a 23  s a REFERENCES.#
13d00 20 63 6c 61 75 73 65 2c 20 75 6e 6c 65 73 73 20   clause, unless 
13d10 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
13d20 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f 6c  e of the new col
13d30 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 20 41 74 74  umn is NULL. Att
13d40 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 64 6f 20  empting.# to do 
13d50 73 6f 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  so returns an er
13d60 72 6f 72 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74  ror..#.proc test
13d70 5f 65 66 6b 65 79 5f 36 20 7b 74 6e 20 7a 41 6c  _efkey_6 {tn zAl
13d80 74 65 72 20 69 73 45 72 72 6f 72 7d 20 7b 0a 20  ter isError} {. 
13d90 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
13da0 20 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66   ..  do_test e_f
13db0 6b 65 79 2d 35 36 2e 24 74 6e 2e 31 20 22 0a 20  key-56.$tn.1 ". 
13dc0 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45     execsql { CRE
13dd0 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c  ATE TABLE tbl(a,
13de0 20 62 29 20 7d 0a 20 20 20 20 5b 6c 69 73 74 20   b) }.    [list 
13df0 63 61 74 63 68 73 71 6c 20 24 7a 41 6c 74 65 72  catchsql $zAlter
13e00 5d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b  ].  " [lindex {{
13e10 30 20 7b 7d 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74  0 {}} {1 {Cannot
13e20 20 61 64 64 20 61 20 52 45 46 45 52 45 4e 43 45   add a REFERENCE
13e30 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f  S column with no
13e40 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 76  n-NULL default v
13e50 61 6c 75 65 7d 7d 7d 20 24 69 73 45 72 72 6f 72  alue}}} $isError
13e60 5d 0a 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79  ]..}..test_efkey
13e70 5f 36 20 31 20 22 41 4c 54 45 52 20 54 41 42 4c  _6 1 "ALTER TABL
13e80 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e  E tbl ADD COLUMN
13e90 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 78 78   c REFERENCES xx
13ea0 22 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  " 0.test_efkey_6
13eb0 20 32 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20   2 "ALTER TABLE 
13ec0 74 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63  tbl ADD COLUMN c
13ed0 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45   DEFAULT NULL RE
13ee0 46 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a 74  FERENCES xx" 0.t
13ef0 65 73 74 5f 65 66 6b 65 79 5f 36 20 33 20 22 41  est_efkey_6 3 "A
13f00 4c 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20 41  LTER TABLE tbl A
13f10 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41  DD COLUMN c DEFA
13f20 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45 53  ULT 0 REFERENCES
13f30 20 78 78 22 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   xx" 1..#-------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 41  --.# Test that A
13f90 4c 54 45 52 20 54 41 42 4c 45 20 61 64 6a 75 73  LTER TABLE adjus
13fa0 74 73 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c  ts REFERENCES cl
13fb0 61 75 73 65 73 20 77 68 65 6e 20 74 68 65 20 70  auses when the p
13fc0 61 72 65 6e 74 20 74 61 62 6c 65 0a 23 20 69 73  arent table.# is
13fd0 20 52 45 4e 41 4d 45 44 2e 0a 23 0a 23 20 45 56   RENAMED..#.# EV
13fe0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 30  IDENCE-OF: R-470
13ff0 38 30 2d 30 32 30 36 39 20 49 66 20 61 6e 20 22  80-02069 If an "
14000 41 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20  ALTER TABLE ... 
14010 52 45 4e 41 4d 45 20 54 4f 22 20 63 6f 6d 6d 61  RENAME TO" comma
14020 6e 64 0a 23 20 69 73 20 75 73 65 64 20 74 6f 20  nd.# is used to 
14030 72 65 6e 61 6d 65 20 61 20 74 61 62 6c 65 20 74  rename a table t
14040 68 61 74 20 69 73 20 74 68 65 20 70 61 72 65 6e  hat is the paren
14050 74 20 74 61 62 6c 65 20 6f 66 20 6f 6e 65 20 6f  t table of one o
14060 72 20 6d 6f 72 65 0a 23 20 66 6f 72 65 69 67 6e  r more.# foreign
14070 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
14080 2c 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  , the definition
14090 73 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  s of the foreign
140a0 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e   key.# constrain
140b0 74 73 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  ts are modified 
140c0 74 6f 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  to refer to the 
140d0 70 61 72 65 6e 74 20 74 61 62 6c 65 20 62 79 20  parent table by 
140e0 69 74 73 20 6e 65 77 20 6e 61 6d 65 0a 23 0a 23  its new name.#.#
140f0 20 54 65 73 74 20 74 68 61 74 20 74 68 65 73 65   Test that these
14100 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 61 72 65   adjustments are
14110 20 76 69 73 69 62 6c 65 20 69 6e 20 74 68 65 20   visible in the 
14120 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
14130 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ble..#.# EVIDENC
14140 45 2d 4f 46 3a 20 52 2d 36 33 38 32 37 2d 35 34  E-OF: R-63827-54
14150 37 37 34 20 54 68 65 20 74 65 78 74 20 6f 66 20  774 The text of 
14160 74 68 65 20 63 68 69 6c 64 20 43 52 45 41 54 45  the child CREATE
14170 20 54 41 42 4c 45 0a 23 20 73 74 61 74 65 6d 65   TABLE.# stateme
14180 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  nt or statements
14190 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
141a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
141b0 6c 65 20 61 72 65 20 6d 6f 64 69 66 69 65 64 0a  le are modified.
141c0 23 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  # to reflect the
141d0 20 6e 65 77 20 70 61 72 65 6e 74 20 74 61 62 6c   new parent tabl
141e0 65 20 6e 61 6d 65 2e 0a 23 0a 64 6f 5f 74 65 73  e name..#.do_tes
141f0 74 20 65 5f 66 6b 65 79 2d 35 36 2e 31 20 7b 0a  t e_fkey-56.1 {.
14200 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
14210 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
14220 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 27    CREATE TABLE '
14230 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14240 27 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 27  '(a REFERENCES '
14250 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14260 27 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  ', b, PRIMARY KE
14270 59 28 62 29 29 3b 0a 0a 20 20 20 20 43 52 45 41  Y(b));..    CREA
14280 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64  TE TABLE c1(c, d
14290 20 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31   REFERENCES 'p 1
142a0 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f   "parent one"' O
142b0 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
142c0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
142d0 42 4c 45 20 63 32 28 65 2c 20 66 2c 20 46 4f 52  BLE c2(e, f, FOR
142e0 45 49 47 4e 20 4b 45 59 28 66 29 20 52 45 46 45  EIGN KEY(f) REFE
142f0 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72  RENCES 'p 1 "par
14300 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44  ent one"' ON UPD
14310 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20  ATE CASCADE);.  
14320 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14330 33 28 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20  3(e, 'f col 2', 
14340 46 4f 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63  FOREIGN KEY('f c
14350 6f 6c 20 32 27 29 20 52 45 46 45 52 45 4e 43 45  ol 2') REFERENCE
14360 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f  S 'p 1 "parent o
14370 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43  ne"' ON UPDATE C
14380 41 53 43 41 44 45 29 3b 0a 0a 20 20 20 20 49 4e  ASCADE);..    IN
14390 53 45 52 54 20 49 4e 54 4f 20 27 70 20 31 20 22  SERT INTO 'p 1 "
143a0 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 56 41 4c  parent one"' VAL
143b0 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49  UES(1, 1);.    I
143c0 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
143d0 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20  LUES(1, 1);.    
143e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
143f0 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20  ALUES(1, 1);.   
14400 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 33 20   INSERT INTO c3 
14410 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 0a 20  VALUES(1, 1);.. 
14420 20 20 20 2d 2d 20 43 52 45 41 54 45 20 54 41 42     -- CREATE TAB
14430 4c 45 20 71 28 61 2c 20 62 2c 20 50 52 49 4d 41  LE q(a, b, PRIMA
14440 52 59 20 4b 45 59 28 62 29 29 3b 0a 20 20 7d 0a  RY KEY(b));.  }.
14450 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
14460 6b 65 79 2d 35 36 2e 32 20 7b 0a 20 20 65 78 65  key-56.2 {.  exe
14470 63 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  csql { ALTER TAB
14480 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  LE 'p 1 "parent 
14490 6f 6e 65 22 27 20 52 45 4e 41 4d 45 20 54 4f 20  one"' RENAME TO 
144a0 70 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  p }.} {}.do_test
144b0 20 65 5f 66 6b 65 79 2d 35 36 2e 33 20 7b 0a 20   e_fkey-56.3 {. 
144c0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
144d0 50 44 41 54 45 20 70 20 53 45 54 20 61 20 3d 20  PDATE p SET a = 
144e0 27 78 78 78 27 2c 20 62 20 3d 20 27 78 78 78 27  'xxx', b = 'xxx'
144f0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
14500 52 4f 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45 43  ROM p;.    SELEC
14510 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 20  T * FROM c1;.   
14520 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
14530 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
14540 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 7d 20 7b  FROM c3;.  }.} {
14550 78 78 78 20 78 78 78 20 31 20 78 78 78 20 31 20  xxx xxx 1 xxx 1 
14560 78 78 78 20 31 20 78 78 78 7d 0a 64 6f 5f 74 65  xxx 1 xxx}.do_te
14570 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 34 20 7b  st e_fkey-56.4 {
14580 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
14590 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
145a0 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
145b0 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d   type = 'table'}
145c0 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  .} [list        
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
14610 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   {CREATE TABLE "
14620 70 22 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  p"(a REFERENCES 
14630 22 70 22 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  "p", b, PRIMARY 
14640 4b 45 59 28 62 29 29 7d 20 20 20 20 20 20 20 20  KEY(b))}        
14650 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b             \.  {
14660 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
14670 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20  c, d REFERENCES 
14680 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41  "p" ON UPDATE CA
14690 53 43 41 44 45 29 7d 20 20 20 20 20 20 20 20 20  SCADE)}         
146a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52           \.  {CR
146b0 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 65 2c  EATE TABLE c2(e,
146c0 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   f, FOREIGN KEY(
146d0 66 29 20 52 45 46 45 52 45 4e 43 45 53 20 22 70  f) REFERENCES "p
146e0 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  " ON UPDATE CASC
146f0 41 44 45 29 7d 20 20 5c 0a 20 20 7b 43 52 45 41  ADE)}  \.  {CREA
14700 54 45 20 54 41 42 4c 45 20 63 33 28 65 2c 20 27  TE TABLE c3(e, '
14710 66 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45 49 47  f col 2', FOREIG
14720 4e 20 4b 45 59 28 27 66 20 63 6f 6c 20 32 27 29  N KEY('f col 2')
14730 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 20   REFERENCES "p" 
14740 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
14750 45 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d 2d  E)} \.]..#------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147a0 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
147b0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 64 6f   a DROP TABLE do
147c0 65 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 44  es an implicit D
147d0 45 4c 45 54 45 20 46 52 4f 4d 2e 20 57 68 69 63  ELETE FROM. Whic
147e0 68 20 64 6f 65 73 20 6e 6f 74 0a 23 20 63 61 75  h does not.# cau
147f0 73 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20  se any triggers 
14800 74 6f 20 66 69 72 65 2c 20 62 75 74 20 64 6f 65  to fire, but doe
14810 73 20 66 69 72 65 20 66 6f 72 65 69 67 6e 20 6b  s fire foreign k
14820 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20  ey actions..#.# 
14830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
14840 34 32 30 38 2d 32 33 39 38 36 20 49 66 20 66 6f  4208-23986 If fo
14850 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14860 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
14870 64 20 77 68 65 6e 0a 23 20 69 74 20 69 73 20 70  d when.# it is p
14880 72 65 70 61 72 65 64 2c 20 74 68 65 20 44 52 4f  repared, the DRO
14890 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20  P TABLE command 
148a0 70 65 72 66 6f 72 6d 73 20 61 6e 20 69 6d 70 6c  performs an impl
148b0 69 63 69 74 20 44 45 4c 45 54 45 20 74 6f 0a 23  icit DELETE to.#
148c0 20 72 65 6d 6f 76 65 20 61 6c 6c 20 72 6f 77 73   remove all rows
148d0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
148e0 62 65 66 6f 72 65 20 64 72 6f 70 70 69 6e 67 20  before dropping 
148f0 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  it..#.# EVIDENCE
14900 2d 4f 46 3a 20 52 2d 31 31 30 37 38 2d 30 33 39  -OF: R-11078-039
14910 34 35 20 54 68 65 20 69 6d 70 6c 69 63 69 74 20  45 The implicit 
14920 44 45 4c 45 54 45 20 64 6f 65 73 20 6e 6f 74 20  DELETE does not 
14930 63 61 75 73 65 20 61 6e 79 20 53 51 4c 0a 23 20  cause any SQL.# 
14940 74 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65  triggers to fire
14950 2c 20 62 75 74 20 6d 61 79 20 69 6e 76 6f 6b 65  , but may invoke
14960 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
14970 69 6f 6e 73 20 6f 72 20 63 6f 6e 73 74 72 61 69  ions or constrai
14980 6e 74 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 73 2e  nt.# violations.
14990 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
149a0 79 2d 35 37 2e 31 20 7b 0a 20 20 64 72 6f 70 5f  y-57.1 {.  drop_
149b0 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
149c0 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
149d0 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c 20  E TABLE p(a, b, 
149e0 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
149f0 29 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ));..    CREATE 
14a00 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46  TABLE c1(c, d, F
14a10 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14a20 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14a30 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
14a40 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14a50 42 4c 45 20 63 32 28 63 2c 20 64 2c 20 46 4f 52  BLE c2(c, d, FOR
14a60 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
14a70 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44  EFERENCES p ON D
14a80 45 4c 45 54 45 20 53 45 54 20 44 45 46 41 55 4c  ELETE SET DEFAUL
14a90 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
14aa0 41 42 4c 45 20 63 33 28 63 2c 20 64 2c 20 46 4f  ABLE c3(c, d, FO
14ab0 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
14ac0 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
14ad0 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b  DELETE CASCADE);
14ae0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
14af0 45 20 63 34 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c4(c, d, FOREI
14b00 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
14b10 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14b20 45 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20  ETE RESTRICT);. 
14b30 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14b40 63 35 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c5(c, d, FOREIGN
14b50 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
14b60 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54  ENCES p ON DELET
14b70 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20  E NO ACTION);.. 
14b80 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14b90 63 36 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20  c6(c, d, .      
14ba0 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64  FOREIGN KEY(c, d
14bb0 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  ) REFERENCES p O
14bc0 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
14bd0 54 20 0a 20 20 20 20 20 20 44 45 46 45 52 52 41  T .      DEFERRA
14be0 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
14bf0 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
14c00 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
14c10 37 28 63 2c 20 64 2c 20 0a 20 20 20 20 20 20 46  7(c, d, .      F
14c20 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14c30 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14c40 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f   DELETE NO ACTIO
14c50 4e 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42  N.      DEFERRAB
14c60 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
14c70 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20  ERRED.    );..  
14c80 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c    CREATE TABLE l
14c90 6f 67 28 6d 73 67 29 3b 0a 20 20 20 20 43 52 45  og(msg);.    CRE
14ca0 41 54 45 20 54 52 49 47 47 45 52 20 74 74 20 41  ATE TRIGGER tt A
14cb0 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70  FTER DELETE ON p
14cc0 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
14cd0 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
14ce0 55 45 53 28 27 64 65 6c 65 74 65 20 27 20 7c 7c  UES('delete ' ||
14cf0 20 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20 20   old.rowid);.   
14d00 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a   END;.  }.} {}..
14d10 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14d20 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
14d30 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
14d40 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20  O p VALUES('a', 
14d50 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'b');.    INSERT
14d60 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28   INTO c1 VALUES(
14d70 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49  'a', 'b');.    I
14d80 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41  NSERT INTO c2 VA
14d90 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
14da0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14db0 63 33 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  c3 VALUES('a', '
14dc0 62 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  b');.    BEGIN;.
14dd0 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
14de0 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   p;.      SELECT
14df0 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   * FROM c1;.  }.
14e00 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  } {{} {}}.do_tes
14e10 74 20 65 5f 66 6b 65 79 2d 35 37 2e 33 20 7b 0a  t e_fkey-57.3 {.
14e20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
14e30 43 54 20 2a 20 46 52 4f 4d 20 63 32 20 7d 0a 7d  CT * FROM c2 }.}
14e40 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74   {{} {}}.do_test
14e50 20 65 5f 66 6b 65 79 2d 35 37 2e 34 20 7b 0a 20   e_fkey-57.4 {. 
14e60 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
14e70 54 20 2a 20 46 52 4f 4d 20 63 33 20 7d 0a 7d 20  T * FROM c3 }.} 
14e80 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
14e90 79 2d 35 37 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-57.5 {.  execs
14ea0 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
14eb0 4f 4d 20 6c 6f 67 20 7d 0a 7d 20 7b 7d 0a 64 6f  OM log }.} {}.do
14ec0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e  _test e_fkey-57.
14ed0 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52 4f  6 {.  execsql RO
14ee0 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f 74  LLBACK.} {}.do_t
14ef0 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 37 20  est e_fkey-57.7 
14f00 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
14f10 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
14f20 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20 20  ELETE FROM p;.  
14f30 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
14f40 4d 20 6c 6f 67 3b 0a 20 20 20 20 52 4f 4c 4c 42  M log;.    ROLLB
14f50 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 64 65 6c  ACK;.  }.} {{del
14f60 65 74 65 20 31 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ete 1}}..#------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 2d 0a 23 20 49 66 20 61 6e 20 49 4d 4d 45  ---.# If an IMME
14fc0 44 49 41 54 45 20 66 6f 72 65 69 67 6e 20 6b 65  DIATE foreign ke
14fd0 79 20 66 61 69 6c 73 20 61 73 20 61 20 72 65 73  y fails as a res
14fe0 75 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ult of a DROP TA
14ff0 42 4c 45 2c 20 74 68 65 0a 23 20 44 52 4f 50 20  BLE, the.# DROP 
15000 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 66 61  TABLE command fa
15010 69 6c 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ils..#.# EVIDENC
15020 45 2d 4f 46 3a 20 52 2d 33 32 37 36 38 2d 34 37  E-OF: R-32768-47
15030 39 32 35 20 49 66 20 61 6e 20 69 6d 6d 65 64 69  925 If an immedi
15040 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
15050 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20  constraint is.# 
15060 76 69 6f 6c 61 74 65 64 2c 20 74 68 65 20 44 52  violated, the DR
15070 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
15080 6e 74 20 66 61 69 6c 73 20 61 6e 64 20 74 68 65  nt fails and the
15090 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 64 72   table is not dr
150a0 6f 70 70 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  opped..#.do_test
150b0 20 65 5f 66 6b 65 79 2d 35 38 2e 31 20 7b 0a 20   e_fkey-58.1 {. 
150c0 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
150d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 3b 0a  DELETE FROM c1;.
150e0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
150f0 63 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  c2;.    DELETE F
15100 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a 20 20 65 78  ROM c3;.  }.  ex
15110 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
15120 4e 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27 61  NTO c5 VALUES('a
15130 27 2c 20 27 62 27 29 20 7d 0a 20 20 63 61 74 63  ', 'b') }.  catc
15140 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  hsql { DROP TABL
15150 45 20 70 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  E p }.} {1 {FORE
15160 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
15170 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
15180 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 32 20  est e_fkey-58.2 
15190 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
151a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 20 7d 0a  LECT * FROM p }.
151b0 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20  } {a b}.do_test 
151c0 65 5f 66 6b 65 79 2d 35 38 2e 33 20 7b 0a 20 20  e_fkey-58.3 {.  
151d0 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42  catchsql {.    B
151e0 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50  EGIN;.      DROP
151f0 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d 20   TABLE p;.  }.} 
15200 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
15210 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
15220 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  d}}.do_test e_fk
15230 65 79 2d 35 38 2e 34 20 7b 0a 20 20 65 78 65 63  ey-58.4 {.  exec
15240 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
15250 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53   * FROM p;.    S
15260 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 35 3b  ELECT * FROM c5;
15270 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
15280 20 7d 0a 7d 20 7b 61 20 62 20 61 20 62 7d 0a 0a   }.} {a b a b}..
15290 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20  ----------.# If 
152e0 61 20 44 45 46 45 52 52 45 44 20 66 6f 72 65 69  a DEFERRED forei
152f0 67 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20  gn key fails as 
15300 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52  a result of a DR
15310 4f 50 20 54 41 42 4c 45 2c 20 61 74 74 65 6d 70  OP TABLE, attemp
15320 74 69 6e 67 0a 23 20 74 6f 20 63 6f 6d 6d 69 74  ting.# to commit
15330 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15340 20 66 61 69 6c 73 20 75 6e 6c 65 73 73 20 74 68   fails unless th
15350 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 66  e violation is f
15360 69 78 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ixed..#.# EVIDEN
15370 43 45 2d 4f 46 3a 20 52 2d 30 35 39 30 33 2d 30  CE-OF: R-05903-0
15380 38 34 36 30 20 49 66 20 61 20 64 65 66 65 72 72  8460 If a deferr
15390 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
153a0 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 23 20 76  onstraint is.# v
153b0 69 6f 6c 61 74 65 64 2c 20 74 68 65 6e 20 61 6e  iolated, then an
153c0 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
153d0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
153e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6f 6d   attempts to com
153f0 6d 69 74 0a 23 20 74 68 65 20 74 72 61 6e 73 61  mit.# the transa
15400 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 6f 72  ction if the for
15410 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
15420 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 73  int violations s
15430 74 69 6c 6c 20 65 78 69 73 74 0a 23 20 61 74 20  till exist.# at 
15440 74 68 61 74 20 70 6f 69 6e 74 2e 0a 23 0a 64 6f  that point..#.do
15450 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e  _test e_fkey-59.
15460 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
15470 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
15480 20 63 31 20 3b 20 44 45 4c 45 54 45 20 46 52 4f   c1 ; DELETE FRO
15490 4d 20 63 32 20 3b 20 44 45 4c 45 54 45 20 46 52  M c2 ; DELETE FR
154a0 4f 4d 20 63 33 20 3b 0a 20 20 20 20 44 45 4c 45  OM c3 ;.    DELE
154b0 54 45 20 46 52 4f 4d 20 63 34 20 3b 20 44 45 4c  TE FROM c4 ; DEL
154c0 45 54 45 20 46 52 4f 4d 20 63 35 20 3b 20 44 45  ETE FROM c5 ; DE
154d0 4c 45 54 45 20 46 52 4f 4d 20 63 36 20 3b 0a 20  LETE FROM c6 ;. 
154e0 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63     DELETE FROM c
154f0 37 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  7 .  }.} {}.do_t
15500 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 32 20  est e_fkey-59.2 
15510 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
15520 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c  SERT INTO c7 VAL
15530 55 45 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a  UES('a', 'b') }.
15540 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
15550 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f  BEGIN;.      DRO
15560 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 7d 0a 7d  P TABLE p;.  }.}
15570 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
15580 65 79 2d 35 39 2e 33 20 7b 0a 20 20 63 61 74 63  ey-59.3 {.  catc
15590 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31  hsql COMMIT.} {1
155a0 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
155b0 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
155c0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
155d0 2d 35 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -59.4 {.  execsq
155e0 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
155f0 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59   p(a, b, PRIMARY
15600 20 4b 45 59 28 61 2c 20 62 29 29 20 7d 0a 20 20   KEY(a, b)) }.  
15610 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
15620 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
15630 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
15640 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
15650 66 6b 65 79 2d 35 39 2e 35 20 7b 0a 20 20 65 78  fkey-59.5 {.  ex
15660 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
15670 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 61 27  NTO p VALUES('a'
15680 2c 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63 73  , 'b') }.  execs
15690 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
156a0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 6e 79  ----------.# Any
156f0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
15700 73 6d 61 74 63 68 22 20 65 72 72 6f 72 73 20 65  smatch" errors e
15710 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
15720 20 72 75 6e 6e 69 6e 67 20 61 6e 20 69 6d 70 6c   running an impl
15730 69 63 69 74 0a 23 20 22 44 45 4c 45 54 45 20 46  icit.# "DELETE F
15740 52 4f 4d 20 74 62 6c 22 20 61 72 65 20 69 67 6e  ROM tbl" are ign
15750 6f 72 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ored..#.# EVIDEN
15760 43 45 2d 4f 46 3a 20 52 2d 35 37 32 34 32 2d 33  CE-OF: R-57242-3
15770 37 30 30 35 20 41 6e 79 20 22 66 6f 72 65 69 67  7005 Any "foreig
15780 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 20  n key mismatch" 
15790 65 72 72 6f 72 73 0a 23 20 65 6e 63 6f 75 6e 74  errors.# encount
157a0 65 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ered as part of 
157b0 61 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45  an implicit DELE
157c0 54 45 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  TE are ignored..
157d0 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
157e0 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
157f0 2d 36 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -60.1 {.  execsq
15800 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66  l {.    PRAGMA f
15810 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
15820 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  F;..    CREATE T
15830 41 42 4c 45 20 70 28 61 20 50 52 49 4d 41 52 59  ABLE p(a PRIMARY
15840 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
15850 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29 3b  ES nosuchtable);
15860 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
15870 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c1(c, d, FOREI
15880 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
15890 45 52 45 4e 43 45 53 20 61 29 3b 0a 20 20 20 20  ERENCES a);.    
158a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
158b0 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 62  c REFERENCES p(b
158c0 29 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54  ), d);.    CREAT
158d0 45 20 54 41 42 4c 45 20 63 33 28 63 20 52 45 46  E TABLE c3(c REF
158e0 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
158f0 45 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 64 29  ETE SET NULL, d)
15900 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
15910 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20 32  TO p VALUES(1, 2
15920 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
15930 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20  TO c1 VALUES(1, 
15940 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
15950 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c  NTO c2 VALUES(1,
15960 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
15970 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31  INTO c3 VALUES(1
15980 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 2);.  }.} {}.d
15990 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30  o_test e_fkey-60
159a0 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
159b0 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
159c0 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 20 20 63 61  keys = ON }.  ca
159d0 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
159e0 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 6e  FROM p }.} {1 {n
159f0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61  o such table: ma
15a00 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d  in.nosuchtable}}
15a10 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15a20 36 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.3 {.  execsql
15a30 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
15a40 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70      DROP TABLE p
15a50 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
15a60 20 46 52 4f 4d 20 63 33 3b 0a 20 20 20 20 52 4f   FROM c3;.    RO
15a70 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b  LLBACK;.  }.} {{
15a80 7d 20 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } 2}.do_test e_f
15a90 6b 65 79 2d 36 30 2e 34 20 7b 0a 20 20 65 78 65  key-60.4 {.  exe
15aa0 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41  csql { CREATE TA
15ab0 42 4c 45 20 6e 6f 73 75 63 68 74 61 62 6c 65 28  BLE nosuchtable(
15ac0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 7d  x PRIMARY KEY) }
15ad0 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
15ae0 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20  LETE FROM p }.} 
15af0 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
15b00 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 32 22 20  mismatch - "c2" 
15b10 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 22 7d  referencing "p"}
15b20 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15b30 2d 36 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -60.5 {.  execsq
15b40 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 63  l { DROP TABLE c
15b50 31 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 }.  catchsql {
15b60 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d   DELETE FROM p }
15b70 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
15b80 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 63  ey mismatch - "c
15b90 32 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  2" referencing "
15ba0 70 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  p"}}.do_test e_f
15bb0 6b 65 79 2d 36 30 2e 36 20 7b 0a 20 20 65 78 65  key-60.6 {.  exe
15bc0 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  csql { DROP TABL
15bd0 45 20 63 32 20 7d 0a 20 20 65 78 65 63 73 71 6c  E c2 }.  execsql
15be0 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
15bf0 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c40 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
15c50 74 68 65 20 73 70 65 63 69 61 6c 20 62 65 68 61  the special beha
15c60 76 69 6f 72 73 20 6f 66 20 41 4c 54 45 52 20 61  viors of ALTER a
15c70 6e 64 20 44 52 4f 50 20 54 41 42 4c 45 20 61 72  nd DROP TABLE ar
15c80 65 20 6f 6e 6c 79 0a 23 20 61 63 74 69 76 61 74  e only.# activat
15c90 65 64 20 77 68 65 6e 20 66 6f 72 65 69 67 6e 20  ed when foreign 
15ca0 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64  keys are enabled
15cb0 2e 20 53 70 65 63 69 61 6c 20 62 65 68 61 76 69  . Special behavi
15cc0 6f 72 73 20 61 72 65 3a 0a 23 0a 23 20 20 20 31  ors are:.#.#   1
15cd0 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6e 6f 74  . ADD COLUMN not
15ce0 20 61 6c 6c 6f 77 69 6e 67 20 61 20 52 45 46 45   allowing a REFE
15cf0 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 77 69  RENCES clause wi
15d00 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 0a 23  th a non-NULL .#
15d10 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
15d20 6c 75 65 2e 0a 23 20 20 20 32 2e 20 4d 6f 64 69  lue..#   2. Modi
15d30 66 79 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  fying foreign ke
15d40 79 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 77 68  y definitions wh
15d50 65 6e 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c  en a parent tabl
15d60 65 20 69 73 20 52 45 4e 41 4d 45 64 2e 0a 23 20  e is RENAMEd..# 
15d70 20 20 33 2e 20 52 75 6e 6e 69 6e 67 20 61 6e 20    3. Running an 
15d80 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20  implicit DELETE 
15d90 46 52 4f 4d 20 63 6f 6d 6d 61 6e 64 20 61 73 20  FROM command as 
15da0 70 61 72 74 20 6f 66 20 44 52 4f 50 20 54 41 42  part of DROP TAB
15db0 4c 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  LE..#.# EVIDENCE
15dc0 2d 4f 46 3a 20 52 2d 35 34 31 34 32 2d 34 31 33  -OF: R-54142-413
15dd0 34 36 20 54 68 65 20 70 72 6f 70 65 72 74 69 65  46 The propertie
15de0 73 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54 41  s of the DROP TA
15df0 42 4c 45 20 61 6e 64 20 41 4c 54 45 52 0a 23 20  BLE and ALTER.# 
15e00 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 20 64  TABLE commands d
15e10 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 6f  escribed above o
15e20 6e 6c 79 20 61 70 70 6c 79 20 69 66 20 66 6f 72  nly apply if for
15e30 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e  eign keys are en
15e40 61 62 6c 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  abled..#.do_test
15e50 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 31 20 7b   e_fkey-61.1.1 {
15e60 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
15e70 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43  es.  execsql { C
15e80 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
15e90 2c 20 62 29 20 7d 0a 20 20 63 61 74 63 68 73 71  , b) }.  catchsq
15ea0 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
15eb0 74 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  t1 ADD COLUMN c 
15ec0 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45  DEFAULT 'xxx' RE
15ed0 46 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 7d 20  FERENCES t2 }.} 
15ee0 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61  {1 {Cannot add a
15ef0 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75   REFERENCES colu
15f00 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c  mn with non-NULL
15f10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d   default value}}
15f20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15f30 36 31 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  61.1.2 {.  execs
15f40 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  ql { PRAGMA fore
15f50 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 20 7d  ign_keys = OFF }
15f60 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54  .  execsql { ALT
15f70 45 52 20 54 41 42 4c 45 20 74 31 20 41 44 44 20  ER TABLE t1 ADD 
15f80 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54  COLUMN c DEFAULT
15f90 20 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45   'xxx' REFERENCE
15fa0 53 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71 6c  S t2 }.  execsql
15fb0 20 7b 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 74   WHERE name = 't
15fe0 31 27 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20  1' }.} {{CREATE 
15ff0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
16000 20 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52   DEFAULT 'xxx' R
16010 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d 0a  EFERENCES t2)}}.
16020 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
16030 31 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  1.1.3 {.  execsq
16040 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
16050 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d  gn_keys = ON }.}
16060 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}..do_test e_f
16070 6b 65 79 2d 36 31 2e 32 2e 31 20 7b 0a 20 20 64  key-61.2.1 {.  d
16080 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
16090 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
160a0 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20  REATE TABLE p(a 
160b0 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45  UNIQUE);.    CRE
160c0 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45  ATE TABLE c(b RE
160d0 46 45 52 45 4e 43 45 53 20 70 28 61 29 29 3b 0a  FERENCES p(a));.
160e0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
160f0 20 41 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52   ALTER TABLE p R
16100 45 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b  ENAME TO parent;
16110 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 71  .      SELECT sq
16120 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
16130 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20  ster WHERE name 
16140 3d 20 27 63 27 3b 0a 20 20 20 20 52 4f 4c 4c 42  = 'c';.    ROLLB
16150 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45  ACK;.  }.} {{CRE
16160 41 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45  ATE TABLE c(b RE
16170 46 45 52 45 4e 43 45 53 20 22 70 61 72 65 6e 74  FERENCES "parent
16180 22 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  "(a))}}.do_test 
16190 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 32 20 7b 0a  e_fkey-61.2.2 {.
161a0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
161b0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
161c0 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 41  eys = OFF;.    A
161d0 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52 45 4e  LTER TABLE p REN
161e0 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a 20  AME TO parent;. 
161f0 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
16200 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
16210 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 63   WHERE name = 'c
16220 27 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41 54  ';.  }.} {{CREAT
16230 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45  E TABLE c(b REFE
16240 52 45 4e 43 45 53 20 70 28 61 29 29 7d 7d 0a 64  RENCES p(a))}}.d
16250 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
16260 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.3 {.  execsql
16270 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
16280 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20  n_keys = ON }.} 
16290 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
162a0 65 79 2d 36 31 2e 33 2e 31 20 7b 0a 20 20 64 72  ey-61.3.1 {.  dr
162b0 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
162c0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
162d0 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55  EATE TABLE p(a U
162e0 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
162f0 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
16300 45 52 45 4e 43 45 53 20 70 28 61 29 20 4f 4e 20  ERENCES p(a) ON 
16310 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29  DELETE SET NULL)
16320 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
16330 4f 20 70 20 56 41 4c 55 45 53 28 27 78 27 29 3b  O p VALUES('x');
16340 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
16350 20 63 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a   c VALUES('x');.
16360 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
16370 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20   DROP TABLE p;. 
16380 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
16390 4f 4d 20 63 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  OM c;.    ROLLBA
163a0 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64  CK;.  }.} {{}}.d
163b0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
163c0 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
163d0 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f   {.    PRAGMA fo
163e0 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46  reign_keys = OFF
163f0 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
16400 20 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   p;.    SELECT *
16410 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a 7d 20 7b   FROM c;.  }.} {
16420 78 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  x}.do_test e_fke
16430 79 2d 36 31 2e 33 2e 33 20 7b 0a 20 20 65 78 65  y-61.3.3 {.  exe
16440 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
16450 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20  reign_keys = ON 
16460 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23  }.} {}..########
16470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
164b0 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
164c0 36 3a 20 4c 69 6d 69 74 73 20 61 6e 64 20 55 6e  6: Limits and Un
164d0 73 75 70 70 6f 72 74 65 64 20 46 65 61 74 75 72  supported Featur
164e0 65 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  es.#############
164f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16520 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
16530 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
16540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
16580 74 20 74 68 61 74 20 4d 41 54 43 48 20 63 6c 61  t that MATCH cla
16590 75 73 65 73 20 61 72 65 20 70 61 72 73 65 64 2c  uses are parsed,
165a0 20 62 75 74 20 53 51 4c 69 74 65 20 74 72 65 61   but SQLite trea
165b0 74 73 20 65 76 65 72 79 20 66 6f 72 65 69 67 6e  ts every foreign
165c0 20 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e   key.# constrain
165d0 74 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  t as if it were 
165e0 22 4d 41 54 43 48 20 53 49 4d 50 4c 45 22 2e 0a  "MATCH SIMPLE"..
165f0 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
16600 20 52 2d 32 34 37 32 38 2d 31 33 32 33 30 20 53   R-24728-13230 S
16610 51 4c 69 74 65 20 70 61 72 73 65 73 20 4d 41 54  QLite parses MAT
16620 43 48 20 63 6c 61 75 73 65 73 20 28 69 2e 65 2e  CH clauses (i.e.
16630 20 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 70 6f   does not.# repo
16640 72 74 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  rt a syntax erro
16650 72 20 69 66 20 79 6f 75 20 73 70 65 63 69 66 79  r if you specify
16660 20 6f 6e 65 29 2c 20 62 75 74 20 64 6f 65 73 20   one), but does 
16670 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 65 6d  not enforce them
16680 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
16690 46 3a 20 52 2d 32 34 34 35 30 2d 34 36 31 37 34  F: R-24450-46174
166a0 20 41 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79   All foreign key
166b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
166c0 53 51 4c 69 74 65 20 61 72 65 0a 23 20 68 61 6e  SQLite are.# han
166d0 64 6c 65 64 20 61 73 20 69 66 20 4d 41 54 43 48  dled as if MATCH
166e0 20 53 49 4d 50 4c 45 20 77 65 72 65 20 73 70 65   SIMPLE were spe
166f0 63 69 66 69 65 64 2e 0a 23 0a 66 6f 72 65 61 63  cified..#.foreac
16700 68 20 7a 4d 61 74 63 68 20 5b 6c 69 73 74 20 53  h zMatch [list S
16710 49 4d 50 4c 45 20 50 41 52 54 49 41 4c 20 46 55  IMPLE PARTIAL FU
16720 4c 4c 20 53 69 6d 70 6c 65 20 70 61 72 54 49 41  LL Simple parTIA
16730 4c 20 46 75 4c 4c 20 5d 20 7b 0a 20 20 64 72 6f  L FuLL ] {.  dro
16740 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64  p_all_tables.  d
16750 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32  o_test e_fkey-62
16760 2e 24 7a 4d 61 74 63 68 2e 31 20 7b 0a 20 20 20  .$zMatch.1 {.   
16770 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
16780 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28   CREATE TABLE p(
16790 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  a, b, c, PRIMARY
167a0 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 20   KEY(b, c));.   
167b0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
167c0 63 28 64 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49  c(d, e, f, FOREI
167d0 47 4e 20 4b 45 59 28 65 2c 20 66 29 20 52 45 46  GN KEY(e, f) REF
167e0 45 52 45 4e 43 45 53 20 70 20 4d 41 54 43 48 20  ERENCES p MATCH 
167f0 24 7a 4d 61 74 63 68 29 3b 0a 20 20 20 20 22 0a  $zMatch);.    ".
16800 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
16810 20 65 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74   e_fkey-62.$zMat
16820 63 68 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  ch.2 {.    execs
16830 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
16840 20 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20   p VALUES(1, 2, 
16850 33 29 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  3)         }..  
16860 20 20 23 20 4d 41 54 43 48 20 53 49 4d 50 4c 45    # MATCH SIMPLE
16870 20 62 65 68 61 76 69 6f 72 3a 20 41 6c 6c 6f 77   behavior: Allow
16880 20 61 6e 79 20 63 68 69 6c 64 20 6b 65 79 20 74   any child key t
16890 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  hat contains one
168a0 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 23 20 4e   or more.    # N
168b0 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 65 20  ULL value to be 
168c0 69 6e 73 65 72 74 65 64 2e 20 4e 6f 6e 2d 4e 55  inserted. Non-NU
168d0 4c 4c 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f 74  LL values do not
168e0 20 68 61 76 65 20 74 6f 20 6d 61 70 20 74 6f 20   have to map to 
168f0 61 6e 79 0a 20 20 20 20 23 20 70 61 72 65 6e 74  any.    # parent
16900 20 6b 65 79 20 76 61 6c 75 65 73 2c 20 73 6f 20   key values, so 
16910 6c 6f 6e 67 20 61 73 20 61 74 20 6c 65 61 73 74  long as at least
16920 20 6f 6e 65 20 66 69 65 6c 64 20 6f 66 20 74 68   one field of th
16930 65 20 63 68 69 6c 64 20 6b 65 79 20 69 73 0a 20  e child key is. 
16940 20 20 20 23 20 4e 55 4c 4c 2e 0a 20 20 20 20 65     # NULL..    e
16950 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
16960 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 77  INTO c VALUES('w
16970 27 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20 7d  ', 2, 3)       }
16980 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
16990 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c  NSERT INTO c VAL
169a0 55 45 53 28 27 78 27 2c 20 27 78 27 2c 20 4e 55  UES('x', 'x', NU
169b0 4c 4c 29 20 20 7d 0a 20 20 20 20 65 78 65 63 73  LL)  }.    execs
169c0 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
169d0 20 63 20 56 41 4c 55 45 53 28 27 79 27 2c 20 4e   c VALUES('y', N
169e0 55 4c 4c 2c 20 27 78 27 29 20 20 7d 0a 20 20 20  ULL, 'x')  }.   
169f0 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
16a00 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28  T INTO c VALUES(
16a10 27 7a 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  'z', NULL, NULL)
16a20 20 7d 0a 0a 20 20 20 20 23 20 43 68 65 63 6b 20   }..    # Check 
16a30 74 68 61 74 20 74 68 65 20 46 4b 20 69 73 20 65  that the FK is e
16a40 6e 66 6f 72 63 65 64 20 70 72 6f 70 65 72 6c 79  nforced properly
16a50 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
16a60 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 0a 20 20   NULL values .  
16a70 20 20 23 20 69 6e 20 74 68 65 20 63 68 69 6c 64    # in the child
16a80 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20   key columns..  
16a90 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16aa0 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45  ERT INTO c VALUE
16ab0 53 28 27 61 27 2c 20 32 2c 20 34 29 20 7d 0a 20  S('a', 2, 4) }. 
16ac0 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b   } {1 {FOREIGN K
16ad0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
16ae0 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  iled}}.}..#-----
16af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b30 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
16b40 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
16b50 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 54   support the SET
16b60 20 43 4f 4e 53 54 52 41 49 4e 54 20 73 74 61 74   CONSTRAINT stat
16b70 65 6d 65 6e 74 2e 20 41 6e 64 0a 23 20 74 68 61  ement. And.# tha
16b80 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
16b90 20 74 6f 20 63 72 65 61 74 65 20 62 6f 74 68 20   to create both 
16ba0 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 64 65  immediate and de
16bb0 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
16bc0 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
16bd0 2d 4f 46 3a 20 52 2d 32 31 35 39 39 2d 31 36 30  -OF: R-21599-160
16be0 33 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 61 20  38 In SQLite, a 
16bf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
16c00 74 72 61 69 6e 74 20 69 73 0a 23 20 70 65 72 6d  traint is.# perm
16c10 61 6e 65 6e 74 6c 79 20 6d 61 72 6b 65 64 20 61  anently marked a
16c20 73 20 64 65 66 65 72 72 65 64 20 6f 72 20 69 6d  s deferred or im
16c30 6d 65 64 69 61 74 65 20 77 68 65 6e 20 69 74 20  mediate when it 
16c40 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 72  is created..#.dr
16c50 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
16c60 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16c70 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
16c80 20 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54 53   SET CONSTRAINTS
16c90 20 41 4c 4c 20 49 4d 4d 45 44 49 41 54 45 20 7d   ALL IMMEDIATE }
16ca0 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 45 54  .} {1 {near "SET
16cb0 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d  ": syntax error}
16cc0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
16cd0 2d 36 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -62.2 {.  catchs
16ce0 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52 41  ql { SET CONSTRA
16cf0 49 4e 54 53 20 41 4c 4c 20 44 45 46 45 52 52 45  INTS ALL DEFERRE
16d00 44 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22  D }.} {1 {near "
16d10 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65 72 72  SET": syntax err
16d20 6f 72 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  or}}..do_test e_
16d30 66 6b 65 79 2d 36 32 2e 33 20 7b 0a 20 20 65 78  fkey-62.3 {.  ex
16d40 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
16d50 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c  TE TABLE p(a, b,
16d60 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
16d70 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
16d80 54 41 42 4c 45 20 63 64 28 63 2c 20 64 2c 20 0a  TABLE cd(c, d, .
16d90 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
16da0 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
16db0 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20  ES p DEFERRABLE 
16dc0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16dd0 45 44 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ED);.    CREATE 
16de0 54 41 42 4c 45 20 63 69 28 63 2c 20 64 2c 20 0a  TABLE ci(c, d, .
16df0 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
16e00 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
16e10 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20  ES p DEFERRABLE 
16e20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
16e30 41 54 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  ATE);.    BEGIN;
16e40 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
16e50 74 20 65 5f 66 6b 65 79 2d 36 32 2e 34 20 7b 0a  t e_fkey-62.4 {.
16e60 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16e70 45 52 54 20 49 4e 54 4f 20 63 69 20 56 41 4c 55  ERT INTO ci VALU
16e80 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d  ES('x', 'y') }.}
16e90 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
16ea0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
16eb0 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
16ec0 6b 65 79 2d 36 32 2e 35 20 7b 0a 20 20 63 61 74  key-62.5 {.  cat
16ed0 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
16ee0 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 28 27 78  NTO cd VALUES('x
16ef0 27 2c 20 27 79 27 29 20 7d 0a 7d 20 7b 30 20 7b  ', 'y') }.} {0 {
16f00 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
16f10 79 2d 36 32 2e 36 20 7b 0a 20 20 63 61 74 63 68  y-62.6 {.  catch
16f20 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d  sql { COMMIT }.}
16f30 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
16f40 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
16f50 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
16f60 6b 65 79 2d 36 32 2e 37 20 7b 0a 20 20 65 78 65  key-62.7 {.  exe
16f70 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45  csql { .    DELE
16f80 54 45 20 46 52 4f 4d 20 63 64 3b 0a 20 20 20 20  TE FROM cd;.    
16f90 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
16fa0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
16ff0 65 73 74 20 74 68 61 74 20 74 68 65 20 6d 61 78  est that the max
17000 69 6d 75 6d 20 72 65 63 75 72 73 69 6f 6e 20 64  imum recursion d
17010 65 70 74 68 20 6f 66 20 66 6f 72 65 69 67 6e 20  epth of foreign 
17020 6b 65 79 20 61 63 74 69 6f 6e 20 70 72 6f 67 72  key action progr
17030 61 6d 73 20 69 73 0a 23 20 67 6f 76 65 72 6e 65  ams is.# governe
17040 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
17050 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
17060 48 20 61 6e 64 20 53 51 4c 49 54 45 5f 4c 49 4d  H and SQLITE_LIM
17070 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
17080 0a 23 20 73 65 74 74 69 6e 67 73 2e 0a 23 0a 23  .# settings..#.#
17090 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
170a0 34 32 32 36 34 2d 33 30 35 30 33 20 54 68 65 20  42264-30503 The 
170b0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
170c0 45 52 5f 44 45 50 54 48 20 61 6e 64 0a 23 20 53  ER_DEPTH and.# S
170d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
170e0 47 45 52 5f 44 45 50 54 48 20 73 65 74 74 69 6e  GER_DEPTH settin
170f0 67 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  gs determine the
17100 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   maximum allowab
17110 6c 65 0a 23 20 64 65 70 74 68 20 6f 66 20 74 72  le.# depth of tr
17120 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 72 65  igger program re
17130 63 75 72 73 69 6f 6e 2e 20 46 6f 72 20 74 68 65  cursion. For the
17140 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 65   purposes of the
17150 73 65 20 6c 69 6d 69 74 73 2c 0a 23 20 66 6f 72  se limits,.# for
17160 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73  eign key actions
17170 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
17180 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
17190 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e  ..#.proc test_on
171a0 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f  _delete_recursio
171b0 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72  n {limit} {.  dr
171c0 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
171d0 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42  execsql { .    B
171e0 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
171f0 20 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d   TABLE t0(a PRIM
17200 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
17210 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20   INSERT INTO t0 
17220 56 41 4c 55 45 53 28 27 78 30 27 2c 20 4e 55 4c  VALUES('x0', NUL
17230 4c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  L);.  }.  for {s
17240 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20 24  et i 1} {$i <= $
17250 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d 20  limit} {incr i} 
17260 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a  {.    execsql ".
17270 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
17280 4c 45 20 74 24 69 20 28 0a 20 20 20 20 20 20 20  LE t$i (.       
17290 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20   a PRIMARY KEY, 
172a0 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 5b 65  b REFERENCES t[e
172b0 78 70 72 20 24 69 2d 31 5d 20 4f 4e 20 44 45 4c  xpr $i-1] ON DEL
172c0 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20  ETE CASCADE.    
172d0 20 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52    );.      INSER
172e0 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45  T INTO t$i VALUE
172f0 53 28 27 78 24 69 27 2c 20 27 78 5b 65 78 70 72  S('x$i', 'x[expr
17300 20 24 69 2d 31 5d 27 29 3b 0a 20 20 20 20 22 0a   $i-1]');.    ".
17310 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f    }.  execsql CO
17320 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c 20  MMIT.  catchsql 
17330 22 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ".    DELETE FRO
17340 4d 20 74 30 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t0;.    SELECT
17350 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
17360 24 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 70 72  $limit;.  ".}.pr
17370 6f 63 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74  oc test_on_updat
17380 65 5f 72 65 63 75 72 73 69 6f 6e 20 7b 6c 69 6d  e_recursion {lim
17390 69 74 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  it} {.  drop_all
173a0 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71  _tables.  execsq
173b0 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
173c0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
173d0 20 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t0(a PRIMARY KE
173e0 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
173f0 4e 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78  NTO t0 VALUES('x
17400 78 78 27 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20  xx');.  }.  for 
17410 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d  {set i 1} {$i <=
17420 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69   $limit} {incr i
17430 7d 20 7b 0a 20 20 20 20 73 65 74 20 6a 20 5b 65  } {.    set j [e
17440 78 70 72 20 24 69 2d 31 5d 0a 0a 20 20 20 20 65  xpr $i-1]..    e
17450 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 43  xecsql ".      C
17460 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 69 20  REATE TABLE t$i 
17470 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52  (a PRIMARY KEY R
17480 45 46 45 52 45 4e 43 45 53 20 74 24 6a 20 4f 4e  EFERENCES t$j ON
17490 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
174a0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
174b0 4e 54 4f 20 74 24 69 20 56 41 4c 55 45 53 28 27  NTO t$i VALUES('
174c0 78 78 78 27 29 3b 0a 20 20 20 20 22 0a 20 20 7d  xxx');.    ".  }
174d0 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
174e0 54 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20  T.  catchsql ". 
174f0 20 20 20 55 50 44 41 54 45 20 74 30 20 53 45 54     UPDATE t0 SET
17500 20 61 20 3d 20 27 79 79 79 27 3b 0a 20 20 20 20   a = 'yyy';.    
17510 53 45 4c 45 43 54 20 4e 4f 54 20 28 61 3d 27 79  SELECT NOT (a='y
17520 79 79 27 29 20 46 52 4f 4d 20 74 24 6c 69 6d 69  yy') FROM t$limi
17530 74 3b 0a 20 20 22 0a 7d 0a 0a 23 20 49 66 20 74  t;.  ".}..# If t
17540 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
17550 20 77 61 73 20 63 72 65 61 74 65 64 20 75 73 69   was created usi
17560 6e 67 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68  ng clang with th
17570 65 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61 64 64  e -fsanitize=add
17580 72 65 73 73 0a 23 20 73 77 69 74 63 68 2c 20 74  ress.# switch, t
17590 68 65 6e 20 74 68 65 20 6c 69 62 72 61 72 79 20  hen the library 
175a0 75 73 65 73 20 63 6f 6e 73 69 64 65 72 61 62 6c  uses considerabl
175b0 79 20 6d 6f 72 65 20 73 74 61 63 6b 20 73 70 61  y more stack spa
175c0 63 65 20 74 68 61 6e 20 75 73 75 61 6c 2e 0a 23  ce than usual..#
175d0 20 53 6f 20 6d 75 63 68 20 6d 6f 72 65 2c 20 74   So much more, t
175e0 68 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  hat some of the 
175f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
17600 63 61 75 73 65 20 73 74 61 63 6b 20 6f 76 65 72  cause stack over
17610 66 6c 6f 77 73 0a 23 20 69 66 20 74 68 65 79 20  flows.# if they 
17620 61 72 65 20 72 75 6e 20 75 6e 64 65 72 20 74 68  are run under th
17630 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
17640 2e 0a 23 0a 69 66 20 7b 5b 63 6c 61 6e 67 5f 73  ..#.if {[clang_s
17650 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73 5d  anitize_address]
17660 3d 3d 30 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ==0} {.  do_test
17670 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 31 20 7b   e_fkey-63.1.1 {
17680 0a 20 20 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c  .    test_on_del
17690 65 74 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53  ete_recursion $S
176a0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
176b0 52 5f 44 45 50 54 48 0a 20 20 7d 20 7b 30 20 30  R_DEPTH.  } {0 0
176c0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
176d0 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20 20 20  ey-63.1.2 {.    
176e0 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
176f0 65 63 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24  ecursion [expr $
17700 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
17710 45 52 5f 44 45 50 54 48 2b 31 5d 0a 20 20 7d 20  ER_DEPTH+1].  } 
17720 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  {1 {too many lev
17730 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
17740 65 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f  ecursion}}.  do_
17750 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31  test e_fkey-63.1
17760 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .3 {.    sqlite3
17770 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45  _limit db SQLITE
17780 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
17790 45 50 54 48 20 35 0a 20 20 20 20 20 20 74 65 73  EPTH 5.      tes
177a0 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75  t_on_delete_recu
177b0 72 73 69 6f 6e 20 35 0a 20 20 7d 20 7b 30 20 30  rsion 5.  } {0 0
177c0 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
177d0 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20 20 20  ey-63.1.4 {.    
177e0 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
177f0 65 63 75 72 73 69 6f 6e 20 36 0a 20 20 7d 20 7b  ecursion 6.  } {
17800 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
17810 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
17820 63 75 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  cursion}}.  do_t
17830 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e  est e_fkey-63.1.
17840 35 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  5 {.    sqlite3_
17850 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f  limit db SQLITE_
17860 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
17870 50 54 48 20 31 30 30 30 30 30 30 0a 20 20 7d 20  PTH 1000000.  } 
17880 7b 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {5}.  do_test e_
17890 66 6b 65 79 2d 36 33 2e 32 2e 31 20 7b 0a 20 20  fkey-63.2.1 {.  
178a0 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65    test_on_update
178b0 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51 4c 49  _recursion $SQLI
178c0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
178d0 45 50 54 48 0a 20 20 7d 20 7b 30 20 30 7d 0a 20  EPTH.  } {0 0}. 
178e0 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
178f0 36 33 2e 32 2e 32 20 7b 0a 20 20 20 20 74 65 73  63.2.2 {.    tes
17900 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75  t_on_update_recu
17910 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51 4c  rsion [expr $SQL
17920 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
17930 44 45 50 54 48 2b 31 5d 0a 20 20 7d 20 7b 31 20  DEPTH+1].  } {1 
17940 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73  {too many levels
17950 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75   of trigger recu
17960 72 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73  rsion}}.  do_tes
17970 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 33 20  t e_fkey-63.2.3 
17980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69  {.    sqlite3_li
17990 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49  mit db SQLITE_LI
179a0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
179b0 48 20 35 0a 20 20 20 20 20 20 74 65 73 74 5f 6f  H 5.      test_o
179c0 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69  n_update_recursi
179d0 6f 6e 20 35 0a 20 20 7d 20 7b 30 20 30 7d 0a 20  on 5.  } {0 0}. 
179e0 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
179f0 36 33 2e 32 2e 34 20 7b 0a 20 20 20 20 74 65 73  63.2.4 {.    tes
17a00 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75  t_on_update_recu
17a10 72 73 69 6f 6e 20 36 0a 20 20 7d 20 7b 31 20 7b  rsion 6.  } {1 {
17a20 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
17a30 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
17a40 73 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  sion}}.  do_test
17a50 20 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 35 20 7b   e_fkey-63.2.5 {
17a60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .    sqlite3_lim
17a70 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d  it db SQLITE_LIM
17a80 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
17a90 20 31 30 30 30 30 30 30 0a 20 20 7d 20 7b 35 7d   1000000.  } {5}
17aa0 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
17ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
17af0 20 54 68 65 20 73 65 74 74 69 6e 67 20 6f 66 20   The setting of 
17b00 74 68 65 20 72 65 63 75 72 73 69 76 65 5f 74 72  the recursive_tr
17b10 69 67 67 65 72 73 20 70 72 61 67 6d 61 20 64 6f  iggers pragma do
17b20 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 66 6f  es not affect fo
17b30 72 65 69 67 6e 0a 23 20 6b 65 79 20 61 63 74 69  reign.# key acti
17b40 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ons..#.# EVIDENC
17b50 45 2d 4f 46 3a 20 52 2d 35 31 37 36 39 2d 33 32  E-OF: R-51769-32
17b60 37 33 30 20 54 68 65 20 50 52 41 47 4d 41 20 72  730 The PRAGMA r
17b70 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
17b80 73 20 73 65 74 74 69 6e 67 20 64 6f 65 73 0a 23  s setting does.#
17b90 20 6e 6f 74 20 6e 6f 74 20 61 66 66 65 63 74 20   not not affect 
17ba0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
17bb0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
17bc0 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ions..#.foreach 
17bd0 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
17be0 72 73 5f 73 65 74 74 69 6e 67 20 5b 6c 69 73 74  rs_setting [list
17bf0 20 30 20 31 20 4f 4e 20 4f 46 46 5d 20 7b 0a 20   0 1 ON OFF] {. 
17c00 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
17c10 0a 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47  .  execsql "PRAG
17c20 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
17c30 67 67 65 72 73 20 3d 20 24 72 65 63 75 72 73 69  ggers = $recursi
17c40 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17c50 69 6e 67 22 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ing"..  do_test 
17c60 65 5f 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72  e_fkey-64.$recur
17c70 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65  sive_triggers_se
17c80 74 74 69 6e 67 2e 31 20 7b 0a 20 20 20 20 65 78  tting.1 {.    ex
17c90 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
17ca0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
17cb0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
17cc0 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20  EFERENCES t1 ON 
17cd0 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 29 3b  DELETE CASCADE);
17ce0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17cf0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
17d00 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 49 4e 53  NULL);.      INS
17d10 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
17d20 45 53 28 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  ES(2, 1);.      
17d30 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
17d40 41 4c 55 45 53 28 33 2c 20 32 29 3b 0a 20 20 20  ALUES(3, 2);.   
17d50 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
17d60 31 20 56 41 4c 55 45 53 28 34 2c 20 33 29 3b 0a  1 VALUES(4, 3);.
17d70 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
17d80 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 34  O t1 VALUES(5, 4
17d90 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
17da0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
17db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 35 7d 0a  ;.    }.  } {5}.
17dc0 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
17dd0 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74  -64.$recursive_t
17de0 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e  riggers_setting.
17df0 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
17e00 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
17e10 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
17e20 61 20 3d 20 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a  a = 1 }.  } {1}.
17e30 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
17e40 2d 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74  -64.$recursive_t
17e50 72 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e  riggers_setting.
17e60 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
17e70 7b 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  { .      DELETE 
17e80 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17e90 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  = 1;.      SELEC
17ea0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
17eb0 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  t1;.    }.  } {0
17ec0 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }.}..finish_test
17ed0 0a                                               .