SQLite4
Hex Artifact Content
Not logged in

Artifact 8ccbe3e08c2c35e5e286ea28a8f1c2727de2879b:


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 34 5f 4f 4d  ither SQLITE4_OM
0340: 49 54 5f 54 52 49 47 47 45 52 20 6f 72 20 53 51  IT_TRIGGER or SQ
0350: 4c 49 54 45 34 5f 4f 4d 49 54 5f 46 4f 52 45 49  LITE4_OMIT_FOREI
0360: 47 4e 5f 4b 45 59 20 77 61 73 20 64 65 66 69 6e  GN_KEY was defin
0370: 65 64 0a 23 20 61 74 20 62 75 69 6c 64 20 74 69  ed.# at build ti
0380: 6d 65 29 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74  me)..#..set test
0390: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
03a0: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
03b0: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
03c0: 2e 74 63 6c 0a 0a 70 72 6f 63 20 65 71 70 20 7b  .tcl..proc eqp {
03d0: 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 20 75  sql {db db}} { u
03e0: 70 6c 65 76 65 6c 20 65 78 65 63 73 71 6c 20 5b  plevel execsql [
03f0: 6c 69 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55  list "EXPLAIN QU
0400: 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 20  ERY PLAN $sql"] 
0410: 24 64 62 20 7d 0a 0a 23 23 23 23 23 23 23 23 23  $db }..#########
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: 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 32  ##.### SECTION 2
0470: 3a 20 45 6e 61 62 6c 69 6e 67 20 46 6f 72 65 69  : Enabling Forei
0480: 67 6e 20 4b 65 79 20 53 75 70 70 6f 72 74 0a 23  gn 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 23 23 0a 0a 23 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 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
0530: 45 2d 4f 46 3a 20 52 2d 33 33 37 31 30 2d 35 36  E-OF: R-33710-56
0540: 33 34 34 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  344 In order to 
0550: 75 73 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  use foreign key 
0560: 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 0a 23  constraints in.#
0570: 20 53 51 4c 69 74 65 2c 20 74 68 65 20 6c 69 62   SQLite, the lib
0580: 72 61 72 79 20 6d 75 73 74 20 62 65 20 63 6f 6d  rary must be com
0590: 70 69 6c 65 64 20 77 69 74 68 20 6e 65 69 74 68  piled with neith
05a0: 65 72 0a 23 20 53 51 4c 49 54 45 34 5f 4f 4d 49  er.# SQLITE4_OMI
05b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20 6f 72  T_FOREIGN_KEY or
05c0: 20 53 51 4c 49 54 45 34 5f 4f 4d 49 54 5f 54 52   SQLITE4_OMIT_TR
05d0: 49 47 47 45 52 20 64 65 66 69 6e 65 64 2e 0a 23  IGGER defined..#
05e0: 0a 69 66 63 61 70 61 62 6c 65 20 74 72 69 67 67  .ifcapable trigg
05f0: 65 72 26 26 66 6f 72 65 69 67 6e 6b 65 79 20 7b  er&&foreignkey {
0600: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
0610: 79 2d 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  y-1 {.    execsq
0620: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
0630: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
0640: 4f 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ON;.      CREATE
0650: 20 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d 41   TABLE p(i PRIMA
0660: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 20 20 43  RY KEY);.      C
0670: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20  REATE TABLE c(j 
0680: 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20  REFERENCES p ON 
0690: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
06a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
06b0: 54 4f 20 70 20 56 41 4c 55 45 53 28 27 68 65 6c  TO p VALUES('hel
06c0: 6c 6f 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  lo');.      INSE
06d0: 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
06e0: 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 20  ('hello');.     
06f0: 20 55 50 44 41 54 45 20 70 20 53 45 54 20 69 20   UPDATE p SET i 
0700: 3d 20 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20 20  = 'world';.     
0710: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
0720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 6f 72  ;.    }.  } {wor
0730: 6c 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ld}.}..#--------
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 2d 2d 2d  ----------------
0780: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 65 66 66  -.# Test the eff
0790: 65 63 74 73 20 6f 66 20 64 65 66 69 6e 69 6e 67  ects of defining
07a0: 20 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 62 75   OMIT_TRIGGER bu
07b0: 74 20 6e 6f 74 20 4f 4d 49 54 5f 46 4f 52 45 49  t not OMIT_FOREI
07c0: 47 4e 5f 4b 45 59 2e 0a 23 0a 23 20 45 56 49 44  GN_KEY..#.# EVID
07d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 36 39 37  ENCE-OF: R-44697
07e0: 2d 36 31 35 34 33 20 49 66 20 53 51 4c 49 54 45  -61543 If SQLITE
07f0: 34 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 69  4_OMIT_TRIGGER i
0800: 73 20 64 65 66 69 6e 65 64 20 62 75 74 0a 23 20  s defined but.# 
0810: 53 51 4c 49 54 45 34 5f 4f 4d 49 54 5f 46 4f 52  SQLITE4_OMIT_FOR
0820: 45 49 47 4e 5f 4b 45 59 20 69 73 20 6e 6f 74 2c  EIGN_KEY is not,
0830: 20 74 68 65 6e 20 53 51 4c 69 74 65 20 62 65 68   then SQLite beh
0840: 61 76 65 73 20 61 73 20 69 74 20 64 69 64 20 70  aves as it did p
0850: 72 69 6f 72 20 74 6f 0a 23 20 76 65 72 73 69 6f  rior to.# versio
0860: 6e 20 33 2e 36 2e 31 39 20 2d 20 66 6f 72 65 69  n 3.6.19 - forei
0870: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
0880: 6e 73 20 61 72 65 20 70 61 72 73 65 64 20 61 6e  ns are parsed an
0890: 64 20 6d 61 79 20 62 65 20 71 75 65 72 69 65 64  d may be queried
08a0: 0a 23 20 75 73 69 6e 67 20 50 52 41 47 4d 41 20  .# using PRAGMA 
08b0: 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
08c0: 2c 20 62 75 74 20 66 6f 72 65 69 67 6e 20 6b 65  , but foreign ke
08d0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
08e0: 65 20 6e 6f 74 0a 23 20 65 6e 66 6f 72 63 65 64  e not.# enforced
08f0: 2e 0a 23 0a 23 20 53 70 65 63 69 66 69 63 61 6c  ..#.# Specifical
0900: 6c 79 2c 20 74 65 73 74 20 74 68 61 74 20 22 50  ly, test that "P
0910: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0920: 79 73 22 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ys" is a no-op i
0930: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 23 20 57  n this case..# W
0940: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70 72  hen using the pr
0950: 61 67 6d 61 20 74 6f 20 71 75 65 72 79 20 74 68  agma to query th
0960: 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
0970: 67 2c 20 30 20 72 6f 77 73 20 61 72 65 20 72 65  g, 0 rows are re
0980: 74 75 72 6e 65 64 2e 0a 23 0a 23 20 45 56 49 44  turned..#.# EVID
0990: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 35 36 37  ENCE-OF: R-22567
09a0: 2d 34 34 30 33 39 20 54 68 65 20 50 52 41 47 4d  -44039 The PRAGM
09b0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 63  A foreign_keys c
09c0: 6f 6d 6d 61 6e 64 20 69 73 20 61 20 6e 6f 2d 6f  ommand is a no-o
09d0: 70 0a 23 20 69 6e 20 74 68 69 73 20 63 6f 6e 66  p.# in this conf
09e0: 69 67 75 72 61 74 69 6f 6e 2e 0a 23 0a 23 20 45  iguration..#.# E
09f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
0a00: 37 38 34 2d 31 33 33 33 39 20 54 69 70 3a 20 49  784-13339 Tip: I
0a10: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 22 50  f the command "P
0a20: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0a30: 79 73 22 0a 23 20 72 65 74 75 72 6e 73 20 6e 6f  ys".# returns no
0a40: 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
0a50: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
0a60: 6e 74 61 69 6e 69 6e 67 20 22 30 22 20 6f 72 20  ntaining "0" or 
0a70: 22 31 22 2c 20 74 68 65 6e 0a 23 20 74 68 65 20  "1", then.# the 
0a80: 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74  version of SQLit
0a90: 65 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  e you are using 
0aa0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
0ab0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 0a 23 20   foreign keys.# 
0ac0: 28 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20  (either because 
0ad0: 69 74 20 69 73 20 6f 6c 64 65 72 20 74 68 61 6e  it is older than
0ae0: 20 33 2e 36 2e 31 39 20 6f 72 20 62 65 63 61 75   3.6.19 or becau
0af0: 73 65 20 69 74 20 77 61 73 20 63 6f 6d 70 69 6c  se it was compil
0b00: 65 64 0a 23 20 77 69 74 68 20 53 51 4c 49 54 45  ed.# with SQLITE
0b10: 34 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  4_OMIT_FOREIGN_K
0b20: 45 59 20 6f 72 20 53 51 4c 49 54 45 34 5f 4f 4d  EY or SQLITE4_OM
0b30: 49 54 5f 54 52 49 47 47 45 52 20 64 65 66 69 6e  IT_TRIGGER defin
0b40: 65 64 29 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ed)..#.reset_db.
0b50: 69 66 63 61 70 61 62 6c 65 20 21 74 72 69 67 67  ifcapable !trigg
0b60: 65 72 26 26 66 6f 72 65 69 67 6e 6b 65 79 20 7b  er&&foreignkey {
0b70: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
0b80: 79 2d 32 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  y-2.1 {.    exec
0b90: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
0ba0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
0bb0: 3d 20 4f 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  = ON;.      CREA
0bc0: 54 45 20 54 41 42 4c 45 20 70 28 69 20 50 52 49  TE TABLE p(i PRI
0bd0: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 20  MARY KEY);.     
0be0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28   CREATE TABLE c(
0bf0: 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f  j REFERENCES p O
0c00: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
0c10: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
0c20: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 68  INTO p VALUES('h
0c30: 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 20 20 49 4e  ello');.      IN
0c40: 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
0c50: 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20  ES('hello');.   
0c60: 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54 20     UPDATE p SET 
0c70: 69 20 3d 20 27 77 6f 72 6c 64 27 3b 0a 20 20 20  i = 'world';.   
0c80: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0c90: 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 68   c;.    }.  } {h
0ca0: 65 6c 6c 6f 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ello}.  do_test 
0cb0: 65 5f 66 6b 65 79 2d 32 2e 32 20 7b 0a 20 20 20  e_fkey-2.2 {.   
0cc0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
0cd0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69  A foreign_key_li
0ce0: 73 74 28 63 29 20 7d 0a 20 20 7d 20 7b 30 20 30  st(c) }.  } {0 0
0cf0: 20 70 20 6a 20 7b 7d 20 43 41 53 43 41 44 45 20   p j {} CASCADE 
0d00: 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45  {NO ACTION} NONE
0d10: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.  do_test e_fk
0d20: 65 79 2d 32 2e 33 20 7b 0a 20 20 20 20 65 78 65  ey-2.3 {.    exe
0d30: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
0d40: 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 20 20 7d  reign_keys }.  }
0d50: 20 7b 7d 0a 7d 0a 0a 0a 23 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 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 65 66  --.# Test the ef
0db0: 66 65 63 74 73 20 6f 66 20 64 65 66 69 6e 69 6e  fects of definin
0dc0: 67 20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  g OMIT_FOREIGN_K
0dd0: 45 59 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  EY..#.# EVIDENCE
0de0: 2d 4f 46 3a 20 52 2d 35 38 34 32 38 2d 33 36 36  -OF: R-58428-366
0df0: 36 30 20 49 66 20 4f 4d 49 54 5f 46 4f 52 45 49  60 If OMIT_FOREI
0e00: 47 4e 5f 4b 45 59 20 69 73 20 64 65 66 69 6e 65  GN_KEY is define
0e10: 64 2c 20 74 68 65 6e 0a 23 20 66 6f 72 65 69 67  d, then.# foreig
0e20: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
0e30: 73 20 63 61 6e 6e 6f 74 20 65 76 65 6e 20 62 65  s cannot even be
0e40: 20 70 61 72 73 65 64 20 28 61 74 74 65 6d 70 74   parsed (attempt
0e50: 69 6e 67 20 74 6f 20 73 70 65 63 69 66 79 20 61  ing to specify a
0e60: 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  .# foreign key d
0e70: 65 66 69 6e 69 74 69 6f 6e 20 69 73 20 61 20 73  efinition is a s
0e80: 79 6e 74 61 78 20 65 72 72 6f 72 29 2e 0a 23 0a  yntax error)..#.
0e90: 23 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  # Specifically, 
0ea0: 74 65 73 74 20 74 68 61 74 20 66 6f 72 65 69 67  test that foreig
0eb0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
0ec0: 73 20 63 61 6e 6e 6f 74 20 65 76 65 6e 20 62 65  s cannot even be
0ed0: 20 70 61 72 73 65 64 20 0a 23 20 69 6e 20 73 75   parsed .# in su
0ee0: 63 68 20 61 20 62 75 69 6c 64 2e 0a 23 0a 72 65  ch a build..#.re
0ef0: 73 65 74 5f 64 62 0a 69 66 63 61 70 61 62 6c 65  set_db.ifcapable
0f00: 20 21 66 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20   !foreignkey {. 
0f10: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
0f20: 33 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  3.1 {.    execsq
0f30: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
0f40: 20 70 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59   p(i PRIMARY KEY
0f50: 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ) }.    catchsql
0f60: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
0f70: 63 28 6a 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(j REFERENCES p
0f80: 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
0f90: 44 45 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e 65  DE) }.  } {1 {ne
0fa0: 61 72 20 22 4f 4e 22 3a 20 73 79 6e 74 61 78 20  ar "ON": syntax 
0fb0: 65 72 72 6f 72 7d 7d 0a 20 20 64 6f 5f 74 65 73  error}}.  do_tes
0fc0: 74 20 65 5f 66 6b 65 79 2d 33 2e 32 20 7b 0a 20  t e_fkey-3.2 {. 
0fd0: 20 20 20 23 20 54 68 69 73 20 69 73 20 61 6c 6c     # This is all
0fe0: 6f 77 65 64 2c 20 61 73 20 69 6e 20 74 68 69 73  owed, as in this
0ff0: 20 62 75 69 6c 64 2c 20 22 52 45 46 45 52 45 4e   build, "REFEREN
1000: 43 45 53 22 20 69 73 20 6e 6f 74 20 61 20 6b 65  CES" is not a ke
1010: 79 77 6f 72 64 2e 0a 20 20 20 20 23 20 54 68 65  yword..    # The
1020: 20 64 65 63 6c 61 72 65 64 20 64 61 74 61 74 79   declared dataty
1030: 70 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6a 20 69  pe of column j i
1040: 73 20 22 52 45 46 45 52 45 4e 43 45 53 20 70 22  s "REFERENCES p"
1050: 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ..    execsql { 
1060: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a  CREATE TABLE c(j
1070: 20 52 45 46 45 52 45 4e 43 45 53 20 70 29 20 7d   REFERENCES p) }
1080: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
1090: 74 20 65 5f 66 6b 65 79 2d 33 2e 33 20 7b 0a 20  t e_fkey-3.3 {. 
10a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
10b0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 63  GMA table_info(c
10c0: 29 20 7d 0a 20 20 7d 20 7b 30 20 6a 20 7b 52 45  ) }.  } {0 j {RE
10d0: 46 45 52 45 4e 43 45 53 20 70 7d 20 30 20 7b 7d  FERENCES p} 0 {}
10e0: 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f   0}.  do_test e_
10f0: 66 6b 65 79 2d 33 2e 34 20 7b 0a 20 20 20 20 65  fkey-3.4 {.    e
1100: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1110: 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
1120: 28 63 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  (c) }.  } {}.  d
1130: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 2e  o_test e_fkey-3.
1140: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
1150: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
1160: 5f 6b 65 79 73 20 7d 0a 20 20 7d 20 7b 7d 0a 7d  _keys }.  } {}.}
1170: 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 66 6f 72  ..ifcapable !for
1180: 65 69 67 6e 6b 65 79 7c 7c 21 74 72 69 67 67 65  eignkey||!trigge
1190: 72 20 7b 20 66 69 6e 69 73 68 5f 74 65 73 74 20  r { finish_test 
11a0: 3b 20 72 65 74 75 72 6e 20 7d 0a 72 65 73 65 74  ; return }.reset
11b0: 5f 64 62 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  _db...#---------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 0a 23 20 55 70 64 61 74 65 20 66 6f 72 20 73 72  .# Update for sr
1210: 63 34 3a 20 66 6f 72 65 69 67 6e 2d 6b 65 79 73  c4: foreign-keys
1220: 20 61 72 65 20 6f 6e 20 62 79 20 64 65 66 61 75   are on by defau
1230: 6c 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  lt..#.drop_all_t
1240: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
1250: 66 6b 65 79 2d 34 2e 31 20 7b 0a 20 20 65 78 65  fkey-4.1 {.  exe
1260: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1270: 45 20 54 41 42 4c 45 20 70 28 69 20 50 52 49 4d  E TABLE p(i PRIM
1280: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
1290: 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 20 52  EATE TABLE c(j R
12a0: 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 55  EFERENCES p ON U
12b0: 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a  PDATE CASCADE);.
12c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12d0: 70 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27  p VALUES('hello'
12e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
12f0: 54 4f 20 63 20 56 41 4c 55 45 53 28 27 68 65 6c  TO c VALUES('hel
1300: 6c 6f 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45  lo');.    UPDATE
1310: 20 70 20 53 45 54 20 69 20 3d 20 27 77 6f 72 6c   p SET i = 'worl
1320: 64 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  d';.    SELECT *
1330: 20 46 52 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20   FROM c;.  } .} 
1340: 7b 77 6f 72 6c 64 7d 0a 64 6f 5f 74 65 73 74 20  {world}.do_test 
1350: 65 5f 66 6b 65 79 2d 34 2e 32 20 7b 0a 20 20 65  e_fkey-4.2 {.  e
1360: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
1370: 45 54 45 20 46 52 4f 4d 20 63 3b 0a 20 20 20 20  ETE FROM c;.    
1380: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 3b 0a 20  DELETE FROM p;. 
1390: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
13a0: 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20  n_keys = ON;.   
13b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
13c0: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a  ALUES('hello');.
13d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13e0: 63 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27  c VALUES('hello'
13f0: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 20  );.    UPDATE p 
1400: 53 45 54 20 69 20 3d 20 27 77 6f 72 6c 64 27 3b  SET i = 'world';
1410: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1420: 4f 4d 20 63 3b 0a 20 20 7d 20 0a 7d 20 7b 77 6f  OM c;.  } .} {wo
1430: 72 6c 64 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  rld}..#---------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1480: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
1490: 52 2d 31 35 32 37 38 2d 35 34 34 35 36 20 54 68  R-15278-54456 Th
14a0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  e application ca
14b0: 6e 20 63 61 6e 20 61 6c 73 6f 20 75 73 65 20 61  n can also use a
14c0: 20 50 52 41 47 4d 41 0a 23 20 66 6f 72 65 69 67   PRAGMA.# foreig
14d0: 6e 5f 6b 65 79 73 20 73 74 61 74 65 6d 65 6e 74  n_keys statement
14e0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
14f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72   foreign keys ar
1500: 65 20 63 75 72 72 65 6e 74 6c 79 0a 23 20 65 6e  e currently.# en
1510: 61 62 6c 65 64 2e 0a 23 0a 23 20 54 68 69 73 20  abled..#.# This 
1520: 61 6c 73 6f 20 74 65 73 74 73 20 74 68 65 20 65  also tests the e
1530: 78 61 6d 70 6c 65 20 63 6f 64 65 20 69 6e 20 73  xample code in s
1540: 65 63 74 69 6f 6e 20 32 20 6f 66 20 66 6f 72 65  ection 2 of fore
1550: 69 67 6e 6b 65 79 73 2e 69 6e 2e 0a 23 0a 23 20  ignkeys.in..#.# 
1560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1570: 31 32 35 35 2d 31 39 39 30 37 0a 23 20 0a 72 65  1255-19907.# .re
1580: 73 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 65  set_db.do_test e
1590: 5f 66 6b 65 79 2d 35 2e 31 20 7b 0a 20 20 65 78  _fkey-5.1 {.  ex
15a0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66  ecsql { PRAGMA f
15b0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 0a 7d 20  oreign_keys }.} 
15c0: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {1}.do_test e_fk
15d0: 65 79 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73  ey-5.2 {.  execs
15e0: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
15f0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
1600: 4f 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66  ON;.    PRAGMA f
1610: 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d  oreign_keys;.  }
1620: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {1}.do_test e
1630: 5f 66 6b 65 79 2d 35 2e 33 20 7b 0a 20 20 65 78  _fkey-5.3 {.  ex
1640: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
1650: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
1660: 20 3d 20 4f 46 46 3b 0a 20 20 20 20 50 52 41 47   = OFF;.    PRAG
1670: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b  MA foreign_keys;
1680: 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d  .  }.} {0}..#---
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
16e0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  at it is not pos
16f0: 73 69 62 6c 65 20 74 6f 20 65 6e 61 62 6c 65 20  sible to enable 
1700: 6f 72 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  or disable forei
1710: 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 0a 23  gn key support.#
1720: 20 77 68 69 6c 65 20 6e 6f 74 20 69 6e 20 61 75   while not in au
1730: 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a  to-commit mode..
1740: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1750: 20 52 2d 34 36 36 34 39 2d 35 38 35 33 37 20 49   R-46649-58537 I
1760: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1770: 65 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64  e to enable or d
1780: 69 73 61 62 6c 65 0a 23 20 66 6f 72 65 69 67 6e  isable.# foreign
1790: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
17a0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
17b0: 66 20 61 20 6d 75 6c 74 69 2d 73 74 61 74 65 6d  f a multi-statem
17c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
17d0: 23 20 28 77 68 65 6e 20 53 51 4c 69 74 65 20 69  # (when SQLite i
17e0: 73 20 6e 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d  s not in autocom
17f0: 6d 69 74 20 6d 6f 64 65 29 2e 20 41 74 74 65 6d  mit mode). Attem
1800: 70 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f 20 64  pting to do so d
1810: 6f 65 73 20 6e 6f 74 0a 23 20 72 65 74 75 72 6e  oes not.# return
1820: 20 61 6e 20 65 72 72 6f 72 3b 20 69 74 20 73 69   an error; it si
1830: 6d 70 6c 79 20 68 61 73 20 6e 6f 20 65 66 66 65  mply has no effe
1840: 63 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  ct..#.reset_db.d
1850: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e  o_test e_fkey-6.
1860: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1870: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
1880: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
1890: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
18a0: 31 28 61 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a  1(a UNIQUE, b);.
18b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
18c0: 20 74 32 28 63 2c 20 64 20 52 45 46 45 52 45 4e   t2(c, d REFEREN
18d0: 43 45 53 20 74 31 28 61 29 29 3b 0a 20 20 20 20  CES t1(a));.    
18e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
18f0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
1900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1910: 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20  VALUES(2, 1);.  
1920: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50    BEGIN;.      P
1930: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
1940: 79 73 20 3d 20 4f 46 46 3b 0a 20 20 7d 0a 20 20  ys = OFF;.  }.  
1950: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
1960: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 0a   DELETE FROM t1.
1970: 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67    }.} {1 {foreig
1980: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
1990: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
19a0: 74 20 65 5f 66 6b 65 79 2d 36 2e 32 20 7b 0a 20  t e_fkey-6.2 {. 
19b0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
19c0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d  A foreign_keys }
19d0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {1}.do_test e
19e0: 5f 66 6b 65 79 2d 36 2e 33 20 7b 0a 20 20 65 78  _fkey-6.3 {.  ex
19f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  ecsql {.    COMM
1a00: 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 66  IT;.    PRAGMA f
1a10: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
1a20: 46 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  F;.    BEGIN;.  
1a30: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
1a40: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20  gn_keys = ON;.  
1a50: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1a60: 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  t1;.      PRAGMA
1a70: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20   foreign_keys;. 
1a80: 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74   }.} {0}.do_test
1a90: 20 65 5f 66 6b 65 79 2d 36 2e 34 20 7b 0a 20 20   e_fkey-6.4 {.  
1aa0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
1ab0: 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23   {}..###########
1ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ad0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b00: 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 31 3a 20  .### SECTION 1: 
1b10: 49 6e 74 72 6f 64 75 63 74 69 6f 6e 20 74 6f 20  Introduction to 
1b20: 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73  Foreign Key Cons
1b30: 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23  traints.########
1b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b80: 23 23 23 0a 65 78 65 63 73 71 6c 20 22 50 52 41  ###.execsql "PRA
1b90: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
1ba0: 20 3d 20 4f 4e 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   = ON"..#-------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bf0: 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74  --.# Verify that
1c00: 20 74 68 65 20 73 79 6e 74 61 78 20 69 6e 20 74   the syntax in t
1c10: 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65  he first example
1c20: 20 69 6e 20 73 65 63 74 69 6f 6e 20 31 20 69 73   in section 1 is
1c30: 20 76 61 6c 69 64 2e 0a 23 0a 23 20 45 56 49 44   valid..#.# EVID
1c40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 30 34 32  ENCE-OF: R-04042
1c50: 2d 32 34 38 32 35 20 54 6f 20 64 6f 20 73 6f 2c  -24825 To do so,
1c60: 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
1c70: 65 66 69 6e 69 74 69 6f 6e 20 6d 61 79 20 62 65  efinition may be
1c80: 0a 23 20 61 64 64 65 64 20 62 79 20 6d 6f 64 69  .# added by modi
1c90: 66 79 69 6e 67 20 74 68 65 20 64 65 63 6c 61 72  fying the declar
1ca0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 72 61  ation of the tra
1cb0: 63 6b 20 74 61 62 6c 65 20 74 6f 20 74 68 65 0a  ck table to the.
1cc0: 23 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 43 52 45  # following: CRE
1cd0: 41 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28  ATE TABLE track(
1ce0: 20 74 72 61 63 6b 69 64 20 49 4e 54 45 47 45 52   trackid INTEGER
1cf0: 2c 20 74 72 61 63 6b 6e 61 6d 65 20 54 45 58 54  , trackname TEXT
1d00: 2c 0a 23 20 74 72 61 63 6b 61 72 74 69 73 74 20  ,.# trackartist 
1d10: 49 4e 54 45 47 45 52 2c 20 46 4f 52 45 49 47 4e  INTEGER, FOREIGN
1d20: 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74   KEY(trackartist
1d30: 29 20 52 45 46 45 52 45 4e 43 45 53 0a 23 20 61  ) REFERENCES.# a
1d40: 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20  rtist(artistid) 
1d50: 29 3b 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  );.#.do_test e_f
1d60: 6b 65 79 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63  key-7.1 {.  exec
1d70: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1d80: 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
1d90: 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
1da0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1db0: 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
1dc0: 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
1dd0: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
1de0: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
1df0: 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
1e00: 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74  NTEGER, .      t
1e10: 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
1e20: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
1e30: 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  ist INTEGER,.   
1e40: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74     FOREIGN KEY(t
1e50: 72 61 63 6b 61 72 74 69 73 74 29 20 52 45 46 45  rackartist) REFE
1e60: 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72  RENCES artist(ar
1e70: 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20  tistid).    );. 
1e80: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
1ee0: 46 3a 20 52 2d 36 31 33 36 32 2d 33 32 30 38 37  F: R-61362-32087
1ef0: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69   Attempting to i
1f00: 6e 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f  nsert a row into
1f10: 20 74 68 65 20 74 72 61 63 6b 0a 23 20 74 61 62   the track.# tab
1f20: 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1f30: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 61   correspond to a
1f40: 6e 79 20 72 6f 77 20 69 6e 20 74 68 65 20 61 72  ny row in the ar
1f50: 74 69 73 74 20 74 61 62 6c 65 20 77 69 6c 6c 0a  tist table will.
1f60: 23 20 66 61 69 6c 2c 0a 23 0a 64 6f 5f 74 65 73  # fail,.#.do_tes
1f70: 74 20 65 5f 66 6b 65 79 2d 38 2e 31 20 7b 0a 20  t e_fkey-8.1 {. 
1f80: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
1f90: 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
1fa0: 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31  LUES(1, 'track 1
1fb0: 27 2c 20 31 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  ', 1) }.} {1 {fo
1fc0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1fd0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
1fe0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 38 2e 32  _test e_fkey-8.2
1ff0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
2000: 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73  NSERT INTO artis
2010: 74 20 56 41 4c 55 45 53 28 32 2c 20 27 61 72 74  t VALUES(2, 'art
2020: 69 73 74 20 31 27 29 20 7d 0a 20 20 63 61 74 63  ist 1') }.  catc
2030: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
2040: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
2050: 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 31 29  1, 'track 1', 1)
2060: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
2070: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
2080: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
2090: 20 65 5f 66 6b 65 79 2d 38 2e 32 20 7b 0a 20 20   e_fkey-8.2 {.  
20a0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
20b0: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
20c0: 45 53 28 31 2c 20 27 74 72 61 63 6b 20 31 27 2c  ES(1, 'track 1',
20d0: 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d   2) }.} {}..#---
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d 70 74  ------.# Attempt
2130: 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 20  ing to delete a 
2140: 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 27 61 72  row from the 'ar
2150: 74 69 73 74 27 20 74 61 62 6c 65 20 77 68 69 6c  tist' table whil
2160: 65 20 74 68 65 72 65 20 61 72 65 20 0a 23 20 64  e there are .# d
2170: 65 70 65 6e 64 65 6e 74 20 72 6f 77 73 20 69 6e  ependent rows in
2180: 20 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65   the track table
2190: 20 61 6c 73 6f 20 66 61 69 6c 73 2e 0a 23 0a 23   also fails..#.#
21a0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
21b0: 32 34 34 30 31 2d 35 32 34 30 30 20 61 73 20 77  24401-52400 as w
21c0: 69 6c 6c 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ill attempting t
21d0: 6f 20 64 65 6c 65 74 65 20 61 20 72 6f 77 20 66  o delete a row f
21e0: 72 6f 6d 20 74 68 65 0a 23 20 61 72 74 69 73 74  rom the.# artist
21f0: 20 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65 72   table when ther
2200: 65 20 65 78 69 73 74 20 64 65 70 65 6e 64 65 6e  e exist dependen
2210: 74 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72  t rows in the tr
2220: 61 63 6b 20 74 61 62 6c 65 0a 23 0a 64 6f 5f 74  ack table.#.do_t
2230: 65 73 74 20 65 5f 66 6b 65 79 2d 39 2e 31 20 7b  est e_fkey-9.1 {
2240: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
2250: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
2260: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
2270: 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  = 2 }.} {1 {fore
2280: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2290: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
22a0: 65 73 74 20 65 5f 66 6b 65 79 2d 39 2e 32 20 7b  est e_fkey-9.2 {
22b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
22c0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72    DELETE FROM tr
22d0: 61 63 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61  ack WHERE tracka
22e0: 72 74 69 73 74 20 3d 20 32 3b 0a 20 20 20 20 44  rtist = 2;.    D
22f0: 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73  ELETE FROM artis
2300: 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64  t WHERE artistid
2310: 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a   = 2;.  }.} {}..
2320: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20  ----------.# If 
2370: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
2380: 63 6f 6c 75 6d 6e 20 28 74 72 61 63 6b 61 72 74  column (trackart
2390: 69 73 74 29 20 69 6e 20 74 61 62 6c 65 20 27 74  ist) in table 't
23a0: 72 61 63 6b 27 20 69 73 20 73 65 74 20 74 6f 20  rack' is set to 
23b0: 4e 55 4c 4c 2c 0a 23 20 74 68 65 72 65 20 69 73  NULL,.# there is
23c0: 20 6e 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   no requirement 
23d0: 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 72  for a matching r
23e0: 6f 77 20 69 6e 20 74 68 65 20 27 61 72 74 69 73  ow in the 'artis
23f0: 74 27 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56  t' table..#.# EV
2400: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39  IDENCE-OF: R-239
2410: 38 30 2d 34 38 38 35 39 20 54 68 65 72 65 20 69  80-48859 There i
2420: 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 3a  s one exception:
2430: 20 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   if the foreign 
2440: 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 69 6e 20  key.# column in 
2450: 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20  the track table 
2460: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6e 6f  is NULL, then no
2470: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65   corresponding e
2480: 6e 74 72 79 20 69 6e 20 74 68 65 0a 23 20 61 72  ntry in the.# ar
2490: 74 69 73 74 20 74 61 62 6c 65 20 69 73 20 72 65  tist table is re
24a0: 71 75 69 72 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  quired..#.do_tes
24b0: 74 20 65 5f 66 6b 65 79 2d 31 30 2e 31 20 7b 0a  t e_fkey-10.1 {.
24c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
24d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
24e0: 6b 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61  k VALUES(1, 'tra
24f0: 63 6b 20 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20  ck 1', NULL);.  
2500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72    INSERT INTO tr
2510: 61 63 6b 20 56 41 4c 55 45 53 28 32 2c 20 27 74  ack VALUES(2, 't
2520: 72 61 63 6b 20 32 27 2c 20 4e 55 4c 4c 29 3b 0a  rack 2', NULL);.
2530: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
2540: 20 65 5f 66 6b 65 79 2d 31 30 2e 32 20 7b 0a 20   e_fkey-10.2 {. 
2550: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
2560: 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74 20  T * FROM artist 
2570: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
2580: 5f 66 6b 65 79 2d 31 30 2e 33 20 7b 0a 20 20 23  _fkey-10.3 {.  #
2590: 20 53 65 74 74 69 6e 67 20 74 68 65 20 74 72 61   Setting the tra
25a0: 63 6b 69 64 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ckid to a non-NU
25b0: 4c 4c 20 76 61 6c 75 65 20 66 61 69 6c 73 2c 20  LL value fails, 
25c0: 6f 66 20 63 6f 75 72 73 65 2e 0a 20 20 63 61 74  of course..  cat
25d0: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
25e0: 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72  rack SET trackar
25f0: 74 69 73 74 20 3d 20 35 20 57 48 45 52 45 20 74  tist = 5 WHERE t
2600: 72 61 63 6b 69 64 20 3d 20 31 20 7d 0a 7d 20 7b  rackid = 1 }.} {
2610: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
2620: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
2630: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
2640: 79 2d 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-10.4 {.  execs
2650: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
2660: 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55  INTO artist VALU
2670: 45 53 28 35 2c 20 27 61 72 74 69 73 74 20 35 27  ES(5, 'artist 5'
2680: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 72  );.    UPDATE tr
2690: 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74  ack SET trackart
26a0: 69 73 74 20 3d 20 35 20 57 48 45 52 45 20 74 72  ist = 5 WHERE tr
26b0: 61 63 6b 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ackid = 1;.  }. 
26c0: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
26d0: 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
26e0: 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20  HERE artistid = 
26f0: 35 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  5}.} {1 {foreign
2700: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
2710: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
2720: 20 65 5f 66 6b 65 79 2d 31 30 2e 35 20 7b 0a 20   e_fkey-10.5 {. 
2730: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
2740: 55 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54  UPDATE track SET
2750: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 4e   trackartist = N
2760: 55 4c 4c 20 57 48 45 52 45 20 74 72 61 63 6b 69  ULL WHERE tracki
2770: 64 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54  d = 1;.    DELET
2780: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
2790: 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20 35  ERE artistid = 5
27a0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  ;.  }.} {}..#---
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
2800: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
2810: 20 69 73 20 74 72 75 65 20 66 6f 20 61 6c 6c 20   is true fo all 
2820: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61 63  rows in the trac
2830: 6b 20 74 61 62 6c 65 3a 0a 23 0a 23 20 20 20 74  k table:.#.#   t
2840: 72 61 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55  rackartist IS NU
2850: 4c 4c 20 4f 52 20 0a 23 20 20 20 45 58 49 53 54  LL OR .#   EXIST
2860: 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  S(SELECT 1 FROM 
2870: 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74  artist WHERE art
2880: 69 73 74 69 64 3d 74 72 61 63 6b 61 72 74 69 73  istid=trackartis
2890: 74 29 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t).#.# EVIDENCE-
28a0: 4f 46 3a 20 52 2d 35 32 34 38 36 2d 32 31 33 35  OF: R-52486-2135
28b0: 32 20 45 78 70 72 65 73 73 65 64 20 69 6e 20 53  2 Expressed in S
28c0: 51 4c 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  QL, this means t
28d0: 68 61 74 20 66 6f 72 20 65 76 65 72 79 0a 23 20  hat for every.# 
28e0: 72 6f 77 20 69 6e 20 74 68 65 20 74 72 61 63 6b  row in the track
28f0: 20 74 61 62 6c 65 2c 20 74 68 65 20 66 6f 6c 6c   table, the foll
2900: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
2910: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72   evaluates to tr
2920: 75 65 3a 0a 23 20 74 72 61 63 6b 61 72 74 69 73  ue:.# trackartis
2930: 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 45 58 49  t IS NULL OR EXI
2940: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f  STS(SELECT 1 FRO
2950: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 0a 23  M artist WHERE.#
2960: 20 61 72 74 69 73 74 69 64 3d 74 72 61 63 6b 61   artistid=tracka
2970: 72 74 69 73 74 29 0a 0a 23 20 54 68 69 73 20 70  rtist)..# This p
2980: 72 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65  rocedure execute
2990: 73 20 61 20 74 65 73 74 20 63 61 73 65 20 74 6f  s a test case to
29a0: 20 63 68 65 63 6b 20 74 68 61 74 20 73 74 61 74   check that stat
29b0: 65 6d 65 6e 74 20 0a 23 20 52 2d 35 32 34 38 36  ement .# R-52486
29c0: 2d 32 31 33 35 32 20 69 73 20 74 72 75 65 20 61  -21352 is true a
29d0: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74  fter executing t
29e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
29f0: 20 70 61 73 73 65 64 2e 0a 23 20 61 73 20 74 68   passed..# as th
2a00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a10: 74 2e 0a 70 72 6f 63 20 74 65 73 74 5f 72 35 32  t..proc test_r52
2a20: 34 38 36 5f 32 31 33 35 32 20 7b 74 6e 20 73 71  486_21352 {tn sq
2a30: 6c 7d 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b  l} {.  set res [
2a40: 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 0a 20  catchsql $sql]. 
2a50: 20 73 65 74 20 72 65 73 75 6c 74 73 20 7b 0a 20   set results {. 
2a60: 20 20 20 7b 30 20 7b 7d 7d 20 0a 20 20 20 20 7b     {0 {}} .    {
2a70: 31 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d  1 {PRIMARY KEY m
2a80: 75 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 20  ust be unique}} 
2a90: 0a 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e  .    {1 {foreign
2aa0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
2ab0: 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 20 20 69  failed}}.  }.  i
2ac0: 66 20 7b 5b 6c 73 65 61 72 63 68 20 24 72 65 73  f {[lsearch $res
2ad0: 75 6c 74 73 20 24 72 65 73 5d 3c 30 7d 20 7b 0a  ults $res]<0} {.
2ae0: 20 20 20 20 65 72 72 6f 72 20 24 72 65 73 0a 20      error $res. 
2af0: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f   }..  do_test e_
2b00: 66 6b 65 79 2d 31 31 2e 24 74 6e 20 7b 0a 20 20  fkey-11.$tn {.  
2b10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2b20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
2b30: 29 20 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45  ) FROM track WHE
2b40: 52 45 20 4e 4f 54 20 28 0a 20 20 20 20 20 20 20  RE NOT (.       
2b50: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 53 20   trackartist IS 
2b60: 4e 55 4c 4c 20 4f 52 20 0a 20 20 20 20 20 20 20  NULL OR .       
2b70: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31   EXISTS(SELECT 1
2b80: 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45   FROM artist WHE
2b90: 52 45 20 61 72 74 69 73 74 69 64 3d 74 72 61 63  RE artistid=trac
2ba0: 6b 61 72 74 69 73 74 29 0a 20 20 20 20 20 20 29  kartist).      )
2bb0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d  .    }.  } {0}.}
2bc0: 0a 0a 23 20 45 78 65 63 75 74 65 20 61 20 73 65  ..# Execute a se
2bd0: 72 69 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 49  ries of random I
2be0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 6e  NSERT, UPDATE an
2bf0: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2c00: 6f 6e 73 0a 23 20 28 73 6f 6d 65 20 6f 66 20 77  ons.# (some of w
2c10: 68 69 63 68 20 6d 61 79 20 66 61 69 6c 20 64 75  hich may fail du
2c20: 65 20 74 6f 20 46 4b 20 6f 72 20 50 4b 20 63 6f  e to FK or PK co
2c30: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
2c40: 6f 6e 73 29 20 6f 6e 20 0a 23 20 74 68 65 20 74  ons) on .# the t
2c50: 77 6f 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  wo tables in the
2c60: 20 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 2e   example schema.
2c70: 20 54 65 73 74 20 74 68 61 74 20 52 2d 35 32 34   Test that R-524
2c80: 38 36 2d 32 31 33 35 32 0a 23 20 69 73 20 74 72  86-21352.# is tr
2c90: 75 65 20 61 66 74 65 72 20 65 78 65 63 75 74 69  ue after executi
2ca0: 6e 67 20 65 61 63 68 20 6f 70 65 72 61 74 69 6f  ng each operatio
2cb0: 6e 2e 0a 23 0a 73 65 74 20 54 65 6d 70 6c 61 74  n..#.set Templat
2cc0: 65 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e  e {.  {INSERT IN
2cd0: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
2ce0: 24 74 2c 20 27 74 72 61 63 6b 20 24 74 27 2c 20  $t, 'track $t', 
2cf0: 24 61 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46  $a)}.  {DELETE F
2d00: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
2d10: 74 72 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20  trackid = $t}.  
2d20: 7b 55 50 44 41 54 45 20 74 72 61 63 6b 20 53 45  {UPDATE track SE
2d30: 54 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20  T trackartist = 
2d40: 24 61 20 57 48 45 52 45 20 74 72 61 63 6b 69 64  $a WHERE trackid
2d50: 20 3d 20 24 74 7d 0a 20 20 7b 49 4e 53 45 52 54   = $t}.  {INSERT
2d60: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
2d70: 55 45 53 28 24 61 2c 20 27 61 72 74 69 73 74 20  UES($a, 'artist 
2d80: 24 61 27 29 7d 0a 20 20 7b 44 45 4c 45 54 45 20  $a')}.  {DELETE 
2d90: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
2da0: 45 20 61 72 74 69 73 74 69 64 20 3d 20 24 61 7d  E artistid = $a}
2db0: 0a 20 20 7b 55 50 44 41 54 45 20 61 72 74 69 73  .  {UPDATE artis
2dc0: 74 20 53 45 54 20 61 72 74 69 73 74 69 64 20 3d  t SET artistid =
2dd0: 20 24 61 32 20 57 48 45 52 45 20 61 72 74 69 73   $a2 WHERE artis
2de0: 74 69 64 20 3d 20 24 61 7d 0a 7d 0a 66 6f 72 20  tid = $a}.}.for 
2df0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
2e00: 35 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  500} {incr i} {.
2e10: 20 20 73 65 74 20 61 20 20 20 5b 65 78 70 72 20    set a   [expr 
2e20: 69 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a  int(rand()*10)].
2e30: 20 20 73 65 74 20 61 32 20 20 5b 65 78 70 72 20    set a2  [expr 
2e40: 69 6e 74 28 72 61 6e 64 28 29 2a 31 30 29 5d 0a  int(rand()*10)].
2e50: 20 20 73 65 74 20 74 20 20 20 5b 65 78 70 72 20    set t   [expr 
2e60: 69 6e 74 28 72 61 6e 64 28 29 2a 35 30 29 5d 0a  int(rand()*50)].
2e70: 20 20 73 65 74 20 73 71 6c 20 5b 73 75 62 73 74    set sql [subst
2e80: 20 5b 6c 69 6e 64 65 78 20 24 54 65 6d 70 6c 61   [lindex $Templa
2e90: 74 65 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e  te [expr int(ran
2ea0: 64 28 29 2a 36 29 5d 5d 5d 0a 0a 20 20 74 65 73  d()*6)]]]..  tes
2eb0: 74 5f 72 35 32 34 38 36 5f 32 31 33 35 32 20 24  t_r52486_21352 $
2ec0: 69 20 24 73 71 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  i $sql.}..#-----
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
2f20: 74 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  t a NOT NULL con
2f30: 73 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20 61  straint can be a
2f40: 64 64 65 64 20 74 6f 20 74 68 65 20 65 78 61 6d  dded to the exam
2f50: 70 6c 65 20 73 63 68 65 6d 61 0a 23 20 74 6f 20  ple schema.# to 
2f60: 70 72 6f 68 69 62 69 74 20 4e 55 4c 4c 20 63 68  prohibit NULL ch
2f70: 69 6c 64 20 6b 65 79 73 20 66 72 6f 6d 20 62 65  ild keys from be
2f80: 69 6e 67 20 69 6e 73 65 72 74 65 64 2e 0a 23 0a  ing inserted..#.
2f90: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2fa0: 2d 34 32 34 31 32 2d 35 39 33 32 31 20 54 69 70  -42412-59321 Tip
2fb0: 3a 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  : If the applica
2fc0: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 20  tion requires a 
2fd0: 73 74 72 69 63 74 65 72 0a 23 20 72 65 6c 61 74  stricter.# relat
2fe0: 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
2ff0: 61 72 74 69 73 74 20 61 6e 64 20 74 72 61 63 6b  artist and track
3000: 2c 20 77 68 65 72 65 20 4e 55 4c 4c 20 76 61 6c  , where NULL val
3010: 75 65 73 20 61 72 65 20 6e 6f 74 0a 23 20 70 65  ues are not.# pe
3020: 72 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20 74  rmitted in the t
3030: 72 61 63 6b 61 72 74 69 73 74 20 63 6f 6c 75 6d  rackartist colum
3040: 6e 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68  n, simply add th
3050: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 22 4e  e appropriate "N
3060: 4f 54 0a 23 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  OT.# NULL" const
3070: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 73 63 68  raint to the sch
3080: 65 6d 61 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ema..#.drop_all_
3090: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
30a0: 5f 66 6b 65 79 2d 31 32 2e 31 20 7b 0a 20 20 65  _fkey-12.1 {.  e
30b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
30c0: 41 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74  ATE TABLE artist
30d0: 28 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64  (.      artistid
30e0: 20 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d      INTEGER PRIM
30f0: 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20  ARY KEY, .      
3100: 61 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54  artistname  TEXT
3110: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
3120: 54 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a  TE TABLE track(.
3130: 20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20        trackid   
3140: 20 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20    INTEGER, .    
3150: 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45    trackname   TE
3160: 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b  XT, .      track
3170: 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 20 4e  artist INTEGER N
3180: 4f 54 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 46  OT NULL,.      F
3190: 4f 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63 6b  OREIGN KEY(track
31a0: 61 72 74 69 73 74 29 20 52 45 46 45 52 45 4e 43  artist) REFERENC
31b0: 45 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74  ES artist(artist
31c0: 69 64 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  id).    );.  }.}
31d0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
31e0: 65 79 2d 31 32 2e 32 20 7b 0a 20 20 63 61 74 63  ey-12.2 {.  catc
31f0: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
3200: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
3210: 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c  14, 'Mr. Bojangl
3220: 65 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b  es', NULL) }.} {
3230: 31 20 7b 74 72 61 63 6b 2e 74 72 61 63 6b 61 72  1 {track.trackar
3240: 74 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  tist may not be 
3250: 4e 55 4c 4c 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  NULL}}..#-------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32a0: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
32b0: 3a 20 52 2d 31 36 31 32 37 2d 33 35 34 34 32 0a  : R-16127-35442.
32c0: 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d  #.# Test an exam
32d0: 70 6c 65 20 66 72 6f 6d 20 66 6f 72 65 69 67 6e  ple from foreign
32e0: 6b 65 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f  keys.html..#.dro
32f0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
3300: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 31  test e_fkey-13.1
3310: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3320: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3330: 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
3340: 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
3350: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
3360: 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
3370: 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
3380: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3390: 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
33a0: 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
33b0: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d   .      tracknam
33c0: 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20  e   TEXT, .     
33d0: 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54   trackartist INT
33e0: 45 47 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45  EGER,.      FORE
33f0: 49 47 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74  IGN KEY(trackart
3400: 69 73 74 29 20 52 45 46 45 52 45 4e 43 45 53 20  ist) REFERENCES 
3410: 61 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29  artist(artistid)
3420: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
3430: 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
3440: 41 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d  ALUES(1, 'Dean M
3450: 61 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  artin');.    INS
3460: 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
3470: 56 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b  VALUES(2, 'Frank
3480: 20 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20   Sinatra');.    
3490: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
34a0: 6b 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68  k VALUES(11, 'Th
34b0: 61 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29  at''s Amore', 1)
34c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
34d0: 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
34e0: 32 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c  2, 'Christmas Bl
34f0: 75 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ues', 1);.    IN
3500: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
3510: 56 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57  VALUES(13, 'My W
3520: 61 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ay', 2);.  }.} {
3530: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
3540: 2d 31 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -13.2 {.  catchs
3550: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
3560: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 34   track VALUES(14
3570: 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73  , 'Mr. Bojangles
3580: 27 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  ', 3) }.} {1 {fo
3590: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
35a0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
35b0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e  _test e_fkey-13.
35c0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
35d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
35e0: 6b 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72  k VALUES(14, 'Mr
35f0: 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 4e 55  . Bojangles', NU
3600: 4c 4c 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  LL) }.} {}.do_te
3610: 73 74 20 65 5f 66 6b 65 79 2d 31 33 2e 34 20 7b  st e_fkey-13.4 {
3620: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20  .  catchsql { . 
3630: 20 20 20 55 50 44 41 54 45 20 74 72 61 63 6b 20     UPDATE track 
3640: 53 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20  SET trackartist 
3650: 3d 20 33 20 57 48 45 52 45 20 74 72 61 63 6b 6e  = 3 WHERE trackn
3660: 61 6d 65 20 3d 20 27 4d 72 2e 20 42 6f 6a 61 6e  ame = 'Mr. Bojan
3670: 67 6c 65 73 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  gles';.  }.} {1 
3680: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
3690: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
36a0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
36b0: 31 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  13.5 {.  execsql
36c0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
36d0: 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53  TO artist VALUES
36e0: 28 33 2c 20 27 53 61 6d 6d 79 20 44 61 76 69 73  (3, 'Sammy Davis
36f0: 20 4a 72 2e 27 29 3b 0a 20 20 20 20 55 50 44 41   Jr.');.    UPDA
3700: 54 45 20 74 72 61 63 6b 20 53 45 54 20 74 72 61  TE track SET tra
3710: 63 6b 61 72 74 69 73 74 20 3d 20 33 20 57 48 45  ckartist = 3 WHE
3720: 52 45 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27  RE trackname = '
3730: 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a  Mr. Bojangles';.
3740: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3750: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 35 2c  track VALUES(15,
3760: 20 27 42 6f 6f 67 69 65 20 57 6f 6f 67 69 65 27   'Boogie Woogie'
3770: 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  , 3);.  }.} {}..
3780: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
37d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 39 35  DENCE-OF: R-1595
37e0: 38 2d 35 30 32 33 33 0a 23 0a 23 20 54 65 73 74  8-50233.#.# Test
37f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 78 61 6d   the second exam
3800: 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ple from the fir
3810: 73 74 20 73 65 63 74 69 6f 6e 20 6f 66 20 66 6f  st section of fo
3820: 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 0a  reignkeys.html..
3830: 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
3840: 2d 31 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 73  -14.1 {.  catchs
3850: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
3860: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
3870: 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27  E artistname = '
3880: 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 3b 0a  Frank Sinatra';.
3890: 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67    }.} {1 {foreig
38a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
38b0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
38c0: 74 20 65 5f 66 6b 65 79 2d 31 34 2e 32 20 7b 0a  t e_fkey-14.2 {.
38d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
38e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63  DELETE FROM trac
38f0: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61 6d  k WHERE tracknam
3900: 65 20 3d 20 27 4d 79 20 57 61 79 27 3b 0a 20 20  e = 'My Way';.  
3910: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72    DELETE FROM ar
3920: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
3930: 74 6e 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53  tname = 'Frank S
3940: 69 6e 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b  inatra';.  }.} {
3950: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
3960: 2d 31 34 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -14.3 {.  catchs
3970: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
3980: 61 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73  artist SET artis
3990: 74 69 64 3d 34 20 57 48 45 52 45 20 61 72 74 69  tid=4 WHERE arti
39a0: 73 74 6e 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d  stname = 'Dean M
39b0: 61 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 31  artin';.  }.} {1
39c0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
39d0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
39e0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
39f0: 2d 31 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -14.4 {.  execsq
3a00: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
3a10: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
3a20: 74 72 61 63 6b 6e 61 6d 65 20 49 4e 28 27 54 68  trackname IN('Th
3a30: 61 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 27 43  at''s Amore', 'C
3a40: 68 72 69 73 74 6d 61 73 20 42 6c 75 65 73 27 29  hristmas Blues')
3a50: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 61 72 74  ;.    UPDATE art
3a60: 69 73 74 20 53 45 54 20 61 72 74 69 73 74 69 64  ist SET artistid
3a70: 3d 34 20 57 48 45 52 45 20 61 72 74 69 73 74 6e  =4 WHERE artistn
3a80: 61 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74  ame = 'Dean Mart
3a90: 69 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a  in';.  }.} {}...
3aa0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
3af0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 30 33  DENCE-OF: R-5603
3b00: 32 2d 32 34 39 32 33 20 54 68 65 20 66 6f 72 65  2-24923 The fore
3b10: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
3b20: 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64 20  nt is satisfied 
3b30: 69 66 0a 23 20 66 6f 72 20 65 61 63 68 20 72 6f  if.# for each ro
3b40: 77 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74  w in the child t
3b50: 61 62 6c 65 20 65 69 74 68 65 72 20 6f 6e 65 20  able either one 
3b60: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 63  or more of the c
3b70: 68 69 6c 64 20 6b 65 79 0a 23 20 63 6f 6c 75 6d  hild key.# colum
3b80: 6e 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6f 72 20  ns are NULL, or 
3b90: 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 72  there exists a r
3ba0: 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ow in the parent
3bb0: 20 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68   table for which
3bc0: 0a 23 20 65 61 63 68 20 70 61 72 65 6e 74 20 6b  .# each parent k
3bd0: 65 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  ey column contai
3be0: 6e 73 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c  ns a value equal
3bf0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
3c00: 20 69 74 73 0a 23 20 61 73 73 6f 63 69 61 74 65   its.# associate
3c10: 64 20 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75  d child key colu
3c20: 6d 6e 2e 0a 23 0a 23 20 54 65 73 74 20 61 6c 73  mn..#.# Test als
3c30: 6f 20 74 68 61 74 20 74 68 65 20 75 73 75 61 6c  o that the usual
3c40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 75 6c 65   comparison rule
3c50: 73 20 61 72 65 20 75 73 65 64 20 77 68 65 6e 20  s are used when 
3c60: 74 65 73 74 69 6e 67 20 69 66 20 74 68 65 72 65  testing if there
3c70: 20 0a 23 20 69 73 20 61 20 6d 61 74 63 68 69 6e   .# is a matchin
3c80: 67 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72  g row in the par
3c90: 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 61 20 66  ent table of a f
3ca0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
3cb0: 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45  raint..#.# EVIDE
3cc0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 37 36 35 2d  NCE-OF: R-57765-
3cd0: 31 32 33 38 30 20 49 6e 20 74 68 65 20 61 62 6f  12380 In the abo
3ce0: 76 65 20 70 61 72 61 67 72 61 70 68 2c 20 74 68  ve paragraph, th
3cf0: 65 20 74 65 72 6d 20 22 65 71 75 61 6c 22 0a 23  e term "equal".#
3d00: 20 6d 65 61 6e 73 20 65 71 75 61 6c 20 77 68 65   means equal whe
3d10: 6e 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d  n values are com
3d20: 70 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  pared using the 
3d30: 72 75 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  rules specified 
3d40: 68 65 72 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  here..#.drop_all
3d50: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
3d60: 65 5f 66 6b 65 79 2d 31 35 2e 31 20 7b 0a 20 20  e_fkey-15.1 {.  
3d70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3d80: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 28 70  EATE TABLE par(p
3d90: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
3da0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3db0: 63 68 69 28 63 20 52 45 46 45 52 45 4e 43 45 53  chi(c REFERENCES
3dc0: 20 70 61 72 29 3b 0a 0a 20 20 20 20 49 4e 53 45   par);..    INSE
3dd0: 52 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55  RT INTO par VALU
3de0: 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(1);.    INSER
3df0: 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55 45  T INTO par VALUE
3e00: 53 28 27 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  S('1');.    INSE
3e10: 52 54 20 49 4e 54 4f 20 70 61 72 20 56 41 4c 55  RT INTO par VALU
3e20: 45 53 28 58 27 33 31 27 29 3b 0a 20 20 20 20 53  ES(X'31');.    S
3e30: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 70 29 20  ELECT typeof(p) 
3e40: 46 52 4f 4d 20 70 61 72 3b 0a 20 20 7d 0a 7d 20  FROM par;.  }.} 
3e50: 7b 69 6e 74 65 67 65 72 20 74 65 78 74 20 62 6c  {integer text bl
3e60: 6f 62 7d 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65  ob}..proc test_e
3e70: 66 6b 65 79 5f 34 35 20 7b 74 6e 20 69 73 45 72  fkey_45 {tn isEr
3e80: 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f  ror sql} {.  do_
3e90: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 35 2e 24  test e_fkey-15.$
3ea0: 74 6e 2e 31 20 22 0a 20 20 20 20 63 61 74 63 68  tn.1 ".    catch
3eb0: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
3ec0: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
3ed0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
3ee0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
3ef0: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 0a 20  }}} $isError].. 
3f00: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
3f10: 31 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65  15.$tn.2 {.    e
3f20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3f30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69  ELECT * FROM chi
3f40: 20 57 48 45 52 45 20 63 20 49 53 20 4e 4f 54 20   WHERE c IS NOT 
3f50: 4e 55 4c 4c 20 41 4e 44 20 63 20 4e 4f 54 20 49  NULL AND c NOT I
3f60: 4e 20 28 53 45 4c 45 43 54 20 70 20 46 52 4f 4d  N (SELECT p FROM
3f70: 20 70 61 72 29 0a 20 20 20 20 7d 0a 20 20 7d 20   par).    }.  } 
3f80: 7b 7d 0a 7d 0a 0a 74 65 73 74 5f 65 66 6b 65 79  {}.}..test_efkey
3f90: 5f 34 35 20 31 20 30 20 22 49 4e 53 45 52 54 20  _45 1 0 "INSERT 
3fa0: 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28  INTO chi VALUES(
3fb0: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34  1)".test_efkey_4
3fc0: 35 20 32 20 31 20 22 49 4e 53 45 52 54 20 49 4e  5 2 1 "INSERT IN
3fd0: 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27 31  TO chi VALUES('1
3fe0: 2e 30 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  .0')".test_efkey
3ff0: 5f 34 35 20 33 20 30 20 22 49 4e 53 45 52 54 20  _45 3 0 "INSERT 
4000: 49 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28  INTO chi VALUES(
4010: 27 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  '1')".test_efkey
4020: 5f 34 35 20 34 20 31 20 22 44 45 4c 45 54 45 20  _45 4 1 "DELETE 
4030: 46 52 4f 4d 20 70 61 72 20 57 48 45 52 45 20 70  FROM par WHERE p
4040: 20 3d 20 27 31 27 22 0a 74 65 73 74 5f 65 66 6b   = '1'".test_efk
4050: 65 79 5f 34 35 20 35 20 30 20 22 44 45 4c 45 54  ey_45 5 0 "DELET
4060: 45 20 46 52 4f 4d 20 63 68 69 20 57 48 45 52 45  E FROM chi WHERE
4070: 20 63 20 3d 20 27 31 27 22 0a 74 65 73 74 5f 65   c = '1'".test_e
4080: 66 6b 65 79 5f 34 35 20 36 20 30 20 22 44 45 4c  fkey_45 6 0 "DEL
4090: 45 54 45 20 46 52 4f 4d 20 70 61 72 20 57 48 45  ETE FROM par WHE
40a0: 52 45 20 70 20 3d 20 27 31 27 22 0a 74 65 73 74  RE p = '1'".test
40b0: 5f 65 66 6b 65 79 5f 34 35 20 37 20 31 20 22 49  _efkey_45 7 1 "I
40c0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56  NSERT INTO chi V
40d0: 41 4c 55 45 53 28 27 31 27 29 22 0a 74 65 73 74  ALUES('1')".test
40e0: 5f 65 66 6b 65 79 5f 34 35 20 38 20 30 20 22 49  _efkey_45 8 0 "I
40f0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56  NSERT INTO chi V
4100: 41 4c 55 45 53 28 58 27 33 31 27 29 22 0a 74 65  ALUES(X'31')".te
4110: 73 74 5f 65 66 6b 65 79 5f 34 35 20 39 20 31 20  st_efkey_45 9 1 
4120: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69  "INSERT INTO chi
4130: 20 56 41 4c 55 45 53 28 58 27 33 32 27 29 22 0a   VALUES(X'32')".
4140: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 70  -----------.# Sp
4190: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 65 73 74  ecifically, test
41a0: 20 74 68 61 74 20 77 68 65 6e 20 63 6f 6d 70 61   that when compa
41b0: 72 69 6e 67 20 63 68 69 6c 64 20 61 6e 64 20 70  ring child and p
41c0: 61 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73  arent key values
41d0: 20 74 68 65 0a 23 20 64 65 66 61 75 6c 74 20 63   the.# default c
41e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
41f0: 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
4200: 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73  key column is us
4210: 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ed..#.# EVIDENCE
4220: 2d 4f 46 3a 20 52 2d 31 35 37 39 36 2d 34 37 35  -OF: R-15796-475
4230: 31 33 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  13 When comparin
4240: 67 20 74 65 78 74 20 76 61 6c 75 65 73 2c 20 74  g text values, t
4250: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 23 20 73  he collating.# s
4260: 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74  equence associat
4270: 65 64 20 77 69 74 68 20 74 68 65 20 70 61 72 65  ed with the pare
4280: 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  nt key column is
4290: 20 61 6c 77 61 79 73 20 75 73 65 64 2e 0a 23 0a   always used..#.
42a0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
42b0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
42c0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
42d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
42e0: 4c 45 20 74 31 28 61 20 43 4f 4c 4c 41 54 45 20  LE t1(a COLLATE 
42f0: 6e 6f 63 61 73 65 20 50 52 49 4d 41 52 59 20 4b  nocase PRIMARY K
4300: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
4310: 54 41 42 4c 45 20 74 32 28 62 20 52 45 46 45 52  TABLE t2(b REFER
4320: 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 7d 0a 7d  ENCES t1);.  }.}
4330: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
4340: 65 79 2d 31 36 2e 32 20 7b 0a 20 20 65 78 65 63  ey-16.2 {.  exec
4350: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
4360: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4370: 27 6f 4e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'oNe');.    INSE
4380: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4390: 53 28 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e  S('one');.    IN
43a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
43b0: 55 45 53 28 27 4f 4e 45 27 29 3b 0a 20 20 20 20  UES('ONE');.    
43c0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
43d0: 3d 20 27 4f 6e 45 27 3b 0a 20 20 20 20 55 50 44  = 'OnE';.    UPD
43e0: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 27  ATE t1 SET a = '
43f0: 4f 4e 45 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ONE';.  }.} {}.d
4400: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 36  o_test e_fkey-16
4410: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
4420: 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  { UPDATE t2 SET 
4430: 62 20 3d 20 27 74 77 6f 27 20 57 48 45 52 45 20  b = 'two' WHERE 
4440: 72 6f 77 69 64 20 3d 20 31 20 7d 0a 7d 20 7b 31  rowid = 1 }.} {1
4450: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
4460: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4470: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
4480: 2d 31 36 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -16.4 {.  catchs
4490: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
44a0: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 27 6f   t1 WHERE a = 'o
44b0: 4e 65 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  Ne' }.} {1 {fore
44c0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
44d0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d  nt failed}}..#--
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4520: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 70 65 63 69 66  -------.# Specif
4530: 69 63 61 6c 6c 79 2c 20 74 65 73 74 20 74 68 61  ically, test tha
4540: 74 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  t when comparing
4550: 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e   child and paren
4560: 74 20 6b 65 79 20 76 61 6c 75 65 73 20 74 68 65  t key values the
4570: 0a 23 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  .# affinity of t
4580: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  he parent key co
4590: 6c 75 6d 6e 20 69 73 20 61 70 70 6c 69 65 64 20  lumn is applied 
45a0: 74 6f 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  to the child key
45b0: 20 76 61 6c 75 65 0a 23 20 62 65 66 6f 72 65 20   value.# before 
45c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74  the comparison t
45d0: 61 6b 65 73 20 70 6c 61 63 65 2e 0a 23 0a 23 20  akes place..#.# 
45e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
45f0: 34 32 34 30 2d 31 33 38 36 30 20 57 68 65 6e 20  4240-13860 When 
4600: 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73  comparing values
4610: 2c 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  , if the parent 
4620: 6b 65 79 0a 23 20 63 6f 6c 75 6d 6e 20 68 61 73  key.# column has
4630: 20 61 6e 20 61 66 66 69 6e 69 74 79 2c 20 74 68   an affinity, th
4640: 65 6e 20 74 68 61 74 20 61 66 66 69 6e 69 74 79  en that affinity
4650: 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 74   is applied to t
4660: 68 65 20 63 68 69 6c 64 20 6b 65 79 0a 23 20 76  he child key.# v
4670: 61 6c 75 65 20 62 65 66 6f 72 65 20 74 68 65 20  alue before the 
4680: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 65  comparison is pe
4690: 72 66 6f 72 6d 65 64 2e 0a 23 0a 64 72 6f 70 5f  rformed..#.drop_
46a0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
46b0: 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 31 20 7b  st e_fkey-17.1 {
46c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
46d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
46e0: 28 61 20 4e 55 4d 45 52 49 43 20 50 52 49 4d 41  (a NUMERIC PRIMA
46f0: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
4700: 41 54 45 20 54 41 42 4c 45 20 74 32 28 62 20 54  ATE TABLE t2(b T
4710: 45 58 54 20 52 45 46 45 52 45 4e 43 45 53 20 74  EXT REFERENCES t
4720: 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  1);.  }.} {}.do_
4730: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 37 2e 32  test e_fkey-17.2
4740: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4750: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4760: 31 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20  1 VALUES(1);.   
4770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4780: 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49  VALUES(2);.    I
4790: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
47a0: 4c 55 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20  LUES('three');. 
47b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
47c0: 32 20 56 41 4c 55 45 53 28 27 32 2e 30 27 29 3b  2 VALUES('2.0');
47d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20 74  .    SELECT b, t
47e0: 79 70 65 6f 66 28 62 29 20 46 52 4f 4d 20 74 32  ypeof(b) FROM t2
47f0: 3b 0a 20 20 7d 0a 7d 20 7b 32 2e 30 20 74 65 78  ;.  }.} {2.0 tex
4800: 74 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  t}.do_test e_fke
4810: 79 2d 31 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-17.3 {.  execs
4820: 71 6c 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  ql { SELECT type
4830: 6f 66 28 61 29 20 46 52 4f 4d 20 74 31 20 7d 0a  of(a) FROM t1 }.
4840: 7d 20 7b 69 6e 74 65 67 65 72 20 69 6e 74 65 67  } {integer integ
4850: 65 72 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74  er text}.do_test
4860: 20 65 5f 66 6b 65 79 2d 31 37 2e 34 20 7b 0a 20   e_fkey-17.4 {. 
4870: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
4880: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
4890: 20 61 20 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 66   a = 2 }.} {1 {f
48a0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
48b0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
48c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
48f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4900: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23 20  ###########.### 
4910: 53 45 43 54 49 4f 4e 20 33 3a 20 52 65 71 75 69  SECTION 3: Requi
4920: 72 65 64 20 61 6e 64 20 53 75 67 67 65 73 74 65  red and Suggeste
4930: 64 20 44 61 74 61 62 61 73 65 20 49 6e 64 65 78  d Database Index
4940: 65 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  es.#############
4950: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4970: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4980: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
4990: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 20 70  ----------.# A p
49e0: 61 72 65 6e 74 20 6b 65 79 20 6d 75 73 74 20 62  arent key must b
49f0: 65 20 65 69 74 68 65 72 20 61 20 50 52 49 4d 41  e either a PRIMA
4a00: 52 59 20 4b 45 59 2c 20 73 75 62 6a 65 63 74 20  RY KEY, subject 
4a10: 74 6f 20 61 20 55 4e 49 51 55 45 20 0a 23 20 63  to a UNIQUE .# c
4a20: 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 68 61  onstraint, or ha
4a30: 76 65 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65  ve a UNIQUE inde
4a40: 78 20 63 72 65 61 74 65 64 20 6f 6e 20 69 74 2e  x created on it.
4a50: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
4a60: 3a 20 52 2d 31 33 34 33 35 2d 32 36 33 31 31 20  : R-13435-26311 
4a70: 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 61 72  Usually, the par
4a80: 65 6e 74 20 6b 65 79 20 6f 66 20 61 20 66 6f 72  ent key of a for
4a90: 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74  eign key.# const
4aa0: 72 61 69 6e 74 20 69 73 20 74 68 65 20 70 72 69  raint is the pri
4ab0: 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20  mary key of the 
4ac0: 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 49 66  parent table. If
4ad0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 74 68   they are not th
4ae0: 65 0a 23 20 70 72 69 6d 61 72 79 20 6b 65 79 2c  e.# primary key,
4af0: 20 74 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74   then the parent
4b00: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   key columns mus
4b10: 74 20 62 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c  t be collectivel
4b20: 79 20 73 75 62 6a 65 63 74 0a 23 20 74 6f 20 61  y subject.# to a
4b30: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
4b40: 6e 74 20 6f 72 20 68 61 76 65 20 61 20 55 4e 49  nt or have a UNI
4b50: 51 55 45 20 69 6e 64 65 78 2e 0a 23 20 0a 23 20  QUE index..# .# 
4b60: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69  Also test that i
4b70: 66 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69  f a parent key i
4b80: 73 20 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f  s not subject to
4b90: 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
4ba0: 72 20 55 4e 49 51 55 45 0a 23 20 63 6f 6e 73 74  r UNIQUE.# const
4bb0: 72 61 69 6e 74 2c 20 62 75 74 20 64 6f 65 73 20  raint, but does 
4bc0: 68 61 76 65 20 61 20 55 4e 49 51 55 45 20 69 6e  have a UNIQUE in
4bd0: 64 65 78 20 63 72 65 61 74 65 64 20 6f 6e 20 69  dex created on i
4be0: 74 2c 20 74 68 65 6e 20 74 68 65 20 55 4e 49 51  t, then the UNIQ
4bf0: 55 45 20 69 6e 64 65 78 0a 23 20 6d 75 73 74 20  UE index.# must 
4c00: 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  use the default 
4c10: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4c20: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
4c30: 69 74 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b  ith the parent k
4c40: 65 79 0a 23 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a  ey.# columns..#.
4c50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4c60: 2d 30 30 33 37 36 2d 33 39 32 31 32 20 49 66 20  -00376-39212 If 
4c70: 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63  the parent key c
4c80: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 61 20 55 4e  olumns have a UN
4c90: 49 51 55 45 0a 23 20 69 6e 64 65 78 2c 20 74 68  IQUE.# index, th
4ca0: 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 6d 75  en that index mu
4cb0: 73 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  st use the colla
4cc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 74  tion sequences t
4cd0: 68 61 74 20 61 72 65 0a 23 20 73 70 65 63 69 66  hat are.# specif
4ce0: 69 65 64 20 69 6e 20 74 68 65 20 43 52 45 41 54  ied in the CREAT
4cf0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4d00: 74 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74  t for the parent
4d10: 20 74 61 62 6c 65 2e 0a 23 0a 64 72 6f 70 5f 61   table..#.drop_a
4d20: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
4d30: 74 20 65 5f 66 6b 65 79 2d 31 38 2e 31 20 7b 0a  t e_fkey-18.1 {.
4d40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4d50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
4d60: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  a REFERENCES t1(
4d70: 78 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72  x));.  }.} {}.pr
4d80: 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 35 37  oc test_efkey_57
4d90: 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c   {tn isError sql
4da0: 7d 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  } {.  catchsql {
4db0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d   DROP TABLE t1 }
4dc0: 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a  .  execsql $sql.
4dd0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
4de0: 2d 31 38 2e 24 74 6e 20 7b 0a 20 20 20 20 63 61  -18.$tn {.    ca
4df0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
4e00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 4e  INTO t2 VALUES(N
4e10: 55 4c 4c 29 20 7d 0a 20 20 7d 20 5b 6c 69 6e 64  ULL) }.  } [lind
4e20: 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66  ex {{0 {}} {1 {f
4e30: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
4e40: 74 63 68 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d  tch}}} $isError]
4e50: 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37  .}.test_efkey_57
4e60: 20 32 20 30 20 7b 20 43 52 45 41 54 45 20 54 41   2 0 { CREATE TA
4e70: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
4e80: 20 4b 45 59 29 20 7d 0a 74 65 73 74 5f 65 66 6b   KEY) }.test_efk
4e90: 65 79 5f 35 37 20 33 20 30 20 7b 20 43 52 45 41  ey_57 3 0 { CREA
4ea0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 55 4e  TE TABLE t1(x UN
4eb0: 49 51 55 45 29 20 7d 0a 74 65 73 74 5f 65 66 6b  IQUE) }.test_efk
4ec0: 65 79 5f 35 37 20 34 20 30 20 7b 20 43 52 45 41  ey_57 4 0 { CREA
4ed0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20  TE TABLE t1(x); 
4ee0: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
4ef0: 44 45 58 20 74 31 69 20 4f 4e 20 74 31 28 78 29  DEX t1i ON t1(x)
4f00: 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37   }.test_efkey_57
4f10: 20 35 20 31 20 7b 20 0a 20 20 43 52 45 41 54 45   5 1 { .  CREATE
4f20: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 20 0a 20   TABLE t1(x); . 
4f30: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
4f40: 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31 28 78  NDEX t1i ON t1(x
4f50: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
4f60: 3b 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35  ;.}.test_efkey_5
4f70: 37 20 36 20 31 20 7b 20 43 52 45 41 54 45 20 54  7 6 1 { CREATE T
4f80: 41 42 4c 45 20 74 31 28 78 29 20 7d 0a 74 65 73  ABLE t1(x) }.tes
4f90: 74 5f 65 66 6b 65 79 5f 35 37 20 37 20 31 20 7b  t_efkey_57 7 1 {
4fa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4fb0: 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b  (x, y, PRIMARY K
4fc0: 45 59 28 78 2c 20 79 29 29 20 7d 0a 74 65 73 74  EY(x, y)) }.test
4fd0: 5f 65 66 6b 65 79 5f 35 37 20 38 20 31 20 7b 20  _efkey_57 8 1 { 
4fe0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4ff0: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
5000: 79 29 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79  y)) }.test_efkey
5010: 5f 35 37 20 39 20 31 20 7b 20 0a 20 20 43 52 45  _57 9 1 { .  CRE
5020: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20  ATE TABLE t1(x, 
5030: 79 29 3b 20 0a 20 20 43 52 45 41 54 45 20 55 4e  y); .  CREATE UN
5040: 49 51 55 45 20 49 4e 44 45 58 20 74 31 69 20 4f  IQUE INDEX t1i O
5050: 4e 20 74 31 28 78 2c 20 79 29 3b 0a 7d 0a 0a 0a  N t1(x, y);.}...
5060: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
50b0: 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 61 6e  s block tests an
50c0: 20 65 78 61 6d 70 6c 65 20 69 6e 20 66 6f 72 65   example in fore
50d0: 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e 20 53 65  ignkeys.html. Se
50e0: 76 65 72 61 6c 20 74 65 73 74 61 62 6c 65 0a 23  veral testable.#
50f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 66 65   statements refe
5100: 72 20 74 6f 20 74 68 69 73 20 65 78 61 6d 70 6c  r to this exampl
5110: 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 0a 23 0a  e, as follows.#.
5120: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5130: 2d 32 37 34 38 34 2d 30 31 34 36 37 0a 23 0a 23  -27484-01467.#.#
5140: 20 46 4b 20 43 6f 6e 73 74 72 61 69 6e 74 73 20   FK Constraints 
5150: 6f 6e 20 63 68 69 6c 64 31 2c 20 63 68 69 6c 64  on child1, child
5160: 32 20 61 6e 64 20 63 68 69 6c 64 33 20 61 72 65  2 and child3 are
5170: 20 4f 6b 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d   Ok..#.# Problem
5180: 20 77 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c   with FK on chil
5190: 64 34 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  d4:.#.# EVIDENCE
51a0: 2d 4f 46 3a 20 52 2d 35 31 30 33 39 2d 34 34 38  -OF: R-51039-448
51b0: 34 30 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  40 The foreign k
51c0: 65 79 20 64 65 63 6c 61 72 65 64 20 61 73 20 70  ey declared as p
51d0: 61 72 74 20 6f 66 20 74 61 62 6c 65 0a 23 20 63  art of table.# c
51e0: 68 69 6c 64 34 20 69 73 20 61 6e 20 65 72 72 6f  hild4 is an erro
51f0: 72 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74  r because even t
5200: 68 6f 75 67 68 20 74 68 65 20 70 61 72 65 6e 74  hough the parent
5210: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 0a 23   key column is.#
5220: 20 69 6e 64 65 78 65 64 2c 20 74 68 65 20 69 6e   indexed, the in
5230: 64 65 78 20 69 73 20 6e 6f 74 20 55 4e 49 51 55  dex is not UNIQU
5240: 45 2e 0a 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77  E..#.# Problem w
5250: 69 74 68 20 46 4b 20 6f 6e 20 63 68 69 6c 64 35  ith FK on child5
5260: 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  :.#.# EVIDENCE-O
5270: 46 3a 20 52 2d 30 31 30 36 30 2d 34 38 37 38 38  F: R-01060-48788
5280: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
5290: 20 66 6f 72 20 74 61 62 6c 65 20 63 68 69 6c 64   for table child
52a0: 35 20 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 20  5 is an.# error 
52b0: 62 65 63 61 75 73 65 20 65 76 65 6e 20 74 68 6f  because even tho
52c0: 75 67 68 20 74 68 65 20 70 61 72 65 6e 74 20 6b  ugh the parent k
52d0: 65 79 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 20  ey column has a 
52e0: 75 6e 69 71 75 65 20 69 6e 64 65 78 2c 0a 23 20  unique index,.# 
52f0: 74 68 65 20 69 6e 64 65 78 20 75 73 65 73 20 61  the index uses a
5300: 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
5310: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 23  ting sequence..#
5320: 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69 74 68 20  .# Problem with 
5330: 46 4b 20 6f 6e 20 63 68 69 6c 64 36 20 61 6e 64  FK on child6 and
5340: 20 63 68 69 6c 64 37 3a 0a 23 0a 23 20 45 56 49   child7:.#.# EVI
5350: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 30 38  DENCE-OF: R-6308
5360: 38 2d 33 37 34 36 39 20 54 61 62 6c 65 73 20 63  8-37469 Tables c
5370: 68 69 6c 64 36 20 61 6e 64 20 63 68 69 6c 64 37  hild6 and child7
5380: 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 0a 23   are incorrect.#
5390: 20 62 65 63 61 75 73 65 20 77 68 69 6c 65 20 62   because while b
53a0: 6f 74 68 20 68 61 76 65 20 55 4e 49 51 55 45 20  oth have UNIQUE 
53b0: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 69 72  indices on their
53c0: 20 70 61 72 65 6e 74 20 6b 65 79 73 2c 20 74 68   parent keys, th
53d0: 65 20 6b 65 79 73 0a 23 20 61 72 65 20 6e 6f 74  e keys.# are not
53e0: 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
53f0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  to the columns o
5400: 66 20 61 20 73 69 6e 67 6c 65 20 55 4e 49 51 55  f a single UNIQU
5410: 45 20 69 6e 64 65 78 2e 0a 23 0a 64 72 6f 70 5f  E index..#.drop_
5420: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
5430: 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 31 20 7b  st e_fkey-19.1 {
5440: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5450: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
5460: 72 65 6e 74 28 61 20 50 52 49 4d 41 52 59 20 4b  rent(a PRIMARY K
5470: 45 59 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 2c  EY, b UNIQUE, c,
5480: 20 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 43   d, e, f);.    C
5490: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
54a0: 45 58 20 69 31 20 4f 4e 20 70 61 72 65 6e 74 28  EX i1 ON parent(
54b0: 63 2c 20 64 29 3b 0a 20 20 20 20 43 52 45 41 54  c, d);.    CREAT
54c0: 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 70 61  E INDEX i2 ON pa
54d0: 72 65 6e 74 28 65 29 3b 0a 20 20 20 20 43 52 45  rent(e);.    CRE
54e0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
54f0: 20 69 33 20 4f 4e 20 70 61 72 65 6e 74 28 66 20   i3 ON parent(f 
5500: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b  COLLATE nocase);
5510: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
5520: 4c 45 20 63 68 69 6c 64 31 28 66 2c 20 67 20 52  LE child1(f, g R
5530: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
5540: 28 61 29 29 3b 20 20 20 20 20 20 20 20 20 20 20  (a));           
5550: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f              -- O
5560: 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  k.    CREATE TAB
5570: 4c 45 20 63 68 69 6c 64 32 28 68 2c 20 69 20 52  LE child2(h, i R
5580: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
5590: 28 62 29 29 3b 20 20 20 20 20 20 20 20 20 20 20  (b));           
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f              -- O
55b0: 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  k.    CREATE TAB
55c0: 4c 45 20 63 68 69 6c 64 33 28 6a 2c 20 6b 2c 20  LE child3(j, k, 
55d0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 2c 20 6b  FOREIGN KEY(j, k
55e0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
55f0: 65 6e 74 28 63 2c 20 64 29 29 3b 20 2d 2d 20 4f  ent(c, d)); -- O
5600: 6b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  k.    CREATE TAB
5610: 4c 45 20 63 68 69 6c 64 34 28 6c 2c 20 6d 20 52  LE child4(l, m R
5620: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
5630: 28 65 29 29 3b 20 20 20 20 20 20 20 20 20 20 20  (e));           
5640: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45              -- E
5650: 72 72 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  rr.    CREATE TA
5660: 42 4c 45 20 63 68 69 6c 64 35 28 6e 2c 20 6f 20  BLE child5(n, o 
5670: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
5680: 74 28 66 29 29 3b 20 20 20 20 20 20 20 20 20 20  t(f));          
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
56a0: 45 72 72 0a 20 20 20 20 43 52 45 41 54 45 20 54  Err.    CREATE T
56b0: 41 42 4c 45 20 63 68 69 6c 64 36 28 70 2c 20 71  ABLE child6(p, q
56c0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 70 2c  , FOREIGN KEY(p,
56d0: 71 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  q) REFERENCES pa
56e0: 72 65 6e 74 28 62 2c 20 63 29 29 3b 20 20 2d 2d  rent(b, c));  --
56f0: 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45 20   Err.    CREATE 
5700: 54 41 42 4c 45 20 63 68 69 6c 64 37 28 72 20 52  TABLE child7(r R
5710: 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74  EFERENCES parent
5720: 28 63 29 29 3b 20 20 20 20 20 20 20 20 20 20 20  (c));           
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
5740: 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  - Err.  }.} {}.d
5750: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39  o_test e_fkey-19
5760: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
5770: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5780: 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31   parent VALUES(1
5790: 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 29  , 2, 3, 4, 5, 6)
57a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
57b0: 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53 28  O child1 VALUES(
57c0: 27 78 78 78 27 2c 20 31 29 3b 0a 20 20 20 20 49  'xxx', 1);.    I
57d0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
57e0: 32 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c 20  2 VALUES('xxx', 
57f0: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
5800: 4e 54 4f 20 63 68 69 6c 64 33 20 56 41 4c 55 45  NTO child3 VALUE
5810: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b  S(3, 4);.  }.} {
5820: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
5830: 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -19.2 {.  catchs
5840: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
5850: 20 63 68 69 6c 64 34 20 56 41 4c 55 45 53 28 27   child4 VALUES('
5860: 78 78 78 27 2c 20 35 29 20 7d 0a 7d 20 7b 31 20  xxx', 5) }.} {1 
5870: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
5880: 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20  match}}.do_test 
5890: 65 5f 66 6b 65 79 2d 31 39 2e 33 20 7b 0a 20 20  e_fkey-19.3 {.  
58a0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
58b0: 54 20 49 4e 54 4f 20 63 68 69 6c 64 35 20 56 41  T INTO child5 VA
58c0: 4c 55 45 53 28 27 78 78 78 27 2c 20 36 29 20 7d  LUES('xxx', 6) }
58d0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
58e0: 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f  ey mismatch}}.do
58f0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e  _test e_fkey-19.
5900: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
5910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
5920: 6c 64 36 20 56 41 4c 55 45 53 28 32 2c 20 33 29  ld6 VALUES(2, 3)
5930: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
5940: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a   key mismatch}}.
5950: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
5960: 39 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.5 {.  catchsql
5970: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
5980: 68 69 6c 64 37 20 56 41 4c 55 45 53 28 33 29 20  hild7 VALUES(3) 
5990: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
59a0: 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a  key mismatch}}..
59b0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
5a00: 74 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  t errors in the 
5a10: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
5a20: 74 68 61 74 20 61 72 65 20 64 65 74 65 63 74 65  that are detecte
5a30: 64 20 77 68 69 6c 65 20 70 72 65 70 61 72 69 6e  d while preparin
5a40: 67 0a 23 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e  g.# DML statemen
5a50: 74 73 2e 20 54 68 65 20 65 72 72 6f 72 20 74 65  ts. The error te
5a60: 78 74 20 66 6f 72 20 74 68 65 73 65 20 6d 65 73  xt for these mes
5a70: 73 61 67 65 73 20 61 6c 77 61 79 73 20 6d 61 74  sages always mat
5a80: 63 68 65 73 20 0a 23 20 65 69 74 68 65 72 20 22  ches .# either "
5a90: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
5aa0: 61 74 63 68 22 20 6f 72 20 22 6e 6f 20 73 75 63  atch" or "no suc
5ab0: 68 20 74 61 62 6c 65 2a 22 20 28 75 73 69 6e 67  h table*" (using
5ac0: 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 5d 29   [string match])
5ad0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
5ae0: 46 3a 20 52 2d 34 35 34 38 38 2d 30 38 35 30 34  F: R-45488-08504
5af0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
5b00: 20 73 63 68 65 6d 61 20 63 6f 6e 74 61 69 6e 73   schema contains
5b10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 65   foreign key.# e
5b20: 72 72 6f 72 73 20 74 68 61 74 20 72 65 71 75 69  rrors that requi
5b30: 72 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 6d 6f  re looking at mo
5b40: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
5b50: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 6f 0a  e definition to.
5b60: 23 20 69 64 65 6e 74 69 66 79 2c 20 74 68 65 6e  # identify, then
5b70: 20 74 68 6f 73 65 20 65 72 72 6f 72 73 20 61 72   those errors ar
5b80: 65 20 6e 6f 74 20 64 65 74 65 63 74 65 64 20 77  e not detected w
5b90: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 73 20 61  hen the tables a
5ba0: 72 65 0a 23 20 63 72 65 61 74 65 64 2e 0a 23 0a  re.# created..#.
5bb0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5bc0: 2d 34 38 33 39 31 2d 33 38 34 37 32 20 49 6e 73  -48391-38472 Ins
5bd0: 74 65 61 64 2c 20 73 75 63 68 20 65 72 72 6f 72  tead, such error
5be0: 73 20 70 72 65 76 65 6e 74 20 74 68 65 0a 23 20  s prevent the.# 
5bf0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 66 72 6f 6d  application from
5c00: 20 70 72 65 70 61 72 69 6e 67 20 53 51 4c 20 73   preparing SQL s
5c10: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 6d  tatements that m
5c20: 6f 64 69 66 79 20 74 68 65 20 63 6f 6e 74 65 6e  odify the conten
5c30: 74 20 6f 66 0a 23 20 74 68 65 20 63 68 69 6c 64  t of.# the child
5c40: 20 6f 72 20 70 61 72 65 6e 74 20 74 61 62 6c 65   or parent table
5c50: 73 20 69 6e 20 77 61 79 73 20 74 68 61 74 20 75  s in ways that u
5c60: 73 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  se the foreign k
5c70: 65 79 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  eys..#.# EVIDENC
5c80: 45 2d 4f 46 3a 20 52 2d 30 33 31 30 38 2d 36 33  E-OF: R-03108-63
5c90: 36 35 39 20 54 68 65 20 45 6e 67 6c 69 73 68 20  659 The English 
5ca0: 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
5cb0: 65 73 73 61 67 65 20 66 6f 72 0a 23 20 66 6f 72  essage for.# for
5cc0: 65 69 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72  eign key DML err
5cd0: 6f 72 73 20 69 73 20 75 73 75 61 6c 6c 79 20 22  ors is usually "
5ce0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
5cf0: 61 74 63 68 22 20 62 75 74 20 63 61 6e 20 61 6c  atch" but can al
5d00: 73 6f 0a 23 20 62 65 20 22 6e 6f 20 73 75 63 68  so.# be "no such
5d10: 20 74 61 62 6c 65 22 20 69 66 20 74 68 65 20 70   table" if the p
5d20: 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 65 73  arent table does
5d30: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20   not exist..#.# 
5d40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
5d50: 30 37 38 31 2d 32 36 35 37 36 20 46 6f 72 65 69  0781-26576 Forei
5d60: 67 6e 20 6b 65 79 20 44 4d 4c 20 65 72 72 6f 72  gn key DML error
5d70: 73 20 61 72 65 20 6d 61 79 20 62 65 20 72 65 70  s are may be rep
5d80: 6f 72 74 65 64 0a 23 20 69 66 3a 20 54 68 65 20  orted.# if: The 
5d90: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 65  parent table doe
5da0: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
5db0: 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63  The parent key c
5dc0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 0a 23 20 69  olumns named.# i
5dd0: 6e 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  n the foreign ke
5de0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 20  y constraint do 
5df0: 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 54 68  not exist, or Th
5e00: 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c  e parent key col
5e10: 75 6d 6e 73 0a 23 20 6e 61 6d 65 64 20 69 6e 20  umns.# named in 
5e20: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
5e30: 63 6f 6e 73 74 72 61 69 6e 74 20 61 72 65 20 6e  constraint are n
5e40: 6f 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  ot the primary k
5e50: 65 79 20 6f 66 20 74 68 65 0a 23 20 70 61 72 65  ey of the.# pare
5e60: 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65  nt table and are
5e70: 20 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20   not subject to 
5e80: 61 20 75 6e 69 71 75 65 20 63 6f 6e 73 74 72 61  a unique constra
5e90: 69 6e 74 20 75 73 69 6e 67 0a 23 20 63 6f 6c 6c  int using.# coll
5ea0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 73  ating sequence s
5eb0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
5ec0: 43 52 45 41 54 45 20 54 41 42 4c 45 2c 20 6f 72  CREATE TABLE, or
5ed0: 20 54 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   The child table
5ee0: 0a 23 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  .# references th
5ef0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66  e primary key of
5f00: 20 74 68 65 20 70 61 72 65 6e 74 20 77 69 74 68   the parent with
5f10: 6f 75 74 20 73 70 65 63 69 66 79 69 6e 67 20 74  out specifying t
5f20: 68 65 0a 23 20 70 72 69 6d 61 72 79 20 6b 65 79  he.# primary key
5f30: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5f40: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6d 61   number of prima
5f50: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  ry key columns i
5f60: 6e 20 74 68 65 0a 23 20 70 61 72 65 6e 74 20 64  n the.# parent d
5f70: 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  o not match the 
5f80: 6e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20  number of child 
5f90: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 64  key columns..#.d
5fa0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30  o_test e_fkey-20
5fb0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5fc0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5fd0: 45 20 63 31 28 63 20 52 45 46 45 52 45 4e 43 45  E c1(c REFERENCE
5fe0: 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20 64  S nosuchtable, d
5ff0: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6000: 41 42 4c 45 20 70 32 28 61 2c 20 62 2c 20 55 4e  ABLE p2(a, b, UN
6010: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
6020: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32   CREATE TABLE c2
6030: 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
6040: 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
6050: 43 45 53 20 70 32 28 61 2c 20 78 29 29 3b 0a 0a  CES p2(a, x));..
6060: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6070: 20 70 33 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p3(a PRIMARY KE
6080: 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, b);.    CREAT
6090: 45 20 54 41 42 4c 45 20 63 33 28 63 20 52 45 46  E TABLE c3(c REF
60a0: 45 52 45 4e 43 45 53 20 70 33 28 62 29 2c 20 64  ERENCES p3(b), d
60b0: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
60c0: 41 42 4c 45 20 70 34 28 61 20 50 52 49 4d 41 52  ABLE p4(a PRIMAR
60d0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
60e0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
60f0: 45 58 20 70 34 69 20 4f 4e 20 70 34 28 62 20 43  EX p4i ON p4(b C
6100: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
6110: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6120: 20 63 34 28 63 20 52 45 46 45 52 45 4e 43 45 53   c4(c REFERENCES
6130: 20 70 34 28 62 29 2c 20 64 29 3b 0a 0a 20 20 20   p4(b), d);..   
6140: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 35   CREATE TABLE p5
6150: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
6160: 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  b COLLATE nocase
6170: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  );.    CREATE UN
6180: 49 51 55 45 20 49 4e 44 45 58 20 70 35 69 20 4f  IQUE INDEX p5i O
6190: 4e 20 70 35 28 62 20 43 4f 4c 4c 41 54 45 20 62  N p5(b COLLATE b
61a0: 69 6e 61 72 79 29 3b 0a 20 20 20 20 43 52 45 41  inary);.    CREA
61b0: 54 45 20 54 41 42 4c 45 20 63 35 28 63 20 52 45  TE TABLE c5(c RE
61c0: 46 45 52 45 4e 43 45 53 20 70 35 28 62 29 2c 20  FERENCES p5(b), 
61d0: 64 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  d);..    CREATE 
61e0: 54 41 42 4c 45 20 70 36 28 61 20 50 52 49 4d 41  TABLE p6(a PRIMA
61f0: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
6200: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28  CREATE TABLE c6(
6210: 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
6220: 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
6230: 45 53 20 70 36 29 3b 0a 0a 20 20 20 20 43 52 45  ES p6);..    CRE
6240: 41 54 45 20 54 41 42 4c 45 20 70 37 28 61 2c 20  ATE TABLE p7(a, 
6250: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
6260: 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , b));.    CREAT
6270: 45 20 54 41 42 4c 45 20 63 37 28 63 2c 20 64 20  E TABLE c7(c, d 
6280: 52 45 46 45 52 45 4e 43 45 53 20 70 37 29 3b 0a  REFERENCES p7);.
6290: 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63    }.} {}..foreac
62a0: 68 20 7b 74 6e 20 74 62 6c 20 70 74 62 6c 20 65  h {tn tbl ptbl e
62b0: 72 72 7d 20 7b 0a 20 20 32 20 63 31 20 7b 7d 20  rr} {.  2 c1 {} 
62c0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
62d0: 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65  main.nosuchtable
62e0: 22 0a 20 20 33 20 63 32 20 70 32 20 22 66 6f 72  ".  3 c2 p2 "for
62f0: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
6300: 68 22 0a 20 20 34 20 63 33 20 70 33 20 22 66 6f  h".  4 c3 p3 "fo
6310: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6320: 63 68 22 0a 20 20 35 20 63 34 20 70 34 20 22 66  ch".  5 c4 p4 "f
6330: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6340: 74 63 68 22 0a 20 20 36 20 63 35 20 70 35 20 22  tch".  6 c5 p5 "
6350: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6360: 61 74 63 68 22 0a 20 20 37 20 63 36 20 70 36 20  atch".  7 c6 p6 
6370: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
6380: 6d 61 74 63 68 22 0a 20 20 38 20 63 37 20 70 37  match".  8 c7 p7
6390: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
63a0: 73 6d 61 74 63 68 22 0a 7d 20 7b 0a 20 20 64 6f  smatch".} {.  do
63b0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e  _test e_fkey-20.
63c0: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63  $tn.1 {.    catc
63d0: 68 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  hsql "INSERT INT
63e0: 4f 20 24 74 62 6c 20 56 41 4c 55 45 53 28 27 61  O $tbl VALUES('a
63f0: 27 2c 20 27 62 27 29 22 0a 20 20 7d 20 5b 6c 69  ', 'b')".  } [li
6400: 73 74 20 31 20 24 65 72 72 5d 0a 20 20 64 6f 5f  st 1 $err].  do_
6410: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24  test e_fkey-20.$
6420: 74 6e 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.2 {.    catch
6430: 73 71 6c 20 22 55 50 44 41 54 45 20 24 74 62 6c  sql "UPDATE $tbl
6440: 20 53 45 54 20 63 20 3d 20 3f 2c 20 64 20 3d 20   SET c = ?, d = 
6450: 3f 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24  ?".  } [list 1 $
6460: 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73 74 20 65  err].  do_test e
6470: 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 33 20 7b  _fkey-20.$tn.3 {
6480: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 49  .    catchsql "I
6490: 4e 53 45 52 54 20 49 4e 54 4f 20 24 74 62 6c 20  NSERT INTO $tbl 
64a0: 53 45 4c 45 43 54 20 3f 2c 20 3f 22 0a 20 20 7d  SELECT ?, ?".  }
64b0: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 0a   [list 1 $err]..
64c0: 20 20 69 66 20 7b 24 70 74 62 6c 20 6e 65 20 22    if {$ptbl ne "
64d0: 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  "} {.    do_test
64e0: 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 34   e_fkey-20.$tn.4
64f0: 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71   {.      catchsq
6500: 6c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 24  l "DELETE FROM $
6510: 70 74 62 6c 22 0a 20 20 20 20 7d 20 5b 6c 69 73  ptbl".    } [lis
6520: 74 20 31 20 24 65 72 72 5d 0a 20 20 20 20 64 6f  t 1 $err].    do
6530: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30 2e  _test e_fkey-20.
6540: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 20 20 63 61  $tn.5 {.      ca
6550: 74 63 68 73 71 6c 20 22 55 50 44 41 54 45 20 24  tchsql "UPDATE $
6560: 70 74 62 6c 20 53 45 54 20 61 20 3d 20 3f 2c 20  ptbl SET a = ?, 
6570: 62 20 3d 20 3f 22 0a 20 20 20 20 7d 20 5b 6c 69  b = ?".    } [li
6580: 73 74 20 31 20 24 65 72 72 5d 0a 20 20 20 20 64  st 1 $err].    d
6590: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 30  o_test e_fkey-20
65a0: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 20 20 63  .$tn.6 {.      c
65b0: 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54 20  atchsql "INSERT 
65c0: 49 4e 54 4f 20 24 70 74 62 6c 20 53 45 4c 45 43  INTO $ptbl SELEC
65d0: 54 20 3f 2c 20 3f 22 0a 20 20 20 20 7d 20 5b 6c  T ?, ?".    } [l
65e0: 69 73 74 20 31 20 24 65 72 72 5d 0a 20 20 7d 0a  ist 1 $err].  }.
65f0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
6640: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
6650: 39 33 35 33 2d 34 33 36 34 33 0a 23 0a 23 20 54  9353-43643.#.# T
6660: 65 73 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20  est the example 
6670: 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  of foreign key m
6680: 69 73 6d 61 74 63 68 20 65 72 72 6f 72 73 20 63  ismatch errors c
6690: 61 75 73 65 64 20 62 79 20 69 6d 70 6c 69 63 69  aused by implici
66a0: 74 6c 79 0a 23 20 6d 61 70 70 69 6e 67 20 61 20  tly.# mapping a 
66b0: 63 68 69 6c 64 20 6b 65 79 20 74 6f 20 74 68 65  child key to the
66c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20   primary key of 
66d0: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
66e0: 20 77 68 65 6e 20 74 68 65 0a 23 20 63 68 69 6c   when the.# chil
66f0: 64 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f  d key consists o
6700: 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6e 75  f a different nu
6710: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
6720: 74 6f 20 74 68 61 74 20 70 72 69 6d 61 72 79 20  to that primary 
6730: 6b 65 79 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c  key..# .drop_all
6740: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
6750: 65 5f 66 6b 65 79 2d 32 31 2e 31 20 7b 0a 20 20  e_fkey-21.1 {.  
6760: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
6770: 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e  EATE TABLE paren
6780: 74 32 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59  t2(a, b, PRIMARY
6790: 20 4b 45 59 28 61 2c 62 29 29 3b 0a 0a 20 20 20   KEY(a,b));..   
67a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
67b0: 69 6c 64 38 28 78 2c 20 79 2c 20 46 4f 52 45 49  ild8(x, y, FOREI
67c0: 47 4e 20 4b 45 59 28 78 2c 79 29 20 52 45 46 45  GN KEY(x,y) REFE
67d0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29 3b  RENCES parent2);
67e0: 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20 20 20 43       -- Ok.    C
67f0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
6800: 64 39 28 78 20 52 45 46 45 52 45 4e 43 45 53 20  d9(x REFERENCES 
6810: 70 61 72 65 6e 74 32 29 3b 20 20 20 20 20 20 20  parent2);       
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 2d 2d 20 45 72 72 0a 20 20 20 20 43 52     -- Err.    CR
6840: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
6850: 31 30 28 78 2c 79 2c 7a 2c 20 46 4f 52 45 49 47  10(x,y,z, FOREIG
6860: 4e 20 4b 45 59 28 78 2c 79 2c 7a 29 20 52 45 46  N KEY(x,y,z) REF
6870: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 32 29  ERENCES parent2)
6880: 3b 20 2d 2d 20 45 72 72 0a 20 20 7d 0a 7d 20 7b  ; -- Err.  }.} {
6890: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
68a0: 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -21.2 {.  execsq
68b0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
68c0: 4e 54 4f 20 70 61 72 65 6e 74 32 20 56 41 4c 55  NTO parent2 VALU
68d0: 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20  ES('I', 'II');. 
68e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
68f0: 68 69 6c 64 38 20 56 41 4c 55 45 53 28 27 49 27  hild8 VALUES('I'
6900: 2c 20 27 49 49 27 29 3b 0a 20 20 7d 0a 7d 20 7b  , 'II');.  }.} {
6910: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
6920: 2d 32 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -21.3 {.  catchs
6930: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
6940: 20 63 68 69 6c 64 39 20 56 41 4c 55 45 53 28 27   child9 VALUES('
6950: 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  I') }.} {1 {fore
6960: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
6970: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
6980: 79 2d 32 31 2e 34 20 7b 0a 20 20 63 61 74 63 68  y-21.4 {.  catch
6990: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
69a0: 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45 53 28  O child9 VALUES(
69b0: 27 49 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  'II') }.} {1 {fo
69c0: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
69d0: 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ch}}.do_test e_f
69e0: 6b 65 79 2d 32 31 2e 35 20 7b 0a 20 20 63 61 74  key-21.5 {.  cat
69f0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
6a00: 4e 54 4f 20 63 68 69 6c 64 39 20 56 41 4c 55 45  NTO child9 VALUE
6a10: 53 28 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20 7b  S(NULL) }.} {1 {
6a20: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6a30: 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  atch}}.do_test e
6a40: 5f 66 6b 65 79 2d 32 31 2e 36 20 7b 0a 20 20 63  _fkey-21.6 {.  c
6a50: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
6a60: 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41   INTO child10 VA
6a70: 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 2c 20  LUES('I', 'II', 
6a80: 27 49 49 49 27 29 20 7d 0a 7d 20 7b 31 20 7b 66  'III') }.} {1 {f
6a90: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6aa0: 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  tch}}.do_test e_
6ab0: 66 6b 65 79 2d 32 31 2e 37 20 7b 0a 20 20 63 61  fkey-21.7 {.  ca
6ac0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6ad0: 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41 4c  INTO child10 VAL
6ae0: 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 7d  UES(1, 2, 3) }.}
6af0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
6b00: 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74   mismatch}}.do_t
6b10: 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 38 20  est e_fkey-21.8 
6b20: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
6b30: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
6b40: 31 30 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  10 VALUES(NULL, 
6b50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20  NULL, NULL) }.} 
6b60: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
6b70: 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 23 2d 2d 2d  mismatch}}..#---
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 65 72  ------.# Test er
6bd0: 72 6f 72 73 20 74 68 61 74 20 61 72 65 20 72 65  rors that are re
6be0: 70 6f 72 74 65 64 20 77 68 65 6e 20 63 72 65 61  ported when crea
6bf0: 74 69 6e 67 20 74 68 65 20 63 68 69 6c 64 20 74  ting the child t
6c00: 61 62 6c 65 2e 20 0a 23 20 53 70 65 63 69 66 69  able. .# Specifi
6c10: 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20 2a 20 64  cally:.#.#   * d
6c20: 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
6c30: 6f 66 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72  of child and par
6c40: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c  ent key columns,
6c50: 20 61 6e 64 0a 23 20 20 20 2a 20 63 68 69 6c 64   and.#   * child
6c60: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 64 6f   columns that do
6c70: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 0a 23 20   not exist..#.# 
6c80: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
6c90: 33 36 38 32 2d 35 39 38 32 30 20 42 79 20 63 6f  3682-59820 By co
6ca0: 6e 74 72 61 73 74 2c 20 69 66 20 66 6f 72 65 69  ntrast, if forei
6cb0: 67 6e 20 6b 65 79 20 65 72 72 6f 72 73 20 63 61  gn key errors ca
6cc0: 6e 20 62 65 0a 23 20 72 65 63 6f 67 6e 69 7a 65  n be.# recognize
6cd0: 64 20 73 69 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b  d simply by look
6ce0: 69 6e 67 20 61 74 20 74 68 65 20 64 65 66 69 6e  ing at the defin
6cf0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 69  ition of the chi
6d00: 6c 64 20 74 61 62 6c 65 20 61 6e 64 0a 23 20 77  ld table and.# w
6d10: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
6d20: 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 70 61 72   consult the par
6d30: 65 6e 74 20 74 61 62 6c 65 20 64 65 66 69 6e 69  ent table defini
6d40: 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 43  tion, then the C
6d50: 52 45 41 54 45 0a 23 20 54 41 42 4c 45 20 73 74  REATE.# TABLE st
6d60: 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  atement for the 
6d70: 63 68 69 6c 64 20 74 61 62 6c 65 20 66 61 69 6c  child table fail
6d80: 73 2e 0a 23 0a 23 20 54 68 65 73 65 20 65 72 72  s..#.# These err
6d90: 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  ors are reported
6da0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6db0: 46 4b 20 73 75 70 70 6f 72 74 20 69 73 20 65 6e  FK support is en
6dc0: 61 62 6c 65 64 2e 0a 23 0a 23 20 45 56 49 44 45  abled..#.# EVIDE
6dd0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 38 38 33 2d  NCE-OF: R-33883-
6de0: 32 38 38 33 33 20 46 6f 72 65 69 67 6e 20 6b 65  28833 Foreign ke
6df0: 79 20 44 44 4c 20 65 72 72 6f 72 73 20 61 72 65  y DDL errors are
6e00: 20 72 65 70 6f 72 74 65 64 0a 23 20 72 65 67 61   reported.# rega
6e10: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
6e20: 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e  r or not foreign
6e30: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
6e40: 20 61 72 65 20 65 6e 61 62 6c 65 64 20 77 68 65   are enabled whe
6e50: 6e 0a 23 20 74 68 65 20 74 61 62 6c 65 20 69 73  n.# the table is
6e60: 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 72 6f 70   created..#.drop
6e70: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 66 6f 72 65  _all_tables.fore
6e80: 61 63 68 20 66 6b 20 5b 6c 69 73 74 20 4f 46 46  ach fk [list OFF
6e90: 20 4f 4e 5d 20 7b 0a 20 20 65 78 65 63 73 71 6c   ON] {.  execsql
6ea0: 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
6eb0: 5f 6b 65 79 73 20 3d 20 24 66 6b 22 0a 20 20 73  _keys = $fk".  s
6ec0: 65 74 20 69 20 30 0a 20 20 66 6f 72 65 61 63 68  et i 0.  foreach
6ed0: 20 7b 73 71 6c 20 65 72 72 6f 72 7d 20 7b 0a 20   {sql error} {. 
6ee0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
6ef0: 20 63 68 69 6c 64 31 28 61 2c 20 62 2c 20 46 4f   child1(a, b, FO
6f00: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20  REIGN KEY(a, b) 
6f10: 52 45 46 45 52 45 4e 43 45 53 20 70 28 63 29 29  REFERENCES p(c))
6f20: 22 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20  ".      {number 
6f30: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
6f40: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
6f50: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
6f60: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
6f70: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
6f80: 20 74 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45   table}.    "CRE
6f90: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
6fa0: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
6fb0: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
6fc0: 43 45 53 20 70 28 63 2c 20 64 2c 20 65 29 29 22  CES p(c, d, e))"
6fd0: 0a 20 20 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f  .      {number o
6fe0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
6ff0: 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
7000: 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
7010: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
7020: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
7030: 74 61 62 6c 65 7d 0a 20 20 20 20 22 43 52 45 41  table}.    "CREA
7040: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
7050: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7060: 59 28 61 2c 20 63 29 20 52 45 46 45 52 45 4e 43  Y(a, c) REFERENC
7070: 45 53 20 70 28 63 2c 20 64 29 29 22 0a 20 20 20  ES p(c, d))".   
7080: 20 20 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     {unknown colu
7090: 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67  mn "c" in foreig
70a0: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
70b0: 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  }.    "CREATE TA
70c0: 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62 2c  BLE child2(a, b,
70d0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
70e0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  b) REFERENCES p(
70f0: 63 2c 20 64 29 29 22 0a 20 20 20 20 20 20 7b 75  c, d))".      {u
7100: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63  nknown column "c
7110: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
7120: 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a 20 20 7d   definition}.  }
7130: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65   {.    do_test e
7140: 5f 66 6b 65 79 2d 32 32 2e 24 66 6b 2e 5b 69 6e  _fkey-22.$fk.[in
7150: 63 72 20 69 5d 20 7b 0a 20 20 20 20 20 20 63 61  cr i] {.      ca
7160: 74 63 68 73 71 6c 20 24 73 71 6c 0a 20 20 20 20  tchsql $sql.    
7170: 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6f 72  } [list 1 $error
7180: 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ].  }.}..#------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
71e0: 61 20 52 45 46 45 52 45 4e 43 49 4e 47 20 63 6c  a REFERENCING cl
71f0: 61 75 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  ause that does n
7200: 6f 74 20 73 70 65 63 69 66 79 20 70 61 72 65 6e  ot specify paren
7210: 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23 20  t key columns.# 
7220: 69 6d 70 6c 69 63 69 74 6c 79 20 6d 61 70 73 20  implicitly maps 
7230: 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  to the primary k
7240: 65 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ey of the parent
7250: 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49 44   table..#.# EVID
7260: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 38 37 39  ENCE-OF: R-43879
7270: 2d 30 38 30 32 35 20 41 74 74 61 63 68 69 6e 67  -08025 Attaching
7280: 20 61 20 22 52 45 46 45 52 45 4e 43 45 53 20 3c   a "REFERENCES <
7290: 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e 22 0a 23  parent-table>".#
72a0: 20 63 6c 61 75 73 65 20 74 6f 20 61 20 63 6f 6c   clause to a col
72b0: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 63  umn definition c
72c0: 72 65 61 74 65 73 20 61 20 66 6f 72 65 69 67 6e  reates a foreign
72d0: 0a 23 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  .# key constrain
72e0: 74 20 74 68 61 74 20 6d 61 70 73 20 74 68 65 20  t that maps the 
72f0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 70 72  column to the pr
7300: 69 6d 61 72 79 20 6b 65 79 20 6f 66 0a 23 20 3c  imary key of.# <
7310: 70 61 72 65 6e 74 2d 74 61 62 6c 65 3e 2e 0a 23  parent-table>..#
7320: 20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79   .do_test e_fkey
7330: 2d 32 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -23.1 {.  execsq
7340: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
7350: 41 42 4c 45 20 70 31 28 61 2c 20 62 2c 20 50 52  ABLE p1(a, b, PR
7360: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
7370: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7380: 4c 45 20 70 32 28 61 2c 20 62 20 50 52 49 4d 41  LE p2(a, b PRIMA
7390: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
73a0: 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
73b0: 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
73c0: 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
73d0: 70 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  p1);.    CREATE 
73e0: 54 41 42 4c 45 20 63 32 28 61 2c 20 62 20 52 45  TABLE c2(a, b RE
73f0: 46 45 52 45 4e 43 45 53 20 70 32 29 3b 0a 20 20  FERENCES p2);.  
7400: 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65 73 74  }.} {}.proc test
7410: 5f 65 66 6b 65 79 5f 36 30 20 7b 74 6e 20 69 73  _efkey_60 {tn is
7420: 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64  Error sql} {.  d
7430: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 33  o_test e_fkey-23
7440: 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68  .$tn ".    catch
7450: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
7460: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
7470: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
7480: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
7490: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a  }}} $isError].}.
74a0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 32  .test_efkey_60 2
74b0: 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   1 "INSERT INTO 
74c0: 63 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  c1 VALUES(239, 2
74d0: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
74e0: 36 30 20 33 20 30 20 22 49 4e 53 45 52 54 20 49  60 3 0 "INSERT I
74f0: 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 32 33  NTO p1 VALUES(23
7500: 39 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66  9, 231)".test_ef
7510: 6b 65 79 5f 36 30 20 34 20 30 20 22 49 4e 53 45  key_60 4 0 "INSE
7520: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
7530: 53 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73  S(239, 231)".tes
7540: 74 5f 65 66 6b 65 79 5f 36 30 20 35 20 31 20 22  t_efkey_60 5 1 "
7550: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
7560: 41 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22  ALUES(239, 231)"
7570: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 36  .test_efkey_60 6
7580: 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   0 "INSERT INTO 
7590: 70 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32  p2 VALUES(239, 2
75a0: 33 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  31)".test_efkey_
75b0: 36 30 20 37 20 30 20 22 49 4e 53 45 52 54 20 49  60 7 0 "INSERT I
75c0: 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 32 33  NTO c2 VALUES(23
75d0: 39 2c 20 32 33 31 29 22 0a 0a 23 2d 2d 2d 2d 2d  9, 231)"..#-----
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
7630: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 6f 6e 20   an index on on 
7640: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f  the child key co
7650: 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46 4b 20 63  lumns of an FK c
7660: 6f 6e 73 74 72 61 69 6e 74 0a 23 20 69 73 20 6f  onstraint.# is o
7670: 70 74 69 6f 6e 61 6c 2e 0a 23 0a 23 20 45 56 49  ptional..#.# EVI
7680: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 31  DENCE-OF: R-1541
7690: 37 2d 32 38 30 31 34 20 49 6e 64 69 63 65 73 20  7-28014 Indices 
76a0: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
76b0: 20 66 6f 72 20 63 68 69 6c 64 20 6b 65 79 0a 23   for child key.#
76c0: 20 63 6f 6c 75 6d 6e 73 0a 23 0a 23 20 41 6c 73   columns.#.# Als
76d0: 6f 20 74 65 73 74 20 74 68 61 74 20 69 66 20 61  o test that if a
76e0: 6e 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  n index is creat
76f0: 65 64 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ed on the child 
7700: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 74 20  key columns, it 
7710: 64 6f 65 73 0a 23 20 6e 6f 74 20 6d 61 6b 65 20  does.# not make 
7720: 61 20 64 69 66 66 65 72 65 6e 63 65 20 77 68 65  a difference whe
7730: 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69  ther or not it i
7740: 73 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  s a UNIQUE index
7750: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7760: 46 3a 20 52 2d 31 35 37 34 31 2d 35 30 38 39 33  F: R-15741-50893
7770: 20 54 68 65 20 63 68 69 6c 64 20 6b 65 79 20 69   The child key i
7780: 6e 64 65 78 20 64 6f 65 73 20 6e 6f 74 20 68 61  ndex does not ha
7790: 76 65 20 74 6f 20 62 65 0a 23 20 28 61 6e 64 20  ve to be.# (and 
77a0: 75 73 75 61 6c 6c 79 20 77 69 6c 6c 20 6e 6f 74  usually will not
77b0: 20 62 65 29 20 61 20 55 4e 49 51 55 45 20 69 6e   be) a UNIQUE in
77c0: 64 65 78 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  dex..#.drop_all_
77d0: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
77e0: 5f 66 6b 65 79 2d 32 34 2e 31 20 7b 0a 20 20 65  _fkey-24.1 {.  e
77f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
7800: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
7810: 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c  (x, y, UNIQUE(y,
7820: 20 78 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   x));.    CREATE
7830: 20 54 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20   TABLE c1(a, b, 
7840: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
7850: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
7860: 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  ent(x, y));.    
7870: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28  CREATE TABLE c2(
7880: 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
7890: 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43  Y(a, b) REFERENC
78a0: 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29  ES parent(x, y))
78b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
78c0: 4c 45 20 63 33 28 61 2c 20 62 2c 20 46 4f 52 45  LE c3(a, b, FORE
78d0: 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45  IGN KEY(a, b) RE
78e0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
78f0: 78 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41  x, y));.    CREA
7900: 54 45 20 49 4e 44 45 58 20 63 32 69 20 4f 4e 20  TE INDEX c2i ON 
7910: 63 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  c2(a, b);.    CR
7920: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
7930: 58 20 63 33 69 20 4f 4e 20 63 32 28 62 2c 20 61  X c3i ON c2(b, a
7940: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63  );.  }.} {}.proc
7950: 20 74 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 7b   test_efkey_61 {
7960: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
7970: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
7980: 65 79 2d 32 34 2e 24 74 6e 20 22 0a 20 20 20 20  ey-24.$tn ".    
7990: 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d 0a  catchsql {$sql}.
79a0: 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20    " [lindex {{0 
79b0: 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  {}} {1 {foreign 
79c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
79d0: 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72 72 6f  ailed}}} $isErro
79e0: 72 5d 0a 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  r].}.foreach {tn
79f0: 20 63 7d 20 5b 6c 69 73 74 20 32 20 63 31 20 33   c} [list 2 c1 3
7a00: 20 63 32 20 34 20 63 33 5d 20 7b 0a 20 20 74 65   c2 4 c3] {.  te
7a10: 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e  st_efkey_61 $tn.
7a20: 31 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  1 1 "INSERT INTO
7a30: 20 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29   $c VALUES(1, 2)
7a40: 22 0a 20 20 74 65 73 74 5f 65 66 6b 65 79 5f 36  ".  test_efkey_6
7a50: 31 20 24 74 6e 2e 32 20 30 20 22 49 4e 53 45 52  1 $tn.2 0 "INSER
7a60: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
7a70: 4c 55 45 53 28 31 2c 20 32 29 22 0a 20 20 74 65  LUES(1, 2)".  te
7a80: 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e 2e  st_efkey_61 $tn.
7a90: 33 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  3 0 "INSERT INTO
7aa0: 20 24 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29   $c VALUES(1, 2)
7ab0: 22 0a 0a 20 20 65 78 65 63 73 71 6c 20 22 44 45  "..  execsql "DE
7ac0: 4c 45 54 45 20 46 52 4f 4d 20 24 63 20 3b 20 44  LETE FROM $c ; D
7ad0: 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e  ELETE FROM paren
7ae0: 74 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  t".}..#---------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7b40: 52 2d 30 30 32 37 39 2d 35 32 32 38 33 0a 23 0a  R-00279-52283.#.
7b50: 23 20 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c  # Test an exampl
7b60: 65 20 73 68 6f 77 69 6e 67 20 74 68 61 74 20 77  e showing that w
7b70: 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c  hen a row is del
7b80: 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  eted from the pa
7b90: 72 65 6e 74 20 0a 23 20 74 61 62 6c 65 2c 20 74  rent .# table, t
7ba0: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69  he child table i
7bb0: 73 20 71 75 65 72 69 65 64 20 66 6f 72 20 6f 72  s queried for or
7bc0: 70 68 61 6e 65 64 20 72 6f 77 73 20 61 73 20 66  phaned rows as f
7bd0: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 53 45  ollows:.#.#   SE
7be0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
7bf0: 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61 63  track WHERE trac
7c00: 6b 61 72 74 69 73 74 20 3d 20 3f 0a 23 0a 23 20  kartist = ?.#.# 
7c10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
7c20: 33 33 30 32 2d 33 30 39 35 36 20 49 66 20 74 68  3302-30956 If th
7c30: 69 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  is SELECT return
7c40: 73 20 61 6e 79 20 72 6f 77 73 20 61 74 20 61 6c  s any rows at al
7c50: 6c 2c 0a 23 20 74 68 65 6e 20 53 51 4c 69 74 65  l,.# then SQLite
7c60: 20 63 6f 6e 63 6c 75 64 65 73 20 74 68 61 74 20   concludes that 
7c70: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 72 6f 77  deleting the row
7c80: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
7c90: 20 74 61 62 6c 65 0a 23 20 77 6f 75 6c 64 20 76   table.# would v
7ca0: 69 6f 6c 61 74 65 20 74 68 65 20 66 6f 72 65 69  iolate the forei
7cb0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
7cc0: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e  t and returns an
7cd0: 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73   error..#.do_tes
7ce0: 74 20 65 5f 66 6b 65 79 2d 32 35 2e 31 20 7b 0a  t e_fkey-25.1 {.
7cf0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7d00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
7d10: 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
7d20: 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
7d30: 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
7d40: 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
7d50: 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
7d60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
7d70: 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
7d80: 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 0a 20       INTEGER, . 
7d90: 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
7da0: 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
7db0: 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
7dc0: 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  R,.      FOREIGN
7dd0: 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73 74   KEY(trackartist
7de0: 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  ) REFERENCES art
7df0: 69 73 74 28 61 72 74 69 73 74 69 64 29 0a 20 20  ist(artistid).  
7e00: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
7e10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7e20: 66 6b 65 79 2d 32 35 2e 32 20 7b 0a 20 20 50 52  fkey-25.2 {.  PR
7e30: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
7e40: 73 20 3d 20 4f 46 46 3b 0a 20 20 45 58 50 4c 41  s = OFF;.  EXPLA
7e50: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45  IN QUERY PLAN DE
7e60: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
7e70: 20 57 48 45 52 45 20 31 3b 0a 20 20 45 58 50 4c   WHERE 1;.  EXPL
7e80: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
7e90: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
7ea0: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
7eb0: 63 6b 61 72 74 69 73 74 20 3d 20 3f 3b 0a 7d 20  ckartist = ?;.} 
7ec0: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
7ed0: 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20  TABLE artist} . 
7ee0: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
7ef0: 4c 45 20 74 72 61 63 6b 7d 0a 7d 0a 64 6f 5f 65  LE track}.}.do_e
7f00: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b  xecsql_test e_fk
7f10: 65 79 2d 32 35 2e 33 20 7b 0a 20 20 50 52 41 47  ey-25.3 {.  PRAG
7f20: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
7f30: 3d 20 4f 4e 3b 0a 20 20 45 58 50 4c 41 49 4e 20  = ON;.  EXPLAIN 
7f40: 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54  QUERY PLAN DELET
7f50: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  E FROM artist WH
7f60: 45 52 45 20 31 3b 0a 7d 20 7b 0a 20 20 30 20 30  ERE 1;.} {.  0 0
7f70: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61   0 {SCAN TABLE a
7f80: 72 74 69 73 74 7d 0a 20 20 30 20 30 20 30 20 7b  rtist}.  0 0 0 {
7f90: 53 43 41 4e 20 54 41 42 4c 45 20 74 72 61 63 6b  SCAN TABLE track
7fa0: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  }.}.do_test e_fk
7fb0: 65 79 2d 32 35 2e 34 20 7b 0a 20 20 65 78 65 63  ey-25.4 {.  exec
7fc0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
7fd0: 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c   INTO artist VAL
7fe0: 55 45 53 28 35 2c 20 27 61 72 74 69 73 74 20 35  UES(5, 'artist 5
7ff0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
8000: 4e 54 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45  NTO artist VALUE
8010: 53 28 36 2c 20 27 61 72 74 69 73 74 20 36 27 29  S(6, 'artist 6')
8020: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8030: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
8040: 37 2c 20 27 61 72 74 69 73 74 20 37 27 29 3b 0a  7, 'artist 7');.
8050: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8060: 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20  track VALUES(1, 
8070: 27 74 72 61 63 6b 20 31 27 2c 20 35 29 3b 0a 20  'track 1', 5);. 
8080: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8090: 72 61 63 6b 20 56 41 4c 55 45 53 28 32 2c 20 27  rack VALUES(2, '
80a0: 74 72 61 63 6b 20 32 27 2c 20 36 29 3b 0a 20 20  track 2', 6);.  
80b0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
80c0: 65 5f 66 6b 65 79 2d 32 35 2e 35 20 7b 0a 20 20  e_fkey-25.5 {.  
80d0: 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78  concat \.    [ex
80e0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72  ecsql { SELECT r
80f0: 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20  owid FROM track 
8100: 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73  WHERE trackartis
8110: 74 20 3d 20 35 20 7d 5d 20 20 20 5c 0a 20 20 20  t = 5 }]   \.   
8120: 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c   [catchsql { DEL
8130: 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20  ETE FROM artist 
8140: 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d  WHERE artistid =
8150: 20 35 20 7d 5d 0a 7d 20 7b 31 20 31 20 7b 66 6f   5 }].} {1 1 {fo
8160: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
8170: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64  aint failed}}..d
8180: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35  o_test e_fkey-25
8190: 2e 36 20 7b 0a 20 20 63 6f 6e 63 61 74 20 5c 0a  .6 {.  concat \.
81a0: 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b 20 53      [execsql { S
81b0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
81c0: 20 74 72 61 63 6b 20 57 48 45 52 45 20 74 72 61   track WHERE tra
81d0: 63 6b 61 72 74 69 73 74 20 3d 20 37 20 7d 5d 20  ckartist = 7 }] 
81e0: 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68 73 71    \.    [catchsq
81f0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
8200: 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74  artist WHERE art
8210: 69 73 74 69 64 20 3d 20 37 20 7d 5d 0a 7d 20 7b  istid = 7 }].} {
8220: 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65  0 {}}..do_test e
8230: 5f 66 6b 65 79 2d 32 35 2e 37 20 7b 0a 20 20 63  _fkey-25.7 {.  c
8240: 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65 78 65  oncat \.    [exe
8250: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f  csql { SELECT ro
8260: 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b 20 57  wid FROM track W
8270: 48 45 52 45 20 74 72 61 63 6b 61 72 74 69 73 74  HERE trackartist
8280: 20 3d 20 36 20 7d 5d 20 20 20 5c 0a 20 20 20 20   = 6 }]   \.    
8290: 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45  [catchsql { DELE
82a0: 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57  TE FROM artist W
82b0: 48 45 52 45 20 61 72 74 69 73 74 69 64 20 3d 20  HERE artistid = 
82c0: 36 20 7d 5d 0a 7d 20 7b 32 20 31 20 7b 66 6f 72  6 }].} {2 1 {for
82d0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
82e0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d  int failed}}..#-
82f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
8340: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 39 33 36 2d  NCE-OF: R-47936-
8350: 31 30 30 34 34 20 4f 72 2c 20 6d 6f 72 65 20 67  10044 Or, more g
8360: 65 6e 65 72 61 6c 6c 79 3a 0a 23 20 53 45 4c 45  enerally:.# SELE
8370: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 3c 63  CT rowid FROM <c
8380: 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57 48 45 52  hild-table> WHER
8390: 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e 20 3d 20  E <child-key> = 
83a0: 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76 61 6c 75  :parent_key_valu
83b0: 65 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20  e.#.# Test that 
83c0: 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65  when a row is de
83d0: 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70  leted from the p
83e0: 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 61  arent table of a
83f0: 6e 20 46 4b 20 0a 23 20 63 6f 6e 73 74 72 61 69  n FK .# constrai
8400: 6e 74 2c 20 74 68 65 20 63 68 69 6c 64 20 74 61  nt, the child ta
8410: 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66  ble is queried f
8420: 6f 72 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 73  or orphaned rows
8430: 2e 20 54 68 65 0a 23 20 71 75 65 72 79 20 69 73  . The.# query is
8440: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
8450: 23 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77  #.#   SELECT row
8460: 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74  id FROM <child-t
8470: 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69  able> WHERE <chi
8480: 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e  ld-key> = :paren
8490: 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20  t_key_value.#.# 
84a0: 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 77  Also test that w
84b0: 68 65 6e 20 61 20 72 6f 77 20 69 73 20 69 6e 73  hen a row is ins
84c0: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70  erted into the p
84d0: 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 6f 72 20  arent table, or 
84e0: 77 68 65 6e 20 74 68 65 20 0a 23 20 70 61 72 65  when the .# pare
84f0: 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f 66  nt key values of
8500: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72 6f 77   an existing row
8510: 20 61 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 61   are modified, a
8520: 20 71 75 65 72 79 20 65 71 75 69 76 61 6c 65 6e   query equivalen
8530: 74 0a 23 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  t.# to the follo
8540: 77 69 6e 67 20 69 73 20 70 6c 61 6e 6e 65 64 2e  wing is planned.
8550: 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 69   In some cases i
8560: 74 20 69 73 20 6e 6f 74 20 65 78 65 63 75 74 65  t is not execute
8570: 64 2c 20 62 75 74 20 69 74 0a 23 20 69 73 20 61  d, but it.# is a
8580: 6c 77 61 79 73 20 70 6c 61 6e 6e 65 64 2e 0a 23  lways planned..#
8590: 0a 23 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69  .#   SELECT rowi
85a0: 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74 61  d FROM <child-ta
85b0: 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69 6c  ble> WHERE <chil
85c0: 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e 74  d-key> = :parent
85d0: 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20 45  _key_value.#.# E
85e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
85f0: 36 31 36 2d 34 36 37 30 30 20 53 69 6d 69 6c 61  616-46700 Simila
8600: 72 20 71 75 65 72 69 65 73 20 6d 61 79 20 62 65  r queries may be
8610: 20 72 75 6e 20 69 66 20 74 68 65 20 63 6f 6e 74   run if the cont
8620: 65 6e 74 0a 23 20 6f 66 20 74 68 65 20 70 61 72  ent.# of the par
8630: 65 6e 74 20 6b 65 79 20 69 73 20 6d 6f 64 69 66  ent key is modif
8640: 69 65 64 20 6f 72 20 61 20 6e 65 77 20 72 6f 77  ied or a new row
8650: 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
8660: 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 23 20 74  o the parent.# t
8670: 61 62 6c 65 2e 0a 23 0a 23 0a 64 72 6f 70 5f 61  able..#.#.drop_a
8680: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
8690: 74 20 65 5f 66 6b 65 79 2d 32 36 2e 31 20 7b 0a  t e_fkey-26.1 {.
86a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
86b0: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
86c0: 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 79 2c 20  x, y, UNIQUE(y, 
86d0: 78 29 29 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61  x)) }.} {}.forea
86e0: 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20  ch {tn sql} {.  
86f0: 32 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  2 { .    CREATE 
8700: 54 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62  TABLE child(a, b
8710: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
8720: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
8730: 61 72 65 6e 74 28 78 2c 20 79 29 29 0a 20 20 7d  arent(x, y)).  }
8740: 0a 20 20 33 20 7b 20 0a 20 20 20 20 43 52 45 41  .  3 { .    CREA
8750: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 61  TE TABLE child(a
8760: 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , b, FOREIGN KEY
8770: 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e 43 45  (a, b) REFERENCE
8780: 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29 29 3b  S parent(x, y));
8790: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
87a0: 58 20 63 68 69 6c 64 69 20 4f 4e 20 63 68 69 6c  X childi ON chil
87b0: 64 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 34  d(a, b);.  }.  4
87c0: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
87d0: 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c  ABLE child(a, b,
87e0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
87f0: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  b) REFERENCES pa
8800: 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20  rent(x, y));.   
8810: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
8820: 4e 44 45 58 20 63 68 69 6c 64 69 20 4f 4e 20 63  NDEX childi ON c
8830: 68 69 6c 64 28 62 2c 20 61 29 3b 0a 20 20 7d 0a  hild(b, a);.  }.
8840: 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73  } {.  execsql $s
8850: 71 6c 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  ql..  execsql {P
8860: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
8870: 79 73 20 3d 20 4f 46 46 7d 0a 20 20 73 65 74 20  ys = OFF}.  set 
8880: 64 65 6c 65 74 65 20 5b 63 6f 6e 63 61 74 20 5c  delete [concat \
8890: 0a 20 20 20 20 20 20 5b 65 71 70 20 22 44 45 4c  .      [eqp "DEL
88a0: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
88b0: 57 48 45 52 45 20 31 22 5d 20 5c 0a 20 20 20 20  WHERE 1"] \.    
88c0: 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20 72    [eqp "SELECT r
88d0: 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64 20  owid FROM child 
88e0: 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
88f0: 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 73 65  b = ?"].  ].  se
8900: 74 20 75 70 64 61 74 65 20 5b 63 6f 6e 63 61 74  t update [concat
8910: 20 5c 0a 20 20 20 20 20 20 5b 65 71 70 20 22 55   \.      [eqp "U
8920: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
8930: 20 78 3d 3f 2c 20 79 3d 3f 22 5d 20 5c 0a 20 20   x=?, y=?"] \.  
8940: 20 20 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54      [eqp "SELECT
8950: 20 72 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c   rowid FROM chil
8960: 64 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  d WHERE a = ? AN
8970: 44 20 62 20 3d 20 3f 22 5d 20 5c 0a 20 20 20 20  D b = ?"] \.    
8980: 20 20 5b 65 71 70 20 22 53 45 4c 45 43 54 20 72    [eqp "SELECT r
8990: 6f 77 69 64 20 46 52 4f 4d 20 63 68 69 6c 64 20  owid FROM child 
89a0: 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
89b0: 62 20 3d 20 3f 22 5d 0a 20 20 5d 0a 20 20 65 78  b = ?"].  ].  ex
89c0: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f  ecsql {PRAGMA fo
89d0: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 7d  reign_keys = ON}
89e0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..  do_test e_fk
89f0: 65 79 2d 32 36 2e 24 74 6e 2e 31 20 7b 20 65 71  ey-26.$tn.1 { eq
8a00: 70 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  p "DELETE FROM p
8a10: 61 72 65 6e 74 20 57 48 45 52 45 20 31 22 20 7d  arent WHERE 1" }
8a20: 20 24 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65   $delete.  do_te
8a30: 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e 24 74 6e  st e_fkey-26.$tn
8a40: 2e 32 20 7b 20 65 71 70 20 22 55 50 44 41 54 45  .2 { eqp "UPDATE
8a50: 20 70 61 72 65 6e 74 20 73 65 74 20 78 3d 3f 2c   parent set x=?,
8a60: 20 79 3d 3f 22 20 7d 20 24 75 70 64 61 74 65 0a   y=?" } $update.
8a70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52 4f 50  .  execsql {DROP
8a80: 20 54 41 42 4c 45 20 63 68 69 6c 64 7d 0a 7d 0a   TABLE child}.}.
8a90: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
8ae0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 35  IDENCE-OF: R-145
8af0: 35 33 2d 33 34 30 31 33 0a 23 0a 23 20 54 65 73  53-34013.#.# Tes
8b00: 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73 63  t the example sc
8b10: 68 65 6d 61 20 61 74 20 74 68 65 20 65 6e 64 20  hema at the end 
8b20: 6f 66 20 73 65 63 74 69 6f 6e 20 33 2e 20 41 6c  of section 3. Al
8b30: 73 6f 20 74 65 73 74 20 74 68 61 74 20 69 73 0a  so test that is.
8b40: 23 20 69 73 20 22 65 66 66 69 63 69 65 6e 74 22  # is "efficient"
8b50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 22  . In this case "
8b60: 65 66 66 69 63 69 65 6e 74 22 20 6d 65 61 6e 73  efficient" means
8b70: 20 74 68 61 74 20 66 6f 72 65 69 67 6e 20 6b 65   that foreign ke
8b80: 79 0a 23 20 72 65 6c 61 74 65 64 20 6f 70 65 72  y.# related oper
8b90: 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 61  ations on the pa
8ba0: 72 65 6e 74 20 74 61 62 6c 65 20 64 6f 20 6e 6f  rent table do no
8bb0: 74 20 70 72 6f 76 6f 6b 65 20 6c 69 6e 65 61 72  t provoke linear
8bc0: 20 73 63 61 6e 73 2e 0a 23 0a 64 72 6f 70 5f 61   scans..#.drop_a
8bd0: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
8be0: 74 20 65 5f 66 6b 65 79 2d 32 37 2e 31 20 7b 0a  t e_fkey-27.1 {.
8bf0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8c00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72 74  CREATE TABLE art
8c10: 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69 73  ist(.      artis
8c20: 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20 50  tid    INTEGER P
8c30: 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
8c40: 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20 54     artistname  T
8c50: 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  EXT.    );.    C
8c60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61 63  REATE TABLE trac
8c70: 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69 64  k(.      trackid
8c80: 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20       INTEGER,.  
8c90: 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20 20      trackname   
8ca0: 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72 61  TEXT, .      tra
8cb0: 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45 52  ckartist INTEGER
8cc0: 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74 69   REFERENCES arti
8cd0: 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  st.    );.    CR
8ce0: 45 41 54 45 20 49 4e 44 45 58 20 74 72 61 63 6b  EATE INDEX track
8cf0: 69 6e 64 65 78 20 4f 4e 20 74 72 61 63 6b 28 74  index ON track(t
8d00: 72 61 63 6b 61 72 74 69 73 74 29 3b 0a 20 20 7d  rackartist);.  }
8d10: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
8d20: 66 6b 65 79 2d 32 37 2e 32 20 7b 0a 20 20 65 71  fkey-27.2 {.  eq
8d30: 70 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  p { INSERT INTO 
8d40: 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 3f 2c  artist VALUES(?,
8d50: 20 3f 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78   ?) }.} {}.do_ex
8d60: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65  ecsql_test e_fke
8d70: 79 2d 32 37 2e 33 20 7b 0a 20 20 45 58 50 4c 41  y-27.3 {.  EXPLA
8d80: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 55 50  IN QUERY PLAN UP
8d90: 44 41 54 45 20 61 72 74 69 73 74 20 53 45 54 20  DATE artist SET 
8da0: 61 72 74 69 73 74 69 64 20 3d 20 3f 2c 20 61 72  artistid = ?, ar
8db0: 74 69 73 74 6e 61 6d 65 20 3d 20 3f 0a 7d 20 7b  tistname = ?.} {
8dc0: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
8dd0: 41 42 4c 45 20 61 72 74 69 73 74 7d 0a 20 20 30  ABLE artist}.  0
8de0: 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   0 0 {SEARCH TAB
8df0: 4c 45 20 74 72 61 63 6b 20 55 53 49 4e 47 20 49  LE track USING I
8e00: 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20  NDEX trackindex 
8e10: 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 7d  (trackartist=?)}
8e20: 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43   .  0 0 0 {SEARC
8e30: 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53  H TABLE track US
8e40: 49 4e 47 20 49 4e 44 45 58 20 74 72 61 63 6b 69  ING INDEX tracki
8e50: 6e 64 65 78 20 28 74 72 61 63 6b 61 72 74 69 73  ndex (trackartis
8e60: 74 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73  t=?)}.}.do_execs
8e70: 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  ql_test e_fkey-2
8e80: 37 2e 34 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  7.4 {.  EXPLAIN 
8e90: 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54  QUERY PLAN DELET
8ea0: 45 20 46 52 4f 4d 20 61 72 74 69 73 74 0a 7d 20  E FROM artist.} 
8eb0: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
8ec0: 54 41 42 4c 45 20 61 72 74 69 73 74 7d 20 0a 20  TABLE artist} . 
8ed0: 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54   0 0 0 {SEARCH T
8ee0: 41 42 4c 45 20 74 72 61 63 6b 20 55 53 49 4e 47  ABLE track USING
8ef0: 20 49 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65   INDEX trackinde
8f00: 78 20 28 74 72 61 63 6b 61 72 74 69 73 74 3d 3f  x (trackartist=?
8f10: 29 7d 0a 7d 0a 0a 0a 23 23 23 23 23 23 23 23 23  )}.}...#########
8f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8f60: 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 34  ##.### SECTION 4
8f70: 2e 31 3a 20 43 6f 6d 70 6f 73 69 74 65 20 46 6f  .1: Composite Fo
8f80: 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73 74 72  reign Key Constr
8f90: 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23 23 23  aints.##########
8fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8fe0: 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #..#------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
9030: 43 68 65 63 6b 20 74 68 61 74 20 70 61 72 65 6e  Check that paren
9040: 74 20 61 6e 64 20 63 68 69 6c 64 20 6b 65 79 73  t and child keys
9050: 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
9060: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  ame number of co
9070: 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  lumns..#.# EVIDE
9080: 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 30 36 32 2d  NCE-OF: R-41062-
9090: 33 34 34 33 31 20 50 61 72 65 6e 74 20 61 6e 64  34431 Parent and
90a0: 20 63 68 69 6c 64 20 6b 65 79 73 20 6d 75 73 74   child keys must
90b0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a 23   have the same.#
90c0: 20 63 61 72 64 69 6e 61 6c 69 74 79 2e 0a 23 0a   cardinality..#.
90d0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20  foreach {tn sql 
90e0: 65 72 72 7d 20 7b 0a 20 20 31 20 22 43 52 45 41  err} {.  1 "CREA
90f0: 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20 52 45  TE TABLE c(jj RE
9100: 46 45 52 45 4e 43 45 53 20 70 28 78 2c 20 79 29  FERENCES p(x, y)
9110: 29 22 20 0a 20 20 20 20 7b 66 6f 72 65 69 67 6e  )" .    {foreign
9120: 20 6b 65 79 20 6f 6e 20 6a 6a 20 73 68 6f 75 6c   key on jj shoul
9130: 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
9140: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
9150: 61 62 6c 65 20 70 7d 0a 0a 20 20 32 20 22 43 52  able p}..  2 "CR
9160: 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a 6a 20  EATE TABLE c(jj 
9170: 52 45 46 45 52 45 4e 43 45 53 20 70 28 29 29 22  REFERENCES p())"
9180: 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79 6e 74   {near ")": synt
9190: 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 33 20 22  ax error}..  3 "
91a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 6a  CREATE TABLE c(j
91b0: 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a  j, FOREIGN KEY(j
91c0: 6a 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  j) REFERENCES p(
91d0: 78 2c 20 79 29 29 22 20 0a 20 20 20 20 7b 6e 75  x, y))" .    {nu
91e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
91f0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
9200: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
9210: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9220: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
9230: 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20  enced table}..  
9240: 34 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  4 "CREATE TABLE 
9250: 63 28 6a 6a 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c(jj, FOREIGN KE
9260: 59 28 6a 6a 29 20 52 45 46 45 52 45 4e 43 45 53  Y(jj) REFERENCES
9270: 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61   p())" .    {nea
9280: 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72  r ")": syntax er
9290: 72 6f 72 7d 0a 0a 20 20 35 20 22 43 52 45 41 54  ror}..  5 "CREAT
92a0: 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a  E TABLE c(ii, jj
92b0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a  , FOREIGN KEY(jj
92c0: 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43 45 53  , ii) REFERENCES
92d0: 20 70 28 29 29 22 20 0a 20 20 20 20 7b 6e 65 61   p())" .    {nea
92e0: 72 20 22 29 22 3a 20 73 79 6e 74 61 78 20 65 72  r ")": syntax er
92f0: 72 6f 72 7d 0a 0a 20 20 36 20 22 43 52 45 41 54  ror}..  6 "CREAT
9300: 45 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a  E TABLE c(ii, jj
9310: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a  , FOREIGN KEY(jj
9320: 2c 20 69 69 29 20 52 45 46 45 52 45 4e 43 45 53  , ii) REFERENCES
9330: 20 70 28 78 29 29 22 20 0a 20 20 20 20 7b 6e 75   p(x))" .    {nu
9340: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9350: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
9360: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
9370: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9380: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
9390: 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a 0a 20 20  enced table}..  
93a0: 37 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  7 "CREATE TABLE 
93b0: 63 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47  c(ii, jj, FOREIG
93c0: 4e 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52 45  N KEY(jj, ii) RE
93d0: 46 45 52 45 4e 43 45 53 20 70 28 78 2c 79 2c 7a  FERENCES p(x,y,z
93e0: 29 29 22 20 0a 20 20 20 20 7b 6e 75 6d 62 65 72  ))" .    {number
93f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
9400: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
9410: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
9420: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9430: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
9440: 64 20 74 61 62 6c 65 7d 0a 7d 20 7b 0a 20 20 64  d table}.} {.  d
9450: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
9460: 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
9470: 32 38 2e 24 74 6e 20 5b 6c 69 73 74 20 63 61 74  28.$tn [list cat
9480: 63 68 73 71 6c 20 24 73 71 6c 5d 20 5b 6c 69 73  chsql $sql] [lis
9490: 74 20 31 20 24 65 72 72 5d 0a 7d 0a 64 6f 5f 74  t 1 $err].}.do_t
94a0: 65 73 74 20 65 5f 66 6b 65 79 2d 32 38 2e 38 20  est e_fkey-28.8 
94b0: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
94c0: 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  les.  execsql {.
94d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
94e0: 20 70 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   p(x PRIMARY KEY
94f0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
9500: 42 4c 45 20 63 28 61 2c 20 62 2c 20 46 4f 52 45  BLE c(a, b, FORE
9510: 49 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46  IGN KEY(a,b) REF
9520: 45 52 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a  ERENCES p);.  }.
9530: 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45    catchsql {DELE
9540: 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20  TE FROM p}.} {1 
9550: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
9560: 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20  match}}.do_test 
9570: 65 5f 66 6b 65 79 2d 32 38 2e 39 20 7b 0a 20 20  e_fkey-28.9 {.  
9580: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
9590: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
95a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 78  CREATE TABLE p(x
95b0: 2c 20 79 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , y, PRIMARY KEY
95c0: 28 78 2c 79 29 29 3b 0a 20 20 20 20 43 52 45 41  (x,y));.    CREA
95d0: 54 45 20 54 41 42 4c 45 20 63 28 61 20 52 45 46  TE TABLE c(a REF
95e0: 45 52 45 4e 43 45 53 20 70 29 3b 0a 20 20 7d 0a  ERENCES p);.  }.
95f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45    catchsql {DELE
9600: 54 45 20 46 52 4f 4d 20 70 7d 0a 7d 20 7b 31 20  TE FROM p}.} {1 
9610: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
9620: 6d 61 74 63 68 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  match}}...#-----
9630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9670: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
9680: 4f 46 3a 20 52 2d 32 34 36 37 36 2d 30 39 38 35  OF: R-24676-0985
9690: 39 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20 65  9.#.# Test the e
96a0: 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 20 69 6e  xample schema in
96b0: 20 74 68 65 20 22 43 6f 6d 70 6f 73 69 74 65 20   the "Composite 
96c0: 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73  Foreign Key Cons
96d0: 74 72 61 69 6e 74 73 22 20 0a 23 20 73 65 63 74  traints" .# sect
96e0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ion..#.do_test e
96f0: 5f 66 6b 65 79 2d 32 39 2e 31 20 7b 0a 20 20 65  _fkey-29.1 {.  e
9700: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
9710: 41 54 45 20 54 41 42 4c 45 20 61 6c 62 75 6d 28  ATE TABLE album(
9720: 0a 20 20 20 20 20 20 61 6c 62 75 6d 61 72 74 69  .      albumarti
9730: 73 74 20 54 45 58 54 2c 0a 20 20 20 20 20 20 61  st TEXT,.      a
9740: 6c 62 75 6d 6e 61 6d 65 20 54 45 58 54 2c 0a 20  lbumname TEXT,. 
9750: 20 20 20 20 20 61 6c 62 75 6d 63 6f 76 65 72 20       albumcover 
9760: 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 50 52  BINARY,.      PR
9770: 49 4d 41 52 59 20 4b 45 59 28 61 6c 62 75 6d 61  IMARY KEY(albuma
9780: 72 74 69 73 74 2c 20 61 6c 62 75 6d 6e 61 6d 65  rtist, albumname
9790: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  ).    );.    CRE
97a0: 41 54 45 20 54 41 42 4c 45 20 73 6f 6e 67 28 0a  ATE TABLE song(.
97b0: 20 20 20 20 20 20 73 6f 6e 67 69 64 20 49 4e 54        songid INT
97c0: 45 47 45 52 2c 0a 20 20 20 20 20 20 73 6f 6e 67  EGER,.      song
97d0: 61 72 74 69 73 74 20 54 45 58 54 2c 0a 20 20 20  artist TEXT,.   
97e0: 20 20 20 73 6f 6e 67 61 6c 62 75 6d 20 54 45 58     songalbum TEX
97f0: 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67 6e 61 6d  T,.      songnam
9800: 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 46 4f  e TEXT,.      FO
9810: 52 45 49 47 4e 20 4b 45 59 28 73 6f 6e 67 61 72  REIGN KEY(songar
9820: 74 69 73 74 2c 20 73 6f 6e 67 61 6c 62 75 6d 29  tist, songalbum)
9830: 20 52 45 46 45 52 45 4e 43 45 53 20 61 6c 62 75   REFERENCES albu
9840: 6d 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 61 6c  m(albumartist,al
9850: 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b 0a  bumname).    );.
9860: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
9870: 74 20 65 5f 66 6b 65 79 2d 32 39 2e 32 20 7b 0a  t e_fkey-29.2 {.
9880: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 6c 62 75  INSERT INTO albu
98a0: 6d 20 56 41 4c 55 45 53 28 27 45 6c 76 69 73 20  m VALUES('Elvis 
98b0: 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73  Presley', 'Elvis
98c0: 27 27 20 43 68 72 69 73 74 6d 61 73 20 41 6c 62  '' Christmas Alb
98d0: 75 6d 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  um', NULL);.    
98e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67  INSERT INTO song
98f0: 20 56 41 4c 55 45 53 28 0a 20 20 20 20 20 20 31   VALUES(.      1
9900: 2c 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79  , 'Elvis Presley
9910: 27 2c 20 27 45 6c 76 69 73 27 27 20 43 68 72 69  ', 'Elvis'' Chri
9920: 73 74 6d 61 73 20 41 6c 62 75 6d 27 2c 20 27 48  stmas Album', 'H
9930: 65 72 65 20 43 6f 6d 65 73 20 53 61 6e 74 61 20  ere Comes Santa 
9940: 43 6c 61 75 73 65 27 0a 20 20 20 20 29 3b 0a 20  Clause'.    );. 
9950: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
9960: 65 5f 66 6b 65 79 2d 32 39 2e 33 20 7b 0a 20 20  e_fkey-29.3 {.  
9970: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
9980: 4e 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20  NSERT INTO song 
9990: 56 41 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73  VALUES(2, 'Elvis
99a0: 20 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69   Presley', 'Elvi
99b0: 73 20 49 73 20 42 61 63 6b 21 27 2c 20 27 46 65  s Is Back!', 'Fe
99c0: 76 65 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  ver');.  }.} {1 
99d0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
99e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
99f0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
9a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
9a40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9a50: 33 36 32 36 2d 34 38 34 31 38 20 49 6e 20 53 51  3626-48418 In SQ
9a60: 4c 69 74 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  Lite, if any of 
9a70: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f  the child key co
9a80: 6c 75 6d 6e 73 0a 23 20 28 69 6e 20 74 68 69 73  lumns.# (in this
9a90: 20 63 61 73 65 20 73 6f 6e 67 61 72 74 69 73 74   case songartist
9aa0: 20 61 6e 64 20 73 6f 6e 67 61 6c 62 75 6d 29 20   and songalbum) 
9ab0: 61 72 65 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  are NULL, then t
9ac0: 68 65 72 65 20 69 73 20 6e 6f 0a 23 20 72 65 71  here is no.# req
9ad0: 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 20 63  uirement for a c
9ae0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 6f 77  orresponding row
9af0: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   in the parent t
9b00: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  able..#.do_test 
9b10: 65 5f 66 6b 65 79 2d 33 30 2e 31 20 7b 0a 20 20  e_fkey-30.1 {.  
9b20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
9b30: 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56  SERT INTO song V
9b40: 41 4c 55 45 53 28 32 2c 20 27 45 6c 76 69 73 20  ALUES(2, 'Elvis 
9b50: 50 72 65 73 6c 65 79 27 2c 20 4e 55 4c 4c 2c 20  Presley', NULL, 
9b60: 27 46 65 76 65 72 27 29 3b 0a 20 20 20 20 49 4e  'Fever');.    IN
9b70: 53 45 52 54 20 49 4e 54 4f 20 73 6f 6e 67 20 56  SERT INTO song V
9b80: 41 4c 55 45 53 28 33 2c 20 4e 55 4c 4c 2c 20 27  ALUES(3, NULL, '
9b90: 45 6c 76 69 73 20 49 73 20 42 61 63 6b 27 2c 20  Elvis Is Back', 
9ba0: 27 53 6f 6c 64 69 65 72 20 42 6f 79 27 29 3b 0a  'Soldier Boy');.
9bb0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23    }.} {}..######
9bc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9bd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9be0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9bf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c00: 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f  #####.### SECTIO
9c10: 4e 20 34 2e 32 3a 20 44 65 66 65 72 72 65 64 20  N 4.2: Deferred 
9c20: 46 6f 72 65 69 67 6e 20 4b 65 79 20 43 6f 6e 73  Foreign Key Cons
9c30: 74 72 61 69 6e 74 73 0a 23 23 23 23 23 23 23 23  traints.########
9c40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9c80: 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ###..#----------
9c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9cd0: 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
9ce0: 20 73 74 61 74 65 6d 65 6e 74 20 76 69 6f 6c 61   statement viola
9cf0: 74 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  tes an immediate
9d00: 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20   FK constraint, 
9d10: 61 6e 64 20 74 68 65 0a 23 20 64 61 74 61 62 61  and the.# databa
9d20: 73 65 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  se does not sati
9d30: 73 66 79 20 74 68 65 20 46 4b 20 63 6f 6e 73 74  sfy the FK const
9d40: 72 61 69 6e 74 20 6f 6e 63 65 20 61 6c 6c 20 65  raint once all e
9d50: 66 66 65 63 74 73 20 6f 66 20 74 68 65 0a 23 20  ffects of the.# 
9d60: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 62  statement have b
9d70: 65 65 6e 20 61 70 70 6c 69 65 64 2c 20 61 6e 20  een applied, an 
9d80: 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65  error is reporte
9d90: 64 20 61 6e 64 20 74 68 65 20 65 66 66 65 63 74  d and the effect
9da0: 73 20 6f 66 0a 23 20 74 68 65 20 73 74 61 74 65  s of.# the state
9db0: 6d 65 6e 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ment rolled back
9dc0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
9dd0: 46 3a 20 52 2d 30 39 33 32 33 2d 33 30 34 37 30  F: R-09323-30470
9de0: 20 49 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   If a statement 
9df0: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e  modifies the con
9e00: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 23 20 64  tents of the.# d
9e10: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
9e20: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  an immediate for
9e30: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
9e40: 69 6e 74 20 69 73 20 69 6e 20 76 69 6f 6c 61 74  int is in violat
9e50: 69 6f 6e 0a 23 20 61 74 20 74 68 65 20 63 6f 6e  ion.# at the con
9e60: 63 6c 75 73 69 6f 6e 20 74 68 65 20 73 74 61 74  clusion the stat
9e70: 65 6d 65 6e 74 2c 20 61 6e 20 65 78 63 65 70 74  ement, an except
9e80: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 20 61 6e  ion is thrown an
9e90: 64 20 74 68 65 0a 23 20 65 66 66 65 63 74 73 20  d the.# effects 
9ea0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
9eb0: 20 61 72 65 20 72 65 76 65 72 74 65 64 2e 0a 23   are reverted..#
9ec0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
9ed0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9ee0: 33 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  31.1 {.  execsql
9ef0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
9f00: 42 4c 45 20 6b 69 6e 67 28 61 2c 20 62 2c 20 50  BLE king(a, b, P
9f10: 52 49 4d 41 52 59 20 4b 45 59 28 61 29 29 3b 0a  RIMARY KEY(a));.
9f20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9f30: 20 70 72 69 6e 63 65 28 63 20 52 45 46 45 52 45   prince(c REFERE
9f40: 4e 43 45 53 20 6b 69 6e 67 2c 20 64 29 3b 0a 20  NCES king, d);. 
9f50: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
9f60: 20 65 5f 66 6b 65 79 2d 33 31 2e 32 20 7b 0a 20   e_fkey-31.2 {. 
9f70: 20 23 20 45 78 65 63 75 74 65 20 61 20 73 74 61   # Execute a sta
9f80: 74 65 6d 65 6e 74 20 74 68 61 74 20 76 69 6f 6c  tement that viol
9f90: 61 74 65 73 20 74 68 65 20 69 6d 6d 65 64 69 61  ates the immedia
9fa0: 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  te FK constraint
9fb0: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  ..  catchsql { I
9fc0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 72 69 6e 63  NSERT INTO princ
9fd0: 65 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d  e VALUES(1, 2) }
9fe0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
9ff0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
a000: 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  iled}}..do_test 
a010: 65 5f 66 6b 65 79 2d 33 31 2e 33 20 7b 0a 20 20  e_fkey-31.3 {.  
a020: 23 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65  # This time, use
a030: 20 61 20 74 72 69 67 67 65 72 20 74 6f 20 66 69   a trigger to fi
a040: 78 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  x the constraint
a050: 20 76 69 6f 6c 61 74 69 6f 6e 20 62 65 66 6f 72   violation befor
a060: 65 20 74 68 65 0a 20 20 23 20 73 74 61 74 65 6d  e the.  # statem
a070: 65 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65 64  ent has finished
a080: 20 65 78 65 63 75 74 69 6e 67 2e 20 54 68 65 6e   executing. Then
a090: 20 65 78 65 63 75 74 65 20 74 68 65 20 73 61 6d   execute the sam
a0a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73 0a 20  e statement as. 
a0b0: 20 23 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f   # in the previo
a0c0: 75 73 20 74 65 73 74 20 63 61 73 65 2e 20 54 68  us test case. Th
a0d0: 69 73 20 74 69 6d 65 2c 20 6e 6f 20 65 72 72 6f  is time, no erro
a0e0: 72 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  r..  execsql {. 
a0f0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
a100: 52 20 6b 74 20 41 46 54 45 52 20 49 4e 53 45 52  R kt AFTER INSER
a110: 54 20 4f 4e 20 70 72 69 6e 63 65 20 57 48 45 4e  T ON prince WHEN
a120: 0a 20 20 20 20 20 20 4e 4f 54 20 45 58 49 53 54  .      NOT EXIST
a130: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
a140: 20 6b 69 6e 67 20 57 48 45 52 45 20 61 20 3d 20   king WHERE a = 
a150: 6e 65 77 2e 63 29 0a 20 20 20 20 42 45 47 49 4e  new.c).    BEGIN
a160: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a170: 54 4f 20 6b 69 6e 67 20 56 41 4c 55 45 53 28 6e  TO king VALUES(n
a180: 65 77 2e 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ew.c, NULL);.   
a190: 20 45 4e 44 0a 20 20 7d 0a 20 20 65 78 65 63 73   END.  }.  execs
a1a0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
a1b0: 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28 31   prince VALUES(1
a1c0: 2c 20 32 29 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54  , 2) }.} {}..# T
a1d0: 65 73 74 20 74 68 61 74 20 6f 70 65 72 61 74 69  est that operati
a1e0: 6e 67 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e  ng inside a tran
a1f0: 73 61 63 74 69 6f 6e 20 6d 61 6b 65 73 20 6e 6f  saction makes no
a200: 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 0a   difference to .
a210: 23 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73  # immediate cons
a220: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
a230: 20 68 61 6e 64 6c 69 6e 67 2e 0a 64 6f 5f 74 65   handling..do_te
a240: 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 34 20 7b  st e_fkey-31.4 {
a250: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a260: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
a270: 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56  RT INTO prince V
a280: 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20 20  ALUES(2, 3);.   
a290: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 6b 74   DROP TRIGGER kt
a2a0: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
a2b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70   { INSERT INTO p
a2c0: 72 69 6e 63 65 20 56 41 4c 55 45 53 28 33 2c 20  rince VALUES(3, 
a2d0: 34 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  4) }.} {1 {forei
a2e0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
a2f0: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
a300: 73 74 20 65 5f 66 6b 65 79 2d 33 31 2e 35 20 7b  st e_fkey-31.5 {
a310: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a320: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c   COMMIT;.    SEL
a330: 45 43 54 20 2a 20 46 52 4f 4d 20 6b 69 6e 67 3b  ECT * FROM king;
a340: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 7d 20 32 20 7b  .  }.} {1 {} 2 {
a350: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
a3a0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20   Test that if a 
a3b0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a3c0: 69 6e 74 20 69 73 20 76 69 6f 6c 61 74 65 64 20  int is violated 
a3d0: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
a3e0: 74 69 6f 6e 2c 0a 23 20 6e 6f 74 68 69 6e 67 20  tion,.# nothing 
a3f0: 68 61 70 70 65 6e 73 20 69 6d 6d 65 64 69 61 74  happens immediat
a400: 65 6c 79 20 61 6e 64 20 74 68 65 20 64 61 74 61  ely and the data
a410: 62 61 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  base is allowed 
a420: 74 6f 20 70 65 72 73 69 73 74 0a 23 20 69 6e 20  to persist.# in 
a430: 61 20 73 74 61 74 65 20 74 68 61 74 20 64 6f 65  a state that doe
a440: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  s not satisfy th
a450: 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e  e FK constraint.
a460: 20 48 6f 77 65 76 65 72 20 61 74 74 65 6d 70 74   However attempt
a470: 73 0a 23 20 74 6f 20 43 4f 4d 4d 49 54 20 74 68  s.# to COMMIT th
a480: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 61  e transaction fa
a490: 69 6c 20 75 6e 74 69 6c 20 74 68 65 20 46 4b 20  il until the FK 
a4a0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61  constraint is sa
a4b0: 74 69 73 66 69 65 64 2e 0a 23 0a 23 20 45 56 49  tisfied..#.# EVI
a4c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 31 37  DENCE-OF: R-4917
a4d0: 38 2d 32 31 33 35 38 20 42 79 20 63 6f 6e 74 72  8-21358 By contr
a4e0: 61 73 74 2c 20 69 66 20 61 20 73 74 61 74 65 6d  ast, if a statem
a4f0: 65 6e 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ent modifies the
a500: 0a 23 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  .# contents of t
a510: 68 65 20 64 61 74 61 62 61 73 65 20 73 75 63 68  he database such
a520: 20 74 68 61 74 20 61 20 64 65 66 65 72 72 65 64   that a deferred
a530: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
a540: 73 74 72 61 69 6e 74 0a 23 20 69 73 20 76 69 6f  straint.# is vio
a550: 6c 61 74 65 64 2c 20 74 68 65 20 76 69 6f 6c 61  lated, the viola
a560: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 65 70 6f  tion is not repo
a570: 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rted immediately
a580: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
a590: 46 3a 20 52 2d 33 39 36 39 32 2d 31 32 34 38 38  F: R-39692-12488
a5a0: 20 44 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   Deferred foreig
a5b0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a5c0: 73 20 61 72 65 20 6e 6f 74 0a 23 20 63 68 65 63  s are not.# chec
a5d0: 6b 65 64 20 75 6e 74 69 6c 20 74 68 65 20 74 72  ked until the tr
a5e0: 61 6e 73 61 63 74 69 6f 6e 20 74 72 69 65 73 20  ansaction tries 
a5f0: 74 6f 20 43 4f 4d 4d 49 54 2e 0a 23 0a 23 20 45  to COMMIT..#.# E
a600: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
a610: 31 34 37 2d 34 37 36 36 34 20 46 6f 72 20 61 73  147-47664 For as
a620: 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 75 73 65   long as the use
a630: 72 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 23 20  r has an open.# 
a640: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
a650: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 6c   database is all
a660: 6f 77 65 64 20 74 6f 20 65 78 69 73 74 20 69 6e  owed to exist in
a670: 20 61 20 73 74 61 74 65 20 74 68 61 74 20 76 69   a state that vi
a680: 6f 6c 61 74 65 73 0a 23 20 61 6e 79 20 6e 75 6d  olates.# any num
a690: 62 65 72 20 6f 66 20 64 65 66 65 72 72 65 64 20  ber of deferred 
a6a0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a6b0: 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49  traints..#.# EVI
a6c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 36 30  DENCE-OF: R-2960
a6d0: 34 2d 33 30 33 39 35 20 48 6f 77 65 76 65 72 2c  4-30395 However,
a6e0: 20 43 4f 4d 4d 49 54 20 77 69 6c 6c 20 66 61 69   COMMIT will fai
a6f0: 6c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 23 20 66  l as long as.# f
a700: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a710: 72 61 69 6e 74 73 20 72 65 6d 61 69 6e 20 69 6e  raints remain in
a720: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 70 72   violation..#.pr
a730: 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 34  oc test_efkey_34
a740: 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c   {tn isError sql
a750: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
a760: 66 6b 65 79 2d 33 32 2e 24 74 6e 20 22 0a 20 20  fkey-32.$tn ".  
a770: 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c    catchsql {$sql
a780: 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b  }.  " [lindex {{
a790: 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67  0 {}} {1 {foreig
a7a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
a7b0: 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72   failed}}} $isEr
a7c0: 72 6f 72 5d 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f  ror].}.drop_all_
a7d0: 74 61 62 6c 65 73 0a 0a 74 65 73 74 5f 65 66 6b  tables..test_efk
a7e0: 65 79 5f 33 34 20 20 31 20 30 20 7b 0a 20 20 43  ey_34  1 0 {.  C
a7f0: 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6c 28 6b  REATE TABLE ll(k
a800: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
a810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6b   CREATE TABLE kk
a820: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 6c 6c  (c REFERENCES ll
a830: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
a840: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29 3b  IALLY DEFERRED);
a850: 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34  .}.test_efkey_34
a860: 20 20 32 20 30 20 22 42 45 47 49 4e 22 0a 74 65    2 0 "BEGIN".te
a870: 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 33 20 30  st_efkey_34  3 0
a880: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
a890: 6b 6b 20 56 41 4c 55 45 53 28 35 29 22 0a 74 65  kk VALUES(5)".te
a8a0: 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 34 20 30  st_efkey_34  4 0
a8b0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
a8c0: 6b 6b 20 56 41 4c 55 45 53 28 31 30 29 22 0a 74  kk VALUES(10)".t
a8d0: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 35 20  est_efkey_34  5 
a8e0: 31 20 22 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f  1 "COMMIT".test_
a8f0: 65 66 6b 65 79 5f 33 34 20 20 36 20 30 20 20 20  efkey_34  6 0   
a900: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20  "INSERT INTO ll 
a910: 56 41 4c 55 45 53 28 31 30 29 22 0a 74 65 73 74  VALUES(10)".test
a920: 5f 65 66 6b 65 79 5f 33 34 20 20 37 20 31 20 22  _efkey_34  7 1 "
a930: 43 4f 4d 4d 49 54 22 0a 74 65 73 74 5f 65 66 6b  COMMIT".test_efk
a940: 65 79 5f 33 34 20 20 38 20 30 20 20 20 22 49 4e  ey_34  8 0   "IN
a950: 53 45 52 54 20 49 4e 54 4f 20 6c 6c 20 56 41 4c  SERT INTO ll VAL
a960: 55 45 53 28 35 29 22 0a 74 65 73 74 5f 65 66 6b  UES(5)".test_efk
a970: 65 79 5f 33 34 20 20 39 20 30 20 22 43 4f 4d 4d  ey_34  9 0 "COMM
a980: 49 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  IT"..#----------
a990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a9d0: 23 20 57 68 65 6e 20 6e 6f 74 20 72 75 6e 6e 69  # When not runni
a9e0: 6e 67 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e  ng inside a tran
a9f0: 73 61 63 74 69 6f 6e 2c 20 61 20 64 65 66 65 72  saction, a defer
aa00: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  red constraint i
aa10: 73 20 73 69 6d 69 6c 61 72 0a 23 20 74 6f 20 61  s similar.# to a
aa20: 6e 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73  n immediate cons
aa30: 74 72 61 69 6e 74 20 28 76 69 6f 6c 61 74 69 6f  traint (violatio
aa40: 6e 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  ns are reported 
aa50: 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 23 0a  immediately)..#.
aa60: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
aa70: 2d 35 36 38 34 34 2d 36 31 37 30 35 20 49 66 20  -56844-61705 If 
aa80: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
aa90: 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 69 6e 73  ement is not ins
aaa0: 69 64 65 20 61 6e 0a 23 20 65 78 70 6c 69 63 69  ide an.# explici
aab0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 61  t transaction (a
aac0: 20 42 45 47 49 4e 2f 43 4f 4d 4d 49 54 2f 52 4f   BEGIN/COMMIT/RO
aad0: 4c 4c 42 41 43 4b 20 62 6c 6f 63 6b 29 2c 20 74  LLBACK block), t
aae0: 68 65 6e 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a  hen an implicit.
aaf0: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  # transaction is
ab00: 20 63 6f 6d 6d 69 74 74 65 64 20 61 73 20 73 6f   committed as so
ab10: 6f 6e 20 61 73 20 74 68 65 20 73 74 61 74 65 6d  on as the statem
ab20: 65 6e 74 20 68 61 73 20 66 69 6e 69 73 68 65 64  ent has finished
ab30: 0a 23 20 65 78 65 63 75 74 69 6e 67 2e 20 49 6e  .# executing. In
ab40: 20 74 68 69 73 20 63 61 73 65 20 64 65 66 65 72   this case defer
ab50: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  red constraints 
ab60: 62 65 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  behave the same 
ab70: 61 73 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63  as.# immediate c
ab80: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64 72  onstraints..#.dr
ab90: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 70 72  op_all_tables.pr
aba0: 6f 63 20 74 65 73 74 5f 65 66 6b 65 79 5f 33 35  oc test_efkey_35
abb0: 20 7b 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c   {tn isError sql
abc0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
abd0: 66 6b 65 79 2d 33 33 2e 24 74 6e 20 22 0a 20 20  fkey-33.$tn ".  
abe0: 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c    catchsql {$sql
abf0: 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b  }.  " [lindex {{
ac00: 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67  0 {}} {1 {foreig
ac10: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
ac20: 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72   failed}}} $isEr
ac30: 72 6f 72 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 65  ror].}.do_test e
ac40: 5f 66 6b 65 79 2d 33 33 2e 31 20 7b 0a 20 20 65  _fkey-33.1 {.  e
ac50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ac60: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
ac70: 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41  (x, y);.    CREA
ac80: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
ac90: 70 69 20 4f 4e 20 70 61 72 65 6e 74 28 78 2c 20  pi ON parent(x, 
aca0: 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  y);.    CREATE T
acb0: 41 42 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c  ABLE child(a, b,
acc0: 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b  .      FOREIGN K
acd0: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
ace0: 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29  CES parent(x, y)
acf0: 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54   DEFERRABLE INIT
ad00: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20  IALLY DEFERRED. 
ad10: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 74     );.  }.} {}.t
ad20: 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 32 20 31  est_efkey_35 2 1
ad30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68   "INSERT INTO ch
ad40: 69 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c  ild  VALUES('x',
ad50: 20 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b 65   'y')".test_efke
ad60: 79 5f 33 35 20 33 20 30 20 22 49 4e 53 45 52 54  y_35 3 0 "INSERT
ad70: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
ad80: 55 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 74  UES('x', 'y')".t
ad90: 65 73 74 5f 65 66 6b 65 79 5f 33 35 20 34 20 30  est_efkey_35 4 0
ada0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68   "INSERT INTO ch
adb0: 69 6c 64 20 20 56 41 4c 55 45 53 28 27 78 27 2c  ild  VALUES('x',
adc0: 20 27 79 27 29 22 0a 0a 0a 23 2d 2d 2d 2d 2d 2d   'y')"...#------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ---.# EVIDENCE-O
ae20: 46 3a 20 52 2d 31 32 37 38 32 2d 36 31 38 34 31  F: R-12782-61841
ae30: 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  .#.# Test that a
ae40: 6e 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  n FK constraint 
ae50: 69 73 20 6d 61 64 65 20 64 65 66 65 72 72 65 64  is made deferred
ae60: 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 20 66   by adding the f
ae70: 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 6f 20 74 68  ollowing.# to th
ae80: 65 20 64 65 66 69 6e 69 74 69 6f 6e 3a 0a 23 0a  e definition:.#.
ae90: 23 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49  #   DEFERRABLE I
aea0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
aeb0: 44 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  D.#.# EVIDENCE-O
aec0: 46 3a 20 52 2d 30 39 30 30 35 2d 32 38 37 39 31  F: R-09005-28791
aed0: 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74  .#.# Also test t
aee0: 68 61 74 20 61 64 64 69 6e 67 20 61 6e 79 20 6f  hat adding any o
aef0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
af00: 74 6f 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  to a foreign key
af10: 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a 23 20 6d   definition .# m
af20: 61 6b 65 73 20 74 68 65 20 63 6f 6e 73 74 72 61  akes the constra
af30: 69 6e 74 20 49 4d 4d 45 44 49 41 54 45 3a 0a 23  int IMMEDIATE:.#
af40: 0a 23 20 20 20 4e 4f 54 20 44 45 46 45 52 52 41  .#   NOT DEFERRA
af50: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
af60: 46 45 52 52 45 44 0a 23 20 20 20 4e 4f 54 20 44  FERRED.#   NOT D
af70: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
af80: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 23 20  LLY IMMEDIATE.# 
af90: 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45    NOT DEFERRABLE
afa0: 0a 23 20 20 20 44 45 46 45 52 52 41 42 4c 45 20  .#   DEFERRABLE 
afb0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
afc0: 41 54 45 0a 23 20 20 20 44 45 46 45 52 52 41 42  ATE.#   DEFERRAB
afd0: 4c 45 0a 23 0a 23 20 46 6f 72 65 69 67 6e 20 6b  LE.#.# Foreign k
afe0: 65 79 73 20 61 72 65 20 49 4d 4d 45 44 49 41 54  eys are IMMEDIAT
aff0: 45 20 62 79 20 64 65 66 61 75 6c 74 20 28 69 66  E by default (if
b000: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 44 45 46   there is no DEF
b010: 45 52 52 41 42 4c 45 20 6f 72 20 4e 4f 54 0a 23  ERRABLE or NOT.#
b020: 20 44 45 46 45 52 52 41 42 4c 45 20 63 6c 61 75   DEFERRABLE clau
b030: 73 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  se)..#.# EVIDENC
b040: 45 2d 4f 46 3a 20 52 2d 33 35 32 39 30 2d 31 36  E-OF: R-35290-16
b050: 34 36 30 20 46 6f 72 65 69 67 6e 20 6b 65 79 20  460 Foreign key 
b060: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
b070: 69 6d 6d 65 64 69 61 74 65 20 62 79 0a 23 20 64  immediate by.# d
b080: 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44  efault..#.# EVID
b090: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 32 33  ENCE-OF: R-30323
b0a0: 2d 32 31 39 31 37 20 45 61 63 68 20 66 6f 72 65  -21917 Each fore
b0b0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
b0c0: 6e 74 20 69 6e 20 53 51 4c 69 74 65 20 69 73 0a  nt in SQLite is.
b0d0: 23 20 63 6c 61 73 73 69 66 69 65 64 20 61 73 20  # classified as 
b0e0: 65 69 74 68 65 72 20 69 6d 6d 65 64 69 61 74 65  either immediate
b0f0: 20 6f 72 20 64 65 66 65 72 72 65 64 2e 0a 23 0a   or deferred..#.
b100: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
b110: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
b120: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
b130: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
b140: 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20  LE parent(x, y, 
b150: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78  z, PRIMARY KEY(x
b160: 2c 79 2c 7a 29 29 3b 0a 20 20 20 20 43 52 45 41  ,y,z));.    CREA
b170: 54 45 20 54 41 42 4c 45 20 63 31 28 61 2c 20 62  TE TABLE c1(a, b
b180: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b190: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b1a0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b1b0: 74 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  t NOT DEFERRABLE
b1c0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b1d0: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  RED.    );.    C
b1e0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 32 28 61  REATE TABLE c2(a
b1f0: 2c 20 62 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f  , b, c,.      FO
b200: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20  REIGN KEY(a, b, 
b210: 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  c) REFERENCES pa
b220: 72 65 6e 74 20 4e 4f 54 20 44 45 46 45 52 52 41  rent NOT DEFERRA
b230: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  BLE INITIALLY IM
b240: 4d 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20  MEDIATE.    );. 
b250: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b260: 63 33 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20  c3(a, b, c,.    
b270: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
b280: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b290: 53 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45 46  S parent NOT DEF
b2a0: 45 52 52 41 42 4c 45 0a 20 20 20 20 29 3b 0a 20  ERRABLE.    );. 
b2b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b2c0: 63 34 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20  c4(a, b, c,.    
b2d0: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
b2e0: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b2f0: 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52 41  S parent DEFERRA
b300: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  BLE INITIALLY IM
b310: 4d 45 44 49 41 54 45 0a 20 20 20 20 29 3b 0a 20  MEDIATE.    );. 
b320: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b330: 63 35 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20  c5(a, b, c,.    
b340: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
b350: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b360: 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52 41  S parent DEFERRA
b370: 42 4c 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43  BLE.    );.    C
b380: 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 61  REATE TABLE c6(a
b390: 2c 20 62 2c 20 63 2c 20 46 4f 52 45 49 47 4e 20  , b, c, FOREIGN 
b3a0: 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45 46  KEY(a, b, c) REF
b3b0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 29 3b  ERENCES parent);
b3c0: 0a 0a 20 20 20 20 2d 2d 20 54 68 69 73 20 46 4b  ..    -- This FK
b3d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 74   constraint is t
b3e0: 68 65 20 6f 6e 6c 79 20 64 65 66 65 72 72 61 62  he only deferrab
b3f0: 6c 65 20 6f 6e 65 2e 0a 20 20 20 20 43 52 45 41  le one..    CREA
b400: 54 45 20 54 41 42 4c 45 20 63 37 28 61 2c 20 62  TE TABLE c7(a, b
b410: 2c 20 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , c,.      FOREI
b420: 47 4e 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20  GN KEY(a, b, c) 
b430: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
b440: 74 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  t DEFERRABLE INI
b450: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
b460: 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45      );..    INSE
b470: 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56  RT INTO parent V
b480: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20  ALUES('a', 'b', 
b490: 27 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'c');.    INSERT
b4a0: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
b4b0: 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20 27 66  UES('d', 'e', 'f
b4c0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
b4d0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
b4e0: 53 28 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29  S('g', 'h', 'i')
b4f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b500: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
b510: 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27 29 3b 0a  'j', 'k', 'l');.
b520: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b530: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6d  parent VALUES('m
b540: 27 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20  ', 'n', 'o');.  
b550: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
b560: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 70 27 2c  rent VALUES('p',
b570: 20 27 71 27 2c 20 27 72 27 29 3b 0a 20 20 20 20   'q', 'r');.    
b580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
b590: 6e 74 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27  nt VALUES('s', '
b5a0: 74 27 2c 20 27 75 27 29 3b 0a 0a 20 20 20 20 49  t', 'u');..    I
b5b0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
b5c0: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27  LUES('a', 'b', '
b5d0: 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  c');.    INSERT 
b5e0: 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28 27  INTO c2 VALUES('
b5f0: 64 27 2c 20 27 65 27 2c 20 27 66 27 29 3b 0a 20  d', 'e', 'f');. 
b600: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
b610: 33 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68  3 VALUES('g', 'h
b620: 27 2c 20 27 69 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'i');.    INS
b630: 45 52 54 20 49 4e 54 4f 20 63 34 20 56 41 4c 55  ERT INTO c4 VALU
b640: 45 53 28 27 6a 27 2c 20 27 6b 27 2c 20 27 6c 27  ES('j', 'k', 'l'
b650: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b660: 54 4f 20 63 35 20 56 41 4c 55 45 53 28 27 6d 27  TO c5 VALUES('m'
b670: 2c 20 27 6e 27 2c 20 27 6f 27 29 3b 0a 20 20 20  , 'n', 'o');.   
b680: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 36 20   INSERT INTO c6 
b690: 56 41 4c 55 45 53 28 27 70 27 2c 20 27 71 27 2c  VALUES('p', 'q',
b6a0: 20 27 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'r');.    INSER
b6b0: 54 20 49 4e 54 4f 20 63 37 20 56 41 4c 55 45 53  T INTO c7 VALUES
b6c0: 28 27 73 27 2c 20 27 74 27 2c 20 27 75 27 29 3b  ('s', 't', 'u');
b6d0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20  .  }.} {}..proc 
b6e0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 7b 74  test_efkey_29 {t
b6f0: 6e 20 73 71 6c 20 69 73 45 72 72 6f 72 7d 20 7b  n sql isError} {
b700: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
b710: 79 2d 33 34 2e 24 74 6e 20 22 63 61 74 63 68 73  y-34.$tn "catchs
b720: 71 6c 20 7b 24 73 71 6c 7d 22 20 5b 0a 20 20 20  ql {$sql}" [.   
b730: 20 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20   lindex {{0 {}} 
b740: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
b750: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
b760: 64 7d 7d 7d 20 24 69 73 45 72 72 6f 72 0a 20 20  d}}} $isError.  
b770: 5d 0a 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32  ].}.test_efkey_2
b780: 39 20 20 32 20 22 42 45 47 49 4e 22 20 20 20 20  9  2 "BEGIN"    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b7b0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20  .test_efkey_29  
b7c0: 33 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  3 "DELETE FROM p
b7d0: 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20  arent WHERE x = 
b7e0: 27 61 27 22 20 20 20 20 20 20 20 20 31 0a 74 65  'a'"        1.te
b7f0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 34 20 22  st_efkey_29  4 "
b800: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
b810: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 64 27  nt WHERE x = 'd'
b820: 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f  "        1.test_
b830: 65 66 6b 65 79 5f 32 39 20 20 35 20 22 44 45 4c  efkey_29  5 "DEL
b840: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
b850: 57 48 45 52 45 20 78 20 3d 20 27 67 27 22 20 20  WHERE x = 'g'"  
b860: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
b870: 65 79 5f 32 39 20 20 36 20 22 44 45 4c 45 54 45  ey_29  6 "DELETE
b880: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
b890: 52 45 20 78 20 3d 20 27 6a 27 22 20 20 20 20 20  RE x = 'j'"     
b8a0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
b8b0: 32 39 20 20 37 20 22 44 45 4c 45 54 45 20 46 52  29  7 "DELETE FR
b8c0: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
b8d0: 78 20 3d 20 27 6d 27 22 20 20 20 20 20 20 20 20  x = 'm'"        
b8e0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
b8f0: 20 38 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   8 "DELETE FROM 
b900: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
b910: 20 27 70 27 22 20 20 20 20 20 20 20 20 31 0a 74   'p'"        1.t
b920: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39 20  est_efkey_29  9 
b930: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
b940: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 73  ent WHERE x = 's
b950: 27 22 20 20 20 20 20 20 20 20 30 0a 74 65 73 74  '"        0.test
b960: 5f 65 66 6b 65 79 5f 32 39 20 31 30 20 22 43 4f  _efkey_29 10 "CO
b970: 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20  MMIT"           
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
b9a0: 6b 65 79 5f 32 39 20 31 31 20 22 52 4f 4c 4c 42  key_29 11 "ROLLB
b9b0: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 30 0a 0a 74 65 73 74 5f 65 66 6b 65      0..test_efke
b9e0: 79 5f 32 39 20 20 39 20 22 42 45 47 49 4e 22 20  y_29  9 "BEGIN" 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    0.test_efkey_2
ba20: 39 20 31 30 20 22 55 50 44 41 54 45 20 70 61 72  9 10 "UPDATE par
ba30: 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20  ent SET z = 'z' 
ba40: 57 48 45 52 45 20 7a 20 3d 20 27 63 27 22 20 31  WHERE z = 'c'" 1
ba50: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
ba60: 31 20 22 55 50 44 41 54 45 20 70 61 72 65 6e 74  1 "UPDATE parent
ba70: 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45   SET z = 'z' WHE
ba80: 52 45 20 7a 20 3d 20 27 66 27 22 20 31 0a 74 65  RE z = 'f'" 1.te
ba90: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 32 20 22  st_efkey_29 12 "
baa0: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
bab0: 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20  T z = 'z' WHERE 
bac0: 7a 20 3d 20 27 69 27 22 20 31 0a 74 65 73 74 5f  z = 'i'" 1.test_
bad0: 65 66 6b 65 79 5f 32 39 20 31 33 20 22 55 50 44  efkey_29 13 "UPD
bae0: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
baf0: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bb00: 20 27 6c 27 22 20 31 0a 74 65 73 74 5f 65 66 6b   'l'" 1.test_efk
bb10: 65 79 5f 32 39 20 31 34 20 22 55 50 44 41 54 45  ey_29 14 "UPDATE
bb20: 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20   parent SET z = 
bb30: 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 6f  'z' WHERE z = 'o
bb40: 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '" 1.test_efkey_
bb50: 32 39 20 31 35 20 22 55 50 44 41 54 45 20 70 61  29 15 "UPDATE pa
bb60: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
bb70: 20 57 48 45 52 45 20 7a 20 3d 20 27 72 27 22 20   WHERE z = 'r'" 
bb80: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bb90: 31 36 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  16 "UPDATE paren
bba0: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
bbb0: 45 52 45 20 7a 20 3d 20 27 75 27 22 20 30 0a 74  ERE z = 'u'" 0.t
bbc0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 37 20  est_efkey_29 17 
bbd0: 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20 20 20  "COMMIT"        
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
bc00: 5f 65 66 6b 65 79 5f 32 39 20 31 38 20 22 52 4f  _efkey_29 18 "RO
bc10: 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20  LLBACK"         
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65         0..test_e
bc40: 66 6b 65 79 5f 32 39 20 31 37 20 22 42 45 47 49  fkey_29 17 "BEGI
bc50: 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N"              
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65       0.test_efke
bc80: 79 5f 32 39 20 31 38 20 22 49 4e 53 45 52 54 20  y_29 18 "INSERT 
bc90: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31  INTO c1 VALUES(1
bca0: 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20 20  , 2, 3)"        
bcb0: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
bcc0: 39 20 31 39 20 22 49 4e 53 45 52 54 20 49 4e 54  9 19 "INSERT INT
bcd0: 4f 20 63 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O c2 VALUES(1, 2
bce0: 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20 31  , 3)"          1
bcf0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
bd00: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  0 "INSERT INTO c
bd10: 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  3 VALUES(1, 2, 3
bd20: 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74 65  )"          1.te
bd30: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 31 20 22  st_efkey_29 21 "
bd40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 34 20 56  INSERT INTO c4 V
bd50: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
bd60: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
bd70: 65 66 6b 65 79 5f 32 39 20 32 32 20 22 49 4e 53  efkey_29 22 "INS
bd80: 45 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55  ERT INTO c5 VALU
bd90: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
bda0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bdb0: 65 79 5f 32 39 20 32 32 20 22 49 4e 53 45 52 54  ey_29 22 "INSERT
bdc0: 20 49 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28   INTO c6 VALUES(
bdd0: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
bde0: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
bdf0: 32 39 20 32 32 20 22 49 4e 53 45 52 54 20 49 4e  29 22 "INSERT IN
be00: 54 4f 20 63 37 20 56 41 4c 55 45 53 28 31 2c 20  TO c7 VALUES(1, 
be10: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
be20: 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  0.test_efkey_29 
be30: 32 33 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20  23 "COMMIT"     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
be60: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 34 20  est_efkey_29 24 
be70: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72  "INSERT INTO par
be80: 65 6e 74 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  ent VALUES(1, 2,
be90: 20 33 29 22 20 20 20 20 20 20 30 0a 74 65 73 74   3)"      0.test
bea0: 5f 65 66 6b 65 79 5f 32 39 20 32 35 20 22 43 4f  _efkey_29 25 "CO
beb0: 4d 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20  MMIT"           
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 20 30 0a 0a 74 65 73 74 5f 65         0..test_e
bee0: 66 6b 65 79 5f 32 39 20 32 36 20 22 42 45 47 49  fkey_29 26 "BEGI
bef0: 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N"              
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b 65       0.test_efke
bf20: 79 5f 32 39 20 32 37 20 22 55 50 44 41 54 45 20  y_29 27 "UPDATE 
bf30: 63 31 20 53 45 54 20 61 20 3d 20 31 30 22 20 20  c1 SET a = 10"  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32    1.test_efkey_2
bf60: 39 20 32 38 20 22 55 50 44 41 54 45 20 63 32 20  9 28 "UPDATE c2 
bf70: 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20 20  SET a = 10"     
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
bf90: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
bfa0: 39 20 22 55 50 44 41 54 45 20 63 33 20 53 45 54  9 "UPDATE c3 SET
bfb0: 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20 20   a = 10"        
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74 65              1.te
bfd0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 30 20 22  st_efkey_29 30 "
bfe0: 55 50 44 41 54 45 20 63 34 20 53 45 54 20 61 20  UPDATE c4 SET a 
bff0: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c000: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c010: 65 66 6b 65 79 5f 32 39 20 33 31 20 22 55 50 44  efkey_29 31 "UPD
c020: 41 54 45 20 63 35 20 53 45 54 20 61 20 3d 20 31  ATE c5 SET a = 1
c030: 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
c040: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c050: 65 79 5f 32 39 20 33 31 20 22 55 50 44 41 54 45  ey_29 31 "UPDATE
c060: 20 63 36 20 53 45 54 20 61 20 3d 20 31 30 22 20   c6 SET a = 10" 
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c090: 32 39 20 33 31 20 22 55 50 44 41 54 45 20 63 37  29 31 "UPDATE c7
c0a0: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  0.test_efkey_29 
c0d0: 33 32 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20  32 "COMMIT"     
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
c100: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 33 20  est_efkey_29 33 
c110: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 20 30 0a 0a 23 2d 2d            0..#--
c140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c180: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
c190: 43 45 2d 4f 46 3a 20 52 2d 32 34 34 39 39 2d 35  CE-OF: R-24499-5
c1a0: 37 30 37 31 0a 23 0a 23 20 54 65 73 74 20 61 6e  7071.#.# Test an
c1b0: 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 66 6f   example from fo
c1c0: 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 20 64  reignkeys.html d
c1d0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 65  ealing with a de
c1e0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 0a  ferred foreign .
c1f0: 23 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  # key constraint
c200: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  ..#.do_test e_fk
c210: 65 79 2d 33 35 2e 31 20 7b 0a 20 20 64 72 6f 70  ey-35.1 {.  drop
c220: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78  _all_tables.  ex
c230: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
c240: 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
c250: 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
c260: 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
c270: 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
c280: 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
c290: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
c2a0: 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
c2b0: 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
c2c0: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
c2d0: 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54  trackname   TEXT
c2e0: 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72  , .      trackar
c2f0: 74 69 73 74 20 49 4e 54 45 47 45 52 20 52 45 46  tist INTEGER REF
c300: 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61  ERENCES artist(a
c310: 72 74 69 73 74 69 64 29 20 44 45 46 45 52 52 41  rtistid) DEFERRA
c320: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
c330: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20  FERRED.    );.  
c340: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
c350: 5f 66 6b 65 79 2d 33 35 2e 32 20 7b 0a 20 20 65  _fkey-35.2 {.  e
c360: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
c370: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
c380: 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55   INTO track VALU
c390: 45 53 28 31 2c 20 27 57 68 69 74 65 20 43 68 72  ES(1, 'White Chr
c3a0: 69 73 74 6d 61 73 27 2c 20 35 29 3b 0a 20 20 7d  istmas', 5);.  }
c3b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
c3c0: 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  IT.} {1 {foreign
c3d0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
c3e0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
c3f0: 20 65 5f 66 6b 65 79 2d 33 35 2e 33 20 7b 0a 20   e_fkey-35.3 {. 
c400: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
c410: 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73  NSERT INTO artis
c420: 74 20 56 41 4c 55 45 53 28 35 2c 20 27 42 69 6e  t VALUES(5, 'Bin
c430: 67 20 43 72 6f 73 62 79 27 29 3b 0a 20 20 20 20  g Crosby');.    
c440: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
c450: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56  ------------.# V
c4a0: 65 72 69 66 79 20 74 68 61 74 20 61 20 6e 65 73  erify that a nes
c4b0: 74 65 64 20 73 61 76 65 70 6f 69 6e 74 20 6d 61  ted savepoint ma
c4c0: 79 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  y be released wi
c4d0: 74 68 6f 75 74 20 73 61 74 69 73 66 79 69 6e 67  thout satisfying
c4e0: 20 0a 23 20 64 65 66 65 72 72 65 64 20 66 6f 72   .# deferred for
c4f0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
c500: 69 6e 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ints..#.# EVIDEN
c510: 43 45 2d 4f 46 3a 20 52 2d 30 37 32 32 33 2d 34  CE-OF: R-07223-4
c520: 38 33 32 33 20 41 20 6e 65 73 74 65 64 20 73 61  8323 A nested sa
c530: 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
c540: 69 6f 6e 20 6d 61 79 20 62 65 0a 23 20 52 45 4c  ion may be.# REL
c550: 45 41 53 45 64 20 77 68 69 6c 65 20 74 68 65 20  EASEd while the 
c560: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
c570: 20 73 74 61 74 65 20 74 68 61 74 20 64 6f 65 73   state that does
c580: 20 6e 6f 74 20 73 61 74 69 73 66 79 20 61 0a 23   not satisfy a.#
c590: 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
c5a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
c5b0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
c5c0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
c5d0: 65 79 2d 33 36 2e 31 20 7b 0a 20 20 65 78 65 63  ey-36.1 {.  exec
c5e0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
c5f0: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
c600: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 62  ARY KEY,.      b
c610: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44   REFERENCES t1 D
c620: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
c630: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
c640: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
c650: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
c660: 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   1);.    INSERT 
c670: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
c680: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
c690: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
c6a0: 33 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  3, 3);.  }.} {}.
c6b0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
c6c0: 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
c6d0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
c6e0: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
c6f0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
c700: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
c710: 34 2c 20 35 29 3b 0a 20 20 20 20 20 20 52 45 4c  4, 5);.      REL
c720: 45 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20  EASE one;.  }.} 
c730: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
c740: 79 2d 33 36 2e 33 20 7b 0a 20 20 63 61 74 63 68  y-36.3 {.  catch
c750: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20  sql COMMIT.} {1 
c760: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
c770: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
c780: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
c790: 33 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  36.4 {.  execsql
c7a0: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31   {.    UPDATE t1
c7b0: 20 53 45 54 20 61 20 3d 20 35 20 57 48 45 52 45   SET a = 5 WHERE
c7c0: 20 61 20 3d 20 34 3b 0a 20 20 20 20 43 4f 4d 4d   a = 4;.    COMM
c7d0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23  IT;.  }.} {}...#
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63  ---------.# Chec
c830: 6b 20 74 68 61 74 20 61 20 74 72 61 6e 73 61 63  k that a transac
c840: 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 28  tion savepoint (
c850: 61 6e 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  an outermost sav
c860: 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20 77 68  epoint opened wh
c870: 65 6e 0a 23 20 74 68 65 20 64 61 74 61 62 61 73  en.# the databas
c880: 65 20 77 61 73 20 69 6e 20 61 75 74 6f 2d 63 6f  e was in auto-co
c890: 6d 6d 69 74 20 6d 6f 64 65 29 20 63 61 6e 6e 6f  mmit mode) canno
c8a0: 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  t be released wi
c8b0: 74 68 6f 75 74 0a 23 20 73 61 74 69 73 66 79 69  thout.# satisfyi
c8c0: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
c8d0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
c8e0: 6e 74 73 2e 20 49 74 20 6d 61 79 20 62 65 20 72  nts. It may be r
c8f0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20  olled back..#.# 
c900: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
c910: 34 32 39 35 2d 31 33 38 32 33 20 41 20 74 72 61  4295-13823 A tra
c920: 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
c930: 6e 74 20 28 61 20 6e 6f 6e 2d 6e 65 73 74 65 64  nt (a non-nested
c940: 0a 23 20 73 61 76 65 70 6f 69 6e 74 20 74 68 61  .# savepoint tha
c950: 74 20 77 61 73 20 6f 70 65 6e 65 64 20 77 68 69  t was opened whi
c960: 6c 65 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  le there was not
c970: 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70   currently an op
c980: 65 6e 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  en.# transaction
c990: 29 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  ), on the other 
c9a0: 68 61 6e 64 2c 20 69 73 20 73 75 62 6a 65 63 74  hand, is subject
c9b0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 73   to the same res
c9c0: 74 72 69 63 74 69 6f 6e 73 0a 23 20 61 73 20 61  trictions.# as a
c9d0: 20 43 4f 4d 4d 49 54 20 2d 20 61 74 74 65 6d 70   COMMIT - attemp
c9e0: 74 69 6e 67 20 74 6f 20 52 45 4c 45 41 53 45 20  ting to RELEASE 
c9f0: 69 74 20 77 68 69 6c 65 20 74 68 65 20 64 61 74  it while the dat
ca00: 61 62 61 73 65 20 69 73 20 69 6e 20 73 75 63 68  abase is in such
ca10: 20 61 0a 23 20 73 74 61 74 65 20 77 69 6c 6c 20   a.# state will 
ca20: 66 61 69 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  fail..#.do_test 
ca30: 65 5f 66 6b 65 79 2d 33 37 2e 31 20 7b 0a 20 20  e_fkey-37.1 {.  
ca40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41  execsql {.    SA
ca50: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
ca60: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 77 6f     SAVEPOINT two
ca70: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
ca80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
ca90: 36 2c 20 37 29 3b 0a 20 20 20 20 20 20 52 45 4c  6, 7);.      REL
caa0: 45 41 53 45 20 74 77 6f 3b 0a 20 20 7d 0a 7d 20  EASE two;.  }.} 
cab0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
cac0: 79 2d 33 37 2e 32 20 7b 0a 20 20 63 61 74 63 68  y-37.2 {.  catch
cad0: 73 71 6c 20 7b 52 45 4c 45 41 53 45 20 6f 6e 65  sql {RELEASE one
cae0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
caf0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
cb00: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
cb10: 65 5f 66 6b 65 79 2d 33 37 2e 33 20 7b 0a 20 20  e_fkey-37.3 {.  
cb20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
cb30: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
cb40: 3d 20 37 20 57 48 45 52 45 20 61 20 3d 20 36 3b  = 7 WHERE a = 6;
cb50: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65  .    RELEASE one
cb60: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
cb70: 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 34 20 7b  st e_fkey-37.4 {
cb80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
cb90: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
cba0: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
cbb0: 74 77 6f 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  two;.        INS
cbc0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
cbd0: 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20 20  ES(9, 10);.     
cbe0: 20 52 45 4c 45 41 53 45 20 74 77 6f 3b 0a 20 20   RELEASE two;.  
cbf0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
cc00: 5f 66 6b 65 79 2d 33 37 2e 35 20 7b 0a 20 20 63  _fkey-37.5 {.  c
cc10: 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41 53 45  atchsql {RELEASE
cc20: 20 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65   one}.} {1 {fore
cc30: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
cc40: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
cc50: 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e 36 20  est e_fkey-37.6 
cc60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 52 4f 4c  {.  execsql {ROL
cc70: 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 20 3b 20 52  LBACK TO one ; R
cc80: 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 7d  ELEASE one}.} {}
cc90: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
cce0: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 43 4f  est that if a CO
ccf0: 4d 4d 49 54 20 6f 70 65 72 61 74 69 6f 6e 20 66  MMIT operation f
cd00: 61 69 6c 73 20 64 75 65 20 74 6f 20 64 65 66 65  ails due to defe
cd10: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
cd20: 20 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c   .# constraints,
cd30: 20 61 6e 79 20 6e 65 73 74 65 64 20 73 61 76 65   any nested save
cd40: 70 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70  points remain op
cd50: 65 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  en..#.# EVIDENCE
cd60: 2d 4f 46 3a 20 52 2d 33 37 37 33 36 2d 34 32 36  -OF: R-37736-426
cd70: 31 36 20 49 66 20 61 20 43 4f 4d 4d 49 54 20 73  16 If a COMMIT s
cd80: 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 74 68 65  tatement (or the
cd90: 20 52 45 4c 45 41 53 45 20 6f 66 20 61 0a 23 20   RELEASE of a.# 
cda0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 53 41 56 45  transaction SAVE
cdb0: 50 4f 49 4e 54 29 20 66 61 69 6c 73 20 62 65 63  POINT) fails bec
cdc0: 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61 73  ause the databas
cdd0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  e is currently i
cde0: 6e 20 61 0a 23 20 73 74 61 74 65 20 74 68 61 74  n a.# state that
cdf0: 20 76 69 6f 6c 61 74 65 73 20 61 20 64 65 66 65   violates a defe
ce00: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
ce10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
ce20: 74 68 65 72 65 20 61 72 65 0a 23 20 63 75 72 72  there are.# curr
ce30: 65 6e 74 6c 79 20 6e 65 73 74 65 64 20 73 61 76  ently nested sav
ce40: 65 70 6f 69 6e 74 73 2c 20 74 68 65 20 6e 65 73  epoints, the nes
ce50: 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20 72  ted savepoints r
ce60: 65 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 64 6f  emain open..#.do
ce70: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e  _test e_fkey-38.
ce80: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
ce90: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
cea0: 74 31 20 57 48 45 52 45 20 61 3e 33 3b 0a 20 20  t1 WHERE a>3;.  
ceb0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
cec0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32  t1;.  }.} {1 1 2
ced0: 20 32 20 33 20 33 7d 0a 64 6f 5f 74 65 73 74 20   2 3 3}.do_test 
cee0: 65 5f 66 6b 65 79 2d 33 38 2e 32 20 7b 0a 20 20  e_fkey-38.2 {.  
cef0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
cf00: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
cf10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
cf20: 28 34 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 41  (4, 4);.      SA
cf30: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
cf40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
cf50: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
cf60: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
cf70: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
cf80: 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33 20 34  } {1 1 2 2 3 3 4
cf90: 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20   4 5 6}.do_test 
cfa0: 65 5f 66 6b 65 79 2d 33 38 2e 33 20 7b 0a 20 20  e_fkey-38.3 {.  
cfb0: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
cfc0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
cfd0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
cfe0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
cff0: 66 6b 65 79 2d 33 38 2e 34 20 7b 0a 20 20 65 78  fkey-38.4 {.  ex
d000: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
d010: 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20  BACK TO one;.   
d020: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c   COMMIT;.    SEL
d030: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
d040: 20 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20   }.} {1 1 2 2 3 
d050: 33 20 34 20 34 7d 0a 0a 64 6f 5f 74 65 73 74 20  3 4 4}..do_test 
d060: 65 5f 66 6b 65 79 2d 33 38 2e 35 20 7b 0a 20 20  e_fkey-38.5 {.  
d070: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 41  execsql {.    SA
d080: 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20 20  VEPOINT a;.     
d090: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d0a0: 56 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20  VALUES(5, 5);.  
d0b0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 62 3b      SAVEPOINT b;
d0c0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
d0d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
d0e0: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 53 41  , 7);.        SA
d0f0: 56 45 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20 20  VEPOINT c;.     
d100: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
d110: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
d120: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
d130: 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 36 20 7b  st e_fkey-38.6 {
d140: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c  .  catchsql {REL
d150: 45 41 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f  EASE a}.} {1 {fo
d160: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
d170: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
d180: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e  _test e_fkey-38.
d190: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 20 7b  7 {.  execsql  {
d1a0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 7d 0a 20  ROLLBACK TO c}. 
d1b0: 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45 41   catchsql {RELEA
d1c0: 53 45 20 61 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  SE a}.} {1 {fore
d1d0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
d1e0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
d1f0: 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 38 20  est e_fkey-38.8 
d200: 7b 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 0a 20  {.  execsql  {. 
d210: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 62     ROLLBACK TO b
d220: 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 61 3b  ;.    RELEASE a;
d230: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
d240: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
d250: 31 20 32 20 32 20 33 20 33 20 34 20 34 20 35 20  1 2 2 3 3 4 4 5 
d260: 35 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23  5}..############
d270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
d2b0: 23 23 23 20 53 45 43 54 49 4f 4e 20 34 2e 33 3a  ### SECTION 4.3:
d2c0: 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f   ON DELETE and O
d2d0: 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73  N UPDATE Actions
d2e0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
d2f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d320: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d370: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
d380: 74 68 61 74 20 63 6f 6e 66 69 67 75 72 65 64 20  that configured 
d390: 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
d3a0: 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 73 20   UPDATE actions 
d3b0: 74 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 0a  take place when.
d3c0: 23 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 6d 6f  # deleting or mo
d3d0: 64 69 66 79 69 6e 67 20 72 6f 77 73 20 6f 66 20  difying rows of 
d3e0: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
d3f0: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
d400: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
d410: 20 52 2d 34 38 32 37 30 2d 34 34 32 38 32 20 46   R-48270-44282 F
d420: 6f 72 65 69 67 6e 20 6b 65 79 20 4f 4e 20 44 45  oreign key ON DE
d430: 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41  LETE and ON UPDA
d440: 54 45 20 63 6c 61 75 73 65 73 0a 23 20 61 72 65  TE clauses.# are
d450: 20 75 73 65 64 20 74 6f 20 63 6f 6e 66 69 67 75   used to configu
d460: 72 65 20 61 63 74 69 6f 6e 73 20 74 68 61 74 20  re actions that 
d470: 74 61 6b 65 20 70 6c 61 63 65 20 77 68 65 6e 20  take place when 
d480: 64 65 6c 65 74 69 6e 67 20 72 6f 77 73 20 66 72  deleting rows fr
d490: 6f 6d 0a 23 20 74 68 65 20 70 61 72 65 6e 74 20  om.# the parent 
d4a0: 74 61 62 6c 65 20 28 4f 4e 20 44 45 4c 45 54 45  table (ON DELETE
d4b0: 29 2c 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20  ), or modifying 
d4c0: 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 76  the parent key v
d4d0: 61 6c 75 65 73 20 6f 66 0a 23 20 65 78 69 73 74  alues of.# exist
d4e0: 69 6e 67 20 72 6f 77 73 20 28 4f 4e 20 55 50 44  ing rows (ON UPD
d4f0: 41 54 45 29 2e 0a 23 0a 23 20 54 65 73 74 20 74  ATE)..#.# Test t
d500: 68 61 74 20 61 20 73 69 6e 67 6c 65 20 46 4b 20  hat a single FK 
d510: 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 68  constraint may h
d520: 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 61 63  ave different ac
d530: 74 69 6f 6e 73 20 63 6f 6e 66 69 67 75 72 65 64  tions configured
d540: 0a 23 20 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45  .# for ON DELETE
d550: 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 2e 0a   and ON UPDATE..
d560: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
d570: 20 52 2d 34 38 31 32 34 2d 36 33 32 32 35 20 41   R-48124-63225 A
d580: 20 73 69 6e 67 6c 65 20 66 6f 72 65 69 67 6e 20   single foreign 
d590: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d  key constraint m
d5a0: 61 79 20 68 61 76 65 0a 23 20 64 69 66 66 65 72  ay have.# differ
d5b0: 65 6e 74 20 61 63 74 69 6f 6e 73 20 63 6f 6e 66  ent actions conf
d5c0: 69 67 75 72 65 64 20 66 6f 72 20 4f 4e 20 44 45  igured for ON DE
d5d0: 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41  LETE and ON UPDA
d5e0: 54 45 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  TE..#.do_test e_
d5f0: 66 6b 65 79 2d 33 39 2e 31 20 7b 0a 20 20 65 78  fkey-39.1 {.  ex
d600: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
d610: 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 20  TE TABLE p(a, b 
d620: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b  PRIMARY KEY, c);
d630: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
d640: 45 20 63 31 28 64 2c 20 65 2c 20 66 20 44 45 46  E c1(d, e, f DEF
d650: 41 55 4c 54 20 27 6b 30 27 20 52 45 46 45 52 45  AULT 'k0' REFERE
d660: 4e 43 45 53 20 70 20 0a 20 20 20 20 20 20 4f 4e  NCES p .      ON
d670: 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41   UPDATE SET DEFA
d680: 55 4c 54 0a 20 20 20 20 20 20 4f 4e 20 44 45 4c  ULT.      ON DEL
d690: 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20  ETE SET NULL.   
d6a0: 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
d6b0: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 30 2c  INTO p VALUES(0,
d6c0: 20 27 6b 30 27 2c 20 27 27 29 3b 0a 20 20 20 20   'k0', '');.    
d6d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
d6e0: 4c 55 45 53 28 31 2c 20 27 6b 31 27 2c 20 27 49  LUES(1, 'k1', 'I
d6f0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
d700: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 32 2c 20  NTO p VALUES(2, 
d710: 27 6b 32 27 2c 20 27 49 49 27 29 3b 0a 20 20 20  'k2', 'II');.   
d720: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
d730: 41 4c 55 45 53 28 33 2c 20 27 6b 33 27 2c 20 27  ALUES(3, 'k3', '
d740: 49 49 49 27 29 3b 0a 0a 20 20 20 20 49 4e 53 45  III');..    INSE
d750: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
d760: 53 28 31 2c 20 27 78 78 27 2c 20 27 6b 31 27 29  S(1, 'xx', 'k1')
d770: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d780: 4f 20 63 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O c1 VALUES(2, '
d790: 78 78 27 2c 20 27 6b 32 27 29 3b 0a 20 20 20 20  xx', 'k2');.    
d7a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
d7b0: 41 4c 55 45 53 28 33 2c 20 27 78 78 27 2c 20 27  ALUES(3, 'xx', '
d7c0: 6b 33 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  k3');.  }.} {}.d
d7d0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39  o_test e_fkey-39
d7e0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
d7f0: 0a 20 20 20 20 55 50 44 41 54 45 20 70 20 53 45  .    UPDATE p SE
d800: 54 20 62 20 3d 20 27 6b 34 27 20 57 48 45 52 45  T b = 'k4' WHERE
d810: 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   a = 1;.    SELE
d820: 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20  CT * FROM c1;.  
d830: 7d 0a 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78  }.} {1 xx k0 2 x
d840: 78 20 6b 32 20 33 20 78 78 20 6b 33 7d 0a 64 6f  x k2 3 xx k3}.do
d850: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e  _test e_fkey-39.
d860: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
d870: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
d880: 70 20 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20  p WHERE a = 2;. 
d890: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
d8a0: 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78   c1;.  }.} {1 xx
d8b0: 20 6b 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78   k0 2 xx {} 3 xx
d8c0: 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   k3}.do_test e_f
d8d0: 6b 65 79 2d 33 39 2e 34 20 7b 0a 20 20 65 78 65  key-39.4 {.  exe
d8e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
d8f0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70  E UNIQUE INDEX p
d900: 69 20 4f 4e 20 70 28 63 29 3b 0a 20 20 20 20 52  i ON p(c);.    R
d910: 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 20 56 41  EPLACE INTO p VA
d920: 4c 55 45 53 28 35 2c 20 27 6b 35 27 2c 20 27 49  LUES(5, 'k5', 'I
d930: 49 49 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  II');.    SELECT
d940: 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   * FROM c1;.  }.
d950: 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20  } {1 xx k0 2 xx 
d960: 7b 7d 20 33 20 78 78 20 7b 7d 7d 0a 0a 23 2d 2d  {} 3 xx {}}..#--
d970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 61 63 68 20 66  -------.# Each f
d9c0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 20 74 68  oreign key in th
d9d0: 65 20 73 79 73 74 65 6d 20 68 61 73 20 61 6e 20  e system has an 
d9e0: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
d9f0: 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 2c 0a   DELETE action,.
da00: 23 20 65 69 74 68 65 72 20 22 4e 4f 20 41 43 54  # either "NO ACT
da10: 49 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54 22  ION", "RESTRICT"
da20: 2c 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53  , "SET NULL", "S
da30: 45 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20 22  ET DEFAULT" or "
da40: 43 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 45 56  CASCADE"..#.# EV
da50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 33  IDENCE-OF: R-333
da60: 32 36 2d 34 35 32 35 32 20 54 68 65 20 4f 4e 20  26-45252 The ON 
da70: 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55 50  DELETE and ON UP
da80: 44 41 54 45 20 61 63 74 69 6f 6e 0a 23 20 61 73  DATE action.# as
da90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
daa0: 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ch foreign key i
dab0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
dac0: 62 61 73 65 20 69 73 20 6f 6e 65 20 6f 66 20 22  base is one of "
dad0: 4e 4f 0a 23 20 41 43 54 49 4f 4e 22 2c 20 22 52  NO.# ACTION", "R
dae0: 45 53 54 52 49 43 54 22 2c 20 22 53 45 54 20 4e  ESTRICT", "SET N
daf0: 55 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41 55  ULL", "SET DEFAU
db00: 4c 54 22 20 6f 72 20 22 43 41 53 43 41 44 45 22  LT" or "CASCADE"
db10: 2e 0a 23 0a 23 20 49 66 20 6e 6f 6e 65 20 69 73  ..#.# If none is
db20: 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69   specified expli
db30: 63 69 74 6c 79 2c 20 22 4e 4f 20 41 43 54 49 4f  citly, "NO ACTIO
db40: 4e 22 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  N" is the defaul
db50: 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
db60: 4f 46 3a 20 52 2d 31 39 38 30 33 2d 34 35 38 38  OF: R-19803-4588
db70: 34 20 49 66 20 61 6e 20 61 63 74 69 6f 6e 20 69  4 If an action i
db80: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
db90: 20 73 70 65 63 69 66 69 65 64 2c 0a 23 20 69 74   specified,.# it
dba0: 20 64 65 66 61 75 6c 74 73 20 74 6f 20 22 4e 4f   defaults to "NO
dbb0: 20 41 43 54 49 4f 4e 22 2e 0a 23 20 0a 64 72 6f   ACTION"..# .dro
dbc0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
dbd0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 30 2e 31  test e_fkey-40.1
dbe0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
dbf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
dc00: 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59  parent(x PRIMARY
dc10: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 43 52   KEY, y);.    CR
dc20: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
dc30: 31 28 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45  1(a, .      b RE
dc40: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
dc50: 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54  ON UPDATE NO ACT
dc60: 49 4f 4e 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  ION ON DELETE RE
dc70: 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  STRICT.    );.  
dc80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
dc90: 68 69 6c 64 32 28 61 2c 20 0a 20 20 20 20 20 20  hild2(a, .      
dca0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  b REFERENCES par
dcb0: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45  ent ON UPDATE RE
dcc0: 53 54 52 49 43 54 20 4f 4e 20 44 45 4c 45 54 45  STRICT ON DELETE
dcd0: 20 53 45 54 20 4e 55 4c 4c 0a 20 20 20 20 29 3b   SET NULL.    );
dce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dcf0: 45 20 63 68 69 6c 64 33 28 61 2c 20 0a 20 20 20  E child3(a, .   
dd00: 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20     b REFERENCES 
dd10: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
dd20: 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c   SET NULL ON DEL
dd30: 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a  ETE SET DEFAULT.
dd40: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
dd50: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 34 28 61  E TABLE child4(a
dd60: 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45 52  , .      b REFER
dd70: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
dd80: 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55  UPDATE SET DEFAU
dd90: 4c 54 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  LT ON DELETE CAS
dda0: 43 41 44 45 0a 20 20 20 20 29 3b 0a 0a 20 20 20  CADE.    );..   
ddb0: 20 2d 2d 20 43 72 65 61 74 65 20 73 6f 6d 65 20   -- Create some 
ddc0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 74 68 61  foreign keys tha
ddd0: 74 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c  t use the defaul
dde0: 74 20 61 63 74 69 6f 6e 20 2d 20 22 4e 4f 20 41  t action - "NO A
ddf0: 43 54 49 4f 4e 22 0a 20 20 20 20 43 52 45 41 54  CTION".    CREAT
de00: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 35 28 61  E TABLE child5(a
de10: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  , b REFERENCES p
de20: 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20  arent ON UPDATE 
de30: 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52  CASCADE);.    CR
de40: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
de50: 36 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  6(a, b REFERENCE
de60: 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45  S parent ON DELE
de70: 54 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20  TE RESTRICT);.  
de80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
de90: 68 69 6c 64 37 28 61 2c 20 62 20 52 45 46 45 52  hild7(a, b REFER
dea0: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
deb0: 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
dec0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
ded0: 42 4c 45 20 63 68 69 6c 64 38 28 61 2c 20 62 20  BLE child8(a, b 
dee0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
def0: 74 20 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41  t ON UPDATE NO A
df00: 43 54 49 4f 4e 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  CTION);.  }.} {}
df10: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a 54  ..foreach {tn zT
df20: 61 62 20 6c 52 65 73 7d 20 7b 0a 20 20 32 20 63  ab lRes} {.  2 c
df30: 68 69 6c 64 31 20 7b 30 20 30 20 70 61 72 65 6e  hild1 {0 0 paren
df40: 74 20 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f  t b {} {NO ACTIO
df50: 4e 7d 20 52 45 53 54 52 49 43 54 20 4e 4f 4e 45  N} RESTRICT NONE
df60: 7d 0a 20 20 33 20 63 68 69 6c 64 32 20 7b 30 20  }.  3 child2 {0 
df70: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 52 45  0 parent b {} RE
df80: 53 54 52 49 43 54 20 7b 53 45 54 20 4e 55 4c 4c  STRICT {SET NULL
df90: 7d 20 4e 4f 4e 45 7d 0a 20 20 34 20 63 68 69 6c  } NONE}.  4 chil
dfa0: 64 33 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62  d3 {0 0 parent b
dfb0: 20 7b 7d 20 7b 53 45 54 20 4e 55 4c 4c 7d 20 7b   {} {SET NULL} {
dfc0: 53 45 54 20 44 45 46 41 55 4c 54 7d 20 4e 4f 4e  SET DEFAULT} NON
dfd0: 45 7d 0a 20 20 35 20 63 68 69 6c 64 34 20 7b 30  E}.  5 child4 {0
dfe0: 20 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b   0 parent b {} {
dff0: 53 45 54 20 44 45 46 41 55 4c 54 7d 20 43 41 53  SET DEFAULT} CAS
e000: 43 41 44 45 20 4e 4f 4e 45 7d 0a 20 20 36 20 63  CADE NONE}.  6 c
e010: 68 69 6c 64 35 20 7b 30 20 30 20 70 61 72 65 6e  hild5 {0 0 paren
e020: 74 20 62 20 7b 7d 20 43 41 53 43 41 44 45 20 7b  t b {} CASCADE {
e030: 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45 7d  NO ACTION} NONE}
e040: 0a 20 20 37 20 63 68 69 6c 64 36 20 7b 30 20 30  .  7 child6 {0 0
e050: 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f   parent b {} {NO
e060: 20 41 43 54 49 4f 4e 7d 20 52 45 53 54 52 49 43   ACTION} RESTRIC
e070: 54 20 4e 4f 4e 45 7d 0a 20 20 38 20 63 68 69 6c  T NONE}.  8 chil
e080: 64 37 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62  d7 {0 0 parent b
e090: 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20   {} {NO ACTION} 
e0a0: 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e 45  {NO ACTION} NONE
e0b0: 7d 0a 20 20 39 20 63 68 69 6c 64 38 20 7b 30 20  }.  9 child8 {0 
e0c0: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e  0 parent b {} {N
e0d0: 4f 20 41 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43  O ACTION} {NO AC
e0e0: 54 49 4f 4e 7d 20 4e 4f 4e 45 7d 0a 7d 20 7b 0a  TION} NONE}.} {.
e0f0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
e100: 2d 34 30 2e 24 74 6e 20 7b 20 65 78 65 63 73 71  -40.$tn { execsq
e110: 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  l "PRAGMA foreig
e120: 6e 5f 6b 65 79 5f 6c 69 73 74 28 24 7a 54 61 62  n_key_list($zTab
e130: 29 22 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d  )" } $lRes.}..#-
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e180: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
e190: 74 68 61 74 20 22 4e 4f 20 41 43 54 49 4f 4e 22  that "NO ACTION"
e1a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 74 68   means that noth
e1b0: 69 6e 67 20 68 61 70 70 65 6e 73 20 74 6f 20 61  ing happens to a
e1c0: 20 63 68 69 6c 64 20 72 6f 77 20 77 68 65 6e 0a   child row when.
e1d0: 23 20 69 74 27 73 20 70 61 72 65 6e 74 20 72 6f  # it's parent ro
e1e0: 77 20 69 73 20 75 70 64 61 74 65 64 20 6f 72 20  w is updated or 
e1f0: 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 45 56 49  deleted..#.# EVI
e200: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 37  DENCE-OF: R-1997
e210: 31 2d 35 34 39 37 36 20 43 6f 6e 66 69 67 75 72  1-54976 Configur
e220: 69 6e 67 20 22 4e 4f 20 41 43 54 49 4f 4e 22 20  ing "NO ACTION" 
e230: 6d 65 61 6e 73 20 6a 75 73 74 20 74 68 61 74 3a  means just that:
e240: 0a 23 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74  .# when a parent
e250: 20 6b 65 79 20 69 73 20 6d 6f 64 69 66 69 65 64   key is modified
e260: 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
e270: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e   the database, n
e280: 6f 20 73 70 65 63 69 61 6c 0a 23 20 61 63 74 69  o special.# acti
e290: 6f 6e 20 69 73 20 74 61 6b 65 6e 2e 0a 23 0a 64  on is taken..#.d
e2a0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
e2b0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31  o_test e_fkey-41
e2c0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
e2d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e2e0: 45 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 2c  E parent(p1, p2,
e2f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 70 31 2c   PRIMARY KEY(p1,
e300: 20 70 32 29 29 3b 0a 20 20 20 20 43 52 45 41 54   p2));.    CREAT
e310: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 63 31  E TABLE child(c1
e320: 2c 20 63 32 2c 20 0a 20 20 20 20 20 20 46 4f 52  , c2, .      FOR
e330: 45 49 47 4e 20 4b 45 59 28 63 31 2c 20 63 32 29  EIGN KEY(c1, c2)
e340: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
e350: 6e 74 0a 20 20 20 20 20 20 4f 4e 20 55 50 44 41  nt.      ON UPDA
e360: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20  TE NO ACTION.   
e370: 20 20 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20     ON DELETE NO 
e380: 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46  ACTION.      DEF
e390: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
e3a0: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
e3b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e3c0: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
e3d0: 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20 49  'j', 'k');.    I
e3e0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
e3f0: 74 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d  t VALUES('l', 'm
e400: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
e410: 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53  NTO child VALUES
e420: 28 27 6a 27 2c 20 27 6b 27 29 3b 0a 20 20 20 20  ('j', 'k');.    
e430: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
e440: 64 20 56 41 4c 55 45 53 28 27 6c 27 2c 20 27 6d  d VALUES('l', 'm
e450: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
e460: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 32  test e_fkey-41.2
e470: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e480: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
e490: 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
e4a0: 54 20 70 31 3d 27 6b 27 20 57 48 45 52 45 20 70  T p1='k' WHERE p
e4b0: 31 3d 27 6a 27 3b 0a 20 20 20 20 20 20 44 45 4c  1='j';.      DEL
e4c0: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
e4d0: 57 48 45 52 45 20 70 31 3d 27 6c 27 3b 0a 20 20  WHERE p1='l';.  
e4e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
e4f0: 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b  M child;.  }.} {
e500: 6a 20 6b 20 6c 20 6d 7d 0a 64 6f 5f 74 65 73 74  j k l m}.do_test
e510: 20 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20   e_fkey-41.3 {. 
e520: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
e530: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
e540: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
e550: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
e560: 5f 66 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20 65  _fkey-41.4 {.  e
e570: 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a  xecsql ROLLBACK.
e580: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
e590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 22 52 45  .# Test that "RE
e5e0: 53 54 52 49 43 54 22 20 6d 65 61 6e 73 20 74 68  STRICT" means th
e5f0: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73  e application is
e600: 20 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f 6d   prohibited from
e610: 20 64 65 6c 65 74 69 6e 67 0a 23 20 6f 72 20 75   deleting.# or u
e620: 70 64 61 74 69 6e 67 20 61 20 70 61 72 65 6e 74  pdating a parent
e630: 20 74 61 62 6c 65 20 72 6f 77 20 77 68 65 6e 20   table row when 
e640: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
e650: 20 6f 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b   or more child k
e660: 65 79 73 0a 23 20 6d 61 70 70 65 64 20 74 6f 20  eys.# mapped to 
e670: 69 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  it..#.# EVIDENCE
e680: 2d 4f 46 3a 20 52 2d 30 34 32 37 32 2d 33 38 36  -OF: R-04272-386
e690: 35 33 20 54 68 65 20 22 52 45 53 54 52 49 43 54  53 The "RESTRICT
e6a0: 22 20 61 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  " action means t
e6b0: 68 61 74 20 74 68 65 0a 23 20 61 70 70 6c 69 63  hat the.# applic
e6c0: 61 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62 69  ation is prohibi
e6d0: 74 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e  ted from deletin
e6e0: 67 20 28 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45  g (for ON DELETE
e6f0: 20 52 45 53 54 52 49 43 54 29 20 6f 72 0a 23 20   RESTRICT) or.# 
e700: 6d 6f 64 69 66 79 69 6e 67 20 28 66 6f 72 20 4f  modifying (for O
e710: 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43  N UPDATE RESTRIC
e720: 54 29 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20  T) a parent key 
e730: 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
e740: 73 20 6f 6e 65 0a 23 20 6f 72 20 6d 6f 72 65 20  s one.# or more 
e750: 63 68 69 6c 64 20 6b 65 79 73 20 6d 61 70 70 65  child keys mappe
e760: 64 20 74 6f 20 69 74 2e 0a 23 0a 64 72 6f 70 5f  d to it..#.drop_
e770: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
e780: 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 31 20 7b  st e_fkey-41.1 {
e790: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e7a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
e7b0: 72 65 6e 74 28 70 31 2c 20 70 32 29 3b 0a 20 20  rent(p1, p2);.  
e7c0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
e7d0: 49 4e 44 45 58 20 70 61 72 65 6e 74 5f 69 20 4f  INDEX parent_i O
e7e0: 4e 20 70 61 72 65 6e 74 28 70 31 2c 20 70 32 29  N parent(p1, p2)
e7f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e800: 4c 45 20 63 68 69 6c 64 31 28 63 31 2c 20 63 32  LE child1(c1, c2
e810: 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  , .      FOREIGN
e820: 20 4b 45 59 28 63 32 2c 20 63 31 29 20 52 45 46   KEY(c2, c1) REF
e830: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70  ERENCES parent(p
e840: 31 2c 20 70 32 29 20 4f 4e 20 44 45 4c 45 54 45  1, p2) ON DELETE
e850: 20 52 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b   RESTRICT.    );
e860: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e870: 45 20 63 68 69 6c 64 32 28 63 31 2c 20 63 32 2c  E child2(c1, c2,
e880: 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20   .      FOREIGN 
e890: 4b 45 59 28 63 32 2c 20 63 31 29 20 52 45 46 45  KEY(c2, c1) REFE
e8a0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 70 31  RENCES parent(p1
e8b0: 2c 20 70 32 29 20 4f 4e 20 55 50 44 41 54 45 20  , p2) ON UPDATE 
e8c0: 52 45 53 54 52 49 43 54 0a 20 20 20 20 29 3b 0a  RESTRICT.    );.
e8d0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
e8e0: 20 65 5f 66 6b 65 79 2d 34 31 2e 32 20 7b 0a 20   e_fkey-41.2 {. 
e8f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
e900: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
e910: 74 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  t VALUES('a', 'b
e920: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
e930: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
e940: 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20  S('c', 'd');.   
e950: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
e960: 6c 64 31 20 56 41 4c 55 45 53 28 27 62 27 2c 20  ld1 VALUES('b', 
e970: 27 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'a');.    INSERT
e980: 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c   INTO child2 VAL
e990: 55 45 53 28 27 64 27 2c 20 27 63 27 29 3b 0a 20  UES('d', 'c');. 
e9a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
e9b0: 65 5f 66 6b 65 79 2d 34 31 2e 33 20 7b 0a 20 20  e_fkey-41.3 {.  
e9c0: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
e9d0: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
e9e0: 45 52 45 20 70 31 20 3d 20 27 61 27 20 7d 0a 7d  ERE p1 = 'a' }.}
e9f0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
ea00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
ea10: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
ea20: 6b 65 79 2d 34 31 2e 34 20 7b 0a 20 20 63 61 74  key-41.4 {.  cat
ea30: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70  chsql { UPDATE p
ea40: 61 72 65 6e 74 20 53 45 54 20 70 32 20 3d 20 27  arent SET p2 = '
ea50: 65 27 20 57 48 45 52 45 20 70 31 20 3d 20 27 63  e' WHERE p1 = 'c
ea60: 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ' }.} {1 {foreig
ea70: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
ea80: 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d   failed}}..#----
ea90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ead0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
eae0: 74 20 52 45 53 54 52 49 43 54 20 69 73 20 73 6c  t RESTRICT is sl
eaf0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
eb00: 20 66 72 6f 6d 20 4e 4f 20 41 43 54 49 4f 4e 20   from NO ACTION 
eb10: 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 0a 23 20  for IMMEDIATE.# 
eb20: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 69 6e 20  constraints, in 
eb30: 74 68 61 74 20 69 74 20 69 73 20 65 6e 66 6f 72  that it is enfor
eb40: 63 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c  ced immediately,
eb50: 20 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20   not at the end 
eb60: 6f 66 20 74 68 65 20 0a 23 20 73 74 61 74 65 6d  of the .# statem
eb70: 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ent..#.# EVIDENC
eb80: 45 2d 4f 46 3a 20 52 2d 33 37 39 39 37 2d 34 32  E-OF: R-37997-42
eb90: 31 38 37 20 54 68 65 20 64 69 66 66 65 72 65 6e  187 The differen
eba0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ce between the e
ebb0: 66 66 65 63 74 20 6f 66 20 61 0a 23 20 52 45 53  ffect of a.# RES
ebc0: 54 52 49 43 54 20 61 63 74 69 6f 6e 20 61 6e 64  TRICT action and
ebd0: 20 6e 6f 72 6d 61 6c 20 66 6f 72 65 69 67 6e 20   normal foreign 
ebe0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  key constraint e
ebf0: 6e 66 6f 72 63 65 6d 65 6e 74 20 69 73 20 74 68  nforcement is th
ec00: 61 74 0a 23 20 74 68 65 20 52 45 53 54 52 49 43  at.# the RESTRIC
ec10: 54 20 61 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  T action process
ec20: 69 6e 67 20 68 61 70 70 65 6e 73 20 61 73 20 73  ing happens as s
ec30: 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 65 6c 64  oon as the field
ec40: 20 69 73 20 75 70 64 61 74 65 64 0a 23 20 2d 20   is updated.# - 
ec50: 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  not at the end o
ec60: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
ec70: 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 77 6f  atement as it wo
ec80: 75 6c 64 20 77 69 74 68 20 61 6e 0a 23 20 69 6d  uld with an.# im
ec90: 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69  mediate constrai
eca0: 6e 74 2c 20 6f 72 20 61 74 20 74 68 65 20 65 6e  nt, or at the en
ecb0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
ecc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 73 20   transaction as 
ecd0: 69 74 0a 23 20 77 6f 75 6c 64 20 77 69 74 68 20  it.# would with 
ece0: 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  a deferred const
ecf0: 72 61 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f 61 6c  raint..#.drop_al
ed00: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
ed10: 20 65 5f 66 6b 65 79 2d 34 32 2e 31 20 7b 0a 20   e_fkey-42.1 {. 
ed20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
ed30: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
ed40: 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(x PRIMARY KEY
ed50: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
ed60: 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46  BLE child1(c REF
ed70: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
ed80: 4e 20 55 50 44 41 54 45 20 52 45 53 54 52 49 43  N UPDATE RESTRIC
ed90: 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
eda0: 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45  ABLE child2(c RE
edb0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
edc0: 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54  ON UPDATE NO ACT
edd0: 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  ION);..    INSER
ede0: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
edf0: 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20  LUES('key1');.  
ee00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
ee10: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
ee20: 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  2');.    INSERT 
ee30: 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
ee40: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
ee50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
ee60: 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  d2 VALUES('key2'
ee70: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
ee80: 52 49 47 47 45 52 20 70 61 72 65 6e 74 5f 74 20  RIGGER parent_t 
ee90: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
eea0: 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20  parent BEGIN.   
eeb0: 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 31     UPDATE child1
eec0: 20 73 65 74 20 63 20 3d 20 6e 65 77 2e 78 20 57   set c = new.x W
eed0: 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a  HERE c = old.x;.
eee0: 20 20 20 20 20 20 55 50 44 41 54 45 20 63 68 69        UPDATE chi
eef0: 6c 64 32 20 73 65 74 20 63 20 3d 20 6e 65 77 2e  ld2 set c = new.
ef00: 78 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64 2e  x WHERE c = old.
ef10: 78 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a  x;.    END;.  }.
ef20: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
ef30: 6b 65 79 2d 34 32 2e 32 20 7b 0a 20 20 63 61 74  key-42.2 {.  cat
ef40: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70  chsql { UPDATE p
ef50: 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b  arent SET x = 'k
ef60: 65 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20  ey one' WHERE x 
ef70: 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20  = 'key1' }.} {1 
ef80: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
ef90: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
efa0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
efb0: 34 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  42.3 {.  execsql
efc0: 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 70   { .    UPDATE p
efd0: 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b  arent SET x = 'k
efe0: 65 79 20 74 77 6f 27 20 57 48 45 52 45 20 78 20  ey two' WHERE x 
eff0: 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45  = 'key2';.    SE
f000: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c  LECT * FROM chil
f010: 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 6b 65 79 20  d2;.  }.} {{key 
f020: 74 77 6f 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f  two}}..drop_all_
f030: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
f040: 5f 66 6b 65 79 2d 34 32 2e 34 20 7b 0a 20 20 65  _fkey-42.4 {.  e
f050: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
f060: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
f070: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
f080: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
f090: 45 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52  E child1(c REFER
f0a0: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
f0b0: 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 29  DELETE RESTRICT)
f0c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f0d0: 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45  LE child2(c REFE
f0e0: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
f0f0: 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f   DELETE NO ACTIO
f100: 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  N);..    INSERT 
f110: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f120: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
f130: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
f140: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  nt VALUES('key2'
f150: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f160: 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53  TO child1 VALUES
f170: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
f180: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32  SERT INTO child2
f190: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f1a0: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ..    CREATE TRI
f1b0: 47 47 45 52 20 70 61 72 65 6e 74 5f 74 20 41 46  GGER parent_t AF
f1c0: 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 70 61  TER DELETE ON pa
f1d0: 72 65 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20  rent BEGIN.     
f1e0: 20 55 50 44 41 54 45 20 63 68 69 6c 64 31 20 53   UPDATE child1 S
f1f0: 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48 45 52  ET c = NULL WHER
f200: 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20  E c = old.x;.   
f210: 20 20 20 55 50 44 41 54 45 20 63 68 69 6c 64 32     UPDATE child2
f220: 20 53 45 54 20 63 20 3d 20 4e 55 4c 4c 20 57 48   SET c = NULL WH
f230: 45 52 45 20 63 20 3d 20 6f 6c 64 2e 78 3b 0a 20  ERE c = old.x;. 
f240: 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d     END;.  }.} {}
f250: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f260: 34 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  42.5 {.  catchsq
f270: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
f280: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
f290: 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20 7b   'key1' }.} {1 {
f2a0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f2b0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
f2c0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
f2d0: 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
f2e0: 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  { .    DELETE FR
f2f0: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
f300: 78 20 3d 20 27 6b 65 79 32 27 3b 0a 20 20 20 20  x = 'key2';.    
f310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68  SELECT * FROM ch
f320: 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d  ild2;.  }.} {{}}
f330: 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  ..drop_all_table
f340: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
f350: 2d 34 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  -42.7 {.  execsq
f360: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
f370: 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52  ABLE parent(x PR
f380: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
f390: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69  CREATE TABLE chi
f3a0: 6c 64 31 28 63 20 52 45 46 45 52 45 4e 43 45 53  ld1(c REFERENCES
f3b0: 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54   parent ON DELET
f3c0: 45 20 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20  E RESTRICT);.   
f3d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
f3e0: 69 6c 64 32 28 63 20 52 45 46 45 52 45 4e 43 45  ild2(c REFERENCE
f3f0: 53 20 70 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45  S parent ON DELE
f400: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a  TE NO ACTION);..
f410: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f420: 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b  parent VALUES('k
f430: 65 79 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ey1');.    INSER
f440: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
f450: 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20  LUES('key2');.  
f460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
f470: 69 6c 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79  ild1 VALUES('key
f480: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
f490: 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55  INTO child2 VALU
f4a0: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 7d 0a  ES('key2');.  }.
f4b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
f4c0: 6b 65 79 2d 34 32 2e 38 20 7b 0a 20 20 63 61 74  key-42.8 {.  cat
f4d0: 63 68 73 71 6c 20 7b 20 52 45 50 4c 41 43 45 20  chsql { REPLACE 
f4e0: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f4f0: 45 53 28 27 6b 65 79 31 27 29 20 7d 0a 7d 20 7b  ES('key1') }.} {
f500: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
f510: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
f520: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
f530: 79 2d 34 32 2e 39 20 7b 0a 20 20 65 78 65 63 73  y-42.9 {.  execs
f540: 71 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c 41 43  ql { .    REPLAC
f550: 45 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  E INTO parent VA
f560: 4c 55 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20  LUES('key2');.  
f570: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
f580: 63 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d 20 7b 6b  child2;.  }.} {k
f590: 65 79 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ey2}..#---------
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5e0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 52 45 53  .# Test that RES
f5f0: 54 52 49 43 54 20 69 73 20 65 6e 66 6f 72 63 65  TRICT is enforce
f600: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 65  d immediately, e
f610: 76 65 6e 20 66 6f 72 20 61 20 44 45 46 45 52 52  ven for a DEFERR
f620: 45 44 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23  ED constraint..#
f630: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
f640: 52 2d 32 34 31 37 39 2d 36 30 35 32 33 20 45 76  R-24179-60523 Ev
f650: 65 6e 20 69 66 20 74 68 65 20 66 6f 72 65 69 67  en if the foreig
f660: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
f670: 20 69 74 20 69 73 0a 23 20 61 74 74 61 63 68 65   it is.# attache
f680: 64 20 74 6f 20 69 73 20 64 65 66 65 72 72 65 64  d to is deferred
f690: 2c 20 63 6f 6e 66 69 67 75 72 69 6e 67 20 61 20  , configuring a 
f6a0: 52 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20  RESTRICT action 
f6b0: 63 61 75 73 65 73 20 53 51 4c 69 74 65 0a 23 20  causes SQLite.# 
f6c0: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
f6d0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  or immediately i
f6e0: 66 20 61 20 70 61 72 65 6e 74 20 6b 65 79 20 77  f a parent key w
f6f0: 69 74 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68  ith dependent ch
f700: 69 6c 64 0a 23 20 6b 65 79 73 20 69 73 20 64 65  ild.# keys is de
f710: 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65  leted or modifie
f720: 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
f730: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
f740: 6b 65 79 2d 34 33 2e 31 20 7b 0a 20 20 65 78 65  key-43.1 {.  exe
f750: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
f760: 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78  E TABLE parent(x
f770: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
f780: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
f790: 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45 4e  child1(c REFEREN
f7a0: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
f7b0: 44 41 54 45 20 52 45 53 54 52 49 43 54 0a 20 20  DATE RESTRICT.  
f7c0: 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49      DEFERRABLE I
f7d0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
f7e0: 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  D.    );.    CRE
f7f0: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
f800: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
f810: 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 4e  rent ON UPDATE N
f820: 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20 44  O ACTION.      D
f830: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
f840: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
f850: 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   );..    INSERT 
f860: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f870: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
f880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
f890: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  nt VALUES('key2'
f8a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f8b0: 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45 53  TO child1 VALUES
f8c0: 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49 4e  ('key1');.    IN
f8d0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 32  SERT INTO child2
f8e0: 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29 3b   VALUES('key2');
f8f0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a  .    BEGIN;.  }.
f900: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
f910: 6b 65 79 2d 34 33 2e 32 20 7b 0a 20 20 63 61 74  key-43.2 {.  cat
f920: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 70  chsql { UPDATE p
f930: 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 27 6b  arent SET x = 'k
f940: 65 79 20 6f 6e 65 27 20 57 48 45 52 45 20 78 20  ey one' WHERE x 
f950: 3d 20 27 6b 65 79 31 27 20 7d 0a 7d 20 7b 31 20  = 'key1' }.} {1 
f960: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
f970: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
f980: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
f990: 34 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  43.3 {.  execsql
f9a0: 20 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74   { UPDATE parent
f9b0: 20 53 45 54 20 78 20 3d 20 27 6b 65 79 20 74 77   SET x = 'key tw
f9c0: 6f 27 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65  o' WHERE x = 'ke
f9d0: 79 32 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  y2' }.} {}.do_te
f9e0: 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 34 20 7b  st e_fkey-43.4 {
f9f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d  .  catchsql COMM
fa00: 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  IT.} {1 {foreign
fa10: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
fa20: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
fa30: 20 65 5f 66 6b 65 79 2d 34 33 2e 35 20 7b 0a 20   e_fkey-43.5 {. 
fa40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
fa50: 50 44 41 54 45 20 63 68 69 6c 64 32 20 53 45 54  PDATE child2 SET
fa60: 20 63 20 3d 20 27 6b 65 79 20 74 77 6f 27 3b 0a   c = 'key two';.
fa70: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
fa80: 7d 20 7b 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74  } {}..drop_all_t
fa90: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
faa0: 66 6b 65 79 2d 34 33 2e 36 20 7b 0a 20 20 65 78  fkey-43.6 {.  ex
fab0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
fac0: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
fad0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
fae0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
faf0: 20 63 68 69 6c 64 31 28 63 20 52 45 46 45 52 45   child1(c REFERE
fb00: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 44  NCES parent ON D
fb10: 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a 20  ELETE RESTRICT. 
fb20: 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20       DEFERRABLE 
fb30: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
fb40: 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  ED.    );.    CR
fb50: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
fb60: 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  2(c REFERENCES p
fb70: 61 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20  arent ON DELETE 
fb80: 4e 4f 20 41 43 54 49 4f 4e 0a 20 20 20 20 20 20  NO ACTION.      
fb90: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
fba0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
fbb0: 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54    );..    INSERT
fbc0: 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
fbd0: 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20  UES('key1');.   
fbe0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
fbf0: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 32  ent VALUES('key2
fc00: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fc10: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
fc20: 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20 49  S('key1');.    I
fc30: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
fc40: 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27 29  2 VALUES('key2')
fc50: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d  ;.    BEGIN;.  }
fc60: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
fc70: 66 6b 65 79 2d 34 33 2e 37 20 7b 0a 20 20 63 61  fkey-43.7 {.  ca
fc80: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
fc90: 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52  FROM parent WHER
fca0: 45 20 78 20 3d 20 27 6b 65 79 31 27 20 7d 0a 7d  E x = 'key1' }.}
fcb0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
fcc0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
fcd0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
fce0: 6b 65 79 2d 34 33 2e 38 20 7b 0a 20 20 65 78 65  key-43.8 {.  exe
fcf0: 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  csql { DELETE FR
fd00: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
fd10: 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20 7b  x = 'key2' }.} {
fd20: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
fd30: 2d 34 33 2e 39 20 7b 0a 20 20 63 61 74 63 68 73  -43.9 {.  catchs
fd40: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
fd50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
fd60: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
fd70: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
fd80: 33 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  3.10 {.  execsql
fd90: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63 68   {.    UPDATE ch
fda0: 69 6c 64 32 20 53 45 54 20 63 20 3d 20 4e 55 4c  ild2 SET c = NUL
fdb0: 4c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  L;.    COMMIT;. 
fdc0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
fdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe10: 2d 2d 2d 0a 23 20 54 65 73 74 20 53 45 54 20 4e  ---.# Test SET N
fe20: 55 4c 4c 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 23  ULL actions..#.#
fe30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fe40: 30 33 33 35 33 2d 30 35 33 32 37 20 49 66 20 74  03353-05327 If t
fe50: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61 63  he configured ac
fe60: 74 69 6f 6e 20 69 73 20 22 53 45 54 20 4e 55 4c  tion is "SET NUL
fe70: 4c 22 2c 0a 23 20 74 68 65 6e 20 77 68 65 6e 20  L",.# then when 
fe80: 61 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20  a parent key is 
fe90: 64 65 6c 65 74 65 64 20 28 66 6f 72 20 4f 4e 20  deleted (for ON 
fea0: 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29  DELETE SET NULL)
feb0: 20 6f 72 20 6d 6f 64 69 66 69 65 64 0a 23 20 28   or modified.# (
fec0: 66 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 53 45  for ON UPDATE SE
fed0: 54 20 4e 55 4c 4c 29 2c 20 74 68 65 20 63 68 69  T NULL), the chi
fee0: 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6f  ld key columns o
fef0: 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68  f all rows in th
ff00: 65 0a 23 20 63 68 69 6c 64 20 74 61 62 6c 65 20  e.# child table 
ff10: 74 68 61 74 20 6d 61 70 70 65 64 20 74 6f 20 74  that mapped to t
ff20: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 61 72  he parent key ar
ff30: 65 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e  e set to contain
ff40: 20 53 51 4c 20 4e 55 4c 4c 0a 23 20 76 61 6c 75   SQL NULL.# valu
ff50: 65 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  es..#.drop_all_t
ff60: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
ff70: 66 6b 65 79 2d 34 34 2e 31 20 7b 0a 20 20 65 78  fkey-44.1 {.  ex
ff80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
ff90: 54 45 20 54 41 42 4c 45 20 70 41 28 78 20 50 52  TE TABLE pA(x PR
ffa0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
ffb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 41 28  CREATE TABLE cA(
ffc0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 41 20  c REFERENCES pA 
ffd0: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
ffe0: 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  LL);.    CREATE 
fff0: 54 41 42 4c 45 20 63 42 28 63 20 52 45 46 45 52  TABLE cB(c REFER
10000 45 4e 43 45 53 20 70 41 20 4f 4e 20 55 50 44 41  ENCES pA ON UPDA
10010 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 0a 20  TE SET NULL);.. 
10020 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
10030 41 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27  A VALUES(X'ABCD'
10040 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10050 54 4f 20 70 41 20 56 41 4c 55 45 53 28 58 27 31  TO pA VALUES(X'1
10060 32 33 34 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  234');.    INSER
10070 54 20 49 4e 54 4f 20 63 41 20 56 41 4c 55 45 53  T INTO cA VALUES
10080 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49  (X'ABCD');.    I
10090 4e 53 45 52 54 20 49 4e 54 4f 20 63 42 20 56 41  NSERT INTO cB VA
100a0 4c 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20  LUES(X'1234');. 
100b0 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
100c0 65 5f 66 6b 65 79 2d 34 34 2e 32 20 7b 0a 20 20  e_fkey-44.2 {.  
100d0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
100e0 4c 45 54 45 20 46 52 4f 4d 20 70 41 20 57 48 45  LETE FROM pA WHE
100f0 52 45 20 78 20 3d 20 78 27 61 62 63 64 27 3b 0a  RE x = x'abcd';.
10100 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65      SELECT quote
10110 28 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d  (x) FROM pA;.  }
10120 0a 7d 20 7b 78 27 31 32 33 34 27 7d 0a 64 6f 5f  .} {x'1234'}.do_
10130 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 33  test e_fkey-44.3
10140 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
10150 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28     SELECT quote(
10160 63 29 20 46 52 4f 4d 20 63 41 3b 0a 20 20 7d 0a  c) FROM cA;.  }.
10170 7d 20 7b 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74  } {NULL}.do_test
10180 20 65 5f 66 6b 65 79 2d 34 34 2e 34 20 7b 0a 20   e_fkey-44.4 {. 
10190 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
101a0 50 44 41 54 45 20 70 41 20 53 45 54 20 78 20 3d  PDATE pA SET x =
101b0 20 58 27 38 37 36 35 27 20 57 48 45 52 45 20 78   X'8765' WHERE x
101c0 20 3d 20 58 27 31 32 33 34 27 3b 0a 20 20 20 20   = X'1234';.    
101d0 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
101e0 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b  FROM pA;.  }.} {
101f0 78 27 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74  x'8765'}.do_test
10200 20 65 5f 66 6b 65 79 2d 34 34 2e 35 20 7b 0a 20   e_fkey-44.5 {. 
10210 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
10220 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20  T quote(c) FROM 
10230 63 42 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a 0a 23  cB }.} {NULL}..#
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10280 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
10290 20 53 45 54 20 44 45 46 41 55 4c 54 20 61 63 74   SET DEFAULT act
102a0 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ions..#.# EVIDEN
102b0 43 45 2d 4f 46 3a 20 52 2d 34 33 30 35 34 2d 35  CE-OF: R-43054-5
102c0 34 38 33 32 20 54 68 65 20 22 53 45 54 20 44 45  4832 The "SET DE
102d0 46 41 55 4c 54 22 20 61 63 74 69 6f 6e 73 20 61  FAULT" actions a
102e0 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 23 20  re similar to.# 
102f0 22 53 45 54 20 4e 55 4c 4c 22 2c 20 65 78 63 65  "SET NULL", exce
10300 70 74 20 74 68 61 74 20 65 61 63 68 20 6f 66 20  pt that each of 
10310 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f  the child key co
10320 6c 75 6d 6e 73 20 69 73 20 73 65 74 20 74 6f 0a  lumns is set to.
10330 23 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f  # contain the co
10340 6c 75 6d 6e 73 20 64 65 66 61 75 6c 74 20 76 61  lumns default va
10350 6c 75 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4e  lue instead of N
10360 55 4c 4c 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ULL..#.drop_all_
10370 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
10380 5f 66 6b 65 79 2d 34 35 2e 31 20 7b 0a 20 20 65  _fkey-45.1 {.  e
10390 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
103a0 41 54 45 20 54 41 42 4c 45 20 70 41 28 78 20 50  ATE TABLE pA(x P
103b0 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
103c0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 41   CREATE TABLE cA
103d0 28 63 20 44 45 46 41 55 4c 54 20 58 27 30 30 30  (c DEFAULT X'000
103e0 30 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 41  0' REFERENCES pA
103f0 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44   ON DELETE SET D
10400 45 46 41 55 4c 54 29 3b 0a 20 20 20 20 43 52 45  EFAULT);.    CRE
10410 41 54 45 20 54 41 42 4c 45 20 63 42 28 63 20 44  ATE TABLE cB(c D
10420 45 46 41 55 4c 54 20 58 27 39 39 39 39 27 20 52  EFAULT X'9999' R
10430 45 46 45 52 45 4e 43 45 53 20 70 41 20 4f 4e 20  EFERENCES pA ON 
10440 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55  UPDATE SET DEFAU
10450 4c 54 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  LT);..    INSERT
10460 20 49 4e 54 4f 20 70 41 28 78 29 20 56 41 4c 55   INTO pA(x) VALU
10470 45 53 28 58 27 30 30 30 30 27 29 3b 0a 20 20 20  ES(X'0000');.   
10480 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28   INSERT INTO pA(
10490 78 29 20 56 41 4c 55 45 53 28 58 27 39 39 39 39  x) VALUES(X'9999
104a0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
104b0 4e 54 4f 20 70 41 28 78 29 20 56 41 4c 55 45 53  NTO pA(x) VALUES
104c0 28 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49  (X'ABCD');.    I
104d0 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 78 29  NSERT INTO pA(x)
104e0 20 56 41 4c 55 45 53 28 58 27 31 32 33 34 27 29   VALUES(X'1234')
104f0 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
10500 54 4f 20 63 41 20 56 41 4c 55 45 53 28 58 27 41  TO cA VALUES(X'A
10510 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  BCD');.    INSER
10520 54 20 49 4e 54 4f 20 63 42 20 56 41 4c 55 45 53  T INTO cB VALUES
10530 28 58 27 31 32 33 34 27 29 3b 0a 20 20 7d 0a 7d  (X'1234');.  }.}
10540 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
10550 65 79 2d 34 35 2e 32 20 7b 0a 20 20 65 78 65 63  ey-45.2 {.  exec
10560 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
10570 20 46 52 4f 4d 20 70 41 20 57 48 45 52 45 20 78   FROM pA WHERE x
10580 20 3d 20 58 27 41 42 43 44 27 3b 0a 20 20 20 20   = X'ABCD';.    
10590 53 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20  SELECT quote(x) 
105a0 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b  FROM pA;.  }.} {
105b0 78 27 30 30 30 30 27 20 78 27 31 32 33 34 27 20  x'0000' x'1234' 
105c0 78 27 39 39 39 39 27 7d 0a 64 6f 5f 74 65 73 74  x'9999'}.do_test
105d0 20 65 5f 66 6b 65 79 2d 34 35 2e 33 20 7b 0a 20   e_fkey-45.3 {. 
105e0 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
105f0 54 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20  T quote(c) FROM 
10600 63 41 20 7d 0a 7d 20 7b 78 27 30 30 30 30 27 7d  cA }.} {x'0000'}
10610 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10620 34 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  45.4 {.  execsql
10630 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 70 41   {.    UPDATE pA
10640 20 53 45 54 20 78 20 3d 20 58 27 38 37 36 35 27   SET x = X'8765'
10650 20 57 48 45 52 45 20 78 20 3d 20 58 27 31 32 33   WHERE x = X'123
10660 34 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 71  4';.    SELECT q
10670 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41 3b  uote(x) FROM pA;
10680 0a 20 20 7d 0a 7d 20 7b 78 27 30 30 30 30 27 20  .  }.} {x'0000' 
10690 78 27 38 37 36 35 27 20 78 27 39 39 39 39 27 7d  x'8765' x'9999'}
106a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
106b0 34 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  45.5 {.  execsql
106c0 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28   { SELECT quote(
106d0 63 29 20 46 52 4f 4d 20 63 42 20 7d 0a 7d 20 7b  c) FROM cB }.} {
106e0 78 27 39 39 39 39 27 7d 0a 0a 23 2d 2d 2d 2d 2d  x'9999'}..#-----
106f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 44  ----.# Test ON D
10740 45 4c 45 54 45 20 43 41 53 43 41 44 45 20 61 63  ELETE CASCADE ac
10750 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  tions..#.# EVIDE
10760 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 37 36 2d  NCE-OF: R-61376-
10770 35 37 32 36 37 20 41 20 22 43 41 53 43 41 44 45  57267 A "CASCADE
10780 22 20 61 63 74 69 6f 6e 20 70 72 6f 70 61 67 61  " action propaga
10790 74 65 73 20 74 68 65 20 64 65 6c 65 74 65 20 6f  tes the delete o
107a0 72 0a 23 20 75 70 64 61 74 65 20 6f 70 65 72 61  r.# update opera
107b0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70 61 72 65  tion on the pare
107c0 6e 74 20 6b 65 79 20 74 6f 20 65 61 63 68 20 64  nt key to each d
107d0 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64 20 6b  ependent child k
107e0 65 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ey..#.# EVIDENCE
107f0 2d 4f 46 3a 20 52 2d 36 31 38 30 39 2d 36 32 32  -OF: R-61809-622
10800 30 37 20 46 6f 72 20 61 6e 20 22 4f 4e 20 44 45  07 For an "ON DE
10810 4c 45 54 45 20 43 41 53 43 41 44 45 22 20 61 63  LETE CASCADE" ac
10820 74 69 6f 6e 2c 20 74 68 69 73 0a 23 20 6d 65 61  tion, this.# mea
10830 6e 73 20 74 68 61 74 20 65 61 63 68 20 72 6f 77  ns that each row
10840 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 74 61   in the child ta
10850 62 6c 65 20 74 68 61 74 20 77 61 73 20 61 73 73  ble that was ass
10860 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10870 0a 23 20 64 65 6c 65 74 65 64 20 70 61 72 65 6e  .# deleted paren
10880 74 20 72 6f 77 20 69 73 20 61 6c 73 6f 20 64 65  t row is also de
10890 6c 65 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c  leted..#.drop_al
108a0 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
108b0 20 65 5f 66 6b 65 79 2d 34 36 2e 31 20 7b 0a 20   e_fkey-46.1 {. 
108c0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
108d0 52 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61  REATE TABLE p1(a
108e0 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
108f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
10900 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31  (c REFERENCES p1
10910 28 62 29 20 4f 4e 20 44 45 4c 45 54 45 20 43 41  (b) ON DELETE CA
10920 53 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49  SCADE, d);.    I
10930 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
10940 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
10950 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10960 4f 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O p1 VALUES(4, 4
10970 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10980 54 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20  TO p1 VALUES(5, 
10990 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  5);.    INSERT I
109a0 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55  NTO c1 VALUES(NU
109b0 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49  LL, NULL);.    I
109c0 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
109d0 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20  LUES(4, 4);.    
109e0 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
109f0 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20  ALUES(5, 5);.   
10a00 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
10a10 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20   FROM c1;.  }.} 
10a20 7b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {3}.do_test e_fk
10a30 65 79 2d 34 36 2e 32 20 7b 0a 20 20 65 78 65 63  ey-46.2 {.  exec
10a40 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
10a50 20 46 52 4f 4d 20 70 31 20 57 48 45 52 45 20 61   FROM p1 WHERE a
10a60 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 4;.    SELECT
10a70 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20   d, c FROM c1;. 
10a80 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 35 20 35 7d   }.} {{} {} 5 5}
10a90 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
10aa0 34 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  46.3 {.  execsql
10ab0 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
10ac0 4f 4d 20 70 31 3b 0a 20 20 20 20 53 45 4c 45 43  OM p1;.    SELEC
10ad0 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a  T d, c FROM c1;.
10ae0 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f    }.} {{} {}}.do
10af0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e  _test e_fkey-46.
10b00 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
10b10 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 31  SELECT * FROM p1
10b20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d   }.} {}...#-----
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 4f 4e 20 55  ----.# Test ON U
10b80 50 44 41 54 45 20 43 41 53 43 41 44 45 20 61 63  PDATE CASCADE ac
10b90 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45  tions..#.# EVIDE
10ba0 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 38 37 37 2d  NCE-OF: R-13877-
10bb0 36 34 35 34 32 20 46 6f 72 20 61 6e 20 22 4f 4e  64542 For an "ON
10bc0 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 22   UPDATE CASCADE"
10bd0 20 61 63 74 69 6f 6e 2c 20 69 74 20 6d 65 61 6e   action, it mean
10be0 73 0a 23 20 74 68 61 74 20 74 68 65 20 76 61 6c  s.# that the val
10bf0 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 65 61  ues stored in ea
10c00 63 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69  ch dependent chi
10c10 6c 64 20 6b 65 79 20 61 72 65 20 6d 6f 64 69 66  ld key are modif
10c20 69 65 64 20 74 6f 0a 23 20 6d 61 74 63 68 20 74  ied to.# match t
10c30 68 65 20 6e 65 77 20 70 61 72 65 6e 74 20 6b 65  he new parent ke
10c40 79 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45 56  y values..#.# EV
10c50 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33  IDENCE-OF: R-613
10c60 37 36 2d 35 37 32 36 37 20 41 20 22 43 41 53 43  76-57267 A "CASC
10c70 41 44 45 22 20 61 63 74 69 6f 6e 20 70 72 6f 70  ADE" action prop
10c80 61 67 61 74 65 73 20 74 68 65 20 64 65 6c 65 74  agates the delet
10c90 65 20 6f 72 0a 23 20 75 70 64 61 74 65 20 6f 70  e or.# update op
10ca0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 70  eration on the p
10cb0 61 72 65 6e 74 20 6b 65 79 20 74 6f 20 65 61 63  arent key to eac
10cc0 68 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c  h dependent chil
10cd0 64 20 6b 65 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c  d key..#.drop_al
10ce0 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
10cf0 20 65 5f 66 6b 65 79 2d 34 37 2e 31 20 7b 0a 20   e_fkey-47.1 {. 
10d00 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
10d10 52 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61  REATE TABLE p1(a
10d20 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
10d30 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
10d40 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 31  (c REFERENCES p1
10d50 28 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41  (b) ON UPDATE CA
10d60 53 43 41 44 45 2c 20 64 29 3b 0a 20 20 20 20 49  SCADE, d);.    I
10d70 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
10d80 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
10d90 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10da0 4f 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O p1 VALUES(4, 4
10db0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10dc0 54 4f 20 70 31 20 56 41 4c 55 45 53 28 35 2c 20  TO p1 VALUES(5, 
10dd0 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  5);.    INSERT I
10de0 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 4e 55  NTO c1 VALUES(NU
10df0 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49  LL, NULL);.    I
10e00 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10e10 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20  LUES(4, 4);.    
10e20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
10e30 41 4c 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20  ALUES(5, 5);.   
10e40 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
10e50 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20   FROM c1;.  }.} 
10e60 7b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {3}.do_test e_fk
10e70 65 79 2d 34 37 2e 32 20 7b 0a 20 20 65 78 65 63  ey-47.2 {.  exec
10e80 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
10e90 20 70 31 20 53 45 54 20 62 20 3d 20 31 30 20 57   p1 SET b = 10 W
10ea0 48 45 52 45 20 62 20 3d 20 35 3b 0a 20 20 20 20  HERE b = 5;.    
10eb0 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d  SELECT d, c FROM
10ec0 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b   c1;.  }.} {{} {
10ed0 7d 20 34 20 34 20 35 20 31 30 7d 0a 64 6f 5f 74  } 4 4 5 10}.do_t
10ee0 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 33 20  est e_fkey-47.3 
10ef0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10f00 20 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20    UPDATE p1 SET 
10f10 62 20 3d 20 31 31 20 57 48 45 52 45 20 62 20 3d  b = 11 WHERE b =
10f20 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64   4;.    SELECT d
10f30 2c 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d  , c FROM c1;.  }
10f40 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20 31 31 20 35  .} {{} {} 4 11 5
10f50 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   10}.do_test e_f
10f60 6b 65 79 2d 34 37 2e 34 20 7b 0a 20 20 65 78 65  key-47.4 {.  exe
10f70 63 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41  csql { .    UPDA
10f80 54 45 20 70 31 20 53 45 54 20 62 20 3d 20 36 20  TE p1 SET b = 6 
10f90 57 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 3b  WHERE b IS NULL;
10fa0 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 63  .    SELECT d, c
10fb0 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20   FROM c1;.  }.} 
10fc0 7b 7b 7d 20 7b 7d 20 34 20 31 31 20 35 20 31 30  {{} {} 4 11 5 10
10fd0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10fe0 2d 34 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -46.5 {.  execsq
10ff0 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
11000 4d 20 70 31 20 7d 0a 7d 20 7b 7b 7d 20 36 20 34  M p1 }.} {{} 6 4
11010 20 31 31 20 35 20 31 30 7d 0a 0a 23 2d 2d 2d 2d   11 5 10}..#----
11020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11060 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
11070 2d 4f 46 3a 20 52 2d 36 35 30 35 38 2d 35 37 31  -OF: R-65058-571
11080 35 38 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65  58.#.# Test an e
11090 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20  xample from the 
110a0 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f  "ON DELETE and O
110b0 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73  N UPDATE Actions
110c0 22 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20  " section .# of 
110d0 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c  foreignkeys.html
110e0 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
110f0 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
11100 65 79 2d 34 38 2e 31 20 7b 0a 20 20 65 78 65 63  ey-48.1 {.  exec
11110 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
11120 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
11130 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
11140 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
11150 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
11160 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
11170 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
11180 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
11190 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
111a0 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72  NTEGER,.      tr
111b0 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20  ackname   TEXT, 
111c0 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69  .      trackarti
111d0 73 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52  st INTEGER REFER
111e0 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72 74  ENCES artist(art
111f0 69 73 74 69 64 29 20 4f 4e 20 55 50 44 41 54 45  istid) ON UPDATE
11200 20 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a   CASCADE.    );.
11210 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11220 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 31   artist VALUES(1
11230 2c 20 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 29  , 'Dean Martin')
11240 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11250 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
11260 32 2c 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72  2, 'Frank Sinatr
11270 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
11280 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
11290 53 28 31 31 2c 20 27 54 68 61 74 27 27 73 20 41  S(11, 'That''s A
112a0 6d 6f 72 65 27 2c 20 31 29 3b 0a 20 20 20 20 49  more', 1);.    I
112b0 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b  NSERT INTO track
112c0 20 56 41 4c 55 45 53 28 31 32 2c 20 27 43 68 72   VALUES(12, 'Chr
112d0 69 73 74 6d 61 73 20 42 6c 75 65 73 27 2c 20 31  istmas Blues', 1
112e0 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
112f0 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
11300 31 33 2c 20 27 4d 79 20 57 61 79 27 2c 20 32 29  13, 'My Way', 2)
11310 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
11320 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 32 20 7b  st e_fkey-48.2 {
11330 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11340 20 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53   UPDATE artist S
11350 45 54 20 61 72 74 69 73 74 69 64 20 3d 20 31 30  ET artistid = 10
11360 30 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61  0 WHERE artistna
11370 6d 65 20 3d 20 27 44 65 61 6e 20 4d 61 72 74 69  me = 'Dean Marti
11380 6e 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  n';.  }.} {}.do_
11390 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 33  test e_fkey-48.3
113a0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
113b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 72 74  ELECT * FROM art
113c0 69 73 74 20 7d 0a 7d 20 7b 32 20 7b 46 72 61 6e  ist }.} {2 {Fran
113d0 6b 20 53 69 6e 61 74 72 61 7d 20 31 30 30 20 7b  k Sinatra} 100 {
113e0 44 65 61 6e 20 4d 61 72 74 69 6e 7d 7d 0a 64 6f  Dean Martin}}.do
113f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e  _test e_fkey-48.
11400 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
11410 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 72  SELECT * FROM tr
11420 61 63 6b 20 7d 0a 7d 20 7b 31 31 20 7b 54 68 61  ack }.} {11 {Tha
11430 74 27 73 20 41 6d 6f 72 65 7d 20 31 30 30 20 31  t's Amore} 100 1
11440 32 20 7b 43 68 72 69 73 74 6d 61 73 20 42 6c 75  2 {Christmas Blu
11450 65 73 7d 20 31 30 30 20 31 33 20 7b 4d 79 20 57  es} 100 13 {My W
11460 61 79 7d 20 32 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  ay} 2}...#------
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 2d 2d 2d 2d  ----------------
114b0 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61  ---.# Verify tha
114c0 74 20 61 64 64 69 6e 67 20 61 6e 20 46 4b 20 61  t adding an FK a
114d0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
114e0 62 73 6f 6c 76 65 20 74 68 65 20 75 73 65 72 20  bsolve the user 
114f0 6f 66 20 74 68 65 20 0a 23 20 72 65 71 75 69 72  of the .# requir
11500 65 6d 65 6e 74 20 6e 6f 74 20 74 6f 20 76 69 6f  ement not to vio
11510 6c 61 74 65 20 74 68 65 20 66 6f 72 65 69 67 6e  late the foreign
11520 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e   key constraint.
11530 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
11540 3a 20 52 2d 35 33 39 36 38 2d 35 31 36 34 32 20  : R-53968-51642 
11550 43 6f 6e 66 69 67 75 72 69 6e 67 20 61 6e 20 4f  Configuring an O
11560 4e 20 55 50 44 41 54 45 20 6f 72 20 4f 4e 20 44  N UPDATE or ON D
11570 45 4c 45 54 45 0a 23 20 61 63 74 69 6f 6e 20 64  ELETE.# action d
11580 6f 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68 61  oes not mean tha
11590 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
115a0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 64 6f 65  y constraint doe
115b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 23 20  s not need to.# 
115c0 62 65 20 73 61 74 69 73 66 69 65 64 2e 0a 23 0a  be satisfied..#.
115d0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
115e0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
115f0 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.1 {.  execsql 
11600 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
11610 4c 45 20 70 61 72 65 6e 74 28 61 20 43 4f 4c 4c  LE parent(a COLL
11620 41 54 45 20 6e 6f 63 61 73 65 2c 20 62 2c 20 63  ATE nocase, b, c
11630 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 2c  , PRIMARY KEY(c,
11640 20 61 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   a));.    CREATE
11650 20 54 41 42 4c 45 20 63 68 69 6c 64 28 64 20 44   TABLE child(d D
11660 45 46 41 55 4c 54 20 27 61 27 2c 20 65 2c 20 66  EFAULT 'a', e, f
11670 20 44 45 46 41 55 4c 54 20 27 63 27 2c 0a 20 20   DEFAULT 'c',.  
11680 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
11690 66 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  f, d) REFERENCES
116a0 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
116b0 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20  E SET DEFAULT.  
116c0 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54    );..    INSERT
116d0 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c   INTO parent VAL
116e0 55 45 53 28 27 41 27 2c 20 27 62 27 2c 20 27 63  UES('A', 'b', 'c
116f0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
11700 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
11710 53 28 27 4f 4e 45 27 2c 20 27 74 77 6f 27 2c 20  S('ONE', 'two', 
11720 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e  'three');.    IN
11730 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20  SERT INTO child 
11740 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74  VALUES('one', 't
11750 77 6f 27 2c 20 27 74 68 72 65 65 27 29 3b 0a 20  wo', 'three');. 
11760 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
11770 65 5f 66 6b 65 79 2d 34 39 2e 32 20 7b 0a 20 20  e_fkey-49.2 {.  
11780 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
11790 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
117a0 45 20 70 61 72 65 6e 74 20 53 45 54 20 61 20 3d  E parent SET a =
117b0 20 27 27 20 57 48 45 52 45 20 61 20 3d 20 27 6f   '' WHERE a = 'o
117c0 4e 65 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  Ne';.      SELEC
117d0 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a  T * FROM child;.
117e0 20 20 7d 0a 7d 20 7b 61 20 74 77 6f 20 63 7d 0a    }.} {a two c}.
117f0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
11800 39 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.3 {.  execsql 
11810 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  {.    ROLLBACK;.
11820 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
11830 70 61 72 65 6e 74 20 57 48 45 52 45 20 61 20 3d  parent WHERE a =
11840 20 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54   'A';.    SELECT
11850 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a   * FROM parent;.
11860 20 20 7d 0a 7d 20 7b 4f 4e 45 20 74 77 6f 20 74    }.} {ONE two t
11870 68 72 65 65 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  hree}.do_test e_
11880 66 6b 65 79 2d 34 39 2e 34 20 7b 0a 20 20 63 61  fkey-49.4 {.  ca
11890 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
118a0 70 61 72 65 6e 74 20 53 45 54 20 61 20 3d 20 27  parent SET a = '
118b0 27 20 57 48 45 52 45 20 61 20 3d 20 27 6f 4e 65  ' WHERE a = 'oNe
118c0 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ' }.} {1 {foreig
118d0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
118e0 20 66 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d   failed}}...#---
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
11940 45 2d 4f 46 3a 20 52 2d 31 31 38 35 36 2d 31 39  E-OF: R-11856-19
11950 38 33 36 0a 23 0a 23 20 54 65 73 74 20 61 6e 20  836.#.# Test an 
11960 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65  example from the
11970 20 22 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20   "ON DELETE and 
11980 4f 4e 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e  ON UPDATE Action
11990 73 22 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66  s" section .# of
119a0 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d   foreignkeys.htm
119b0 6c 2e 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20  l. This example 
119c0 73 68 6f 77 73 20 74 68 61 74 20 61 64 64 69 6e  shows that addin
119d0 67 20 61 6e 20 22 4f 4e 20 44 45 4c 45 54 45 20  g an "ON DELETE 
119e0 44 45 46 41 55 4c 54 22 0a 23 20 63 6c 61 75 73  DEFAULT".# claus
119f0 65 20 64 6f 65 73 20 6e 6f 74 20 61 62 72 6f 67  e does not abrog
11a00 61 74 65 20 74 68 65 20 6e 65 65 64 20 74 6f 20  ate the need to 
11a10 73 61 74 69 73 66 79 20 74 68 65 20 66 6f 72 65  satisfy the fore
11a20 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
11a30 6e 74 0a 23 20 28 52 2d 32 38 32 32 30 2d 34 36  nt.# (R-28220-46
11a40 36 39 34 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e  694)..#.# EVIDEN
11a50 43 45 2d 4f 46 3a 20 52 2d 32 38 32 32 30 2d 34  CE-OF: R-28220-4
11a60 36 36 39 34 20 46 6f 72 20 65 78 61 6d 70 6c 65  6694 For example
11a70 2c 20 69 66 20 61 6e 20 22 4f 4e 20 44 45 4c 45  , if an "ON DELE
11a80 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 22 0a  TE SET DEFAULT".
11a90 23 20 61 63 74 69 6f 6e 20 69 73 20 63 6f 6e 66  # action is conf
11aa0 69 67 75 72 65 64 2c 20 62 75 74 20 74 68 65 72  igured, but ther
11ab0 65 20 69 73 20 6e 6f 20 72 6f 77 20 69 6e 20 74  e is no row in t
11ac0 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
11ad0 74 68 61 74 0a 23 20 63 6f 72 72 65 73 70 6f 6e  that.# correspon
11ae0 64 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  ds to the defaul
11af0 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  t values of the 
11b00 63 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e  child key column
11b10 73 2c 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20  s, deleting a.# 
11b20 70 61 72 65 6e 74 20 6b 65 79 20 77 68 69 6c 65  parent key while
11b30 20 64 65 70 65 6e 64 65 6e 74 20 63 68 69 6c 64   dependent child
11b40 20 6b 65 79 73 20 65 78 69 73 74 20 73 74 69 6c   keys exist stil
11b50 6c 20 63 61 75 73 65 73 20 61 20 66 6f 72 65 69  l causes a forei
11b60 67 6e 20 6b 65 79 0a 23 20 76 69 6f 6c 61 74 69  gn key.# violati
11b70 6f 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  on..#.drop_all_t
11b80 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
11b90 66 6b 65 79 2d 35 30 2e 31 20 7b 0a 20 20 65 78  fkey-50.1 {.  ex
11ba0 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
11bb0 54 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28  TE TABLE artist(
11bc0 0a 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20  .      artistid 
11bd0 20 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41     INTEGER PRIMA
11be0 52 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61  RY KEY, .      a
11bf0 72 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a  rtistname  TEXT.
11c00 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
11c10 45 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20  E TABLE track(. 
11c20 20 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20       trackid    
11c30 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
11c40 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54  trackname   TEXT
11c50 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72  , .      trackar
11c60 74 69 73 74 20 49 4e 54 45 47 45 52 20 44 45 46  tist INTEGER DEF
11c70 41 55 4c 54 20 30 20 52 45 46 45 52 45 4e 43 45  AULT 0 REFERENCE
11c80 53 20 61 72 74 69 73 74 28 61 72 74 69 73 74 69  S artist(artisti
11c90 64 29 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54  d) ON DELETE SET
11ca0 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a   DEFAULT.    );.
11cb0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11cc0 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 33 2c  artist VALUES(3,
11cd0 20 27 53 61 6d 6d 79 20 44 61 76 69 73 20 4a 72   'Sammy Davis Jr
11ce0 2e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  .');.    INSERT 
11cf0 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
11d00 53 28 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e  S(14, 'Mr. Bojan
11d10 67 6c 65 73 27 2c 20 33 29 3b 0a 20 20 7d 0a 7d  gles', 3);.  }.}
11d20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
11d30 65 79 2d 35 30 2e 32 20 7b 0a 20 20 63 61 74 63  ey-50.2 {.  catc
11d40 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
11d50 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
11d60 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53 61  artistname = 'Sa
11d70 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 20 7d  mmy Davis Jr.' }
11d80 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
11d90 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
11da0 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
11db0 5f 66 6b 65 79 2d 35 30 2e 33 20 7b 0a 20 20 65  _fkey-50.3 {.  e
11dc0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
11dd0 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
11de0 56 41 4c 55 45 53 28 30 2c 20 27 55 6e 6b 6e 6f  VALUES(0, 'Unkno
11df0 77 6e 20 41 72 74 69 73 74 27 29 3b 0a 20 20 20  wn Artist');.   
11e00 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74   DELETE FROM art
11e10 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
11e20 6e 61 6d 65 20 3d 20 27 53 61 6d 6d 79 20 44 61  name = 'Sammy Da
11e30 76 69 73 20 4a 72 2e 27 3b 0a 20 20 7d 0a 7d 20  vis Jr.';.  }.} 
11e40 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
11e50 79 2d 35 30 2e 34 20 7b 0a 20 20 65 78 65 63 73  y-50.4 {.  execs
11e60 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
11e70 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b 30  OM artist }.} {0
11e80 20 7b 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74   {Unknown Artist
11e90 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
11ea0 79 2d 35 30 2e 35 20 7b 0a 20 20 65 78 65 63 73  y-50.5 {.  execs
11eb0 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
11ec0 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b 31 34  OM track }.} {14
11ed0 20 7b 4d 72 2e 20 42 6f 6a 61 6e 67 6c 65 73 7d   {Mr. Bojangles}
11ee0 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   0}..#----------
11ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11f30 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
11f40 2d 30 39 35 36 34 2d 32 32 31 37 30 0a 23 0a 23  -09564-22170.#.#
11f50 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
11f60 6f 72 64 65 72 20 6f 66 20 73 74 65 70 73 20 69  order of steps i
11f70 6e 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  n an UPDATE or D
11f80 45 4c 45 54 45 20 6f 6e 20 61 20 70 61 72 65 6e  ELETE on a paren
11f90 74 20 0a 23 20 74 61 62 6c 65 20 69 73 20 61 73  t .# table is as
11fa0 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20   follows:.#.#   
11fb0 31 2e 20 45 78 65 63 75 74 65 20 61 70 70 6c 69  1. Execute appli
11fc0 63 61 62 6c 65 20 42 45 46 4f 52 45 20 74 72 69  cable BEFORE tri
11fd0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2c 0a 23  gger programs,.#
11fe0 20 20 20 32 2e 20 43 68 65 63 6b 20 6c 6f 63 61     2. Check loca
11ff0 6c 20 28 6e 6f 6e 20 66 6f 72 65 69 67 6e 20 6b  l (non foreign k
12000 65 79 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ey) constraints,
12010 0a 23 20 20 20 33 2e 20 55 70 64 61 74 65 20 6f  .#   3. Update o
12020 72 20 64 65 6c 65 74 65 20 74 68 65 20 72 6f 77  r delete the row
12030 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   in the parent t
12040 61 62 6c 65 2c 0a 23 20 20 20 34 2e 20 50 65 72  able,.#   4. Per
12050 66 6f 72 6d 20 61 6e 79 20 72 65 71 75 69 72 65  form any require
12060 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63  d foreign key ac
12070 74 69 6f 6e 73 2c 0a 23 20 20 20 35 2e 20 45 78  tions,.#   5. Ex
12080 65 63 75 74 65 20 61 70 70 6c 69 63 61 62 6c 65  ecute applicable
12090 20 41 46 54 45 52 20 74 72 69 67 67 65 72 20 70   AFTER trigger p
120a0 72 6f 67 72 61 6d 73 2e 20 0a 23 0a 64 72 6f 70  rograms. .#.drop
120b0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
120c0 65 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 31 20  est e_fkey-51.1 
120d0 7b 0a 20 20 70 72 6f 63 20 6d 61 78 70 61 72 65  {.  proc maxpare
120e0 6e 74 20 7b 61 72 67 73 7d 20 7b 20 64 62 20 6f  nt {args} { db o
120f0 6e 65 20 7b 53 45 4c 45 43 54 20 6d 61 78 28 78  ne {SELECT max(x
12100 29 20 46 52 4f 4d 20 70 61 72 65 6e 74 7d 20 7d  ) FROM parent} }
12110 0a 20 20 64 62 20 66 75 6e 63 20 6d 61 78 70 61  .  db func maxpa
12120 72 65 6e 74 20 6d 61 78 70 61 72 65 6e 74 0a 0a  rent maxparent..
12130 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12140 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72  CREATE TABLE par
12150 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  ent(x PRIMARY KE
12160 59 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  Y);..    CREATE 
12170 54 52 49 47 47 45 52 20 62 75 20 42 45 46 4f 52  TRIGGER bu BEFOR
12180 45 20 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65  E UPDATE ON pare
12190 6e 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  nt BEGIN.      I
121a0 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
121b0 74 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2d 6f  t VALUES(new.x-o
121c0 6c 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ld.x);.    END;.
121d0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
121e0 20 63 68 69 6c 64 28 0a 20 20 20 20 20 20 61 20   child(.      a 
121f0 44 45 46 41 55 4c 54 20 28 6d 61 78 70 61 72 65  DEFAULT (maxpare
12200 6e 74 28 29 29 20 52 45 46 45 52 45 4e 43 45 53  nt()) REFERENCES
12210 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54   parent ON UPDAT
12220 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a 20 20  E SET DEFAULT.  
12230 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
12240 54 52 49 47 47 45 52 20 61 75 20 41 46 54 45 52  TRIGGER au AFTER
12250 20 55 50 44 41 54 45 20 4f 4e 20 70 61 72 65 6e   UPDATE ON paren
12260 74 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  t BEGIN.      IN
12270 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74  SERT INTO parent
12280 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b 6f 6c   VALUES(new.x+ol
12290 64 2e 78 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a  d.x);.    END;..
122a0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
122b0 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 29  parent VALUES(1)
122c0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
122d0 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 31  O child VALUES(1
122e0 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
122f0 65 73 74 20 65 5f 66 6b 65 79 2d 35 31 2e 32 20  est e_fkey-51.2 
12300 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12310 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20    UPDATE parent 
12320 53 45 54 20 78 20 3d 20 32 32 3b 0a 20 20 20 20  SET x = 22;.    
12330 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 61  SELECT * FROM pa
12340 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  rent UNION ALL S
12350 45 4c 45 43 54 20 27 78 78 78 27 20 55 4e 49 4f  ELECT 'xxx' UNIO
12360 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20 46  N ALL SELECT a F
12370 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d  ROM child;.  }.}
12380 20 7b 32 31 20 32 32 20 32 33 20 78 78 78 20 32   {21 22 23 xxx 2
12390 32 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  2}.do_test e_fke
123a0 79 2d 35 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-51.3 {.  execs
123b0 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
123c0 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 20 20  FROM child;.    
123d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
123e0 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  nt;.    INSERT I
123f0 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
12400 53 28 2d 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  S(-1);.    INSER
12410 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c  T INTO child VAL
12420 55 45 53 28 2d 31 29 3b 0a 20 20 20 20 55 50 44  UES(-1);.    UPD
12430 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 78  ATE parent SET x
12440 20 3d 20 32 32 3b 0a 20 20 20 20 53 45 4c 45 43   = 22;.    SELEC
12450 54 20 2a 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  T * FROM parent 
12460 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
12470 20 27 78 78 78 27 20 55 4e 49 4f 4e 20 41 4c 4c   'xxx' UNION ALL
12480 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 63   SELECT a FROM c
12490 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 32 31 20  hild;.  }.} {21 
124a0 32 32 20 32 33 20 78 78 78 20 32 33 7d 0a 0a 0a  22 23 xxx 23}...
124b0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72  ----------.# Ver
12500 69 66 79 20 74 68 61 74 20 4f 4e 20 55 50 44 41  ify that ON UPDA
12510 54 45 20 61 63 74 69 6f 6e 73 20 6f 6e 6c 79 20  TE actions only 
12520 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20 70 6c  actually take pl
12530 61 63 65 20 69 66 20 74 68 65 20 70 61 72 65 6e  ace if the paren
12540 74 20 6b 65 79 0a 23 20 69 73 20 73 65 74 20 74  t key.# is set t
12550 6f 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 68  o a new value th
12560 61 74 20 69 73 20 64 69 73 74 69 6e 63 74 20 66  at is distinct f
12570 72 6f 6d 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  rom the old valu
12580 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 0a 23  e. The default.#
12590 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
125a0 6e 63 65 20 61 6e 64 20 61 66 66 69 6e 69 74 79  nce and affinity
125b0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
125c0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
125d0 77 20 76 61 6c 75 65 0a 23 20 69 73 20 27 64 69  w value.# is 'di
125e0 73 74 69 6e 63 74 27 20 66 72 6f 6d 20 74 68 65  stinct' from the
125f0 20 6f 6c 64 20 6f 72 20 6e 6f 74 2e 0a 23 0a 23   old or not..#.#
12600 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12610 32 37 33 38 33 2d 31 30 32 34 36 20 41 6e 20 4f  27383-10246 An O
12620 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
12630 69 73 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 69 66  is only taken if
12640 20 74 68 65 0a 23 20 76 61 6c 75 65 73 20 6f 66   the.# values of
12650 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
12660 61 72 65 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  are modified so 
12670 74 68 61 74 20 74 68 65 20 6e 65 77 20 70 61 72  that the new par
12680 65 6e 74 20 6b 65 79 0a 23 20 76 61 6c 75 65 73  ent key.# values
12690 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 74   are not equal t
126a0 6f 20 74 68 65 20 6f 6c 64 2e 0a 23 0a 64 72 6f  o the old..#.dro
126b0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
126c0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 31  test e_fkey-52.1
126d0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
126e0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
126f0 7a 65 75 73 28 61 20 49 4e 54 45 47 45 52 20 43  zeus(a INTEGER C
12700 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62  OLLATE NOCASE, b
12710 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
12720 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   b));.    CREATE
12730 20 54 41 42 4c 45 20 61 70 6f 6c 6c 6f 28 63 2c   TABLE apollo(c,
12740 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
12750 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
12760 45 52 45 4e 43 45 53 20 7a 65 75 73 20 4f 4e 20  ERENCES zeus ON 
12770 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a 20  UPDATE CASCADE. 
12780 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
12790 20 49 4e 54 4f 20 7a 65 75 73 20 56 41 4c 55 45   INTO zeus VALUE
127a0 53 28 27 61 62 63 27 2c 20 27 78 79 7a 27 29 3b  S('abc', 'xyz');
127b0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
127c0 20 61 70 6f 6c 6c 6f 20 56 41 4c 55 45 53 28 27   apollo VALUES('
127d0 41 42 43 27 2c 20 27 78 79 7a 27 29 3b 0a 20 20  ABC', 'xyz');.  
127e0 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
127f0 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45    UPDATE zeus SE
12800 54 20 61 20 3d 20 27 61 42 63 27 3b 0a 20 20 20  T a = 'aBc';.   
12810 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
12820 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 41 42  pollo;.  }.} {AB
12830 43 20 78 79 7a 7d 0a 64 6f 5f 74 65 73 74 20 65  C xyz}.do_test e
12840 5f 66 6b 65 79 2d 35 32 2e 32 20 7b 0a 20 20 65  _fkey-52.2 {.  e
12850 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
12860 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20 3d  ATE zeus SET a =
12870 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20 20 53   1, b = 1;.    S
12880 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 70 6f  ELECT * FROM apo
12890 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 7d  llo;.  }.} {1 1}
128a0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
128b0 35 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  52.3 {.  execsql
128c0 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a 65   {.    UPDATE ze
128d0 75 73 20 53 45 54 20 61 20 3d 20 31 2c 20 62 20  us SET a = 1, b 
128e0 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 1;.    SELECT 
128f0 74 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79  typeof(c), c, ty
12900 70 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20  peof(d), d FROM 
12910 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69  apollo;.  }.} {i
12920 6e 74 65 67 65 72 20 31 20 69 6e 74 65 67 65 72  nteger 1 integer
12930 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
12940 65 79 2d 35 32 2e 34 20 7b 0a 20 20 65 78 65 63  ey-52.4 {.  exec
12950 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12960 20 7a 65 75 73 20 53 45 54 20 61 20 3d 20 27 31   zeus SET a = '1
12970 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79  ';.    SELECT ty
12980 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70 65  peof(c), c, type
12990 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61 70  of(d), d FROM ap
129a0 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74  ollo;.  }.} {int
129b0 65 67 65 72 20 31 20 69 6e 74 65 67 65 72 20 31  eger 1 integer 1
129c0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
129d0 2d 35 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -52.5 {.  execsq
129e0 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 7a  l {.    UPDATE z
129f0 65 75 73 20 53 45 54 20 62 20 3d 20 27 31 27 3b  eus SET b = '1';
12a00 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65  .    SELECT type
12a10 6f 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66  of(c), c, typeof
12a20 28 64 29 2c 20 64 20 46 52 4f 4d 20 61 70 6f 6c  (d), d FROM apol
12a30 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67  lo;.  }.} {integ
12a40 65 72 20 31 20 74 65 78 74 20 31 7d 0a 64 6f 5f  er 1 text 1}.do_
12a50 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 36  test e_fkey-52.6
12a60 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12a70 20 20 20 55 50 44 41 54 45 20 7a 65 75 73 20 53     UPDATE zeus S
12a80 45 54 20 62 20 3d 20 78 27 31 32 33 34 27 3b 0a  ET b = x'1234';.
12a90 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
12aa0 66 28 63 29 2c 20 63 2c 20 74 79 70 65 6f 66 28  f(c), c, typeof(
12ab0 64 29 2c 20 71 75 6f 74 65 28 64 29 20 46 52 4f  d), quote(d) FRO
12ac0 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20  M apollo;.  }.} 
12ad0 7b 69 6e 74 65 67 65 72 20 31 20 62 6c 6f 62 20  {integer 1 blob 
12ae0 78 27 31 32 33 34 27 7d 0a 0a 23 2d 2d 2d 2d 2d  x'1234'}..#-----
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b30 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
12b40 4f 46 3a 20 52 2d 33 35 31 32 39 2d 35 38 31 34  OF: R-35129-5814
12b50 31 0a 23 0a 23 20 54 65 73 74 20 61 6e 20 65 78  1.#.# Test an ex
12b60 61 6d 70 6c 65 20 66 72 6f 6d 20 74 68 65 20 22  ample from the "
12b70 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e  ON DELETE and ON
12b80 20 55 50 44 41 54 45 20 41 63 74 69 6f 6e 73 22   UPDATE Actions"
12b90 20 73 65 63 74 69 6f 6e 20 0a 23 20 6f 66 20 66   section .# of f
12ba0 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c 2e  oreignkeys.html.
12bb0 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 64 65   This example de
12bc0 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 61 74 20  monstrates that 
12bd0 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
12be0 73 0a 23 20 6f 6e 6c 79 20 74 61 6b 65 20 70 6c  s.# only take pl
12bf0 61 63 65 20 69 66 20 61 74 20 6c 65 61 73 74 20  ace if at least 
12c00 6f 6e 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63  one parent key c
12c10 6f 6c 75 6d 6e 20 69 73 20 73 65 74 20 74 6f 20  olumn is set to 
12c20 61 20 76 61 6c 75 65 20 0a 23 20 74 68 61 74 20  a value .# that 
12c30 69 73 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  is distinct from
12c40 20 69 74 73 20 70 72 65 76 69 6f 75 73 20 76 61   its previous va
12c50 6c 75 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  lue..#.drop_all_
12c60 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
12c70 5f 66 6b 65 79 2d 35 33 2e 31 20 7b 0a 20 20 65  _fkey-53.1 {.  e
12c80 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
12c90 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
12ca0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
12cb0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
12cc0 45 20 63 68 69 6c 64 28 79 20 52 45 46 45 52 45  E child(y REFERE
12cd0 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
12ce0 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b  PDATE SET NULL);
12cf0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
12d00 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27   parent VALUES('
12d10 6b 65 79 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  key');.    INSER
12d20 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56 41 4c  T INTO child VAL
12d30 55 45 53 28 27 6b 65 79 27 29 3b 0a 20 20 7d 0a  UES('key');.  }.
12d40 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
12d50 6b 65 79 2d 35 33 2e 32 20 7b 0a 20 20 65 78 65  key-53.2 {.  exe
12d60 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
12d70 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
12d80 20 27 6b 65 79 27 3b 0a 20 20 20 20 53 45 4c 45   'key';.    SELE
12d90 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20 27 6e 75  CT IFNULL(y, 'nu
12da0 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69 6c 64 3b  ll') FROM child;
12db0 0a 20 20 7d 0a 7d 20 7b 6b 65 79 7d 0a 64 6f 5f  .  }.} {key}.do_
12dc0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 33  test e_fkey-53.3
12dd0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12de0 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
12df0 20 53 45 54 20 78 20 3d 20 27 6b 65 79 32 27 3b   SET x = 'key2';
12e00 0a 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55  .    SELECT IFNU
12e10 4c 4c 28 79 2c 20 27 6e 75 6c 6c 27 29 20 46 52  LL(y, 'null') FR
12e20 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20  OM child;.  }.} 
12e30 7b 6e 75 6c 6c 7d 0a 0a 23 23 23 23 23 23 23 23  {null}..########
12e40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e80 23 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20  ###.### SECTION 
12e90 35 3a 20 43 52 45 41 54 45 2c 20 41 4c 54 45 52  5: CREATE, ALTER
12ea0 20 61 6e 64 20 44 52 4f 50 20 54 41 42 4c 45 20   and DROP TABLE 
12eb0 63 6f 6d 6d 61 6e 64 73 0a 23 23 23 23 23 23 23  commands.#######
12ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12ed0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12ee0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12ef0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f00 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ####..#---------
12f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f50 0a 23 20 54 65 73 74 20 74 68 61 74 20 70 61 72  .# Test that par
12f60 65 6e 74 20 6b 65 79 73 20 61 72 65 20 6e 6f 74  ent keys are not
12f70 20 63 68 65 63 6b 65 64 20 77 68 65 6e 20 74 61   checked when ta
12f80 62 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  bles are created
12f90 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
12fa0 46 3a 20 52 2d 33 36 30 31 38 2d 32 31 37 35 35  F: R-36018-21755
12fb0 20 54 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   The parent key 
12fc0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 66  definitions of f
12fd0 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e  oreign key.# con
12fe0 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74  straints are not
12ff0 20 63 68 65 63 6b 65 64 20 77 68 65 6e 20 61 20   checked when a 
13000 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64  table is created
13010 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
13020 46 3a 20 52 2d 32 35 33 38 34 2d 33 39 33 33 37  F: R-25384-39337
13030 20 54 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   There is nothin
13040 67 20 73 74 6f 70 70 69 6e 67 20 74 68 65 20 75  g stopping the u
13050 73 65 72 20 66 72 6f 6d 0a 23 20 63 72 65 61 74  ser from.# creat
13060 69 6e 67 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  ing a foreign ke
13070 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 74 68 61  y definition tha
13080 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 61  t refers to a pa
13090 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a  rent table that.
130a0 23 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  # does not exist
130b0 2c 20 6f 72 20 74 6f 20 70 61 72 65 6e 74 20 6b  , or to parent k
130c0 65 79 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ey columns that 
130d0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  do not exist or 
130e0 61 72 65 20 6e 6f 74 0a 23 20 63 6f 6c 6c 65 63  are not.# collec
130f0 74 69 76 65 6c 79 20 62 6f 75 6e 64 20 62 79 20  tively bound by 
13100 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
13110 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13120 6e 74 2e 0a 23 0a 23 20 43 68 69 6c 64 20 6b 65  nt..#.# Child ke
13130 79 73 20 61 72 65 20 63 68 65 63 6b 65 64 20 74  ys are checked t
13140 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6d  o ensure all com
13150 70 6f 6e 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 65  ponent columns e
13160 78 69 73 74 2e 20 49 66 20 70 61 72 65 6e 74 0a  xist. If parent.
13170 23 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 72  # key columns ar
13180 65 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  e explicitly spe
13190 63 69 66 69 65 64 2c 20 53 51 4c 69 74 65 20 63  cified, SQLite c
131a0 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65 20 73 75  hecks to make su
131b0 72 65 20 74 68 65 72 65 0a 23 20 61 72 65 20 74  re there.# are t
131c0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
131d0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
131e0 20 63 68 69 6c 64 20 61 6e 64 20 70 61 72 65 6e   child and paren
131f0 74 20 6b 65 79 73 2e 20 28 54 4f 44 4f 3a 20 54  t keys. (TODO: T
13200 68 69 73 0a 23 20 69 73 20 74 65 73 74 65 64 20  his.# is tested 
13210 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 72  but does not cor
13220 72 65 73 70 6f 6e 64 20 74 6f 20 61 6e 79 20 74  respond to any t
13230 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e  estable statemen
13240 74 2e 29 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73  t.).#.# Also tes
13250 74 20 74 68 61 74 20 74 68 65 20 61 62 6f 76 65  t that the above
13260 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
13270 74 72 75 65 20 72 65 67 61 72 64 6c 65 73 73 20  true regardless 
13280 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
13290 74 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  t.# foreign keys
132a0 20 61 72 65 20 65 6e 61 62 6c 65 64 3a 20 20 22   are enabled:  "
132b0 41 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63  A CREATE TABLE c
132c0 6f 6d 6d 61 6e 64 20 6f 70 65 72 61 74 65 73 20  ommand operates 
132d0 74 68 65 20 73 61 6d 65 20 77 68 65 74 68 65 72  the same whether
132e0 0a 23 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67  .# or not foreig
132f0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13300 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 22 0a  s are enabled.".
13310 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
13320 20 52 2d 30 38 39 30 38 2d 32 33 34 33 39 20 41   R-08908-23439 A
13330 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f   CREATE TABLE co
13340 6d 6d 61 6e 64 20 6f 70 65 72 61 74 65 73 20 74  mmand operates t
13350 68 65 20 73 61 6d 65 0a 23 20 77 68 65 74 68 65  he same.# whethe
13360 72 20 6f 72 20 6e 6f 74 20 66 6f 72 65 69 67 6e  r or not foreign
13370 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
13380 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 0a 23 20   are enabled..# 
13390 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a 43 72  .foreach {tn zCr
133a0 65 61 74 65 54 62 6c 20 6c 52 65 73 7d 20 7b 0a  eateTbl lRes} {.
133b0 20 20 31 20 22 43 52 45 41 54 45 20 54 41 42 4c    1 "CREATE TABL
133c0 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45  E t1(a, b REFERE
133d0 4e 43 45 53 20 74 31 29 22 20 20 20 20 20 20 20  NCES t1)"       
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 32 20       {0 {}}.  2 
13400 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13410 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
13420 20 74 32 29 22 20 20 20 20 20 20 20 20 20 20 20   t2)"           
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 7b 30 20 7b 7d 7d 0a 20 20 33 20 22 43 52 45   {0 {}}.  3 "CRE
13450 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13460 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
13470 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13480 31 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  1)"          {0 
13490 7b 7d 7d 0a 20 20 34 20 22 43 52 45 41 54 45 20  {}}.  4 "CREATE 
134a0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
134b0 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
134c0 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22 20  REFERENCES t2)" 
134d0 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
134e0 20 20 35 20 22 43 52 45 41 54 45 20 54 41 42 4c    5 "CREATE TABL
134f0 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
13500 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
13510 52 45 4e 43 45 53 20 74 32 29 22 20 20 20 20 20  RENCES t2)"     
13520 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 36 20       {0 {}}.  6 
13530 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
13540 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13550 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
13560 45 53 20 74 32 28 6e 2c 64 29 29 22 20 20 20 20  ES t2(n,d))"    
13570 20 7b 30 20 7b 7d 7d 0a 20 20 37 20 22 43 52 45   {0 {}}.  7 "CRE
13580 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13590 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
135a0 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
135b0 31 28 61 2c 62 29 29 22 20 20 20 20 20 7b 30 20  1(a,b))"     {0 
135c0 7b 7d 7d 0a 0a 20 20 41 20 22 43 52 45 41 54 45  {}}..  A "CREATE
135d0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
135e0 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 62 29  FOREIGN KEY(c,b)
135f0 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 22   REFERENCES t2)"
13600 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
13610 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  {1 {unknown colu
13620 6d 6e 20 22 63 22 20 69 6e 20 66 6f 72 65 69 67  mn "c" in foreig
13630 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
13640 7d 7d 0a 20 20 42 20 22 43 52 45 41 54 45 20 54  }}.  B "CREATE T
13650 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46 4f  ABLE t1(a, b, FO
13660 52 45 49 47 4e 20 4b 45 59 28 63 2c 62 29 20 52  REIGN KEY(c,b) R
13670 45 46 45 52 45 4e 43 45 53 20 74 32 28 64 29 29  EFERENCES t2(d))
13680 22 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  "          .    
13690 20 7b 31 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63   {1 {number of c
136a0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
136b0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
136c0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
136d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
136e0 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
136f0 6c 65 7d 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  le}}.} {.  do_te
13700 73 74 20 65 5f 66 6b 65 79 2d 35 34 2e 24 74 6e  st e_fkey-54.$tn
13710 2e 6f 66 66 20 7b 0a 20 20 20 20 64 72 6f 70 5f  .off {.    drop_
13720 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65  all_tables.    e
13730 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66  xecsql {PRAGMA f
13740 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46  oreign_keys = OF
13750 46 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  F}.    catchsql 
13760 24 7a 43 72 65 61 74 65 54 62 6c 0a 20 20 7d 20  $zCreateTbl.  } 
13770 24 6c 52 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  $lRes.  do_test 
13780 65 5f 66 6b 65 79 2d 35 34 2e 24 74 6e 2e 6f 6e  e_fkey-54.$tn.on
13790 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f   {.    drop_all_
137a0 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63 73  tables.    execs
137b0 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
137c0 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 7d 0a 20 20  gn_keys = ON}.  
137d0 20 20 63 61 74 63 68 73 71 6c 20 24 7a 43 72 65    catchsql $zCre
137e0 61 74 65 54 62 6c 0a 20 20 7d 20 24 6c 52 65 73  ateTbl.  } $lRes
137f0 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
13840 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13850 34 37 39 35 32 2d 36 32 34 39 38 20 49 74 20 69  47952-62498 It i
13860 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13870 6f 20 75 73 65 20 74 68 65 20 22 41 4c 54 45 52  o use the "ALTER
13880 20 54 41 42 4c 45 0a 23 20 2e 2e 2e 20 41 44 44   TABLE.# ... ADD
13890 20 43 4f 4c 55 4d 4e 22 20 73 79 6e 74 61 78 20   COLUMN" syntax 
138a0 74 6f 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20  to add a column 
138b0 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 61 20  that includes a 
138c0 52 45 46 45 52 45 4e 43 45 53 0a 23 20 63 6c 61  REFERENCES.# cla
138d0 75 73 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  use, unless the 
138e0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
138f0 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
13900 69 73 20 4e 55 4c 4c 2e 20 41 74 74 65 6d 70 74  is NULL. Attempt
13910 69 6e 67 0a 23 20 74 6f 20 64 6f 20 73 6f 20 72  ing.# to do so r
13920 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e  eturns an error.
13930 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b  .#.proc test_efk
13940 65 79 5f 36 20 7b 74 6e 20 7a 41 6c 74 65 72 20  ey_6 {tn zAlter 
13950 69 73 45 72 72 6f 72 7d 20 7b 0a 20 20 64 72 6f  isError} {.  dro
13960 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 20 0a 0a 20  p_all_tables .. 
13970 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
13980 35 36 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 65  56.$tn.1 ".    e
13990 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
139a0 54 41 42 4c 45 20 74 62 6c 28 61 2c 20 62 29 20  TABLE tbl(a, b) 
139b0 7d 0a 20 20 20 20 5b 6c 69 73 74 20 63 61 74 63  }.    [list catc
139c0 68 73 71 6c 20 24 7a 41 6c 74 65 72 5d 0a 20 20  hsql $zAlter].  
139d0 22 20 5b 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d  " [lindex {{0 {}
139e0 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64  } {1 {Cannot add
139f0 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f   a REFERENCES co
13a00 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55  lumn with non-NU
13a10 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
13a20 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 0a 7d  }}} $isError]..}
13a30 0a 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 31  ..test_efkey_6 1
13a40 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 62   "ALTER TABLE tb
13a50 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 52  l ADD COLUMN c R
13a60 45 46 45 52 45 4e 43 45 53 20 78 78 22 20 30 0a  EFERENCES xx" 0.
13a70 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 32 20 22  test_efkey_6 2 "
13a80 41 4c 54 45 52 20 54 41 42 4c 45 20 74 62 6c 20  ALTER TABLE tbl 
13a90 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46  ADD COLUMN c DEF
13aa0 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45  AULT NULL REFERE
13ab0 4e 43 45 53 20 78 78 22 20 30 0a 74 65 73 74 5f  NCES xx" 0.test_
13ac0 65 66 6b 65 79 5f 36 20 33 20 22 41 4c 54 45 52  efkey_6 3 "ALTER
13ad0 20 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43   TABLE tbl ADD C
13ae0 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20  OLUMN c DEFAULT 
13af0 30 20 52 45 46 45 52 45 4e 43 45 53 20 78 78 22  0 REFERENCES xx"
13b00 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   1..#-----------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
13b50 20 54 65 73 74 20 74 68 61 74 20 41 4c 54 45 52   Test that ALTER
13b60 20 54 41 42 4c 45 20 61 64 6a 75 73 74 73 20 52   TABLE adjusts R
13b70 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65  EFERENCES clause
13b80 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 65 6e  s when the paren
13b90 74 20 74 61 62 6c 65 0a 23 20 69 73 20 52 45 4e  t table.# is REN
13ba0 41 4d 45 44 2e 0a 23 0a 23 20 45 56 49 44 45 4e  AMED..#.# EVIDEN
13bb0 43 45 2d 4f 46 3a 20 52 2d 34 37 30 38 30 2d 30  CE-OF: R-47080-0
13bc0 32 30 36 39 20 49 66 20 61 6e 20 22 41 4c 54 45  2069 If an "ALTE
13bd0 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52 45 4e 41  R TABLE ... RENA
13be0 4d 45 20 54 4f 22 20 63 6f 6d 6d 61 6e 64 0a 23  ME TO" command.#
13bf0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 6e 61   is used to rena
13c00 6d 65 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  me a table that 
13c10 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  is the parent ta
13c20 62 6c 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  ble of one or mo
13c30 72 65 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79  re.# foreign key
13c40 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
13c50 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  e definitions of
13c60 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
13c70 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  .# constraints a
13c80 72 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  re modified to r
13c90 65 66 65 72 20 74 6f 20 74 68 65 20 70 61 72 65  efer to the pare
13ca0 6e 74 20 74 61 62 6c 65 20 62 79 20 69 74 73 20  nt table by its 
13cb0 6e 65 77 20 6e 61 6d 65 0a 23 0a 23 20 54 65 73  new name.#.# Tes
13cc0 74 20 74 68 61 74 20 74 68 65 73 65 20 61 64 6a  t that these adj
13cd0 75 73 74 6d 65 6e 74 73 20 61 72 65 20 76 69 73  ustments are vis
13ce0 69 62 6c 65 20 69 6e 20 74 68 65 20 73 71 6c 69  ible in the sqli
13cf0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
13d00 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
13d10 3a 20 52 2d 36 33 38 32 37 2d 35 34 37 37 34 20  : R-63827-54774 
13d20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
13d30 63 68 69 6c 64 20 43 52 45 41 54 45 20 54 41 42  child CREATE TAB
13d40 4c 45 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 6f  LE.# statement o
13d50 72 20 73 74 61 74 65 6d 65 6e 74 73 20 73 74 6f  r statements sto
13d60 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
13d70 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13d80 72 65 20 6d 6f 64 69 66 69 65 64 0a 23 20 74 6f  re modified.# to
13d90 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
13da0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
13db0 6d 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  me..#.do_test e_
13dc0 66 6b 65 79 2d 35 36 2e 31 20 7b 0a 20 20 64 72  fkey-56.1 {.  dr
13dd0 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
13de0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
13df0 45 41 54 45 20 54 41 42 4c 45 20 27 70 20 31 20  EATE TABLE 'p 1 
13e00 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 28 61 20  "parent one"'(a 
13e10 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20  REFERENCES 'p 1 
13e20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 2c 20 62  "parent one"', b
13e30 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 29  , PRIMARY KEY(b)
13e40 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
13e50 41 42 4c 45 20 63 31 28 63 2c 20 64 20 52 45 46  ABLE c1(c, d REF
13e60 45 52 45 4e 43 45 53 20 27 70 20 31 20 22 70 61  ERENCES 'p 1 "pa
13e70 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50  rent one"' ON UP
13e80 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20  DATE CASCADE);. 
13e90 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
13ea0 63 32 28 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e  c2(e, f, FOREIGN
13eb0 20 4b 45 59 28 66 29 20 52 45 46 45 52 45 4e 43   KEY(f) REFERENC
13ec0 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  ES 'p 1 "parent 
13ed0 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41 54 45 20  one"' ON UPDATE 
13ee0 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 43 52  CASCADE);.    CR
13ef0 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 65 2c  EATE TABLE c3(e,
13f00 20 27 66 20 63 6f 6c 20 32 27 2c 20 46 4f 52 45   'f col 2', FORE
13f10 49 47 4e 20 4b 45 59 28 27 66 20 63 6f 6c 20 32  IGN KEY('f col 2
13f20 27 29 20 52 45 46 45 52 45 4e 43 45 53 20 27 70  ') REFERENCES 'p
13f30 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
13f40 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
13f50 44 45 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  DE);..    INSERT
13f60 20 49 4e 54 4f 20 27 70 20 31 20 22 70 61 72 65   INTO 'p 1 "pare
13f70 6e 74 20 6f 6e 65 22 27 20 56 41 4c 55 45 53 28  nt one"' VALUES(
13f80 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 1);.    INSER
13f90 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
13fa0 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 1);.    INSE
13fb0 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
13fc0 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  S(1, 1);.    INS
13fd0 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
13fe0 45 53 28 31 2c 20 31 29 3b 0a 0a 20 20 20 20 2d  ES(1, 1);..    -
13ff0 2d 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 71  - CREATE TABLE q
14000 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  (a, b, PRIMARY K
14010 45 59 28 62 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  EY(b));.  }.} {}
14020 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14030 35 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  56.2 {.  execsql
14040 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 27   { ALTER TABLE '
14050 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22  p 1 "parent one"
14060 27 20 52 45 4e 41 4d 45 20 54 4f 20 70 20 7d 0a  ' RENAME TO p }.
14070 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
14080 6b 65 79 2d 35 36 2e 33 20 7b 0a 20 20 65 78 65  key-56.3 {.  exe
14090 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
140a0 45 20 70 20 53 45 54 20 61 20 3d 20 27 78 78 78  E p SET a = 'xxx
140b0 27 2c 20 62 20 3d 20 27 78 78 78 27 3b 0a 20 20  ', b = 'xxx';.  
140c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
140d0 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  p;.    SELECT * 
140e0 46 52 4f 4d 20 63 31 3b 0a 20 20 20 20 53 45 4c  FROM c1;.    SEL
140f0 45 43 54 20 2a 20 46 52 4f 4d 20 63 32 3b 0a 20  ECT * FROM c2;. 
14100 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
14110 20 63 33 3b 0a 20 20 7d 0a 7d 20 7b 78 78 78 20   c3;.  }.} {xxx 
14120 78 78 78 20 31 20 78 78 78 20 31 20 78 78 78 20  xxx 1 xxx 1 xxx 
14130 31 20 78 78 78 7d 0a 64 6f 5f 74 65 73 74 20 65  1 xxx}.do_test e
14140 5f 66 6b 65 79 2d 35 36 2e 34 20 7b 0a 20 20 65  _fkey-56.4 {.  e
14150 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
14160 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
14170 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
14180 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 7d 20 5b  e = 'table'}.} [
14190 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52           \.  {CR
141e0 45 41 54 45 20 54 41 42 4c 45 20 22 70 22 28 61  EATE TABLE "p"(a
141f0 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 2c   REFERENCES "p",
14200 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
14210 62 29 29 7d 20 20 20 20 20 20 20 20 20 20 20 20  b))}            
14220 20 20 20 20 20 20 20 5c 0a 20 20 7b 43 52 45 41         \.  {CREA
14230 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20 64  TE TABLE c1(c, d
14240 20 52 45 46 45 52 45 4e 43 45 53 20 22 70 22 20   REFERENCES "p" 
14250 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
14260 45 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  E)}             
14270 20 20 20 20 20 5c 0a 20 20 7b 43 52 45 41 54 45       \.  {CREATE
14280 20 54 41 42 4c 45 20 63 32 28 65 2c 20 66 2c 20   TABLE c2(e, f, 
14290 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 29 20 52  FOREIGN KEY(f) R
142a0 45 46 45 52 45 4e 43 45 53 20 22 70 22 20 4f 4e  EFERENCES "p" ON
142b0 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
142c0 7d 20 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54  }  \.  {CREATE T
142d0 41 42 4c 45 20 63 33 28 65 2c 20 27 66 20 63 6f  ABLE c3(e, 'f co
142e0 6c 20 32 27 2c 20 46 4f 52 45 49 47 4e 20 4b 45  l 2', FOREIGN KE
142f0 59 28 27 66 20 63 6f 6c 20 32 27 29 20 52 45 46  Y('f col 2') REF
14300 45 52 45 4e 43 45 53 20 22 70 22 20 4f 4e 20 55  ERENCES "p" ON U
14310 50 44 41 54 45 20 43 41 53 43 41 44 45 29 7d 20  PDATE CASCADE)} 
14320 5c 0a 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  \.]..#----------
14330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14370 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 20 44  # Check that a D
14380 52 4f 50 20 54 41 42 4c 45 20 64 6f 65 73 20 61  ROP TABLE does a
14390 6e 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54  n implicit DELET
143a0 45 20 46 52 4f 4d 2e 20 57 68 69 63 68 20 64 6f  E FROM. Which do
143b0 65 73 20 6e 6f 74 0a 23 20 63 61 75 73 65 20 61  es not.# cause a
143c0 6e 79 20 74 72 69 67 67 65 72 73 20 74 6f 20 66  ny triggers to f
143d0 69 72 65 2c 20 62 75 74 20 64 6f 65 73 20 66 69  ire, but does fi
143e0 72 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  re foreign key a
143f0 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44  ctions..#.# EVID
14400 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 32 30 38  ENCE-OF: R-14208
14410 2d 32 33 39 38 36 20 49 66 20 66 6f 72 65 69 67  -23986 If foreig
14420 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
14430 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20 77 68  s are enabled wh
14440 65 6e 0a 23 20 69 74 20 69 73 20 70 72 65 70 61  en.# it is prepa
14450 72 65 64 2c 20 74 68 65 20 44 52 4f 50 20 54 41  red, the DROP TA
14460 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 70 65 72 66  BLE command perf
14470 6f 72 6d 73 20 61 6e 20 69 6d 70 6c 69 63 69 74  orms an implicit
14480 20 44 45 4c 45 54 45 20 74 6f 0a 23 20 72 65 6d   DELETE to.# rem
14490 6f 76 65 20 61 6c 6c 20 72 6f 77 73 20 66 72 6f  ove all rows fro
144a0 6d 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  m the table befo
144b0 72 65 20 64 72 6f 70 70 69 6e 67 20 69 74 2e 0a  re dropping it..
144c0 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
144d0 20 52 2d 31 31 30 37 38 2d 30 33 39 34 35 20 54   R-11078-03945 T
144e0 68 65 20 69 6d 70 6c 69 63 69 74 20 44 45 4c 45  he implicit DELE
144f0 54 45 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  TE does not caus
14500 65 20 61 6e 79 20 53 51 4c 0a 23 20 74 72 69 67  e any SQL.# trig
14510 67 65 72 73 20 74 6f 20 66 69 72 65 2c 20 62 75  gers to fire, bu
14520 74 20 6d 61 79 20 69 6e 76 6f 6b 65 20 66 6f 72  t may invoke for
14530 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73  eign key actions
14540 20 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23   or constraint.#
14550 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 0a 23 0a 64   violations..#.d
14560 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37  o_test e_fkey-57
14570 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
14580 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
14590 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
145a0 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52 49 4d  BLE p(a, b, PRIM
145b0 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
145c0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
145d0 45 20 63 31 28 63 2c 20 64 2c 20 46 4f 52 45 49  E c1(c, d, FOREI
145e0 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
145f0 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14600 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20  ETE SET NULL);. 
14610 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14620 63 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  c2(c, d, FOREIGN
14630 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45 52   KEY(c, d) REFER
14640 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54  ENCES p ON DELET
14650 45 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a  E SET DEFAULT);.
14660 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
14670 20 63 33 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   c3(c, d, FOREIG
14680 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46 45  N KEY(c, d) REFE
14690 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c 45  RENCES p ON DELE
146a0 54 45 20 43 41 53 43 41 44 45 29 3b 0a 20 20 20  TE CASCADE);.   
146b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 34   CREATE TABLE c4
146c0 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
146d0 45 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e  EY(c, d) REFEREN
146e0 43 45 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20  CES p ON DELETE 
146f0 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
14700 52 45 41 54 45 20 54 41 42 4c 45 20 63 35 28 63  REATE TABLE c5(c
14710 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
14720 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
14730 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f  S p ON DELETE NO
14740 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20 43   ACTION);..    C
14750 52 45 41 54 45 20 54 41 42 4c 45 20 63 36 28 63  REATE TABLE c6(c
14760 2c 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45  , d, .      FORE
14770 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45  IGN KEY(c, d) RE
14780 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
14790 4c 45 54 45 20 52 45 53 54 52 49 43 54 20 0a 20  LETE RESTRICT . 
147a0 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20       DEFERRABLE 
147b0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
147c0 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  ED.    );.    CR
147d0 45 41 54 45 20 54 41 42 4c 45 20 63 37 28 63 2c  EATE TABLE c7(c,
147e0 20 64 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   d, .      FOREI
147f0 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52 45 46  GN KEY(c, d) REF
14800 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45 4c  ERENCES p ON DEL
14810 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20  ETE NO ACTION.  
14820 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49      DEFERRABLE I
14830 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
14840 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 43 52  D.    );..    CR
14850 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 6d  EATE TABLE log(m
14860 73 67 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  sg);.    CREATE 
14870 54 52 49 47 47 45 52 20 74 74 20 41 46 54 45 52  TRIGGER tt AFTER
14880 20 44 45 4c 45 54 45 20 4f 4e 20 70 20 42 45 47   DELETE ON p BEG
14890 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
148a0 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
148b0 27 64 65 6c 65 74 65 20 27 20 7c 7c 20 6f 6c 64  'delete ' || old
148c0 2e 61 20 7c 7c 20 27 7c 27 20 7c 7c 20 6f 6c 64  .a || '|' || old
148d0 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  .b);.    END;.  
148e0 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
148f0 65 5f 66 6b 65 79 2d 35 37 2e 32 20 7b 0a 20 20  e_fkey-57.2 {.  
14900 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
14910 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
14920 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
14930 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
14940 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
14950 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
14960 54 4f 20 63 32 20 56 41 4c 55 45 53 28 27 61 27  TO c2 VALUES('a'
14970 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'b');.    INSE
14980 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
14990 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
149a0 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 52   BEGIN;.      DR
149b0 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20  OP TABLE p;.    
149c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
149d0 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
149e0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
149f0 2d 35 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -57.3 {.  execsq
14a00 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
14a10 4d 20 63 32 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d  M c2 }.} {{} {}}
14a20 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
14a30 35 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  57.4 {.  execsql
14a40 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
14a50 20 63 33 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   c3 }.} {}.do_te
14a60 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 35 20 7b  st e_fkey-57.5 {
14a70 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
14a80 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 20 7d  ECT * FROM log }
14a90 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
14aa0 66 6b 65 79 2d 35 37 2e 36 20 7b 0a 20 20 65 78  fkey-57.6 {.  ex
14ab0 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d  ecsql ROLLBACK.}
14ac0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
14ad0 65 79 2d 35 37 2e 37 20 7b 0a 20 20 65 78 65 63  ey-57.7 {.  exec
14ae0 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
14af0 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
14b00 4f 4d 20 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  OM p;.      SELE
14b10 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
14b20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
14b30 0a 7d 20 7b 7b 64 65 6c 65 74 65 20 61 7c 62 7d  .} {{delete a|b}
14b40 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
14b90 49 66 20 61 6e 20 49 4d 4d 45 44 49 41 54 45 20  If an IMMEDIATE 
14ba0 66 6f 72 65 69 67 6e 20 6b 65 79 20 66 61 69 6c  foreign key fail
14bb0 73 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  s as a result of
14bc0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 74   a DROP TABLE, t
14bd0 68 65 0a 23 20 44 52 4f 50 20 54 41 42 4c 45 20  he.# DROP TABLE 
14be0 63 6f 6d 6d 61 6e 64 20 66 61 69 6c 73 2e 0a 23  command fails..#
14bf0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
14c00 52 2d 33 32 37 36 38 2d 34 37 39 32 35 20 49 66  R-32768-47925 If
14c10 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 66 6f   an immediate fo
14c20 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14c30 61 69 6e 74 20 69 73 0a 23 20 76 69 6f 6c 61 74  aint is.# violat
14c40 65 64 2c 20 74 68 65 20 44 52 4f 50 20 54 41 42  ed, the DROP TAB
14c50 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66 61 69  LE statement fai
14c60 6c 73 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ls and the table
14c70 20 69 73 20 6e 6f 74 20 64 72 6f 70 70 65 64 2e   is not dropped.
14c80 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
14c90 79 2d 35 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-58.1 {.  execs
14ca0 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45  ql { .    DELETE
14cb0 20 46 52 4f 4d 20 63 31 3b 0a 20 20 20 20 44 45   FROM c1;.    DE
14cc0 4c 45 54 45 20 46 52 4f 4d 20 63 32 3b 0a 20 20  LETE FROM c2;.  
14cd0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 33    DELETE FROM c3
14ce0 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
14cf0 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 35  { INSERT INTO c5
14d00 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
14d10 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  ) }.  catchsql {
14d20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 20 7d 0a   DROP TABLE p }.
14d30 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
14d40 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
14d50 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
14d60 66 6b 65 79 2d 35 38 2e 32 20 7b 0a 20 20 65 78  fkey-58.2 {.  ex
14d70 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
14d80 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 61 20 62   FROM p }.} {a b
14d90 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
14da0 2d 35 38 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -58.3 {.  catchs
14db0 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
14dc0 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
14dd0 20 70 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f   p;.  }.} {1 {fo
14de0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14df0 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
14e00 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e  _test e_fkey-58.
14e10 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
14e20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
14e30 4d 20 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  M p;.    SELECT 
14e40 2a 20 46 52 4f 4d 20 63 35 3b 0a 20 20 20 20 52  * FROM c5;.    R
14e50 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
14e60 61 20 62 20 61 20 62 7d 0a 0a 23 2d 2d 2d 2d 2d  a b a b}..#-----
14e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14eb0 2d 2d 2d 2d 0a 23 20 49 66 20 61 20 44 45 46 45  ----.# If a DEFE
14ec0 52 52 45 44 20 66 6f 72 65 69 67 6e 20 6b 65 79  RRED foreign key
14ed0 20 66 61 69 6c 73 20 61 73 20 61 20 72 65 73 75   fails as a resu
14ee0 6c 74 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  lt of a DROP TAB
14ef0 4c 45 2c 20 61 74 74 65 6d 70 74 69 6e 67 0a 23  LE, attempting.#
14f00 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
14f10 72 61 6e 73 61 63 74 69 6f 6e 20 66 61 69 6c 73  ransaction fails
14f20 20 75 6e 6c 65 73 73 20 74 68 65 20 76 69 6f 6c   unless the viol
14f30 61 74 69 6f 6e 20 69 73 20 66 69 78 65 64 2e 0a  ation is fixed..
14f40 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
14f50 20 52 2d 30 35 39 30 33 2d 30 38 34 36 30 20 49   R-05903-08460 I
14f60 66 20 61 20 64 65 66 65 72 72 65 64 20 66 6f 72  f a deferred for
14f70 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
14f80 69 6e 74 20 69 73 0a 23 20 76 69 6f 6c 61 74 65  int is.# violate
14f90 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72  d, then an error
14fa0 20 69 73 20 72 65 70 6f 72 74 65 64 20 77 68 65   is reported whe
14fb0 6e 20 74 68 65 20 75 73 65 72 20 61 74 74 65 6d  n the user attem
14fc0 70 74 73 20 74 6f 20 63 6f 6d 6d 69 74 0a 23 20  pts to commit.# 
14fd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14fe0 69 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  if the foreign k
14ff0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ey constraint vi
15000 6f 6c 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 65  olations still e
15010 78 69 73 74 0a 23 20 61 74 20 74 68 61 74 20 70  xist.# at that p
15020 6f 69 6e 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  oint..#.do_test 
15030 65 5f 66 6b 65 79 2d 35 39 2e 31 20 7b 0a 20 20  e_fkey-59.1 {.  
15040 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44  execsql { .    D
15050 45 4c 45 54 45 20 46 52 4f 4d 20 63 31 20 3b 20  ELETE FROM c1 ; 
15060 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 32 20 3b  DELETE FROM c2 ;
15070 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 33 20   DELETE FROM c3 
15080 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
15090 4d 20 63 34 20 3b 20 44 45 4c 45 54 45 20 46 52  M c4 ; DELETE FR
150a0 4f 4d 20 63 35 20 3b 20 44 45 4c 45 54 45 20 46  OM c5 ; DELETE F
150b0 52 4f 4d 20 63 36 20 3b 0a 20 20 20 20 44 45 4c  ROM c6 ;.    DEL
150c0 45 54 45 20 46 52 4f 4d 20 63 37 20 0a 20 20 7d  ETE FROM c7 .  }
150d0 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
150e0 66 6b 65 79 2d 35 39 2e 32 20 7b 0a 20 20 65 78  fkey-59.2 {.  ex
150f0 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
15100 4e 54 4f 20 63 37 20 56 41 4c 55 45 53 28 27 61  NTO c7 VALUES('a
15110 27 2c 20 27 62 27 29 20 7d 0a 20 20 65 78 65 63  ', 'b') }.  exec
15120 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
15130 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
15140 45 20 70 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  E p;.  }.} {}.do
15150 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e  _test e_fkey-59.
15160 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 43  3 {.  catchsql C
15170 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65  OMMIT.} {1 {fore
15180 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
15190 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
151a0 65 73 74 20 65 5f 66 6b 65 79 2d 35 39 2e 34 20  est e_fkey-59.4 
151b0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  {.  execsql { CR
151c0 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20  EATE TABLE p(a, 
151d0 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
151e0 2c 20 62 29 29 20 7d 0a 20 20 63 61 74 63 68 73  , b)) }.  catchs
151f0 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
15200 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
15210 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
15220 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
15230 39 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.5 {.  execsql 
15240 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20  { INSERT INTO p 
15250 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
15260 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   }.  execsql COM
15270 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  MIT.} {}..#-----
15280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 0a 23 20 41 6e 79 20 22 66 6f 72 65  ----.# Any "fore
152d0 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
152e0 22 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  " errors encount
152f0 65 72 65 64 20 77 68 69 6c 65 20 72 75 6e 6e 69  ered while runni
15300 6e 67 20 61 6e 20 69 6d 70 6c 69 63 69 74 0a 23  ng an implicit.#
15310 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62   "DELETE FROM tb
15320 6c 22 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  l" are ignored..
15330 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
15340 20 52 2d 35 37 32 34 32 2d 33 37 30 30 35 20 41   R-57242-37005 A
15350 6e 79 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  ny "foreign key 
15360 6d 69 73 6d 61 74 63 68 22 20 65 72 72 6f 72 73  mismatch" errors
15370 0a 23 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  .# encountered a
15380 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6d 70  s part of an imp
15390 6c 69 63 69 74 20 44 45 4c 45 54 45 20 61 72 65  licit DELETE are
153a0 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 72 6f 70   ignored..#.drop
153b0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
153c0 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 31 20  est e_fkey-60.1 
153d0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
153e0 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
153f0 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 0a 20 20  _keys = OFF;..  
15400 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
15410 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
15420 62 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73  b REFERENCES nos
15430 75 63 68 74 61 62 6c 65 29 3b 0a 20 20 20 20 43  uchtable);.    C
15440 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 63  REATE TABLE c1(c
15450 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
15460 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (c, d) REFERENCE
15470 53 20 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45  S a);.    CREATE
15480 20 54 41 42 4c 45 20 63 32 28 63 20 52 45 46 45   TABLE c2(c REFE
15490 52 45 4e 43 45 53 20 70 28 62 29 2c 20 64 29 3b  RENCES p(b), d);
154a0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
154b0 45 20 63 33 28 63 20 52 45 46 45 52 45 4e 43 45  E c3(c REFERENCE
154c0 53 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45  S p ON DELETE SE
154d0 54 20 4e 55 4c 4c 2c 20 64 29 3b 0a 0a 20 20 20  T NULL, d);..   
154e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56   INSERT INTO p V
154f0 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
15500 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
15510 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
15520 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32    INSERT INTO c2
15530 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
15540 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
15550 33 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  3 VALUES(1, 2);.
15560 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
15570 20 65 5f 66 6b 65 79 2d 36 30 2e 32 20 7b 0a 20   e_fkey-60.2 {. 
15580 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
15590 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
155a0 20 4f 4e 20 7d 0a 20 20 63 61 74 63 68 73 71 6c   ON }.  catchsql
155b0 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
155c0 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68   }.} {1 {no such
155d0 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73   table: main.nos
155e0 75 63 68 74 61 62 6c 65 7d 7d 0a 0a 64 6f 5f 74  uchtable}}..do_t
155f0 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 33 20  est e_fkey-60.3 
15600 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
15610 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
15620 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 20  ROP TABLE p;.   
15630 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
15640 20 63 33 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   c3;.    ROLLBAC
15650 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 32 7d 0a  K;.  }.} {{} 2}.
15660 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15670 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.4 {.  execsql 
15680 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6e  { CREATE TABLE n
15690 6f 73 75 63 68 74 61 62 6c 65 28 78 20 50 52 49  osuchtable(x PRI
156a0 4d 41 52 59 20 4b 45 59 29 20 7d 0a 20 20 63 61  MARY KEY) }.  ca
156b0 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
156c0 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 31 20 7b 66  FROM p }.} {1 {f
156d0 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
156e0 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  tch}}.do_test e_
156f0 66 6b 65 79 2d 36 30 2e 35 20 7b 0a 20 20 65 78  fkey-60.5 {.  ex
15700 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  ecsql { DROP TAB
15710 4c 45 20 63 31 20 7d 0a 20 20 63 61 74 63 68 73  LE c1 }.  catchs
15720 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
15730 20 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69   p }.} {1 {forei
15740 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d  gn key mismatch}
15750 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15760 2d 36 30 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -60.6 {.  execsq
15770 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 63  l { DROP TABLE c
15780 32 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 }.  execsql { 
15790 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a  DELETE FROM p }.
157a0 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65  .# Test that the
15800 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   special behavio
15810 75 72 73 20 6f 66 20 41 4c 54 45 52 20 61 6e 64  urs of ALTER and
15820 20 44 52 4f 50 20 54 41 42 4c 45 20 61 72 65 20   DROP TABLE are 
15830 6f 6e 6c 79 0a 23 20 61 63 74 69 76 61 74 65 64  only.# activated
15840 20 77 68 65 6e 20 66 6f 72 65 69 67 6e 20 6b 65   when foreign ke
15850 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e 20  ys are enabled. 
15860 53 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75  Special behaviou
15870 72 73 20 61 72 65 3a 0a 23 0a 23 20 20 20 31 2e  rs are:.#.#   1.
15880 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6e 6f 74 20   ADD COLUMN not 
15890 61 6c 6c 6f 77 69 6e 67 20 61 20 52 45 46 45 52  allowing a REFER
158a0 45 4e 43 45 53 20 63 6c 61 75 73 65 20 77 69 74  ENCES clause wit
158b0 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 0a 23 20  h a non-NULL .# 
158c0 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c       default val
158d0 75 65 2e 0a 23 20 20 20 32 2e 20 4d 6f 64 69 66  ue..#   2. Modif
158e0 79 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  ying foreign key
158f0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 77 68 65   definitions whe
15900 6e 20 61 20 70 61 72 65 6e 74 20 74 61 62 6c 65  n a parent table
15910 20 69 73 20 52 45 4e 41 4d 45 64 2e 0a 23 20 20   is RENAMEd..#  
15920 20 33 2e 20 52 75 6e 6e 69 6e 67 20 61 6e 20 69   3. Running an i
15930 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20 46  mplicit DELETE F
15940 52 4f 4d 20 63 6f 6d 6d 61 6e 64 20 61 73 20 70  ROM command as p
15950 61 72 74 20 6f 66 20 44 52 4f 50 20 54 41 42 4c  art of DROP TABL
15960 45 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  E..#.# EVIDENCE-
15970 4f 46 3a 20 52 2d 35 34 31 34 32 2d 34 31 33 34  OF: R-54142-4134
15980 36 20 54 68 65 20 70 72 6f 70 65 72 74 69 65 73  6 The properties
15990 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54 41 42   of the DROP TAB
159a0 4c 45 20 61 6e 64 20 41 4c 54 45 52 0a 23 20 54  LE and ALTER.# T
159b0 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73 20 64 65  ABLE commands de
159c0 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 6f 6e  scribed above on
159d0 6c 79 20 61 70 70 6c 79 20 69 66 20 66 6f 72 65  ly apply if fore
159e0 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e 61  ign keys are ena
159f0 62 6c 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  bled..#.do_test 
15a00 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 31 20 7b 0a  e_fkey-61.1.1 {.
15a10 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
15a20 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  s.  execsql { CR
15a30 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
15a40 20 62 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c   b) }.  catchsql
15a50 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
15a60 31 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 44  1 ADD COLUMN c D
15a70 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45 46  EFAULT 'xxx' REF
15a80 45 52 45 4e 43 45 53 20 74 32 20 7d 0a 7d 20 7b  ERENCES t2 }.} {
15a90 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61 20  1 {Cannot add a 
15aa0 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75 6d  REFERENCES colum
15ab0 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20  n with non-NULL 
15ac0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d 0a  default value}}.
15ad0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
15ae0 31 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1.1.2 {.  execsq
15af0 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
15b00 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 20 7d 0a  gn_keys = OFF }.
15b10 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45    execsql { ALTE
15b20 52 20 54 41 42 4c 45 20 74 31 20 41 44 44 20 43  R TABLE t1 ADD C
15b30 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c 54 20  OLUMN c DEFAULT 
15b40 27 78 78 78 27 20 52 45 46 45 52 45 4e 43 45 53  'xxx' REFERENCES
15b50 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   t2 }.  execsql 
15b60 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f  { SELECT sql FRO
15b70 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15b80 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 74 31  WHERE name = 't1
15b90 27 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54  ' }.} {{CREATE T
15ba0 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 20  ABLE t1(a, b, c 
15bb0 44 45 46 41 55 4c 54 20 27 78 78 78 27 20 52 45  DEFAULT 'xxx' RE
15bc0 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d 0a 64  FERENCES t2)}}.d
15bd0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
15be0 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
15bf0 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
15c00 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20  n_keys = ON }.} 
15c10 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
15c20 65 79 2d 36 31 2e 32 2e 31 20 7b 0a 20 20 64 72  ey-61.2.1 {.  dr
15c30 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
15c40 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
15c50 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55  EATE TABLE p(a U
15c60 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
15c70 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
15c80 45 52 45 4e 43 45 53 20 70 28 61 29 29 3b 0a 20  ERENCES p(a));. 
15c90 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
15ca0 41 4c 54 45 52 20 54 41 42 4c 45 20 70 20 52 45  ALTER TABLE p RE
15cb0 4e 41 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a  NAME TO parent;.
15cc0 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c        SELECT sql
15cd0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
15ce0 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d  ter WHERE name =
15cf0 20 27 63 27 3b 0a 20 20 20 20 52 4f 4c 4c 42 41   'c';.    ROLLBA
15d00 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41  CK;.  }.} {{CREA
15d10 54 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46  TE TABLE c(b REF
15d20 45 52 45 4e 43 45 53 20 22 70 61 72 65 6e 74 22  ERENCES "parent"
15d30 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  (a))}}.do_test e
15d40 5f 66 6b 65 79 2d 36 31 2e 32 2e 32 20 7b 0a 20  _fkey-61.2.2 {. 
15d50 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
15d60 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
15d70 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 41 4c  ys = OFF;.    AL
15d80 54 45 52 20 54 41 42 4c 45 20 70 20 52 45 4e 41  TER TABLE p RENA
15d90 4d 45 20 54 4f 20 70 61 72 65 6e 74 3b 0a 20 20  ME TO parent;.  
15da0 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f    SELECT sql FRO
15db0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15dc0 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 63 27  WHERE name = 'c'
15dd0 3b 0a 20 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45  ;.  }.} {{CREATE
15de0 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45 52   TABLE c(b REFER
15df0 45 4e 43 45 53 20 70 28 61 29 29 7d 7d 0a 64 6f  ENCES p(a))}}.do
15e00 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
15e10 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
15e20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
15e30 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20 7b  _keys = ON }.} {
15e40 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }..do_test e_fke
15e50 79 2d 36 31 2e 33 2e 31 20 7b 0a 20 20 64 72 6f  y-61.3.1 {.  dro
15e60 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
15e70 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
15e80 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 55 4e  ATE TABLE p(a UN
15e90 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41 54  IQUE);.    CREAT
15ea0 45 20 54 41 42 4c 45 20 63 28 62 20 52 45 46 45  E TABLE c(b REFE
15eb0 52 45 4e 43 45 53 20 70 28 61 29 20 4f 4e 20 44  RENCES p(a) ON D
15ec0 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b  ELETE SET NULL);
15ed0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
15ee0 20 70 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a   p VALUES('x');.
15ef0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
15f00 63 20 56 41 4c 55 45 53 28 27 78 27 29 3b 0a 20  c VALUES('x');. 
15f10 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
15f20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
15f30 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
15f40 4d 20 63 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  M c;.    ROLLBAC
15f50 4b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f  K;.  }.} {{}}.do
15f60 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
15f70 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
15f80 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72  {.    PRAGMA for
15f90 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
15fa0 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
15fb0 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  p;.    SELECT * 
15fc0 46 52 4f 4d 20 63 3b 0a 20 20 7d 0a 7d 20 7b 78  FROM c;.  }.} {x
15fd0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
15fe0 2d 36 31 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  -61.3.3 {.  exec
15ff0 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
16000 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d  eign_keys = ON }
16010 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23  .} {}..#########
16020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16060 23 23 0a 23 23 23 20 53 45 43 54 49 4f 4e 20 36  ##.### SECTION 6
16070 3a 20 4c 69 6d 69 74 73 20 61 6e 64 20 55 6e 73  : Limits and Uns
16080 75 70 70 6f 72 74 65 64 20 46 65 61 74 75 72 65  upported Feature
16090 73 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  s.##############
160a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
160b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
160c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
160d0 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
160e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
160f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16120 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
16130 20 74 68 61 74 20 4d 41 54 43 48 20 63 6c 61 75   that MATCH clau
16140 73 65 73 20 61 72 65 20 70 61 72 73 65 64 2c 20  ses are parsed, 
16150 62 75 74 20 53 51 4c 69 74 65 20 74 72 65 61 74  but SQLite treat
16160 73 20 65 76 65 72 79 20 66 6f 72 65 69 67 6e 20  s every foreign 
16170 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  key.# constraint
16180 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 22   as if it were "
16190 4d 41 54 43 48 20 53 49 4d 50 4c 45 22 2e 0a 23  MATCH SIMPLE"..#
161a0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
161b0 52 2d 32 34 37 32 38 2d 31 33 32 33 30 20 53 51  R-24728-13230 SQ
161c0 4c 69 74 65 20 70 61 72 73 65 73 20 4d 41 54 43  Lite parses MATC
161d0 48 20 63 6c 61 75 73 65 73 20 28 69 2e 65 2e 20  H clauses (i.e. 
161e0 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 70 6f 72  does not.# repor
161f0 74 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  t a syntax error
16200 20 69 66 20 79 6f 75 20 73 70 65 63 69 66 79 20   if you specify 
16210 6f 6e 65 29 2c 20 62 75 74 20 64 6f 65 73 20 6e  one), but does n
16220 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 65 6d 2e  ot enforce them.
16230 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
16240 3a 20 52 2d 32 34 34 35 30 2d 34 36 31 37 34 20  : R-24450-46174 
16250 41 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  All foreign key 
16260 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 53  constraints in S
16270 51 4c 69 74 65 20 61 72 65 0a 23 20 68 61 6e 64  QLite are.# hand
16280 6c 65 64 20 61 73 20 69 66 20 4d 41 54 43 48 20  led as if MATCH 
16290 53 49 4d 50 4c 45 20 77 65 72 65 20 73 70 65 63  SIMPLE were spec
162a0 69 66 69 65 64 2e 0a 23 0a 66 6f 72 65 61 63 68  ified..#.foreach
162b0 20 7a 4d 61 74 63 68 20 5b 6c 69 73 74 20 53 49   zMatch [list SI
162c0 4d 50 4c 45 20 50 41 52 54 49 41 4c 20 46 55 4c  MPLE PARTIAL FUL
162d0 4c 20 53 69 6d 70 6c 65 20 70 61 72 54 49 41 4c  L Simple parTIAL
162e0 20 46 75 4c 4c 20 5d 20 7b 0a 20 20 64 72 6f 70   FuLL ] {.  drop
162f0 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f  _all_tables.  do
16300 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16310 24 7a 4d 61 74 63 68 2e 31 20 7b 0a 20 20 20 20  $zMatch.1 {.    
16320 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
16330 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 64  CREATE TABLE c(d
16340 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20  , e, f, FOREIGN 
16350 4b 45 59 28 65 2c 20 66 29 20 52 45 46 45 52 45  KEY(e, f) REFERE
16360 4e 43 45 53 20 70 20 4d 41 54 43 48 20 24 7a 4d  NCES p MATCH $zM
16370 61 74 63 68 29 3b 0a 20 20 20 20 20 20 43 52 45  atch);.      CRE
16380 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62  ATE TABLE p(a, b
16390 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
163a0 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 22 0a 20  (b, c));.    ". 
163b0 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
163c0 65 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74 63  e_fkey-62.$zMatc
163d0 68 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  h.2 {.    execsq
163e0 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
163f0 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  p VALUES(1, 2, 3
16400 29 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  )         }..   
16410 20 23 20 4d 41 54 43 48 20 53 49 4d 50 4c 45 20   # MATCH SIMPLE 
16420 62 65 68 61 76 69 6f 75 72 3a 20 41 6c 6c 6f 77  behaviour: Allow
16430 20 61 6e 79 20 63 68 69 6c 64 20 6b 65 79 20 74   any child key t
16440 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  hat contains one
16450 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 23 20 4e   or more.    # N
16460 55 4c 4c 20 76 61 6c 75 65 20 74 6f 20 62 65 20  ULL value to be 
16470 69 6e 73 65 72 74 65 64 2e 20 4e 6f 6e 2d 4e 55  inserted. Non-NU
16480 4c 4c 20 76 61 6c 75 65 73 20 64 6f 20 6e 6f 74  LL values do not
16490 20 68 61 76 65 20 74 6f 20 6d 61 70 20 74 6f 20   have to map to 
164a0 61 6e 79 0a 20 20 20 20 23 20 70 61 72 65 6e 74  any.    # parent
164b0 20 6b 65 79 20 76 61 6c 75 65 73 2c 20 73 6f 20   key values, so 
164c0 6c 6f 6e 67 20 61 73 20 61 74 20 6c 65 61 73 74  long as at least
164d0 20 6f 6e 65 20 66 69 65 6c 64 20 6f 66 20 74 68   one field of th
164e0 65 20 63 68 69 6c 64 20 6b 65 79 20 69 73 0a 20  e child key is. 
164f0 20 20 20 23 20 4e 55 4c 4c 2e 0a 20 20 20 20 65     # NULL..    e
16500 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
16510 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 77  INTO c VALUES('w
16520 27 2c 20 32 2c 20 33 29 20 20 20 20 20 20 20 7d  ', 2, 3)       }
16530 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
16540 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c  NSERT INTO c VAL
16550 55 45 53 28 27 78 27 2c 20 27 78 27 2c 20 4e 55  UES('x', 'x', NU
16560 4c 4c 29 20 20 7d 0a 20 20 20 20 65 78 65 63 73  LL)  }.    execs
16570 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
16580 20 63 20 56 41 4c 55 45 53 28 27 79 27 2c 20 4e   c VALUES('y', N
16590 55 4c 4c 2c 20 27 78 27 29 20 20 7d 0a 20 20 20  ULL, 'x')  }.   
165a0 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
165b0 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28  T INTO c VALUES(
165c0 27 7a 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  'z', NULL, NULL)
165d0 20 7d 0a 0a 20 20 20 20 23 20 43 68 65 63 6b 20   }..    # Check 
165e0 74 68 61 74 20 74 68 65 20 46 4b 20 69 73 20 65  that the FK is e
165f0 6e 66 6f 72 63 65 64 20 70 72 6f 70 65 72 6c 79  nforced properly
16600 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
16610 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 0a 20 20   NULL values .  
16620 20 20 23 20 69 6e 20 74 68 65 20 63 68 69 6c 64    # in the child
16630 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20   key columns..  
16640 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16650 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45  ERT INTO c VALUE
16660 53 28 27 61 27 2c 20 32 2c 20 34 29 20 7d 0a 20  S('a', 2, 4) }. 
16670 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b   } {1 {foreign k
16680 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
16690 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  iled}}.}..#-----
166a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166e0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
166f0 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
16700 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 54   support the SET
16710 20 43 4f 4e 53 54 52 41 49 4e 54 20 73 74 61 74   CONSTRAINT stat
16720 65 6d 65 6e 74 2e 20 41 6e 64 0a 23 20 74 68 61  ement. And.# tha
16730 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
16740 20 74 6f 20 63 72 65 61 74 65 20 62 6f 74 68 20   to create both 
16750 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 64 65  immediate and de
16760 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
16770 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
16780 2d 4f 46 3a 20 52 2d 32 31 35 39 39 2d 31 36 30  -OF: R-21599-160
16790 33 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 61 20  38 In SQLite, a 
167a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
167b0 74 72 61 69 6e 74 20 69 73 0a 23 20 70 65 72 6d  traint is.# perm
167c0 61 6e 65 6e 74 6c 79 20 6d 61 72 6b 65 64 20 61  anently marked a
167d0 73 20 64 65 66 65 72 72 65 64 20 6f 72 20 69 6d  s deferred or im
167e0 6d 65 64 69 61 74 65 20 77 68 65 6e 20 69 74 20  mediate when it 
167f0 69 73 20 63 72 65 61 74 65 64 2e 0a 23 0a 64 72  is created..#.dr
16800 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
16810 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16820 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
16830 20 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54 53   SET CONSTRAINTS
16840 20 41 4c 4c 20 49 4d 4d 45 44 49 41 54 45 20 7d   ALL IMMEDIATE }
16850 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 45 54  .} {1 {near "SET
16860 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d  ": syntax error}
16870 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
16880 2d 36 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -62.2 {.  catchs
16890 71 6c 20 7b 20 53 45 54 20 43 4f 4e 53 54 52 41  ql { SET CONSTRA
168a0 49 4e 54 53 20 41 4c 4c 20 44 45 46 45 52 52 45  INTS ALL DEFERRE
168b0 44 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22  D }.} {1 {near "
168c0 53 45 54 22 3a 20 73 79 6e 74 61 78 20 65 72 72  SET": syntax err
168d0 6f 72 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  or}}..do_test e_
168e0 66 6b 65 79 2d 36 32 2e 33 20 7b 0a 20 20 65 78  fkey-62.3 {.  ex
168f0 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
16900 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c  TE TABLE p(a, b,
16910 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
16920 62 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  b));.    CREATE 
16930 54 41 42 4c 45 20 63 64 28 63 2c 20 64 2c 20 0a  TABLE cd(c, d, .
16940 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
16950 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
16960 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20  ES p DEFERRABLE 
16970 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16980 45 44 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ED);.    CREATE 
16990 54 41 42 4c 45 20 63 69 28 63 2c 20 64 2c 20 0a  TABLE ci(c, d, .
169a0 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
169b0 59 28 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43  Y(c, d) REFERENC
169c0 45 53 20 70 20 44 45 46 45 52 52 41 42 4c 45 20  ES p DEFERRABLE 
169d0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
169e0 41 54 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  ATE);.    BEGIN;
169f0 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
16a00 74 20 65 5f 66 6b 65 79 2d 36 32 2e 34 20 7b 0a  t e_fkey-62.4 {.
16a10 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
16a20 45 52 54 20 49 4e 54 4f 20 63 69 20 56 41 4c 55  ERT INTO ci VALU
16a30 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 0a 7d  ES('x', 'y') }.}
16a40 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
16a50 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
16a60 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
16a70 6b 65 79 2d 36 32 2e 35 20 7b 0a 20 20 63 61 74  key-62.5 {.  cat
16a80 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
16a90 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 28 27 78  NTO cd VALUES('x
16aa0 27 2c 20 27 79 27 29 20 7d 0a 7d 20 7b 30 20 7b  ', 'y') }.} {0 {
16ab0 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
16ac0 79 2d 36 32 2e 36 20 7b 0a 20 20 63 61 74 63 68  y-62.6 {.  catch
16ad0 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 7d  sql { COMMIT }.}
16ae0 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
16af0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
16b00 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
16b10 6b 65 79 2d 36 32 2e 37 20 7b 0a 20 20 65 78 65  key-62.7 {.  exe
16b20 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45  csql { .    DELE
16b30 54 45 20 46 52 4f 4d 20 63 64 3b 0a 20 20 20 20  TE FROM cd;.    
16b40 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
16b50 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
16ba0 65 73 74 20 74 68 61 74 20 74 68 65 20 6d 61 78  est that the max
16bb0 69 6d 75 6d 20 72 65 63 75 72 73 69 6f 6e 20 64  imum recursion d
16bc0 65 70 74 68 20 6f 66 20 66 6f 72 65 69 67 6e 20  epth of foreign 
16bd0 6b 65 79 20 61 63 74 69 6f 6e 20 70 72 6f 67 72  key action progr
16be0 61 6d 73 20 69 73 0a 23 20 67 6f 76 65 72 6e 65  ams is.# governe
16bf0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 34  d by the SQLITE4
16c00 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
16c10 54 48 20 61 6e 64 20 53 51 4c 49 54 45 34 5f 4c  TH and SQLITE4_L
16c20 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
16c30 54 48 0a 23 20 73 65 74 74 69 6e 67 73 2e 0a 23  TH.# settings..#
16c40 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
16c50 52 2d 34 32 32 36 34 2d 33 30 35 30 33 20 54 68  R-42264-30503 Th
16c60 65 20 53 51 4c 49 54 45 34 5f 4d 41 58 5f 54 52  e SQLITE4_MAX_TR
16c70 49 47 47 45 52 5f 44 45 50 54 48 20 61 6e 64 0a  IGGER_DEPTH and.
16c80 23 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54 5f  # SQLITE4_LIMIT_
16c90 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 73 65  TRIGGER_DEPTH se
16ca0 74 74 69 6e 67 73 20 64 65 74 65 72 6d 69 6e 65  ttings determine
16cb0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
16cc0 6f 77 61 62 6c 65 0a 23 20 64 65 70 74 68 20 6f  owable.# depth o
16cd0 66 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  f trigger progra
16ce0 6d 20 72 65 63 75 72 73 69 6f 6e 2e 20 46 6f 72  m recursion. For
16cf0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
16d00 20 74 68 65 73 65 20 6c 69 6d 69 74 73 2c 0a 23   these limits,.#
16d10 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
16d20 69 6f 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ions are conside
16d30 72 65 64 20 74 72 69 67 67 65 72 20 70 72 6f 67  red trigger prog
16d40 72 61 6d 73 2e 0a 23 0a 70 72 6f 63 20 74 65 73  rams..#.proc tes
16d50 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75  t_on_delete_recu
16d60 72 73 69 6f 6e 20 7b 6c 69 6d 69 74 7d 20 7b 0a  rsion {limit} {.
16d70 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
16d80 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  s.  execsql { . 
16d90 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
16da0 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 61 20  EATE TABLE t0(a 
16db0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
16dc0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
16dd0 20 74 30 20 56 41 4c 55 45 53 28 27 78 30 27 2c   t0 VALUES('x0',
16de0 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 66 6f   NULL);.  }.  fo
16df0 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20  r {set i 1} {$i 
16e00 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72  <= $limit} {incr
16e10 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
16e20 6c 20 22 0a 20 20 20 20 20 20 43 52 45 41 54 45  l ".      CREATE
16e30 20 54 41 42 4c 45 20 74 24 69 20 28 0a 20 20 20   TABLE t$i (.   
16e40 20 20 20 20 20 61 20 50 52 49 4d 41 52 59 20 4b       a PRIMARY K
16e50 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
16e60 20 74 5b 65 78 70 72 20 24 69 2d 31 5d 20 4f 4e   t[expr $i-1] ON
16e70 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 0a   DELETE CASCADE.
16e80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49        );.      I
16e90 4e 53 45 52 54 20 49 4e 54 4f 20 74 24 69 20 56  NSERT INTO t$i V
16ea0 41 4c 55 45 53 28 27 78 24 69 27 2c 20 27 78 5b  ALUES('x$i', 'x[
16eb0 65 78 70 72 20 24 69 2d 31 5d 27 29 3b 0a 20 20  expr $i-1]');.  
16ec0 20 20 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71    ".  }.  execsq
16ed0 6c 20 43 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68  l COMMIT.  catch
16ee0 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54 45  sql ".    DELETE
16ef0 20 46 52 4f 4d 20 74 30 3b 0a 20 20 20 20 53 45   FROM t0;.    SE
16f00 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
16f10 4f 4d 20 74 24 6c 69 6d 69 74 3b 0a 20 20 22 0a  OM t$limit;.  ".
16f20 7d 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f 75  }.proc test_on_u
16f30 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20  pdate_recursion 
16f40 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f 70  {limit} {.  drop
16f50 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78  _all_tables.  ex
16f60 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47  ecsql { .    BEG
16f70 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
16f80 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41 52  ABLE t0(a PRIMAR
16f90 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45  Y KEY);.    INSE
16fa0 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c 55 45  RT INTO t0 VALUE
16fb0 53 28 27 78 78 78 27 29 3b 0a 20 20 7d 0a 20 20  S('xxx');.  }.  
16fc0 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24  for {set i 1} {$
16fd0 69 20 3c 3d 20 24 6c 69 6d 69 74 7d 20 7b 69 6e  i <= $limit} {in
16fe0 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
16ff0 6a 20 5b 65 78 70 72 20 24 69 2d 31 5d 0a 0a 20  j [expr $i-1].. 
17000 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
17010 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
17020 74 24 69 20 28 61 20 50 52 49 4d 41 52 59 20 4b  t$i (a PRIMARY K
17030 45 59 20 52 45 46 45 52 45 4e 43 45 53 20 74 24  EY REFERENCES t$
17040 6a 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43  j ON UPDATE CASC
17050 41 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ADE);.      INSE
17060 52 54 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55  RT INTO t$i VALU
17070 45 53 28 27 78 78 78 27 29 3b 0a 20 20 20 20 22  ES('xxx');.    "
17080 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43  .  }.  execsql C
17090 4f 4d 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c  OMMIT.  catchsql
170a0 20 22 0a 20 20 20 20 55 50 44 41 54 45 20 74 30   ".    UPDATE t0
170b0 20 53 45 54 20 61 20 3d 20 27 79 79 79 27 3b 0a   SET a = 'yyy';.
170c0 20 20 20 20 53 45 4c 45 43 54 20 4e 4f 54 20 28      SELECT NOT (
170d0 61 3d 27 79 79 79 27 29 20 46 52 4f 4d 20 74 24  a='yyy') FROM t$
170e0 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 0a 64 6f  limit;.  ".}..do
170f0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e  _test e_fkey-63.
17100 31 2e 31 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f  1.1 {.  test_on_
17110 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
17120 20 24 53 51 4c 49 54 45 34 5f 4d 41 58 5f 54 52   $SQLITE4_MAX_TR
17130 49 47 47 45 52 5f 44 45 50 54 48 0a 7d 20 7b 30  IGGER_DEPTH.} {0
17140 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   0}.do_test e_fk
17150 65 79 2d 36 33 2e 31 2e 32 20 7b 0a 20 20 74 65  ey-63.1.2 {.  te
17160 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
17170 75 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51  ursion [expr $SQ
17180 4c 49 54 45 34 5f 4d 41 58 5f 54 52 49 47 47 45  LITE4_MAX_TRIGGE
17190 52 5f 44 45 50 54 48 2b 31 5d 0a 7d 20 7b 31 20  R_DEPTH+1].} {1 
171a0 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73  {too many levels
171b0 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75   of trigger recu
171c0 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20  rsion}}.do_test 
171d0 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 33 20 7b 0a  e_fkey-63.1.3 {.
171e0 20 20 73 71 6c 69 74 65 34 5f 6c 69 6d 69 74 20    sqlite4_limit 
171f0 64 62 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54  db SQLITE4_LIMIT
17200 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 35  _TRIGGER_DEPTH 5
17210 0a 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74  .  test_on_delet
17220 65 5f 72 65 63 75 72 73 69 6f 6e 20 35 0a 7d 20  e_recursion 5.} 
17230 7b 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  {0 0}.do_test e_
17240 66 6b 65 79 2d 36 33 2e 31 2e 34 20 7b 0a 20 20  fkey-63.1.4 {.  
17250 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72  test_on_delete_r
17260 65 63 75 72 73 69 6f 6e 20 36 0a 7d 20 7b 31 20  ecursion 6.} {1 
17270 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73  {too many levels
17280 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75   of trigger recu
17290 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20  rsion}}.do_test 
172a0 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 35 20 7b 0a  e_fkey-63.1.5 {.
172b0 20 20 73 71 6c 69 74 65 34 5f 6c 69 6d 69 74 20    sqlite4_limit 
172c0 64 62 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54  db SQLITE4_LIMIT
172d0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 31  _TRIGGER_DEPTH 1
172e0 30 30 30 30 30 30 0a 7d 20 7b 35 7d 0a 64 6f 5f  000000.} {5}.do_
172f0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e 32  test e_fkey-63.2
17300 2e 31 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f 75  .1 {.  test_on_u
17310 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e 20  pdate_recursion 
17320 24 53 51 4c 49 54 45 34 5f 4d 41 58 5f 54 52 49  $SQLITE4_MAX_TRI
17330 47 47 45 52 5f 44 45 50 54 48 0a 7d 20 7b 30 20  GGER_DEPTH.} {0 
17340 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  0}.do_test e_fke
17350 79 2d 36 33 2e 32 2e 32 20 7b 0a 20 20 74 65 73  y-63.2.2 {.  tes
17360 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75  t_on_update_recu
17370 72 73 69 6f 6e 20 5b 65 78 70 72 20 24 53 51 4c  rsion [expr $SQL
17380 49 54 45 34 5f 4d 41 58 5f 54 52 49 47 47 45 52  ITE4_MAX_TRIGGER
17390 5f 44 45 50 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b  _DEPTH+1].} {1 {
173a0 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
173b0 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
173c0 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  sion}}.do_test e
173d0 5f 66 6b 65 79 2d 36 33 2e 32 2e 33 20 7b 0a 20  _fkey-63.2.3 {. 
173e0 20 73 71 6c 69 74 65 34 5f 6c 69 6d 69 74 20 64   sqlite4_limit d
173f0 62 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54 5f  b SQLITE4_LIMIT_
17400 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 35 0a  TRIGGER_DEPTH 5.
17410 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65    test_on_update
17420 5f 72 65 63 75 72 73 69 6f 6e 20 35 0a 7d 20 7b  _recursion 5.} {
17430 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  0 0}.do_test e_f
17440 6b 65 79 2d 36 33 2e 32 2e 34 20 7b 0a 20 20 74  key-63.2.4 {.  t
17450 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65  est_on_update_re
17460 63 75 72 73 69 6f 6e 20 36 0a 7d 20 7b 31 20 7b  cursion 6.} {1 {
17470 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
17480 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
17490 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  sion}}.do_test e
174a0 5f 66 6b 65 79 2d 36 33 2e 32 2e 35 20 7b 0a 20  _fkey-63.2.5 {. 
174b0 20 73 71 6c 69 74 65 34 5f 6c 69 6d 69 74 20 64   sqlite4_limit d
174c0 62 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54 5f  b SQLITE4_LIMIT_
174d0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 31 30  TRIGGER_DEPTH 10
174e0 30 30 30 30 30 0a 7d 20 7b 35 7d 0a 0a 23 2d 2d  00000.} {5}..#--
174f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17530 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 73 65  -------.# The se
17540 74 74 69 6e 67 20 6f 66 20 74 68 65 20 72 65 63  tting of the rec
17550 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20  ursive_triggers 
17560 70 72 61 67 6d 61 20 64 6f 65 73 20 6e 6f 74 20  pragma does not 
17570 61 66 66 65 63 74 20 66 6f 72 65 69 67 6e 0a 23  affect foreign.#
17580 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23 0a   key actions..#.
17590 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
175a0 2d 35 31 37 36 39 2d 33 32 37 33 30 20 54 68 65  -51769-32730 The
175b0 20 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76   PRAGMA recursiv
175c0 65 5f 74 72 69 67 67 65 72 73 20 73 65 74 74 69  e_triggers setti
175d0 6e 67 20 64 6f 65 73 0a 23 20 6e 6f 74 20 6e 6f  ng does.# not no
175e0 74 20 61 66 66 65 63 74 20 74 68 65 20 6f 70 65  t affect the ope
175f0 72 61 74 69 6f 6e 20 6f 66 20 66 6f 72 65 69 67  ration of foreig
17600 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a 23  n key actions..#
17610 0a 66 6f 72 65 61 63 68 20 72 65 63 75 72 73 69  .foreach recursi
17620 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17630 69 6e 67 20 5b 6c 69 73 74 20 30 20 31 20 4f 4e  ing [list 0 1 ON
17640 20 4f 46 46 5d 20 7b 0a 20 20 64 72 6f 70 5f 61   OFF] {.  drop_a
17650 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63  ll_tables.  exec
17660 73 71 6c 20 22 50 52 41 47 4d 41 20 72 65 63 75  sql "PRAGMA recu
17670 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d  rsive_triggers =
17680 20 24 72 65 63 75 72 73 69 76 65 5f 74 72 69 67   $recursive_trig
17690 67 65 72 73 5f 73 65 74 74 69 6e 67 22 0a 0a 20  gers_setting".. 
176a0 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d   do_test e_fkey-
176b0 36 34 2e 24 72 65 63 75 72 73 69 76 65 5f 74 72  64.$recursive_tr
176c0 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 2e 31  iggers_setting.1
176d0 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
176e0 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
176f0 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
17700 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
17710 45 53 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20  ES t1 ON DELETE 
17720 43 41 53 43 41 44 45 29 3b 0a 20 20 20 20 20 20  CASCADE);.      
17730 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
17740 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a  ALUES(1, NULL);.
17750 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
17760 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 31  O t1 VALUES(2, 1
17770 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
17780 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
17790 2c 20 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 2);.      INSE
177a0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
177b0 53 28 34 2c 20 33 29 3b 0a 20 20 20 20 20 20 49  S(4, 3);.      I
177c0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
177d0 4c 55 45 53 28 35 2c 20 34 29 3b 0a 20 20 20 20  LUES(5, 4);.    
177e0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
177f0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d  ) FROM t1;.    }
17800 0a 20 20 7d 20 7b 35 7d 0a 20 20 64 6f 5f 74 65  .  } {5}.  do_te
17810 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72 65  st e_fkey-64.$re
17820 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
17830 5f 73 65 74 74 69 6e 67 2e 32 20 7b 0a 20 20 20  _setting.2 {.   
17840 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
17850 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
17860 74 31 20 57 48 45 52 45 20 61 20 3d 20 31 20 7d  t1 WHERE a = 1 }
17870 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65  .  } {1}.  do_te
17880 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72 65  st e_fkey-64.$re
17890 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
178a0 5f 73 65 74 74 69 6e 67 2e 33 20 7b 0a 20 20 20  _setting.3 {.   
178b0 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
178c0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
178d0 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
178e0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
178f0 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
17900 20 7d 0a 20 20 7d 20 7b 30 7d 0a 7d 0a 0a 66 69   }.  } {0}.}..fi
17910 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.