SQLite4
Hex Artifact Content
Not logged in

Artifact 2e983ac91efd46230cf230d46b97e822603055e6:


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 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
1210: 52 2d 30 37 32 38 30 2d 36 30 35 31 30 20 41 73  R-07280-60510 As
1220: 73 75 6d 69 6e 67 20 74 68 65 20 6c 69 62 72 61  suming the libra
1230: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
1240: 69 74 68 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65  ith.# foreign ke
1250: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 65 6e  y constraints en
1260: 61 62 6c 65 64 2c 20 69 74 20 6d 75 73 74 20 73  abled, it must s
1270: 74 69 6c 6c 20 62 65 20 65 6e 61 62 6c 65 64 20  till be enabled 
1280: 62 79 20 74 68 65 0a 23 20 61 70 70 6c 69 63 61  by the.# applica
1290: 74 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2c  tion at runtime,
12a0: 20 75 73 69 6e 67 20 74 68 65 20 50 52 41 47 4d   using the PRAGM
12b0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 63  A foreign_keys c
12c0: 6f 6d 6d 61 6e 64 2e 0a 23 0a 23 20 54 68 69 73  ommand..#.# This
12d0: 20 61 6c 73 6f 20 74 65 73 74 73 20 74 68 61 74   also tests that
12e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
12f0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 64 69 73  straints are dis
1300: 61 62 6c 65 64 20 62 79 20 64 65 66 61 75 6c 74  abled by default
1310: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
1320: 46 3a 20 52 2d 35 39 35 37 38 2d 30 34 39 39 30  F: R-59578-04990
1330: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   Foreign key con
1340: 73 74 72 61 69 6e 74 73 20 61 72 65 20 64 69 73  straints are dis
1350: 61 62 6c 65 64 20 62 79 0a 23 20 64 65 66 61 75  abled by.# defau
1360: 6c 74 20 28 66 6f 72 20 62 61 63 6b 77 61 72 64  lt (for backward
1370: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  s compatibility)
1380: 2c 20 73 6f 20 6d 75 73 74 20 62 65 20 65 6e 61  , so must be ena
1390: 62 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 0a  bled separately.
13a0: 23 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  # for each datab
13b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
13c0: 65 70 61 72 61 74 65 6c 79 2e 0a 23 0a 64 72 6f  eparately..#.dro
13d0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
13e0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 2e 31 20  test e_fkey-4.1 
13f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1400: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
1410: 28 69 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (i PRIMARY KEY);
1420: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1430: 45 20 63 28 6a 20 52 45 46 45 52 45 4e 43 45 53  E c(j REFERENCES
1440: 20 70 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53   p ON UPDATE CAS
1450: 43 41 44 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  CADE);.    INSER
1460: 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
1470: 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 49 4e  'hello');.    IN
1480: 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
1490: 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20  ES('hello');.   
14a0: 20 55 50 44 41 54 45 20 70 20 53 45 54 20 69 20   UPDATE p SET i 
14b0: 3d 20 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20 53  = 'world';.    S
14c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a  ELECT * FROM c;.
14d0: 20 20 7d 20 0a 7d 20 7b 68 65 6c 6c 6f 7d 0a 64    } .} {hello}.d
14e0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 2e  o_test e_fkey-4.
14f0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
1500: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1510: 63 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  c;.    DELETE FR
1520: 4f 4d 20 70 3b 0a 20 20 20 20 50 52 41 47 4d 41  OM p;.    PRAGMA
1530: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
1540: 4f 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ON;.    INSERT I
1550: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 68 65  NTO p VALUES('he
1560: 6c 6c 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  llo');.    INSER
1570: 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28  T INTO c VALUES(
1580: 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 55 50  'hello');.    UP
1590: 44 41 54 45 20 70 20 53 45 54 20 69 20 3d 20 27  DATE p SET i = '
15a0: 77 6f 72 6c 64 27 3b 0a 20 20 20 20 53 45 4c 45  world';.    SELE
15b0: 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a 20 20 7d  CT * FROM c;.  }
15c0: 20 0a 7d 20 7b 77 6f 72 6c 64 7d 0a 0a 23 2d 2d   .} {world}..#--
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e  -------.# EVIDEN
1620: 43 45 2d 4f 46 3a 20 52 2d 31 35 32 37 38 2d 35  CE-OF: R-15278-5
1630: 34 34 35 36 20 54 68 65 20 61 70 70 6c 69 63 61  4456 The applica
1640: 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 61 6c 73  tion can can als
1650: 6f 20 75 73 65 20 61 20 50 52 41 47 4d 41 0a 23  o use a PRAGMA.#
1660: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 73 74   foreign_keys st
1670: 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 74 65 72  atement to deter
1680: 6d 69 6e 65 20 69 66 20 66 6f 72 65 69 67 6e 20  mine if foreign 
1690: 6b 65 79 73 20 61 72 65 20 63 75 72 72 65 6e 74  keys are current
16a0: 6c 79 0a 23 20 65 6e 61 62 6c 65 64 2e 0a 23 0a  ly.# enabled..#.
16b0: 23 20 54 68 69 73 20 61 6c 73 6f 20 74 65 73 74  # This also test
16c0: 73 20 74 68 65 20 65 78 61 6d 70 6c 65 20 63 6f  s the example co
16d0: 64 65 20 69 6e 20 73 65 63 74 69 6f 6e 20 32 20  de in section 2 
16e0: 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73 2e 69  of foreignkeys.i
16f0: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
1700: 4f 46 3a 20 52 2d 31 31 32 35 35 2d 31 39 39 30  OF: R-11255-1990
1710: 37 0a 23 20 0a 72 65 73 65 74 5f 64 62 0a 64 6f  7.# .reset_db.do
1720: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 2e 31  _test e_fkey-5.1
1730: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
1740: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
1750: 79 73 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  ys }.} {0}.do_te
1760: 73 74 20 65 5f 66 6b 65 79 2d 35 2e 32 20 7b 0a  st e_fkey-5.2 {.
1770: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
1780: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1790: 6b 65 79 73 20 3d 20 4f 4e 3b 0a 20 20 20 20 50  keys = ON;.    P
17a0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
17b0: 79 73 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  ys;.  }.} {1}.do
17c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 2e 33  _test e_fkey-5.3
17d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
17e0: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
17f0: 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20  gn_keys = OFF;. 
1800: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
1810: 6e 5f 6b 65 79 73 3b 0a 20 20 7d 0a 7d 20 7b 30  n_keys;.  }.} {0
1820: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1870: 54 65 73 74 20 74 68 61 74 20 69 74 20 69 73 20  Test that it is 
1880: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1890: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
18a0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 73 75  e foreign key su
18b0: 70 70 6f 72 74 0a 23 20 77 68 69 6c 65 20 6e 6f  pport.# while no
18c0: 74 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  t in auto-commit
18d0: 20 6d 6f 64 65 2e 0a 23 0a 23 20 45 56 49 44 45   mode..#.# EVIDE
18e0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 36 34 39 2d  NCE-OF: R-46649-
18f0: 35 38 35 33 37 20 49 74 20 69 73 20 6e 6f 74 20  58537 It is not 
1900: 70 6f 73 73 69 62 6c 65 20 74 6f 20 65 6e 61 62  possible to enab
1910: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 0a 23 20  le or disable.# 
1920: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
1930: 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 6d  traints in the m
1940: 69 64 64 6c 65 20 6f 66 20 61 20 6d 75 6c 74 69  iddle of a multi
1950: 2d 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73  -statement trans
1960: 61 63 74 69 6f 6e 0a 23 20 28 77 68 65 6e 20 53  action.# (when S
1970: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 69 6e 20  QLite is not in 
1980: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 29  autocommit mode)
1990: 2e 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  . Attempting to 
19a0: 64 6f 20 73 6f 20 64 6f 65 73 20 6e 6f 74 0a 23  do so does not.#
19b0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
19c0: 3b 20 69 74 20 73 69 6d 70 6c 79 20 68 61 73 20  ; it simply has 
19d0: 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 72 65 73  no effect..#.res
19e0: 65 74 5f 64 62 0a 64 6f 5f 74 65 73 74 20 65 5f  et_db.do_test e_
19f0: 66 6b 65 79 2d 36 2e 31 20 7b 0a 20 20 65 78 65  fkey-6.1 {.  exe
1a00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
1a10: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
1a20: 20 4f 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20   ON;.    CREATE 
1a30: 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51 55  TABLE t1(a UNIQU
1a40: 45 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  E, b);.    CREAT
1a50: 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64 20  E TABLE t2(c, d 
1a60: 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61 29  REFERENCES t1(a)
1a70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1a80: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1a90: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
1aa0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c  NTO t2 VALUES(2,
1ab0: 20 31 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   1);.    BEGIN;.
1ac0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
1ad0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 3b  eign_keys = OFF;
1ae0: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
1af0: 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  {.      DELETE F
1b00: 52 4f 4d 20 74 31 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t1.  }.} {1 
1b10: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
1b20: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
1b30: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
1b40: 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
1b50: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
1b60: 5f 6b 65 79 73 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  _keys }.} {1}.do
1b70: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 2e 33  _test e_fkey-6.3
1b80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1b90: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50     COMMIT;.    P
1ba0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
1bb0: 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20 42 45  ys = OFF;.    BE
1bc0: 47 49 4e 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  GIN;.      PRAGM
1bd0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
1be0: 20 4f 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54   ON;.      DELET
1bf0: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  E FROM t1;.     
1c00: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1c10: 6b 65 79 73 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a  keys;.  }.} {0}.
1c20: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
1c30: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .4 {.  execsql C
1c40: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 23 23 23  OMMIT.} {}..####
1c50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c90: 23 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54  #######.### SECT
1ca0: 49 4f 4e 20 31 3a 20 49 6e 74 72 6f 64 75 63 74  ION 1: Introduct
1cb0: 69 6f 6e 20 74 6f 20 46 6f 72 65 69 67 6e 20 4b  ion to Foreign K
1cc0: 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 0a 23  ey Constraints.#
1cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d10: 23 23 23 23 23 23 23 23 23 23 0a 65 78 65 63 73  ##########.execs
1d20: 71 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69  ql "PRAGMA forei
1d30: 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 22 0a 0a 23  gn_keys = ON"..#
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
1d90: 66 79 20 74 68 61 74 20 74 68 65 20 73 79 6e 74  fy that the synt
1da0: 61 78 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ax in the first 
1db0: 65 78 61 6d 70 6c 65 20 69 6e 20 73 65 63 74 69  example in secti
1dc0: 6f 6e 20 31 20 69 73 20 76 61 6c 69 64 2e 0a 23  on 1 is valid..#
1dd0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
1de0: 52 2d 30 34 30 34 32 2d 32 34 38 32 35 20 54 6f  R-04042-24825 To
1df0: 20 64 6f 20 73 6f 2c 20 61 20 66 6f 72 65 69 67   do so, a foreig
1e00: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
1e10: 20 6d 61 79 20 62 65 0a 23 20 61 64 64 65 64 20   may be.# added 
1e20: 62 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  by modifying the
1e30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20   declaration of 
1e40: 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 20  the track table 
1e50: 74 6f 20 74 68 65 0a 23 20 66 6f 6c 6c 6f 77 69  to the.# followi
1e60: 6e 67 3a 20 43 52 45 41 54 45 20 54 41 42 4c 45  ng: CREATE TABLE
1e70: 20 74 72 61 63 6b 28 20 74 72 61 63 6b 69 64 20   track( trackid 
1e80: 49 4e 54 45 47 45 52 2c 20 74 72 61 63 6b 6e 61  INTEGER, trackna
1e90: 6d 65 20 54 45 58 54 2c 0a 23 20 74 72 61 63 6b  me TEXT,.# track
1ea0: 61 72 74 69 73 74 20 49 4e 54 45 47 45 52 2c 20  artist INTEGER, 
1eb0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 74 72 61 63  FOREIGN KEY(trac
1ec0: 6b 61 72 74 69 73 74 29 20 52 45 46 45 52 45 4e  kartist) REFEREN
1ed0: 43 45 53 0a 23 20 61 72 74 69 73 74 28 61 72 74  CES.# artist(art
1ee0: 69 73 74 69 64 29 20 29 3b 0a 23 0a 64 6f 5f 74  istid) );.#.do_t
1ef0: 65 73 74 20 65 5f 66 6b 65 79 2d 37 2e 31 20 7b  est e_fkey-7.1 {
1f00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1f10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72   CREATE TABLE ar
1f20: 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69  tist(.      arti
1f30: 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20  stid    INTEGER 
1f40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20  PRIMARY KEY, .  
1f50: 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20      artistname  
1f60: 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  TEXT.    );.    
1f70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61  CREATE TABLE tra
1f80: 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69  ck(.      tracki
1f90: 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 20 0a  d     INTEGER, .
1fa0: 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20        trackname 
1fb0: 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74    TEXT, .      t
1fc0: 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47  rackartist INTEG
1fd0: 45 52 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47  ER,.      FOREIG
1fe0: 4e 20 4b 45 59 28 74 72 61 63 6b 61 72 74 69 73  N KEY(trackartis
1ff0: 74 29 20 52 45 46 45 52 45 4e 43 45 53 20 61 72  t) REFERENCES ar
2000: 74 69 73 74 28 61 72 74 69 73 74 69 64 29 0a 20  tist(artistid). 
2010: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a     );.  }.} {}..
2020: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
2070: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 36  DENCE-OF: R-6136
2080: 32 2d 33 32 30 38 37 20 41 74 74 65 6d 70 74 69  2-32087 Attempti
2090: 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 61 20 72  ng to insert a r
20a0: 6f 77 20 69 6e 74 6f 20 74 68 65 20 74 72 61 63  ow into the trac
20b0: 6b 0a 23 20 74 61 62 6c 65 20 74 68 61 74 20 64  k.# table that d
20c0: 6f 65 73 20 6e 6f 74 20 63 6f 72 72 65 73 70 6f  oes not correspo
20d0: 6e 64 20 74 6f 20 61 6e 79 20 72 6f 77 20 69 6e  nd to any row in
20e0: 20 74 68 65 20 61 72 74 69 73 74 20 74 61 62 6c   the artist tabl
20f0: 65 20 77 69 6c 6c 0a 23 20 66 61 69 6c 2c 0a 23  e will.# fail,.#
2100: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
2110: 38 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  8.1 {.  catchsql
2120: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
2130: 72 61 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27  rack VALUES(1, '
2140: 74 72 61 63 6b 20 31 27 2c 20 31 29 20 7d 0a 7d  track 1', 1) }.}
2150: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
2160: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
2170: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
2180: 6b 65 79 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63  key-8.2 {.  exec
2190: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
21a0: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
21b0: 32 2c 20 27 61 72 74 69 73 74 20 31 27 29 20 7d  2, 'artist 1') }
21c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
21d0: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
21e0: 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b  VALUES(1, 'track
21f0: 20 31 27 2c 20 31 29 20 7d 0a 7d 20 7b 31 20 7b   1', 1) }.} {1 {
2200: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2210: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
2220: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 38  do_test e_fkey-8
2230: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
2240: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
2250: 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27 74 72  ck VALUES(1, 'tr
2260: 61 63 6b 20 31 27 2c 20 32 29 20 7d 0a 7d 20 7b  ack 1', 2) }.} {
2270: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
22c0: 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 64 65  Attempting to de
22d0: 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  lete a row from 
22e0: 74 68 65 20 27 61 72 74 69 73 74 27 20 74 61 62  the 'artist' tab
22f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 72 65 20 61  le while there a
2300: 72 65 20 0a 23 20 64 65 70 65 6e 64 65 6e 74 20  re .# dependent 
2310: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 72 61 63  rows in the trac
2320: 6b 20 74 61 62 6c 65 20 61 6c 73 6f 20 66 61 69  k table also fai
2330: 6c 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ls..#.# EVIDENCE
2340: 2d 4f 46 3a 20 52 2d 32 34 34 30 31 2d 35 32 34  -OF: R-24401-524
2350: 30 30 20 61 73 20 77 69 6c 6c 20 61 74 74 65 6d  00 as will attem
2360: 70 74 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  pting to delete 
2370: 61 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 0a 23  a row from the.#
2380: 20 61 72 74 69 73 74 20 74 61 62 6c 65 20 77 68   artist table wh
2390: 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 64  en there exist d
23a0: 65 70 65 6e 64 65 6e 74 20 72 6f 77 73 20 69 6e  ependent rows in
23b0: 20 74 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65   the track table
23c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
23d0: 79 2d 39 2e 31 20 7b 0a 20 20 63 61 74 63 68 73  y-9.1 {.  catchs
23e0: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
23f0: 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61 72   artist WHERE ar
2400: 74 69 73 74 69 64 20 3d 20 32 20 7d 0a 7d 20 7b  tistid = 2 }.} {
2410: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
2420: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
2430: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
2440: 79 2d 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  y-9.2 {.  execsq
2450: 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20  l { .    DELETE 
2460: 46 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45  FROM track WHERE
2470: 20 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 32   trackartist = 2
2480: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
2490: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
24a0: 72 74 69 73 74 69 64 20 3d 20 32 3b 0a 20 20 7d  rtistid = 2;.  }
24b0: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 0a 23 20 49 66 20 74 68 65 20 66 6f 72 65 69  -.# If the forei
2510: 67 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 28 74  gn key column (t
2520: 72 61 63 6b 61 72 74 69 73 74 29 20 69 6e 20 74  rackartist) in t
2530: 61 62 6c 65 20 27 74 72 61 63 6b 27 20 69 73 20  able 'track' is 
2540: 73 65 74 20 74 6f 20 4e 55 4c 4c 2c 0a 23 20 74  set to NULL,.# t
2550: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 71 75 69  here is no requi
2560: 72 65 6d 65 6e 74 20 66 6f 72 20 61 20 6d 61 74  rement for a mat
2570: 63 68 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65  ching row in the
2580: 20 27 61 72 74 69 73 74 27 20 74 61 62 6c 65 2e   'artist' table.
2590: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
25a0: 3a 20 52 2d 32 33 39 38 30 2d 34 38 38 35 39 20  : R-23980-48859 
25b0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
25c0: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 66  eption: if the f
25d0: 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6c  oreign key.# col
25e0: 75 6d 6e 20 69 6e 20 74 68 65 20 74 72 61 63 6b  umn in the track
25f0: 20 74 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2c 20   table is NULL, 
2600: 74 68 65 6e 20 6e 6f 20 63 6f 72 72 65 73 70 6f  then no correspo
2610: 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
2620: 68 65 0a 23 20 61 72 74 69 73 74 20 74 61 62 6c  he.# artist tabl
2630: 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 23  e is required..#
2640: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
2650: 31 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  10.1 {.  execsql
2660: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
2670: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
2680: 31 2c 20 27 74 72 61 63 6b 20 31 27 2c 20 4e 55  1, 'track 1', NU
2690: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
26a0: 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45  INTO track VALUE
26b0: 53 28 32 2c 20 27 74 72 61 63 6b 20 32 27 2c 20  S(2, 'track 2', 
26c0: 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  NULL);.  }.} {}.
26d0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
26e0: 30 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.2 {.  execsql 
26f0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2700: 61 72 74 69 73 74 20 7d 0a 7d 20 7b 7d 0a 64 6f  artist }.} {}.do
2710: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 30 2e  _test e_fkey-10.
2720: 33 20 7b 0a 20 20 23 20 53 65 74 74 69 6e 67 20  3 {.  # Setting 
2730: 74 68 65 20 74 72 61 63 6b 69 64 20 74 6f 20 61  the trackid to a
2740: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
2750: 66 61 69 6c 73 2c 20 6f 66 20 63 6f 75 72 73 65  fails, of course
2760: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  ..  catchsql { U
2770: 50 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20  PDATE track SET 
2780: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 35 20  trackartist = 5 
2790: 57 48 45 52 45 20 74 72 61 63 6b 69 64 20 3d 20  WHERE trackid = 
27a0: 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  1 }.} {1 {foreig
27b0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
27c0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
27d0: 74 20 65 5f 66 6b 65 79 2d 31 30 2e 34 20 7b 0a  t e_fkey-10.4 {.
27e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
27f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
2800: 73 74 20 56 41 4c 55 45 53 28 35 2c 20 27 61 72  st VALUES(5, 'ar
2810: 74 69 73 74 20 35 27 29 3b 0a 20 20 20 20 55 50  tist 5');.    UP
2820: 44 41 54 45 20 74 72 61 63 6b 20 53 45 54 20 74  DATE track SET t
2830: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 35 20 57  rackartist = 5 W
2840: 48 45 52 45 20 74 72 61 63 6b 69 64 20 3d 20 31  HERE trackid = 1
2850: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
2860: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61   { DELETE FROM a
2870: 72 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69  rtist WHERE arti
2880: 73 74 69 64 20 3d 20 35 7d 0a 7d 20 7b 31 20 7b  stid = 5}.} {1 {
2890: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
28a0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
28b0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
28c0: 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.5 {.  execsql 
28d0: 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74 72  { .    UPDATE tr
28e0: 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72 74  ack SET trackart
28f0: 69 73 74 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45  ist = NULL WHERE
2900: 20 74 72 61 63 6b 69 64 20 3d 20 31 3b 0a 20 20   trackid = 1;.  
2910: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72    DELETE FROM ar
2920: 74 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73  tist WHERE artis
2930: 74 69 64 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b  tid = 5;.  }.} {
2940: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2990: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 66 6f  Test that the fo
29a0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
29b0: 66 6f 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  fo all rows in t
29c0: 68 65 20 74 72 61 63 6b 20 74 61 62 6c 65 3a 0a  he track table:.
29d0: 23 0a 23 20 20 20 74 72 61 63 6b 61 72 74 69 73  #.#   trackartis
29e0: 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 0a 23 20  t IS NULL OR .# 
29f0: 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20    EXISTS(SELECT 
2a00: 31 20 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48  1 FROM artist WH
2a10: 45 52 45 20 61 72 74 69 73 74 69 64 3d 74 72 61  ERE artistid=tra
2a20: 63 6b 61 72 74 69 73 74 29 0a 23 0a 23 20 45 56  ckartist).#.# EV
2a30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 34  IDENCE-OF: R-524
2a40: 38 36 2d 32 31 33 35 32 20 45 78 70 72 65 73 73  86-21352 Express
2a50: 65 64 20 69 6e 20 53 51 4c 2c 20 74 68 69 73 20  ed in SQL, this 
2a60: 6d 65 61 6e 73 20 74 68 61 74 20 66 6f 72 20 65  means that for e
2a70: 76 65 72 79 0a 23 20 72 6f 77 20 69 6e 20 74 68  very.# row in th
2a80: 65 20 74 72 61 63 6b 20 74 61 62 6c 65 2c 20 74  e track table, t
2a90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
2aa0: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
2ab0: 73 20 74 6f 20 74 72 75 65 3a 0a 23 20 74 72 61  s to true:.# tra
2ac0: 63 6b 61 72 74 69 73 74 20 49 53 20 4e 55 4c 4c  ckartist IS NULL
2ad0: 20 4f 52 20 45 58 49 53 54 53 28 53 45 4c 45 43   OR EXISTS(SELEC
2ae0: 54 20 31 20 46 52 4f 4d 20 61 72 74 69 73 74 20  T 1 FROM artist 
2af0: 57 48 45 52 45 0a 23 20 61 72 74 69 73 74 69 64  WHERE.# artistid
2b00: 3d 74 72 61 63 6b 61 72 74 69 73 74 29 0a 0a 23  =trackartist)..#
2b10: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
2b20: 65 78 65 63 75 74 65 73 20 61 20 74 65 73 74 20  executes a test 
2b30: 63 61 73 65 20 74 6f 20 63 68 65 63 6b 20 74 68  case to check th
2b40: 61 74 20 73 74 61 74 65 6d 65 6e 74 20 0a 23 20  at statement .# 
2b50: 52 2d 35 32 34 38 36 2d 32 31 33 35 32 20 69 73  R-52486-21352 is
2b60: 20 74 72 75 65 20 61 66 74 65 72 20 65 78 65 63   true after exec
2b70: 75 74 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74  uting the SQL st
2b80: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 2e 0a  atement passed..
2b90: 23 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  # as the second 
2ba0: 61 72 67 75 6d 65 6e 74 2e 0a 70 72 6f 63 20 74  argument..proc t
2bb0: 65 73 74 5f 72 35 32 34 38 36 5f 32 31 33 35 32  est_r52486_21352
2bc0: 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 73 65   {tn sql} {.  se
2bd0: 74 20 72 65 73 20 5b 63 61 74 63 68 73 71 6c 20  t res [catchsql 
2be0: 24 73 71 6c 5d 0a 20 20 73 65 74 20 72 65 73 75  $sql].  set resu
2bf0: 6c 74 73 20 7b 0a 20 20 20 20 7b 30 20 7b 7d 7d  lts {.    {0 {}}
2c00: 20 0a 20 20 20 20 7b 31 20 7b 50 52 49 4d 41 52   .    {1 {PRIMAR
2c10: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e  Y KEY must be un
2c20: 69 71 75 65 7d 7d 20 0a 20 20 20 20 7b 31 20 7b  ique}} .    {1 {
2c30: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2c40: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
2c50: 20 20 7d 0a 20 20 69 66 20 7b 5b 6c 73 65 61 72    }.  if {[lsear
2c60: 63 68 20 24 72 65 73 75 6c 74 73 20 24 72 65 73  ch $results $res
2c70: 5d 3c 30 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72  ]<0} {.    error
2c80: 20 24 72 65 73 0a 20 20 7d 0a 0a 20 20 64 6f 5f   $res.  }..  do_
2c90: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 31 2e 24  test e_fkey-11.$
2ca0: 74 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  tn {.    execsql
2cb0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2cc0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 72  count(*) FROM tr
2cd0: 61 63 6b 20 57 48 45 52 45 20 4e 4f 54 20 28 0a  ack WHERE NOT (.
2ce0: 20 20 20 20 20 20 20 20 74 72 61 63 6b 61 72 74          trackart
2cf0: 69 73 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 0a  ist IS NULL OR .
2d00: 20 20 20 20 20 20 20 20 45 58 49 53 54 53 28 53          EXISTS(S
2d10: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61 72 74  ELECT 1 FROM art
2d20: 69 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74  ist WHERE artist
2d30: 69 64 3d 74 72 61 63 6b 61 72 74 69 73 74 29 0a  id=trackartist).
2d40: 20 20 20 20 20 20 29 0a 20 20 20 20 7d 0a 20 20        ).    }.  
2d50: 7d 20 7b 30 7d 0a 7d 0a 0a 23 20 45 78 65 63 75  } {0}.}..# Execu
2d60: 74 65 20 61 20 73 65 72 69 65 73 20 6f 66 20 72  te a series of r
2d70: 61 6e 64 6f 6d 20 49 4e 53 45 52 54 2c 20 55 50  andom INSERT, UP
2d80: 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20  DATE and DELETE 
2d90: 6f 70 65 72 61 74 69 6f 6e 73 0a 23 20 28 73 6f  operations.# (so
2da0: 6d 65 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  me of which may 
2db0: 66 61 69 6c 20 64 75 65 20 74 6f 20 46 4b 20 6f  fail due to FK o
2dc0: 72 20 50 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  r PK constraint 
2dd0: 76 69 6f 6c 61 74 69 6f 6e 73 29 20 6f 6e 20 0a  violations) on .
2de0: 23 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  # the two tables
2df0: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   in the example 
2e00: 73 63 68 65 6d 61 2e 20 54 65 73 74 20 74 68 61  schema. Test tha
2e10: 74 20 52 2d 35 32 34 38 36 2d 32 31 33 35 32 0a  t R-52486-21352.
2e20: 23 20 69 73 20 74 72 75 65 20 61 66 74 65 72 20  # is true after 
2e30: 65 78 65 63 75 74 69 6e 67 20 65 61 63 68 20 6f  executing each o
2e40: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20  peration..#.set 
2e50: 54 65 6d 70 6c 61 74 65 20 7b 0a 20 20 7b 49 4e  Template {.  {IN
2e60: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
2e70: 56 41 4c 55 45 53 28 24 74 2c 20 27 74 72 61 63  VALUES($t, 'trac
2e80: 6b 20 24 74 27 2c 20 24 61 29 7d 0a 20 20 7b 44  k $t', $a)}.  {D
2e90: 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63 6b  ELETE FROM track
2ea0: 20 57 48 45 52 45 20 74 72 61 63 6b 69 64 20 3d   WHERE trackid =
2eb0: 20 24 74 7d 0a 20 20 7b 55 50 44 41 54 45 20 74   $t}.  {UPDATE t
2ec0: 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b 61 72  rack SET trackar
2ed0: 74 69 73 74 20 3d 20 24 61 20 57 48 45 52 45 20  tist = $a WHERE 
2ee0: 74 72 61 63 6b 69 64 20 3d 20 24 74 7d 0a 20 20  trackid = $t}.  
2ef0: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74  {INSERT INTO art
2f00: 69 73 74 20 56 41 4c 55 45 53 28 24 61 2c 20 27  ist VALUES($a, '
2f10: 61 72 74 69 73 74 20 24 61 27 29 7d 0a 20 20 7b  artist $a')}.  {
2f20: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
2f30: 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 69  st WHERE artisti
2f40: 64 20 3d 20 24 61 7d 0a 20 20 7b 55 50 44 41 54  d = $a}.  {UPDAT
2f50: 45 20 61 72 74 69 73 74 20 53 45 54 20 61 72 74  E artist SET art
2f60: 69 73 74 69 64 20 3d 20 24 61 32 20 57 48 45 52  istid = $a2 WHER
2f70: 45 20 61 72 74 69 73 74 69 64 20 3d 20 24 61 7d  E artistid = $a}
2f80: 0a 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .}.for {set i 0}
2f90: 20 7b 24 69 20 3c 20 35 30 30 7d 20 7b 69 6e 63   {$i < 500} {inc
2fa0: 72 20 69 7d 20 7b 0a 20 20 73 65 74 20 61 20 20  r i} {.  set a  
2fb0: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
2fc0: 29 2a 31 30 29 5d 0a 20 20 73 65 74 20 61 32 20  )*10)].  set a2 
2fd0: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
2fe0: 29 2a 31 30 29 5d 0a 20 20 73 65 74 20 74 20 20  )*10)].  set t  
2ff0: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
3000: 29 2a 35 30 29 5d 0a 20 20 73 65 74 20 73 71 6c  )*50)].  set sql
3010: 20 5b 73 75 62 73 74 20 5b 6c 69 6e 64 65 78 20   [subst [lindex 
3020: 24 54 65 6d 70 6c 61 74 65 20 5b 65 78 70 72 20  $Template [expr 
3030: 69 6e 74 28 72 61 6e 64 28 29 2a 36 29 5d 5d 5d  int(rand()*6)]]]
3040: 0a 0a 20 20 74 65 73 74 5f 72 35 32 34 38 36 5f  ..  test_r52486_
3050: 32 31 33 35 32 20 24 69 20 24 73 71 6c 0a 7d 0a  21352 $i $sql.}.
3060: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
30b0: 65 63 6b 20 74 68 61 74 20 61 20 4e 4f 54 20 4e  eck that a NOT N
30c0: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ULL constraint c
30d0: 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  an be added to t
30e0: 68 65 20 65 78 61 6d 70 6c 65 20 73 63 68 65 6d  he example schem
30f0: 61 0a 23 20 74 6f 20 70 72 6f 68 69 62 69 74 20  a.# to prohibit 
3100: 4e 55 4c 4c 20 63 68 69 6c 64 20 6b 65 79 73 20  NULL child keys 
3110: 66 72 6f 6d 20 62 65 69 6e 67 20 69 6e 73 65 72  from being inser
3120: 74 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ted..#.# EVIDENC
3130: 45 2d 4f 46 3a 20 52 2d 34 32 34 31 32 2d 35 39  E-OF: R-42412-59
3140: 33 32 31 20 54 69 70 3a 20 49 66 20 74 68 65 20  321 Tip: If the 
3150: 61 70 70 6c 69 63 61 74 69 6f 6e 20 72 65 71 75  application requ
3160: 69 72 65 73 20 61 20 73 74 72 69 63 74 65 72 0a  ires a stricter.
3170: 23 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  # relationship b
3180: 65 74 77 65 65 6e 20 61 72 74 69 73 74 20 61 6e  etween artist an
3190: 64 20 74 72 61 63 6b 2c 20 77 68 65 72 65 20 4e  d track, where N
31a0: 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ULL values are n
31b0: 6f 74 0a 23 20 70 65 72 6d 69 74 74 65 64 20 69  ot.# permitted i
31c0: 6e 20 74 68 65 20 74 72 61 63 6b 61 72 74 69 73  n the trackartis
31d0: 74 20 63 6f 6c 75 6d 6e 2c 20 73 69 6d 70 6c 79  t column, simply
31e0: 20 61 64 64 20 74 68 65 20 61 70 70 72 6f 70 72   add the appropr
31f0: 69 61 74 65 20 22 4e 4f 54 0a 23 20 4e 55 4c 4c  iate "NOT.# NULL
3200: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  " constraint to 
3210: 74 68 65 20 73 63 68 65 6d 61 2e 0a 23 0a 64 72  the schema..#.dr
3220: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
3230: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 32 2e  _test e_fkey-12.
3240: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
3250: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3260: 20 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61   artist(.      a
3270: 72 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47  rtistid    INTEG
3280: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
3290: 0a 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d  .      artistnam
32a0: 65 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20  e  TEXT.    );. 
32b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
32c0: 74 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61  track(.      tra
32d0: 63 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52  ckid     INTEGER
32e0: 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61  , .      trackna
32f0: 6d 65 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20  me   TEXT, .    
3300: 20 20 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e    trackartist IN
3310: 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 2c 0a  TEGER NOT NULL,.
3320: 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45        FOREIGN KE
3330: 59 28 74 72 61 63 6b 61 72 74 69 73 74 29 20 52  Y(trackartist) R
3340: 45 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74  EFERENCES artist
3350: 28 61 72 74 69 73 74 69 64 29 0a 20 20 20 20 29  (artistid).    )
3360: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
3370: 73 74 20 65 5f 66 6b 65 79 2d 31 32 2e 32 20 7b  st e_fkey-12.2 {
3380: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
3390: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
33a0: 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e 20  VALUES(14, 'Mr. 
33b0: 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 4e 55 4c 4c  Bojangles', NULL
33c0: 29 20 7d 0a 7d 20 7b 31 20 7b 74 72 61 63 6b 2e  ) }.} {1 {track.
33d0: 74 72 61 63 6b 61 72 74 69 73 74 20 6d 61 79 20  trackartist may 
33e0: 6e 6f 74 20 62 65 20 4e 55 4c 4c 7d 7d 0a 0a 23  not be NULL}}..#
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3440: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 31 32 37  ENCE-OF: R-16127
3450: 2d 33 35 34 34 32 0a 23 0a 23 20 54 65 73 74 20  -35442.#.# Test 
3460: 61 6e 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20  an example from 
3470: 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d 6c  foreignkeys.html
3480: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
3490: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
34a0: 65 79 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63  ey-13.1 {.  exec
34b0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
34c0: 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
34d0: 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
34e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
34f0: 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
3500: 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
3510: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
3520: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
3530: 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
3540: 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 74  NTEGER, .      t
3550: 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c  rackname   TEXT,
3560: 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74   .      trackart
3570: 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  ist INTEGER,.   
3580: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 74     FOREIGN KEY(t
3590: 72 61 63 6b 61 72 74 69 73 74 29 20 52 45 46 45  rackartist) REFE
35a0: 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61 72  RENCES artist(ar
35b0: 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b 0a 20  tistid).    );. 
35c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
35d0: 72 74 69 73 74 20 56 41 4c 55 45 53 28 31 2c 20  rtist VALUES(1, 
35e0: 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 29 3b 0a  'Dean Martin');.
35f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3600: 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 32 2c  artist VALUES(2,
3610: 20 27 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 27   'Frank Sinatra'
3620: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3630: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
3640: 31 31 2c 20 27 54 68 61 74 27 27 73 20 41 6d 6f  11, 'That''s Amo
3650: 72 65 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  re', 1);.    INS
3660: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
3670: 41 4c 55 45 53 28 31 32 2c 20 27 43 68 72 69 73  ALUES(12, 'Chris
3680: 74 6d 61 73 20 42 6c 75 65 73 27 2c 20 31 29 3b  tmas Blues', 1);
3690: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
36a0: 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31 33   track VALUES(13
36b0: 2c 20 27 4d 79 20 57 61 79 27 2c 20 32 29 3b 0a  , 'My Way', 2);.
36c0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
36d0: 20 65 5f 66 6b 65 79 2d 31 33 2e 32 20 7b 0a 20   e_fkey-13.2 {. 
36e0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
36f0: 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41  RT INTO track VA
3700: 4c 55 45 53 28 31 34 2c 20 27 4d 72 2e 20 42 6f  LUES(14, 'Mr. Bo
3710: 6a 61 6e 67 6c 65 73 27 2c 20 33 29 20 7d 0a 7d  jangles', 3) }.}
3720: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
3730: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
3740: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
3750: 6b 65 79 2d 31 33 2e 33 20 7b 0a 20 20 65 78 65  key-13.3 {.  exe
3760: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3770: 54 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28  TO track VALUES(
3780: 31 34 2c 20 27 4d 72 2e 20 42 6f 6a 61 6e 67 6c  14, 'Mr. Bojangl
3790: 65 73 27 2c 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b  es', NULL) }.} {
37a0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
37b0: 2d 31 33 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -13.4 {.  catchs
37c0: 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45  ql { .    UPDATE
37d0: 20 74 72 61 63 6b 20 53 45 54 20 74 72 61 63 6b   track SET track
37e0: 61 72 74 69 73 74 20 3d 20 33 20 57 48 45 52 45  artist = 3 WHERE
37f0: 20 74 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d 72   trackname = 'Mr
3800: 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 3b 0a 20 20  . Bojangles';.  
3810: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
3820: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
3830: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
3840: 65 5f 66 6b 65 79 2d 31 33 2e 35 20 7b 0a 20 20  e_fkey-13.5 {.  
3850: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
3860: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
3870: 20 56 41 4c 55 45 53 28 33 2c 20 27 53 61 6d 6d   VALUES(3, 'Samm
3880: 79 20 44 61 76 69 73 20 4a 72 2e 27 29 3b 0a 20  y Davis Jr.');. 
3890: 20 20 20 55 50 44 41 54 45 20 74 72 61 63 6b 20     UPDATE track 
38a0: 53 45 54 20 74 72 61 63 6b 61 72 74 69 73 74 20  SET trackartist 
38b0: 3d 20 33 20 57 48 45 52 45 20 74 72 61 63 6b 6e  = 3 WHERE trackn
38c0: 61 6d 65 20 3d 20 27 4d 72 2e 20 42 6f 6a 61 6e  ame = 'Mr. Bojan
38d0: 67 6c 65 73 27 3b 0a 20 20 20 20 49 4e 53 45 52  gles';.    INSER
38e0: 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56 41 4c  T INTO track VAL
38f0: 55 45 53 28 31 35 2c 20 27 42 6f 6f 67 69 65 20  UES(15, 'Boogie 
3900: 57 6f 6f 67 69 65 27 2c 20 33 29 3b 0a 20 20 7d  Woogie', 3);.  }
3910: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
3970: 20 52 2d 31 35 39 35 38 2d 35 30 32 33 33 0a 23   R-15958-50233.#
3980: 0a 23 20 54 65 73 74 20 74 68 65 20 73 65 63 6f  .# Test the seco
3990: 6e 64 20 65 78 61 6d 70 6c 65 20 66 72 6f 6d 20  nd example from 
39a0: 74 68 65 20 66 69 72 73 74 20 73 65 63 74 69 6f  the first sectio
39b0: 6e 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65 79 73  n of foreignkeys
39c0: 2e 68 74 6d 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74  .html..#.do_test
39d0: 20 65 5f 66 6b 65 79 2d 31 34 2e 31 20 7b 0a 20   e_fkey-14.1 {. 
39e0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
39f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69  DELETE FROM arti
3a00: 73 74 20 57 48 45 52 45 20 61 72 74 69 73 74 6e  st WHERE artistn
3a10: 61 6d 65 20 3d 20 27 46 72 61 6e 6b 20 53 69 6e  ame = 'Frank Sin
3a20: 61 74 72 61 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  atra';.  }.} {1 
3a30: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
3a40: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
3a50: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
3a60: 31 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  14.2 {.  execsql
3a70: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
3a80: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
3a90: 72 61 63 6b 6e 61 6d 65 20 3d 20 27 4d 79 20 57  rackname = 'My W
3aa0: 61 79 27 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  ay';.    DELETE 
3ab0: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
3ac0: 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27  E artistname = '
3ad0: 46 72 61 6e 6b 20 53 69 6e 61 74 72 61 27 3b 0a  Frank Sinatra';.
3ae0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
3af0: 20 65 5f 66 6b 65 79 2d 31 34 2e 33 20 7b 0a 20   e_fkey-14.3 {. 
3b00: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
3b10: 55 50 44 41 54 45 20 61 72 74 69 73 74 20 53 45  UPDATE artist SE
3b20: 54 20 61 72 74 69 73 74 69 64 3d 34 20 57 48 45  T artistid=4 WHE
3b30: 52 45 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20  RE artistname = 
3b40: 27 44 65 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20  'Dean Martin';. 
3b50: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
3b60: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
3b70: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
3b80: 20 65 5f 66 6b 65 79 2d 31 34 2e 34 20 7b 0a 20   e_fkey-14.4 {. 
3b90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3ba0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 61 63 6b  ELETE FROM track
3bb0: 20 57 48 45 52 45 20 74 72 61 63 6b 6e 61 6d 65   WHERE trackname
3bc0: 20 49 4e 28 27 54 68 61 74 27 27 73 20 41 6d 6f   IN('That''s Amo
3bd0: 72 65 27 2c 20 27 43 68 72 69 73 74 6d 61 73 20  re', 'Christmas 
3be0: 42 6c 75 65 73 27 29 3b 0a 20 20 20 20 55 50 44  Blues');.    UPD
3bf0: 41 54 45 20 61 72 74 69 73 74 20 53 45 54 20 61  ATE artist SET a
3c00: 72 74 69 73 74 69 64 3d 34 20 57 48 45 52 45 20  rtistid=4 WHERE 
3c10: 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 44 65  artistname = 'De
3c20: 61 6e 20 4d 61 72 74 69 6e 27 3b 0a 20 20 7d 0a  an Martin';.  }.
3c30: 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  } {}...#--------
3c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  -.# EVIDENCE-OF:
3c90: 20 52 2d 35 36 30 33 32 2d 32 34 39 32 33 20 54   R-56032-24923 T
3ca0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
3cb0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61 74  onstraint is sat
3cc0: 69 73 66 69 65 64 20 69 66 0a 23 20 66 6f 72 20  isfied if.# for 
3cd0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
3ce0: 63 68 69 6c 64 20 74 61 62 6c 65 20 65 69 74 68  child table eith
3cf0: 65 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  er one or more o
3d00: 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 0a  f the child key.
3d10: 23 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 4e 55  # columns are NU
3d20: 4c 4c 2c 20 6f 72 20 74 68 65 72 65 20 65 78 69  LL, or there exi
3d30: 73 74 73 20 61 20 72 6f 77 20 69 6e 20 74 68 65  sts a row in the
3d40: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 66 6f   parent table fo
3d50: 72 20 77 68 69 63 68 0a 23 20 65 61 63 68 20 70  r which.# each p
3d60: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
3d70: 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75   contains a valu
3d80: 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  e equal to the v
3d90: 61 6c 75 65 20 69 6e 20 69 74 73 0a 23 20 61 73  alue in its.# as
3da0: 73 6f 63 69 61 74 65 64 20 63 68 69 6c 64 20 6b  sociated child k
3db0: 65 79 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 23 20 54  ey column..#.# T
3dc0: 65 73 74 20 61 6c 73 6f 20 74 68 61 74 20 74 68  est also that th
3dd0: 65 20 75 73 75 61 6c 20 63 6f 6d 70 61 72 69 73  e usual comparis
3de0: 6f 6e 20 72 75 6c 65 73 20 61 72 65 20 75 73 65  on rules are use
3df0: 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 69  d when testing i
3e00: 66 20 74 68 65 72 65 20 0a 23 20 69 73 20 61 20  f there .# is a 
3e10: 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 69 6e 20  matching row in 
3e20: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
3e30: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
3e40: 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a  y constraint..#.
3e50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
3e60: 2d 35 37 37 36 35 2d 31 32 33 38 30 20 49 6e 20  -57765-12380 In 
3e70: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
3e80: 61 70 68 2c 20 74 68 65 20 74 65 72 6d 20 22 65  aph, the term "e
3e90: 71 75 61 6c 22 0a 23 20 6d 65 61 6e 73 20 65 71  qual".# means eq
3ea0: 75 61 6c 20 77 68 65 6e 20 76 61 6c 75 65 73 20  ual when values 
3eb0: 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69  are compared usi
3ec0: 6e 67 20 74 68 65 20 72 75 6c 65 73 20 73 70 65  ng the rules spe
3ed0: 63 69 66 69 65 64 20 68 65 72 65 2e 0a 23 0a 64  cified here..#.d
3ee0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
3ef0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 35  o_test e_fkey-15
3f00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
3f10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f20: 45 20 70 61 72 28 70 20 50 52 49 4d 41 52 59 20  E par(p PRIMARY 
3f30: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
3f40: 20 54 41 42 4c 45 20 63 68 69 28 63 20 52 45 46   TABLE chi(c REF
3f50: 45 52 45 4e 43 45 53 20 70 61 72 29 3b 0a 0a 20  ERENCES par);.. 
3f60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
3f70: 61 72 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  ar VALUES(1);.  
3f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
3f90: 72 20 56 41 4c 55 45 53 28 27 31 27 29 3b 0a 20  r VALUES('1');. 
3fa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
3fb0: 61 72 20 56 41 4c 55 45 53 28 58 27 33 31 27 29  ar VALUES(X'31')
3fc0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  ;.    SELECT typ
3fd0: 65 6f 66 28 70 29 20 46 52 4f 4d 20 70 61 72 3b  eof(p) FROM par;
3fe0: 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20  .  }.} {integer 
3ff0: 74 65 78 74 20 62 6c 6f 62 7d 0a 0a 70 72 6f 63  text blob}..proc
4000: 20 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 7b   test_efkey_45 {
4010: 74 6e 20 69 73 45 72 72 6f 72 20 73 71 6c 7d 20  tn isError sql} 
4020: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {.  do_test e_fk
4030: 65 79 2d 31 35 2e 24 74 6e 2e 31 20 22 0a 20 20  ey-15.$tn.1 ".  
4040: 20 20 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c    catchsql {$sql
4050: 7d 0a 20 20 22 20 5b 6c 69 6e 64 65 78 20 7b 7b  }.  " [lindex {{
4060: 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67  0 {}} {1 {foreig
4070: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
4080: 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45 72   failed}}} $isEr
4090: 72 6f 72 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ror]..  do_test 
40a0: 65 5f 66 6b 65 79 2d 31 35 2e 24 74 6e 2e 32 20  e_fkey-15.$tn.2 
40b0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
40c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
40d0: 52 4f 4d 20 63 68 69 20 57 48 45 52 45 20 63 20  ROM chi WHERE c 
40e0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  IS NOT NULL AND 
40f0: 63 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54  c NOT IN (SELECT
4100: 20 70 20 46 52 4f 4d 20 70 61 72 29 0a 20 20 20   p FROM par).   
4110: 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 74 65 73   }.  } {}.}..tes
4120: 74 5f 65 66 6b 65 79 5f 34 35 20 31 20 30 20 22  t_efkey_45 1 0 "
4130: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20  INSERT INTO chi 
4140: 56 41 4c 55 45 53 28 31 29 22 0a 74 65 73 74 5f  VALUES(1)".test_
4150: 65 66 6b 65 79 5f 34 35 20 32 20 31 20 22 49 4e  efkey_45 2 1 "IN
4160: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20 56 41  SERT INTO chi VA
4170: 4c 55 45 53 28 27 31 2e 30 27 29 22 0a 74 65 73  LUES('1.0')".tes
4180: 74 5f 65 66 6b 65 79 5f 34 35 20 33 20 30 20 22  t_efkey_45 3 0 "
4190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 20  INSERT INTO chi 
41a0: 56 41 4c 55 45 53 28 27 31 27 29 22 0a 74 65 73  VALUES('1')".tes
41b0: 74 5f 65 66 6b 65 79 5f 34 35 20 34 20 31 20 22  t_efkey_45 4 1 "
41c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 20  DELETE FROM par 
41d0: 57 48 45 52 45 20 70 20 3d 20 27 31 27 22 0a 74  WHERE p = '1'".t
41e0: 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 35 20 30  est_efkey_45 5 0
41f0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68   "DELETE FROM ch
4200: 69 20 57 48 45 52 45 20 63 20 3d 20 27 31 27 22  i WHERE c = '1'"
4210: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35 20 36  .test_efkey_45 6
4220: 20 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   0 "DELETE FROM 
4230: 70 61 72 20 57 48 45 52 45 20 70 20 3d 20 27 31  par WHERE p = '1
4240: 27 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  '".test_efkey_45
4250: 20 37 20 31 20 22 49 4e 53 45 52 54 20 49 4e 54   7 1 "INSERT INT
4260: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 27 31 27  O chi VALUES('1'
4270: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 34 35  )".test_efkey_45
4280: 20 38 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54   8 0 "INSERT INT
4290: 4f 20 63 68 69 20 56 41 4c 55 45 53 28 58 27 33  O chi VALUES(X'3
42a0: 31 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  1')".test_efkey_
42b0: 34 35 20 39 20 31 20 22 49 4e 53 45 52 54 20 49  45 9 1 "INSERT I
42c0: 4e 54 4f 20 63 68 69 20 56 41 4c 55 45 53 28 58  NTO chi VALUES(X
42d0: 27 33 32 27 29 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  '32')"..#-------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c  --.# Specificall
4330: 79 2c 20 74 65 73 74 20 74 68 61 74 20 77 68 65  y, test that whe
4340: 6e 20 63 6f 6d 70 61 72 69 6e 67 20 63 68 69 6c  n comparing chil
4350: 64 20 61 6e 64 20 70 61 72 65 6e 74 20 6b 65 79  d and parent key
4360: 20 76 61 6c 75 65 73 20 74 68 65 0a 23 20 64 65   values the.# de
4370: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
4380: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20  sequence of the 
4390: 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
43a0: 6e 20 69 73 20 75 73 65 64 2e 0a 23 0a 23 20 45  n is used..#.# E
43b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
43c0: 37 39 36 2d 34 37 35 31 33 20 57 68 65 6e 20 63  796-47513 When c
43d0: 6f 6d 70 61 72 69 6e 67 20 74 65 78 74 20 76 61  omparing text va
43e0: 6c 75 65 73 2c 20 74 68 65 20 63 6f 6c 6c 61 74  lues, the collat
43f0: 69 6e 67 0a 23 20 73 65 71 75 65 6e 63 65 20 61  ing.# sequence a
4400: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4410: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  he parent key co
4420: 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 75  lumn is always u
4430: 73 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  sed..#.drop_all_
4440: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
4450: 5f 66 6b 65 79 2d 31 36 2e 31 20 7b 0a 20 20 65  _fkey-16.1 {.  e
4460: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4470: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 43  ATE TABLE t1(a C
4480: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 50 52  OLLATE nocase PR
4490: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
44a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
44b0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
44c0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
44d0: 73 74 20 65 5f 66 6b 65 79 2d 31 36 2e 32 20 7b  st e_fkey-16.2 {
44e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
44f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4500: 56 41 4c 55 45 53 28 27 6f 4e 65 27 29 3b 0a 20  VALUES('oNe');. 
4510: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4520: 32 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29 3b  2 VALUES('one');
4530: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4540: 20 74 32 20 56 41 4c 55 45 53 28 27 4f 4e 45 27   t2 VALUES('ONE'
4550: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 32  );.    UPDATE t2
4560: 20 53 45 54 20 62 20 3d 20 27 4f 6e 45 27 3b 0a   SET b = 'OnE';.
4570: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
4580: 54 20 61 20 3d 20 27 4f 4e 45 27 3b 0a 20 20 7d  T a = 'ONE';.  }
4590: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
45a0: 66 6b 65 79 2d 31 36 2e 33 20 7b 0a 20 20 63 61  fkey-16.3 {.  ca
45b0: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
45c0: 74 32 20 53 45 54 20 62 20 3d 20 27 74 77 6f 27  t2 SET b = 'two'
45d0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
45e0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
45f0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
4600: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
4610: 20 65 5f 66 6b 65 79 2d 31 36 2e 34 20 7b 0a 20   e_fkey-16.4 {. 
4620: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
4630: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
4640: 20 72 6f 77 69 64 20 3d 20 31 20 7d 0a 7d 20 7b   rowid = 1 }.} {
4650: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
4660: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
4670: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
4680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
46c0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
46d0: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 6f  est that when co
46e0: 6d 70 61 72 69 6e 67 20 63 68 69 6c 64 20 61 6e  mparing child an
46f0: 64 20 70 61 72 65 6e 74 20 6b 65 79 20 76 61 6c  d parent key val
4700: 75 65 73 20 74 68 65 0a 23 20 61 66 66 69 6e 69  ues the.# affini
4710: 74 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ty of the parent
4720: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 61   key column is a
4730: 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 63 68  pplied to the ch
4740: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 0a 23 20  ild key value.# 
4750: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 61  before the compa
4760: 72 69 73 6f 6e 20 74 61 6b 65 73 20 70 6c 61 63  rison takes plac
4770: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
4780: 4f 46 3a 20 52 2d 30 34 32 34 30 2d 31 33 38 36  OF: R-04240-1386
4790: 30 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  0 When comparing
47a0: 20 76 61 6c 75 65 73 2c 20 69 66 20 74 68 65 20   values, if the 
47b0: 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 63 6f 6c  parent key.# col
47c0: 75 6d 6e 20 68 61 73 20 61 6e 20 61 66 66 69 6e  umn has an affin
47d0: 69 74 79 2c 20 74 68 65 6e 20 74 68 61 74 20 61  ity, then that a
47e0: 66 66 69 6e 69 74 79 20 69 73 20 61 70 70 6c 69  ffinity is appli
47f0: 65 64 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ed to the child 
4800: 6b 65 79 0a 23 20 76 61 6c 75 65 20 62 65 66 6f  key.# value befo
4810: 72 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  re the compariso
4820: 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
4830: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
4840: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
4850: 2d 31 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -17.1 {.  execsq
4860: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
4870: 41 42 4c 45 20 74 31 28 61 20 4e 55 4d 45 52 49  ABLE t1(a NUMERI
4880: 43 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  C PRIMARY KEY);.
4890: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
48a0: 20 74 32 28 62 20 54 45 58 54 20 52 45 46 45 52   t2(b TEXT REFER
48b0: 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 7d 0a 7d  ENCES t1);.  }.}
48c0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
48d0: 65 79 2d 31 37 2e 32 20 7b 0a 20 20 65 78 65 63  ey-17.2 {.  exec
48e0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
48f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4900: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
4910: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29  NTO t1 VALUES(2)
4920: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4930: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 68 72  O t1 VALUES('thr
4940: 65 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ee');.    INSERT
4950: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
4960: 27 32 2e 30 27 29 3b 0a 20 20 20 20 53 45 4c 45  '2.0');.    SELE
4970: 43 54 20 62 2c 20 74 79 70 65 6f 66 28 62 29 20  CT b, typeof(b) 
4980: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
4990: 32 2e 30 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73  2.0 text}.do_tes
49a0: 74 20 65 5f 66 6b 65 79 2d 31 37 2e 33 20 7b 0a  t e_fkey-17.3 {.
49b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
49c0: 43 54 20 74 79 70 65 6f 66 28 61 29 20 46 52 4f  CT typeof(a) FRO
49d0: 4d 20 74 31 20 7d 0a 7d 20 7b 69 6e 74 65 67 65  M t1 }.} {intege
49e0: 72 20 69 6e 74 65 67 65 72 20 74 65 78 74 7d 0a  r integer text}.
49f0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 31  do_test e_fkey-1
4a00: 37 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  7.4 {.  catchsql
4a10: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
4a20: 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  1 WHERE rowid = 
4a30: 32 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  2 }.} {1 {foreig
4a40: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
4a50: 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 23 23 23 23   failed}}..#####
4a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4a90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4aa0: 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49  ######.### SECTI
4ab0: 4f 4e 20 33 3a 20 52 65 71 75 69 72 65 64 20 61  ON 3: Required a
4ac0: 6e 64 20 53 75 67 67 65 73 74 65 64 20 44 61 74  nd Suggested Dat
4ad0: 61 62 61 73 65 20 49 6e 64 65 78 65 73 0a 23 23  abase Indexes.##
4ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4b20: 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d  #########..#----
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 0a 23 20 41 20 70 61 72 65 6e 74  -----.# A parent
4b80: 20 6b 65 79 20 6d 75 73 74 20 62 65 20 65 69 74   key must be eit
4b90: 68 65 72 20 61 20 50 52 49 4d 41 52 59 20 4b 45  her a PRIMARY KE
4ba0: 59 2c 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  Y, subject to a 
4bb0: 55 4e 49 51 55 45 20 0a 23 20 63 6f 6e 73 74 72  UNIQUE .# constr
4bc0: 61 69 6e 74 2c 20 6f 72 20 68 61 76 65 20 61 20  aint, or have a 
4bd0: 55 4e 49 51 55 45 20 69 6e 64 65 78 20 63 72 65  UNIQUE index cre
4be0: 61 74 65 64 20 6f 6e 20 69 74 2e 0a 23 0a 23 20  ated on it..#.# 
4bf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
4c00: 33 34 33 35 2d 32 36 33 31 31 20 55 73 75 61 6c  3435-26311 Usual
4c10: 6c 79 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6b  ly, the parent k
4c20: 65 79 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  ey of a foreign 
4c30: 6b 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  key.# constraint
4c40: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
4c50: 6b 65 79 20 6f 66 20 74 68 65 20 70 61 72 65 6e  key of the paren
4c60: 74 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 79  t table. If they
4c70: 20 61 72 65 20 6e 6f 74 20 74 68 65 0a 23 20 70   are not the.# p
4c80: 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65 6e  rimary key, then
4c90: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
4ca0: 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
4cb0: 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 73 75 62  collectively sub
4cc0: 6a 65 63 74 0a 23 20 74 6f 20 61 20 55 4e 49 51  ject.# to a UNIQ
4cd0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
4ce0: 20 68 61 76 65 20 61 20 55 4e 49 51 55 45 20 69   have a UNIQUE i
4cf0: 6e 64 65 78 2e 0a 23 20 0a 23 20 41 6c 73 6f 20  ndex..# .# Also 
4d00: 74 65 73 74 20 74 68 61 74 20 69 66 20 61 20 70  test that if a p
4d10: 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6e 6f 74  arent key is not
4d20: 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20 50 52   subject to a PR
4d30: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
4d40: 51 55 45 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74  QUE.# constraint
4d50: 2c 20 62 75 74 20 64 6f 65 73 20 68 61 76 65 20  , but does have 
4d60: 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 63  a UNIQUE index c
4d70: 72 65 61 74 65 64 20 6f 6e 20 69 74 2c 20 74 68  reated on it, th
4d80: 65 6e 20 74 68 65 20 55 4e 49 51 55 45 20 69 6e  en the UNIQUE in
4d90: 64 65 78 0a 23 20 6d 75 73 74 20 75 73 65 20 74  dex.# must use t
4da0: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
4db0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
4dc0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4dd0: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20  he parent key.# 
4de0: 63 6f 6c 75 6d 6e 73 2e 0a 23 0a 23 20 45 56 49  columns..#.# EVI
4df0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 33 37  DENCE-OF: R-0037
4e00: 36 2d 33 39 32 31 32 20 49 66 20 74 68 65 20 70  6-39212 If the p
4e10: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
4e20: 73 20 68 61 76 65 20 61 20 55 4e 49 51 55 45 0a  s have a UNIQUE.
4e30: 23 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68  # index, then th
4e40: 61 74 20 69 6e 64 65 78 20 6d 75 73 74 20 75 73  at index must us
4e50: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
4e60: 73 65 71 75 65 6e 63 65 73 20 74 68 61 74 20 61  sequences that a
4e70: 72 65 0a 23 20 73 70 65 63 69 66 69 65 64 20 69  re.# specified i
4e80: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
4e90: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  LE statement for
4ea0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
4eb0: 65 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  e..#.drop_all_ta
4ec0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66  bles.do_test e_f
4ed0: 6b 65 79 2d 31 38 2e 31 20 7b 0a 20 20 65 78 65  key-18.1 {.  exe
4ee0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4ef0: 45 20 54 41 42 4c 45 20 74 32 28 61 20 52 45 46  E TABLE t2(a REF
4f00: 45 52 45 4e 43 45 53 20 74 31 28 78 29 29 3b 0a  ERENCES t1(x));.
4f10: 20 20 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65    }.} {}.proc te
4f20: 73 74 5f 65 66 6b 65 79 5f 35 37 20 7b 74 6e 20  st_efkey_57 {tn 
4f30: 69 73 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20  isError sql} {. 
4f40: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50   catchsql { DROP
4f50: 20 54 41 42 4c 45 20 74 31 20 7d 0a 20 20 65 78   TABLE t1 }.  ex
4f60: 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64 6f 5f  ecsql $sql.  do_
4f70: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 38 2e 24  test e_fkey-18.$
4f80: 74 6e 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  tn {.    catchsq
4f90: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4fa0: 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 20  t2 VALUES(NULL) 
4fb0: 7d 0a 20 20 7d 20 5b 6c 69 6e 64 65 78 20 7b 7b  }.  } [lindex {{
4fc0: 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69 67  0 {}} {1 {foreig
4fd0: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
4fe0: 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 74 65  } $isError].}.te
4ff0: 73 74 5f 65 66 6b 65 79 5f 35 37 20 32 20 30 20  st_efkey_57 2 0 
5000: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  { CREATE TABLE t
5010: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
5020: 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37   }.test_efkey_57
5030: 20 33 20 30 20 7b 20 43 52 45 41 54 45 20 54 41   3 0 { CREATE TA
5040: 42 4c 45 20 74 31 28 78 20 55 4e 49 51 55 45 29  BLE t1(x UNIQUE)
5050: 20 7d 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37   }.test_efkey_57
5060: 20 34 20 30 20 7b 20 43 52 45 41 54 45 20 54 41   4 0 { CREATE TA
5070: 42 4c 45 20 74 31 28 78 29 3b 20 43 52 45 41 54  BLE t1(x); CREAT
5080: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74  E UNIQUE INDEX t
5090: 31 69 20 4f 4e 20 74 31 28 78 29 20 7d 0a 74 65  1i ON t1(x) }.te
50a0: 73 74 5f 65 66 6b 65 79 5f 35 37 20 35 20 31 20  st_efkey_57 5 1 
50b0: 7b 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  { .  CREATE TABL
50c0: 45 20 74 31 28 78 29 3b 20 0a 20 20 43 52 45 41  E t1(x); .  CREA
50d0: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
50e0: 74 31 69 20 4f 4e 20 74 31 28 78 20 43 4f 4c 4c  t1i ON t1(x COLL
50f0: 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 7d 0a 74  ATE nocase);.}.t
5100: 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 36 20 31  est_efkey_57 6 1
5110: 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   { CREATE TABLE 
5120: 74 31 28 78 29 20 7d 0a 74 65 73 74 5f 65 66 6b  t1(x) }.test_efk
5130: 65 79 5f 35 37 20 37 20 31 20 7b 20 43 52 45 41  ey_57 7 1 { CREA
5140: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5150: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c  , PRIMARY KEY(x,
5160: 20 79 29 29 20 7d 0a 74 65 73 74 5f 65 66 6b 65   y)) }.test_efke
5170: 79 5f 35 37 20 38 20 31 20 7b 20 43 52 45 41 54  y_57 8 1 { CREAT
5180: 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c  E TABLE t1(x, y,
5190: 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 20 7d   UNIQUE(x, y)) }
51a0: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 35 37 20 39  .test_efkey_57 9
51b0: 20 31 20 7b 20 0a 20 20 43 52 45 41 54 45 20 54   1 { .  CREATE T
51c0: 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 20 0a  ABLE t1(x, y); .
51d0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
51e0: 49 4e 44 45 58 20 74 31 69 20 4f 4e 20 74 31 28  INDEX t1i ON t1(
51f0: 78 2c 20 79 29 3b 0a 7d 0a 0a 0a 23 2d 2d 2d 2d  x, y);.}...#----
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
5250: 63 6b 20 74 65 73 74 73 20 61 6e 20 65 78 61 6d  ck tests an exam
5260: 70 6c 65 20 69 6e 20 66 6f 72 65 69 67 6e 6b 65  ple in foreignke
5270: 79 73 2e 68 74 6d 6c 2e 20 53 65 76 65 72 61 6c  ys.html. Several
5280: 20 74 65 73 74 61 62 6c 65 0a 23 20 73 74 61 74   testable.# stat
5290: 65 6d 65 6e 74 73 20 72 65 66 65 72 20 74 6f 20  ements refer to 
52a0: 74 68 69 73 20 65 78 61 6d 70 6c 65 2c 20 61 73  this example, as
52b0: 20 66 6f 6c 6c 6f 77 73 0a 23 0a 23 20 45 56 49   follows.#.# EVI
52c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 34 38  DENCE-OF: R-2748
52d0: 34 2d 30 31 34 36 37 0a 23 0a 23 20 46 4b 20 43  4-01467.#.# FK C
52e0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 63 68  onstraints on ch
52f0: 69 6c 64 31 2c 20 63 68 69 6c 64 32 20 61 6e 64  ild1, child2 and
5300: 20 63 68 69 6c 64 33 20 61 72 65 20 4f 6b 2e 0a   child3 are Ok..
5310: 23 0a 23 20 50 72 6f 62 6c 65 6d 20 77 69 74 68  #.# Problem with
5320: 20 46 4b 20 6f 6e 20 63 68 69 6c 64 34 3a 0a 23   FK on child4:.#
5330: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5340: 52 2d 35 31 30 33 39 2d 34 34 38 34 30 20 54 68  R-51039-44840 Th
5350: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  e foreign key de
5360: 63 6c 61 72 65 64 20 61 73 20 70 61 72 74 20 6f  clared as part o
5370: 66 20 74 61 62 6c 65 0a 23 20 63 68 69 6c 64 34  f table.# child4
5380: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
5390: 61 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68  ause even though
53a0: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
53b0: 63 6f 6c 75 6d 6e 20 69 73 0a 23 20 69 6e 64 65  column is.# inde
53c0: 78 65 64 2c 20 74 68 65 20 69 6e 64 65 78 20 69  xed, the index i
53d0: 73 20 6e 6f 74 20 55 4e 49 51 55 45 2e 0a 23 0a  s not UNIQUE..#.
53e0: 23 20 50 72 6f 62 6c 65 6d 20 77 69 74 68 20 46  # Problem with F
53f0: 4b 20 6f 6e 20 63 68 69 6c 64 35 3a 0a 23 0a 23  K on child5:.#.#
5400: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5410: 30 31 30 36 30 2d 34 38 37 38 38 20 54 68 65 20  01060-48788 The 
5420: 66 6f 72 65 69 67 6e 20 6b 65 79 20 66 6f 72 20  foreign key for 
5430: 74 61 62 6c 65 20 63 68 69 6c 64 35 20 69 73 20  table child5 is 
5440: 61 6e 0a 23 20 65 72 72 6f 72 20 62 65 63 61 75  an.# error becau
5450: 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  se even though t
5460: 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f  he parent key co
5470: 6c 75 6d 6e 20 68 61 73 20 61 20 75 6e 69 71 75  lumn has a uniqu
5480: 65 20 69 6e 64 65 78 2c 0a 23 20 74 68 65 20 69  e index,.# the i
5490: 6e 64 65 78 20 75 73 65 73 20 61 20 64 69 66 66  ndex uses a diff
54a0: 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
54b0: 73 65 71 75 65 6e 63 65 2e 0a 23 0a 23 20 50 72  sequence..#.# Pr
54c0: 6f 62 6c 65 6d 20 77 69 74 68 20 46 4b 20 6f 6e  oblem with FK on
54d0: 20 63 68 69 6c 64 36 20 61 6e 64 20 63 68 69 6c   child6 and chil
54e0: 64 37 3a 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  d7:.#.# EVIDENCE
54f0: 2d 4f 46 3a 20 52 2d 36 33 30 38 38 2d 33 37 34  -OF: R-63088-374
5500: 36 39 20 54 61 62 6c 65 73 20 63 68 69 6c 64 36  69 Tables child6
5510: 20 61 6e 64 20 63 68 69 6c 64 37 20 61 72 65 20   and child7 are 
5520: 69 6e 63 6f 72 72 65 63 74 0a 23 20 62 65 63 61  incorrect.# beca
5530: 75 73 65 20 77 68 69 6c 65 20 62 6f 74 68 20 68  use while both h
5540: 61 76 65 20 55 4e 49 51 55 45 20 69 6e 64 69 63  ave UNIQUE indic
5550: 65 73 20 6f 6e 20 74 68 65 69 72 20 70 61 72 65  es on their pare
5560: 6e 74 20 6b 65 79 73 2c 20 74 68 65 20 6b 65 79  nt keys, the key
5570: 73 0a 23 20 61 72 65 20 6e 6f 74 20 61 6e 20 65  s.# are not an e
5580: 78 61 63 74 20 6d 61 74 63 68 20 74 6f 20 74 68  xact match to th
5590: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 73  e columns of a s
55a0: 69 6e 67 6c 65 20 55 4e 49 51 55 45 20 69 6e 64  ingle UNIQUE ind
55b0: 65 78 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ex..#.drop_all_t
55c0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
55d0: 66 6b 65 79 2d 31 39 2e 31 20 7b 0a 20 20 65 78  fkey-19.1 {.  ex
55e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
55f0: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
5600: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
5610: 20 55 4e 49 51 55 45 2c 20 63 2c 20 64 2c 20 65   UNIQUE, c, d, e
5620: 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , f);.    CREATE
5630: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69 31   UNIQUE INDEX i1
5640: 20 4f 4e 20 70 61 72 65 6e 74 28 63 2c 20 64 29   ON parent(c, d)
5650: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
5660: 45 58 20 69 32 20 4f 4e 20 70 61 72 65 6e 74 28  EX i2 ON parent(
5670: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55  e);.    CREATE U
5680: 4e 49 51 55 45 20 49 4e 44 45 58 20 69 33 20 4f  NIQUE INDEX i3 O
5690: 4e 20 70 61 72 65 6e 74 28 66 20 43 4f 4c 4c 41  N parent(f COLLA
56a0: 54 45 20 6e 6f 63 61 73 65 29 3b 0a 0a 20 20 20  TE nocase);..   
56b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
56c0: 69 6c 64 31 28 66 2c 20 67 20 52 45 46 45 52 45  ild1(f, g REFERE
56d0: 4e 43 45 53 20 70 61 72 65 6e 74 28 61 29 29 3b  NCES parent(a));
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20 20         -- Ok.   
5700: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
5710: 69 6c 64 32 28 68 2c 20 69 20 52 45 46 45 52 45  ild2(h, i REFERE
5720: 4e 43 45 53 20 70 61 72 65 6e 74 28 62 29 29 3b  NCES parent(b));
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 20 20 2d 2d 20 4f 6b 0a 20 20 20         -- Ok.   
5750: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
5760: 69 6c 64 33 28 6a 2c 20 6b 2c 20 46 4f 52 45 49  ild3(j, k, FOREI
5770: 47 4e 20 4b 45 59 28 6a 2c 20 6b 29 20 52 45 46  GN KEY(j, k) REF
5780: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 63  ERENCES parent(c
5790: 2c 20 64 29 29 3b 20 2d 2d 20 4f 6b 0a 20 20 20  , d)); -- Ok.   
57a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
57b0: 69 6c 64 34 28 6c 2c 20 6d 20 52 45 46 45 52 45  ild4(l, m REFERE
57c0: 4e 43 45 53 20 70 61 72 65 6e 74 28 65 29 29 3b  NCES parent(e));
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 20 2d 2d 20 45 72 72 0a 20 20         -- Err.  
57f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
5800: 68 69 6c 64 35 28 6e 2c 20 6f 20 52 45 46 45 52  hild5(n, o REFER
5810: 45 4e 43 45 53 20 70 61 72 65 6e 74 28 66 29 29  ENCES parent(f))
5820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5830: 20 20 20 20 20 20 20 20 2d 2d 20 45 72 72 0a 20          -- Err. 
5840: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5850: 63 68 69 6c 64 36 28 70 2c 20 71 2c 20 46 4f 52  child6(p, q, FOR
5860: 45 49 47 4e 20 4b 45 59 28 70 2c 71 29 20 52 45  EIGN KEY(p,q) RE
5870: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
5880: 62 2c 20 63 29 29 3b 20 20 2d 2d 20 45 72 72 0a  b, c));  -- Err.
5890: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
58a0: 20 63 68 69 6c 64 37 28 72 20 52 45 46 45 52 45   child7(r REFERE
58b0: 4e 43 45 53 20 70 61 72 65 6e 74 28 63 29 29 3b  NCES parent(c));
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 45 72 72            -- Err
58e0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
58f0: 74 20 65 5f 66 6b 65 79 2d 31 39 2e 32 20 7b 0a  t e_fkey-19.2 {.
5900: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5910: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
5920: 6e 74 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  nt VALUES(1, 2, 
5930: 33 2c 20 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20  3, 4, 5, 6);.   
5940: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
5950: 6c 64 31 20 56 41 4c 55 45 53 28 27 78 78 78 27  ld1 VALUES('xxx'
5960: 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
5970: 20 49 4e 54 4f 20 63 68 69 6c 64 32 20 56 41 4c   INTO child2 VAL
5980: 55 45 53 28 27 78 78 78 27 2c 20 32 29 3b 0a 20  UES('xxx', 2);. 
5990: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
59a0: 68 69 6c 64 33 20 56 41 4c 55 45 53 28 33 2c 20  hild3 VALUES(3, 
59b0: 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  4);.  }.} {}.do_
59c0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 32  test e_fkey-19.2
59d0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
59e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
59f0: 64 34 20 56 41 4c 55 45 53 28 27 78 78 78 27 2c  d4 VALUES('xxx',
5a00: 20 35 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65   5) }.} {1 {fore
5a10: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
5a20: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
5a30: 79 2d 31 39 2e 33 20 7b 0a 20 20 63 61 74 63 68  y-19.3 {.  catch
5a40: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5a50: 4f 20 63 68 69 6c 64 35 20 56 41 4c 55 45 53 28  O child5 VALUES(
5a60: 27 78 78 78 27 2c 20 36 29 20 7d 0a 7d 20 7b 31  'xxx', 6) }.} {1
5a70: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   {foreign key mi
5a80: 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74  smatch}}.do_test
5a90: 20 65 5f 66 6b 65 79 2d 31 39 2e 34 20 7b 0a 20   e_fkey-19.4 {. 
5aa0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
5ab0: 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 36 20 56  RT INTO child6 V
5ac0: 41 4c 55 45 53 28 32 2c 20 33 29 20 7d 0a 7d 20  ALUES(2, 3) }.} 
5ad0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
5ae0: 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74 65  mismatch}}.do_te
5af0: 73 74 20 65 5f 66 6b 65 79 2d 31 39 2e 35 20 7b  st e_fkey-19.5 {
5b00: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
5b10: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 37  SERT INTO child7
5b20: 20 56 41 4c 55 45 53 28 33 29 20 7d 0a 7d 20 7b   VALUES(3) }.} {
5b30: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  1 {foreign key m
5b40: 69 73 6d 61 74 63 68 7d 7d 0a 0a 23 2d 2d 2d 2d  ismatch}}..#----
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b90: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 65 72 72  -----.# Test err
5ba0: 6f 72 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ors in the datab
5bb0: 61 73 65 20 73 63 68 65 6d 61 20 74 68 61 74 20  ase schema that 
5bc0: 61 72 65 20 64 65 74 65 63 74 65 64 20 77 68 69  are detected whi
5bd0: 6c 65 20 70 72 65 70 61 72 69 6e 67 0a 23 20 44  le preparing.# D
5be0: 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54  ML statements. T
5bf0: 68 65 20 65 72 72 6f 72 20 74 65 78 74 20 66 6f  he error text fo
5c00: 72 20 74 68 65 73 65 20 6d 65 73 73 61 67 65 73  r these messages
5c10: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 20   always matches 
5c20: 0a 23 20 65 69 74 68 65 72 20 22 66 6f 72 65 69  .# either "forei
5c30: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22  gn key mismatch"
5c40: 20 6f 72 20 22 6e 6f 20 73 75 63 68 20 74 61 62   or "no such tab
5c50: 6c 65 2a 22 20 28 75 73 69 6e 67 20 5b 73 74 72  le*" (using [str
5c60: 69 6e 67 20 6d 61 74 63 68 5d 29 2e 0a 23 0a 23  ing match])..#.#
5c70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5c80: 34 35 34 38 38 2d 30 38 35 30 34 20 49 66 20 74  45488-08504 If t
5c90: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
5ca0: 6d 61 20 63 6f 6e 74 61 69 6e 73 20 66 6f 72 65  ma contains fore
5cb0: 69 67 6e 20 6b 65 79 0a 23 20 65 72 72 6f 72 73  ign key.# errors
5cc0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
5cd0: 6f 6b 69 6e 67 20 61 74 20 6d 6f 72 65 20 74 68  oking at more th
5ce0: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 64 65 66  an one table def
5cf0: 69 6e 69 74 69 6f 6e 20 74 6f 0a 23 20 69 64 65  inition to.# ide
5d00: 6e 74 69 66 79 2c 20 74 68 65 6e 20 74 68 6f 73  ntify, then thos
5d10: 65 20 65 72 72 6f 72 73 20 61 72 65 20 6e 6f 74  e errors are not
5d20: 20 64 65 74 65 63 74 65 64 20 77 68 65 6e 20 74   detected when t
5d30: 68 65 20 74 61 62 6c 65 73 20 61 72 65 0a 23 20  he tables are.# 
5d40: 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45 56 49  created..#.# EVI
5d50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 33 39  DENCE-OF: R-4839
5d60: 31 2d 33 38 34 37 32 20 49 6e 73 74 65 61 64 2c  1-38472 Instead,
5d70: 20 73 75 63 68 20 65 72 72 6f 72 73 20 70 72 65   such errors pre
5d80: 76 65 6e 74 20 74 68 65 0a 23 20 61 70 70 6c 69  vent the.# appli
5d90: 63 61 74 69 6f 6e 20 66 72 6f 6d 20 70 72 65 70  cation from prep
5da0: 61 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65 6d  aring SQL statem
5db0: 65 6e 74 73 20 74 68 61 74 20 6d 6f 64 69 66 79  ents that modify
5dc0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
5dd0: 23 20 74 68 65 20 63 68 69 6c 64 20 6f 72 20 70  # the child or p
5de0: 61 72 65 6e 74 20 74 61 62 6c 65 73 20 69 6e 20  arent tables in 
5df0: 77 61 79 73 20 74 68 61 74 20 75 73 65 20 74 68  ways that use th
5e00: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  e foreign keys..
5e10: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
5e20: 20 52 2d 30 33 31 30 38 2d 36 33 36 35 39 20 54   R-03108-63659 T
5e30: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
5e40: 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  age error messag
5e50: 65 20 66 6f 72 0a 23 20 66 6f 72 65 69 67 6e 20  e for.# foreign 
5e60: 6b 65 79 20 44 4d 4c 20 65 72 72 6f 72 73 20 69  key DML errors i
5e70: 73 20 75 73 75 61 6c 6c 79 20 22 66 6f 72 65 69  s usually "forei
5e80: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22  gn key mismatch"
5e90: 20 62 75 74 20 63 61 6e 20 61 6c 73 6f 0a 23 20   but can also.# 
5ea0: 62 65 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  be "no such tabl
5eb0: 65 22 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  e" if the parent
5ec0: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
5ed0: 65 78 69 73 74 2e 0a 23 0a 23 20 45 56 49 44 45  exist..#.# EVIDE
5ee0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 37 38 31 2d  NCE-OF: R-60781-
5ef0: 32 36 35 37 36 20 46 6f 72 65 69 67 6e 20 6b 65  26576 Foreign ke
5f00: 79 20 44 4d 4c 20 65 72 72 6f 72 73 20 61 72 65  y DML errors are
5f10: 20 6d 61 79 20 62 65 20 72 65 70 6f 72 74 65 64   may be reported
5f20: 0a 23 20 69 66 3a 20 54 68 65 20 70 61 72 65 6e  .# if: The paren
5f30: 74 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  t table does not
5f40: 20 65 78 69 73 74 2c 20 6f 72 20 54 68 65 20 70   exist, or The p
5f50: 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e  arent key column
5f60: 73 20 6e 61 6d 65 64 0a 23 20 69 6e 20 74 68 65  s named.# in the
5f70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
5f80: 73 74 72 61 69 6e 74 20 64 6f 20 6e 6f 74 20 65  straint do not e
5f90: 78 69 73 74 2c 20 6f 72 20 54 68 65 20 70 61 72  xist, or The par
5fa0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a  ent key columns.
5fb0: 23 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 66  # named in the f
5fc0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
5fd0: 72 61 69 6e 74 20 61 72 65 20 6e 6f 74 20 74 68  raint are not th
5fe0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66  e primary key of
5ff0: 20 74 68 65 0a 23 20 70 61 72 65 6e 74 20 74 61   the.# parent ta
6000: 62 6c 65 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ble and are not 
6010: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 75 6e 69  subject to a uni
6020: 71 75 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 75  que constraint u
6030: 73 69 6e 67 0a 23 20 63 6f 6c 6c 61 74 69 6e 67  sing.# collating
6040: 20 73 65 71 75 65 6e 63 65 20 73 70 65 63 69 66   sequence specif
6050: 69 65 64 20 69 6e 20 74 68 65 20 43 52 45 41 54  ied in the CREAT
6060: 45 20 54 41 42 4c 45 2c 20 6f 72 20 54 68 65 20  E TABLE, or The 
6070: 63 68 69 6c 64 20 74 61 62 6c 65 0a 23 20 72 65  child table.# re
6080: 66 65 72 65 6e 63 65 73 20 74 68 65 20 70 72 69  ferences the pri
6090: 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20  mary key of the 
60a0: 70 61 72 65 6e 74 20 77 69 74 68 6f 75 74 20 73  parent without s
60b0: 70 65 63 69 66 79 69 6e 67 20 74 68 65 0a 23 20  pecifying the.# 
60c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
60d0: 6d 6e 73 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  mns and the numb
60e0: 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
60f0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
6100: 0a 23 20 70 61 72 65 6e 74 20 64 6f 20 6e 6f 74  .# parent do not
6110: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
6120: 72 20 6f 66 20 63 68 69 6c 64 20 6b 65 79 20 63  r of child key c
6130: 6f 6c 75 6d 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73  olumns..#.do_tes
6140: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 31 20 7b 0a  t e_fkey-20.1 {.
6150: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6160: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
6170: 63 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73  c REFERENCES nos
6180: 75 63 68 74 61 62 6c 65 2c 20 64 29 3b 0a 0a 20  uchtable, d);.. 
6190: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
61a0: 70 32 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  p2(a, b, UNIQUE(
61b0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41  a, b));.    CREA
61c0: 54 45 20 54 41 42 4c 45 20 63 32 28 63 2c 20 64  TE TABLE c2(c, d
61d0: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
61e0: 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
61f0: 32 28 61 2c 20 78 29 29 3b 0a 0a 20 20 20 20 43  2(a, x));..    C
6200: 52 45 41 54 45 20 54 41 42 4c 45 20 70 33 28 61  REATE TABLE p3(a
6210: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
6220: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
6230: 4c 45 20 63 33 28 63 20 52 45 46 45 52 45 4e 43  LE c3(c REFERENC
6240: 45 53 20 70 33 28 62 29 2c 20 64 29 3b 0a 0a 20  ES p3(b), d);.. 
6250: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6260: 70 34 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p4(a PRIMARY KEY
6270: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
6280: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 34   UNIQUE INDEX p4
6290: 69 20 4f 4e 20 70 34 28 62 20 43 4f 4c 4c 41 54  i ON p4(b COLLAT
62a0: 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 43  E nocase);.    C
62b0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 34 28 63  REATE TABLE c4(c
62c0: 20 52 45 46 45 52 45 4e 43 45 53 20 70 34 28 62   REFERENCES p4(b
62d0: 29 2c 20 64 29 3b 0a 0a 20 20 20 20 43 52 45 41  ), d);..    CREA
62e0: 54 45 20 54 41 42 4c 45 20 70 35 28 61 20 50 52  TE TABLE p5(a PR
62f0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 43 4f 4c  IMARY KEY, b COL
6300: 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20  LATE nocase);.  
6310: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
6320: 49 4e 44 45 58 20 70 35 69 20 4f 4e 20 70 35 28  INDEX p5i ON p5(
6330: 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  b COLLATE binary
6340: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
6350: 42 4c 45 20 63 35 28 63 20 52 45 46 45 52 45 4e  BLE c5(c REFEREN
6360: 43 45 53 20 70 35 28 62 29 2c 20 64 29 3b 0a 0a  CES p5(b), d);..
6370: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6380: 20 70 36 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p6(a PRIMARY KE
6390: 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, b);.    CREAT
63a0: 45 20 54 41 42 4c 45 20 63 36 28 63 2c 20 64 2c  E TABLE c6(c, d,
63b0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
63c0: 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 36  d) REFERENCES p6
63d0: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
63e0: 41 42 4c 45 20 70 37 28 61 2c 20 62 2c 20 50 52  ABLE p7(a, b, PR
63f0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
6400: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
6410: 4c 45 20 63 37 28 63 2c 20 64 20 52 45 46 45 52  LE c7(c, d REFER
6420: 45 4e 43 45 53 20 70 37 29 3b 0a 20 20 7d 0a 7d  ENCES p7);.  }.}
6430: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
6440: 20 74 62 6c 20 70 74 62 6c 20 65 72 72 7d 20 7b   tbl ptbl err} {
6450: 0a 20 20 32 20 63 31 20 7b 7d 20 22 6e 6f 20 73  .  2 c1 {} "no s
6460: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
6470: 6e 6f 73 75 63 68 74 61 62 6c 65 22 0a 20 20 33  nosuchtable".  3
6480: 20 63 32 20 70 32 20 22 66 6f 72 65 69 67 6e 20   c2 p2 "foreign 
6490: 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 0a 20 20  key mismatch".  
64a0: 34 20 63 33 20 70 33 20 22 66 6f 72 65 69 67 6e  4 c3 p3 "foreign
64b0: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 0a 20   key mismatch". 
64c0: 20 35 20 63 34 20 70 34 20 22 66 6f 72 65 69 67   5 c4 p4 "foreig
64d0: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 0a  n key mismatch".
64e0: 20 20 36 20 63 35 20 70 35 20 22 66 6f 72 65 69    6 c5 p5 "forei
64f0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 22  gn key mismatch"
6500: 0a 20 20 37 20 63 36 20 70 36 20 22 66 6f 72 65  .  7 c6 p6 "fore
6510: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
6520: 22 0a 20 20 38 20 63 37 20 70 37 20 22 66 6f 72  ".  8 c7 p7 "for
6530: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
6540: 68 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  h".} {.  do_test
6550: 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 31   e_fkey-20.$tn.1
6560: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
6570: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 74 62  "INSERT INTO $tb
6580: 6c 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  l VALUES('a', 'b
6590: 27 29 22 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20  ')".  } [list 1 
65a0: 24 65 72 72 5d 0a 20 20 64 6f 5f 74 65 73 74 20  $err].  do_test 
65b0: 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 32 20  e_fkey-20.$tn.2 
65c0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 22  {.    catchsql "
65d0: 55 50 44 41 54 45 20 24 74 62 6c 20 53 45 54 20  UPDATE $tbl SET 
65e0: 63 20 3d 20 3f 2c 20 64 20 3d 20 3f 22 0a 20 20  c = ?, d = ?".  
65f0: 7d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d 0a  } [list 1 $err].
6600: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
6610: 2d 32 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -20.$tn.3 {.    
6620: 63 61 74 63 68 73 71 6c 20 22 49 4e 53 45 52 54  catchsql "INSERT
6630: 20 49 4e 54 4f 20 24 74 62 6c 20 53 45 4c 45 43   INTO $tbl SELEC
6640: 54 20 3f 2c 20 3f 22 0a 20 20 7d 20 5b 6c 69 73  T ?, ?".  } [lis
6650: 74 20 31 20 24 65 72 72 5d 0a 0a 20 20 69 66 20  t 1 $err]..  if 
6660: 7b 24 70 74 62 6c 20 6e 65 20 22 22 7d 20 7b 0a  {$ptbl ne ""} {.
6670: 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b      do_test e_fk
6680: 65 79 2d 32 30 2e 24 74 6e 2e 34 20 7b 0a 20 20  ey-20.$tn.4 {.  
6690: 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 44 45      catchsql "DE
66a0: 4c 45 54 45 20 46 52 4f 4d 20 24 70 74 62 6c 22  LETE FROM $ptbl"
66b0: 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20 24  .    } [list 1 $
66c0: 65 72 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  err].    do_test
66d0: 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e 35   e_fkey-20.$tn.5
66e0: 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71   {.      catchsq
66f0: 6c 20 22 55 50 44 41 54 45 20 24 70 74 62 6c 20  l "UPDATE $ptbl 
6700: 53 45 54 20 61 20 3d 20 3f 2c 20 62 20 3d 20 3f  SET a = ?, b = ?
6710: 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20  ".    } [list 1 
6720: 24 65 72 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73  $err].    do_tes
6730: 74 20 65 5f 66 6b 65 79 2d 32 30 2e 24 74 6e 2e  t e_fkey-20.$tn.
6740: 36 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  6 {.      catchs
6750: 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql "INSERT INTO 
6760: 24 70 74 62 6c 20 53 45 4c 45 43 54 20 3f 2c 20  $ptbl SELECT ?, 
6770: 3f 22 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31  ?".    } [list 1
6780: 20 24 65 72 72 5d 0a 20 20 7d 0a 7d 0a 0a 23 2d   $err].  }.}..#-
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
67e0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 33 35 33 2d  NCE-OF: R-19353-
67f0: 34 33 36 34 33 0a 23 0a 23 20 54 65 73 74 20 74  43643.#.# Test t
6800: 68 65 20 65 78 61 6d 70 6c 65 20 6f 66 20 66 6f  he example of fo
6810: 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
6820: 63 68 20 65 72 72 6f 72 73 20 63 61 75 73 65 64  ch errors caused
6830: 20 62 79 20 69 6d 70 6c 69 63 69 74 6c 79 0a 23   by implicitly.#
6840: 20 6d 61 70 70 69 6e 67 20 61 20 63 68 69 6c 64   mapping a child
6850: 20 6b 65 79 20 74 6f 20 74 68 65 20 70 72 69 6d   key to the prim
6860: 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 70  ary key of the p
6870: 61 72 65 6e 74 20 74 61 62 6c 65 20 77 68 65 6e  arent table when
6880: 20 74 68 65 0a 23 20 63 68 69 6c 64 20 6b 65 79   the.# child key
6890: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 64   consists of a d
68a0: 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
68b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  of columns to th
68c0: 61 74 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  at primary key..
68d0: 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  # .drop_all_tabl
68e0: 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
68f0: 79 2d 32 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  y-21.1 {.  execs
6900: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
6910: 54 41 42 4c 45 20 70 61 72 65 6e 74 32 28 61 2c  TABLE parent2(a,
6920: 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
6930: 61 2c 62 29 29 3b 0a 0a 20 20 20 20 43 52 45 41  a,b));..    CREA
6940: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 38 28  TE TABLE child8(
6950: 78 2c 20 79 2c 20 46 4f 52 45 49 47 4e 20 4b 45  x, y, FOREIGN KE
6960: 59 28 78 2c 79 29 20 52 45 46 45 52 45 4e 43 45  Y(x,y) REFERENCE
6970: 53 20 70 61 72 65 6e 74 32 29 3b 20 20 20 20 20  S parent2);     
6980: 2d 2d 20 4f 6b 0a 20 20 20 20 43 52 45 41 54 45  -- Ok.    CREATE
6990: 20 54 41 42 4c 45 20 63 68 69 6c 64 39 28 78 20   TABLE child9(x 
69a0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
69b0: 74 32 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t2);            
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
69d0: 20 45 72 72 0a 20 20 20 20 43 52 45 41 54 45 20   Err.    CREATE 
69e0: 54 41 42 4c 45 20 63 68 69 6c 64 31 30 28 78 2c  TABLE child10(x,
69f0: 79 2c 7a 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  y,z, FOREIGN KEY
6a00: 28 78 2c 79 2c 7a 29 20 52 45 46 45 52 45 4e 43  (x,y,z) REFERENC
6a10: 45 53 20 70 61 72 65 6e 74 32 29 3b 20 2d 2d 20  ES parent2); -- 
6a20: 45 72 72 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  Err.  }.} {}.do_
6a30: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 32  test e_fkey-21.2
6a40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6a50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
6a60: 61 72 65 6e 74 32 20 56 41 4c 55 45 53 28 27 49  arent2 VALUES('I
6a70: 27 2c 20 27 49 49 27 29 3b 0a 20 20 20 20 49 4e  ', 'II');.    IN
6a80: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 38  SERT INTO child8
6a90: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
6aa0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
6ab0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e 33  test e_fkey-21.3
6ac0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
6ad0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
6ae0: 64 39 20 56 41 4c 55 45 53 28 27 49 27 29 20 7d  d9 VALUES('I') }
6af0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
6b00: 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f  ey mismatch}}.do
6b10: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 31 2e  _test e_fkey-21.
6b20: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
6b30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
6b40: 6c 64 39 20 56 41 4c 55 45 53 28 27 49 49 27 29  ld9 VALUES('II')
6b50: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
6b60: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a   key mismatch}}.
6b70: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
6b80: 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.5 {.  catchsql
6b90: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
6ba0: 68 69 6c 64 39 20 56 41 4c 55 45 53 28 4e 55 4c  hild9 VALUES(NUL
6bb0: 4c 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  L) }.} {1 {forei
6bc0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d  gn key mismatch}
6bd0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
6be0: 2d 32 31 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  -21.6 {.  catchs
6bf0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
6c00: 20 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28   child10 VALUES(
6c10: 27 49 27 2c 20 27 49 49 27 2c 20 27 49 49 49 27  'I', 'II', 'III'
6c20: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
6c30: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
6c40: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
6c50: 32 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71  21.7 {.  catchsq
6c60: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
6c70: 63 68 69 6c 64 31 30 20 56 41 4c 55 45 53 28 31  child10 VALUES(1
6c80: 2c 20 32 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b  , 2, 3) }.} {1 {
6c90: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
6ca0: 61 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  atch}}.do_test e
6cb0: 5f 66 6b 65 79 2d 32 31 2e 38 20 7b 0a 20 20 63  _fkey-21.8 {.  c
6cc0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
6cd0: 20 49 4e 54 4f 20 63 68 69 6c 64 31 30 20 56 41   INTO child10 VA
6ce0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  LUES(NULL, NULL,
6cf0: 20 4e 55 4c 4c 29 20 7d 0a 7d 20 7b 31 20 7b 66   NULL) }.} {1 {f
6d00: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61  oreign key misma
6d10: 74 63 68 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  tch}}..#--------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 0a 23 20 54 65 73 74 20 65 72 72 6f 72 73 20  -.# Test errors 
6d70: 74 68 61 74 20 61 72 65 20 72 65 70 6f 72 74 65  that are reporte
6d80: 64 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  d when creating 
6d90: 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 2e  the child table.
6da0: 20 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c 79   .# Specifically
6db0: 3a 0a 23 0a 23 20 20 20 2a 20 64 69 66 66 65 72  :.#.#   * differ
6dc0: 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ent number of ch
6dd0: 69 6c 64 20 61 6e 64 20 70 61 72 65 6e 74 20 6b  ild and parent k
6de0: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64 0a  ey columns, and.
6df0: 23 20 20 20 2a 20 63 68 69 6c 64 20 63 6f 6c 75  #   * child colu
6e00: 6d 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  mns that do not 
6e10: 65 78 69 73 74 2e 0a 23 0a 23 20 45 56 49 44 45  exist..#.# EVIDE
6e20: 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 36 38 32 2d  NCE-OF: R-23682-
6e30: 35 39 38 32 30 20 42 79 20 63 6f 6e 74 72 61 73  59820 By contras
6e40: 74 2c 20 69 66 20 66 6f 72 65 69 67 6e 20 6b 65  t, if foreign ke
6e50: 79 20 65 72 72 6f 72 73 20 63 61 6e 20 62 65 0a  y errors can be.
6e60: 23 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 69 6d  # recognized sim
6e70: 70 6c 79 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ply by looking a
6e80: 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
6e90: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 61   of the child ta
6ea0: 62 6c 65 20 61 6e 64 0a 23 20 77 69 74 68 6f 75  ble and.# withou
6eb0: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 6f 6e 73  t having to cons
6ec0: 75 6c 74 20 74 68 65 20 70 61 72 65 6e 74 20 74  ult the parent t
6ed0: 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2c  able definition,
6ee0: 20 74 68 65 6e 20 74 68 65 20 43 52 45 41 54 45   then the CREATE
6ef0: 0a 23 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  .# TABLE stateme
6f00: 6e 74 20 66 6f 72 20 74 68 65 20 63 68 69 6c 64  nt for the child
6f10: 20 74 61 62 6c 65 20 66 61 69 6c 73 2e 0a 23 0a   table fails..#.
6f20: 23 20 54 68 65 73 65 20 65 72 72 6f 72 73 20 61  # These errors a
6f30: 72 65 20 72 65 70 6f 72 74 65 64 20 77 68 65 74  re reported whet
6f40: 68 65 72 20 6f 72 20 6e 6f 74 20 46 4b 20 73 75  her or not FK su
6f50: 70 70 6f 72 74 20 69 73 20 65 6e 61 62 6c 65 64  pport is enabled
6f60: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
6f70: 46 3a 20 52 2d 33 33 38 38 33 2d 32 38 38 33 33  F: R-33883-28833
6f80: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 44 44 4c   Foreign key DDL
6f90: 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f   errors are repo
6fa0: 72 74 65 64 0a 23 20 72 65 67 61 72 64 6c 65 73  rted.# regardles
6fb0: 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
6fc0: 6e 6f 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  not foreign key 
6fd0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
6fe0: 65 6e 61 62 6c 65 64 20 77 68 65 6e 0a 23 20 74  enabled when.# t
6ff0: 68 65 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  he table is crea
7000: 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ted..#.drop_all_
7010: 74 61 62 6c 65 73 0a 66 6f 72 65 61 63 68 20 66  tables.foreach f
7020: 6b 20 5b 6c 69 73 74 20 4f 46 46 20 4f 4e 5d 20  k [list OFF ON] 
7030: 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 50 52 41  {.  execsql "PRA
7040: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
7050: 20 3d 20 24 66 6b 22 0a 20 20 73 65 74 20 69 20   = $fk".  set i 
7060: 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 73 71 6c  0.  foreach {sql
7070: 20 65 72 72 6f 72 7d 20 7b 0a 20 20 20 20 22 43   error} {.    "C
7080: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
7090: 64 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e  d1(a, b, FOREIGN
70a0: 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52   KEY(a, b) REFER
70b0: 45 4e 43 45 53 20 70 28 63 29 29 22 0a 20 20 20  ENCES p(c))".   
70c0: 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f     {number of co
70d0: 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
70e0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
70f0: 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
7100: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7110: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
7120: 65 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  e}.    "CREATE T
7130: 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62  ABLE child2(a, b
7140: 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c  , FOREIGN KEY(a,
7150: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
7160: 28 63 2c 20 64 2c 20 65 29 29 22 0a 20 20 20 20  (c, d, e))".    
7170: 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    {number of col
7180: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
7190: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
71a0: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
71b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
71c0: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
71d0: 7d 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  }.    "CREATE TA
71e0: 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20 62 2c  BLE child2(a, b,
71f0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
7200: 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  c) REFERENCES p(
7210: 63 2c 20 64 29 29 22 0a 20 20 20 20 20 20 7b 75  c, d))".      {u
7220: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63  nknown column "c
7230: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
7240: 20 64 65 66 69 6e 69 74 69 6f 6e 7d 0a 20 20 20   definition}.   
7250: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
7260: 68 69 6c 64 32 28 61 2c 20 62 2c 20 46 4f 52 45  hild2(a, b, FORE
7270: 49 47 4e 20 4b 45 59 28 63 2c 20 62 29 20 52 45  IGN KEY(c, b) RE
7280: 46 45 52 45 4e 43 45 53 20 70 28 63 2c 20 64 29  FERENCES p(c, d)
7290: 29 22 0a 20 20 20 20 20 20 7b 75 6e 6b 6e 6f 77  )".      {unknow
72a0: 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69 6e 20  n column "c" in 
72b0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
72c0: 6e 69 74 69 6f 6e 7d 0a 20 20 7d 20 7b 0a 20 20  nition}.  } {.  
72d0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79    do_test e_fkey
72e0: 2d 32 32 2e 24 66 6b 2e 5b 69 6e 63 72 20 69 5d  -22.$fk.[incr i]
72f0: 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71   {.      catchsq
7300: 6c 20 24 73 71 6c 0a 20 20 20 20 7d 20 5b 6c 69  l $sql.    } [li
7310: 73 74 20 31 20 24 65 72 72 6f 72 5d 0a 20 20 7d  st 1 $error].  }
7320: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
7370: 20 54 65 73 74 20 74 68 61 74 20 61 20 52 45 46   Test that a REF
7380: 45 52 45 4e 43 49 4e 47 20 63 6c 61 75 73 65 20  ERENCING clause 
7390: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 70  that does not sp
73a0: 65 63 69 66 79 20 70 61 72 65 6e 74 20 6b 65 79  ecify parent key
73b0: 20 63 6f 6c 75 6d 6e 73 0a 23 20 69 6d 70 6c 69   columns.# impli
73c0: 63 69 74 6c 79 20 6d 61 70 73 20 74 6f 20 74 68  citly maps to th
73d0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66  e primary key of
73e0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
73f0: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
7400: 4f 46 3a 20 52 2d 34 33 38 37 39 2d 30 38 30 32  OF: R-43879-0802
7410: 35 20 41 74 74 61 63 68 69 6e 67 20 61 20 22 52  5 Attaching a "R
7420: 45 46 45 52 45 4e 43 45 53 20 3c 70 61 72 65 6e  EFERENCES <paren
7430: 74 2d 74 61 62 6c 65 3e 22 0a 23 20 63 6c 61 75  t-table>".# clau
7440: 73 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 64  se to a column d
7450: 65 66 69 6e 69 74 69 6f 6e 20 63 72 65 61 74 65  efinition create
7460: 73 20 61 20 66 6f 72 65 69 67 6e 0a 23 20 6b 65  s a foreign.# ke
7470: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61  y constraint tha
7480: 74 20 6d 61 70 73 20 74 68 65 20 63 6f 6c 75 6d  t maps the colum
7490: 6e 20 74 6f 20 74 68 65 20 70 72 69 6d 61 72 79  n to the primary
74a0: 20 6b 65 79 20 6f 66 0a 23 20 3c 70 61 72 65 6e   key of.# <paren
74b0: 74 2d 74 61 62 6c 65 3e 2e 0a 23 20 0a 64 6f 5f  t-table>..# .do_
74c0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 33 2e 31  test e_fkey-23.1
74d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
74e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
74f0: 70 31 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59  p1(a, b, PRIMARY
7500: 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
7510: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 32   CREATE TABLE p2
7520: 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b 45  (a, b PRIMARY KE
7530: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
7540: 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46 4f  ABLE c1(c, d, FO
7550: 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20  REIGN KEY(c, d) 
7560: 52 45 46 45 52 45 4e 43 45 53 20 70 31 29 3b 0a  REFERENCES p1);.
7570: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7580: 20 63 32 28 61 2c 20 62 20 52 45 46 45 52 45 4e   c2(a, b REFEREN
7590: 43 45 53 20 70 32 29 3b 0a 20 20 7d 0a 7d 20 7b  CES p2);.  }.} {
75a0: 7d 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65  }.proc test_efke
75b0: 79 5f 36 30 20 7b 74 6e 20 69 73 45 72 72 6f 72  y_60 {tn isError
75c0: 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   sql} {.  do_tes
75d0: 74 20 65 5f 66 6b 65 79 2d 32 33 2e 24 74 6e 20  t e_fkey-23.$tn 
75e0: 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  ".    catchsql {
75f0: 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69 6e 64 65  $sql}.  " [linde
7600: 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f  x {{0 {}} {1 {fo
7610: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7620: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24  aint failed}}} $
7630: 69 73 45 72 72 6f 72 5d 0a 7d 0a 0a 74 65 73 74  isError].}..test
7640: 5f 65 66 6b 65 79 5f 36 30 20 32 20 31 20 22 49  _efkey_60 2 1 "I
7650: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
7660: 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a  LUES(239, 231)".
7670: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 33 20  test_efkey_60 3 
7680: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  0 "INSERT INTO p
7690: 31 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  1 VALUES(239, 23
76a0: 31 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36  1)".test_efkey_6
76b0: 30 20 34 20 30 20 22 49 4e 53 45 52 54 20 49 4e  0 4 0 "INSERT IN
76c0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 32 33 39  TO c1 VALUES(239
76d0: 2c 20 32 33 31 29 22 0a 74 65 73 74 5f 65 66 6b  , 231)".test_efk
76e0: 65 79 5f 36 30 20 35 20 31 20 22 49 4e 53 45 52  ey_60 5 1 "INSER
76f0: 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53  T INTO c2 VALUES
7700: 28 32 33 39 2c 20 32 33 31 29 22 0a 74 65 73 74  (239, 231)".test
7710: 5f 65 66 6b 65 79 5f 36 30 20 36 20 30 20 22 49  _efkey_60 6 0 "I
7720: 4e 53 45 52 54 20 49 4e 54 4f 20 70 32 20 56 41  NSERT INTO p2 VA
7730: 4c 55 45 53 28 32 33 39 2c 20 32 33 31 29 22 0a  LUES(239, 231)".
7740: 74 65 73 74 5f 65 66 6b 65 79 5f 36 30 20 37 20  test_efkey_60 7 
7750: 30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  0 "INSERT INTO c
7760: 32 20 56 41 4c 55 45 53 28 32 33 39 2c 20 32 33  2 VALUES(239, 23
7770: 31 29 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1)"..#----------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
77c0: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 69  # Test that an i
77d0: 6e 64 65 78 20 6f 6e 20 6f 6e 20 74 68 65 20 63  ndex on on the c
77e0: 68 69 6c 64 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  hild key columns
77f0: 20 6f 66 20 61 6e 20 46 4b 20 63 6f 6e 73 74 72   of an FK constr
7800: 61 69 6e 74 0a 23 20 69 73 20 6f 70 74 69 6f 6e  aint.# is option
7810: 61 6c 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  al..#.# EVIDENCE
7820: 2d 4f 46 3a 20 52 2d 31 35 34 31 37 2d 32 38 30  -OF: R-15417-280
7830: 31 34 20 49 6e 64 69 63 65 73 20 61 72 65 20 6e  14 Indices are n
7840: 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ot required for 
7850: 63 68 69 6c 64 20 6b 65 79 0a 23 20 63 6f 6c 75  child key.# colu
7860: 6d 6e 73 0a 23 0a 23 20 41 6c 73 6f 20 74 65 73  mns.#.# Also tes
7870: 74 20 74 68 61 74 20 69 66 20 61 6e 20 69 6e 64  t that if an ind
7880: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e  ex is created on
7890: 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63   the child key c
78a0: 6f 6c 75 6d 6e 73 2c 20 69 74 20 64 6f 65 73 0a  olumns, it does.
78b0: 23 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 66  # not make a dif
78c0: 66 65 72 65 6e 63 65 20 77 68 65 74 68 65 72 20  ference whether 
78d0: 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 61 20 55  or not it is a U
78e0: 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 23 0a 23  NIQUE index..#.#
78f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7900: 31 35 37 34 31 2d 35 30 38 39 33 20 54 68 65 20  15741-50893 The 
7910: 63 68 69 6c 64 20 6b 65 79 20 69 6e 64 65 78 20  child key index 
7920: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
7930: 20 62 65 0a 23 20 28 61 6e 64 20 75 73 75 61 6c   be.# (and usual
7940: 6c 79 20 77 69 6c 6c 20 6e 6f 74 20 62 65 29 20  ly will not be) 
7950: 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  a UNIQUE index..
7960: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
7970: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
7980: 2d 32 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -24.1 {.  execsq
7990: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
79a0: 41 42 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79  ABLE parent(x, y
79b0: 2c 20 55 4e 49 51 55 45 28 79 2c 20 78 29 29 3b  , UNIQUE(y, x));
79c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
79d0: 45 20 63 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E c1(a, b, FOREI
79e0: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
79f0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
7a00: 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , y));.    CREAT
7a10: 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62 2c  E TABLE c2(a, b,
7a20: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20   FOREIGN KEY(a, 
7a30: 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  b) REFERENCES pa
7a40: 72 65 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20  rent(x, y));.   
7a50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33   CREATE TABLE c3
7a60: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
7a70: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
7a80: 43 45 53 20 70 61 72 65 6e 74 28 78 2c 20 79 29  CES parent(x, y)
7a90: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
7aa0: 44 45 58 20 63 32 69 20 4f 4e 20 63 32 28 61 2c  DEX c2i ON c2(a,
7ab0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7ac0: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 63 33 69  UNIQUE INDEX c3i
7ad0: 20 4f 4e 20 63 32 28 62 2c 20 61 29 3b 0a 20 20   ON c2(b, a);.  
7ae0: 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 74 65 73 74  }.} {}.proc test
7af0: 5f 65 66 6b 65 79 5f 36 31 20 7b 74 6e 20 69 73  _efkey_61 {tn is
7b00: 45 72 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64  Error sql} {.  d
7b10: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 34  o_test e_fkey-24
7b20: 2e 24 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68  .$tn ".    catch
7b30: 73 71 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b  sql {$sql}.  " [
7b40: 6c 69 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b  lindex {{0 {}} {
7b50: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
7b60: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
7b70: 7d 7d 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a  }}} $isError].}.
7b80: 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 7d 20 5b  foreach {tn c} [
7b90: 6c 69 73 74 20 32 20 63 31 20 33 20 63 32 20 34  list 2 c1 3 c2 4
7ba0: 20 63 33 5d 20 7b 0a 20 20 74 65 73 74 5f 65 66   c3] {.  test_ef
7bb0: 6b 65 79 5f 36 31 20 24 74 6e 2e 31 20 31 20 22  key_61 $tn.1 1 "
7bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 63 20 56  INSERT INTO $c V
7bd0: 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 20 20 74  ALUES(1, 2)".  t
7be0: 65 73 74 5f 65 66 6b 65 79 5f 36 31 20 24 74 6e  est_efkey_61 $tn
7bf0: 2e 32 20 30 20 22 49 4e 53 45 52 54 20 49 4e 54  .2 0 "INSERT INT
7c00: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
7c10: 31 2c 20 32 29 22 0a 20 20 74 65 73 74 5f 65 66  1, 2)".  test_ef
7c20: 6b 65 79 5f 36 31 20 24 74 6e 2e 33 20 30 20 22  key_61 $tn.3 0 "
7c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 24 63 20 56  INSERT INTO $c V
7c40: 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 0a 20 20  ALUES(1, 2)"..  
7c50: 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20  execsql "DELETE 
7c60: 46 52 4f 4d 20 24 63 20 3b 20 44 45 4c 45 54 45  FROM $c ; DELETE
7c70: 20 46 52 4f 4d 20 70 61 72 65 6e 74 22 0a 7d 0a   FROM parent".}.
7c80: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
7cd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 32  IDENCE-OF: R-002
7ce0: 37 39 2d 35 32 32 38 33 0a 23 0a 23 20 54 65 73  79-52283.#.# Tes
7cf0: 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 73 68 6f  t an example sho
7d00: 77 69 6e 67 20 74 68 61 74 20 77 68 65 6e 20 61  wing that when a
7d10: 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20   row is deleted 
7d20: 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
7d30: 0a 23 20 74 61 62 6c 65 2c 20 74 68 65 20 63 68  .# table, the ch
7d40: 69 6c 64 20 74 61 62 6c 65 20 69 73 20 71 75 65  ild table is que
7d50: 72 69 65 64 20 66 6f 72 20 6f 72 70 68 61 6e 65  ried for orphane
7d60: 64 20 72 6f 77 73 20 61 73 20 66 6f 6c 6c 6f 77  d rows as follow
7d70: 73 3a 0a 23 0a 23 20 20 20 53 45 4c 45 43 54 20  s:.#.#   SELECT 
7d80: 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b  rowid FROM track
7d90: 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69   WHERE trackarti
7da0: 73 74 20 3d 20 3f 0a 23 0a 23 20 45 56 49 44 45  st = ?.#.# EVIDE
7db0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 33 30 32 2d  NCE-OF: R-23302-
7dc0: 33 30 39 35 36 20 49 66 20 74 68 69 73 20 53 45  30956 If this SE
7dd0: 4c 45 43 54 20 72 65 74 75 72 6e 73 20 61 6e 79  LECT returns any
7de0: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 0a 23 20   rows at all,.# 
7df0: 74 68 65 6e 20 53 51 4c 69 74 65 20 63 6f 6e 63  then SQLite conc
7e00: 6c 75 64 65 73 20 74 68 61 74 20 64 65 6c 65 74  ludes that delet
7e10: 69 6e 67 20 74 68 65 20 72 6f 77 20 66 72 6f 6d  ing the row from
7e20: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
7e30: 65 0a 23 20 77 6f 75 6c 64 20 76 69 6f 6c 61 74  e.# would violat
7e40: 65 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  e the foreign ke
7e50: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  y constraint and
7e60: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
7e70: 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  r..#.do_test e_f
7e80: 6b 65 79 2d 32 35 2e 31 20 7b 0a 20 20 65 78 65  key-25.1 {.  exe
7e90: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
7ea0: 45 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a  E TABLE artist(.
7eb0: 20 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20        artistid  
7ec0: 20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52    INTEGER PRIMAR
7ed0: 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72  Y KEY, .      ar
7ee0: 74 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20  tistname  TEXT. 
7ef0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
7f00: 20 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20   TABLE track(.  
7f10: 20 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20      trackid     
7f20: 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20  INTEGER, .      
7f30: 74 72 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54  trackname   TEXT
7f40: 2c 20 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72  , .      trackar
7f50: 74 69 73 74 20 49 4e 54 45 47 45 52 2c 0a 20 20  tist INTEGER,.  
7f60: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
7f70: 74 72 61 63 6b 61 72 74 69 73 74 29 20 52 45 46  trackartist) REF
7f80: 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28 61  ERENCES artist(a
7f90: 72 74 69 73 74 69 64 29 0a 20 20 20 20 29 3b 0a  rtistid).    );.
7fa0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63    }.} {}.do_exec
7fb0: 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  sql_test e_fkey-
7fc0: 32 35 2e 32 20 7b 0a 20 20 50 52 41 47 4d 41 20  25.2 {.  PRAGMA 
7fd0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
7fe0: 46 46 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  FF;.  EXPLAIN QU
7ff0: 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20  ERY PLAN DELETE 
8000: 46 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52  FROM artist WHER
8010: 45 20 31 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51  E 1;.  EXPLAIN Q
8020: 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
8030: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63   rowid FROM trac
8040: 6b 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74  k WHERE trackart
8050: 69 73 74 20 3d 20 3f 3b 0a 7d 20 7b 0a 20 20 30  ist = ?;.} {.  0
8060: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
8070: 20 61 72 74 69 73 74 20 28 7e 31 30 30 30 30 30   artist (~100000
8080: 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 30 20  0 rows)} .  0 0 
8090: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 72  0 {SCAN TABLE tr
80a0: 61 63 6b 20 28 7e 31 30 30 30 30 30 20 72 6f 77  ack (~100000 row
80b0: 73 29 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  s)}.}.do_execsql
80c0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e  _test e_fkey-25.
80d0: 33 20 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72  3 {.  PRAGMA for
80e0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 3b 0a  eign_keys = ON;.
80f0: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
8100: 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d  PLAN DELETE FROM
8110: 20 61 72 74 69 73 74 20 57 48 45 52 45 20 31 3b   artist WHERE 1;
8120: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
8130: 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74 20  AN TABLE artist 
8140: 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d  (~1000000 rows)}
8150: 20 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20   .  0 0 0 {SCAN 
8160: 54 41 42 4c 45 20 74 72 61 63 6b 20 28 7e 31 30  TABLE track (~10
8170: 30 30 30 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f  0000 rows)}.}.do
8180: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 35 2e  _test e_fkey-25.
8190: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
81a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
81b0: 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 35 2c  artist VALUES(5,
81c0: 20 27 61 72 74 69 73 74 20 35 27 29 3b 0a 20 20   'artist 5');.  
81d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72    INSERT INTO ar
81e0: 74 69 73 74 20 56 41 4c 55 45 53 28 36 2c 20 27  tist VALUES(6, '
81f0: 61 72 74 69 73 74 20 36 27 29 3b 0a 20 20 20 20  artist 6');.    
8200: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69  INSERT INTO arti
8210: 73 74 20 56 41 4c 55 45 53 28 37 2c 20 27 61 72  st VALUES(7, 'ar
8220: 74 69 73 74 20 37 27 29 3b 0a 20 20 20 20 49 4e  tist 7');.    IN
8230: 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
8240: 56 41 4c 55 45 53 28 31 2c 20 27 74 72 61 63 6b  VALUES(1, 'track
8250: 20 31 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53   1', 5);.    INS
8260: 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20 56  ERT INTO track V
8270: 41 4c 55 45 53 28 32 2c 20 27 74 72 61 63 6b 20  ALUES(2, 'track 
8280: 32 27 2c 20 36 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  2', 6);.  }.} {}
8290: 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
82a0: 2d 32 35 2e 35 20 7b 0a 20 20 63 6f 6e 63 61 74  -25.5 {.  concat
82b0: 20 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20   \.    [execsql 
82c0: 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46  { SELECT rowid F
82d0: 52 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20  ROM track WHERE 
82e0: 74 72 61 63 6b 61 72 74 69 73 74 20 3d 20 35 20  trackartist = 5 
82f0: 7d 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63  }]   \.    [catc
8300: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
8310: 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20  OM artist WHERE 
8320: 61 72 74 69 73 74 69 64 20 3d 20 35 20 7d 5d 0a  artistid = 5 }].
8330: 7d 20 7b 31 20 31 20 7b 66 6f 72 65 69 67 6e 20  } {1 1 {foreign 
8340: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
8350: 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ailed}}..do_test
8360: 20 65 5f 66 6b 65 79 2d 32 35 2e 36 20 7b 0a 20   e_fkey-25.6 {. 
8370: 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 5b 65   concat \.    [e
8380: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
8390: 72 6f 77 69 64 20 46 52 4f 4d 20 74 72 61 63 6b  rowid FROM track
83a0: 20 57 48 45 52 45 20 74 72 61 63 6b 61 72 74 69   WHERE trackarti
83b0: 73 74 20 3d 20 37 20 7d 5d 20 20 20 5c 0a 20 20  st = 7 }]   \.  
83c0: 20 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 45    [catchsql { DE
83d0: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
83e0: 20 57 48 45 52 45 20 61 72 74 69 73 74 69 64 20   WHERE artistid 
83f0: 3d 20 37 20 7d 5d 0a 7d 20 7b 30 20 7b 7d 7d 0a  = 7 }].} {0 {}}.
8400: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
8410: 32 35 2e 37 20 7b 0a 20 20 63 6f 6e 63 61 74 20  25.7 {.  concat 
8420: 5c 0a 20 20 20 20 5b 65 78 65 63 73 71 6c 20 7b  \.    [execsql {
8430: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
8440: 4f 4d 20 74 72 61 63 6b 20 57 48 45 52 45 20 74  OM track WHERE t
8450: 72 61 63 6b 61 72 74 69 73 74 20 3d 20 36 20 7d  rackartist = 6 }
8460: 5d 20 20 20 5c 0a 20 20 20 20 5b 63 61 74 63 68  ]   \.    [catch
8470: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
8480: 4d 20 61 72 74 69 73 74 20 57 48 45 52 45 20 61  M artist WHERE a
8490: 72 74 69 73 74 69 64 20 3d 20 36 20 7d 5d 0a 7d  rtistid = 6 }].}
84a0: 20 7b 32 20 31 20 7b 66 6f 72 65 69 67 6e 20 6b   {2 1 {foreign k
84b0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
84c0: 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  iled}}..#-------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  --.# EVIDENCE-OF
8520: 3a 20 52 2d 34 37 39 33 36 2d 31 30 30 34 34 20  : R-47936-10044 
8530: 4f 72 2c 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  Or, more general
8540: 6c 79 3a 0a 23 20 53 45 4c 45 43 54 20 72 6f 77  ly:.# SELECT row
8550: 69 64 20 46 52 4f 4d 20 3c 63 68 69 6c 64 2d 74  id FROM <child-t
8560: 61 62 6c 65 3e 20 57 48 45 52 45 20 3c 63 68 69  able> WHERE <chi
8570: 6c 64 2d 6b 65 79 3e 20 3d 20 3a 70 61 72 65 6e  ld-key> = :paren
8580: 74 5f 6b 65 79 5f 76 61 6c 75 65 0a 23 0a 23 20  t_key_value.#.# 
8590: 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 61  Test that when a
85a0: 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20   row is deleted 
85b0: 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
85c0: 74 61 62 6c 65 20 6f 66 20 61 6e 20 46 4b 20 0a  table of an FK .
85d0: 23 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 74 68  # constraint, th
85e0: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 69 73  e child table is
85f0: 20 71 75 65 72 69 65 64 20 66 6f 72 20 6f 72 70   queried for orp
8600: 68 61 6e 65 64 20 72 6f 77 73 2e 20 54 68 65 0a  haned rows. The.
8610: 23 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76  # query is equiv
8620: 61 6c 65 6e 74 20 74 6f 3a 0a 23 0a 23 20 20 20  alent to:.#.#   
8630: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
8640: 4d 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20  M <child-table> 
8650: 57 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79  WHERE <child-key
8660: 3e 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f  > = :parent_key_
8670: 76 61 6c 75 65 0a 23 0a 23 20 41 6c 73 6f 20 74  value.#.# Also t
8680: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 61 20  est that when a 
8690: 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20  row is inserted 
86a0: 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
86b0: 74 61 62 6c 65 2c 20 6f 72 20 77 68 65 6e 20 74  table, or when t
86c0: 68 65 20 0a 23 20 70 61 72 65 6e 74 20 6b 65 79  he .# parent key
86d0: 20 76 61 6c 75 65 73 20 6f 66 20 61 6e 20 65 78   values of an ex
86e0: 69 73 74 69 6e 67 20 72 6f 77 20 61 72 65 20 6d  isting row are m
86f0: 6f 64 69 66 69 65 64 2c 20 61 20 71 75 65 72 79  odified, a query
8700: 20 65 71 75 69 76 61 6c 65 6e 74 0a 23 20 74 6f   equivalent.# to
8710: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
8720: 73 20 70 6c 61 6e 6e 65 64 2e 20 49 6e 20 73 6f  s planned. In so
8730: 6d 65 20 63 61 73 65 73 20 69 74 20 69 73 20 6e  me cases it is n
8740: 6f 74 20 65 78 65 63 75 74 65 64 2c 20 62 75 74  ot executed, but
8750: 20 69 74 0a 23 20 69 73 20 61 6c 77 61 79 73 20   it.# is always 
8760: 70 6c 61 6e 6e 65 64 2e 0a 23 0a 23 20 20 20 53  planned..#.#   S
8770: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
8780: 20 3c 63 68 69 6c 64 2d 74 61 62 6c 65 3e 20 57   <child-table> W
8790: 48 45 52 45 20 3c 63 68 69 6c 64 2d 6b 65 79 3e  HERE <child-key>
87a0: 20 3d 20 3a 70 61 72 65 6e 74 5f 6b 65 79 5f 76   = :parent_key_v
87b0: 61 6c 75 65 0a 23 0a 23 20 45 56 49 44 45 4e 43  alue.#.# EVIDENC
87c0: 45 2d 4f 46 3a 20 52 2d 36 31 36 31 36 2d 34 36  E-OF: R-61616-46
87d0: 37 30 30 20 53 69 6d 69 6c 61 72 20 71 75 65 72  700 Similar quer
87e0: 69 65 73 20 6d 61 79 20 62 65 20 72 75 6e 20 69  ies may be run i
87f0: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20  f the content.# 
8800: 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  of the parent ke
8810: 79 20 69 73 20 6d 6f 64 69 66 69 65 64 20 6f 72  y is modified or
8820: 20 61 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e   a new row is in
8830: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
8840: 70 61 72 65 6e 74 0a 23 20 74 61 62 6c 65 2e 0a  parent.# table..
8850: 23 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  #.#.drop_all_tab
8860: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
8870: 65 79 2d 32 36 2e 31 20 7b 0a 20 20 65 78 65 63  ey-26.1 {.  exec
8880: 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42  sql { CREATE TAB
8890: 4c 45 20 70 61 72 65 6e 74 28 78 2c 20 79 2c 20  LE parent(x, y, 
88a0: 55 4e 49 51 55 45 28 79 2c 20 78 29 29 20 7d 0a  UNIQUE(y, x)) }.
88b0: 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  } {}.foreach {tn
88c0: 20 73 71 6c 7d 20 7b 0a 20 20 32 20 7b 20 0a 20   sql} {.  2 { . 
88d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
88e0: 63 68 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45  child(a, b, FORE
88f0: 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45  IGN KEY(a, b) RE
8900: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28  FERENCES parent(
8910: 78 2c 20 79 29 29 0a 20 20 7d 0a 20 20 33 20 7b  x, y)).  }.  3 {
8920: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42   .    CREATE TAB
8930: 4c 45 20 63 68 69 6c 64 28 61 2c 20 62 2c 20 46  LE child(a, b, F
8940: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29  OREIGN KEY(a, b)
8950: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
8960: 6e 74 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 43  nt(x, y));.    C
8970: 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c  REATE INDEX chil
8980: 64 69 20 4f 4e 20 63 68 69 6c 64 28 61 2c 20 62  di ON child(a, b
8990: 29 3b 0a 20 20 7d 0a 20 20 34 20 7b 20 0a 20 20  );.  }.  4 { .  
89a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
89b0: 68 69 6c 64 28 61 2c 20 62 2c 20 46 4f 52 45 49  hild(a, b, FOREI
89c0: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
89d0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 28 78  ERENCES parent(x
89e0: 2c 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , y));.    CREAT
89f0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 63  E UNIQUE INDEX c
8a00: 68 69 6c 64 69 20 4f 4e 20 63 68 69 6c 64 28 62  hildi ON child(b
8a10: 2c 20 61 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20  , a);.  }.} {.  
8a20: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 0a 20 20  execsql $sql..  
8a30: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
8a40: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f  foreign_keys = O
8a50: 46 46 7d 0a 20 20 73 65 74 20 64 65 6c 65 74 65  FF}.  set delete
8a60: 20 5b 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20 20   [concat \.     
8a70: 20 5b 65 71 70 20 22 44 45 4c 45 54 45 20 46 52   [eqp "DELETE FR
8a80: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
8a90: 31 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71 70  1"] \.      [eqp
8aa0: 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
8ab0: 52 4f 4d 20 63 68 69 6c 64 20 57 48 45 52 45 20  ROM child WHERE 
8ac0: 61 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22  a = ? AND b = ?"
8ad0: 5d 0a 20 20 5d 0a 20 20 73 65 74 20 75 70 64 61  ].  ].  set upda
8ae0: 74 65 20 5b 63 6f 6e 63 61 74 20 5c 0a 20 20 20  te [concat \.   
8af0: 20 20 20 5b 65 71 70 20 22 55 50 44 41 54 45 20     [eqp "UPDATE 
8b00: 70 61 72 65 6e 74 20 53 45 54 20 78 3d 3f 2c 20  parent SET x=?, 
8b10: 79 3d 3f 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65  y=?"] \.      [e
8b20: 71 70 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  qp "SELECT rowid
8b30: 20 46 52 4f 4d 20 63 68 69 6c 64 20 57 48 45 52   FROM child WHER
8b40: 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20  E a = ? AND b = 
8b50: 3f 22 5d 20 5c 0a 20 20 20 20 20 20 5b 65 71 70  ?"] \.      [eqp
8b60: 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
8b70: 52 4f 4d 20 63 68 69 6c 64 20 57 48 45 52 45 20  ROM child WHERE 
8b80: 61 20 3d 20 3f 20 41 4e 44 20 62 20 3d 20 3f 22  a = ? AND b = ?"
8b90: 5d 0a 20 20 5d 0a 20 20 65 78 65 63 73 71 6c 20  ].  ].  execsql 
8ba0: 7b 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  {PRAGMA foreign_
8bb0: 6b 65 79 73 20 3d 20 4f 4e 7d 0a 0a 20 20 64 6f  keys = ON}..  do
8bc0: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 36 2e  _test e_fkey-26.
8bd0: 24 74 6e 2e 31 20 7b 20 65 71 70 20 22 44 45 4c  $tn.1 { eqp "DEL
8be0: 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20  ETE FROM parent 
8bf0: 57 48 45 52 45 20 31 22 20 7d 20 24 64 65 6c 65  WHERE 1" } $dele
8c00: 74 65 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66  te.  do_test e_f
8c10: 6b 65 79 2d 32 36 2e 24 74 6e 2e 32 20 7b 20 65  key-26.$tn.2 { e
8c20: 71 70 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  qp "UPDATE paren
8c30: 74 20 73 65 74 20 78 3d 3f 2c 20 79 3d 3f 22 20  t set x=?, y=?" 
8c40: 7d 20 24 75 70 64 61 74 65 0a 0a 20 20 65 78 65  } $update..  exe
8c50: 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45  csql {DROP TABLE
8c60: 20 63 68 69 6c 64 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   child}.}..#----
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45  -----.# EVIDENCE
8cc0: 2d 4f 46 3a 20 52 2d 31 34 35 35 33 2d 33 34 30  -OF: R-14553-340
8cd0: 31 33 0a 23 0a 23 20 54 65 73 74 20 74 68 65 20  13.#.# Test the 
8ce0: 65 78 61 6d 70 6c 65 20 73 63 68 65 6d 61 20 61  example schema a
8cf0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 73 65 63  t the end of sec
8d00: 74 69 6f 6e 20 33 2e 20 41 6c 73 6f 20 74 65 73  tion 3. Also tes
8d10: 74 20 74 68 61 74 20 69 73 0a 23 20 69 73 20 22  t that is.# is "
8d20: 65 66 66 69 63 69 65 6e 74 22 2e 20 49 6e 20 74  efficient". In t
8d30: 68 69 73 20 63 61 73 65 20 22 65 66 66 69 63 69  his case "effici
8d40: 65 6e 74 22 20 6d 65 61 6e 73 20 74 68 61 74 20  ent" means that 
8d50: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20 72 65  foreign key.# re
8d60: 6c 61 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73  lated operations
8d70: 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   on the parent t
8d80: 61 62 6c 65 20 64 6f 20 6e 6f 74 20 70 72 6f 76  able do not prov
8d90: 6f 6b 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  oke linear scans
8da0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
8db0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
8dc0: 65 79 2d 32 37 2e 31 20 7b 0a 20 20 65 78 65 63  ey-27.1 {.  exec
8dd0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
8de0: 20 54 41 42 4c 45 20 61 72 74 69 73 74 28 0a 20   TABLE artist(. 
8df0: 20 20 20 20 20 61 72 74 69 73 74 69 64 20 20 20       artistid   
8e00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8e10: 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 61 72 74   KEY, .      art
8e20: 69 73 74 6e 61 6d 65 20 20 54 45 58 54 0a 20 20  istname  TEXT.  
8e30: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
8e40: 54 41 42 4c 45 20 74 72 61 63 6b 28 0a 20 20 20  TABLE track(.   
8e50: 20 20 20 74 72 61 63 6b 69 64 20 20 20 20 20 49     trackid     I
8e60: 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 74 72  NTEGER,.      tr
8e70: 61 63 6b 6e 61 6d 65 20 20 20 54 45 58 54 2c 20  ackname   TEXT, 
8e80: 0a 20 20 20 20 20 20 74 72 61 63 6b 61 72 74 69  .      trackarti
8e90: 73 74 20 49 4e 54 45 47 45 52 20 52 45 46 45 52  st INTEGER REFER
8ea0: 45 4e 43 45 53 20 61 72 74 69 73 74 0a 20 20 20  ENCES artist.   
8eb0: 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49   );.    CREATE I
8ec0: 4e 44 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20  NDEX trackindex 
8ed0: 4f 4e 20 74 72 61 63 6b 28 74 72 61 63 6b 61 72  ON track(trackar
8ee0: 74 69 73 74 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  tist);.  }.} {}.
8ef0: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32  do_test e_fkey-2
8f00: 37 2e 32 20 7b 0a 20 20 65 71 70 20 7b 20 49 4e  7.2 {.  eqp { IN
8f10: 53 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74  SERT INTO artist
8f20: 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29 20 7d 0a   VALUES(?, ?) }.
8f30: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
8f40: 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 37 2e 33  test e_fkey-27.3
8f50: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
8f60: 52 59 20 50 4c 41 4e 20 55 50 44 41 54 45 20 61  RY PLAN UPDATE a
8f70: 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74  rtist SET artist
8f80: 69 64 20 3d 20 3f 2c 20 61 72 74 69 73 74 6e 61  id = ?, artistna
8f90: 6d 65 20 3d 20 3f 0a 7d 20 7b 0a 20 20 30 20 30  me = ?.} {.  0 0
8fa0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 61   0 {SCAN TABLE a
8fb0: 72 74 69 73 74 20 28 7e 31 30 30 30 30 30 30 20  rtist (~1000000 
8fc0: 72 6f 77 73 29 7d 20 0a 20 20 30 20 30 20 30 20  rows)} .  0 0 0 
8fd0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 72  {SEARCH TABLE tr
8fe0: 61 63 6b 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ack USING COVERI
8ff0: 4e 47 20 49 4e 44 45 58 20 74 72 61 63 6b 69 6e  NG INDEX trackin
9000: 64 65 78 20 28 74 72 61 63 6b 61 72 74 69 73 74  dex (trackartist
9010: 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d 20  =?) (~10 rows)} 
9020: 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48  .  0 0 0 {SEARCH
9030: 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53 49   TABLE track USI
9040: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
9050: 58 20 74 72 61 63 6b 69 6e 64 65 78 20 28 74 72  X trackindex (tr
9060: 61 63 6b 61 72 74 69 73 74 3d 3f 29 20 28 7e 31  ackartist=?) (~1
9070: 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 65 78  0 rows)}.}.do_ex
9080: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 66 6b 65  ecsql_test e_fke
9090: 79 2d 32 37 2e 34 20 7b 0a 20 20 45 58 50 4c 41  y-27.4 {.  EXPLA
90a0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45  IN QUERY PLAN DE
90b0: 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
90c0: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
90d0: 41 4e 20 54 41 42 4c 45 20 61 72 74 69 73 74 20  AN TABLE artist 
90e0: 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d  (~1000000 rows)}
90f0: 20 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43   .  0 0 0 {SEARC
9100: 48 20 54 41 42 4c 45 20 74 72 61 63 6b 20 55 53  H TABLE track US
9110: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
9120: 45 58 20 74 72 61 63 6b 69 6e 64 65 78 20 28 74  EX trackindex (t
9130: 72 61 63 6b 61 72 74 69 73 74 3d 3f 29 20 28 7e  rackartist=?) (~
9140: 31 30 20 72 6f 77 73 29 7d 0a 7d 0a 0a 0a 23 23  10 rows)}.}...##
9150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9190: 23 23 23 23 23 23 23 23 23 0a 23 23 23 20 53 45  #########.### SE
91a0: 43 54 49 4f 4e 20 34 2e 31 3a 20 43 6f 6d 70 6f  CTION 4.1: Compo
91b0: 73 69 74 65 20 46 6f 72 65 69 67 6e 20 4b 65 79  site Foreign Key
91c0: 20 43 6f 6e 73 74 72 61 69 6e 74 73 0a 23 23 23   Constraints.###
91d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
91e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
91f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9210: 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
9270: 74 20 70 61 72 65 6e 74 20 61 6e 64 20 63 68 69  t parent and chi
9280: 6c 64 20 6b 65 79 73 20 6d 75 73 74 20 68 61 76  ld keys must hav
9290: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
92a0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a  r of columns..#.
92b0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
92c0: 2d 34 31 30 36 32 2d 33 34 34 33 31 20 50 61 72  -41062-34431 Par
92d0: 65 6e 74 20 61 6e 64 20 63 68 69 6c 64 20 6b 65  ent and child ke
92e0: 79 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ys must have the
92f0: 20 73 61 6d 65 0a 23 20 63 61 72 64 69 6e 61 6c   same.# cardinal
9300: 69 74 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ity..#.foreach {
9310: 74 6e 20 73 71 6c 20 65 72 72 7d 20 7b 0a 20 20  tn sql err} {.  
9320: 31 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  1 "CREATE TABLE 
9330: 63 28 6a 6a 20 52 45 46 45 52 45 4e 43 45 53 20  c(jj REFERENCES 
9340: 70 28 78 2c 20 79 29 29 22 20 0a 20 20 20 20 7b  p(x, y))" .    {
9350: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 6a  foreign key on j
9360: 6a 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  j should referen
9370: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
9380: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 70 7d 0a 0a  mn of table p}..
9390: 20 20 32 20 22 43 52 45 41 54 45 20 54 41 42 4c    2 "CREATE TABL
93a0: 45 20 63 28 6a 6a 20 52 45 46 45 52 45 4e 43 45  E c(jj REFERENCE
93b0: 53 20 70 28 29 29 22 20 7b 6e 65 61 72 20 22 29  S p())" {near ")
93c0: 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d  ": syntax error}
93d0: 0a 0a 20 20 33 20 22 43 52 45 41 54 45 20 54 41  ..  3 "CREATE TA
93e0: 42 4c 45 20 63 28 6a 6a 2c 20 46 4f 52 45 49 47  BLE c(jj, FOREIG
93f0: 4e 20 4b 45 59 28 6a 6a 29 20 52 45 46 45 52 45  N KEY(jj) REFERE
9400: 4e 43 45 53 20 70 28 78 2c 20 79 29 29 22 20 0a  NCES p(x, y))" .
9410: 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63      {number of c
9420: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
9430: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
9440: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
9450: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9460: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
9470: 6c 65 7d 0a 0a 20 20 34 20 22 43 52 45 41 54 45  le}..  4 "CREATE
9480: 20 54 41 42 4c 45 20 63 28 6a 6a 2c 20 46 4f 52   TABLE c(jj, FOR
9490: 45 49 47 4e 20 4b 45 59 28 6a 6a 29 20 52 45 46  EIGN KEY(jj) REF
94a0: 45 52 45 4e 43 45 53 20 70 28 29 29 22 20 0a 20  ERENCES p())" . 
94b0: 20 20 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79     {near ")": sy
94c0: 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 35  ntax error}..  5
94d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
94e0: 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e  (ii, jj, FOREIGN
94f0: 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46   KEY(jj, ii) REF
9500: 45 52 45 4e 43 45 53 20 70 28 29 29 22 20 0a 20  ERENCES p())" . 
9510: 20 20 20 7b 6e 65 61 72 20 22 29 22 3a 20 73 79     {near ")": sy
9520: 6e 74 61 78 20 65 72 72 6f 72 7d 0a 0a 20 20 36  ntax error}..  6
9530: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
9540: 28 69 69 2c 20 6a 6a 2c 20 46 4f 52 45 49 47 4e  (ii, jj, FOREIGN
9550: 20 4b 45 59 28 6a 6a 2c 20 69 69 29 20 52 45 46   KEY(jj, ii) REF
9560: 45 52 45 4e 43 45 53 20 70 28 78 29 29 22 20 0a  ERENCES p(x))" .
9570: 20 20 20 20 7b 6e 75 6d 62 65 72 20 6f 66 20 63      {number of c
9580: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
9590: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
95a0: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
95b0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
95c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
95d0: 6c 65 7d 0a 0a 20 20 37 20 22 43 52 45 41 54 45  le}..  7 "CREATE
95e0: 20 54 41 42 4c 45 20 63 28 69 69 2c 20 6a 6a 2c   TABLE c(ii, jj,
95f0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 6a 6a 2c   FOREIGN KEY(jj,
9600: 20 69 69 29 20 52 45 46 45 52 45 4e 43 45 53 20   ii) REFERENCES 
9610: 70 28 78 2c 79 2c 7a 29 29 22 20 0a 20 20 20 20  p(x,y,z))" .    
9620: 7b 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  {number of colum
9630: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
9640: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
9650: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9660: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
9670: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 7d 0a  ferenced table}.
9680: 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  } {.  drop_all_t
9690: 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  ables.  do_test 
96a0: 65 5f 66 6b 65 79 2d 32 38 2e 24 74 6e 20 5b 6c  e_fkey-28.$tn [l
96b0: 69 73 74 20 63 61 74 63 68 73 71 6c 20 24 73 71  ist catchsql $sq
96c0: 6c 5d 20 5b 6c 69 73 74 20 31 20 24 65 72 72 5d  l] [list 1 $err]
96d0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .}.do_test e_fke
96e0: 79 2d 32 38 2e 38 20 7b 0a 20 20 64 72 6f 70 5f  y-28.8 {.  drop_
96f0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65  all_tables.  exe
9700: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
9710: 45 20 54 41 42 4c 45 20 70 28 78 20 50 52 49 4d  E TABLE p(x PRIM
9720: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
9730: 45 41 54 45 20 54 41 42 4c 45 20 63 28 61 2c 20  EATE TABLE c(a, 
9740: 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
9750: 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  ,b) REFERENCES p
9760: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
9770: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  l {DELETE FROM p
9780: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
9790: 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64  key mismatch}}.d
97a0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 38  o_test e_fkey-28
97b0: 2e 39 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .9 {.  drop_all_
97c0: 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
97d0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
97e0: 42 4c 45 20 70 28 78 2c 20 79 2c 20 50 52 49 4d  BLE p(x, y, PRIM
97f0: 41 52 59 20 4b 45 59 28 78 2c 79 29 29 3b 0a 20  ARY KEY(x,y));. 
9800: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9810: 63 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(a REFERENCES p
9820: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
9830: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  l {DELETE FROM p
9840: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
9850: 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a  key mismatch}}..
9860: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56  -----------.# EV
98b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 36  IDENCE-OF: R-246
98c0: 37 36 2d 30 39 38 35 39 0a 23 0a 23 20 54 65 73  76-09859.#.# Tes
98d0: 74 20 74 68 65 20 65 78 61 6d 70 6c 65 20 73 63  t the example sc
98e0: 68 65 6d 61 20 69 6e 20 74 68 65 20 22 43 6f 6d  hema in the "Com
98f0: 70 6f 73 69 74 65 20 46 6f 72 65 69 67 6e 20 4b  posite Foreign K
9900: 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 22 20  ey Constraints" 
9910: 0a 23 20 73 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f  .# section..#.do
9920: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 39 2e  _test e_fkey-29.
9930: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
9940: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9950: 20 61 6c 62 75 6d 28 0a 20 20 20 20 20 20 61 6c   album(.      al
9960: 62 75 6d 61 72 74 69 73 74 20 54 45 58 54 2c 0a  bumartist TEXT,.
9970: 20 20 20 20 20 20 61 6c 62 75 6d 6e 61 6d 65 20        albumname 
9980: 54 45 58 54 2c 0a 20 20 20 20 20 20 61 6c 62 75  TEXT,.      albu
9990: 6d 63 6f 76 65 72 20 42 49 4e 41 52 59 2c 0a 20  mcover BINARY,. 
99a0: 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59       PRIMARY KEY
99b0: 28 61 6c 62 75 6d 61 72 74 69 73 74 2c 20 61 6c  (albumartist, al
99c0: 62 75 6d 6e 61 6d 65 29 0a 20 20 20 20 29 3b 0a  bumname).    );.
99d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
99e0: 20 73 6f 6e 67 28 0a 20 20 20 20 20 20 73 6f 6e   song(.      son
99f0: 67 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  gid INTEGER,.   
9a00: 20 20 20 73 6f 6e 67 61 72 74 69 73 74 20 54 45     songartist TE
9a10: 58 54 2c 0a 20 20 20 20 20 20 73 6f 6e 67 61 6c  XT,.      songal
9a20: 62 75 6d 20 54 45 58 54 2c 0a 20 20 20 20 20 20  bum TEXT,.      
9a30: 73 6f 6e 67 6e 61 6d 65 20 54 45 58 54 2c 0a 20  songname TEXT,. 
9a40: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
9a50: 28 73 6f 6e 67 61 72 74 69 73 74 2c 20 73 6f 6e  (songartist, son
9a60: 67 61 6c 62 75 6d 29 20 52 45 46 45 52 45 4e 43  galbum) REFERENC
9a70: 45 53 20 61 6c 62 75 6d 28 61 6c 62 75 6d 61 72  ES album(albumar
9a80: 74 69 73 74 2c 61 6c 62 75 6d 6e 61 6d 65 29 0a  tist,albumname).
9a90: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
9aa0: 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
9ab0: 32 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  29.2 {.  execsql
9ac0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
9ad0: 54 4f 20 61 6c 62 75 6d 20 56 41 4c 55 45 53 28  TO album VALUES(
9ae0: 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27 2c  'Elvis Presley',
9af0: 20 27 45 6c 76 69 73 27 27 20 43 68 72 69 73 74   'Elvis'' Christ
9b00: 6d 61 73 20 41 6c 62 75 6d 27 2c 20 4e 55 4c 4c  mas Album', NULL
9b10: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9b20: 54 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 0a  TO song VALUES(.
9b30: 20 20 20 20 20 20 31 2c 20 27 45 6c 76 69 73 20        1, 'Elvis 
9b40: 50 72 65 73 6c 65 79 27 2c 20 27 45 6c 76 69 73  Presley', 'Elvis
9b50: 27 27 20 43 68 72 69 73 74 6d 61 73 20 41 6c 62  '' Christmas Alb
9b60: 75 6d 27 2c 20 27 48 65 72 65 20 43 6f 6d 65 73  um', 'Here Comes
9b70: 20 53 61 6e 74 61 20 43 6c 61 75 73 65 27 0a 20   Santa Clause'. 
9b80: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64     );.  }.} {}.d
9b90: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 32 39  o_test e_fkey-29
9ba0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
9bb0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
9bc0: 4f 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 32 2c  O song VALUES(2,
9bd0: 20 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27   'Elvis Presley'
9be0: 2c 20 27 45 6c 76 69 73 20 49 73 20 42 61 63 6b  , 'Elvis Is Back
9bf0: 21 27 2c 20 27 46 65 76 65 72 27 29 3b 0a 20 20  !', 'Fever');.  
9c00: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
9c10: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
9c20: 61 69 6c 65 64 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  ailed}}...#-----
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c70: 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43 45 2d  ----.# EVIDENCE-
9c80: 4f 46 3a 20 52 2d 33 33 36 32 36 2d 34 38 34 31  OF: R-33626-4841
9c90: 38 20 49 6e 20 53 51 4c 69 74 65 2c 20 69 66 20  8 In SQLite, if 
9ca0: 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69 6c 64  any of the child
9cb0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 0a 23 20 28   key columns.# (
9cc0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 6f 6e  in this case son
9cd0: 67 61 72 74 69 73 74 20 61 6e 64 20 73 6f 6e 67  gartist and song
9ce0: 61 6c 62 75 6d 29 20 61 72 65 20 4e 55 4c 4c 2c  album) are NULL,
9cf0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
9d00: 6f 0a 23 20 72 65 71 75 69 72 65 6d 65 6e 74 20  o.# requirement 
9d10: 66 6f 72 20 61 20 63 6f 72 72 65 73 70 6f 6e 64  for a correspond
9d20: 69 6e 67 20 72 6f 77 20 69 6e 20 74 68 65 20 70  ing row in the p
9d30: 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 23 0a 64  arent table..#.d
9d40: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 30  o_test e_fkey-30
9d50: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
9d60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9d70: 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 32 2c 20   song VALUES(2, 
9d80: 27 45 6c 76 69 73 20 50 72 65 73 6c 65 79 27 2c  'Elvis Presley',
9d90: 20 4e 55 4c 4c 2c 20 27 46 65 76 65 72 27 29 3b   NULL, 'Fever');
9da0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9db0: 20 73 6f 6e 67 20 56 41 4c 55 45 53 28 33 2c 20   song VALUES(3, 
9dc0: 4e 55 4c 4c 2c 20 27 45 6c 76 69 73 20 49 73 20  NULL, 'Elvis Is 
9dd0: 42 61 63 6b 27 2c 20 27 53 6f 6c 64 69 65 72 20  Back', 'Soldier 
9de0: 42 6f 79 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  Boy');.  }.} {}.
9df0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
9e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e30: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23  ############.###
9e40: 20 53 45 43 54 49 4f 4e 20 34 2e 32 3a 20 44 65   SECTION 4.2: De
9e50: 66 65 72 72 65 64 20 46 6f 72 65 69 67 6e 20 4b  ferred Foreign K
9e60: 65 79 20 43 6f 6e 73 74 72 61 69 6e 74 73 0a 23  ey Constraints.#
9e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e90: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9eb0: 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d  ##########..#---
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f00: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
9f10: 61 74 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  at if a statemen
9f20: 74 20 76 69 6f 6c 61 74 65 73 20 61 6e 20 69 6d  t violates an im
9f30: 6d 65 64 69 61 74 65 20 46 4b 20 63 6f 6e 73 74  mediate FK const
9f40: 72 61 69 6e 74 2c 20 61 6e 64 20 74 68 65 0a 23  raint, and the.#
9f50: 20 64 61 74 61 62 61 73 65 20 64 6f 65 73 20 6e   database does n
9f60: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 46  ot satisfy the F
9f70: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 63  K constraint onc
9f80: 65 20 61 6c 6c 20 65 66 66 65 63 74 73 20 6f 66  e all effects of
9f90: 20 74 68 65 0a 23 20 73 74 61 74 65 6d 65 6e 74   the.# statement
9fa0: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 6c 69   have been appli
9fb0: 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ed, an error is 
9fc0: 72 65 70 6f 72 74 65 64 20 61 6e 64 20 74 68 65  reported and the
9fd0: 20 65 66 66 65 63 74 73 20 6f 66 0a 23 20 74 68   effects of.# th
9fe0: 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
9ff0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 45 56 49  ed back..#.# EVI
a000: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 33 32  DENCE-OF: R-0932
a010: 33 2d 33 30 34 37 30 20 49 66 20 61 20 73 74 61  3-30470 If a sta
a020: 74 65 6d 65 6e 74 20 6d 6f 64 69 66 69 65 73 20  tement modifies 
a030: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
a040: 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20 73  the.# database s
a050: 6f 20 74 68 61 74 20 61 6e 20 69 6d 6d 65 64 69  o that an immedi
a060: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
a070: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 69 6e  constraint is in
a080: 20 76 69 6f 6c 61 74 69 6f 6e 0a 23 20 61 74 20   violation.# at 
a090: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 74  the conclusion t
a0a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  he statement, an
a0b0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68   exception is th
a0c0: 72 6f 77 6e 20 61 6e 64 20 74 68 65 0a 23 20 65  rown and the.# e
a0d0: 66 66 65 63 74 73 20 6f 66 20 74 68 65 20 73 74  ffects of the st
a0e0: 61 74 65 6d 65 6e 74 20 61 72 65 20 72 65 76 65  atement are reve
a0f0: 72 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  rted..#.drop_all
a100: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
a110: 65 5f 66 6b 65 79 2d 33 31 2e 31 20 7b 0a 20 20  e_fkey-31.1 {.  
a120: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
a130: 45 41 54 45 20 54 41 42 4c 45 20 6b 69 6e 67 28  EATE TABLE king(
a140: 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45  a, b, PRIMARY KE
a150: 59 28 61 29 29 3b 0a 20 20 20 20 43 52 45 41 54  Y(a));.    CREAT
a160: 45 20 54 41 42 4c 45 20 70 72 69 6e 63 65 28 63  E TABLE prince(c
a170: 20 52 45 46 45 52 45 4e 43 45 53 20 6b 69 6e 67   REFERENCES king
a180: 2c 20 64 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  , d);.  }.} {}..
a190: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
a1a0: 31 2e 32 20 7b 0a 20 20 23 20 45 78 65 63 75 74  1.2 {.  # Execut
a1b0: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68  e a statement th
a1c0: 61 74 20 76 69 6f 6c 61 74 65 73 20 74 68 65 20  at violates the 
a1d0: 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63 6f 6e  immediate FK con
a1e0: 73 74 72 61 69 6e 74 2e 0a 20 20 63 61 74 63 68  straint..  catch
a1f0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a200: 4f 20 70 72 69 6e 63 65 20 56 41 4c 55 45 53 28  O prince VALUES(
a210: 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  1, 2) }.} {1 {fo
a220: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a230: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64  aint failed}}..d
a240: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 31  o_test e_fkey-31
a250: 2e 33 20 7b 0a 20 20 23 20 54 68 69 73 20 74 69  .3 {.  # This ti
a260: 6d 65 2c 20 75 73 65 20 61 20 74 72 69 67 67 65  me, use a trigge
a270: 72 20 74 6f 20 66 69 78 20 74 68 65 20 63 6f 6e  r to fix the con
a280: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
a290: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 23  n before the.  #
a2a0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 66   statement has f
a2b0: 69 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e  inished executin
a2c0: 67 2e 20 54 68 65 6e 20 65 78 65 63 75 74 65 20  g. Then execute 
a2d0: 74 68 65 20 73 61 6d 65 20 73 74 61 74 65 6d 65  the same stateme
a2e0: 6e 74 20 61 73 0a 20 20 23 20 69 6e 20 74 68 65  nt as.  # in the
a2f0: 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 63   previous test c
a300: 61 73 65 2e 20 54 68 69 73 20 74 69 6d 65 2c 20  ase. This time, 
a310: 6e 6f 20 65 72 72 6f 72 2e 0a 20 20 65 78 65 63  no error..  exec
a320: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a330: 20 54 52 49 47 47 45 52 20 6b 74 20 41 46 54 45   TRIGGER kt AFTE
a340: 52 20 49 4e 53 45 52 54 20 4f 4e 20 70 72 69 6e  R INSERT ON prin
a350: 63 65 20 57 48 45 4e 0a 20 20 20 20 20 20 4e 4f  ce WHEN.      NO
a360: 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54  T EXISTS (SELECT
a370: 20 61 20 46 52 4f 4d 20 6b 69 6e 67 20 57 48 45   a FROM king WHE
a380: 52 45 20 61 20 3d 20 6e 65 77 2e 63 29 0a 20 20  RE a = new.c).  
a390: 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e    BEGIN.      IN
a3a0: 53 45 52 54 20 49 4e 54 4f 20 6b 69 6e 67 20 56  SERT INTO king V
a3b0: 41 4c 55 45 53 28 6e 65 77 2e 63 2c 20 4e 55 4c  ALUES(new.c, NUL
a3c0: 4c 29 3b 0a 20 20 20 20 45 4e 44 0a 20 20 7d 0a  L);.    END.  }.
a3d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
a3e0: 52 54 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56  RT INTO prince V
a3f0: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20  ALUES(1, 2) }.} 
a400: 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20  {}..# Test that 
a410: 6f 70 65 72 61 74 69 6e 67 20 69 6e 73 69 64 65  operating inside
a420: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   a transaction m
a430: 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
a440: 63 65 20 74 6f 20 0a 23 20 69 6d 6d 65 64 69 61  ce to .# immedia
a450: 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  te constraint vi
a460: 6f 6c 61 74 69 6f 6e 20 68 61 6e 64 6c 69 6e 67  olation handling
a470: 2e 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  ..do_test e_fkey
a480: 2d 33 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -31.4 {.  execsq
a490: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
a4a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
a4b0: 72 69 6e 63 65 20 56 41 4c 55 45 53 28 32 2c 20  rince VALUES(2, 
a4c0: 33 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 52 49  3);.    DROP TRI
a4d0: 47 47 45 52 20 6b 74 3b 0a 20 20 7d 0a 20 20 63  GGER kt;.  }.  c
a4e0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
a4f0: 20 49 4e 54 4f 20 70 72 69 6e 63 65 20 56 41 4c   INTO prince VAL
a500: 55 45 53 28 33 2c 20 34 29 20 7d 0a 7d 20 7b 31  UES(3, 4) }.} {1
a510: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
a520: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
a530: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
a540: 2d 33 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -31.5 {.  execsq
a550: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
a560: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a570: 4d 20 6b 69 6e 67 3b 0a 20 20 7d 0a 7d 20 7b 31  M king;.  }.} {1
a580: 20 7b 7d 20 32 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d   {} 2 {}}..#----
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5d0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
a5e0: 74 20 69 66 20 61 20 64 65 66 65 72 72 65 64 20  t if a deferred 
a5f0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 76 69  constraint is vi
a600: 6f 6c 61 74 65 64 20 77 69 74 68 69 6e 20 61 20  olated within a 
a610: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 23 20 6e  transaction,.# n
a620: 6f 74 68 69 6e 67 20 68 61 70 70 65 6e 73 20 69  othing happens i
a630: 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 74  mmediately and t
a640: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
a650: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
a660: 74 0a 23 20 69 6e 20 61 20 73 74 61 74 65 20 74  t.# in a state t
a670: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  hat does not sat
a680: 69 73 66 79 20 74 68 65 20 46 4b 20 63 6f 6e 73  isfy the FK cons
a690: 74 72 61 69 6e 74 2e 20 48 6f 77 65 76 65 72 20  traint. However 
a6a0: 61 74 74 65 6d 70 74 73 0a 23 20 74 6f 20 43 4f  attempts.# to CO
a6b0: 4d 4d 49 54 20 74 68 65 20 74 72 61 6e 73 61 63  MMIT the transac
a6c0: 74 69 6f 6e 20 66 61 69 6c 20 75 6e 74 69 6c 20  tion fail until 
a6d0: 74 68 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  the FK constrain
a6e0: 74 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  t is satisfied..
a6f0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
a700: 20 52 2d 34 39 31 37 38 2d 32 31 33 35 38 20 42   R-49178-21358 B
a710: 79 20 63 6f 6e 74 72 61 73 74 2c 20 69 66 20 61  y contrast, if a
a720: 20 73 74 61 74 65 6d 65 6e 74 20 6d 6f 64 69 66   statement modif
a730: 69 65 73 20 74 68 65 0a 23 20 63 6f 6e 74 65 6e  ies the.# conten
a740: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
a750: 73 65 20 73 75 63 68 20 74 68 61 74 20 61 20 64  se such that a d
a760: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
a770: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23  key constraint.#
a780: 20 69 73 20 76 69 6f 6c 61 74 65 64 2c 20 74 68   is violated, th
a790: 65 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 6e  e violation is n
a7a0: 6f 74 20 72 65 70 6f 72 74 65 64 20 69 6d 6d 65  ot reported imme
a7b0: 64 69 61 74 65 6c 79 2e 0a 23 0a 23 20 45 56 49  diately..#.# EVI
a7c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 36 39  DENCE-OF: R-3969
a7d0: 32 2d 31 32 34 38 38 20 44 65 66 65 72 72 65 64  2-12488 Deferred
a7e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
a7f0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f 74  straints are not
a800: 0a 23 20 63 68 65 63 6b 65 64 20 75 6e 74 69 6c  .# checked until
a810: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a820: 20 74 72 69 65 73 20 74 6f 20 43 4f 4d 4d 49 54   tries to COMMIT
a830: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
a840: 46 3a 20 52 2d 35 35 31 34 37 2d 34 37 36 36 34  F: R-55147-47664
a850: 20 46 6f 72 20 61 73 20 6c 6f 6e 67 20 61 73 20   For as long as 
a860: 74 68 65 20 75 73 65 72 20 68 61 73 20 61 6e 20  the user has an 
a870: 6f 70 65 6e 0a 23 20 74 72 61 6e 73 61 63 74 69  open.# transacti
a880: 6f 6e 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  on, the database
a890: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 65   is allowed to e
a8a0: 78 69 73 74 20 69 6e 20 61 20 73 74 61 74 65 20  xist in a state 
a8b0: 74 68 61 74 20 76 69 6f 6c 61 74 65 73 0a 23 20  that violates.# 
a8c0: 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  any number of de
a8d0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
a8e0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ey constraints..
a8f0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
a900: 20 52 2d 32 39 36 30 34 2d 33 30 33 39 35 20 48   R-29604-30395 H
a910: 6f 77 65 76 65 72 2c 20 43 4f 4d 4d 49 54 20 77  owever, COMMIT w
a920: 69 6c 6c 20 66 61 69 6c 20 61 73 20 6c 6f 6e 67  ill fail as long
a930: 20 61 73 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65   as.# foreign ke
a940: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  y constraints re
a950: 6d 61 69 6e 20 69 6e 20 76 69 6f 6c 61 74 69 6f  main in violatio
a960: 6e 2e 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 65  n..#.proc test_e
a970: 66 6b 65 79 5f 33 34 20 7b 74 6e 20 69 73 45 72  fkey_34 {tn isEr
a980: 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f  ror sql} {.  do_
a990: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 32 2e 24  test e_fkey-32.$
a9a0: 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73 71  tn ".    catchsq
a9b0: 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69  l {$sql}.  " [li
a9c0: 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20  ndex {{0 {}} {1 
a9d0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
a9e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
a9f0: 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 64 72  } $isError].}.dr
aa00: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 0a 74  op_all_tables..t
aa10: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 31 20  est_efkey_34  1 
aa20: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
aa30: 4c 45 20 6c 6c 28 6b 20 50 52 49 4d 41 52 59 20  LE ll(k PRIMARY 
aa40: 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45 20 54  KEY);.  CREATE T
aa50: 41 42 4c 45 20 6b 6b 28 63 20 52 45 46 45 52 45  ABLE kk(c REFERE
aa60: 4e 43 45 53 20 6c 6c 20 44 45 46 45 52 52 41 42  NCES ll DEFERRAB
aa70: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
aa80: 45 52 52 45 44 29 3b 0a 7d 0a 74 65 73 74 5f 65  ERRED);.}.test_e
aa90: 66 6b 65 79 5f 33 34 20 20 32 20 30 20 22 42 45  fkey_34  2 0 "BE
aaa0: 47 49 4e 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  GIN".test_efkey_
aab0: 33 34 20 20 33 20 30 20 20 20 22 49 4e 53 45 52  34  3 0   "INSER
aac0: 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55 45 53  T INTO kk VALUES
aad0: 28 35 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f  (5)".test_efkey_
aae0: 33 34 20 20 34 20 30 20 20 20 22 49 4e 53 45 52  34  4 0   "INSER
aaf0: 54 20 49 4e 54 4f 20 6b 6b 20 56 41 4c 55 45 53  T INTO kk VALUES
ab00: 28 31 30 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  (10)".test_efkey
ab10: 5f 33 34 20 20 35 20 31 20 22 43 4f 4d 4d 49 54  _34  5 1 "COMMIT
ab20: 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34 20  ".test_efkey_34 
ab30: 20 36 20 30 20 20 20 22 49 4e 53 45 52 54 20 49   6 0   "INSERT I
ab40: 4e 54 4f 20 6c 6c 20 56 41 4c 55 45 53 28 31 30  NTO ll VALUES(10
ab50: 29 22 0a 74 65 73 74 5f 65 66 6b 65 79 5f 33 34  )".test_efkey_34
ab60: 20 20 37 20 31 20 22 43 4f 4d 4d 49 54 22 0a 74    7 1 "COMMIT".t
ab70: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 38 20  est_efkey_34  8 
ab80: 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  0   "INSERT INTO
ab90: 20 6c 6c 20 56 41 4c 55 45 53 28 35 29 22 0a 74   ll VALUES(5)".t
aba0: 65 73 74 5f 65 66 6b 65 79 5f 33 34 20 20 39 20  est_efkey_34  9 
abb0: 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 23 2d 2d 2d  0 "COMMIT"..#---
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac00: 2d 2d 2d 2d 2d 2d 0a 23 20 57 68 65 6e 20 6e 6f  ------.# When no
ac10: 74 20 72 75 6e 6e 69 6e 67 20 69 6e 73 69 64 65  t running inside
ac20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
ac30: 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  a deferred const
ac40: 72 61 69 6e 74 20 69 73 20 73 69 6d 69 6c 61 72  raint is similar
ac50: 0a 23 20 74 6f 20 61 6e 20 69 6d 6d 65 64 69 61  .# to an immedia
ac60: 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 76  te constraint (v
ac70: 69 6f 6c 61 74 69 6f 6e 73 20 61 72 65 20 72 65  iolations are re
ac80: 70 6f 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65  ported immediate
ac90: 6c 79 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ly)..#.# EVIDENC
aca0: 45 2d 4f 46 3a 20 52 2d 35 36 38 34 34 2d 36 31  E-OF: R-56844-61
acb0: 37 30 35 20 49 66 20 74 68 65 20 63 75 72 72 65  705 If the curre
acc0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  nt statement is 
acd0: 6e 6f 74 20 69 6e 73 69 64 65 20 61 6e 0a 23 20  not inside an.# 
ace0: 65 78 70 6c 69 63 69 74 20 74 72 61 6e 73 61 63  explicit transac
acf0: 74 69 6f 6e 20 28 61 20 42 45 47 49 4e 2f 43 4f  tion (a BEGIN/CO
ad00: 4d 4d 49 54 2f 52 4f 4c 4c 42 41 43 4b 20 62 6c  MMIT/ROLLBACK bl
ad10: 6f 63 6b 29 2c 20 74 68 65 6e 20 61 6e 20 69 6d  ock), then an im
ad20: 70 6c 69 63 69 74 0a 23 20 74 72 61 6e 73 61 63  plicit.# transac
ad30: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
ad40: 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  d as soon as the
ad50: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 66   statement has f
ad60: 69 6e 69 73 68 65 64 0a 23 20 65 78 65 63 75 74  inished.# execut
ad70: 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ing. In this cas
ad80: 65 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  e deferred const
ad90: 72 61 69 6e 74 73 20 62 65 68 61 76 65 20 74 68  raints behave th
ada0: 65 20 73 61 6d 65 20 61 73 0a 23 20 69 6d 6d 65  e same as.# imme
adb0: 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  diate constraint
adc0: 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  s..#.drop_all_ta
add0: 62 6c 65 73 0a 70 72 6f 63 20 74 65 73 74 5f 65  bles.proc test_e
ade0: 66 6b 65 79 5f 33 35 20 7b 74 6e 20 69 73 45 72  fkey_35 {tn isEr
adf0: 72 6f 72 20 73 71 6c 7d 20 7b 0a 20 20 64 6f 5f  ror sql} {.  do_
ae00: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 33 2e 24  test e_fkey-33.$
ae10: 74 6e 20 22 0a 20 20 20 20 63 61 74 63 68 73 71  tn ".    catchsq
ae20: 6c 20 7b 24 73 71 6c 7d 0a 20 20 22 20 5b 6c 69  l {$sql}.  " [li
ae30: 6e 64 65 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20  ndex {{0 {}} {1 
ae40: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
ae50: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
ae60: 7d 20 24 69 73 45 72 72 6f 72 5d 0a 7d 0a 64 6f  } $isError].}.do
ae70: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 33 2e  _test e_fkey-33.
ae80: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
ae90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
aea0: 20 70 61 72 65 6e 74 28 78 2c 20 79 29 3b 0a 20   parent(x, y);. 
aeb0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
aec0: 20 49 4e 44 45 58 20 70 69 20 4f 4e 20 70 61 72   INDEX pi ON par
aed0: 65 6e 74 28 78 2c 20 79 29 3b 0a 20 20 20 20 43  ent(x, y);.    C
aee0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
aef0: 64 28 61 2c 20 62 2c 0a 20 20 20 20 20 20 46 4f  d(a, b,.      FO
af00: 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20  REIGN KEY(a, b) 
af10: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
af20: 74 28 78 2c 20 79 29 20 44 45 46 45 52 52 41 42  t(x, y) DEFERRAB
af30: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
af40: 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d  ERRED.    );.  }
af50: 0a 7d 20 7b 7d 0a 74 65 73 74 5f 65 66 6b 65 79  .} {}.test_efkey
af60: 5f 33 35 20 32 20 31 20 22 49 4e 53 45 52 54 20  _35 2 1 "INSERT 
af70: 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41 4c 55  INTO child  VALU
af80: 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 74 65  ES('x', 'y')".te
af90: 73 74 5f 65 66 6b 65 79 5f 33 35 20 33 20 30 20  st_efkey_35 3 0 
afa0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72  "INSERT INTO par
afb0: 65 6e 74 20 56 41 4c 55 45 53 28 27 78 27 2c 20  ent VALUES('x', 
afc0: 27 79 27 29 22 0a 74 65 73 74 5f 65 66 6b 65 79  'y')".test_efkey
afd0: 5f 33 35 20 34 20 30 20 22 49 4e 53 45 52 54 20  _35 4 0 "INSERT 
afe0: 49 4e 54 4f 20 63 68 69 6c 64 20 20 56 41 4c 55  INTO child  VALU
aff0: 45 53 28 27 78 27 2c 20 27 79 27 29 22 0a 0a 0a  ES('x', 'y')"...
b000: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
b050: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 37 38  DENCE-OF: R-1278
b060: 32 2d 36 31 38 34 31 0a 23 0a 23 20 54 65 73 74  2-61841.#.# Test
b070: 20 74 68 61 74 20 61 6e 20 46 4b 20 63 6f 6e 73   that an FK cons
b080: 74 72 61 69 6e 74 20 69 73 20 6d 61 64 65 20 64  traint is made d
b090: 65 66 65 72 72 65 64 20 62 79 20 61 64 64 69 6e  eferred by addin
b0a0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
b0b0: 23 20 74 6f 20 74 68 65 20 64 65 66 69 6e 69 74  # to the definit
b0c0: 69 6f 6e 3a 0a 23 0a 23 20 20 20 44 45 46 45 52  ion:.#.#   DEFER
b0d0: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
b0e0: 44 45 46 45 52 52 45 44 0a 23 0a 23 20 45 56 49  DEFERRED.#.# EVI
b0f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 30 30  DENCE-OF: R-0900
b100: 35 2d 32 38 37 39 31 0a 23 0a 23 20 41 6c 73 6f  5-28791.#.# Also
b110: 20 74 65 73 74 20 74 68 61 74 20 61 64 64 69 6e   test that addin
b120: 67 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  g any of the fol
b130: 6c 6f 77 69 6e 67 20 74 6f 20 61 20 66 6f 72 65  lowing to a fore
b140: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
b150: 6f 6e 20 0a 23 20 6d 61 6b 65 73 20 74 68 65 20  on .# makes the 
b160: 63 6f 6e 73 74 72 61 69 6e 74 20 49 4d 4d 45 44  constraint IMMED
b170: 49 41 54 45 3a 0a 23 0a 23 20 20 20 4e 4f 54 20  IATE:.#.#   NOT 
b180: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b190: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 23 20  ALLY DEFERRED.# 
b1a0: 20 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45    NOT DEFERRABLE
b1b0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
b1c0: 49 41 54 45 0a 23 20 20 20 4e 4f 54 20 44 45 46  IATE.#   NOT DEF
b1d0: 45 52 52 41 42 4c 45 0a 23 20 20 20 44 45 46 45  ERRABLE.#   DEFE
b1e0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
b1f0: 20 49 4d 4d 45 44 49 41 54 45 0a 23 20 20 20 44   IMMEDIATE.#   D
b200: 45 46 45 52 52 41 42 4c 45 0a 23 0a 23 20 46 6f  EFERRABLE.#.# Fo
b210: 72 65 69 67 6e 20 6b 65 79 73 20 61 72 65 20 49  reign keys are I
b220: 4d 4d 45 44 49 41 54 45 20 62 79 20 64 65 66 61  MMEDIATE by defa
b230: 75 6c 74 20 28 69 66 20 74 68 65 72 65 20 69 73  ult (if there is
b240: 20 6e 6f 20 44 45 46 45 52 52 41 42 4c 45 20 6f   no DEFERRABLE o
b250: 72 20 4e 4f 54 0a 23 20 44 45 46 45 52 52 41 42  r NOT.# DEFERRAB
b260: 4c 45 20 63 6c 61 75 73 65 29 2e 0a 23 0a 23 20  LE clause)..#.# 
b270: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
b280: 35 32 39 30 2d 31 36 34 36 30 20 46 6f 72 65 69  5290-16460 Forei
b290: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
b2a0: 74 73 20 61 72 65 20 69 6d 6d 65 64 69 61 74 65  ts are immediate
b2b0: 20 62 79 0a 23 20 64 65 66 61 75 6c 74 2e 0a 23   by.# default..#
b2c0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b2d0: 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 45 61  R-30323-21917 Ea
b2e0: 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
b2f0: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 53 51 4c  onstraint in SQL
b300: 69 74 65 20 69 73 0a 23 20 63 6c 61 73 73 69 66  ite is.# classif
b310: 69 65 64 20 61 73 20 65 69 74 68 65 72 20 69 6d  ied as either im
b320: 6d 65 64 69 61 74 65 20 6f 72 20 64 65 66 65 72  mediate or defer
b330: 72 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  red..#.drop_all_
b340: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
b350: 5f 66 6b 65 79 2d 33 34 2e 31 20 7b 0a 20 20 65  _fkey-34.1 {.  e
b360: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
b370: 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
b380: 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52  (x, y, z, PRIMAR
b390: 59 20 4b 45 59 28 78 2c 79 2c 7a 29 29 3b 0a 20  Y KEY(x,y,z));. 
b3a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b3b0: 63 31 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20  c1(a, b, c,.    
b3c0: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
b3d0: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b3e0: 53 20 70 61 72 65 6e 74 20 4e 4f 54 20 44 45 46  S parent NOT DEF
b3f0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
b400: 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
b410: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b420: 4c 45 20 63 32 28 61 2c 20 62 2c 20 63 2c 0a 20  LE c2(a, b, c,. 
b430: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
b440: 28 61 2c 20 62 2c 20 63 29 20 52 45 46 45 52 45  (a, b, c) REFERE
b450: 4e 43 45 53 20 70 61 72 65 6e 74 20 4e 4f 54 20  NCES parent NOT 
b460: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b470: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 20  ALLY IMMEDIATE. 
b480: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
b490: 20 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c 20   TABLE c3(a, b, 
b4a0: 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  c,.      FOREIGN
b4b0: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b4c0: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
b4d0: 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 0a 20  NOT DEFERRABLE. 
b4e0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
b4f0: 20 54 41 42 4c 45 20 63 34 28 61 2c 20 62 2c 20   TABLE c4(a, b, 
b500: 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  c,.      FOREIGN
b510: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b520: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
b530: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
b540: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 0a 20  ALLY IMMEDIATE. 
b550: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
b560: 20 54 41 42 4c 45 20 63 35 28 61 2c 20 62 2c 20   TABLE c5(a, b, 
b570: 63 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  c,.      FOREIGN
b580: 20 4b 45 59 28 61 2c 20 62 2c 20 63 29 20 52 45   KEY(a, b, c) RE
b590: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
b5a0: 44 45 46 45 52 52 41 42 4c 45 0a 20 20 20 20 29  DEFERRABLE.    )
b5b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
b5c0: 4c 45 20 63 36 28 61 2c 20 62 2c 20 63 2c 20 46  LE c6(a, b, c, F
b5d0: 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 2c  OREIGN KEY(a, b,
b5e0: 20 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   c) REFERENCES p
b5f0: 61 72 65 6e 74 29 3b 0a 0a 20 20 20 20 2d 2d 20  arent);..    -- 
b600: 54 68 69 73 20 46 4b 20 63 6f 6e 73 74 72 61 69  This FK constrai
b610: 6e 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  nt is the only d
b620: 65 66 65 72 72 61 62 6c 65 20 6f 6e 65 2e 0a 20  eferrable one.. 
b630: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b640: 63 37 28 61 2c 20 62 2c 20 63 2c 0a 20 20 20 20  c7(a, b, c,.    
b650: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
b660: 20 62 2c 20 63 29 20 52 45 46 45 52 45 4e 43 45   b, c) REFERENCE
b670: 53 20 70 61 72 65 6e 74 20 44 45 46 45 52 52 41  S parent DEFERRA
b680: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
b690: 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20  FERRED.    );.. 
b6a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
b6b0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 27 61 27  arent VALUES('a'
b6c0: 2c 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20  , 'b', 'c');.   
b6d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
b6e0: 65 6e 74 20 56 41 4c 55 45 53 28 27 64 27 2c 20  ent VALUES('d', 
b6f0: 27 65 27 2c 20 27 66 27 29 3b 0a 20 20 20 20 49  'e', 'f');.    I
b700: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
b710: 74 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68  t VALUES('g', 'h
b720: 27 2c 20 27 69 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'i');.    INS
b730: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
b740: 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27 2c  VALUES('j', 'k',
b750: 20 27 6c 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'l');.    INSER
b760: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
b770: 4c 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c 20 27  LUES('m', 'n', '
b780: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
b790: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
b7a0: 45 53 28 27 70 27 2c 20 27 71 27 2c 20 27 72 27  ES('p', 'q', 'r'
b7b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b7c0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
b7d0: 28 27 73 27 2c 20 27 74 27 2c 20 27 75 27 29 3b  ('s', 't', 'u');
b7e0: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
b7f0: 4f 20 63 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O c1 VALUES('a',
b800: 20 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20   'b', 'c');.    
b810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
b820: 41 4c 55 45 53 28 27 64 27 2c 20 27 65 27 2c 20  ALUES('d', 'e', 
b830: 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'f');.    INSERT
b840: 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28   INTO c3 VALUES(
b850: 27 67 27 2c 20 27 68 27 2c 20 27 69 27 29 3b 0a  'g', 'h', 'i');.
b860: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b870: 63 34 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27  c4 VALUES('j', '
b880: 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20 49 4e  k', 'l');.    IN
b890: 53 45 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c  SERT INTO c5 VAL
b8a0: 55 45 53 28 27 6d 27 2c 20 27 6e 27 2c 20 27 6f  UES('m', 'n', 'o
b8b0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
b8c0: 4e 54 4f 20 63 36 20 56 41 4c 55 45 53 28 27 70  NTO c6 VALUES('p
b8d0: 27 2c 20 27 71 27 2c 20 27 72 27 29 3b 0a 20 20  ', 'q', 'r');.  
b8e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 37    INSERT INTO c7
b8f0: 20 56 41 4c 55 45 53 28 27 73 27 2c 20 27 74 27   VALUES('s', 't'
b900: 2c 20 27 75 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  , 'u');.  }.} {}
b910: 0a 0a 70 72 6f 63 20 74 65 73 74 5f 65 66 6b 65  ..proc test_efke
b920: 79 5f 32 39 20 7b 74 6e 20 73 71 6c 20 69 73 45  y_29 {tn sql isE
b930: 72 72 6f 72 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  rror} {.  do_tes
b940: 74 20 65 5f 66 6b 65 79 2d 33 34 2e 24 74 6e 20  t e_fkey-34.$tn 
b950: 22 63 61 74 63 68 73 71 6c 20 7b 24 73 71 6c 7d  "catchsql {$sql}
b960: 22 20 5b 0a 20 20 20 20 6c 69 6e 64 65 78 20 7b  " [.    lindex {
b970: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 66 6f 72 65 69  {0 {}} {1 {forei
b980: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
b990: 74 20 66 61 69 6c 65 64 7d 7d 7d 20 24 69 73 45  t failed}}} $isE
b9a0: 72 72 6f 72 0a 20 20 5d 0a 7d 0a 74 65 73 74 5f  rror.  ].}.test_
b9b0: 65 66 6b 65 79 5f 32 39 20 20 32 20 22 42 45 47  efkey_29  2 "BEG
b9c0: 49 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  IN"             
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66 6b        0.test_efk
b9f0: 65 79 5f 32 39 20 20 33 20 22 44 45 4c 45 54 45  ey_29  3 "DELETE
ba00: 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45   FROM parent WHE
ba10: 52 45 20 78 20 3d 20 27 61 27 22 20 20 20 20 20  RE x = 'a'"     
ba20: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
ba30: 32 39 20 20 34 20 22 44 45 4c 45 54 45 20 46 52  29  4 "DELETE FR
ba40: 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45 20  OM parent WHERE 
ba50: 78 20 3d 20 27 64 27 22 20 20 20 20 20 20 20 20  x = 'd'"        
ba60: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
ba70: 20 35 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20   5 "DELETE FROM 
ba80: 70 61 72 65 6e 74 20 57 48 45 52 45 20 78 20 3d  parent WHERE x =
ba90: 20 27 67 27 22 20 20 20 20 20 20 20 20 31 0a 74   'g'"        1.t
baa0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 36 20  est_efkey_29  6 
bab0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72  "DELETE FROM par
bac0: 65 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6a  ent WHERE x = 'j
bad0: 27 22 20 20 20 20 20 20 20 20 31 0a 74 65 73 74  '"        1.test
bae0: 5f 65 66 6b 65 79 5f 32 39 20 20 37 20 22 44 45  _efkey_29  7 "DE
baf0: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
bb00: 20 57 48 45 52 45 20 78 20 3d 20 27 6d 27 22 20   WHERE x = 'm'" 
bb10: 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66         1.test_ef
bb20: 6b 65 79 5f 32 39 20 20 38 20 22 44 45 4c 45 54  key_29  8 "DELET
bb30: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
bb40: 45 52 45 20 78 20 3d 20 27 70 27 22 20 20 20 20  ERE x = 'p'"    
bb50: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
bb60: 5f 32 39 20 20 39 20 22 44 45 4c 45 54 45 20 46  _29  9 "DELETE F
bb70: 52 4f 4d 20 70 61 72 65 6e 74 20 57 48 45 52 45  ROM parent WHERE
bb80: 20 78 20 3d 20 27 73 27 22 20 20 20 20 20 20 20   x = 's'"       
bb90: 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   0.test_efkey_29
bba0: 20 31 30 20 22 43 4f 4d 4d 49 54 22 20 20 20 20   10 "COMMIT"    
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
bbd0: 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 31  test_efkey_29 11
bbe0: 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20   "ROLLBACK"     
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 20 20 20 20 20 30 0a 0a 74 65             0..te
bc10: 73 74 5f 65 66 6b 65 79 5f 32 39 20 20 39 20 22  st_efkey_29  9 "
bc20: 42 45 47 49 4e 22 20 20 20 20 20 20 20 20 20 20  BEGIN"          
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f           0.test_
bc50: 65 66 6b 65 79 5f 32 39 20 31 30 20 22 55 50 44  efkey_29 10 "UPD
bc60: 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a  ATE parent SET z
bc70: 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d   = 'z' WHERE z =
bc80: 20 27 63 27 22 20 31 0a 74 65 73 74 5f 65 66 6b   'c'" 1.test_efk
bc90: 65 79 5f 32 39 20 31 31 20 22 55 50 44 41 54 45  ey_29 11 "UPDATE
bca0: 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d 20   parent SET z = 
bcb0: 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27 66  'z' WHERE z = 'f
bcc0: 27 22 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f  '" 1.test_efkey_
bcd0: 32 39 20 31 32 20 22 55 50 44 41 54 45 20 70 61  29 12 "UPDATE pa
bce0: 72 65 6e 74 20 53 45 54 20 7a 20 3d 20 27 7a 27  rent SET z = 'z'
bcf0: 20 57 48 45 52 45 20 7a 20 3d 20 27 69 27 22 20   WHERE z = 'i'" 
bd00: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bd10: 31 33 20 22 55 50 44 41 54 45 20 70 61 72 65 6e  13 "UPDATE paren
bd20: 74 20 53 45 54 20 7a 20 3d 20 27 7a 27 20 57 48  t SET z = 'z' WH
bd30: 45 52 45 20 7a 20 3d 20 27 6c 27 22 20 31 0a 74  ERE z = 'l'" 1.t
bd40: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 34 20  est_efkey_29 14 
bd50: 22 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53  "UPDATE parent S
bd60: 45 54 20 7a 20 3d 20 27 7a 27 20 57 48 45 52 45  ET z = 'z' WHERE
bd70: 20 7a 20 3d 20 27 6f 27 22 20 31 0a 74 65 73 74   z = 'o'" 1.test
bd80: 5f 65 66 6b 65 79 5f 32 39 20 31 35 20 22 55 50  _efkey_29 15 "UP
bd90: 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54 20  DATE parent SET 
bda0: 7a 20 3d 20 27 7a 27 20 57 48 45 52 45 20 7a 20  z = 'z' WHERE z 
bdb0: 3d 20 27 72 27 22 20 31 0a 74 65 73 74 5f 65 66  = 'r'" 1.test_ef
bdc0: 6b 65 79 5f 32 39 20 31 36 20 22 55 50 44 41 54  key_29 16 "UPDAT
bdd0: 45 20 70 61 72 65 6e 74 20 53 45 54 20 7a 20 3d  E parent SET z =
bde0: 20 27 7a 27 20 57 48 45 52 45 20 7a 20 3d 20 27   'z' WHERE z = '
bdf0: 75 27 22 20 30 0a 74 65 73 74 5f 65 66 6b 65 79  u'" 0.test_efkey
be00: 5f 32 39 20 31 37 20 22 43 4f 4d 4d 49 54 22 20  _29 17 "COMMIT" 
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   1.test_efkey_29
be40: 20 31 38 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20   18 "ROLLBACK"  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
be70: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 31  .test_efkey_29 1
be80: 37 20 22 42 45 47 49 4e 22 20 20 20 20 20 20 20  7 "BEGIN"       
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74 65              0.te
beb0: 73 74 5f 65 66 6b 65 79 5f 32 39 20 31 38 20 22  st_efkey_29 18 "
bec0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
bed0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20  ALUES(1, 2, 3)" 
bee0: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
bef0: 65 66 6b 65 79 5f 32 39 20 31 39 20 22 49 4e 53  efkey_29 19 "INS
bf00: 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55  ERT INTO c2 VALU
bf10: 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20  ES(1, 2, 3)"    
bf20: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
bf30: 65 79 5f 32 39 20 32 30 20 22 49 4e 53 45 52 54  ey_29 20 "INSERT
bf40: 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28   INTO c3 VALUES(
bf50: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
bf60: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
bf70: 32 39 20 32 31 20 22 49 4e 53 45 52 54 20 49 4e  29 21 "INSERT IN
bf80: 54 4f 20 63 34 20 56 41 4c 55 45 53 28 31 2c 20  TO c4 VALUES(1, 
bf90: 32 2c 20 33 29 22 20 20 20 20 20 20 20 20 20 20  2, 3)"          
bfa0: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
bfb0: 32 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  22 "INSERT INTO 
bfc0: 63 35 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c5 VALUES(1, 2, 
bfd0: 33 29 22 20 20 20 20 20 20 20 20 20 20 31 0a 74  3)"          1.t
bfe0: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 32 20  est_efkey_29 22 
bff0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 36 20  "INSERT INTO c6 
c000: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 22  VALUES(1, 2, 3)"
c010: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c020: 5f 65 66 6b 65 79 5f 32 39 20 32 32 20 22 49 4e  _efkey_29 22 "IN
c030: 53 45 52 54 20 49 4e 54 4f 20 63 37 20 56 41 4c  SERT INTO c7 VAL
c040: 55 45 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20  UES(1, 2, 3)"   
c050: 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66         0.test_ef
c060: 6b 65 79 5f 32 39 20 32 33 20 22 43 4f 4d 4d 49  key_29 23 "COMMI
c070: 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T"              
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c0a0: 5f 32 39 20 32 34 20 22 49 4e 53 45 52 54 20 49  _29 24 "INSERT I
c0b0: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
c0c0: 53 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  S(1, 2, 3)"     
c0d0: 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39   0.test_efkey_29
c0e0: 20 32 35 20 22 43 4f 4d 4d 49 54 22 20 20 20 20   25 "COMMIT"    
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
c110: 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 32  .test_efkey_29 2
c120: 36 20 22 42 45 47 49 4e 22 20 20 20 20 20 20 20  6 "BEGIN"       
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 74 65              0.te
c150: 73 74 5f 65 66 6b 65 79 5f 32 39 20 32 37 20 22  st_efkey_29 27 "
c160: 55 50 44 41 54 45 20 63 31 20 53 45 54 20 61 20  UPDATE c1 SET a 
c170: 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20 20  = 10"           
c180: 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74 5f           1.test_
c190: 65 66 6b 65 79 5f 32 39 20 32 38 20 22 55 50 44  efkey_29 28 "UPD
c1a0: 41 54 45 20 63 32 20 53 45 54 20 61 20 3d 20 31  ATE c2 SET a = 1
c1b0: 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
c1c0: 20 20 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b        1.test_efk
c1d0: 65 79 5f 32 39 20 32 39 20 22 55 50 44 41 54 45  ey_29 29 "UPDATE
c1e0: 20 63 33 20 53 45 54 20 61 20 3d 20 31 30 22 20   c3 SET a = 10" 
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f     1.test_efkey_
c210: 32 39 20 33 30 20 22 55 50 44 41 54 45 20 63 34  29 30 "UPDATE c4
c220: 20 53 45 54 20 61 20 3d 20 31 30 22 20 20 20 20   SET a = 10"    
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 31 0a 74 65 73 74 5f 65 66 6b 65 79 5f 32 39 20  1.test_efkey_29 
c250: 33 31 20 22 55 50 44 41 54 45 20 63 35 20 53 45  31 "UPDATE c5 SE
c260: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 74               1.t
c280: 65 73 74 5f 65 66 6b 65 79 5f 32 39 20 33 31 20  est_efkey_29 31 
c290: 22 55 50 44 41 54 45 20 63 36 20 53 45 54 20 61  "UPDATE c6 SET a
c2a0: 20 3d 20 31 30 22 20 20 20 20 20 20 20 20 20 20   = 10"          
c2b0: 20 20 20 20 20 20 20 20 20 20 31 0a 74 65 73 74            1.test
c2c0: 5f 65 66 6b 65 79 5f 32 39 20 33 31 20 22 55 50  _efkey_29 31 "UP
c2d0: 44 41 54 45 20 63 37 20 53 45 54 20 61 20 3d 20  DATE c7 SET a = 
c2e0: 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20  10"             
c2f0: 20 20 20 20 20 20 20 30 0a 74 65 73 74 5f 65 66         0.test_ef
c300: 6b 65 79 5f 32 39 20 33 32 20 22 43 4f 4d 4d 49  key_29 32 "COMMI
c310: 54 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T"              
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 31 0a 74 65 73 74 5f 65 66 6b 65 79      1.test_efkey
c340: 5f 32 39 20 33 33 20 22 52 4f 4c 4c 42 41 43 4b  _29 33 "ROLLBACK
c350: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   0..#-----------
c380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
c3c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c3d0: 32 34 34 39 39 2d 35 37 30 37 31 0a 23 0a 23 20  24499-57071.#.# 
c3e0: 54 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20  Test an example 
c3f0: 66 72 6f 6d 20 66 6f 72 65 69 67 6e 6b 65 79 73  from foreignkeys
c400: 2e 68 74 6d 6c 20 64 65 61 6c 69 6e 67 20 77 69  .html dealing wi
c410: 74 68 20 61 20 64 65 66 65 72 72 65 64 20 66 6f  th a deferred fo
c420: 72 65 69 67 6e 20 0a 23 20 6b 65 79 20 63 6f 6e  reign .# key con
c430: 73 74 72 61 69 6e 74 2e 0a 23 0a 64 6f 5f 74 65  straint..#.do_te
c440: 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e 31 20 7b  st e_fkey-35.1 {
c450: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
c460: 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  es.  execsql {. 
c470: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c480: 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
c490: 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
c4a0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
c4b0: 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
c4c0: 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
c4d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c4e0: 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
c4f0: 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
c500: 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
c510: 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
c520: 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
c530: 47 45 52 20 52 45 46 45 52 45 4e 43 45 53 20 61  GER REFERENCES a
c540: 72 74 69 73 74 28 61 72 74 69 73 74 69 64 29 20  rtist(artistid) 
c550: 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
c560: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20  ALLY DEFERRED.  
c570: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
c580: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 35 2e  _test e_fkey-35.
c590: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
c5a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
c5b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61   INSERT INTO tra
c5c0: 63 6b 20 56 41 4c 55 45 53 28 31 2c 20 27 57 68  ck VALUES(1, 'Wh
c5d0: 69 74 65 20 43 68 72 69 73 74 6d 61 73 27 2c 20  ite Christmas', 
c5e0: 35 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  5);.  }.  catchs
c5f0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
c600: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
c610: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
c620: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33  do_test e_fkey-3
c630: 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.3 {.  execsql 
c640: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
c650: 4f 20 61 72 74 69 73 74 20 56 41 4c 55 45 53 28  O artist VALUES(
c660: 35 2c 20 27 42 69 6e 67 20 43 72 6f 73 62 79 27  5, 'Bing Crosby'
c670: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
c680: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61  ---.# Verify tha
c6e0: 74 20 61 20 6e 65 73 74 65 64 20 73 61 76 65 70  t a nested savep
c6f0: 6f 69 6e 74 20 6d 61 79 20 62 65 20 72 65 6c 65  oint may be rele
c700: 61 73 65 64 20 77 69 74 68 6f 75 74 20 73 61 74  ased without sat
c710: 69 73 66 79 69 6e 67 20 0a 23 20 64 65 66 65 72  isfying .# defer
c720: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
c730: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23  constraints..#.#
c740: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c750: 30 37 32 32 33 2d 34 38 33 32 33 20 41 20 6e 65  07223-48323 A ne
c760: 73 74 65 64 20 73 61 76 65 70 6f 69 6e 74 20 74  sted savepoint t
c770: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
c780: 65 0a 23 20 52 45 4c 45 41 53 45 64 20 77 68 69  e.# RELEASEd whi
c790: 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
c7a0: 69 73 20 69 6e 20 61 20 73 74 61 74 65 20 74 68  is in a state th
c7b0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  at does not sati
c7c0: 73 66 79 20 61 0a 23 20 64 65 66 65 72 72 65 64  sfy a.# deferred
c7d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
c7e0: 73 74 72 61 69 6e 74 2e 0a 23 0a 64 72 6f 70 5f  straint..#.drop_
c7f0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
c800: 73 74 20 65 5f 66 6b 65 79 2d 33 36 2e 31 20 7b  st e_fkey-36.1 {
c810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
c820: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c830: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  (a PRIMARY KEY,.
c840: 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e 43        b REFERENC
c850: 45 53 20 74 31 20 44 45 46 45 52 52 41 42 4c 45  ES t1 DEFERRABLE
c860: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
c870: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 49  RED.    );.    I
c880: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
c890: 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 20 20  LUES(1, 1);.    
c8a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
c8b0: 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a 20 20 20  ALUES(2, 2);.   
c8c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c8d0: 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a 20 20  VALUES(3, 3);.  
c8e0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
c8f0: 5f 66 6b 65 79 2d 33 36 2e 32 20 7b 0a 20 20 65  _fkey-36.2 {.  e
c900: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
c910: 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  IN;.      SAVEPO
c920: 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20  INT one;.       
c930: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c940: 56 41 4c 55 45 53 28 34 2c 20 35 29 3b 0a 20 20  VALUES(4, 5);.  
c950: 20 20 20 20 52 45 4c 45 41 53 45 20 6f 6e 65 3b      RELEASE one;
c960: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
c970: 74 20 65 5f 66 6b 65 79 2d 33 36 2e 33 20 7b 0a  t e_fkey-36.3 {.
c980: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
c990: 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  T.} {1 {foreign 
c9a0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
c9b0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
c9c0: 65 5f 66 6b 65 79 2d 33 36 2e 34 20 7b 0a 20 20  e_fkey-36.4 {.  
c9d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
c9e0: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
c9f0: 35 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20  5 WHERE a = 4;. 
ca00: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
ca10: 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}...#---------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca60: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 61 20  .# Check that a 
ca70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
ca80: 70 6f 69 6e 74 20 28 61 6e 20 6f 75 74 65 72 6d  point (an outerm
ca90: 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 20 6f 70  ost savepoint op
caa0: 65 6e 65 64 20 77 68 65 6e 0a 23 20 74 68 65 20  ened when.# the 
cab0: 64 61 74 61 62 61 73 65 20 77 61 73 20 69 6e 20  database was in 
cac0: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
cad0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 6c 65  ) cannot be rele
cae0: 61 73 65 64 20 77 69 74 68 6f 75 74 0a 23 20 73  ased without.# s
caf0: 61 74 69 73 66 79 69 6e 67 20 64 65 66 65 72 72  atisfying deferr
cb00: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
cb10: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 74 20 6d  onstraints. It m
cb20: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
cb30: 6b 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  k..#.# EVIDENCE-
cb40: 4f 46 3a 20 52 2d 34 34 32 39 35 2d 31 33 38 32  OF: R-44295-1382
cb50: 33 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  3 A transaction 
cb60: 73 61 76 65 70 6f 69 6e 74 20 28 61 20 6e 6f 6e  savepoint (a non
cb70: 2d 6e 65 73 74 65 64 0a 23 20 73 61 76 65 70 6f  -nested.# savepo
cb80: 69 6e 74 20 74 68 61 74 20 77 61 73 20 6f 70 65  int that was ope
cb90: 6e 65 64 20 77 68 69 6c 65 20 74 68 65 72 65 20  ned while there 
cba0: 77 61 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  was not currentl
cbb0: 79 20 61 6e 20 6f 70 65 6e 0a 23 20 74 72 61 6e  y an open.# tran
cbc0: 73 61 63 74 69 6f 6e 29 2c 20 6f 6e 20 74 68 65  saction), on the
cbd0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 73 20   other hand, is 
cbe0: 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 73  subject to the s
cbf0: 61 6d 65 20 72 65 73 74 72 69 63 74 69 6f 6e 73  ame restrictions
cc00: 0a 23 20 61 73 20 61 20 43 4f 4d 4d 49 54 20 2d  .# as a COMMIT -
cc10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 52   attempting to R
cc20: 45 4c 45 41 53 45 20 69 74 20 77 68 69 6c 65 20  ELEASE it while 
cc30: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
cc40: 69 6e 20 73 75 63 68 20 61 0a 23 20 73 74 61 74  in such a.# stat
cc50: 65 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 23 0a 64  e will fail..#.d
cc60: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37  o_test e_fkey-37
cc70: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
cc80: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f  .    SAVEPOINT o
cc90: 6e 65 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ne;.      SAVEPO
cca0: 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20 20 20 20  INT two;.       
ccb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ccc0: 56 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20 20  VALUES(6, 7);.  
ccd0: 20 20 20 20 52 45 4c 45 41 53 45 20 74 77 6f 3b      RELEASE two;
cce0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
ccf0: 74 20 65 5f 66 6b 65 79 2d 33 37 2e 32 20 7b 0a  t e_fkey-37.2 {.
cd00: 20 20 63 61 74 63 68 73 71 6c 20 7b 52 45 4c 45    catchsql {RELE
cd10: 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b 31 20 7b 66  ASE one}.} {1 {f
cd20: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
cd30: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
cd40: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37  o_test e_fkey-37
cd50: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
cd60: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
cd70: 20 53 45 54 20 61 20 3d 20 37 20 57 48 45 52 45   SET a = 7 WHERE
cd80: 20 61 20 3d 20 36 3b 0a 20 20 20 20 52 45 4c 45   a = 6;.    RELE
cd90: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 0a 7d 20 7b  ASE one;.  }.} {
cda0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
cdb0: 2d 33 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -37.4 {.  execsq
cdc0: 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  l {.    SAVEPOIN
cdd0: 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 53 41 56  T one;.      SAV
cde0: 45 50 4f 49 4e 54 20 74 77 6f 3b 0a 20 20 20 20  EPOINT two;.    
cdf0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ce00: 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29  t1 VALUES(9, 10)
ce10: 3b 0a 20 20 20 20 20 20 52 45 4c 45 41 53 45 20  ;.      RELEASE 
ce20: 74 77 6f 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  two;.  }.} {}.do
ce30: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 37 2e  _test e_fkey-37.
ce40: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
ce50: 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20 7b  RELEASE one}.} {
ce60: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
ce70: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
ce80: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
ce90: 79 2d 33 37 2e 36 20 7b 0a 20 20 65 78 65 63 73  y-37.6 {.  execs
cea0: 71 6c 20 7b 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  ql {ROLLBACK TO 
ceb0: 6f 6e 65 20 3b 20 52 45 4c 45 41 53 45 20 6f 6e  one ; RELEASE on
cec0: 65 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  e}.} {}..#------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
cf20: 69 66 20 61 20 43 4f 4d 4d 49 54 20 6f 70 65 72  if a COMMIT oper
cf30: 61 74 69 6f 6e 20 66 61 69 6c 73 20 64 75 65 20  ation fails due 
cf40: 74 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  to deferred fore
cf50: 69 67 6e 20 6b 65 79 20 0a 23 20 63 6f 6e 73 74  ign key .# const
cf60: 72 61 69 6e 74 73 2c 20 61 6e 79 20 6e 65 73 74  raints, any nest
cf70: 65 64 20 73 61 76 65 70 6f 69 6e 74 73 20 72 65  ed savepoints re
cf80: 6d 61 69 6e 20 6f 70 65 6e 2e 0a 23 0a 23 20 45  main open..#.# E
cf90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
cfa0: 37 33 36 2d 34 32 36 31 36 20 49 66 20 61 20 43  736-42616 If a C
cfb0: 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 20  OMMIT statement 
cfc0: 28 6f 72 20 74 68 65 20 52 45 4c 45 41 53 45 20  (or the RELEASE 
cfd0: 6f 66 20 61 0a 23 20 74 72 61 6e 73 61 63 74 69  of a.# transacti
cfe0: 6f 6e 20 53 41 56 45 50 4f 49 4e 54 29 20 66 61  on SAVEPOINT) fa
cff0: 69 6c 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ils because the 
d000: 64 61 74 61 62 61 73 65 20 69 73 20 63 75 72 72  database is curr
d010: 65 6e 74 6c 79 20 69 6e 20 61 0a 23 20 73 74 61  ently in a.# sta
d020: 74 65 20 74 68 61 74 20 76 69 6f 6c 61 74 65 73  te that violates
d030: 20 61 20 64 65 66 65 72 72 65 64 20 66 6f 72 65   a deferred fore
d040: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
d050: 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
d060: 0a 23 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 73  .# currently nes
d070: 74 65 64 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ted savepoints, 
d080: 74 68 65 20 6e 65 73 74 65 64 20 73 61 76 65 70  the nested savep
d090: 6f 69 6e 74 73 20 72 65 6d 61 69 6e 20 6f 70 65  oints remain ope
d0a0: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66  n..#.do_test e_f
d0b0: 6b 65 79 2d 33 38 2e 31 20 7b 0a 20 20 65 78 65  key-38.1 {.  exe
d0c0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
d0d0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
d0e0: 61 3e 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  a>3;.    SELECT 
d0f0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
d100: 20 7b 31 20 31 20 32 20 32 20 33 20 33 7d 0a 64   {1 1 2 2 3 3}.d
d110: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d120: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
d130: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
d140: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
d150: 20 56 41 4c 55 45 53 28 34 2c 20 34 29 3b 0a 20   VALUES(4, 4);. 
d160: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
d170: 6e 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ne;.        INSE
d180: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d190: 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 20 20 20  S(5, 6);.       
d1a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
d1b0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32 20  1;.  }.} {1 1 2 
d1c0: 32 20 33 20 33 20 34 20 34 20 35 20 36 7d 0a 64  2 3 3 4 4 5 6}.d
d1d0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d1e0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
d1f0: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72  COMMIT.} {1 {for
d200: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
d210: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
d220: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38 2e 34  test e_fkey-38.4
d230: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
d240: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
d250: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
d260: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
d270: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31  M t1;.  }.} {1 1
d280: 20 32 20 32 20 33 20 33 20 34 20 34 7d 0a 0a 64   2 2 3 3 4 4}..d
d290: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 38  o_test e_fkey-38
d2a0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
d2b0: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61  .    SAVEPOINT a
d2c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
d2d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
d2e0: 20 35 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50   5);.      SAVEP
d2f0: 4f 49 4e 54 20 62 3b 0a 20 20 20 20 20 20 20 20  OINT b;.        
d300: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
d310: 41 4c 55 45 53 28 36 2c 20 37 29 3b 0a 20 20 20  ALUES(6, 7);.   
d320: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 63       SAVEPOINT c
d330: 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  ;.          INSE
d340: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d350: 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 7d 20 7b  S(7, 8);.  }.} {
d360: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
d370: 2d 33 38 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  -38.6 {.  catchs
d380: 71 6c 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a 7d  ql {RELEASE a}.}
d390: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
d3a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
d3b0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  ed}}.do_test e_f
d3c0: 6b 65 79 2d 33 38 2e 37 20 7b 0a 20 20 65 78 65  key-38.7 {.  exe
d3d0: 63 73 71 6c 20 20 7b 52 4f 4c 4c 42 41 43 4b 20  csql  {ROLLBACK 
d3e0: 54 4f 20 63 7d 0a 20 20 63 61 74 63 68 73 71 6c  TO c}.  catchsql
d3f0: 20 7b 52 45 4c 45 41 53 45 20 61 7d 0a 7d 20 7b   {RELEASE a}.} {
d400: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
d410: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d420: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
d430: 79 2d 33 38 2e 38 20 7b 0a 20 20 65 78 65 63 73  y-38.8 {.  execs
d440: 71 6c 20 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41  ql  {.    ROLLBA
d450: 43 4b 20 54 4f 20 62 3b 0a 20 20 20 20 52 45 4c  CK TO b;.    REL
d460: 45 41 53 45 20 61 3b 0a 20 20 20 20 53 45 4c 45  EASE a;.    SELE
d470: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
d480: 7d 0a 7d 20 7b 31 20 31 20 32 20 32 20 33 20 33  }.} {1 1 2 2 3 3
d490: 20 34 20 34 20 35 20 35 7d 0a 0a 23 23 23 23 23   4 4 5 5}..#####
d4a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d4e0: 23 23 23 23 23 23 0a 23 23 23 20 53 45 43 54 49  ######.### SECTI
d4f0: 4f 4e 20 34 2e 33 3a 20 4f 4e 20 44 45 4c 45 54  ON 4.3: ON DELET
d500: 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
d510: 41 63 74 69 6f 6e 73 0a 23 23 23 23 23 23 23 23  Actions.########
d520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d560: 23 23 23 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ###..#----------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d5b0: 23 20 54 65 73 74 20 74 68 61 74 20 63 6f 6e 66  # Test that conf
d5c0: 69 67 75 72 65 64 20 4f 4e 20 44 45 4c 45 54 45  igured ON DELETE
d5d0: 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20 61   and ON UPDATE a
d5e0: 63 74 69 6f 6e 73 20 74 61 6b 65 20 70 6c 61 63  ctions take plac
d5f0: 65 20 77 68 65 6e 0a 23 20 64 65 6c 65 74 69 6e  e when.# deletin
d600: 67 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 72  g or modifying r
d610: 6f 77 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ows of the paren
d620: 74 20 74 61 62 6c 65 2c 20 72 65 73 70 65 63 74  t table, respect
d630: 69 76 65 6c 79 2e 0a 23 0a 23 20 45 56 49 44 45  ively..#.# EVIDE
d640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 32 37 30 2d  NCE-OF: R-48270-
d650: 34 34 32 38 32 20 46 6f 72 65 69 67 6e 20 6b 65  44282 Foreign ke
d660: 79 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20  y ON DELETE and 
d670: 4f 4e 20 55 50 44 41 54 45 20 63 6c 61 75 73 65  ON UPDATE clause
d680: 73 0a 23 20 61 72 65 20 75 73 65 64 20 74 6f 20  s.# are used to 
d690: 63 6f 6e 66 69 67 75 72 65 20 61 63 74 69 6f 6e  configure action
d6a0: 73 20 74 68 61 74 20 74 61 6b 65 20 70 6c 61 63  s that take plac
d6b0: 65 20 77 68 65 6e 20 64 65 6c 65 74 69 6e 67 20  e when deleting 
d6c0: 72 6f 77 73 20 66 72 6f 6d 0a 23 20 74 68 65 20  rows from.# the 
d6d0: 70 61 72 65 6e 74 20 74 61 62 6c 65 20 28 4f 4e  parent table (ON
d6e0: 20 44 45 4c 45 54 45 29 2c 20 6f 72 20 6d 6f 64   DELETE), or mod
d6f0: 69 66 79 69 6e 67 20 74 68 65 20 70 61 72 65 6e  ifying the paren
d700: 74 20 6b 65 79 20 76 61 6c 75 65 73 20 6f 66 0a  t key values of.
d710: 23 20 65 78 69 73 74 69 6e 67 20 72 6f 77 73 20  # existing rows 
d720: 28 4f 4e 20 55 50 44 41 54 45 29 2e 0a 23 0a 23  (ON UPDATE)..#.#
d730: 20 54 65 73 74 20 74 68 61 74 20 61 20 73 69 6e   Test that a sin
d740: 67 6c 65 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  gle FK constrain
d750: 74 20 6d 61 79 20 68 61 76 65 20 64 69 66 66 65  t may have diffe
d760: 72 65 6e 74 20 61 63 74 69 6f 6e 73 20 63 6f 6e  rent actions con
d770: 66 69 67 75 72 65 64 0a 23 20 66 6f 72 20 4f 4e  figured.# for ON
d780: 20 44 45 4c 45 54 45 20 61 6e 64 20 4f 4e 20 55   DELETE and ON U
d790: 50 44 41 54 45 2e 0a 23 0a 23 20 45 56 49 44 45  PDATE..#.# EVIDE
d7a0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 31 32 34 2d  NCE-OF: R-48124-
d7b0: 36 33 32 32 35 20 41 20 73 69 6e 67 6c 65 20 66  63225 A single f
d7c0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
d7d0: 72 61 69 6e 74 20 6d 61 79 20 68 61 76 65 0a 23  raint may have.#
d7e0: 20 64 69 66 66 65 72 65 6e 74 20 61 63 74 69 6f   different actio
d7f0: 6e 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ns configured fo
d800: 72 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e 64 20  r ON DELETE and 
d810: 4f 4e 20 55 50 44 41 54 45 2e 0a 23 0a 64 6f 5f  ON UPDATE..#.do_
d820: 74 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 31  test e_fkey-39.1
d830: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
d840: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d850: 70 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b  p(a, b PRIMARY K
d860: 45 59 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41  EY, c);.    CREA
d870: 54 45 20 54 41 42 4c 45 20 63 31 28 64 2c 20 65  TE TABLE c1(d, e
d880: 2c 20 66 20 44 45 46 41 55 4c 54 20 27 6b 30 27  , f DEFAULT 'k0'
d890: 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 0a 20   REFERENCES p . 
d8a0: 20 20 20 20 20 4f 4e 20 55 50 44 41 54 45 20 53       ON UPDATE S
d8b0: 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 20  ET DEFAULT.     
d8c0: 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e   ON DELETE SET N
d8d0: 55 4c 4c 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  ULL.    );..    
d8e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
d8f0: 4c 55 45 53 28 30 2c 20 27 6b 30 27 2c 20 27 27  LUES(0, 'k0', ''
d900: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d910: 54 4f 20 70 20 56 41 4c 55 45 53 28 31 2c 20 27  TO p VALUES(1, '
d920: 6b 31 27 2c 20 27 49 27 29 3b 0a 20 20 20 20 49  k1', 'I');.    I
d930: 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c  NSERT INTO p VAL
d940: 55 45 53 28 32 2c 20 27 6b 32 27 2c 20 27 49 49  UES(2, 'k2', 'II
d950: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
d960: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 33 2c 20  NTO p VALUES(3, 
d970: 27 6b 33 27 2c 20 27 49 49 49 27 29 3b 0a 0a 20  'k3', 'III');.. 
d980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
d990: 31 20 56 41 4c 55 45 53 28 31 2c 20 27 78 78 27  1 VALUES(1, 'xx'
d9a0: 2c 20 27 6b 31 27 29 3b 0a 20 20 20 20 49 4e 53  , 'k1');.    INS
d9b0: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
d9c0: 45 53 28 32 2c 20 27 78 78 27 2c 20 27 6b 32 27  ES(2, 'xx', 'k2'
d9d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d9e0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 33 2c 20  TO c1 VALUES(3, 
d9f0: 27 78 78 27 2c 20 27 6b 33 27 29 3b 0a 20 20 7d  'xx', 'k3');.  }
da00: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  .} {}.do_test e_
da10: 66 6b 65 79 2d 33 39 2e 32 20 7b 0a 20 20 65 78  fkey-39.2 {.  ex
da20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
da30: 54 45 20 70 20 53 45 54 20 62 20 3d 20 27 6b 34  TE p SET b = 'k4
da40: 27 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  ' WHERE a = 1;. 
da50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
da60: 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78   c1;.  }.} {1 xx
da70: 20 6b 30 20 32 20 78 78 20 6b 32 20 33 20 78 78   k0 2 xx k2 3 xx
da80: 20 6b 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   k3}.do_test e_f
da90: 6b 65 79 2d 33 39 2e 33 20 7b 0a 20 20 65 78 65  key-39.3 {.  exe
daa0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
dab0: 45 20 46 52 4f 4d 20 70 20 57 48 45 52 45 20 61  E FROM p WHERE a
dac0: 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 2;.    SELECT
dad0: 20 2a 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   * FROM c1;.  }.
dae0: 7d 20 7b 31 20 78 78 20 6b 30 20 32 20 78 78 20  } {1 xx k0 2 xx 
daf0: 7b 7d 20 33 20 78 78 20 6b 33 7d 0a 64 6f 5f 74  {} 3 xx k3}.do_t
db00: 65 73 74 20 65 5f 66 6b 65 79 2d 33 39 2e 34 20  est e_fkey-39.4 
db10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
db20: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
db30: 49 4e 44 45 58 20 70 69 20 4f 4e 20 70 28 63 29  INDEX pi ON p(c)
db40: 3b 0a 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e  ;.    REPLACE IN
db50: 54 4f 20 70 20 56 41 4c 55 45 53 28 35 2c 20 27  TO p VALUES(5, '
db60: 6b 35 27 2c 20 27 49 49 49 27 29 3b 0a 20 20 20  k5', 'III');.   
db70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
db80: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 78 20 6b  1;.  }.} {1 xx k
db90: 30 20 32 20 78 78 20 7b 7d 20 33 20 78 78 20 7b  0 2 xx {} 3 xx {
dba0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
dbf0: 20 45 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65   Each foreign ke
dc00: 79 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 20  y in the system 
dc10: 68 61 73 20 61 6e 20 4f 4e 20 55 50 44 41 54 45  has an ON UPDATE
dc20: 20 61 6e 64 20 4f 4e 20 44 45 4c 45 54 45 20 61   and ON DELETE a
dc30: 63 74 69 6f 6e 2c 0a 23 20 65 69 74 68 65 72 20  ction,.# either 
dc40: 22 4e 4f 20 41 43 54 49 4f 4e 22 2c 20 22 52 45  "NO ACTION", "RE
dc50: 53 54 52 49 43 54 22 2c 20 22 53 45 54 20 4e 55  STRICT", "SET NU
dc60: 4c 4c 22 2c 20 22 53 45 54 20 44 45 46 41 55 4c  LL", "SET DEFAUL
dc70: 54 22 20 6f 72 20 22 43 41 53 43 41 44 45 22 2e  T" or "CASCADE".
dc80: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
dc90: 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20  : R-33326-45252 
dca0: 54 68 65 20 4f 4e 20 44 45 4c 45 54 45 20 61 6e  The ON DELETE an
dcb0: 64 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  d ON UPDATE acti
dcc0: 6f 6e 0a 23 20 61 73 73 6f 63 69 61 74 65 64 20  on.# associated 
dcd0: 77 69 74 68 20 65 61 63 68 20 66 6f 72 65 69 67  with each foreig
dce0: 6e 20 6b 65 79 20 69 6e 20 61 6e 20 53 51 4c 69  n key in an SQLi
dcf0: 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  te database is o
dd00: 6e 65 20 6f 66 20 22 4e 4f 0a 23 20 41 43 54 49  ne of "NO.# ACTI
dd10: 4f 4e 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c  ON", "RESTRICT",
dd20: 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 22 53 45   "SET NULL", "SE
dd30: 54 20 44 45 46 41 55 4c 54 22 20 6f 72 20 22 43  T DEFAULT" or "C
dd40: 41 53 43 41 44 45 22 2e 0a 23 0a 23 20 49 66 20  ASCADE"..#.# If 
dd50: 6e 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69 65  none is specifie
dd60: 64 20 65 78 70 6c 69 63 69 74 6c 79 2c 20 22 4e  d explicitly, "N
dd70: 4f 20 41 43 54 49 4f 4e 22 20 69 73 20 74 68 65  O ACTION" is the
dd80: 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56   default..#.# EV
dd90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38  IDENCE-OF: R-198
dda0: 30 33 2d 34 35 38 38 34 20 49 66 20 61 6e 20 61  03-45884 If an a
ddb0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65 78 70  ction is not exp
ddc0: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
ddd0: 64 2c 0a 23 20 69 74 20 64 65 66 61 75 6c 74 73  d,.# it defaults
dde0: 20 74 6f 20 22 4e 4f 20 41 43 54 49 4f 4e 22 2e   to "NO ACTION".
ddf0: 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  .# .drop_all_tab
de00: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
de10: 65 79 2d 34 30 2e 31 20 7b 0a 20 20 65 78 65 63  ey-40.1 {.  exec
de20: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
de30: 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28 78 20   TABLE parent(x 
de40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
de50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
de60: 45 20 63 68 69 6c 64 31 28 61 2c 20 0a 20 20 20  E child1(a, .   
de70: 20 20 20 62 20 52 45 46 45 52 45 4e 43 45 53 20     b REFERENCES 
de80: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
de90: 20 4e 4f 20 41 43 54 49 4f 4e 20 4f 4e 20 44 45   NO ACTION ON DE
dea0: 4c 45 54 45 20 52 45 53 54 52 49 43 54 0a 20 20  LETE RESTRICT.  
deb0: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
dec0: 54 41 42 4c 45 20 63 68 69 6c 64 32 28 61 2c 20  TABLE child2(a, 
ded0: 0a 20 20 20 20 20 20 62 20 52 45 46 45 52 45 4e  .      b REFEREN
dee0: 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50  CES parent ON UP
def0: 44 41 54 45 20 52 45 53 54 52 49 43 54 20 4f 4e  DATE RESTRICT ON
df00: 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
df10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
df20: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 33 28  TE TABLE child3(
df30: 61 2c 20 0a 20 20 20 20 20 20 62 20 52 45 46 45  a, .      b REFE
df40: 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e  RENCES parent ON
df50: 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c   UPDATE SET NULL
df60: 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44   ON DELETE SET D
df70: 45 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20  EFAULT.    );.  
df80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
df90: 68 69 6c 64 34 28 61 2c 20 0a 20 20 20 20 20 20  hild4(a, .      
dfa0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  b REFERENCES par
dfb0: 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
dfc0: 54 20 44 45 46 41 55 4c 54 20 4f 4e 20 44 45 4c  T DEFAULT ON DEL
dfd0: 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20  ETE CASCADE.    
dfe0: 29 3b 0a 0a 20 20 20 20 2d 2d 20 43 72 65 61 74  );..    -- Creat
dff0: 65 20 73 6f 6d 65 20 66 6f 72 65 69 67 6e 20 6b  e some foreign k
e000: 65 79 73 20 74 68 61 74 20 75 73 65 20 74 68 65  eys that use the
e010: 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   default action 
e020: 2d 20 22 4e 4f 20 41 43 54 49 4f 4e 22 0a 20 20  - "NO ACTION".  
e030: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
e040: 68 69 6c 64 35 28 61 2c 20 62 20 52 45 46 45 52  hild5(a, b REFER
e050: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
e060: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
e070: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e080: 45 20 63 68 69 6c 64 36 28 61 2c 20 62 20 52 45  E child6(a, b RE
e090: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
e0a0: 4f 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49  ON DELETE RESTRI
e0b0: 43 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  CT);.    CREATE 
e0c0: 54 41 42 4c 45 20 63 68 69 6c 64 37 28 61 2c 20  TABLE child7(a, 
e0d0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  b REFERENCES par
e0e0: 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f  ent ON DELETE NO
e0f0: 20 41 43 54 49 4f 4e 29 3b 0a 20 20 20 20 43 52   ACTION);.    CR
e100: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
e110: 38 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  8(a, b REFERENCE
e120: 53 20 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41  S parent ON UPDA
e130: 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 20  TE NO ACTION);. 
e140: 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68   }.} {}..foreach
e150: 20 7b 74 6e 20 7a 54 61 62 20 6c 52 65 73 7d 20   {tn zTab lRes} 
e160: 7b 0a 20 20 32 20 63 68 69 6c 64 31 20 7b 30 20  {.  2 child1 {0 
e170: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e  0 parent b {} {N
e180: 4f 20 41 43 54 49 4f 4e 7d 20 52 45 53 54 52 49  O ACTION} RESTRI
e190: 43 54 20 4e 4f 4e 45 7d 0a 20 20 33 20 63 68 69  CT NONE}.  3 chi
e1a0: 6c 64 32 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld2 {0 0 parent 
e1b0: 62 20 7b 7d 20 52 45 53 54 52 49 43 54 20 7b 53  b {} RESTRICT {S
e1c0: 45 54 20 4e 55 4c 4c 7d 20 4e 4f 4e 45 7d 0a 20  ET NULL} NONE}. 
e1d0: 20 34 20 63 68 69 6c 64 33 20 7b 30 20 30 20 70   4 child3 {0 0 p
e1e0: 61 72 65 6e 74 20 62 20 7b 7d 20 7b 53 45 54 20  arent b {} {SET 
e1f0: 4e 55 4c 4c 7d 20 7b 53 45 54 20 44 45 46 41 55  NULL} {SET DEFAU
e200: 4c 54 7d 20 4e 4f 4e 45 7d 0a 20 20 35 20 63 68  LT} NONE}.  5 ch
e210: 69 6c 64 34 20 7b 30 20 30 20 70 61 72 65 6e 74  ild4 {0 0 parent
e220: 20 62 20 7b 7d 20 7b 53 45 54 20 44 45 46 41 55   b {} {SET DEFAU
e230: 4c 54 7d 20 43 41 53 43 41 44 45 20 4e 4f 4e 45  LT} CASCADE NONE
e240: 7d 0a 20 20 36 20 63 68 69 6c 64 35 20 7b 30 20  }.  6 child5 {0 
e250: 30 20 70 61 72 65 6e 74 20 62 20 7b 7d 20 43 41  0 parent b {} CA
e260: 53 43 41 44 45 20 7b 4e 4f 20 41 43 54 49 4f 4e  SCADE {NO ACTION
e270: 7d 20 4e 4f 4e 45 7d 0a 20 20 37 20 63 68 69 6c  } NONE}.  7 chil
e280: 64 36 20 7b 30 20 30 20 70 61 72 65 6e 74 20 62  d6 {0 0 parent b
e290: 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20   {} {NO ACTION} 
e2a0: 52 45 53 54 52 49 43 54 20 4e 4f 4e 45 7d 0a 20  RESTRICT NONE}. 
e2b0: 20 38 20 63 68 69 6c 64 37 20 7b 30 20 30 20 70   8 child7 {0 0 p
e2c0: 61 72 65 6e 74 20 62 20 7b 7d 20 7b 4e 4f 20 41  arent b {} {NO A
e2d0: 43 54 49 4f 4e 7d 20 7b 4e 4f 20 41 43 54 49 4f  CTION} {NO ACTIO
e2e0: 4e 7d 20 4e 4f 4e 45 7d 0a 20 20 39 20 63 68 69  N} NONE}.  9 chi
e2f0: 6c 64 38 20 7b 30 20 30 20 70 61 72 65 6e 74 20  ld8 {0 0 parent 
e300: 62 20 7b 7d 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d  b {} {NO ACTION}
e310: 20 7b 4e 4f 20 41 43 54 49 4f 4e 7d 20 4e 4f 4e   {NO ACTION} NON
e320: 45 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  E}.} {.  do_test
e330: 20 65 5f 66 6b 65 79 2d 34 30 2e 24 74 6e 20 7b   e_fkey-40.$tn {
e340: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
e350: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73   foreign_key_lis
e360: 74 28 24 7a 54 61 62 29 22 20 7d 20 24 6c 52 65  t($zTab)" } $lRe
e370: 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.}..#----------
e380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e3c0: 23 20 54 65 73 74 20 74 68 61 74 20 22 4e 4f 20  # Test that "NO 
e3d0: 41 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20 74 68  ACTION" means th
e3e0: 61 74 20 6e 6f 74 68 69 6e 67 20 68 61 70 70 65  at nothing happe
e3f0: 6e 73 20 74 6f 20 61 20 63 68 69 6c 64 20 72 6f  ns to a child ro
e400: 77 20 77 68 65 6e 0a 23 20 69 74 27 73 20 70 61  w when.# it's pa
e410: 72 65 6e 74 20 72 6f 77 20 69 73 20 75 70 64 61  rent row is upda
e420: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ted or deleted..
e430: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
e440: 20 52 2d 31 39 39 37 31 2d 35 34 39 37 36 20 43   R-19971-54976 C
e450: 6f 6e 66 69 67 75 72 69 6e 67 20 22 4e 4f 20 41  onfiguring "NO A
e460: 43 54 49 4f 4e 22 20 6d 65 61 6e 73 20 6a 75 73  CTION" means jus
e470: 74 20 74 68 61 74 3a 0a 23 20 77 68 65 6e 20 61  t that:.# when a
e480: 20 70 61 72 65 6e 74 20 6b 65 79 20 69 73 20 6d   parent key is m
e490: 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74  odified or delet
e4a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
e4b0: 62 61 73 65 2c 20 6e 6f 20 73 70 65 63 69 61 6c  base, no special
e4c0: 0a 23 20 61 63 74 69 6f 6e 20 69 73 20 74 61 6b  .# action is tak
e4d0: 65 6e 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  en..#.drop_all_t
e4e0: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
e4f0: 66 6b 65 79 2d 34 31 2e 31 20 7b 0a 20 20 65 78  fkey-41.1 {.  ex
e500: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
e510: 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74 28  TE TABLE parent(
e520: 70 31 2c 20 70 32 2c 20 50 52 49 4d 41 52 59 20  p1, p2, PRIMARY 
e530: 4b 45 59 28 70 31 2c 20 70 32 29 29 3b 0a 20 20  KEY(p1, p2));.  
e540: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
e550: 68 69 6c 64 28 63 31 2c 20 63 32 2c 20 0a 20 20  hild(c1, c2, .  
e560: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
e570: 63 31 2c 20 63 32 29 20 52 45 46 45 52 45 4e 43  c1, c2) REFERENC
e580: 45 53 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20  ES parent.      
e590: 4f 4e 20 55 50 44 41 54 45 20 4e 4f 20 41 43 54  ON UPDATE NO ACT
e5a0: 49 4f 4e 0a 20 20 20 20 20 20 4f 4e 20 44 45 4c  ION.      ON DEL
e5b0: 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a 20 20  ETE NO ACTION.  
e5c0: 20 20 20 20 44 45 46 45 52 52 41 42 4c 45 20 49      DEFERRABLE I
e5d0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
e5e0: 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  D.    );.    INS
e5f0: 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
e600: 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27 29  VALUES('j', 'k')
e610: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
e620: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
e630: 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 20 20 49  'l', 'm');.    I
e640: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
e650: 20 56 41 4c 55 45 53 28 27 6a 27 2c 20 27 6b 27   VALUES('j', 'k'
e660: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e670: 54 4f 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28  TO child VALUES(
e680: 27 6c 27 2c 20 27 6d 27 29 3b 0a 20 20 7d 0a 7d  'l', 'm');.  }.}
e690: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
e6a0: 65 79 2d 34 31 2e 32 20 7b 0a 20 20 65 78 65 63  ey-41.2 {.  exec
e6b0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
e6c0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 70 61  .      UPDATE pa
e6d0: 72 65 6e 74 20 53 45 54 20 70 31 3d 27 6b 27 20  rent SET p1='k' 
e6e0: 57 48 45 52 45 20 70 31 3d 27 6a 27 3b 0a 20 20  WHERE p1='j';.  
e6f0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
e700: 70 61 72 65 6e 74 20 57 48 45 52 45 20 70 31 3d  parent WHERE p1=
e710: 27 6c 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  'l';.      SELEC
e720: 54 20 2a 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a  T * FROM child;.
e730: 20 20 7d 0a 7d 20 7b 6a 20 6b 20 6c 20 6d 7d 0a    }.} {j k l m}.
e740: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
e750: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
e760: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f   COMMIT.} {1 {fo
e770: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
e780: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
e790: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e  _test e_fkey-41.
e7a0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 52 4f  4 {.  execsql RO
e7b0: 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a 0a 23 2d 2d  LLBACK.} {}..#--
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e800: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
e810: 68 61 74 20 22 52 45 53 54 52 49 43 54 22 20 6d  hat "RESTRICT" m
e820: 65 61 6e 73 20 74 68 65 20 61 70 70 6c 69 63 61  eans the applica
e830: 74 69 6f 6e 20 69 73 20 70 72 6f 68 69 62 69 74  tion is prohibit
e840: 65 64 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  ed from deleting
e850: 0a 23 20 6f 72 20 75 70 64 61 74 69 6e 67 20 61  .# or updating a
e860: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 72 6f   parent table ro
e870: 77 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  w when there exi
e880: 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
e890: 63 68 69 6c 64 20 6b 65 79 73 0a 23 20 6d 61 70  child keys.# map
e8a0: 70 65 64 20 74 6f 20 69 74 2e 0a 23 0a 23 20 45  ped to it..#.# E
e8b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
e8c0: 32 37 32 2d 33 38 36 35 33 20 54 68 65 20 22 52  272-38653 The "R
e8d0: 45 53 54 52 49 43 54 22 20 61 63 74 69 6f 6e 20  ESTRICT" action 
e8e0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 23  means that the.#
e8f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20   application is 
e900: 70 72 6f 68 69 62 69 74 65 64 20 66 72 6f 6d 20  prohibited from 
e910: 64 65 6c 65 74 69 6e 67 20 28 66 6f 72 20 4f 4e  deleting (for ON
e920: 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
e930: 29 20 6f 72 0a 23 20 6d 6f 64 69 66 79 69 6e 67  ) or.# modifying
e940: 20 28 66 6f 72 20 4f 4e 20 55 50 44 41 54 45 20   (for ON UPDATE 
e950: 52 45 53 54 52 49 43 54 29 20 61 20 70 61 72 65  RESTRICT) a pare
e960: 6e 74 20 6b 65 79 20 77 68 65 6e 20 74 68 65 72  nt key when ther
e970: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 23 20 6f  e exists one.# o
e980: 72 20 6d 6f 72 65 20 63 68 69 6c 64 20 6b 65 79  r more child key
e990: 73 20 6d 61 70 70 65 64 20 74 6f 20 69 74 2e 0a  s mapped to it..
e9a0: 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  #.drop_all_table
e9b0: 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  s.do_test e_fkey
e9c0: 2d 34 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -41.1 {.  execsq
e9d0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
e9e0: 41 42 4c 45 20 70 61 72 65 6e 74 28 70 31 2c 20  ABLE parent(p1, 
e9f0: 70 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  p2);.    CREATE 
ea00: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 70 61 72  UNIQUE INDEX par
ea10: 65 6e 74 5f 69 20 4f 4e 20 70 61 72 65 6e 74 28  ent_i ON parent(
ea20: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 43 52 45  p1, p2);.    CRE
ea30: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31  ATE TABLE child1
ea40: 28 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20 20  (c1, c2, .      
ea50: 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 32 2c 20  FOREIGN KEY(c2, 
ea60: 63 31 29 20 52 45 46 45 52 45 4e 43 45 53 20 70  c1) REFERENCES p
ea70: 61 72 65 6e 74 28 70 31 2c 20 70 32 29 20 4f 4e  arent(p1, p2) ON
ea80: 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
ea90: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
eaa0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32 28  TE TABLE child2(
eab0: 63 31 2c 20 63 32 2c 20 0a 20 20 20 20 20 20 46  c1, c2, .      F
eac0: 4f 52 45 49 47 4e 20 4b 45 59 28 63 32 2c 20 63  OREIGN KEY(c2, c
ead0: 31 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  1) REFERENCES pa
eae0: 72 65 6e 74 28 70 31 2c 20 70 32 29 20 4f 4e 20  rent(p1, p2) ON 
eaf0: 55 50 44 41 54 45 20 52 45 53 54 52 49 43 54 0a  UPDATE RESTRICT.
eb00: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
eb10: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
eb20: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
eb30: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
eb40: 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
eb50: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49  'a', 'b');.    I
eb60: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
eb70: 74 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  t VALUES('c', 'd
eb80: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
eb90: 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55 45  NTO child1 VALUE
eba0: 53 28 27 62 27 2c 20 27 61 27 29 3b 0a 20 20 20  S('b', 'a');.   
ebb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69   INSERT INTO chi
ebc0: 6c 64 32 20 56 41 4c 55 45 53 28 27 64 27 2c 20  ld2 VALUES('d', 
ebd0: 27 63 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  'c');.  }.} {}.d
ebe0: 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 31  o_test e_fkey-41
ebf0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
ec00: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61  { DELETE FROM pa
ec10: 72 65 6e 74 20 57 48 45 52 45 20 70 31 20 3d 20  rent WHERE p1 = 
ec20: 27 61 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  'a' }.} {1 {fore
ec30: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
ec40: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
ec50: 65 73 74 20 65 5f 66 6b 65 79 2d 34 31 2e 34 20  est e_fkey-41.4 
ec60: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  {.  catchsql { U
ec70: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
ec80: 20 70 32 20 3d 20 27 65 27 20 57 48 45 52 45 20   p2 = 'e' WHERE 
ec90: 70 31 20 3d 20 27 63 27 20 7d 0a 7d 20 7b 31 20  p1 = 'c' }.} {1 
eca0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
ecb0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
ecc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ed10: 65 73 74 20 74 68 61 74 20 52 45 53 54 52 49 43  est that RESTRIC
ed20: 54 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  T is slightly di
ed30: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 4e 4f 20  fferent from NO 
ed40: 41 43 54 49 4f 4e 20 66 6f 72 20 49 4d 4d 45 44  ACTION for IMMED
ed50: 49 41 54 45 0a 23 20 63 6f 6e 73 74 72 61 69 6e  IATE.# constrain
ed60: 74 73 2c 20 69 6e 20 74 68 61 74 20 69 74 20 69  ts, in that it i
ed70: 73 20 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65 64  s enforced immed
ed80: 69 61 74 65 6c 79 2c 20 6e 6f 74 20 61 74 20 74  iately, not at t
ed90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 23  he end of the .#
eda0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20   statement..#.# 
edb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
edc0: 37 39 39 37 2d 34 32 31 38 37 20 54 68 65 20 64  7997-42187 The d
edd0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
ede0: 6e 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  n the effect of 
edf0: 61 0a 23 20 52 45 53 54 52 49 43 54 20 61 63 74  a.# RESTRICT act
ee00: 69 6f 6e 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 66  ion and normal f
ee10: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
ee20: 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
ee30: 74 20 69 73 20 74 68 61 74 0a 23 20 74 68 65 20  t is that.# the 
ee40: 52 45 53 54 52 49 43 54 20 61 63 74 69 6f 6e 20  RESTRICT action 
ee50: 70 72 6f 63 65 73 73 69 6e 67 20 68 61 70 70 65  processing happe
ee60: 6e 73 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ns as soon as th
ee70: 65 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  e field is updat
ee80: 65 64 0a 23 20 2d 20 6e 6f 74 20 61 74 20 74 68  ed.# - not at th
ee90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72  e end of the cur
eea0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 61  rent statement a
eeb0: 73 20 69 74 20 77 6f 75 6c 64 20 77 69 74 68 20  s it would with 
eec0: 61 6e 0a 23 20 69 6d 6d 65 64 69 61 74 65 20 63  an.# immediate c
eed0: 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 61 74  onstraint, or at
eee0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
eef0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
ef00: 69 6f 6e 20 61 73 20 69 74 0a 23 20 77 6f 75 6c  ion as it.# woul
ef10: 64 20 77 69 74 68 20 61 20 64 65 66 65 72 72 65  d with a deferre
ef20: 64 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a  d constraint..#.
ef30: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
ef40: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
ef50: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
ef60: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ef70: 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d  LE parent(x PRIM
ef80: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
ef90: 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64  EATE TABLE child
efa0: 31 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(c REFERENCES p
efb0: 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20  arent ON UPDATE 
efc0: 52 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43  RESTRICT);.    C
efd0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c  REATE TABLE chil
efe0: 64 32 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  d2(c REFERENCES 
eff0: 70 61 72 65 6e 74 20 4f 4e 20 55 50 44 41 54 45  parent ON UPDATE
f000: 20 4e 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20   NO ACTION);..  
f010: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
f020: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f030: 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  1');.    INSERT 
f040: 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55  INTO parent VALU
f050: 45 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20  ES('key2');.    
f060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
f070: 64 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  d1 VALUES('key1'
f080: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f090: 54 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53  TO child2 VALUES
f0a0: 28 27 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20 43  ('key2');..    C
f0b0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 70 61  REATE TRIGGER pa
f0c0: 72 65 6e 74 5f 74 20 41 46 54 45 52 20 55 50 44  rent_t AFTER UPD
f0d0: 41 54 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45  ATE ON parent BE
f0e0: 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45  GIN.      UPDATE
f0f0: 20 63 68 69 6c 64 31 20 73 65 74 20 63 20 3d 20   child1 set c = 
f100: 6e 65 77 2e 78 20 57 48 45 52 45 20 63 20 3d 20  new.x WHERE c = 
f110: 6f 6c 64 2e 78 3b 0a 20 20 20 20 20 20 55 50 44  old.x;.      UPD
f120: 41 54 45 20 63 68 69 6c 64 32 20 73 65 74 20 63  ATE child2 set c
f130: 20 3d 20 6e 65 77 2e 78 20 57 48 45 52 45 20 63   = new.x WHERE c
f140: 20 3d 20 6f 6c 64 2e 78 3b 0a 20 20 20 20 45 4e   = old.x;.    EN
f150: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  D;.  }.} {}.do_t
f160: 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 32 20  est e_fkey-42.2 
f170: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  {.  catchsql { U
f180: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
f190: 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27 20 57   x = 'key one' W
f1a0: 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20  HERE x = 'key1' 
f1b0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
f1c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
f1d0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
f1e0: 65 5f 66 6b 65 79 2d 34 32 2e 33 20 7b 0a 20 20  e_fkey-42.3 {.  
f1f0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55  execsql { .    U
f200: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
f210: 20 78 20 3d 20 27 6b 65 79 20 74 77 6f 27 20 57   x = 'key two' W
f220: 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32 27 3b  HERE x = 'key2';
f230: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
f240: 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20 7d 0a 7d  OM child2;.  }.}
f250: 20 7b 7b 6b 65 79 20 74 77 6f 7d 7d 0a 0a 64 72   {{key two}}..dr
f260: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
f270: 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e  _test e_fkey-42.
f280: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
f290: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
f2a0: 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52   parent(x PRIMAR
f2b0: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
f2c0: 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28  TE TABLE child1(
f2d0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  c REFERENCES par
f2e0: 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45  ent ON DELETE RE
f2f0: 53 54 52 49 43 54 29 3b 0a 20 20 20 20 43 52 45  STRICT);.    CRE
f300: 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 32  ATE TABLE child2
f310: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 61  (c REFERENCES pa
f320: 72 65 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 4e  rent ON DELETE N
f330: 4f 20 41 43 54 49 4f 4e 29 3b 0a 0a 20 20 20 20  O ACTION);..    
f340: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
f350: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  nt VALUES('key1'
f360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
f370: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
f380: 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49 4e  ('key2');.    IN
f390: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31  SERT INTO child1
f3a0: 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b   VALUES('key1');
f3b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f3c0: 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27   child2 VALUES('
f3d0: 6b 65 79 32 27 29 3b 0a 0a 20 20 20 20 43 52 45  key2');..    CRE
f3e0: 41 54 45 20 54 52 49 47 47 45 52 20 70 61 72 65  ATE TRIGGER pare
f3f0: 6e 74 5f 74 20 41 46 54 45 52 20 44 45 4c 45 54  nt_t AFTER DELET
f400: 45 20 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49  E ON parent BEGI
f410: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
f420: 68 69 6c 64 31 20 53 45 54 20 63 20 3d 20 4e 55  hild1 SET c = NU
f430: 4c 4c 20 57 48 45 52 45 20 63 20 3d 20 6f 6c 64  LL WHERE c = old
f440: 2e 78 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  .x;.      UPDATE
f450: 20 63 68 69 6c 64 32 20 53 45 54 20 63 20 3d 20   child2 SET c = 
f460: 4e 55 4c 4c 20 57 48 45 52 45 20 63 20 3d 20 6f  NULL WHERE c = o
f470: 6c 64 2e 78 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ld.x;.    END;. 
f480: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
f490: 65 5f 66 6b 65 79 2d 34 32 2e 35 20 7b 0a 20 20  e_fkey-42.5 {.  
f4a0: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
f4b0: 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
f4c0: 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20 7d  ERE x = 'key1' }
f4d0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
f4e0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
f4f0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
f500: 5f 66 6b 65 79 2d 34 32 2e 36 20 7b 0a 20 20 65  _fkey-42.6 {.  e
f510: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45  xecsql { .    DE
f520: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
f530: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32   WHERE x = 'key2
f540: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
f550: 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20 20 7d  FROM child2;.  }
f560: 0a 7d 20 7b 7b 7d 7d 0a 0a 64 72 6f 70 5f 61 6c  .} {{}}..drop_al
f570: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
f580: 20 65 5f 66 6b 65 79 2d 34 32 2e 37 20 7b 0a 20   e_fkey-42.7 {. 
f590: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
f5a0: 52 45 41 54 45 20 54 41 42 4c 45 20 70 61 72 65  REATE TABLE pare
f5b0: 6e 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  nt(x PRIMARY KEY
f5c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
f5d0: 42 4c 45 20 63 68 69 6c 64 31 28 63 20 52 45 46  BLE child1(c REF
f5e0: 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
f5f0: 4e 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43  N DELETE RESTRIC
f600: 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
f610: 41 42 4c 45 20 63 68 69 6c 64 32 28 63 20 52 45  ABLE child2(c RE
f620: 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20  FERENCES parent 
f630: 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41 43 54  ON DELETE NO ACT
f640: 49 4f 4e 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  ION);..    INSER
f650: 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
f660: 4c 55 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20  LUES('key1');.  
f670: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61    INSERT INTO pa
f680: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f690: 32 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  2');.    INSERT 
f6a0: 49 4e 54 4f 20 63 68 69 6c 64 31 20 56 41 4c 55  INTO child1 VALU
f6b0: 45 53 28 27 6b 65 79 31 27 29 3b 0a 20 20 20 20  ES('key1');.    
f6c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c  INSERT INTO chil
f6d0: 64 32 20 56 41 4c 55 45 53 28 27 6b 65 79 32 27  d2 VALUES('key2'
f6e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
f6f0: 65 73 74 20 65 5f 66 6b 65 79 2d 34 32 2e 38 20  est e_fkey-42.8 
f700: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 52  {.  catchsql { R
f710: 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 61 72 65  EPLACE INTO pare
f720: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  nt VALUES('key1'
f730: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
f740: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
f750: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
f760: 74 20 65 5f 66 6b 65 79 2d 34 32 2e 39 20 7b 0a  t e_fkey-42.9 {.
f770: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
f780: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 61   REPLACE INTO pa
f790: 72 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79  rent VALUES('key
f7a0: 32 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  2');.    SELECT 
f7b0: 2a 20 46 52 4f 4d 20 63 68 69 6c 64 32 3b 0a 20  * FROM child2;. 
f7c0: 20 7d 0a 7d 20 7b 6b 65 79 32 7d 0a 0a 23 2d 2d   }.} {key2}..#--
f7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f810: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
f820: 68 61 74 20 52 45 53 54 52 49 43 54 20 69 73 20  hat RESTRICT is 
f830: 65 6e 66 6f 72 63 65 64 20 69 6d 6d 65 64 69 61  enforced immedia
f840: 74 65 6c 79 2c 20 65 76 65 6e 20 66 6f 72 20 61  tely, even for a
f850: 20 44 45 46 45 52 52 45 44 20 63 6f 6e 73 74 72   DEFERRED constr
f860: 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  aint..#.# EVIDEN
f870: 43 45 2d 4f 46 3a 20 52 2d 32 34 31 37 39 2d 36  CE-OF: R-24179-6
f880: 30 35 32 33 20 45 76 65 6e 20 69 66 20 74 68 65  0523 Even if the
f890: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
f8a0: 73 74 72 61 69 6e 74 20 69 74 20 69 73 0a 23 20  straint it is.# 
f8b0: 61 74 74 61 63 68 65 64 20 74 6f 20 69 73 20 64  attached to is d
f8c0: 65 66 65 72 72 65 64 2c 20 63 6f 6e 66 69 67 75  eferred, configu
f8d0: 72 69 6e 67 20 61 20 52 45 53 54 52 49 43 54 20  ring a RESTRICT 
f8e0: 61 63 74 69 6f 6e 20 63 61 75 73 65 73 20 53 51  action causes SQ
f8f0: 4c 69 74 65 0a 23 20 74 6f 20 72 65 74 75 72 6e  Lite.# to return
f900: 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
f910: 61 74 65 6c 79 20 69 66 20 61 20 70 61 72 65 6e  ately if a paren
f920: 74 20 6b 65 79 20 77 69 74 68 20 64 65 70 65 6e  t key with depen
f930: 64 65 6e 74 20 63 68 69 6c 64 0a 23 20 6b 65 79  dent child.# key
f940: 73 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  s is deleted or 
f950: 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 64 72 6f 70  modified..#.drop
f960: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
f970: 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 31 20  est e_fkey-43.1 
f980: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
f990: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
f9a0: 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59 20  arent(x PRIMARY 
f9b0: 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45  KEY);.    CREATE
f9c0: 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63 20   TABLE child1(c 
f9d0: 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65 6e  REFERENCES paren
f9e0: 74 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54  t ON UPDATE REST
f9f0: 52 49 43 54 0a 20 20 20 20 20 20 44 45 46 45 52  RICT.      DEFER
fa00: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
fa10: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
fa20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fa30: 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52 45   child2(c REFERE
fa40: 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20 55  NCES parent ON U
fa50: 50 44 41 54 45 20 4e 4f 20 41 43 54 49 4f 4e 0a  PDATE NO ACTION.
fa60: 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c 45        DEFERRABLE
fa70: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
fa80: 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  RED.    );..    
fa90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65  INSERT INTO pare
faa0: 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27  nt VALUES('key1'
fab0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
fac0: 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53  TO parent VALUES
fad0: 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49 4e  ('key2');.    IN
fae0: 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 31  SERT INTO child1
faf0: 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29 3b   VALUES('key1');
fb00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fb10: 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28 27   child2 VALUES('
fb20: 6b 65 79 32 27 29 3b 0a 20 20 20 20 42 45 47 49  key2');.    BEGI
fb30: 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  N;.  }.} {}.do_t
fb40: 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 32 20  est e_fkey-43.2 
fb50: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55  {.  catchsql { U
fb60: 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45 54  PDATE parent SET
fb70: 20 78 20 3d 20 27 6b 65 79 20 6f 6e 65 27 20 57   x = 'key one' W
fb80: 48 45 52 45 20 78 20 3d 20 27 6b 65 79 31 27 20  HERE x = 'key1' 
fb90: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
fba0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
fbb0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
fbc0: 65 5f 66 6b 65 79 2d 34 33 2e 33 20 7b 0a 20 20  e_fkey-43.3 {.  
fbd0: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
fbe0: 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20   parent SET x = 
fbf0: 27 6b 65 79 20 74 77 6f 27 20 57 48 45 52 45 20  'key two' WHERE 
fc00: 78 20 3d 20 27 6b 65 79 32 27 20 7d 0a 7d 20 7b  x = 'key2' }.} {
fc10: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
fc20: 2d 34 33 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  -43.4 {.  catchs
fc30: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
fc40: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
fc50: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
fc60: 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
fc70: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
fc80: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 63 68 69  {.    UPDATE chi
fc90: 6c 64 32 20 53 45 54 20 63 20 3d 20 27 6b 65 79  ld2 SET c = 'key
fca0: 20 74 77 6f 27 3b 0a 20 20 20 20 43 4f 4d 4d 49   two';.    COMMI
fcb0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f  T;.  }.} {}..dro
fcc0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
fcd0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 36  test e_fkey-43.6
fce0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
fcf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fd00: 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41 52 59  parent(x PRIMARY
fd10: 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54   KEY);.    CREAT
fd20: 45 20 54 41 42 4c 45 20 63 68 69 6c 64 31 28 63  E TABLE child1(c
fd30: 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72 65   REFERENCES pare
fd40: 6e 74 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53  nt ON DELETE RES
fd50: 54 52 49 43 54 0a 20 20 20 20 20 20 44 45 46 45  TRICT.      DEFE
fd60: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
fd70: 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
fd80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fd90: 45 20 63 68 69 6c 64 32 28 63 20 52 45 46 45 52  E child2(c REFER
fda0: 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f 4e 20  ENCES parent ON 
fdb0: 44 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e  DELETE NO ACTION
fdc0: 0a 20 20 20 20 20 20 44 45 46 45 52 52 41 42 4c  .      DEFERRABL
fdd0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
fde0: 52 52 45 44 0a 20 20 20 20 29 3b 0a 0a 20 20 20  RRED.    );..   
fdf0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
fe00: 65 6e 74 20 56 41 4c 55 45 53 28 27 6b 65 79 31  ent VALUES('key1
fe10: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fe20: 4e 54 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45  NTO parent VALUE
fe30: 53 28 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 49  S('key2');.    I
fe40: 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64  NSERT INTO child
fe50: 31 20 56 41 4c 55 45 53 28 27 6b 65 79 31 27 29  1 VALUES('key1')
fe60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fe70: 4f 20 63 68 69 6c 64 32 20 56 41 4c 55 45 53 28  O child2 VALUES(
fe80: 27 6b 65 79 32 27 29 3b 0a 20 20 20 20 42 45 47  'key2');.    BEG
fe90: 49 4e 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  IN;.  }.} {}.do_
fea0: 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 37  test e_fkey-43.7
feb0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
fec0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65  DELETE FROM pare
fed0: 6e 74 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65  nt WHERE x = 'ke
fee0: 79 31 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  y1' }.} {1 {fore
fef0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
ff00: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
ff10: 65 73 74 20 65 5f 66 6b 65 79 2d 34 33 2e 38 20  est e_fkey-43.8 
ff20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45  {.  execsql { DE
ff30: 4c 45 54 45 20 46 52 4f 4d 20 70 61 72 65 6e 74  LETE FROM parent
ff40: 20 57 48 45 52 45 20 78 20 3d 20 27 6b 65 79 32   WHERE x = 'key2
ff50: 27 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  ' }.} {}.do_test
ff60: 20 65 5f 66 6b 65 79 2d 34 33 2e 39 20 7b 0a 20   e_fkey-43.9 {. 
ff70: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
ff80: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
ff90: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
ffa0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  iled}}.do_test e
ffb0: 5f 66 6b 65 79 2d 34 33 2e 31 30 20 7b 0a 20 20  _fkey-43.10 {.  
ffc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
ffd0: 44 41 54 45 20 63 68 69 6c 64 32 20 53 45 54 20  DATE child2 SET 
ffe0: 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 43 4f  c = NULL;.    CO
fff0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
10000 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
10050 74 20 53 45 54 20 4e 55 4c 4c 20 61 63 74 69 6f  t SET NULL actio
10060 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ns..#.# EVIDENCE
10070 2d 4f 46 3a 20 52 2d 30 33 33 35 33 2d 30 35 33  -OF: R-03353-053
10080 32 37 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67  27 If the config
10090 75 72 65 64 20 61 63 74 69 6f 6e 20 69 73 20 22  ured action is "
100a0 53 45 54 20 4e 55 4c 4c 22 2c 0a 23 20 74 68 65  SET NULL",.# the
100b0 6e 20 77 68 65 6e 20 61 20 70 61 72 65 6e 74 20  n when a parent 
100c0 6b 65 79 20 69 73 20 64 65 6c 65 74 65 64 20 28  key is deleted (
100d0 66 6f 72 20 4f 4e 20 44 45 4c 45 54 45 20 53 45  for ON DELETE SE
100e0 54 20 4e 55 4c 4c 29 20 6f 72 20 6d 6f 64 69 66  T NULL) or modif
100f0 69 65 64 0a 23 20 28 66 6f 72 20 4f 4e 20 55 50  ied.# (for ON UP
10100 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 29 2c 20  DATE SET NULL), 
10110 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 63 6f  the child key co
10120 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77  lumns of all row
10130 73 20 69 6e 20 74 68 65 0a 23 20 63 68 69 6c 64  s in the.# child
10140 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 70 70   table that mapp
10150 65 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ed to the parent
10160 20 6b 65 79 20 61 72 65 20 73 65 74 20 74 6f 20   key are set to 
10170 63 6f 6e 74 61 69 6e 20 53 51 4c 20 4e 55 4c 4c  contain SQL NULL
10180 0a 23 20 76 61 6c 75 65 73 2e 0a 23 0a 64 72 6f  .# values..#.dro
10190 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
101a0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 31  test e_fkey-44.1
101b0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
101c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
101d0 70 41 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  pA(x PRIMARY KEY
101e0 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
101f0 42 4c 45 20 63 41 28 63 20 52 45 46 45 52 45 4e  BLE cA(c REFEREN
10200 43 45 53 20 70 41 20 4f 4e 20 44 45 4c 45 54 45  CES pA ON DELETE
10210 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20   SET NULL);.    
10220 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 42 28  CREATE TABLE cB(
10230 63 20 52 45 46 45 52 45 4e 43 45 53 20 70 41 20  c REFERENCES pA 
10240 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55  ON UPDATE SET NU
10250 4c 4c 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  LL);..    INSERT
10260 20 49 4e 54 4f 20 70 41 20 56 41 4c 55 45 53 28   INTO pA VALUES(
10270 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e  X'ABCD');.    IN
10280 53 45 52 54 20 49 4e 54 4f 20 70 41 20 56 41 4c  SERT INTO pA VAL
10290 55 45 53 28 58 27 31 32 33 34 27 29 3b 0a 20 20  UES(X'1234');.  
102a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 41    INSERT INTO cA
102b0 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27 29   VALUES(X'ABCD')
102c0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
102d0 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27 31 32  O cB VALUES(X'12
102e0 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  34');.  }.} {}.d
102f0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34  o_test e_fkey-44
10300 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
10310 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
10320 20 70 41 20 57 48 45 52 45 20 72 6f 77 69 64 20   pA WHERE rowid 
10330 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 1;.    SELECT 
10340 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41  quote(x) FROM pA
10350 3b 0a 20 20 7d 0a 7d 20 7b 58 27 31 32 33 34 27  ;.  }.} {X'1234'
10360 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10370 2d 34 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -44.3 {.  execsq
10380 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 71  l {.    SELECT q
10390 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63 41 3b  uote(c) FROM cA;
103a0 0a 20 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d 0a 64 6f  .  }.} {NULL}.do
103b0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e  _test e_fkey-44.
103c0 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
103d0 20 20 20 20 55 50 44 41 54 45 20 70 41 20 53 45      UPDATE pA SE
103e0 54 20 78 20 3d 20 58 27 38 37 36 35 27 20 57 48  T x = X'8765' WH
103f0 45 52 45 20 72 6f 77 69 64 20 3d 20 32 3b 0a 20  ERE rowid = 2;. 
10400 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28     SELECT quote(
10410 78 29 20 46 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a  x) FROM pA;.  }.
10420 7d 20 7b 58 27 38 37 36 35 27 7d 0a 64 6f 5f 74  } {X'8765'}.do_t
10430 65 73 74 20 65 5f 66 6b 65 79 2d 34 34 2e 35 20  est e_fkey-44.5 
10440 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
10450 4c 45 43 54 20 71 75 6f 74 65 28 63 29 20 46 52  LECT quote(c) FR
10460 4f 4d 20 63 42 20 7d 0a 7d 20 7b 4e 55 4c 4c 7d  OM cB }.} {NULL}
10470 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
104c0 65 73 74 20 53 45 54 20 44 45 46 41 55 4c 54 20  est SET DEFAULT 
104d0 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49  actions..#.# EVI
104e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 30 35  DENCE-OF: R-4305
104f0 34 2d 35 34 38 33 32 20 54 68 65 20 22 53 45 54  4-54832 The "SET
10500 20 44 45 46 41 55 4c 54 22 20 61 63 74 69 6f 6e   DEFAULT" action
10510 73 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  s are similar to
10520 0a 23 20 22 53 45 54 20 4e 55 4c 4c 22 2c 20 65  .# "SET NULL", e
10530 78 63 65 70 74 20 74 68 61 74 20 65 61 63 68 20  xcept that each 
10540 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
10550 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73 65 74 20   columns is set 
10560 74 6f 0a 23 20 63 6f 6e 74 61 69 6e 20 74 68 65  to.# contain the
10570 20 63 6f 6c 75 6d 6e 73 20 64 65 66 61 75 6c 74   columns default
10580 20 76 61 6c 75 65 20 69 6e 73 74 65 61 64 20 6f   value instead o
10590 66 20 4e 55 4c 4c 2e 0a 23 0a 64 72 6f 70 5f 61  f NULL..#.drop_a
105a0 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
105b0 74 20 65 5f 66 6b 65 79 2d 34 35 2e 31 20 7b 0a  t e_fkey-45.1 {.
105c0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
105d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 41 28  CREATE TABLE pA(
105e0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
105f0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10600 20 63 41 28 63 20 44 45 46 41 55 4c 54 20 58 27   cA(c DEFAULT X'
10610 30 30 30 30 27 20 52 45 46 45 52 45 4e 43 45 53  0000' REFERENCES
10620 20 70 41 20 4f 4e 20 44 45 4c 45 54 45 20 53 45   pA ON DELETE SE
10630 54 20 44 45 46 41 55 4c 54 29 3b 0a 20 20 20 20  T DEFAULT);.    
10640 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 42 28  CREATE TABLE cB(
10650 63 20 44 45 46 41 55 4c 54 20 58 27 39 39 39 39  c DEFAULT X'9999
10660 27 20 52 45 46 45 52 45 4e 43 45 53 20 70 41 20  ' REFERENCES pA 
10670 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45  ON UPDATE SET DE
10680 46 41 55 4c 54 29 3b 0a 0a 20 20 20 20 49 4e 53  FAULT);..    INS
10690 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f 77 69  ERT INTO pA(rowi
106a0 64 2c 20 78 29 20 56 41 4c 55 45 53 28 31 2c 20  d, x) VALUES(1, 
106b0 58 27 30 30 30 30 27 29 3b 0a 20 20 20 20 49 4e  X'0000');.    IN
106c0 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f 77  SERT INTO pA(row
106d0 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 32 2c  id, x) VALUES(2,
106e0 20 58 27 39 39 39 39 27 29 3b 0a 20 20 20 20 49   X'9999');.    I
106f0 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72 6f  NSERT INTO pA(ro
10700 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28 33  wid, x) VALUES(3
10710 2c 20 58 27 41 42 43 44 27 29 3b 0a 20 20 20 20  , X'ABCD');.    
10720 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 41 28 72  INSERT INTO pA(r
10730 6f 77 69 64 2c 20 78 29 20 56 41 4c 55 45 53 28  owid, x) VALUES(
10740 34 2c 20 58 27 31 32 33 34 27 29 3b 0a 0a 20 20  4, X'1234');..  
10750 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 41    INSERT INTO cA
10760 20 56 41 4c 55 45 53 28 58 27 41 42 43 44 27 29   VALUES(X'ABCD')
10770 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10780 4f 20 63 42 20 56 41 4c 55 45 53 28 58 27 31 32  O cB VALUES(X'12
10790 33 34 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  34');.  }.} {}.d
107a0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 35  o_test e_fkey-45
107b0 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
107c0 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
107d0 20 70 41 20 57 48 45 52 45 20 72 6f 77 69 64 20   pA WHERE rowid 
107e0 3d 20 33 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 3;.    SELECT 
107f0 71 75 6f 74 65 28 78 29 20 46 52 4f 4d 20 70 41  quote(x) FROM pA
10800 3b 0a 20 20 7d 0a 7d 20 7b 58 27 30 30 30 30 27  ;.  }.} {X'0000'
10810 20 58 27 39 39 39 39 27 20 58 27 31 32 33 34 27   X'9999' X'1234'
10820 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
10830 2d 34 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -45.3 {.  execsq
10840 6c 20 7b 20 53 45 4c 45 43 54 20 71 75 6f 74 65  l { SELECT quote
10850 28 63 29 20 46 52 4f 4d 20 63 41 20 7d 0a 7d 20  (c) FROM cA }.} 
10860 7b 58 27 30 30 30 30 27 7d 0a 64 6f 5f 74 65 73  {X'0000'}.do_tes
10870 74 20 65 5f 66 6b 65 79 2d 34 35 2e 34 20 7b 0a  t e_fkey-45.4 {.
10880 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10890 55 50 44 41 54 45 20 70 41 20 53 45 54 20 78 20  UPDATE pA SET x 
108a0 3d 20 58 27 38 37 36 35 27 20 57 48 45 52 45 20  = X'8765' WHERE 
108b0 72 6f 77 69 64 20 3d 20 34 3b 0a 20 20 20 20 53  rowid = 4;.    S
108c0 45 4c 45 43 54 20 71 75 6f 74 65 28 78 29 20 46  ELECT quote(x) F
108d0 52 4f 4d 20 70 41 3b 0a 20 20 7d 0a 7d 20 7b 58  ROM pA;.  }.} {X
108e0 27 30 30 30 30 27 20 58 27 39 39 39 39 27 20 58  '0000' X'9999' X
108f0 27 38 37 36 35 27 7d 0a 64 6f 5f 74 65 73 74 20  '8765'}.do_test 
10900 65 5f 66 6b 65 79 2d 34 35 2e 35 20 7b 0a 20 20  e_fkey-45.5 {.  
10910 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10920 20 71 75 6f 74 65 28 63 29 20 46 52 4f 4d 20 63   quote(c) FROM c
10930 42 20 7d 0a 7d 20 7b 58 27 39 39 39 39 27 7d 0a  B }.} {X'9999'}.
10940 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
10990 73 74 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  st ON DELETE CAS
109a0 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a  CADE actions..#.
109b0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
109c0 2d 36 31 33 37 36 2d 35 37 32 36 37 20 41 20 22  -61376-57267 A "
109d0 43 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 20  CASCADE" action 
109e0 70 72 6f 70 61 67 61 74 65 73 20 74 68 65 20 64  propagates the d
109f0 65 6c 65 74 65 20 6f 72 0a 23 20 75 70 64 61 74  elete or.# updat
10a00 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  e operation on t
10a10 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20 74 6f  he parent key to
10a20 20 65 61 63 68 20 64 65 70 65 6e 64 65 6e 74 20   each dependent 
10a30 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a 23 20 45  child key..#.# E
10a40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
10a50 38 30 39 2d 36 32 32 30 37 20 46 6f 72 20 61 6e  809-62207 For an
10a60 20 22 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43   "ON DELETE CASC
10a70 41 44 45 22 20 61 63 74 69 6f 6e 2c 20 74 68 69  ADE" action, thi
10a80 73 0a 23 20 6d 65 61 6e 73 20 74 68 61 74 20 65  s.# means that e
10a90 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 63  ach row in the c
10aa0 68 69 6c 64 20 74 61 62 6c 65 20 74 68 61 74 20  hild table that 
10ab0 77 61 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  was associated w
10ac0 69 74 68 20 74 68 65 0a 23 20 64 65 6c 65 74 65  ith the.# delete
10ad0 64 20 70 61 72 65 6e 74 20 72 6f 77 20 69 73 20  d parent row is 
10ae0 61 6c 73 6f 20 64 65 6c 65 74 65 64 2e 0a 23 0a  also deleted..#.
10af0 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
10b00 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10b10 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
10b20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10b30 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55  LE p1(a, b UNIQU
10b40 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
10b50 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
10b60 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 44 45  NCES p1(b) ON DE
10b70 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20 64 29  LETE CASCADE, d)
10b80 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10b90 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O p1 VALUES(NULL
10ba0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
10bb0 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
10bc0 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(4, 4);.    IN
10bd0 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
10be0 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49  UES(5, 5);.    I
10bf0 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10c00 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
10c10 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10c20 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O c1 VALUES(4, 4
10c30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10c40 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20  TO c1 VALUES(5, 
10c50 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  5);.    SELECT c
10c60 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b  ount(*) FROM c1;
10c70 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65  .  }.} {3}.do_te
10c80 73 74 20 65 5f 66 6b 65 79 2d 34 36 2e 32 20 7b  st e_fkey-46.2 {
10c90 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10ca0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 20   DELETE FROM p1 
10cb0 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20  WHERE a = 4;.   
10cc0 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
10cd0 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  M c1;.  }.} {{} 
10ce0 7b 7d 20 35 20 35 7d 0a 64 6f 5f 74 65 73 74 20  {} 5 5}.do_test 
10cf0 65 5f 66 6b 65 79 2d 34 36 2e 33 20 7b 0a 20 20  e_fkey-46.3 {.  
10d00 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
10d10 4c 45 54 45 20 46 52 4f 4d 20 70 31 3b 0a 20 20  LETE FROM p1;.  
10d20 20 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52    SELECT d, c FR
10d30 4f 4d 20 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  OM c1;.  }.} {{}
10d40 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66   {}}.do_test e_f
10d50 6b 65 79 2d 34 36 2e 34 20 7b 0a 20 20 65 78 65  key-46.4 {.  exe
10d60 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10d70 46 52 4f 4d 20 70 31 20 7d 0a 7d 20 7b 7d 0a 0a  FROM p1 }.} {}..
10d80 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
10dd0 73 74 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  st ON UPDATE CAS
10de0 43 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a  CADE actions..#.
10df0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10e00 2d 31 33 38 37 37 2d 36 34 35 34 32 20 46 6f 72  -13877-64542 For
10e10 20 61 6e 20 22 4f 4e 20 55 50 44 41 54 45 20 43   an "ON UPDATE C
10e20 41 53 43 41 44 45 22 20 61 63 74 69 6f 6e 2c 20  ASCADE" action, 
10e30 69 74 20 6d 65 61 6e 73 0a 23 20 74 68 61 74 20  it means.# that 
10e40 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
10e50 64 20 69 6e 20 65 61 63 68 20 64 65 70 65 6e 64  d in each depend
10e60 65 6e 74 20 63 68 69 6c 64 20 6b 65 79 20 61 72  ent child key ar
10e70 65 20 6d 6f 64 69 66 69 65 64 20 74 6f 0a 23 20  e modified to.# 
10e80 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 70 61  match the new pa
10e90 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 73 2e  rent key values.
10ea0 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
10eb0 3a 20 52 2d 36 31 33 37 36 2d 35 37 32 36 37 20  : R-61376-57267 
10ec0 41 20 22 43 41 53 43 41 44 45 22 20 61 63 74 69  A "CASCADE" acti
10ed0 6f 6e 20 70 72 6f 70 61 67 61 74 65 73 20 74 68  on propagates th
10ee0 65 20 64 65 6c 65 74 65 20 6f 72 0a 23 20 75 70  e delete or.# up
10ef0 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f  date operation o
10f00 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79  n the parent key
10f10 20 74 6f 20 65 61 63 68 20 64 65 70 65 6e 64 65   to each depende
10f20 6e 74 20 63 68 69 6c 64 20 6b 65 79 2e 0a 23 0a  nt child key..#.
10f30 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
10f40 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34  do_test e_fkey-4
10f50 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
10f60 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10f70 4c 45 20 70 31 28 61 2c 20 62 20 55 4e 49 51 55  LE p1(a, b UNIQU
10f80 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
10f90 41 42 4c 45 20 63 31 28 63 20 52 45 46 45 52 45  ABLE c1(c REFERE
10fa0 4e 43 45 53 20 70 31 28 62 29 20 4f 4e 20 55 50  NCES p1(b) ON UP
10fb0 44 41 54 45 20 43 41 53 43 41 44 45 2c 20 64 29  DATE CASCADE, d)
10fc0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
10fd0 4f 20 70 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O p1 VALUES(NULL
10fe0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  , NULL);.    INS
10ff0 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
11000 45 53 28 34 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(4, 4);.    IN
11010 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c  SERT INTO p1 VAL
11020 55 45 53 28 35 2c 20 35 29 3b 0a 20 20 20 20 49  UES(5, 5);.    I
11030 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
11040 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
11050 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11060 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 34  O c1 VALUES(4, 4
11070 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
11080 54 4f 20 63 31 20 56 41 4c 55 45 53 28 35 2c 20  TO c1 VALUES(5, 
11090 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  5);.    SELECT c
110a0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 63 31 3b  ount(*) FROM c1;
110b0 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74 65  .  }.} {3}.do_te
110c0 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 32 20 7b  st e_fkey-47.2 {
110d0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
110e0 20 55 50 44 41 54 45 20 70 31 20 53 45 54 20 62   UPDATE p1 SET b
110f0 20 3d 20 31 30 20 57 48 45 52 45 20 62 20 3d 20   = 10 WHERE b = 
11100 35 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64 2c  5;.    SELECT d,
11110 20 63 20 46 52 4f 4d 20 63 31 3b 0a 20 20 7d 0a   c FROM c1;.  }.
11120 7d 20 7b 7b 7d 20 7b 7d 20 34 20 34 20 35 20 31  } {{} {} 4 4 5 1
11130 30 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  0}.do_test e_fke
11140 79 2d 34 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  y-47.3 {.  execs
11150 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
11160 70 31 20 53 45 54 20 62 20 3d 20 31 31 20 57 48  p1 SET b = 11 WH
11170 45 52 45 20 62 20 3d 20 34 3b 0a 20 20 20 20 53  ERE b = 4;.    S
11180 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20  ELECT d, c FROM 
11190 63 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d  c1;.  }.} {{} {}
111a0 20 34 20 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74   4 11 5 10}.do_t
111b0 65 73 74 20 65 5f 66 6b 65 79 2d 34 37 2e 34 20  est e_fkey-47.4 
111c0 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
111d0 20 20 20 55 50 44 41 54 45 20 70 31 20 53 45 54     UPDATE p1 SET
111e0 20 62 20 3d 20 36 20 57 48 45 52 45 20 62 20 49   b = 6 WHERE b I
111f0 53 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45  S NULL;.    SELE
11200 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 63 31 3b  CT d, c FROM c1;
11210 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 20  .  }.} {{} {} 4 
11220 31 31 20 35 20 31 30 7d 0a 64 6f 5f 74 65 73 74  11 5 10}.do_test
11230 20 65 5f 66 6b 65 79 2d 34 36 2e 35 20 7b 0a 20   e_fkey-46.5 {. 
11240 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
11250 54 20 2a 20 46 52 4f 4d 20 70 31 20 7d 0a 7d 20  T * FROM p1 }.} 
11260 7b 7b 7d 20 36 20 34 20 31 31 20 35 20 31 30 7d  {{} 6 4 11 5 10}
11270 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
112c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
112d0 30 35 38 2d 35 37 31 35 38 0a 23 0a 23 20 54 65  058-57158.#.# Te
112e0 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
112f0 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54  om the "ON DELET
11300 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
11310 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e  Actions" section
11320 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65   .# of foreignke
11330 79 73 2e 68 74 6d 6c 2e 0a 23 0a 64 72 6f 70 5f  ys.html..#.drop_
11340 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
11350 73 74 20 65 5f 66 6b 65 79 2d 34 38 2e 31 20 7b  st e_fkey-48.1 {
11360 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11370 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 72   CREATE TABLE ar
11380 74 69 73 74 28 0a 20 20 20 20 20 20 61 72 74 69  tist(.      arti
11390 73 74 69 64 20 20 20 20 49 4e 54 45 47 45 52 20  stid    INTEGER 
113a0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20  PRIMARY KEY, .  
113b0 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65 20 20      artistname  
113c0 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  TEXT.    );.    
113d0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 61  CREATE TABLE tra
113e0 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63 6b 69  ck(.      tracki
113f0 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20  d     INTEGER,. 
11400 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65 20 20       trackname  
11410 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 74 72   TEXT, .      tr
11420 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45 47 45  ackartist INTEGE
11430 52 20 52 45 46 45 52 45 4e 43 45 53 20 61 72 74  R REFERENCES art
11440 69 73 74 28 61 72 74 69 73 74 69 64 29 20 4f 4e  ist(artistid) ON
11450 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a   UPDATE CASCADE.
11460 20 20 20 20 29 3b 0a 0a 20 20 20 20 49 4e 53 45      );..    INSE
11470 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56  RT INTO artist V
11480 41 4c 55 45 53 28 31 2c 20 27 44 65 61 6e 20 4d  ALUES(1, 'Dean M
11490 61 72 74 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  artin');.    INS
114a0 45 52 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20  ERT INTO artist 
114b0 56 41 4c 55 45 53 28 32 2c 20 27 46 72 61 6e 6b  VALUES(2, 'Frank
114c0 20 53 69 6e 61 74 72 61 27 29 3b 0a 20 20 20 20   Sinatra');.    
114d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
114e0 6b 20 56 41 4c 55 45 53 28 31 31 2c 20 27 54 68  k VALUES(11, 'Th
114f0 61 74 27 27 73 20 41 6d 6f 72 65 27 2c 20 31 29  at''s Amore', 1)
11500 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11510 4f 20 74 72 61 63 6b 20 56 41 4c 55 45 53 28 31  O track VALUES(1
11520 32 2c 20 27 43 68 72 69 73 74 6d 61 73 20 42 6c  2, 'Christmas Bl
11530 75 65 73 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ues', 1);.    IN
11540 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63 6b 20  SERT INTO track 
11550 56 41 4c 55 45 53 28 31 33 2c 20 27 4d 79 20 57  VALUES(13, 'My W
11560 61 79 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ay', 2);.  }.} {
11570 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
11580 2d 34 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -48.2 {.  execsq
11590 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  l {.    UPDATE a
115a0 72 74 69 73 74 20 53 45 54 20 61 72 74 69 73 74  rtist SET artist
115b0 69 64 20 3d 20 31 30 30 20 57 48 45 52 45 20 61  id = 100 WHERE a
115c0 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 44 65 61  rtistname = 'Dea
115d0 6e 20 4d 61 72 74 69 6e 27 3b 0a 20 20 7d 0a 7d  n Martin';.  }.}
115e0 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   {}.do_test e_fk
115f0 65 79 2d 34 38 2e 33 20 7b 0a 20 20 65 78 65 63  ey-48.3 {.  exec
11600 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
11610 52 4f 4d 20 61 72 74 69 73 74 20 7d 0a 7d 20 7b  ROM artist }.} {
11620 32 20 7b 46 72 61 6e 6b 20 53 69 6e 61 74 72 61  2 {Frank Sinatra
11630 7d 20 31 30 30 20 7b 44 65 61 6e 20 4d 61 72 74  } 100 {Dean Mart
11640 69 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  in}}.do_test e_f
11650 6b 65 79 2d 34 38 2e 34 20 7b 0a 20 20 65 78 65  key-48.4 {.  exe
11660 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
11670 46 52 4f 4d 20 74 72 61 63 6b 20 7d 0a 7d 20 7b  FROM track }.} {
11680 31 31 20 7b 54 68 61 74 27 73 20 41 6d 6f 72 65  11 {That's Amore
11690 7d 20 31 30 30 20 31 32 20 7b 43 68 72 69 73 74  } 100 12 {Christ
116a0 6d 61 73 20 42 6c 75 65 73 7d 20 31 30 30 20 31  mas Blues} 100 1
116b0 33 20 7b 4d 79 20 57 61 79 7d 20 32 7d 0a 0a 0a  3 {My Way} 2}...
116c0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72  ----------.# Ver
11710 69 66 79 20 74 68 61 74 20 61 64 64 69 6e 67 20  ify that adding 
11720 61 6e 20 46 4b 20 61 63 74 69 6f 6e 20 64 6f 65  an FK action doe
11730 73 20 6e 6f 74 20 61 62 73 6f 6c 76 65 20 74 68  s not absolve th
11740 65 20 75 73 65 72 20 6f 66 20 74 68 65 20 0a 23  e user of the .#
11750 20 72 65 71 75 69 72 65 6d 65 6e 74 20 6e 6f 74   requirement not
11760 20 74 6f 20 76 69 6f 6c 61 74 65 20 74 68 65 20   to violate the 
11770 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
11780 74 72 61 69 6e 74 2e 0a 23 0a 23 20 45 56 49 44  traint..#.# EVID
11790 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 39 36 38  ENCE-OF: R-53968
117a0 2d 35 31 36 34 32 20 43 6f 6e 66 69 67 75 72 69  -51642 Configuri
117b0 6e 67 20 61 6e 20 4f 4e 20 55 50 44 41 54 45 20  ng an ON UPDATE 
117c0 6f 72 20 4f 4e 20 44 45 4c 45 54 45 0a 23 20 61  or ON DELETE.# a
117d0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
117e0 65 61 6e 20 74 68 61 74 20 74 68 65 20 66 6f 72  ean that the for
117f0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
11800 69 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  int does not nee
11810 64 20 74 6f 0a 23 20 62 65 20 73 61 74 69 73 66  d to.# be satisf
11820 69 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ied..#.drop_all_
11830 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65  tables.do_test e
11840 5f 66 6b 65 79 2d 34 39 2e 31 20 7b 0a 20 20 65  _fkey-49.1 {.  e
11850 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
11860 41 54 45 20 54 41 42 4c 45 20 70 61 72 65 6e 74  ATE TABLE parent
11870 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
11880 65 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  e, b, c, PRIMARY
11890 20 4b 45 59 28 63 2c 20 61 29 29 3b 0a 20 20 20   KEY(c, a));.   
118a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 68   CREATE TABLE ch
118b0 69 6c 64 28 64 20 44 45 46 41 55 4c 54 20 27 61  ild(d DEFAULT 'a
118c0 27 2c 20 65 2c 20 66 20 44 45 46 41 55 4c 54 20  ', e, f DEFAULT 
118d0 27 63 27 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  'c',.      FOREI
118e0 47 4e 20 4b 45 59 28 66 2c 20 64 29 20 52 45 46  GN KEY(f, d) REF
118f0 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
11900 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46  N UPDATE SET DEF
11910 41 55 4c 54 0a 20 20 20 20 29 3b 0a 0a 20 20 20  AULT.    );..   
11920 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72   INSERT INTO par
11930 65 6e 74 20 56 41 4c 55 45 53 28 27 41 27 2c 20  ent VALUES('A', 
11940 27 62 27 2c 20 27 63 27 29 3b 0a 20 20 20 20 49  'b', 'c');.    I
11950 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
11960 74 20 56 41 4c 55 45 53 28 27 4f 4e 45 27 2c 20  t VALUES('ONE', 
11970 27 74 77 6f 27 2c 20 27 74 68 72 65 65 27 29 3b  'two', 'three');
11980 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
11990 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6f   child VALUES('o
119a0 6e 65 27 2c 20 27 74 77 6f 27 2c 20 27 74 68 72  ne', 'two', 'thr
119b0 65 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ee');.  }.} {}.d
119c0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39  o_test e_fkey-49
119d0 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
119e0 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
119f0 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74 20    UPDATE parent 
11a00 53 45 54 20 61 20 3d 20 27 27 20 57 48 45 52 45  SET a = '' WHERE
11a10 20 61 20 3d 20 27 6f 4e 65 27 3b 0a 20 20 20 20   a = 'oNe';.    
11a20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
11a30 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 61 20  child;.  }.} {a 
11a40 74 77 6f 20 63 7d 0a 64 6f 5f 74 65 73 74 20 65  two c}.do_test e
11a50 5f 66 6b 65 79 2d 34 39 2e 33 20 7b 0a 20 20 65  _fkey-49.3 {.  e
11a60 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
11a70 4c 42 41 43 4b 3b 0a 20 20 20 20 44 45 4c 45 54  LBACK;.    DELET
11a80 45 20 46 52 4f 4d 20 70 61 72 65 6e 74 20 57 48  E FROM parent WH
11a90 45 52 45 20 61 20 3d 20 27 41 27 3b 0a 20 20 20  ERE a = 'A';.   
11aa0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70   SELECT * FROM p
11ab0 61 72 65 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 4f 4e  arent;.  }.} {ON
11ac0 45 20 74 77 6f 20 74 68 72 65 65 7d 0a 64 6f 5f  E two three}.do_
11ad0 74 65 73 74 20 65 5f 66 6b 65 79 2d 34 39 2e 34  test e_fkey-49.4
11ae0 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
11af0 55 50 44 41 54 45 20 70 61 72 65 6e 74 20 53 45  UPDATE parent SE
11b00 54 20 61 20 3d 20 27 27 20 57 48 45 52 45 20 61  T a = '' WHERE a
11b10 20 3d 20 27 6f 4e 65 27 20 7d 0a 7d 20 7b 31 20   = 'oNe' }.} {1 
11b20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
11b30 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
11b40 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
11b90 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
11ba0 31 38 35 36 2d 31 39 38 33 36 0a 23 0a 23 20 54  1856-19836.#.# T
11bb0 65 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66  est an example f
11bc0 72 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45  rom the "ON DELE
11bd0 54 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45  TE and ON UPDATE
11be0 20 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f   Actions" sectio
11bf0 6e 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b  n .# of foreignk
11c00 65 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65  eys.html. This e
11c10 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 74 68 61  xample shows tha
11c20 74 20 61 64 64 69 6e 67 20 61 6e 20 22 4f 4e 20  t adding an "ON 
11c30 44 45 4c 45 54 45 20 44 45 46 41 55 4c 54 22 0a  DELETE DEFAULT".
11c40 23 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  # clause does no
11c50 74 20 61 62 72 6f 67 61 74 65 20 74 68 65 20 6e  t abrogate the n
11c60 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
11c70 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  he foreign key c
11c80 6f 6e 73 74 72 61 69 6e 74 0a 23 20 28 52 2d 32  onstraint.# (R-2
11c90 38 32 32 30 2d 34 36 36 39 34 29 2e 0a 23 0a 23  8220-46694)..#.#
11ca0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11cb0 32 38 32 32 30 2d 34 36 36 39 34 20 46 6f 72 20  28220-46694 For 
11cc0 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 22  example, if an "
11cd0 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
11ce0 46 41 55 4c 54 22 0a 23 20 61 63 74 69 6f 6e 20  FAULT".# action 
11cf0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 62  is configured, b
11d00 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  ut there is no r
11d10 6f 77 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ow in the parent
11d20 20 74 61 62 6c 65 20 74 68 61 74 0a 23 20 63 6f   table that.# co
11d30 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
11d40 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
11d50 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79  of the child key
11d60 20 63 6f 6c 75 6d 6e 73 2c 20 64 65 6c 65 74 69   columns, deleti
11d70 6e 67 20 61 0a 23 20 70 61 72 65 6e 74 20 6b 65  ng a.# parent ke
11d80 79 20 77 68 69 6c 65 20 64 65 70 65 6e 64 65 6e  y while dependen
11d90 74 20 63 68 69 6c 64 20 6b 65 79 73 20 65 78 69  t child keys exi
11da0 73 74 20 73 74 69 6c 6c 20 63 61 75 73 65 73 20  st still causes 
11db0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23 20  a foreign key.# 
11dc0 76 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 64 72 6f  violation..#.dro
11dd0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
11de0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 31  test e_fkey-50.1
11df0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11e00 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11e10 61 72 74 69 73 74 28 0a 20 20 20 20 20 20 61 72  artist(.      ar
11e20 74 69 73 74 69 64 20 20 20 20 49 4e 54 45 47 45  tistid    INTEGE
11e30 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a  R PRIMARY KEY, .
11e40 20 20 20 20 20 20 61 72 74 69 73 74 6e 61 6d 65        artistname
11e50 20 20 54 45 58 54 0a 20 20 20 20 29 3b 0a 20 20    TEXT.    );.  
11e60 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
11e70 72 61 63 6b 28 0a 20 20 20 20 20 20 74 72 61 63  rack(.      trac
11e80 6b 69 64 20 20 20 20 20 49 4e 54 45 47 45 52 2c  kid     INTEGER,
11e90 0a 20 20 20 20 20 20 74 72 61 63 6b 6e 61 6d 65  .      trackname
11ea0 20 20 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20     TEXT, .      
11eb0 74 72 61 63 6b 61 72 74 69 73 74 20 49 4e 54 45  trackartist INTE
11ec0 47 45 52 20 44 45 46 41 55 4c 54 20 30 20 52 45  GER DEFAULT 0 RE
11ed0 46 45 52 45 4e 43 45 53 20 61 72 74 69 73 74 28  FERENCES artist(
11ee0 61 72 74 69 73 74 69 64 29 20 4f 4e 20 44 45 4c  artistid) ON DEL
11ef0 45 54 45 20 53 45 54 20 44 45 46 41 55 4c 54 0a  ETE SET DEFAULT.
11f00 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
11f10 54 20 49 4e 54 4f 20 61 72 74 69 73 74 20 56 41  T INTO artist VA
11f20 4c 55 45 53 28 33 2c 20 27 53 61 6d 6d 79 20 44  LUES(3, 'Sammy D
11f30 61 76 69 73 20 4a 72 2e 27 29 3b 0a 20 20 20 20  avis Jr.');.    
11f40 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 61 63  INSERT INTO trac
11f50 6b 20 56 41 4c 55 45 53 28 31 34 2c 20 27 4d 72  k VALUES(14, 'Mr
11f60 2e 20 42 6f 6a 61 6e 67 6c 65 73 27 2c 20 33 29  . Bojangles', 3)
11f70 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
11f80 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e 32 20 7b  st e_fkey-50.2 {
11f90 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
11fa0 4c 45 54 45 20 46 52 4f 4d 20 61 72 74 69 73 74  LETE FROM artist
11fb0 20 57 48 45 52 45 20 61 72 74 69 73 74 6e 61 6d   WHERE artistnam
11fc0 65 20 3d 20 27 53 61 6d 6d 79 20 44 61 76 69 73  e = 'Sammy Davis
11fd0 20 4a 72 2e 27 20 7d 0a 7d 20 7b 31 20 7b 66 6f   Jr.' }.} {1 {fo
11fe0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
11ff0 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
12000 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 30 2e  _test e_fkey-50.
12010 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
12020 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12030 61 72 74 69 73 74 20 56 41 4c 55 45 53 28 30 2c  artist VALUES(0,
12040 20 27 55 6e 6b 6e 6f 77 6e 20 41 72 74 69 73 74   'Unknown Artist
12050 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  ');.    DELETE F
12060 52 4f 4d 20 61 72 74 69 73 74 20 57 48 45 52 45  ROM artist WHERE
12070 20 61 72 74 69 73 74 6e 61 6d 65 20 3d 20 27 53   artistname = 'S
12080 61 6d 6d 79 20 44 61 76 69 73 20 4a 72 2e 27 3b  ammy Davis Jr.';
12090 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
120a0 74 20 65 5f 66 6b 65 79 2d 35 30 2e 34 20 7b 0a  t e_fkey-50.4 {.
120b0 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
120c0 43 54 20 2a 20 46 52 4f 4d 20 61 72 74 69 73 74  CT * FROM artist
120d0 20 7d 0a 7d 20 7b 30 20 7b 55 6e 6b 6e 6f 77 6e   }.} {0 {Unknown
120e0 20 41 72 74 69 73 74 7d 7d 0a 64 6f 5f 74 65 73   Artist}}.do_tes
120f0 74 20 65 5f 66 6b 65 79 2d 35 30 2e 35 20 7b 0a  t e_fkey-50.5 {.
12100 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
12110 43 54 20 2a 20 46 52 4f 4d 20 74 72 61 63 6b 20  CT * FROM track 
12120 7d 0a 7d 20 7b 31 34 20 7b 4d 72 2e 20 42 6f 6a  }.} {14 {Mr. Boj
12130 61 6e 67 6c 65 73 7d 20 30 7d 0a 0a 23 2d 2d 2d  angles} 0}..#---
12140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12180 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
12190 45 2d 4f 46 3a 20 52 2d 30 39 35 36 34 2d 32 32  E-OF: R-09564-22
121a0 31 37 30 0a 23 0a 23 20 43 68 65 63 6b 20 74 68  170.#.# Check th
121b0 61 74 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  at the order of 
121c0 73 74 65 70 73 20 69 6e 20 61 6e 20 55 50 44 41  steps in an UPDA
121d0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 6e 20  TE or DELETE on 
121e0 61 20 70 61 72 65 6e 74 20 0a 23 20 74 61 62 6c  a parent .# tabl
121f0 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
12200 0a 23 0a 23 20 20 20 31 2e 20 45 78 65 63 75 74  .#.#   1. Execut
12210 65 20 61 70 70 6c 69 63 61 62 6c 65 20 42 45 46  e applicable BEF
12220 4f 52 45 20 74 72 69 67 67 65 72 20 70 72 6f 67  ORE trigger prog
12230 72 61 6d 73 2c 0a 23 20 20 20 32 2e 20 43 68 65  rams,.#   2. Che
12240 63 6b 20 6c 6f 63 61 6c 20 28 6e 6f 6e 20 66 6f  ck local (non fo
12250 72 65 69 67 6e 20 6b 65 79 29 20 63 6f 6e 73 74  reign key) const
12260 72 61 69 6e 74 73 2c 0a 23 20 20 20 33 2e 20 55  raints,.#   3. U
12270 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20  pdate or delete 
12280 74 68 65 20 72 6f 77 20 69 6e 20 74 68 65 20 70  the row in the p
12290 61 72 65 6e 74 20 74 61 62 6c 65 2c 0a 23 20 20  arent table,.#  
122a0 20 34 2e 20 50 65 72 66 6f 72 6d 20 61 6e 79 20   4. Perform any 
122b0 72 65 71 75 69 72 65 64 20 66 6f 72 65 69 67 6e  required foreign
122c0 20 6b 65 79 20 61 63 74 69 6f 6e 73 2c 0a 23 20   key actions,.# 
122d0 20 20 35 2e 20 45 78 65 63 75 74 65 20 61 70 70    5. Execute app
122e0 6c 69 63 61 62 6c 65 20 41 46 54 45 52 20 74 72  licable AFTER tr
122f0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
12300 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
12310 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  es.do_test e_fke
12320 79 2d 35 31 2e 31 20 7b 0a 20 20 70 72 6f 63 20  y-51.1 {.  proc 
12330 6d 61 78 70 61 72 65 6e 74 20 7b 61 72 67 73 7d  maxparent {args}
12340 20 7b 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43   { db one {SELEC
12350 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 70 61  T max(x) FROM pa
12360 72 65 6e 74 7d 20 7d 0a 20 20 64 62 20 66 75 6e  rent} }.  db fun
12370 63 20 6d 61 78 70 61 72 65 6e 74 20 6d 61 78 70  c maxparent maxp
12380 61 72 65 6e 74 0a 0a 20 20 65 78 65 63 73 71 6c  arent..  execsql
12390 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
123a0 42 4c 45 20 70 61 72 65 6e 74 28 78 20 50 52 49  BLE parent(x PRI
123b0 4d 41 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20 20  MARY KEY);..    
123c0 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 62  CREATE TRIGGER b
123d0 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  u BEFORE UPDATE 
123e0 4f 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a  ON parent BEGIN.
123f0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
12400 4f 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28  O parent VALUES(
12410 6e 65 77 2e 78 2d 6f 6c 64 2e 78 29 3b 0a 20 20  new.x-old.x);.  
12420 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
12430 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28 0a 20  E TABLE child(. 
12440 20 20 20 20 20 61 20 44 45 46 41 55 4c 54 20 28       a DEFAULT (
12450 6d 61 78 70 61 72 65 6e 74 28 29 29 20 52 45 46  maxparent()) REF
12460 45 52 45 4e 43 45 53 20 70 61 72 65 6e 74 20 4f  ERENCES parent O
12470 4e 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46  N UPDATE SET DEF
12480 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  AULT.    );.    
12490 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61  CREATE TRIGGER a
124a0 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  u AFTER UPDATE O
124b0 4e 20 70 61 72 65 6e 74 20 42 45 47 49 4e 0a 20  N parent BEGIN. 
124c0 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
124d0 20 70 61 72 65 6e 74 20 56 41 4c 55 45 53 28 6e   parent VALUES(n
124e0 65 77 2e 78 2b 6f 6c 64 2e 78 29 3b 0a 20 20 20  ew.x+old.x);.   
124f0 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52   END;..    INSER
12500 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20 56 41  T INTO parent VA
12510 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53  LUES(1);.    INS
12520 45 52 54 20 49 4e 54 4f 20 63 68 69 6c 64 20 56  ERT INTO child V
12530 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 7d 20  ALUES(1);.  }.} 
12540 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
12550 79 2d 35 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-51.2 {.  execs
12560 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12570 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d 20 32  parent SET x = 2
12580 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
12590 46 52 4f 4d 20 70 61 72 65 6e 74 20 55 4e 49 4f  FROM parent UNIO
125a0 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27 78 78  N ALL SELECT 'xx
125b0 78 27 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  x' UNION ALL SEL
125c0 45 43 54 20 61 20 46 52 4f 4d 20 63 68 69 6c 64  ECT a FROM child
125d0 3b 0a 20 20 7d 0a 7d 20 7b 32 32 20 32 31 20 32  ;.  }.} {22 21 2
125e0 33 20 78 78 78 20 32 32 7d 0a 64 6f 5f 74 65 73  3 xxx 22}.do_tes
125f0 74 20 65 5f 66 6b 65 79 2d 35 31 2e 33 20 7b 0a  t e_fkey-51.3 {.
12600 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12610 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 69 6c  DELETE FROM chil
12620 64 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  d;.    DELETE FR
12630 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 49  OM parent;.    I
12640 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e  NSERT INTO paren
12650 74 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a 20 20  t VALUES(-1);.  
12660 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68    INSERT INTO ch
12670 69 6c 64 20 56 41 4c 55 45 53 28 2d 31 29 3b 0a  ild VALUES(-1);.
12680 20 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e      UPDATE paren
12690 74 20 53 45 54 20 78 20 3d 20 32 32 3b 0a 20 20  t SET x = 22;.  
126a0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
126b0 70 61 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c  parent UNION ALL
126c0 20 53 45 4c 45 43 54 20 27 78 78 78 27 20 55 4e   SELECT 'xxx' UN
126d0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61  ION ALL SELECT a
126e0 20 46 52 4f 4d 20 63 68 69 6c 64 3b 0a 20 20 7d   FROM child;.  }
126f0 0a 7d 20 7b 32 32 20 32 33 20 32 31 20 78 78 78  .} {22 23 21 xxx
12700 20 32 33 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   23}...#--------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  -.# Verify that 
12760 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
12770 73 20 6f 6e 6c 79 20 61 63 74 75 61 6c 6c 79 20  s only actually 
12780 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20 74 68  take place if th
12790 65 20 70 61 72 65 6e 74 20 6b 65 79 0a 23 20 69  e parent key.# i
127a0 73 20 73 65 74 20 74 6f 20 61 20 6e 65 77 20 76  s set to a new v
127b0 61 6c 75 65 20 74 68 61 74 20 69 73 20 64 69 73  alue that is dis
127c0 74 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20 6f  tinct from the o
127d0 6c 64 20 76 61 6c 75 65 2e 20 54 68 65 20 64 65  ld value. The de
127e0 66 61 75 6c 74 0a 23 20 63 6f 6c 6c 61 74 69 6f  fault.# collatio
127f0 6e 20 73 65 71 75 65 6e 63 65 20 61 6e 64 20 61  n sequence and a
12800 66 66 69 6e 69 74 79 20 61 72 65 20 75 73 65 64  ffinity are used
12810 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
12820 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 0a 23   the new value.#
12830 20 69 73 20 27 64 69 73 74 69 6e 63 74 27 20 66   is 'distinct' f
12840 72 6f 6d 20 74 68 65 20 6f 6c 64 20 6f 72 20 6e  rom the old or n
12850 6f 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ot..#.# EVIDENCE
12860 2d 4f 46 3a 20 52 2d 32 37 33 38 33 2d 31 30 32  -OF: R-27383-102
12870 34 36 20 41 6e 20 4f 4e 20 55 50 44 41 54 45 20  46 An ON UPDATE 
12880 61 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 74  action is only t
12890 61 6b 65 6e 20 69 66 20 74 68 65 0a 23 20 76 61  aken if the.# va
128a0 6c 75 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  lues of the pare
128b0 6e 74 20 6b 65 79 20 61 72 65 20 6d 6f 64 69 66  nt key are modif
128c0 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
128d0 6e 65 77 20 70 61 72 65 6e 74 20 6b 65 79 0a 23  new parent key.#
128e0 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
128f0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6c 64  equal to the old
12900 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
12910 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  les.do_test e_fk
12920 65 79 2d 35 32 2e 31 20 7b 0a 20 20 65 78 65 63  ey-52.1 {.  exec
12930 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
12940 20 54 41 42 4c 45 20 7a 65 75 73 28 61 20 49 4e   TABLE zeus(a IN
12950 54 45 47 45 52 20 43 4f 4c 4c 41 54 45 20 4e 4f  TEGER COLLATE NO
12960 43 41 53 45 2c 20 62 2c 20 50 52 49 4d 41 52 59  CASE, b, PRIMARY
12970 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
12980 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 70   CREATE TABLE ap
12990 6f 6c 6c 6f 28 63 2c 20 64 2c 20 0a 20 20 20 20  ollo(c, d, .    
129a0 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c    FOREIGN KEY(c,
129b0 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 7a   d) REFERENCES z
129c0 65 75 73 20 4f 4e 20 55 50 44 41 54 45 20 43 41  eus ON UPDATE CA
129d0 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20 20 20  SCADE.    );.   
129e0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 65 75   INSERT INTO zeu
129f0 73 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20  s VALUES('abc', 
12a00 27 78 79 7a 27 29 3b 0a 20 20 20 20 49 4e 53 45  'xyz');.    INSE
12a10 52 54 20 49 4e 54 4f 20 61 70 6f 6c 6c 6f 20 56  RT INTO apollo V
12a20 41 4c 55 45 53 28 27 41 42 43 27 2c 20 27 78 79  ALUES('ABC', 'xy
12a30 7a 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  z');.  }.  execs
12a40 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
12a50 7a 65 75 73 20 53 45 54 20 61 20 3d 20 27 61 42  zeus SET a = 'aB
12a60 63 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  c';.    SELECT *
12a70 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20   FROM apollo;.  
12a80 7d 0a 7d 20 7b 41 42 43 20 78 79 7a 7d 0a 64 6f  }.} {ABC xyz}.do
12a90 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e  _test e_fkey-52.
12aa0 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
12ab0 20 20 20 20 55 50 44 41 54 45 20 7a 65 75 73 20      UPDATE zeus 
12ac0 53 45 54 20 61 20 3d 20 31 2c 20 62 20 3d 20 31  SET a = 1, b = 1
12ad0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
12ae0 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a  ROM apollo;.  }.
12af0 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {1 1}.do_test 
12b00 65 5f 66 6b 65 79 2d 35 32 2e 33 20 7b 0a 20 20  e_fkey-52.3 {.  
12b10 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
12b20 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 61 20  DATE zeus SET a 
12b30 3d 20 31 2c 20 62 20 3d 20 31 3b 0a 20 20 20 20  = 1, b = 1;.    
12b40 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29  SELECT typeof(c)
12b50 2c 20 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20  , c, typeof(d), 
12b60 64 20 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20  d FROM apollo;. 
12b70 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20   }.} {integer 1 
12b80 69 6e 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65  integer 1}.do_te
12b90 73 74 20 65 5f 66 6b 65 79 2d 35 32 2e 34 20 7b  st e_fkey-52.4 {
12ba0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12bb0 20 55 50 44 41 54 45 20 7a 65 75 73 20 53 45 54   UPDATE zeus SET
12bc0 20 61 20 3d 20 27 31 27 3b 0a 20 20 20 20 53 45   a = '1';.    SE
12bd0 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20  LECT typeof(c), 
12be0 63 2c 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20  c, typeof(d), d 
12bf0 46 52 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d  FROM apollo;.  }
12c00 0a 7d 20 7b 69 6e 74 65 67 65 72 20 31 20 69 6e  .} {integer 1 in
12c10 74 65 67 65 72 20 31 7d 0a 64 6f 5f 74 65 73 74  teger 1}.do_test
12c20 20 65 5f 66 6b 65 79 2d 35 32 2e 35 20 7b 0a 20   e_fkey-52.5 {. 
12c30 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
12c40 50 44 41 54 45 20 7a 65 75 73 20 53 45 54 20 62  PDATE zeus SET b
12c50 20 3d 20 27 31 27 3b 0a 20 20 20 20 53 45 4c 45   = '1';.    SELE
12c60 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20 63 2c  CT typeof(c), c,
12c70 20 74 79 70 65 6f 66 28 64 29 2c 20 64 20 46 52   typeof(d), d FR
12c80 4f 4d 20 61 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d  OM apollo;.  }.}
12c90 20 7b 69 6e 74 65 67 65 72 20 31 20 74 65 78 74   {integer 1 text
12ca0 20 31 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b   1}.do_test e_fk
12cb0 65 79 2d 35 32 2e 36 20 7b 0a 20 20 65 78 65 63  ey-52.6 {.  exec
12cc0 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
12cd0 20 7a 65 75 73 20 53 45 54 20 62 20 3d 20 4e 55   zeus SET b = NU
12ce0 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  LL;.    SELECT t
12cf0 79 70 65 6f 66 28 63 29 2c 20 63 2c 20 74 79 70  ypeof(c), c, typ
12d00 65 6f 66 28 64 29 2c 20 64 20 46 52 4f 4d 20 61  eof(d), d FROM a
12d10 70 6f 6c 6c 6f 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  pollo;.  }.} {in
12d20 74 65 67 65 72 20 31 20 6e 75 6c 6c 20 7b 7d 7d  teger 1 null {}}
12d30 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
12d80 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35  VIDENCE-OF: R-35
12d90 31 32 39 2d 35 38 31 34 31 0a 23 0a 23 20 54 65  129-58141.#.# Te
12da0 73 74 20 61 6e 20 65 78 61 6d 70 6c 65 20 66 72  st an example fr
12db0 6f 6d 20 74 68 65 20 22 4f 4e 20 44 45 4c 45 54  om the "ON DELET
12dc0 45 20 61 6e 64 20 4f 4e 20 55 50 44 41 54 45 20  E and ON UPDATE 
12dd0 41 63 74 69 6f 6e 73 22 20 73 65 63 74 69 6f 6e  Actions" section
12de0 20 0a 23 20 6f 66 20 66 6f 72 65 69 67 6e 6b 65   .# of foreignke
12df0 79 73 2e 68 74 6d 6c 2e 20 54 68 69 73 20 65 78  ys.html. This ex
12e00 61 6d 70 6c 65 20 64 65 6d 6f 6e 73 74 72 61 74  ample demonstrat
12e10 65 73 20 74 68 61 74 20 4f 4e 20 55 50 44 41 54  es that ON UPDAT
12e20 45 20 61 63 74 69 6f 6e 73 0a 23 20 6f 6e 6c 79  E actions.# only
12e30 20 74 61 6b 65 20 70 6c 61 63 65 20 69 66 20 61   take place if a
12e40 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 72 65  t least one pare
12e50 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73  nt key column is
12e60 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
12e70 0a 23 20 74 68 61 74 20 69 73 20 64 69 73 74 69  .# that is disti
12e80 6e 63 74 20 66 72 6f 6d 20 69 74 73 20 70 72 65  nct from its pre
12e90 76 69 6f 75 73 20 76 61 6c 75 65 2e 0a 23 0a 64  vious value..#.d
12ea0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
12eb0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33  o_test e_fkey-53
12ec0 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
12ed0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
12ee0 45 20 70 61 72 65 6e 74 28 78 20 50 52 49 4d 41  E parent(x PRIMA
12ef0 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
12f00 41 54 45 20 54 41 42 4c 45 20 63 68 69 6c 64 28  ATE TABLE child(
12f10 79 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  y REFERENCES par
12f20 65 6e 74 20 4f 4e 20 55 50 44 41 54 45 20 53 45  ent ON UPDATE SE
12f30 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  T NULL);.    INS
12f40 45 52 54 20 49 4e 54 4f 20 70 61 72 65 6e 74 20  ERT INTO parent 
12f50 56 41 4c 55 45 53 28 27 6b 65 79 27 29 3b 0a 20  VALUES('key');. 
12f60 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
12f70 68 69 6c 64 20 56 41 4c 55 45 53 28 27 6b 65 79  hild VALUES('key
12f80 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
12f90 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 33 2e 32  test e_fkey-53.2
12fa0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
12fb0 20 20 20 55 50 44 41 54 45 20 70 61 72 65 6e 74     UPDATE parent
12fc0 20 53 45 54 20 78 20 3d 20 27 6b 65 79 27 3b 0a   SET x = 'key';.
12fd0 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c      SELECT IFNUL
12fe0 4c 28 79 2c 20 27 6e 75 6c 6c 27 29 20 46 52 4f  L(y, 'null') FRO
12ff0 4d 20 63 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b  M child;.  }.} {
13000 6b 65 79 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  key}.do_test e_f
13010 6b 65 79 2d 35 33 2e 33 20 7b 0a 20 20 65 78 65  key-53.3 {.  exe
13020 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
13030 45 20 70 61 72 65 6e 74 20 53 45 54 20 78 20 3d  E parent SET x =
13040 20 27 6b 65 79 32 27 3b 0a 20 20 20 20 53 45 4c   'key2';.    SEL
13050 45 43 54 20 49 46 4e 55 4c 4c 28 79 2c 20 27 6e  ECT IFNULL(y, 'n
13060 75 6c 6c 27 29 20 46 52 4f 4d 20 63 68 69 6c 64  ull') FROM child
13070 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a  ;.  }.} {null}..
13080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130c0 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23 20  ###########.### 
130d0 53 45 43 54 49 4f 4e 20 35 3a 20 43 52 45 41 54  SECTION 5: CREAT
130e0 45 2c 20 41 4c 54 45 52 20 61 6e 64 20 44 52 4f  E, ALTER and DRO
130f0 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 73  P TABLE commands
13100 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
13110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13130 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13140 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 2d  ############..#-
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13190 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
131a0 74 68 61 74 20 70 61 72 65 6e 74 20 6b 65 79 73  that parent keys
131b0 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65 64   are not checked
131c0 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61 72 65   when tables are
131d0 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45 56   created..#.# EV
131e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 30  IDENCE-OF: R-360
131f0 31 38 2d 32 31 37 35 35 20 54 68 65 20 70 61 72  18-21755 The par
13200 65 6e 74 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ent key definiti
13210 6f 6e 73 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b  ons of foreign k
13220 65 79 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73  ey.# constraints
13230 20 61 72 65 20 6e 6f 74 20 63 68 65 63 6b 65 64   are not checked
13240 20 77 68 65 6e 20 61 20 74 61 62 6c 65 20 69 73   when a table is
13250 20 63 72 65 61 74 65 64 2e 0a 23 0a 23 20 45 56   created..#.# EV
13260 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 33  IDENCE-OF: R-253
13270 38 34 2d 33 39 33 33 37 20 54 68 65 72 65 20 69  84-39337 There i
13280 73 20 6e 6f 74 68 69 6e 67 20 73 74 6f 70 70 69  s nothing stoppi
13290 6e 67 20 74 68 65 20 75 73 65 72 20 66 72 6f 6d  ng the user from
132a0 0a 23 20 63 72 65 61 74 69 6e 67 20 61 20 66 6f  .# creating a fo
132b0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
132c0 74 69 6f 6e 20 74 68 61 74 20 72 65 66 65 72 73  tion that refers
132d0 20 74 6f 20 61 20 70 61 72 65 6e 74 20 74 61 62   to a parent tab
132e0 6c 65 20 74 68 61 74 0a 23 20 64 6f 65 73 20 6e  le that.# does n
132f0 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 74 6f 20  ot exist, or to 
13300 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d  parent key colum
13310 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  ns that do not e
13320 78 69 73 74 20 6f 72 20 61 72 65 20 6e 6f 74 0a  xist or are not.
13330 23 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 62  # collectively b
13340 6f 75 6e 64 20 62 79 20 61 20 50 52 49 4d 41 52  ound by a PRIMAR
13350 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
13360 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 23 20  constraint..#.# 
13370 43 68 69 6c 64 20 6b 65 79 73 20 61 72 65 20 63  Child keys are c
13380 68 65 63 6b 65 64 20 74 6f 20 65 6e 73 75 72 65  hecked to ensure
13390 20 61 6c 6c 20 63 6f 6d 70 6f 6e 65 6e 74 20 63   all component c
133a0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 2e 20 49 66  olumns exist. If
133b0 20 70 61 72 65 6e 74 0a 23 20 6b 65 79 20 63 6f   parent.# key co
133c0 6c 75 6d 6e 73 20 61 72 65 20 65 78 70 6c 69 63  lumns are explic
133d0 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2c 20  itly specified, 
133e0 53 51 4c 69 74 65 20 63 68 65 63 6b 73 20 74 6f  SQLite checks to
133f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
13400 0a 23 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  .# are the same 
13410 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
13420 73 20 69 6e 20 74 68 65 20 63 68 69 6c 64 20 61  s in the child a
13430 6e 64 20 70 61 72 65 6e 74 20 6b 65 79 73 2e 20  nd parent keys. 
13440 28 54 4f 44 4f 3a 20 54 68 69 73 0a 23 20 69 73  (TODO: This.# is
13450 20 74 65 73 74 65 64 20 62 75 74 20 64 6f 65 73   tested but does
13460 20 6e 6f 74 20 63 6f 72 72 65 73 70 6f 6e 64 20   not correspond 
13470 74 6f 20 61 6e 79 20 74 65 73 74 61 62 6c 65 20  to any testable 
13480 73 74 61 74 65 6d 65 6e 74 2e 29 0a 23 0a 23 20  statement.).#.# 
13490 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 74  Also test that t
134a0 68 65 20 61 62 6f 76 65 20 73 74 61 74 65 6d 65  he above stateme
134b0 6e 74 73 20 61 72 65 20 74 72 75 65 20 72 65 67  nts are true reg
134c0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
134d0 65 72 20 6f 72 20 6e 6f 74 0a 23 20 66 6f 72 65  er or not.# fore
134e0 69 67 6e 20 6b 65 79 73 20 61 72 65 20 65 6e 61  ign keys are ena
134f0 62 6c 65 64 3a 20 20 22 41 20 43 52 45 41 54 45  bled:  "A CREATE
13500 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f   TABLE command o
13510 70 65 72 61 74 65 73 20 74 68 65 20 73 61 6d 65  perates the same
13520 20 77 68 65 74 68 65 72 0a 23 20 6f 72 20 6e 6f   whether.# or no
13530 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  t foreign key co
13540 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e  nstraints are en
13550 61 62 6c 65 64 2e 22 0a 23 0a 23 20 45 56 49 44  abled.".#.# EVID
13560 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 39 30 38  ENCE-OF: R-08908
13570 2d 32 33 34 33 39 20 41 20 43 52 45 41 54 45 20  -23439 A CREATE 
13580 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 20 6f 70  TABLE command op
13590 65 72 61 74 65 73 20 74 68 65 20 73 61 6d 65 0a  erates the same.
135a0 23 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  # whether or not
135b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
135c0 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e 61  straints are ena
135d0 62 6c 65 64 2e 0a 23 20 0a 66 6f 72 65 61 63 68  bled..# .foreach
135e0 20 7b 74 6e 20 7a 43 72 65 61 74 65 54 62 6c 20   {tn zCreateTbl 
135f0 6c 52 65 73 7d 20 7b 0a 20 20 31 20 22 43 52 45  lRes} {.  1 "CRE
13600 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13610 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
13620 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 30 20               {0 
13640 7b 7d 7d 0a 20 20 32 20 22 43 52 45 41 54 45 20  {}}.  2 "CREATE 
13650 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 52 45  TABLE t1(a, b RE
13660 46 45 52 45 4e 43 45 53 20 74 32 29 22 20 20 20  FERENCES t2)"   
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a           {0 {}}.
13690 20 20 33 20 22 43 52 45 41 54 45 20 54 41 42 4c    3 "CREATE TABL
136a0 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
136b0 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
136c0 52 45 4e 43 45 53 20 74 31 29 22 20 20 20 20 20  RENCES t1)"     
136d0 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 20       {0 {}}.  4 
136e0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
136f0 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
13700 45 59 28 61 2c 62 29 20 52 45 46 45 52 45 4e 43  EY(a,b) REFERENC
13710 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20 20  ES t2)"         
13720 20 7b 30 20 7b 7d 7d 0a 20 20 35 20 22 43 52 45   {0 {}}.  5 "CRE
13730 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
13740 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61  b, FOREIGN KEY(a
13750 2c 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,b) REFERENCES t
13760 32 29 22 20 20 20 20 20 20 20 20 20 20 7b 30 20  2)"          {0 
13770 7b 7d 7d 0a 20 20 36 20 22 43 52 45 41 54 45 20  {}}.  6 "CREATE 
13780 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 46  TABLE t1(a, b, F
13790 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 62 29 20  OREIGN KEY(a,b) 
137a0 52 45 46 45 52 45 4e 43 45 53 20 74 32 28 6e 2c  REFERENCES t2(n,
137b0 64 29 29 22 20 20 20 20 20 7b 30 20 7b 7d 7d 0a  d))"     {0 {}}.
137c0 20 20 37 20 22 43 52 45 41 54 45 20 54 41 42 4c    7 "CREATE TABL
137d0 45 20 74 31 28 61 2c 20 62 2c 20 46 4f 52 45 49  E t1(a, b, FOREI
137e0 47 4e 20 4b 45 59 28 61 2c 62 29 20 52 45 46 45  GN KEY(a,b) REFE
137f0 52 45 4e 43 45 53 20 74 31 28 61 2c 62 29 29 22  RENCES t1(a,b))"
13800 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 41       {0 {}}..  A
13810 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
13820 31 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  1(a, b, FOREIGN 
13830 4b 45 59 28 63 2c 62 29 20 52 45 46 45 52 45 4e  KEY(c,b) REFEREN
13840 43 45 53 20 74 32 29 22 20 20 20 20 20 20 20 20  CES t2)"        
13850 20 20 0a 20 20 20 20 20 7b 31 20 7b 75 6e 6b 6e    .     {1 {unkn
13860 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 63 22 20 69  own column "c" i
13870 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
13880 66 69 6e 69 74 69 6f 6e 7d 7d 0a 20 20 42 20 22  finition}}.  B "
13890 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
138a0 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b 45  a, b, FOREIGN KE
138b0 59 28 63 2c 62 29 20 52 45 46 45 52 45 4e 43 45  Y(c,b) REFERENCE
138c0 53 20 74 32 28 64 29 29 22 20 20 20 20 20 20 20  S t2(d))"       
138d0 20 20 20 0a 20 20 20 20 20 7b 31 20 7b 6e 75 6d     .     {1 {num
138e0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
138f0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
13900 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
13910 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
13920 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
13930 6e 63 65 64 20 74 61 62 6c 65 7d 7d 0a 7d 20 7b  nced table}}.} {
13940 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
13950 79 2d 35 34 2e 24 74 6e 2e 6f 66 66 20 7b 0a 20  y-54.$tn.off {. 
13960 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c     drop_all_tabl
13970 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  es.    execsql {
13980 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
13990 65 79 73 20 3d 20 4f 46 46 7d 0a 20 20 20 20 63  eys = OFF}.    c
139a0 61 74 63 68 73 71 6c 20 24 7a 43 72 65 61 74 65  atchsql $zCreate
139b0 54 62 6c 0a 20 20 7d 20 24 6c 52 65 73 0a 20 20  Tbl.  } $lRes.  
139c0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
139d0 34 2e 24 74 6e 2e 6f 6e 20 7b 0a 20 20 20 20 64  4.$tn.on {.    d
139e0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
139f0 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47     execsql {PRAG
13a00 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
13a10 3d 20 4f 4e 7d 0a 20 20 20 20 63 61 74 63 68 73  = ON}.    catchs
13a20 71 6c 20 24 7a 43 72 65 61 74 65 54 62 6c 0a 20  ql $zCreateTbl. 
13a30 20 7d 20 24 6c 52 65 73 0a 7d 0a 0a 23 2d 2d 2d   } $lRes.}..#---
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a80 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45 4e 43  ------.# EVIDENC
13a90 45 2d 4f 46 3a 20 52 2d 34 37 39 35 32 2d 36 32  E-OF: R-47952-62
13aa0 34 39 38 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  498 It is not po
13ab0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
13ac0 65 20 22 41 4c 54 45 52 20 54 41 42 4c 45 0a 23  e "ALTER TABLE.#
13ad0 20 2e 2e 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 22   ... ADD COLUMN"
13ae0 20 73 79 6e 74 61 78 20 74 6f 20 61 64 64 20 61   syntax to add a
13af0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6e 63   column that inc
13b00 6c 75 64 65 73 20 61 20 52 45 46 45 52 45 4e 43  ludes a REFERENC
13b10 45 53 0a 23 20 63 6c 61 75 73 65 2c 20 75 6e 6c  ES.# clause, unl
13b20 65 73 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  ess the default 
13b30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65 77  value of the new
13b40 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
13b50 20 41 74 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f   Attempting.# to
13b60 20 64 6f 20 73 6f 20 72 65 74 75 72 6e 73 20 61   do so returns a
13b70 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 72 6f 63 20  n error..#.proc 
13b80 74 65 73 74 5f 65 66 6b 65 79 5f 36 20 7b 74 6e  test_efkey_6 {tn
13b90 20 7a 41 6c 74 65 72 20 69 73 45 72 72 6f 72 7d   zAlter isError}
13ba0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
13bb0 62 6c 65 73 20 0a 0a 20 20 64 6f 5f 74 65 73 74  bles ..  do_test
13bc0 20 65 5f 66 6b 65 79 2d 35 36 2e 24 74 6e 2e 31   e_fkey-56.$tn.1
13bd0 20 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   ".    execsql {
13be0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
13bf0 6c 28 61 2c 20 62 29 20 7d 0a 20 20 20 20 5b 6c  l(a, b) }.    [l
13c00 69 73 74 20 63 61 74 63 68 73 71 6c 20 24 7a 41  ist catchsql $zA
13c10 6c 74 65 72 5d 0a 20 20 22 20 5b 6c 69 6e 64 65  lter].  " [linde
13c20 78 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 43 61  x {{0 {}} {1 {Ca
13c30 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
13c40 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
13c50 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
13c60 6c 74 20 76 61 6c 75 65 7d 7d 7d 20 24 69 73 45  lt value}}} $isE
13c70 72 72 6f 72 5d 0a 0a 7d 0a 0a 74 65 73 74 5f 65  rror]..}..test_e
13c80 66 6b 65 79 5f 36 20 31 20 22 41 4c 54 45 52 20  fkey_6 1 "ALTER 
13c90 54 41 42 4c 45 20 74 62 6c 20 41 44 44 20 43 4f  TABLE tbl ADD CO
13ca0 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43 45  LUMN c REFERENCE
13cb0 53 20 78 78 22 20 30 0a 74 65 73 74 5f 65 66 6b  S xx" 0.test_efk
13cc0 65 79 5f 36 20 32 20 22 41 4c 54 45 52 20 54 41  ey_6 2 "ALTER TA
13cd0 42 4c 45 20 74 62 6c 20 41 44 44 20 43 4f 4c 55  BLE tbl ADD COLU
13ce0 4d 4e 20 63 20 44 45 46 41 55 4c 54 20 4e 55 4c  MN c DEFAULT NUL
13cf0 4c 20 52 45 46 45 52 45 4e 43 45 53 20 78 78 22  L REFERENCES xx"
13d00 20 30 0a 74 65 73 74 5f 65 66 6b 65 79 5f 36 20   0.test_efkey_6 
13d10 33 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  3 "ALTER TABLE t
13d20 62 6c 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20  bl ADD COLUMN c 
13d30 44 45 46 41 55 4c 54 20 30 20 52 45 46 45 52 45  DEFAULT 0 REFERE
13d40 4e 43 45 53 20 78 78 22 20 31 0a 0a 23 2d 2d 2d  NCES xx" 1..#---
13d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d90 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
13da0 61 74 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61  at ALTER TABLE a
13db0 64 6a 75 73 74 73 20 52 45 46 45 52 45 4e 43 45  djusts REFERENCE
13dc0 53 20 63 6c 61 75 73 65 73 20 77 68 65 6e 20 74  S clauses when t
13dd0 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 0a  he parent table.
13de0 23 20 69 73 20 52 45 4e 41 4d 45 44 2e 0a 23 0a  # is RENAMED..#.
13df0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
13e00 2d 34 37 30 38 30 2d 30 32 30 36 39 20 49 66 20  -47080-02069 If 
13e10 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  an "ALTER TABLE 
13e20 2e 2e 2e 20 52 45 4e 41 4d 45 20 54 4f 22 20 63  ... RENAME TO" c
13e30 6f 6d 6d 61 6e 64 0a 23 20 69 73 20 75 73 65 64  ommand.# is used
13e40 20 74 6f 20 72 65 6e 61 6d 65 20 61 20 74 61 62   to rename a tab
13e50 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20 70  le that is the p
13e60 61 72 65 6e 74 20 74 61 62 6c 65 20 6f 66 20 6f  arent table of o
13e70 6e 65 20 6f 72 20 6d 6f 72 65 0a 23 20 66 6f 72  ne or more.# for
13e80 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
13e90 69 6e 74 73 2c 20 74 68 65 20 64 65 66 69 6e 69  ints, the defini
13ea0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  tions of the for
13eb0 65 69 67 6e 20 6b 65 79 0a 23 20 63 6f 6e 73 74  eign key.# const
13ec0 72 61 69 6e 74 73 20 61 72 65 20 6d 6f 64 69 66  raints are modif
13ed0 69 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  ied to refer to 
13ee0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
13ef0 20 62 79 20 69 74 73 20 6e 65 77 20 6e 61 6d 65   by its new name
13f00 0a 23 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  .#.# Test that t
13f10 68 65 73 65 20 61 64 6a 75 73 74 6d 65 6e 74 73  hese adjustments
13f20 20 61 72 65 20 76 69 73 69 62 6c 65 20 69 6e 20   are visible in 
13f30 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13f40 72 20 74 61 62 6c 65 2e 0a 23 0a 23 20 45 56 49  r table..#.# EVI
13f50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 38 32  DENCE-OF: R-6382
13f60 37 2d 35 34 37 37 34 20 54 68 65 20 74 65 78 74  7-54774 The text
13f70 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 43 52   of the child CR
13f80 45 41 54 45 20 54 41 42 4c 45 0a 23 20 73 74 61  EATE TABLE.# sta
13f90 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65 6d  tement or statem
13fa0 65 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ents stored in t
13fb0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
13fc0 20 74 61 62 6c 65 20 61 72 65 20 6d 6f 64 69 66   table are modif
13fd0 69 65 64 0a 23 20 74 6f 20 72 65 66 6c 65 63 74  ied.# to reflect
13fe0 20 74 68 65 20 6e 65 77 20 70 61 72 65 6e 74 20   the new parent 
13ff0 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 23 0a 64 6f  table name..#.do
14000 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e  _test e_fkey-56.
14010 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  1 {.  drop_all_t
14020 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20  ables.  execsql 
14030 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
14040 4c 45 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  LE 'p 1 "parent 
14050 6f 6e 65 22 27 28 61 20 52 45 46 45 52 45 4e 43  one"'(a REFERENC
14060 45 53 20 27 70 20 31 20 22 70 61 72 65 6e 74 20  ES 'p 1 "parent 
14070 6f 6e 65 22 27 2c 20 62 2c 20 50 52 49 4d 41 52  one"', b, PRIMAR
14080 59 20 4b 45 59 28 62 29 29 3b 0a 0a 20 20 20 20  Y KEY(b));..    
14090 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28  CREATE TABLE c1(
140a0 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45 53 20  c, d REFERENCES 
140b0 27 70 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65  'p 1 "parent one
140c0 22 27 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53  "' ON UPDATE CAS
140d0 43 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54  CADE);.    CREAT
140e0 45 20 54 41 42 4c 45 20 63 32 28 65 2c 20 66 2c  E TABLE c2(e, f,
140f0 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66 29 20   FOREIGN KEY(f) 
14100 52 45 46 45 52 45 4e 43 45 53 20 27 70 20 31 20  REFERENCES 'p 1 
14110 22 70 61 72 65 6e 74 20 6f 6e 65 22 27 20 4f 4e  "parent one"' ON
14120 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
14130 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14140 4c 45 20 63 33 28 65 2c 20 27 66 20 63 6f 6c 20  LE c3(e, 'f col 
14150 32 27 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  2', FOREIGN KEY(
14160 27 66 20 63 6f 6c 20 32 27 29 20 52 45 46 45 52  'f col 2') REFER
14170 45 4e 43 45 53 20 27 70 20 31 20 22 70 61 72 65  ENCES 'p 1 "pare
14180 6e 74 20 6f 6e 65 22 27 20 4f 4e 20 55 50 44 41  nt one"' ON UPDA
14190 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a 20 20  TE CASCADE);..  
141a0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 70    INSERT INTO 'p
141b0 20 31 20 22 70 61 72 65 6e 74 20 6f 6e 65 22 27   1 "parent one"'
141c0 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20   VALUES(1, 1);. 
141d0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
141e0 31 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a  1 VALUES(1, 1);.
141f0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14200 63 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b  c2 VALUES(1, 1);
14210 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
14220 20 63 33 20 56 41 4c 55 45 53 28 31 2c 20 31 29   c3 VALUES(1, 1)
14230 3b 0a 0a 20 20 20 20 2d 2d 20 43 52 45 41 54 45  ;..    -- CREATE
14240 20 54 41 42 4c 45 20 71 28 61 2c 20 62 2c 20 50   TABLE q(a, b, P
14250 52 49 4d 41 52 59 20 4b 45 59 28 62 29 29 3b 0a  RIMARY KEY(b));.
14260 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
14270 20 65 5f 66 6b 65 79 2d 35 36 2e 32 20 7b 0a 20   e_fkey-56.2 {. 
14280 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45 52   execsql { ALTER
14290 20 54 41 42 4c 45 20 27 70 20 31 20 22 70 61 72   TABLE 'p 1 "par
142a0 65 6e 74 20 6f 6e 65 22 27 20 52 45 4e 41 4d 45  ent one"' RENAME
142b0 20 54 4f 20 70 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   TO p }.} {}.do_
142c0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36 2e 33  test e_fkey-56.3
142d0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
142e0 20 20 20 55 50 44 41 54 45 20 70 20 53 45 54 20     UPDATE p SET 
142f0 61 20 3d 20 27 78 78 78 27 2c 20 62 20 3d 20 27  a = 'xxx', b = '
14300 78 78 78 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  xxx';.    SELECT
14310 20 2a 20 46 52 4f 4d 20 70 3b 0a 20 20 20 20 53   * FROM p;.    S
14320 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b  ELECT * FROM c1;
14330 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
14340 4f 4d 20 63 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM c2;.    SELEC
14350 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d  T * FROM c3;.  }
14360 0a 7d 20 7b 78 78 78 20 78 78 78 20 31 20 78 78  .} {xxx xxx 1 xx
14370 78 20 31 20 78 78 78 20 31 20 78 78 78 7d 0a 64  x 1 xxx 1 xxx}.d
14380 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 36  o_test e_fkey-56
14390 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
143a0 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
143b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
143c0 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
143d0 6c 65 27 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20  le'}.} [list    
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14420 20 5c 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42   \.  {CREATE TAB
14430 4c 45 20 22 70 22 28 61 20 52 45 46 45 52 45 4e  LE "p"(a REFEREN
14440 43 45 53 20 22 70 22 2c 20 62 2c 20 50 52 49 4d  CES "p", b, PRIM
14450 41 52 59 20 4b 45 59 28 62 29 29 7d 20 20 20 20  ARY KEY(b))}    
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
14470 0a 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  .  {CREATE TABLE
14480 20 63 31 28 63 2c 20 64 20 52 45 46 45 52 45 4e   c1(c, d REFEREN
14490 43 45 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54  CES "p" ON UPDAT
144a0 45 20 43 41 53 43 41 44 45 29 7d 20 20 20 20 20  E CASCADE)}     
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
144c0 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   {CREATE TABLE c
144d0 32 28 65 2c 20 66 2c 20 46 4f 52 45 49 47 4e 20  2(e, f, FOREIGN 
144e0 4b 45 59 28 66 29 20 52 45 46 45 52 45 4e 43 45  KEY(f) REFERENCE
144f0 53 20 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20  S "p" ON UPDATE 
14500 43 41 53 43 41 44 45 29 7d 20 20 5c 0a 20 20 7b  CASCADE)}  \.  {
14510 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28  CREATE TABLE c3(
14520 65 2c 20 27 66 20 63 6f 6c 20 32 27 2c 20 46 4f  e, 'f col 2', FO
14530 52 45 49 47 4e 20 4b 45 59 28 27 66 20 63 6f 6c  REIGN KEY('f col
14540 20 32 27 29 20 52 45 46 45 52 45 4e 43 45 53 20   2') REFERENCES 
14550 22 70 22 20 4f 4e 20 55 50 44 41 54 45 20 43 41  "p" ON UPDATE CA
14560 53 43 41 44 45 29 7d 20 5c 0a 5d 0a 0a 23 2d 2d  SCADE)} \.]..#--
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
145c0 74 68 61 74 20 61 20 44 52 4f 50 20 54 41 42 4c  that a DROP TABL
145d0 45 20 64 6f 65 73 20 61 6e 20 69 6d 70 6c 69 63  E does an implic
145e0 69 74 20 44 45 4c 45 54 45 20 46 52 4f 4d 2e 20  it DELETE FROM. 
145f0 57 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 0a 23  Which does not.#
14600 20 63 61 75 73 65 20 61 6e 79 20 74 72 69 67 67   cause any trigg
14610 65 72 73 20 74 6f 20 66 69 72 65 2c 20 62 75 74  ers to fire, but
14620 20 64 6f 65 73 20 66 69 72 65 20 66 6f 72 65 69   does fire forei
14630 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 2e 0a  gn key actions..
14640 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
14650 20 52 2d 31 34 32 30 38 2d 32 33 39 38 36 20 49   R-14208-23986 I
14660 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  f foreign key co
14670 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 65 6e  nstraints are en
14680 61 62 6c 65 64 20 77 68 65 6e 0a 23 20 69 74 20  abled when.# it 
14690 69 73 20 70 72 65 70 61 72 65 64 2c 20 74 68 65  is prepared, the
146a0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
146b0 61 6e 64 20 70 65 72 66 6f 72 6d 73 20 61 6e 20  and performs an 
146c0 69 6d 70 6c 69 63 69 74 20 44 45 4c 45 54 45 20  implicit DELETE 
146d0 74 6f 0a 23 20 72 65 6d 6f 76 65 20 61 6c 6c 20  to.# remove all 
146e0 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 74 61  rows from the ta
146f0 62 6c 65 20 62 65 66 6f 72 65 20 64 72 6f 70 70  ble before dropp
14700 69 6e 67 20 69 74 2e 0a 23 0a 23 20 45 56 49 44  ing it..#.# EVID
14710 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 30 37 38  ENCE-OF: R-11078
14720 2d 30 33 39 34 35 20 54 68 65 20 69 6d 70 6c 69  -03945 The impli
14730 63 69 74 20 44 45 4c 45 54 45 20 64 6f 65 73 20  cit DELETE does 
14740 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 53 51  not cause any SQ
14750 4c 0a 23 20 74 72 69 67 67 65 72 73 20 74 6f 20  L.# triggers to 
14760 66 69 72 65 2c 20 62 75 74 20 6d 61 79 20 69 6e  fire, but may in
14770 76 6f 6b 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  voke foreign key
14780 20 61 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6e 73   actions or cons
14790 74 72 61 69 6e 74 0a 23 20 76 69 6f 6c 61 74 69  traint.# violati
147a0 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65  ons..#.do_test e
147b0 5f 66 6b 65 79 2d 35 37 2e 31 20 7b 0a 20 20 64  _fkey-57.1 {.  d
147c0 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
147d0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
147e0 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c  REATE TABLE p(a,
147f0 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
14800 61 2c 20 62 29 29 3b 0a 0a 20 20 20 20 43 52 45  a, b));..    CRE
14810 41 54 45 20 54 41 42 4c 45 20 63 31 28 63 2c 20  ATE TABLE c1(c, 
14820 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
14830 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14840 70 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  p ON DELETE SET 
14850 4e 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41 54  NULL);.    CREAT
14860 45 20 54 41 42 4c 45 20 63 32 28 63 2c 20 64 2c  E TABLE c2(c, d,
14870 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
14880 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
14890 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
148a0 46 41 55 4c 54 29 3b 0a 20 20 20 20 43 52 45 41  FAULT);.    CREA
148b0 54 45 20 54 41 42 4c 45 20 63 33 28 63 2c 20 64  TE TABLE c3(c, d
148c0 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c  , FOREIGN KEY(c,
148d0 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   d) REFERENCES p
148e0 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
148f0 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  DE);.    CREATE 
14900 54 41 42 4c 45 20 63 34 28 63 2c 20 64 2c 20 46  TABLE c4(c, d, F
14910 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
14920 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
14930 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
14940 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
14950 42 4c 45 20 63 35 28 63 2c 20 64 2c 20 46 4f 52  BLE c5(c, d, FOR
14960 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29 20 52  EIGN KEY(c, d) R
14970 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44  EFERENCES p ON D
14980 45 4c 45 54 45 20 4e 4f 20 41 43 54 49 4f 4e 29  ELETE NO ACTION)
14990 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
149a0 42 4c 45 20 63 36 28 63 2c 20 64 2c 20 0a 20 20  BLE c6(c, d, .  
149b0 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
149c0 63 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  c, d) REFERENCES
149d0 20 70 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53   p ON DELETE RES
149e0 54 52 49 43 54 20 0a 20 20 20 20 20 20 44 45 46  TRICT .      DEF
149f0 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
14a00 59 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29  Y DEFERRED.    )
14a10 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
14a20 4c 45 20 63 37 28 63 2c 20 64 2c 20 0a 20 20 20  LE c7(c, d, .   
14a30 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63     FOREIGN KEY(c
14a40 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
14a50 70 20 4f 4e 20 44 45 4c 45 54 45 20 4e 4f 20 41  p ON DELETE NO A
14a60 43 54 49 4f 4e 0a 20 20 20 20 20 20 44 45 46 45  CTION.      DEFE
14a70 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
14a80 20 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b   DEFERRED.    );
14a90 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
14aa0 4c 45 20 6c 6f 67 28 6d 73 67 29 3b 0a 20 20 20  LE log(msg);.   
14ab0 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
14ac0 74 74 20 41 46 54 45 52 20 44 45 4c 45 54 45 20  tt AFTER DELETE 
14ad0 4f 4e 20 70 20 42 45 47 49 4e 0a 20 20 20 20 20  ON p BEGIN.     
14ae0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
14af0 20 56 41 4c 55 45 53 28 27 64 65 6c 65 74 65 20   VALUES('delete 
14b00 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 29 3b  ' || old.rowid);
14b10 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
14b20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b  {}..do_test e_fk
14b30 65 79 2d 35 37 2e 32 20 7b 0a 20 20 65 78 65 63  ey-57.2 {.  exec
14b40 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
14b50 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27   INTO p VALUES('
14b60 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e  a', 'b');.    IN
14b70 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c  SERT INTO c1 VAL
14b80 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
14b90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
14ba0 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  2 VALUES('a', 'b
14bb0 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
14bc0 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 27 61  NTO c3 VALUES('a
14bd0 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 42 45 47  ', 'b');.    BEG
14be0 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  IN;.      DROP T
14bf0 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45  ABLE p;.      SE
14c00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 3b 0a  LECT * FROM c1;.
14c10 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f    }.} {{} {}}.do
14c20 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e  _test e_fkey-57.
14c30 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
14c40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 32  SELECT * FROM c2
14c50 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 7d 0a 64 6f 5f   }.} {{} {}}.do_
14c60 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 37 2e 34  test e_fkey-57.4
14c70 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
14c80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33 20  ELECT * FROM c3 
14c90 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65  }.} {}.do_test e
14ca0 5f 66 6b 65 79 2d 35 37 2e 35 20 7b 0a 20 20 65  _fkey-57.5 {.  e
14cb0 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
14cc0 2a 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 7d 20 7b  * FROM log }.} {
14cd0 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
14ce0 2d 35 37 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -57.6 {.  execsq
14cf0 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d 0a  l ROLLBACK.} {}.
14d00 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14d10 37 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.7 {.  execsql 
14d20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
14d30 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70     DELETE FROM p
14d40 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
14d50 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 52   FROM log;.    R
14d60 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
14d70 7b 64 65 6c 65 74 65 20 31 7d 7d 0a 0a 23 2d 2d  {delete 1}}..#--
14d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 66 20 61 6e 20  -------.# If an 
14dd0 49 4d 4d 45 44 49 41 54 45 20 66 6f 72 65 69 67  IMMEDIATE foreig
14de0 6e 20 6b 65 79 20 66 61 69 6c 73 20 61 73 20 61  n key fails as a
14df0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 44 52 4f   result of a DRO
14e00 50 20 54 41 42 4c 45 2c 20 74 68 65 0a 23 20 44  P TABLE, the.# D
14e10 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
14e20 64 20 66 61 69 6c 73 2e 0a 23 0a 23 20 45 56 49  d fails..#.# EVI
14e30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32 37 36  DENCE-OF: R-3276
14e40 38 2d 34 37 39 32 35 20 49 66 20 61 6e 20 69 6d  8-47925 If an im
14e50 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
14e60 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  key constraint i
14e70 73 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74 68  s.# violated, th
14e80 65 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  e DROP TABLE sta
14e90 74 65 6d 65 6e 74 20 66 61 69 6c 73 20 61 6e 64  tement fails and
14ea0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   the table is no
14eb0 74 20 64 72 6f 70 70 65 64 2e 0a 23 0a 64 6f 5f  t dropped..#.do_
14ec0 74 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 31  test e_fkey-58.1
14ed0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
14ee0 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
14ef0 63 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  c1;.    DELETE F
14f00 52 4f 4d 20 63 32 3b 0a 20 20 20 20 44 45 4c 45  ROM c2;.    DELE
14f10 54 45 20 46 52 4f 4d 20 63 33 3b 0a 20 20 7d 0a  TE FROM c3;.  }.
14f20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
14f30 52 54 20 49 4e 54 4f 20 63 35 20 56 41 4c 55 45  RT INTO c5 VALUE
14f40 53 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20  S('a', 'b') }.  
14f50 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
14f60 54 41 42 4c 45 20 70 20 7d 0a 7d 20 7b 31 20 7b  TABLE p }.} {1 {
14f70 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
14f80 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
14f90 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
14fa0 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.2 {.  execsql 
14fb0 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
14fc0 70 20 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74  p }.} {a b}.do_t
14fd0 65 73 74 20 65 5f 66 6b 65 79 2d 35 38 2e 33 20  est e_fkey-58.3 
14fe0 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
14ff0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
15000 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
15010 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
15020 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
15030 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
15040 65 5f 66 6b 65 79 2d 35 38 2e 34 20 7b 0a 20 20  e_fkey-58.4 {.  
15050 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
15060 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 3b 0a 20  LECT * FROM p;. 
15070 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
15080 20 63 35 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   c5;.    ROLLBAC
15090 4b 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20 61 20  K;.  }.} {a b a 
150a0 62 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  b}..#-----------
150b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
150f0 20 49 66 20 61 20 44 45 46 45 52 52 45 44 20 66   If a DEFERRED f
15100 6f 72 65 69 67 6e 20 6b 65 79 20 66 61 69 6c 73  oreign key fails
15110 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15120 61 20 44 52 4f 50 20 54 41 42 4c 45 2c 20 61 74  a DROP TABLE, at
15130 74 65 6d 70 74 69 6e 67 0a 23 20 74 6f 20 63 6f  tempting.# to co
15140 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
15150 74 69 6f 6e 20 66 61 69 6c 73 20 75 6e 6c 65 73  tion fails unles
15160 73 20 74 68 65 20 76 69 6f 6c 61 74 69 6f 6e 20  s the violation 
15170 69 73 20 66 69 78 65 64 2e 0a 23 0a 23 20 45 56  is fixed..#.# EV
15180 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 39  IDENCE-OF: R-059
15190 30 33 2d 30 38 34 36 30 20 49 66 20 61 20 64 65  03-08460 If a de
151a0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
151b0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  ey constraint is
151c0 0a 23 20 76 69 6f 6c 61 74 65 64 2c 20 74 68 65  .# violated, the
151d0 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  n an error is re
151e0 70 6f 72 74 65 64 20 77 68 65 6e 20 74 68 65 20  ported when the 
151f0 75 73 65 72 20 61 74 74 65 6d 70 74 73 20 74 6f  user attempts to
15200 20 63 6f 6d 6d 69 74 0a 23 20 74 68 65 20 74 72   commit.# the tr
15210 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
15220 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
15230 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
15240 6e 73 20 73 74 69 6c 6c 20 65 78 69 73 74 0a 23  ns still exist.#
15250 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
15260 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  #.do_test e_fkey
15270 2d 35 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -59.1 {.  execsq
15280 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20  l { .    DELETE 
15290 46 52 4f 4d 20 63 31 20 3b 20 44 45 4c 45 54 45  FROM c1 ; DELETE
152a0 20 46 52 4f 4d 20 63 32 20 3b 20 44 45 4c 45 54   FROM c2 ; DELET
152b0 45 20 46 52 4f 4d 20 63 33 20 3b 0a 20 20 20 20  E FROM c3 ;.    
152c0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 34 20 3b  DELETE FROM c4 ;
152d0 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 35 20   DELETE FROM c5 
152e0 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 36  ; DELETE FROM c6
152f0 20 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   ;.    DELETE FR
15300 4f 4d 20 63 37 20 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM c7 .  }.} {}.
15310 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 35  do_test e_fkey-5
15320 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
15330 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 37  { INSERT INTO c7
15340 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
15350 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ) }.  execsql {.
15360 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
15370 20 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20   DROP TABLE p;. 
15380 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
15390 65 5f 66 6b 65 79 2d 35 39 2e 33 20 7b 0a 20 20  e_fkey-59.3 {.  
153a0 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
153b0 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
153c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
153d0 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  led}}.do_test e_
153e0 66 6b 65 79 2d 35 39 2e 34 20 7b 0a 20 20 65 78  fkey-59.4 {.  ex
153f0 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
15400 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52 49  ABLE p(a, b, PRI
15410 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 20  MARY KEY(a, b)) 
15420 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d  }.  catchsql COM
15430 4d 49 54 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  MIT.} {1 {foreig
15440 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
15450 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
15460 74 20 65 5f 66 6b 65 79 2d 35 39 2e 35 20 7b 0a  t e_fkey-59.5 {.
15470 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
15480 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53  RT INTO p VALUES
15490 28 27 61 27 2c 20 27 62 27 29 20 7d 0a 20 20 65  ('a', 'b') }.  e
154a0 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
154b0 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
15500 20 41 6e 79 20 22 66 6f 72 65 69 67 6e 20 6b 65   Any "foreign ke
15510 79 20 6d 69 73 6d 61 74 63 68 22 20 65 72 72 6f  y mismatch" erro
15520 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  rs encountered w
15530 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 61 6e 20  hile running an 
15540 69 6d 70 6c 69 63 69 74 0a 23 20 22 44 45 4c 45  implicit.# "DELE
15550 54 45 20 46 52 4f 4d 20 74 62 6c 22 20 61 72 65  TE FROM tbl" are
15560 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 23 20 45 56   ignored..#.# EV
15570 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 32  IDENCE-OF: R-572
15580 34 32 2d 33 37 30 30 35 20 41 6e 79 20 22 66 6f  42-37005 Any "fo
15590 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74  reign key mismat
155a0 63 68 22 20 65 72 72 6f 72 73 0a 23 20 65 6e 63  ch" errors.# enc
155b0 6f 75 6e 74 65 72 65 64 20 61 73 20 70 61 72 74  ountered as part
155c0 20 6f 66 20 61 6e 20 69 6d 70 6c 69 63 69 74 20   of an implicit 
155d0 44 45 4c 45 54 45 20 61 72 65 20 69 67 6e 6f 72  DELETE are ignor
155e0 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
155f0 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 65 5f  ables.do_test e_
15600 66 6b 65 79 2d 36 30 2e 31 20 7b 0a 20 20 65 78  fkey-60.1 {.  ex
15610 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
15620 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
15630 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43 52 45 41  = OFF;..    CREA
15640 54 45 20 54 41 42 4c 45 20 70 28 61 20 50 52 49  TE TABLE p(a PRI
15650 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
15660 52 45 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62  RENCES nosuchtab
15670 6c 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  le);.    CREATE 
15680 54 41 42 4c 45 20 63 31 28 63 2c 20 64 2c 20 46  TABLE c1(c, d, F
15690 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20 64 29  OREIGN KEY(c, d)
156a0 20 52 45 46 45 52 45 4e 43 45 53 20 61 29 3b 0a   REFERENCES a);.
156b0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
156c0 20 63 32 28 63 20 52 45 46 45 52 45 4e 43 45 53   c2(c REFERENCES
156d0 20 70 28 62 29 2c 20 64 29 3b 0a 20 20 20 20 43   p(b), d);.    C
156e0 52 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 63  REATE TABLE c3(c
156f0 20 52 45 46 45 52 45 4e 43 45 53 20 70 20 4f 4e   REFERENCES p ON
15700 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c   DELETE SET NULL
15710 2c 20 64 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52  , d);..    INSER
15720 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28  T INTO p VALUES(
15730 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
15740 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
15750 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
15760 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45  RT INTO c2 VALUE
15770 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
15780 45 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55  ERT INTO c3 VALU
15790 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20  ES(1, 2);.  }.} 
157a0 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  {}.do_test e_fke
157b0 79 2d 36 30 2e 32 20 7b 0a 20 20 65 78 65 63 73  y-60.2 {.  execs
157c0 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  ql { PRAGMA fore
157d0 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a  ign_keys = ON }.
157e0 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
157f0 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b  ETE FROM p }.} {
15800 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
15810 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62  : main.nosuchtab
15820 6c 65 7d 7d 0a 0a 0a 62 72 65 61 6b 70 6f 69 6e  le}}...breakpoin
15830 74 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  t.execsql { PRAG
15840 4d 41 20 74 72 61 63 65 20 3d 20 31 20 7d 0a 65  MA trace = 1 }.e
15850 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  xecsql { DROP TA
15860 42 4c 45 20 70 20 7d 0a 65 78 65 63 73 71 6c 20  BLE p }.execsql 
15870 7b 20 50 52 41 47 4d 41 20 74 72 61 63 65 20 3d  { PRAGMA trace =
15880 20 30 20 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 65   0 }...do_test e
15890 5f 66 6b 65 79 2d 36 30 2e 33 20 7b 0a 20 20 65  _fkey-60.3 {.  e
158a0 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
158b0 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  IN;.      DROP T
158c0 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53 45  ABLE p;.      SE
158d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 33 3b 0a  LECT * FROM c3;.
158e0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
158f0 7d 0a 7d 20 7b 7b 7d 20 32 7d 0a 64 6f 5f 74 65  }.} {{} 2}.do_te
15900 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 34 20 7b  st e_fkey-60.4 {
15910 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
15920 41 54 45 20 54 41 42 4c 45 20 6e 6f 73 75 63 68  ATE TABLE nosuch
15930 74 61 62 6c 65 28 78 20 50 52 49 4d 41 52 59 20  table(x PRIMARY 
15940 4b 45 59 29 20 7d 0a 20 20 63 61 74 63 68 73 71  KEY) }.  catchsq
15950 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
15960 70 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  p }.} {1 {foreig
15970 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
15980 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
15990 36 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  60.5 {.  execsql
159a0 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 63 31   { DROP TABLE c1
159b0 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
159c0 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 20 7d 0a  DELETE FROM p }.
159d0 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
159e0 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f  y mismatch}}.do_
159f0 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 30 2e 36  test e_fkey-60.6
15a00 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
15a10 52 4f 50 20 54 41 42 4c 45 20 63 32 20 7d 0a 20  ROP TABLE c2 }. 
15a20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
15a30 45 20 46 52 4f 4d 20 70 20 7d 0a 7d 20 7b 7d 0a  E FROM p }.} {}.
15a40 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
15a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
15a90 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63  st that the spec
15aa0 69 61 6c 20 62 65 68 61 76 69 6f 75 72 73 20 6f  ial behaviours o
15ab0 66 20 41 4c 54 45 52 20 61 6e 64 20 44 52 4f 50  f ALTER and DROP
15ac0 20 54 41 42 4c 45 20 61 72 65 20 6f 6e 6c 79 0a   TABLE are only.
15ad0 23 20 61 63 74 69 76 61 74 65 64 20 77 68 65 6e  # activated when
15ae0 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 72   foreign keys ar
15af0 65 20 65 6e 61 62 6c 65 64 2e 20 53 70 65 63 69  e enabled. Speci
15b00 61 6c 20 62 65 68 61 76 69 6f 75 72 73 20 61 72  al behaviours ar
15b10 65 3a 0a 23 0a 23 20 20 20 31 2e 20 41 44 44 20  e:.#.#   1. ADD 
15b20 43 4f 4c 55 4d 4e 20 6e 6f 74 20 61 6c 6c 6f 77  COLUMN not allow
15b30 69 6e 67 20 61 20 52 45 46 45 52 45 4e 43 45 53  ing a REFERENCES
15b40 20 63 6c 61 75 73 65 20 77 69 74 68 20 61 20 6e   clause with a n
15b50 6f 6e 2d 4e 55 4c 4c 20 0a 23 20 20 20 20 20 20  on-NULL .#      
15b60 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 0a 23  default value..#
15b70 20 20 20 32 2e 20 4d 6f 64 69 66 79 69 6e 67 20     2. Modifying 
15b80 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15b90 6e 69 74 69 6f 6e 73 20 77 68 65 6e 20 61 20 70  nitions when a p
15ba0 61 72 65 6e 74 20 74 61 62 6c 65 20 69 73 20 52  arent table is R
15bb0 45 4e 41 4d 45 64 2e 0a 23 20 20 20 33 2e 20 52  ENAMEd..#   3. R
15bc0 75 6e 6e 69 6e 67 20 61 6e 20 69 6d 70 6c 69 63  unning an implic
15bd0 69 74 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  it DELETE FROM c
15be0 6f 6d 6d 61 6e 64 20 61 73 20 70 61 72 74 20 6f  ommand as part o
15bf0 66 20 44 52 4f 50 20 54 41 42 4c 45 2e 0a 23 0a  f DROP TABLE..#.
15c00 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
15c10 2d 35 34 31 34 32 2d 34 31 33 34 36 20 54 68 65  -54142-41346 The
15c20 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 74   properties of t
15c30 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20 61 6e  he DROP TABLE an
15c40 64 20 41 4c 54 45 52 0a 23 20 54 41 42 4c 45 20  d ALTER.# TABLE 
15c50 63 6f 6d 6d 61 6e 64 73 20 64 65 73 63 72 69 62  commands describ
15c60 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 20 61 70  ed above only ap
15c70 70 6c 79 20 69 66 20 66 6f 72 65 69 67 6e 20 6b  ply if foreign k
15c80 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2e  eys are enabled.
15c90 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .#.do_test e_fke
15ca0 79 2d 36 31 2e 31 2e 31 20 7b 0a 20 20 64 72 6f  y-61.1.1 {.  dro
15cb0 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
15cc0 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
15cd0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 20 7d  TABLE t1(a, b) }
15ce0 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c  .  catchsql { AL
15cf0 54 45 52 20 54 41 42 4c 45 20 74 31 20 41 44 44  TER TABLE t1 ADD
15d00 20 43 4f 4c 55 4d 4e 20 63 20 44 45 46 41 55 4c   COLUMN c DEFAUL
15d10 54 20 27 78 78 78 27 20 52 45 46 45 52 45 4e 43  T 'xxx' REFERENC
15d20 45 53 20 74 32 20 7d 0a 7d 20 7b 31 20 7b 43 61  ES t2 }.} {1 {Ca
15d30 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
15d40 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
15d50 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
15d60 6c 74 20 76 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65  lt value}}.do_te
15d70 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 32  st e_fkey-61.1.2
15d80 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
15d90 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
15da0 79 73 20 3d 20 4f 46 46 20 7d 0a 20 20 65 78 65  ys = OFF }.  exe
15db0 63 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  csql { ALTER TAB
15dc0 4c 45 20 74 31 20 41 44 44 20 43 4f 4c 55 4d 4e  LE t1 ADD COLUMN
15dd0 20 63 20 44 45 46 41 55 4c 54 20 27 78 78 78 27   c DEFAULT 'xxx'
15de0 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 20 7d   REFERENCES t2 }
15df0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
15e00 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
15e10 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
15e20 20 6e 61 6d 65 20 3d 20 27 74 31 27 20 7d 0a 7d   name = 't1' }.}
15e30 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20   {{CREATE TABLE 
15e40 74 31 28 61 2c 20 62 2c 20 63 20 44 45 46 41 55  t1(a, b, c DEFAU
15e50 4c 54 20 27 78 78 78 27 20 52 45 46 45 52 45 4e  LT 'xxx' REFEREN
15e60 43 45 53 20 74 32 29 7d 7d 0a 64 6f 5f 74 65 73  CES t2)}}.do_tes
15e70 74 20 65 5f 66 6b 65 79 2d 36 31 2e 31 2e 33 20  t e_fkey-61.1.3 
15e80 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
15e90 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
15ea0 73 20 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64  s = ON }.} {}..d
15eb0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31  o_test e_fkey-61
15ec0 2e 32 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  .2.1 {.  drop_al
15ed0 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73  l_tables.  execs
15ee0 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
15ef0 54 41 42 4c 45 20 70 28 61 20 55 4e 49 51 55 45  TABLE p(a UNIQUE
15f00 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
15f10 42 4c 45 20 63 28 62 20 52 45 46 45 52 45 4e 43  BLE c(b REFERENC
15f20 45 53 20 70 28 61 29 29 3b 0a 20 20 20 20 42 45  ES p(a));.    BE
15f30 47 49 4e 3b 0a 20 20 20 20 20 20 41 4c 54 45 52  GIN;.      ALTER
15f40 20 54 41 42 4c 45 20 70 20 52 45 4e 41 4d 45 20   TABLE p RENAME 
15f50 54 4f 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 20  TO parent;.     
15f60 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
15f70 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
15f80 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 63 27 3b  HERE name = 'c';
15f90 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
15fa0 20 7d 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54 41   }.} {{CREATE TA
15fb0 42 4c 45 20 63 28 62 20 52 45 46 45 52 45 4e 43  BLE c(b REFERENC
15fc0 45 53 20 22 70 61 72 65 6e 74 22 28 61 29 29 7d  ES "parent"(a))}
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 32 2e 32 20 7b 0a 20 20 65 78 65 63  -61.2.2 {.  exec
15ff0 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
16000 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
16010 4f 46 46 3b 0a 20 20 20 20 41 4c 54 45 52 20 54  OFF;.    ALTER T
16020 41 42 4c 45 20 70 20 52 45 4e 41 4d 45 20 54 4f  ABLE p RENAME TO
16030 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 53 45 4c   parent;.    SEL
16040 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
16050 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
16060 20 6e 61 6d 65 20 3d 20 27 63 27 3b 0a 20 20 7d   name = 'c';.  }
16070 0a 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c  .} {{CREATE TABL
16080 45 20 63 28 62 20 52 45 46 45 52 45 4e 43 45 53  E c(b REFERENCES
16090 20 70 28 61 29 29 7d 7d 0a 64 6f 5f 74 65 73 74   p(a))}}.do_test
160a0 20 65 5f 66 6b 65 79 2d 36 31 2e 32 2e 33 20 7b   e_fkey-61.2.3 {
160b0 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
160c0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
160d0 20 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f   = ON }.} {}..do
160e0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e  _test e_fkey-61.
160f0 33 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  3.1 {.  drop_all
16100 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71  _tables.  execsq
16110 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
16120 41 42 4c 45 20 70 28 61 20 55 4e 49 51 55 45 29  ABLE p(a UNIQUE)
16130 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
16140 4c 45 20 63 28 62 20 52 45 46 45 52 45 4e 43 45  LE c(b REFERENCE
16150 53 20 70 28 61 29 20 4f 4e 20 44 45 4c 45 54 45  S p(a) ON DELETE
16160 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20 20 20 20   SET NULL);.    
16170 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41  INSERT INTO p VA
16180 4c 55 45 53 28 27 78 27 29 3b 0a 20 20 20 20 49  LUES('x');.    I
16190 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c  NSERT INTO c VAL
161a0 55 45 53 28 27 78 27 29 3b 0a 20 20 20 20 42 45  UES('x');.    BE
161b0 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  GIN;.      DROP 
161c0 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 20 20 53  TABLE p;.      S
161d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 3b 0a  ELECT * FROM c;.
161e0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
161f0 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74  }.} {{}}.do_test
16200 20 65 5f 66 6b 65 79 2d 36 31 2e 33 2e 32 20 7b   e_fkey-61.3.2 {
16210 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16220 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
16230 6b 65 79 73 20 3d 20 4f 46 46 3b 0a 20 20 20 20  keys = OFF;.    
16240 44 52 4f 50 20 54 41 42 4c 45 20 70 3b 0a 20 20  DROP TABLE p;.  
16250 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16260 63 3b 0a 20 20 7d 0a 7d 20 7b 78 7d 0a 64 6f 5f  c;.  }.} {x}.do_
16270 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 31 2e 33  test e_fkey-61.3
16280 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
16290 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
162a0 6b 65 79 73 20 3d 20 4f 4e 20 7d 0a 7d 20 7b 7d  keys = ON }.} {}
162b0 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
162c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
162f0 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
16300 23 20 53 45 43 54 49 4f 4e 20 36 3a 20 4c 69 6d  # SECTION 6: Lim
16310 69 74 73 20 61 6e 64 20 55 6e 73 75 70 70 6f 72  its and Unsuppor
16320 74 65 64 20 46 65 61 74 75 72 65 73 0a 23 23 23  ted Features.###
16330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16370 23 23 23 23 23 23 23 23 0a 0a 23 2d 2d 2d 2d 2d  ########..#-----
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163c0 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
163d0 20 4d 41 54 43 48 20 63 6c 61 75 73 65 73 20 61   MATCH clauses a
163e0 72 65 20 70 61 72 73 65 64 2c 20 62 75 74 20 53  re parsed, but S
163f0 51 4c 69 74 65 20 74 72 65 61 74 73 20 65 76 65  QLite treats eve
16400 72 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 23  ry foreign key.#
16410 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 73 20 69   constraint as i
16420 66 20 69 74 20 77 65 72 65 20 22 4d 41 54 43 48  f it were "MATCH
16430 20 53 49 4d 50 4c 45 22 2e 0a 23 0a 23 20 45 56   SIMPLE"..#.# EV
16440 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 37  IDENCE-OF: R-247
16450 32 38 2d 31 33 32 33 30 20 53 51 4c 69 74 65 20  28-13230 SQLite 
16460 70 61 72 73 65 73 20 4d 41 54 43 48 20 63 6c 61  parses MATCH cla
16470 75 73 65 73 20 28 69 2e 65 2e 20 64 6f 65 73 20  uses (i.e. does 
16480 6e 6f 74 0a 23 20 72 65 70 6f 72 74 20 61 20 73  not.# report a s
16490 79 6e 74 61 78 20 65 72 72 6f 72 20 69 66 20 79  yntax error if y
164a0 6f 75 20 73 70 65 63 69 66 79 20 6f 6e 65 29 2c  ou specify one),
164b0 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 65 6e   but does not en
164c0 66 6f 72 63 65 20 74 68 65 6d 2e 0a 23 0a 23 20  force them..#.# 
164d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
164e0 34 34 35 30 2d 34 36 31 37 34 20 41 6c 6c 20 66  4450-46174 All f
164f0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
16500 72 61 69 6e 74 73 20 69 6e 20 53 51 4c 69 74 65  raints in SQLite
16510 20 61 72 65 0a 23 20 68 61 6e 64 6c 65 64 20 61   are.# handled a
16520 73 20 69 66 20 4d 41 54 43 48 20 53 49 4d 50 4c  s if MATCH SIMPL
16530 45 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  E were specified
16540 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7a 4d 61 74  ..#.foreach zMat
16550 63 68 20 5b 6c 69 73 74 20 53 49 4d 50 4c 45 20  ch [list SIMPLE 
16560 50 41 52 54 49 41 4c 20 46 55 4c 4c 20 53 69 6d  PARTIAL FULL Sim
16570 70 6c 65 20 70 61 72 54 49 41 4c 20 46 75 4c 4c  ple parTIAL FuLL
16580 20 5d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f   ] {.  drop_all_
16590 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74  tables.  do_test
165a0 20 65 5f 66 6b 65 79 2d 36 32 2e 24 7a 4d 61 74   e_fkey-62.$zMat
165b0 63 68 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  ch.1 {.    execs
165c0 71 6c 20 22 0a 20 20 20 20 20 20 43 52 45 41 54  ql ".      CREAT
165d0 45 20 54 41 42 4c 45 20 63 28 64 2c 20 65 2c 20  E TABLE c(d, e, 
165e0 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 65  f, FOREIGN KEY(e
165f0 2c 20 66 29 20 52 45 46 45 52 45 4e 43 45 53 20  , f) REFERENCES 
16600 70 20 4d 41 54 43 48 20 24 7a 4d 61 74 63 68 29  p MATCH $zMatch)
16610 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
16620 41 42 4c 45 20 70 28 61 2c 20 62 2c 20 63 2c 20  ABLE p(a, b, c, 
16630 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63  PRIMARY KEY(b, c
16640 29 29 3b 0a 20 20 20 20 22 0a 20 20 7d 20 7b 7d  ));.    ".  } {}
16650 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  .  do_test e_fke
16660 79 2d 36 32 2e 24 7a 4d 61 74 63 68 2e 32 20 7b  y-62.$zMatch.2 {
16670 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
16680 4e 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c  NSERT INTO p VAL
16690 55 45 53 28 31 2c 20 32 2c 20 33 29 20 20 20 20  UES(1, 2, 3)    
166a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 4d 41       }..    # MA
166b0 54 43 48 20 53 49 4d 50 4c 45 20 62 65 68 61 76  TCH SIMPLE behav
166c0 69 6f 75 72 3a 20 41 6c 6c 6f 77 20 61 6e 79 20  iour: Allow any 
166d0 63 68 69 6c 64 20 6b 65 79 20 74 68 61 74 20 63  child key that c
166e0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
166f0 6f 72 65 0a 20 20 20 20 23 20 4e 55 4c 4c 20 76  ore.    # NULL v
16700 61 6c 75 65 20 74 6f 20 62 65 20 69 6e 73 65 72  alue to be inser
16710 74 65 64 2e 20 4e 6f 6e 2d 4e 55 4c 4c 20 76 61  ted. Non-NULL va
16720 6c 75 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65  lues do not have
16730 20 74 6f 20 6d 61 70 20 74 6f 20 61 6e 79 0a 20   to map to any. 
16740 20 20 20 23 20 70 61 72 65 6e 74 20 6b 65 79 20     # parent key 
16750 76 61 6c 75 65 73 2c 20 73 6f 20 6c 6f 6e 67 20  values, so long 
16760 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
16770 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 68 69  field of the chi
16780 6c 64 20 6b 65 79 20 69 73 0a 20 20 20 20 23 20  ld key is.    # 
16790 4e 55 4c 4c 2e 0a 20 20 20 20 65 78 65 63 73 71  NULL..    execsq
167a0 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
167b0 63 20 56 41 4c 55 45 53 28 27 77 27 2c 20 32 2c  c VALUES('w', 2,
167c0 20 33 29 20 20 20 20 20 20 20 7d 0a 20 20 20 20   3)       }.    
167d0 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
167e0 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27   INTO c VALUES('
167f0 78 27 2c 20 27 78 27 2c 20 4e 55 4c 4c 29 20 20  x', 'x', NULL)  
16800 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
16810 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
16820 4c 55 45 53 28 27 79 27 2c 20 4e 55 4c 4c 2c 20  LUES('y', NULL, 
16830 27 78 27 29 20 20 7d 0a 20 20 20 20 65 78 65 63  'x')  }.    exec
16840 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
16850 4f 20 63 20 56 41 4c 55 45 53 28 27 7a 27 2c 20  O c VALUES('z', 
16860 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 0a 20  NULL, NULL) }.. 
16870 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20     # Check that 
16880 74 68 65 20 46 4b 20 69 73 20 65 6e 66 6f 72 63  the FK is enforc
16890 65 64 20 70 72 6f 70 65 72 6c 79 20 69 66 20 74  ed properly if t
168a0 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c  here are no NULL
168b0 20 76 61 6c 75 65 73 20 0a 20 20 20 20 23 20 69   values .    # i
168c0 6e 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  n the child key 
168d0 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 63 61 74  columns..    cat
168e0 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
168f0 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 27 61 27  NTO c VALUES('a'
16900 2c 20 32 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31  , 2, 4) }.  } {1
16910 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
16920 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
16930 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16980 23 20 54 65 73 74 20 74 68 61 74 20 53 51 4c 69  # Test that SQLi
16990 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  te does not supp
169a0 6f 72 74 20 74 68 65 20 53 45 54 20 43 4f 4e 53  ort the SET CONS
169b0 54 52 41 49 4e 54 20 73 74 61 74 65 6d 65 6e 74  TRAINT statement
169c0 2e 20 41 6e 64 0a 23 20 74 68 61 74 20 69 74 20  . And.# that it 
169d0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  is possible to c
169e0 72 65 61 74 65 20 62 6f 74 68 20 69 6d 6d 65 64  reate both immed
169f0 69 61 74 65 20 61 6e 64 20 64 65 66 65 72 72 65  iate and deferre
16a00 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23  d constraints..#
16a10 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
16a20 52 2d 32 31 35 39 39 2d 31 36 30 33 38 20 49 6e  R-21599-16038 In
16a30 20 53 51 4c 69 74 65 2c 20 61 20 66 6f 72 65 69   SQLite, a forei
16a40 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
16a50 74 20 69 73 0a 23 20 70 65 72 6d 61 6e 65 6e 74  t is.# permanent
16a60 6c 79 20 6d 61 72 6b 65 64 20 61 73 20 64 65 66  ly marked as def
16a70 65 72 72 65 64 20 6f 72 20 69 6d 6d 65 64 69 61  erred or immedia
16a80 74 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  te when it is cr
16a90 65 61 74 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c  eated..#.drop_al
16aa0 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
16ab0 20 65 5f 66 6b 65 79 2d 36 32 2e 31 20 7b 0a 20   e_fkey-62.1 {. 
16ac0 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 54 20   catchsql { SET 
16ad0 43 4f 4e 53 54 52 41 49 4e 54 53 20 41 4c 4c 20  CONSTRAINTS ALL 
16ae0 49 4d 4d 45 44 49 41 54 45 20 7d 0a 7d 20 7b 31  IMMEDIATE }.} {1
16af0 20 7b 6e 65 61 72 20 22 53 45 54 22 3a 20 73 79   {near "SET": sy
16b00 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f  ntax error}}.do_
16b10 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e 32  test e_fkey-62.2
16b20 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
16b30 53 45 54 20 43 4f 4e 53 54 52 41 49 4e 54 53 20  SET CONSTRAINTS 
16b40 41 4c 4c 20 44 45 46 45 52 52 45 44 20 7d 0a 7d  ALL DEFERRED }.}
16b50 20 7b 31 20 7b 6e 65 61 72 20 22 53 45 54 22 3a   {1 {near "SET":
16b60 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a   syntax error}}.
16b70 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
16b80 36 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  62.3 {.  execsql
16b90 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
16ba0 42 4c 45 20 70 28 61 2c 20 62 2c 20 50 52 49 4d  BLE p(a, b, PRIM
16bb0 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
16bc0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16bd0 20 63 64 28 63 2c 20 64 2c 20 0a 20 20 20 20 20   cd(c, d, .     
16be0 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
16bf0 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
16c00 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
16c10 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a  ALLY DEFERRED);.
16c20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
16c30 20 63 69 28 63 2c 20 64 2c 20 0a 20 20 20 20 20   ci(c, d, .     
16c40 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 2c 20   FOREIGN KEY(c, 
16c50 64 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 20  d) REFERENCES p 
16c60 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49  DEFERRABLE INITI
16c70 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 29 3b  ALLY IMMEDIATE);
16c80 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 7d 0a  .    BEGIN;.  }.
16c90 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66  } {}.do_test e_f
16ca0 6b 65 79 2d 36 32 2e 34 20 7b 0a 20 20 63 61 74  key-62.4 {.  cat
16cb0 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
16cc0 4e 54 4f 20 63 69 20 56 41 4c 55 45 53 28 27 78  NTO ci VALUES('x
16cd0 27 2c 20 27 79 27 29 20 7d 0a 7d 20 7b 31 20 7b  ', 'y') }.} {1 {
16ce0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
16cf0 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
16d00 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
16d10 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.5 {.  catchsql
16d20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
16d30 64 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79  d VALUES('x', 'y
16d40 27 29 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  ') }.} {0 {}}.do
16d50 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 32 2e  _test e_fkey-62.
16d60 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
16d70 20 43 4f 4d 4d 49 54 20 7d 0a 7d 20 7b 31 20 7b   COMMIT }.} {1 {
16d80 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
16d90 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
16da0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
16db0 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.7 {.  execsql 
16dc0 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  { .    DELETE FR
16dd0 4f 4d 20 63 64 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM cd;.    COMMI
16de0 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d  T;.  }.} {}..#--
16df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e30 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
16e40 68 61 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  hat the maximum 
16e50 72 65 63 75 72 73 69 6f 6e 20 64 65 70 74 68 20  recursion depth 
16e60 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61  of foreign key a
16e70 63 74 69 6f 6e 20 70 72 6f 67 72 61 6d 73 20 69  ction programs i
16e80 73 0a 23 20 67 6f 76 65 72 6e 65 64 20 62 79 20  s.# governed by 
16e90 74 68 65 20 53 51 4c 49 54 45 34 5f 4d 41 58 5f  the SQLITE4_MAX_
16ea0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 61 6e  TRIGGER_DEPTH an
16eb0 64 20 53 51 4c 49 54 45 34 5f 4c 49 4d 49 54 5f  d SQLITE4_LIMIT_
16ec0 54 52 49 47 47 45 52 5f 44 45 50 54 48 0a 23 20  TRIGGER_DEPTH.# 
16ed0 73 65 74 74 69 6e 67 73 2e 0a 23 0a 23 20 45 56  settings..#.# EV
16ee0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 32  IDENCE-OF: R-422
16ef0 36 34 2d 33 30 35 30 33 20 54 68 65 20 53 51 4c  64-30503 The SQL
16f00 49 54 45 34 5f 4d 41 58 5f 54 52 49 47 47 45 52  ITE4_MAX_TRIGGER
16f10 5f 44 45 50 54 48 20 61 6e 64 0a 23 20 53 51 4c  _DEPTH and.# SQL
16f20 49 54 45 34 5f 4c 49 4d 49 54 5f 54 52 49 47 47  ITE4_LIMIT_TRIGG
16f30 45 52 5f 44 45 50 54 48 20 73 65 74 74 69 6e 67  ER_DEPTH setting
16f40 73 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  s determine the 
16f50 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  maximum allowabl
16f60 65 0a 23 20 64 65 70 74 68 20 6f 66 20 74 72 69  e.# depth of tri
16f70 67 67 65 72 20 70 72 6f 67 72 61 6d 20 72 65 63  gger program rec
16f80 75 72 73 69 6f 6e 2e 20 46 6f 72 20 74 68 65 20  ursion. For the 
16f90 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 65 73  purposes of thes
16fa0 65 20 6c 69 6d 69 74 73 2c 0a 23 20 66 6f 72 65  e limits,.# fore
16fb0 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 20  ign key actions 
16fc0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
16fd0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
16fe0 0a 23 0a 70 72 6f 63 20 74 65 73 74 5f 6f 6e 5f  .#.proc test_on_
16ff0 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f 6e  delete_recursion
17000 20 7b 6c 69 6d 69 74 7d 20 7b 0a 20 20 64 72 6f   {limit} {.  dro
17010 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
17020 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
17030 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
17040 54 41 42 4c 45 20 74 30 28 61 20 50 52 49 4d 41  TABLE t0(a PRIMA
17050 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
17060 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56  INSERT INTO t0 V
17070 41 4c 55 45 53 28 27 78 30 27 2c 20 4e 55 4c 4c  ALUES('x0', NULL
17080 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65  );.  }.  for {se
17090 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20 24 6c  t i 1} {$i <= $l
170a0 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  imit} {incr i} {
170b0 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
170c0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
170d0 45 20 74 24 69 20 28 0a 20 20 20 20 20 20 20 20  E t$i (.        
170e0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
170f0 20 52 45 46 45 52 45 4e 43 45 53 20 74 5b 65 78   REFERENCES t[ex
17100 70 72 20 24 69 2d 31 5d 20 4f 4e 20 44 45 4c 45  pr $i-1] ON DELE
17110 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20 20  TE CASCADE.     
17120 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54   );.      INSERT
17130 20 49 4e 54 4f 20 74 24 69 20 56 41 4c 55 45 53   INTO t$i VALUES
17140 28 27 78 24 69 27 2c 20 27 78 5b 65 78 70 72 20  ('x$i', 'x[expr 
17150 24 69 2d 31 5d 27 29 3b 0a 20 20 20 20 22 0a 20  $i-1]');.    ". 
17160 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   }.  execsql COM
17170 4d 49 54 0a 20 20 63 61 74 63 68 73 71 6c 20 22  MIT.  catchsql "
17180 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
17190 20 74 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t0;.    SELECT 
171a0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 24  count(*) FROM t$
171b0 6c 69 6d 69 74 3b 0a 20 20 22 0a 7d 0a 70 72 6f  limit;.  ".}.pro
171c0 63 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65  c test_on_update
171d0 5f 72 65 63 75 72 73 69 6f 6e 20 7b 6c 69 6d 69  _recursion {limi
171e0 74 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  t} {.  drop_all_
171f0 74 61 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c  tables.  execsql
17200 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
17210 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
17220 74 30 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t0(a PRIMARY KEY
17230 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
17240 54 4f 20 74 30 20 56 41 4c 55 45 53 28 27 78 78  TO t0 VALUES('xx
17250 78 27 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b  x');.  }.  for {
17260 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20  set i 1} {$i <= 
17270 24 6c 69 6d 69 74 7d 20 7b 69 6e 63 72 20 69 7d  $limit} {incr i}
17280 20 7b 0a 20 20 20 20 73 65 74 20 6a 20 5b 65 78   {.    set j [ex
17290 70 72 20 24 69 2d 31 5d 0a 0a 20 20 20 20 65 78  pr $i-1]..    ex
172a0 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 43 52  ecsql ".      CR
172b0 45 41 54 45 20 54 41 42 4c 45 20 74 24 69 20 28  EATE TABLE t$i (
172c0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45  a PRIMARY KEY RE
172d0 46 45 52 45 4e 43 45 53 20 74 24 6a 20 4f 4e 20  FERENCES t$j ON 
172e0 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
172f0 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17300 54 4f 20 74 24 69 20 56 41 4c 55 45 53 28 27 78  TO t$i VALUES('x
17310 78 78 27 29 3b 0a 20 20 20 20 22 0a 20 20 7d 0a  xx');.    ".  }.
17320 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
17330 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20  .  catchsql ".  
17340 20 20 55 50 44 41 54 45 20 74 30 20 53 45 54 20    UPDATE t0 SET 
17350 61 20 3d 20 27 79 79 79 27 3b 0a 20 20 20 20 53  a = 'yyy';.    S
17360 45 4c 45 43 54 20 4e 4f 54 20 28 61 3d 27 79 79  ELECT NOT (a='yy
17370 79 27 29 20 46 52 4f 4d 20 74 24 6c 69 6d 69 74  y') FROM t$limit
17380 3b 0a 20 20 22 0a 7d 0a 0a 64 6f 5f 74 65 73 74  ;.  ".}..do_test
17390 20 65 5f 66 6b 65 79 2d 36 33 2e 31 2e 31 20 7b   e_fkey-63.1.1 {
173a0 0a 20 20 74 65 73 74 5f 6f 6e 5f 64 65 6c 65 74  .  test_on_delet
173b0 65 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51 4c  e_recursion $SQL
173c0 49 54 45 34 5f 4d 41 58 5f 54 52 49 47 47 45 52  ITE4_MAX_TRIGGER
173d0 5f 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d 0a 64  _DEPTH.} {0 0}.d
173e0 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33  o_test e_fkey-63
173f0 2e 31 2e 32 20 7b 0a 20 20 74 65 73 74 5f 6f 6e  .1.2 {.  test_on
17400 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73 69 6f  _delete_recursio
17410 6e 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 34  n [expr $SQLITE4
17420 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
17430 54 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f 20  TH+1].} {1 {too 
17440 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
17450 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
17460 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
17470 79 2d 36 33 2e 31 2e 33 20 7b 0a 20 20 73 71 6c  y-63.1.3 {.  sql
17480 69 74 65 34 5f 6c 69 6d 69 74 20 64 62 20 53 51  ite4_limit db SQ
17490 4c 49 54 45 34 5f 4c 49 4d 49 54 5f 54 52 49 47  LITE4_LIMIT_TRIG
174a0 47 45 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65  GER_DEPTH 5.  te
174b0 73 74 5f 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63  st_on_delete_rec
174c0 75 72 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d  ursion 5.} {0 0}
174d0 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d  .do_test e_fkey-
174e0 36 33 2e 31 2e 34 20 7b 0a 20 20 74 65 73 74 5f  63.1.4 {.  test_
174f0 6f 6e 5f 64 65 6c 65 74 65 5f 72 65 63 75 72 73  on_delete_recurs
17500 69 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20  ion 6.} {1 {too 
17510 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
17520 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
17530 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65  }}.do_test e_fke
17540 79 2d 36 33 2e 31 2e 35 20 7b 0a 20 20 73 71 6c  y-63.1.5 {.  sql
17550 69 74 65 34 5f 6c 69 6d 69 74 20 64 62 20 53 51  ite4_limit db SQ
17560 4c 49 54 45 34 5f 4c 49 4d 49 54 5f 54 52 49 47  LITE4_LIMIT_TRIG
17570 47 45 52 5f 44 45 50 54 48 20 31 30 30 30 30 30  GER_DEPTH 100000
17580 30 0a 7d 20 7b 35 7d 0a 64 6f 5f 74 65 73 74 20  0.} {5}.do_test 
17590 65 5f 66 6b 65 79 2d 36 33 2e 32 2e 31 20 7b 0a  e_fkey-63.2.1 {.
175a0 20 20 74 65 73 74 5f 6f 6e 5f 75 70 64 61 74 65    test_on_update
175b0 5f 72 65 63 75 72 73 69 6f 6e 20 24 53 51 4c 49  _recursion $SQLI
175c0 54 45 34 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  TE4_MAX_TRIGGER_
175d0 44 45 50 54 48 0a 7d 20 7b 30 20 30 7d 0a 64 6f  DEPTH.} {0 0}.do
175e0 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36 33 2e  _test e_fkey-63.
175f0 32 2e 32 20 7b 0a 20 20 74 65 73 74 5f 6f 6e 5f  2.2 {.  test_on_
17600 75 70 64 61 74 65 5f 72 65 63 75 72 73 69 6f 6e  update_recursion
17610 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 34 5f   [expr $SQLITE4_
17620 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
17630 48 2b 31 5d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d  H+1].} {1 {too m
17640 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
17650 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
17660 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
17670 2d 36 33 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69  -63.2.3 {.  sqli
17680 74 65 34 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te4_limit db SQL
17690 49 54 45 34 5f 4c 49 4d 49 54 5f 54 52 49 47 47  ITE4_LIMIT_TRIGG
176a0 45 52 5f 44 45 50 54 48 20 35 0a 20 20 74 65 73  ER_DEPTH 5.  tes
176b0 74 5f 6f 6e 5f 75 70 64 61 74 65 5f 72 65 63 75  t_on_update_recu
176c0 72 73 69 6f 6e 20 35 0a 7d 20 7b 30 20 30 7d 0a  rsion 5.} {0 0}.
176d0 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79 2d 36  do_test e_fkey-6
176e0 33 2e 32 2e 34 20 7b 0a 20 20 74 65 73 74 5f 6f  3.2.4 {.  test_o
176f0 6e 5f 75 70 64 61 74 65 5f 72 65 63 75 72 73 69  n_update_recursi
17700 6f 6e 20 36 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d  on 6.} {1 {too m
17710 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
17720 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
17730 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 66 6b 65 79  }.do_test e_fkey
17740 2d 36 33 2e 32 2e 35 20 7b 0a 20 20 73 71 6c 69  -63.2.5 {.  sqli
17750 74 65 34 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te4_limit db SQL
17760 49 54 45 34 5f 4c 49 4d 49 54 5f 54 52 49 47 47  ITE4_LIMIT_TRIGG
17770 45 52 5f 44 45 50 54 48 20 31 30 30 30 30 30 30  ER_DEPTH 1000000
17780 0a 7d 20 7b 35 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .} {5}..#-------
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177d0 2d 2d 0a 23 20 54 68 65 20 73 65 74 74 69 6e 67  --.# The setting
177e0 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
177f0 65 5f 74 72 69 67 67 65 72 73 20 70 72 61 67 6d  e_triggers pragm
17800 61 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  a does not affec
17810 74 20 66 6f 72 65 69 67 6e 0a 23 20 6b 65 79 20  t foreign.# key 
17820 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49  actions..#.# EVI
17830 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 37 36  DENCE-OF: R-5176
17840 39 2d 33 32 37 33 30 20 54 68 65 20 50 52 41 47  9-32730 The PRAG
17850 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
17860 67 67 65 72 73 20 73 65 74 74 69 6e 67 20 64 6f  ggers setting do
17870 65 73 0a 23 20 6e 6f 74 20 6e 6f 74 20 61 66 66  es.# not not aff
17880 65 63 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ect the operatio
17890 6e 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  n of foreign key
178a0 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 66 6f 72 65   actions..#.fore
178b0 61 63 68 20 72 65 63 75 72 73 69 76 65 5f 74 72  ach recursive_tr
178c0 69 67 67 65 72 73 5f 73 65 74 74 69 6e 67 20 5b  iggers_setting [
178d0 6c 69 73 74 20 30 20 31 20 4f 4e 20 4f 46 46 5d  list 0 1 ON OFF]
178e0 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
178f0 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 22  bles.  execsql "
17900 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
17910 5f 74 72 69 67 67 65 72 73 20 3d 20 24 72 65 63  _triggers = $rec
17920 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 5f  ursive_triggers_
17930 73 65 74 74 69 6e 67 22 0a 0a 20 20 64 6f 5f 74  setting"..  do_t
17940 65 73 74 20 65 5f 66 6b 65 79 2d 36 34 2e 24 72  est e_fkey-64.$r
17950 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
17960 73 5f 73 65 74 74 69 6e 67 2e 31 20 7b 0a 20 20  s_setting.1 {.  
17970 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
17980 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
17990 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
179a0 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
179b0 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
179c0 44 45 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  DE);.      INSER
179d0 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
179e0 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  (1, NULL);.     
179f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
17a00 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0a 20 20  VALUES(2, 1);.  
17a10 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17a20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 32 29 3b  t1 VALUES(3, 2);
17a30 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
17a40 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
17a50 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  3);.      INSERT
17a60 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17a70 35 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c  5, 4);.      SEL
17a80 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17a90 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
17aa0 7b 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {5}.  do_test e_
17ab0 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17ac0 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17ad0 69 6e 67 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  ing.2 {.    exec
17ae0 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
17af0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48  nt(*) FROM t1 WH
17b00 45 52 45 20 61 20 3d 20 31 20 7d 0a 20 20 7d 20  ERE a = 1 }.  } 
17b10 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  {1}.  do_test e_
17b20 66 6b 65 79 2d 36 34 2e 24 72 65 63 75 72 73 69  fkey-64.$recursi
17b30 76 65 5f 74 72 69 67 67 65 72 73 5f 73 65 74 74  ve_triggers_sett
17b40 69 6e 67 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  ing.3 {.    exec
17b50 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45 4c  sql { .      DEL
17b60 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
17b70 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53  E a = 1;.      S
17b80 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
17b90 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
17ba0 7d 20 7b 30 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  } {0}.}..finish_
17bb0 74 65 73 74 0a                                   test.