/ Hex Artifact Content
Login

Artifact c9b3a4f1e67546a92b568de59d555eaf5480ed65:


0000: 23 20 32 30 30 39 20 53 65 70 74 65 6d 62 65 72  # 2009 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 0a 23 0a 23 20 54 68 69 73 20 66  rary..#.# This f
01b0: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ile implements t
01c0: 65 73 74 73 20 66 6f 72 20 66 6f 72 65 69 67 6e  ests for foreign
01d0: 20 6b 65 79 73 2e 0a 23 0a 0a 73 65 74 20 74 65   keys..#..set te
01e0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
01f0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0200: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0210: 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c  er.tcl..ifcapabl
0220: 65 20 7b 21 66 6f 72 65 69 67 6e 6b 65 79 7c 7c  e {!foreignkey||
0230: 21 74 72 69 67 67 65 72 7d 20 7b 0a 20 20 66 69  !trigger} {.  fi
0240: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
0250: 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  rn.}..#---------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 0a 23 20 54 65 73 74 20 73 74 72 75 63 74 75 72  .# Test structur
02b0: 65 3a 0a 23 0a 23 20 66 6b 65 79 32 2d 31 2e 2a  e:.#.# fkey2-1.*
02c0: 3a 20 53 69 6d 70 6c 65 20 74 65 73 74 73 20 74  : Simple tests t
02d0: 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69 6d 6d  o check that imm
02e0: 65 64 69 61 74 65 20 61 6e 64 20 64 65 66 65 72  ediate and defer
02f0: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
0300: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  .#            co
0310: 6e 73 74 72 61 69 6e 74 73 20 77 6f 72 6b 20 77  nstraints work w
0320: 68 65 6e 20 6e 6f 74 20 69 6e 73 69 64 65 20 61  hen not inside a
0330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 20   transaction..# 
0340: 20 20 20 20 20 20 20 20 20 20 20 0a 23 20 66 6b             .# fk
0350: 65 79 32 2d 32 2e 2a 3a 20 54 65 73 74 73 20 74  ey2-2.*: Tests t
0360: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 64 65  o verify that de
0370: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
0380: 65 79 73 20 77 6f 72 6b 20 69 6e 73 69 64 65 0a  eys work inside.
0390: 23 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70  #            exp
03a0: 6c 69 63 69 74 20 74 72 61 6e 73 61 63 74 69 6f  licit transactio
03b0: 6e 73 20 28 69 2e 65 20 74 68 61 74 20 70 72 6f  ns (i.e that pro
03c0: 63 65 73 73 69 6e 67 20 72 65 61 6c 6c 79 20 69  cessing really i
03d0: 73 20 64 65 66 65 72 72 65 64 29 2e 0a 23 0a 23  s deferred)..#.#
03e0: 20 66 6b 65 79 32 2d 33 2e 2a 3a 20 54 65 73 74   fkey2-3.*: Test
03f0: 73 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  s that a stateme
0400: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
0410: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66  s rolled back if
0420: 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20   an.#           
0430: 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
0440: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
0450: 74 20 69 73 20 76 69 6f 6c 61 74 65 64 2e 0a 23  t is violated..#
0460: 0a 23 20 66 6b 65 79 32 2d 34 2e 2a 3a 20 54 65  .# fkey2-4.*: Te
0470: 73 74 20 74 68 61 74 20 46 4b 20 61 63 74 69 6f  st that FK actio
0480: 6e 73 20 6d 61 79 20 72 65 63 75 72 73 65 20 65  ns may recurse e
0490: 76 65 6e 20 77 68 65 6e 20 72 65 63 75 72 73 69  ven when recursi
04a0: 76 65 20 74 72 69 67 67 65 72 73 0a 23 20 20 20  ve triggers.#   
04b0: 20 20 20 20 20 20 20 20 20 61 72 65 20 64 69 73           are dis
04c0: 61 62 6c 65 64 2e 0a 23 0a 23 20 66 6b 65 79 32  abled..#.# fkey2
04d0: 2d 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74  -5.*: Check that
04e0: 20 69 66 20 66 6f 72 65 69 67 6e 2d 6b 65 79 73   if foreign-keys
04f0: 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 69 74   are enabled, it
0500: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
0510: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 74 6f  .#            to
0520: 20 77 72 69 74 65 20 74 6f 20 61 6e 20 46 4b 20   write to an FK 
0530: 63 6f 6c 75 6d 6e 20 75 73 69 6e 67 20 74 68 65  column using the
0540: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
0550: 62 20 41 50 49 2e 0a 23 0a 23 20 66 6b 65 79 32  b API..#.# fkey2
0560: 2d 36 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  -6.*: Test that 
0570: 46 4b 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  FK processing is
0580: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
0590: 69 73 61 62 6c 65 64 20 77 68 65 6e 20 0a 23 20  isabled when .# 
05a0: 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 6e 69             runni
05b0: 6e 67 20 56 41 43 55 55 4d 2e 0a 23 0a 23 20 66  ng VACUUM..#.# f
05c0: 6b 65 79 32 2d 37 2e 2a 3a 20 54 65 73 74 20 75  key2-7.*: Test u
05d0: 73 69 6e 67 20 61 6e 20 49 50 4b 20 61 73 20 74  sing an IPK as t
05e0: 68 65 20 6b 65 79 20 69 6e 20 74 68 65 20 63 68  he key in the ch
05f0: 69 6c 64 20 28 72 65 66 65 72 65 6e 63 69 6e 67  ild (referencing
0600: 29 20 74 61 62 6c 65 2e 0a 23 0a 23 20 66 6b 65  ) table..#.# fke
0610: 79 32 2d 38 2e 2a 3a 20 54 65 73 74 20 74 68 61  y2-8.*: Test tha
0620: 74 20 65 6e 61 62 6c 69 6e 67 2f 64 69 73 61 62  t enabling/disab
0630: 6c 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  ling foreign key
0640: 20 73 75 70 70 6f 72 74 20 77 68 69 6c 65 20 61   support while a
0650: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 74   .#            t
0660: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
0670: 74 69 76 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  tive is not poss
0680: 69 62 6c 65 2e 0a 23 0a 23 20 66 6b 65 79 32 2d  ible..#.# fkey2-
0690: 39 2e 2a 3a 20 54 65 73 74 20 53 45 54 20 44 45  9.*: Test SET DE
06a0: 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e 0a 23  FAULT actions..#
06b0: 0a 23 20 66 6b 65 79 32 2d 31 30 2e 2a 3a 20 54  .# fkey2-10.*: T
06c0: 65 73 74 20 65 72 72 6f 72 73 2e 0a 23 0a 23 20  est errors..#.# 
06d0: 66 6b 65 79 32 2d 31 31 2e 2a 3a 20 54 65 73 74  fkey2-11.*: Test
06e0: 20 43 41 53 43 41 44 45 20 61 63 74 69 6f 6e 73   CASCADE actions
06f0: 2e 0a 23 0a 23 20 66 6b 65 79 32 2d 31 32 2e 2a  ..#.# fkey2-12.*
0700: 3a 20 54 65 73 74 20 52 45 53 54 52 49 43 54 20  : Test RESTRICT 
0710: 61 63 74 69 6f 6e 73 2e 0a 23 0a 23 20 66 6b 65  actions..#.# fke
0720: 79 32 2d 31 33 2e 2a 3a 20 54 65 73 74 20 74 68  y2-13.*: Test th
0730: 61 74 20 46 4b 20 70 72 6f 63 65 73 73 69 6e 67  at FK processing
0740: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 77 68   is performed wh
0750: 65 6e 20 61 20 72 6f 77 20 69 73 20 52 45 50 4c  en a row is REPL
0760: 41 43 45 44 20 62 79 0a 23 20 20 20 20 20 20 20  ACED by.#       
0770: 20 20 20 20 20 20 61 6e 20 55 50 44 41 54 45 20        an UPDATE 
0780: 6f 72 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  or INSERT statem
0790: 65 6e 74 2e 0a 23 0a 23 20 66 6b 65 79 32 2d 31  ent..#.# fkey2-1
07a0: 34 2e 2a 3a 20 54 65 73 74 20 74 68 65 20 41 4c  4.*: Test the AL
07b0: 54 45 52 20 54 41 42 4c 45 20 61 6e 64 20 44 52  TER TABLE and DR
07c0: 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
07d0: 73 2e 0a 23 0a 23 20 66 6b 65 79 32 2d 31 35 2e  s..#.# fkey2-15.
07e0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
07f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 28 6b 6e  there are no (kn
0800: 6f 77 6e 29 20 6f 75 74 73 74 61 6e 64 69 6e 67  own) outstanding
0810: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a 23 20   foreign key .# 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
0830: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
0840: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
0850: 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  e, inserting int
0860: 6f 20 61 20 70 61 72 65 6e 74 0a 23 20 20 20 20  o a parent.#    
0870: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 6f           table o
0880: 72 20 64 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20  r deleting from 
0890: 61 20 63 68 69 6c 64 20 74 61 62 6c 65 20 64 6f  a child table do
08a0: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 53 51 4c  es not cause SQL
08b0: 69 74 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ite.#           
08c0: 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68    to check if th
08d0: 69 73 20 68 61 73 20 72 65 70 61 69 72 65 64 20  is has repaired 
08e0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 76  an outstanding v
08f0: 69 6f 6c 61 74 69 6f 6e 2e 0a 23 0a 23 20 66 6b  iolation..#.# fk
0900: 65 79 32 2d 31 36 2e 2a 3a 20 54 65 73 74 20 74  ey2-16.*: Test t
0910: 68 61 74 20 72 6f 77 73 20 74 68 61 74 20 72 65  hat rows that re
0920: 66 65 72 20 74 6f 20 74 68 65 6d 73 65 6c 76 65  fer to themselve
0930: 73 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  s may be inserte
0940: 64 2c 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  d, .#           
0950: 20 20 75 70 64 61 74 65 64 20 61 6e 64 20 64 65    updated and de
0960: 6c 65 74 65 64 2e 0a 23 0a 23 20 66 6b 65 79 32  leted..#.# fkey2
0970: 2d 31 37 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  -17.*: Test that
0980: 20 74 68 65 20 22 63 6f 75 6e 74 5f 63 68 61 6e   the "count_chan
0990: 67 65 73 22 20 70 72 61 67 6d 61 20 64 6f 65 73  ges" pragma does
09a0: 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20 77   not interfere w
09b0: 69 74 68 0a 23 20 20 20 20 20 20 20 20 20 20 20  ith.#           
09c0: 20 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20    FK constraint 
09d0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 23 20 0a 23  processing..# .#
09e0: 20 66 6b 65 79 32 2d 31 38 2e 2a 3a 20 54 65 73   fkey2-18.*: Tes
09f0: 74 20 74 68 61 74 20 74 68 65 20 61 75 74 68 6f  t that the autho
0a00: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
0a10: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 65  k is invoked whe
0a20: 6e 20 70 72 6f 63 65 73 73 69 6e 67 0a 23 20 20  n processing.#  
0a30: 20 20 20 20 20 20 20 20 20 20 20 46 4b 20 63 6f             FK co
0a40: 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 66  nstraints..#.# f
0a50: 6b 65 79 32 2d 32 30 2e 2a 3a 20 54 65 73 74 20  key2-20.*: Test 
0a60: 74 68 61 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  that ON CONFLICT
0a70: 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
0a80: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 74  ed as part of st
0a90: 61 74 65 6d 65 6e 74 73 0a 23 20 20 20 20 20 20  atements.#      
0aa0: 20 20 20 20 20 20 20 64 6f 20 6e 6f 74 20 61 66         do not af
0ab0: 66 65 63 74 20 74 68 65 20 6f 70 65 72 61 74 69  fect the operati
0ac0: 6f 6e 20 6f 66 20 46 4b 20 63 6f 6e 73 74 72 61  on of FK constra
0ad0: 69 6e 74 73 2e 0a 23 0a 23 20 66 6b 65 79 32 2d  ints..#.# fkey2-
0ae0: 67 65 6e 66 6b 65 79 2e 2a 3a 20 54 65 73 74 73  genfkey.*: Tests
0af0: 20 74 68 61 74 20 77 65 72 65 20 75 73 65 64 20   that were used 
0b00: 77 69 74 68 20 74 68 65 20 73 68 65 6c 6c 20 74  with the shell t
0b10: 6f 6f 6c 20 2e 67 65 6e 66 6b 65 79 0a 23 20 20  ool .genfkey.#  
0b20: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
0b30: 64 2e 20 52 65 63 79 63 6c 65 64 20 74 6f 20 74  d. Recycled to t
0b40: 65 73 74 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  est the built-in
0b50: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
0b60: 0a 23 0a 23 20 66 6b 65 79 32 2d 64 64 30 38 65  .#.# fkey2-dd08e
0b70: 35 2e 2a 3a 20 20 54 65 73 74 73 20 74 6f 20 76  5.*:  Tests to v
0b80: 65 72 69 66 79 20 74 68 61 74 20 74 69 63 6b 65  erify that ticke
0b90: 74 20 64 64 30 38 65 35 61 39 38 38 64 30 30 64  t dd08e5a988d00d
0ba0: 65 63 63 34 61 35 34 33 64 61 61 38 64 0a 23 20  ecc4a543daa8d.# 
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 20 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e   has been fixed.
0bd0: 0a 23 0a 0a 0a 65 78 65 63 73 71 6c 20 7b 20 50  .#...execsql { P
0be0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0bf0: 79 73 20 3d 20 6f 6e 20 7d 0a 0a 73 65 74 20 46  ys = on }..set F
0c00: 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61 20  keySimpleSchema 
0c10: 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69  {.  PRAGMA forei
0c20: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20  gn_keys = on;.  
0c30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0c40: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
0c50: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
0c60: 45 20 74 32 28 63 20 52 45 46 45 52 45 4e 43 45  E t2(c REFERENCE
0c70: 53 20 74 31 28 61 29 20 2f 44 2f 20 2c 20 64 29  S t1(a) /D/ , d)
0c80: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
0c90: 45 20 74 33 28 61 20 50 52 49 4d 41 52 59 20 4b  E t3(a PRIMARY K
0ca0: 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  EY, b);.  CREATE
0cb0: 20 54 41 42 4c 45 20 74 34 28 63 20 52 45 46 45   TABLE t4(c REFE
0cc0: 52 45 4e 43 45 53 20 74 33 20 2f 44 2f 2c 20 64  RENCES t3 /D/, d
0cd0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
0ce0: 4c 45 20 74 37 28 61 2c 20 62 20 49 4e 54 45 47  LE t7(a, b INTEG
0cf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  ER PRIMARY KEY);
0d00: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0d10: 74 38 28 63 20 52 45 46 45 52 45 4e 43 45 53 20  t8(c REFERENCES 
0d20: 74 37 20 2f 44 2f 2c 20 64 29 3b 0a 0a 20 20 43  t7 /D/, d);..  C
0d30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
0d40: 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73 75   REFERENCES nosu
0d50: 63 68 74 61 62 6c 65 2c 20 62 29 3b 0a 20 20 43  chtable, b);.  C
0d60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28  REATE TABLE t10(
0d70: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 39 28  a REFERENCES t9(
0d80: 63 29 20 2f 44 2f 2c 20 62 29 3b 0a 7d 0a 0a 0a  c) /D/, b);.}...
0d90: 73 65 74 20 46 6b 65 79 53 69 6d 70 6c 65 54 65  set FkeySimpleTe
0da0: 73 74 73 20 7b 0a 20 20 31 2e 31 20 20 22 49 4e  sts {.  1.1  "IN
0db0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0dc0: 55 45 53 28 31 2c 20 33 29 22 20 20 20 20 20 20  UES(1, 3)"      
0dd0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
0de0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
0df0: 64 7d 7d 0a 20 20 31 2e 32 20 20 22 49 4e 53 45  d}}.  1.2  "INSE
0e00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0e10: 53 28 31 2c 20 32 29 22 20 20 20 20 20 20 7b 30  S(1, 2)"      {0
0e20: 20 7b 7d 7d 0a 20 20 31 2e 33 20 20 22 49 4e 53   {}}.  1.3  "INS
0e30: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
0e40: 45 53 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b  ES(1, 3)"      {
0e50: 30 20 7b 7d 7d 0a 20 20 31 2e 34 20 20 22 49 4e  0 {}}.  1.4  "IN
0e60: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0e70: 55 45 53 28 32 2c 20 34 29 22 20 20 20 20 20 20  UES(2, 4)"      
0e80: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
0e90: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
0ea0: 64 7d 7d 0a 20 20 31 2e 35 20 20 22 49 4e 53 45  d}}.  1.5  "INSE
0eb0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0ec0: 53 28 4e 55 4c 4c 2c 20 34 29 22 20 20 20 7b 30  S(NULL, 4)"   {0
0ed0: 20 7b 7d 7d 0a 20 20 31 2e 36 20 20 22 55 50 44   {}}.  1.6  "UPD
0ee0: 41 54 45 20 74 32 20 53 45 54 20 63 3d 32 20 57  ATE t2 SET c=2 W
0ef0: 48 45 52 45 20 64 3d 34 22 20 20 20 20 20 20 7b  HERE d=4"      {
0f00: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
0f10: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
0f20: 7d 7d 0a 20 20 31 2e 37 20 20 22 55 50 44 41 54  }}.  1.7  "UPDAT
0f30: 45 20 74 32 20 53 45 54 20 63 3d 31 20 57 48 45  E t2 SET c=1 WHE
0f40: 52 45 20 64 3d 34 22 20 20 20 20 20 20 7b 30 20  RE d=4"      {0 
0f50: 7b 7d 7d 0a 20 20 31 2e 39 20 20 22 55 50 44 41  {}}.  1.9  "UPDA
0f60: 54 45 20 74 32 20 53 45 54 20 63 3d 31 20 57 48  TE t2 SET c=1 WH
0f70: 45 52 45 20 64 3d 34 22 20 20 20 20 20 20 7b 30  ERE d=4"      {0
0f80: 20 7b 7d 7d 0a 20 20 31 2e 31 30 20 22 55 50 44   {}}.  1.10 "UPD
0f90: 41 54 45 20 74 32 20 53 45 54 20 63 3d 4e 55 4c  ATE t2 SET c=NUL
0fa0: 4c 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 7b  L WHERE d=4"   {
0fb0: 30 20 7b 7d 7d 0a 20 20 31 2e 31 31 20 22 44 45  0 {}}.  1.11 "DE
0fc0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
0fd0: 52 45 20 61 3d 31 22 20 20 20 20 20 20 20 20 20  RE a=1"         
0fe0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
0ff0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
1000: 64 7d 7d 0a 20 20 31 2e 31 32 20 22 55 50 44 41  d}}.  1.12 "UPDA
1010: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 32 22  TE t1 SET a = 2"
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
1030: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
1040: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
1050: 7d 0a 20 20 31 2e 31 33 20 22 55 50 44 41 54 45  }.  1.13 "UPDATE
1060: 20 74 31 20 53 45 54 20 61 20 3d 20 31 22 20 20   t1 SET a = 1"  
1070: 20 20 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b              {0 {
1080: 7d 7d 0a 0a 20 20 32 2e 31 20 20 22 49 4e 53 45  }}..  2.1  "INSE
1090: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
10a0: 53 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b 31  S(1, 3)"      {1
10b0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
10c0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
10d0: 7d 0a 20 20 32 2e 32 20 20 22 49 4e 53 45 52 54  }.  2.2  "INSERT
10e0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
10f0: 31 2c 20 32 29 22 20 20 20 20 20 20 7b 30 20 7b  1, 2)"      {0 {
1100: 7d 7d 0a 20 20 32 2e 33 20 20 22 49 4e 53 45 52  }}.  2.3  "INSER
1110: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1120: 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b 30 20  (1, 3)"      {0 
1130: 7b 7d 7d 0a 0a 20 20 34 2e 31 20 20 22 49 4e 53  {}}..  4.1  "INS
1140: 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55  ERT INTO t8 VALU
1150: 45 53 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b  ES(1, 3)"      {
1160: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
1170: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1180: 7d 7d 0a 20 20 34 2e 32 20 20 22 49 4e 53 45 52  }}.  4.2  "INSER
1190: 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53  T INTO t7 VALUES
11a0: 28 32 2c 20 31 29 22 20 20 20 20 20 20 7b 30 20  (2, 1)"      {0 
11b0: 7b 7d 7d 0a 20 20 34 2e 33 20 20 22 49 4e 53 45  {}}.  4.3  "INSE
11c0: 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45  RT INTO t8 VALUE
11d0: 53 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b 30  S(1, 3)"      {0
11e0: 20 7b 7d 7d 0a 20 20 34 2e 34 20 20 22 49 4e 53   {}}.  4.4  "INS
11f0: 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55  ERT INTO t8 VALU
1200: 45 53 28 32 2c 20 34 29 22 20 20 20 20 20 20 7b  ES(2, 4)"      {
1210: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
1220: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1230: 7d 7d 0a 20 20 34 2e 35 20 20 22 49 4e 53 45 52  }}.  4.5  "INSER
1240: 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53  T INTO t8 VALUES
1250: 28 4e 55 4c 4c 2c 20 34 29 22 20 20 20 7b 30 20  (NULL, 4)"   {0 
1260: 7b 7d 7d 0a 20 20 34 2e 36 20 20 22 55 50 44 41  {}}.  4.6  "UPDA
1270: 54 45 20 74 38 20 53 45 54 20 63 3d 32 20 57 48  TE t8 SET c=2 WH
1280: 45 52 45 20 64 3d 34 22 20 20 20 20 20 20 7b 31  ERE d=4"      {1
1290: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
12a0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
12b0: 7d 0a 20 20 34 2e 37 20 20 22 55 50 44 41 54 45  }.  4.7  "UPDATE
12c0: 20 74 38 20 53 45 54 20 63 3d 31 20 57 48 45 52   t8 SET c=1 WHER
12d0: 45 20 64 3d 34 22 20 20 20 20 20 20 7b 30 20 7b  E d=4"      {0 {
12e0: 7d 7d 0a 20 20 34 2e 39 20 20 22 55 50 44 41 54  }}.  4.9  "UPDAT
12f0: 45 20 74 38 20 53 45 54 20 63 3d 31 20 57 48 45  E t8 SET c=1 WHE
1300: 52 45 20 64 3d 34 22 20 20 20 20 20 20 7b 30 20  RE d=4"      {0 
1310: 7b 7d 7d 0a 20 20 34 2e 31 30 20 22 55 50 44 41  {}}.  4.10 "UPDA
1320: 54 45 20 74 38 20 53 45 54 20 63 3d 4e 55 4c 4c  TE t8 SET c=NULL
1330: 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 7b 30   WHERE d=4"   {0
1340: 20 7b 7d 7d 0a 20 20 34 2e 31 31 20 22 44 45 4c   {}}.  4.11 "DEL
1350: 45 54 45 20 46 52 4f 4d 20 74 37 20 57 48 45 52  ETE FROM t7 WHER
1360: 45 20 62 3d 31 22 20 20 20 20 20 20 20 20 20 7b  E b=1"         {
1370: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
1380: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1390: 7d 7d 0a 20 20 34 2e 31 32 20 22 55 50 44 41 54  }}.  4.12 "UPDAT
13a0: 45 20 74 37 20 53 45 54 20 62 20 3d 20 32 22 20  E t7 SET b = 2" 
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20               {1 
13c0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
13d0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
13e0: 0a 20 20 34 2e 31 33 20 22 55 50 44 41 54 45 20  .  4.13 "UPDATE 
13f0: 74 37 20 53 45 54 20 62 20 3d 20 31 22 20 20 20  t7 SET b = 1"   
1400: 20 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d             {0 {}
1410: 7d 0a 20 20 34 2e 31 34 20 22 49 4e 53 45 52 54  }.  4.14 "INSERT
1420: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
1430: 27 61 27 2c 20 27 62 27 29 22 20 20 7b 31 20 7b  'a', 'b')"  {1 {
1440: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
1450: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
1460: 20 20 34 2e 31 35 20 22 55 50 44 41 54 45 20 74    4.15 "UPDATE t
1470: 37 20 53 45 54 20 62 20 3d 20 35 22 20 20 20 20  7 SET b = 5"    
1480: 20 20 20 20 20 20 20 20 20 20 7b 31 20 7b 66 6f            {1 {fo
1490: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
14a0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20  aint failed}}.  
14b0: 34 2e 31 36 20 22 55 50 44 41 54 45 20 74 37 20  4.16 "UPDATE t7 
14c0: 53 45 54 20 72 6f 77 69 64 20 3d 20 35 22 20 20  SET rowid = 5"  
14d0: 20 20 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65          {1 {fore
14e0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
14f0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e  nt failed}}.  4.
1500: 31 37 20 22 55 50 44 41 54 45 20 74 37 20 53 45  17 "UPDATE t7 SE
1510: 54 20 61 20 3d 20 31 30 22 20 20 20 20 20 20 20  T a = 10"       
1520: 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20        {0 {}}..  
1530: 35 2e 31 20 20 22 49 4e 53 45 52 54 20 49 4e 54  5.1  "INSERT INT
1540: 4f 20 74 39 20 56 41 4c 55 45 53 28 31 2c 20 33  O t9 VALUES(1, 3
1550: 29 22 20 20 20 20 20 20 7b 31 20 7b 6e 6f 20 73  )"      {1 {no s
1560: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
1570: 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d 0a 20 20  nosuchtable}}.  
1580: 35 2e 32 20 20 22 49 4e 53 45 52 54 20 49 4e 54  5.2  "INSERT INT
1590: 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31 2c 20  O t10 VALUES(1, 
15a0: 33 29 22 20 20 0a 20 20 20 20 20 20 20 20 20 20  3)"  .          
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65    {1 {foreign ke
15d0: 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22 74 31  y mismatch - "t1
15e0: 30 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  0" referencing "
15f0: 74 39 22 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  t9"}}.}..do_test
1600: 20 66 6b 65 79 32 2d 31 2e 31 2e 30 20 7b 0a 20   fkey2-1.1.0 {. 
1610: 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e 67   execsql [string
1620: 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24 46   map {/D/ {}} $F
1630: 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61 5d  keySimpleSchema]
1640: 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74  .} {}.foreach {t
1650: 6e 20 7a 53 71 6c 20 72 65 73 7d 20 24 46 6b 65  n zSql res} $Fke
1660: 79 53 69 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20  ySimpleTests {. 
1670: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1680: 2e 31 2e 24 74 6e 2e 31 20 7b 20 63 61 74 63 68  .1.$tn.1 { catch
1690: 73 71 6c 20 24 7a 53 71 6c 20 7d 20 24 72 65 73  sql $zSql } $res
16a0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
16b0: 2d 31 2e 31 2e 24 74 6e 2e 32 20 7b 20 65 78 65  -1.1.$tn.2 { exe
16c0: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72  csql {PRAGMA for
16d0: 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74  eign_key_check(t
16e0: 31 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  1)} } {}.  do_te
16f0: 73 74 20 66 6b 65 79 32 2d 31 2e 31 2e 24 74 6e  st fkey2-1.1.$tn
1700: 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52  .3 { execsql {PR
1710: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1720: 5f 63 68 65 63 6b 28 74 32 29 7d 20 7d 20 7b 7d  _check(t2)} } {}
1730: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
1740: 2d 31 2e 31 2e 24 74 6e 2e 34 20 7b 20 65 78 65  -1.1.$tn.4 { exe
1750: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72  csql {PRAGMA for
1760: 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74  eign_key_check(t
1770: 33 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  3)} } {}.  do_te
1780: 73 74 20 66 6b 65 79 32 2d 31 2e 31 2e 24 74 6e  st fkey2-1.1.$tn
1790: 2e 35 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52  .5 { execsql {PR
17a0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
17b0: 5f 63 68 65 63 6b 28 74 34 29 7d 20 7d 20 7b 7d  _check(t4)} } {}
17c0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
17d0: 2d 31 2e 31 2e 24 74 6e 2e 36 20 7b 20 65 78 65  -1.1.$tn.6 { exe
17e0: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72  csql {PRAGMA for
17f0: 65 69 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74  eign_key_check(t
1800: 37 29 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  7)} } {}.  do_te
1810: 73 74 20 66 6b 65 79 32 2d 31 2e 31 2e 24 74 6e  st fkey2-1.1.$tn
1820: 2e 37 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52  .7 { execsql {PR
1830: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
1840: 5f 63 68 65 63 6b 28 74 38 29 7d 20 7d 20 7b 7d  _check(t8)} } {}
1850: 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .}.drop_all_tabl
1860: 65 73 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  es..do_test fkey
1870: 32 2d 31 2e 32 2e 30 20 7b 0a 20 20 65 78 65 63  2-1.2.0 {.  exec
1880: 73 71 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  sql [string map 
1890: 7b 2f 44 2f 20 7b 44 45 46 45 52 52 41 42 4c 45  {/D/ {DEFERRABLE
18a0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
18b0: 52 45 44 7d 7d 20 24 46 6b 65 79 53 69 6d 70 6c  RED}} $FkeySimpl
18c0: 65 53 63 68 65 6d 61 5d 0a 7d 20 7b 7d 0a 66 6f  eSchema].} {}.fo
18d0: 72 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72  reach {tn zSql r
18e0: 65 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 54  es} $FkeySimpleT
18f0: 65 73 74 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ests {.  do_test
1900: 20 66 6b 65 79 32 2d 31 2e 32 2e 24 74 6e 20 7b   fkey2-1.2.$tn {
1910: 20 63 61 74 63 68 73 71 6c 20 24 7a 53 71 6c 20   catchsql $zSql 
1920: 7d 20 24 72 65 73 0a 20 20 64 6f 5f 74 65 73 74  } $res.  do_test
1930: 20 66 6b 65 79 32 2d 31 2e 32 2e 24 74 6e 2e 32   fkey2-1.2.$tn.2
1940: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1950: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1960: 68 65 63 6b 28 74 31 29 7d 20 7d 20 7b 7d 0a 20  heck(t1)} } {}. 
1970: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1980: 2e 32 2e 24 74 6e 2e 33 20 7b 20 65 78 65 63 73  .2.$tn.3 { execs
1990: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
19a0: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 32 29  gn_key_check(t2)
19b0: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
19c0: 20 66 6b 65 79 32 2d 31 2e 32 2e 24 74 6e 2e 34   fkey2-1.2.$tn.4
19d0: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
19e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
19f0: 68 65 63 6b 28 74 33 29 7d 20 7d 20 7b 7d 0a 20  heck(t3)} } {}. 
1a00: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1a10: 2e 32 2e 24 74 6e 2e 35 20 7b 20 65 78 65 63 73  .2.$tn.5 { execs
1a20: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
1a30: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 34 29  gn_key_check(t4)
1a40: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
1a50: 20 66 6b 65 79 32 2d 31 2e 32 2e 24 74 6e 2e 36   fkey2-1.2.$tn.6
1a60: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1a70: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1a80: 68 65 63 6b 28 74 37 29 7d 20 7d 20 7b 7d 0a 20  heck(t7)} } {}. 
1a90: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1aa0: 2e 32 2e 24 74 6e 2e 37 20 7b 20 65 78 65 63 73  .2.$tn.7 { execs
1ab0: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
1ac0: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 38 29  gn_key_check(t8)
1ad0: 7d 20 7d 20 7b 7d 0a 7d 0a 64 72 6f 70 5f 61 6c  } } {}.}.drop_al
1ae0: 6c 5f 74 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73  l_tables..do_tes
1af0: 74 20 66 6b 65 79 32 2d 31 2e 33 2e 30 20 7b 0a  t fkey2-1.3.0 {.
1b00: 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e    execsql [strin
1b10: 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24  g map {/D/ {}} $
1b20: 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61  FkeySimpleSchema
1b30: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  ].  execsql { PR
1b40: 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67  AGMA count_chang
1b50: 65 73 20 3d 20 31 20 7d 0a 7d 20 7b 7d 0a 66 6f  es = 1 }.} {}.fo
1b60: 72 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72  reach {tn zSql r
1b70: 65 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 54  es} $FkeySimpleT
1b80: 65 73 74 73 20 7b 0a 20 20 69 66 20 7b 24 72 65  ests {.  if {$re
1b90: 73 20 3d 3d 20 22 30 20 7b 7d 22 7d 20 7b 20 73  s == "0 {}"} { s
1ba0: 65 74 20 72 65 73 20 7b 30 20 31 7d 20 7d 0a 20  et res {0 1} }. 
1bb0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1bc0: 2e 33 2e 24 74 6e 20 7b 20 63 61 74 63 68 73 71  .3.$tn { catchsq
1bd0: 6c 20 24 7a 53 71 6c 20 7d 20 24 72 65 73 0a 20  l $zSql } $res. 
1be0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1bf0: 2e 33 2e 24 74 6e 2e 32 20 7b 20 65 78 65 63 73  .3.$tn.2 { execs
1c00: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
1c10: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 31 29  gn_key_check(t1)
1c20: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
1c30: 20 66 6b 65 79 32 2d 31 2e 33 2e 24 74 6e 2e 33   fkey2-1.3.$tn.3
1c40: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1c50: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1c60: 68 65 63 6b 28 74 32 29 7d 20 7d 20 7b 7d 0a 20  heck(t2)} } {}. 
1c70: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1c80: 2e 33 2e 24 74 6e 2e 34 20 7b 20 65 78 65 63 73  .3.$tn.4 { execs
1c90: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
1ca0: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 33 29  gn_key_check(t3)
1cb0: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
1cc0: 20 66 6b 65 79 32 2d 31 2e 33 2e 24 74 6e 2e 35   fkey2-1.3.$tn.5
1cd0: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1ce0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1cf0: 68 65 63 6b 28 74 34 29 7d 20 7d 20 7b 7d 0a 20  heck(t4)} } {}. 
1d00: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1d10: 2e 33 2e 24 74 6e 2e 36 20 7b 20 65 78 65 63 73  .3.$tn.6 { execs
1d20: 71 6c 20 7b 50 52 41 47 4d 41 20 66 6f 72 65 69  ql {PRAGMA forei
1d30: 67 6e 5f 6b 65 79 5f 63 68 65 63 6b 28 74 37 29  gn_key_check(t7)
1d40: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
1d50: 20 66 6b 65 79 32 2d 31 2e 33 2e 24 74 6e 2e 37   fkey2-1.3.$tn.7
1d60: 20 7b 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47   { execsql {PRAG
1d70: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  MA foreign_key_c
1d80: 68 65 63 6b 28 74 38 29 7d 20 7d 20 7b 7d 0a 7d  heck(t8)} } {}.}
1d90: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
1da0: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
1db0: 3d 20 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74  = 0 }.drop_all_t
1dc0: 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73 74 20 66  ables..do_test f
1dd0: 6b 65 79 32 2d 31 2e 34 2e 30 20 7b 0a 20 20 65  key2-1.4.0 {.  e
1de0: 78 65 63 73 71 6c 20 5b 73 74 72 69 6e 67 20 6d  xecsql [string m
1df0: 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24 46 6b 65  ap {/D/ {}} $Fke
1e00: 79 53 69 6d 70 6c 65 53 63 68 65 6d 61 5d 0a 20  ySimpleSchema]. 
1e10: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
1e20: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
1e30: 3d 20 31 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61  = 1 }.} {}.forea
1e40: 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72 65 73 7d  ch {tn zSql res}
1e50: 20 24 46 6b 65 79 53 69 6d 70 6c 65 54 65 73 74   $FkeySimpleTest
1e60: 73 20 7b 0a 20 20 69 66 20 7b 24 72 65 73 20 3d  s {.  if {$res =
1e70: 3d 20 22 30 20 7b 7d 22 7d 20 7b 20 73 65 74 20  = "0 {}"} { set 
1e80: 72 65 73 20 7b 30 20 31 7d 20 7d 0a 20 20 65 78  res {0 1} }.  ex
1e90: 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 64 6f  ecsql BEGIN.  do
1ea0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 34 2e  _test fkey2-1.4.
1eb0: 24 74 6e 20 7b 20 63 61 74 63 68 73 71 6c 20 24  $tn { catchsql $
1ec0: 7a 53 71 6c 20 7d 20 24 72 65 73 0a 20 20 65 78  zSql } $res.  ex
1ed0: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 0a 65  ecsql COMMIT.}.e
1ee0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1ef0: 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 3d 20  count_changes = 
1f00: 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  0 }.drop_all_tab
1f10: 6c 65 73 0a 0a 23 20 53 70 65 63 69 61 6c 20 74  les..# Special t
1f20: 65 73 74 3a 20 57 68 65 6e 20 74 68 65 20 70 61  est: When the pa
1f30: 72 65 6e 74 20 6b 65 79 20 69 73 20 61 6e 20 49  rent key is an I
1f40: 50 4b 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  PK, make sure th
1f50: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 0a 23 20  e affinity of.# 
1f60: 74 68 65 20 49 50 4b 20 69 73 20 6e 6f 74 20 61  the IPK is not a
1f70: 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 63 68  pplied to the ch
1f80: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 20 62 65  ild key value be
1f90: 66 6f 72 65 20 69 74 20 69 73 20 69 6e 73 65 72  fore it is inser
1fa0: 74 65 64 0a 23 20 69 6e 74 6f 20 74 68 65 20 63  ted.# into the c
1fb0: 68 69 6c 64 20 74 61 62 6c 65 2e 0a 64 6f 5f 74  hild table..do_t
1fc0: 65 73 74 20 66 6b 65 79 32 2d 31 2e 35 2e 31 20  est fkey2-1.5.1 
1fd0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1fe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69    CREATE TABLE i
1ff0: 28 69 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (i INTEGER PRIMA
2000: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
2010: 41 54 45 20 54 41 42 4c 45 20 6a 28 6a 20 52 45  ATE TABLE j(j RE
2020: 46 45 52 45 4e 43 45 53 20 69 29 3b 0a 20 20 20  FERENCES i);.   
2030: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 20 56   INSERT INTO i V
2040: 41 4c 55 45 53 28 33 35 29 3b 0a 20 20 20 20 49  ALUES(35);.    I
2050: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
2060: 55 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20 20  UES('35.0');.   
2070: 20 53 45 4c 45 43 54 20 6a 2c 20 74 79 70 65 6f   SELECT j, typeo
2080: 66 28 6a 29 20 46 52 4f 4d 20 6a 3b 0a 20 20 7d  f(j) FROM j;.  }
2090: 0a 7d 20 7b 33 35 2e 30 20 74 65 78 74 7d 0a 64  .} {35.0 text}.d
20a0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 35  o_test fkey2-1.5
20b0: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
20c0: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20  { DELETE FROM i 
20d0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
20e0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
20f0: 61 69 6c 65 64 7d 7d 0a 0a 23 20 53 61 6d 65 20  ailed}}..# Same 
2100: 74 65 73 74 20 75 73 69 6e 67 20 61 20 72 65 67  test using a reg
2110: 75 6c 61 72 20 70 72 69 6d 61 72 79 20 6b 65 79  ular primary key
2120: 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 61 66   with integer af
2130: 66 69 6e 69 74 79 2e 0a 64 72 6f 70 5f 61 6c 6c  finity..drop_all
2140: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
2150: 66 6b 65 79 32 2d 31 2e 36 2e 31 20 7b 0a 20 20  fkey2-1.6.1 {.  
2160: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2170: 45 41 54 45 20 54 41 42 4c 45 20 69 28 69 20 49  EATE TABLE i(i I
2180: 4e 54 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  NT UNIQUE);.    
2190: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a 28 6a  CREATE TABLE j(j
21a0: 20 52 45 46 45 52 45 4e 43 45 53 20 69 28 69 29   REFERENCES i(i)
21b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
21c0: 54 4f 20 69 20 56 41 4c 55 45 53 28 27 33 35 2e  TO i VALUES('35.
21d0: 30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0');.    INSERT 
21e0: 49 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 33  INTO j VALUES('3
21f0: 35 2e 30 27 29 3b 0a 20 20 20 20 53 45 4c 45 43  5.0');.    SELEC
2200: 54 20 6a 2c 20 74 79 70 65 6f 66 28 6a 29 20 46  T j, typeof(j) F
2210: 52 4f 4d 20 6a 3b 0a 20 20 20 20 53 45 4c 45 43  ROM j;.    SELEC
2220: 54 20 69 2c 20 74 79 70 65 6f 66 28 69 29 20 46  T i, typeof(i) F
2230: 52 4f 4d 20 69 3b 0a 20 20 7d 0a 7d 20 7b 33 35  ROM i;.  }.} {35
2240: 2e 30 20 74 65 78 74 20 33 35 20 69 6e 74 65 67  .0 text 35 integ
2250: 65 72 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  er}.do_test fkey
2260: 32 2d 31 2e 36 2e 32 20 7b 0a 20 20 63 61 74 63  2-1.6.2 {.  catc
2270: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
2280: 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  OM i }.} {1 {for
2290: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
22a0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 20  int failed}}..# 
22b0: 55 73 65 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  Use a collation 
22c0: 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 20  sequence on the 
22d0: 70 61 72 65 6e 74 20 6b 65 79 2e 0a 64 72 6f 70  parent key..drop
22e0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
22f0: 65 73 74 20 66 6b 65 79 32 2d 31 2e 37 2e 31 20  est fkey2-1.7.1 
2300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2310: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69    CREATE TABLE i
2320: 28 69 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20  (i TEXT COLLATE 
2330: 6e 6f 63 61 73 65 20 50 52 49 4d 41 52 59 20 4b  nocase PRIMARY K
2340: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
2350: 54 41 42 4c 45 20 6a 28 6a 20 54 45 58 54 20 43  TABLE j(j TEXT C
2360: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 52 45  OLLATE binary RE
2370: 46 45 52 45 4e 43 45 53 20 69 28 69 29 29 3b 0a  FERENCES i(i));.
2380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2390: 69 20 56 41 4c 55 45 53 28 27 53 51 4c 69 74 65  i VALUES('SQLite
23a0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
23b0: 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71  NTO j VALUES('sq
23c0: 6c 69 74 65 27 29 3b 0a 20 20 7d 0a 20 20 63 61  lite');.  }.  ca
23d0: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
23e0: 46 52 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 66  FROM i }.} {1 {f
23f0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
2400: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
2410: 23 20 55 73 65 20 74 68 65 20 70 61 72 65 6e 74  # Use the parent
2420: 20 6b 65 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 65   key collation e
2430: 76 65 6e 20 69 66 20 69 74 20 69 73 20 64 65 66  ven if it is def
2440: 61 75 6c 74 20 61 6e 64 20 74 68 65 20 63 68 69  ault and the chi
2450: 6c 64 20 6b 65 79 0a 23 20 68 61 73 20 61 6e 20  ld key.# has an 
2460: 65 78 70 6c 69 63 69 74 20 76 61 6c 75 65 2e 0a  explicit value..
2470: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
2480: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e  do_test fkey2-1.
2490: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
24a0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
24b0: 4c 45 20 69 28 69 20 54 45 58 54 20 50 52 49 4d  LE i(i TEXT PRIM
24c0: 41 52 59 20 4b 45 59 29 3b 20 20 20 20 20 20 20  ARY KEY);       
24d0: 20 2d 2d 20 43 6f 6c 73 65 71 20 69 73 20 22 42   -- Colseq is "B
24e0: 49 4e 41 52 59 22 0a 20 20 20 20 43 52 45 41 54  INARY".    CREAT
24f0: 45 20 54 41 42 4c 45 20 6a 28 6a 20 54 45 58 54  E TABLE j(j TEXT
2500: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
2510: 52 45 46 45 52 45 4e 43 45 53 20 69 28 69 29 29  REFERENCES i(i))
2520: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2530: 4f 20 69 20 56 41 4c 55 45 53 28 27 53 51 4c 69  O i VALUES('SQLi
2540: 74 65 27 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63  te');.  }.  catc
2550: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
2560: 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71 6c  TO j VALUES('sql
2570: 69 74 65 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  ite') }.} {1 {fo
2580: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
2590: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
25a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 37 2e  _test fkey2-1.7.
25b0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
25c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25d0: 69 20 56 41 4c 55 45 53 28 27 73 71 6c 69 74 65  i VALUES('sqlite
25e0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
25f0: 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71  NTO j VALUES('sq
2600: 6c 69 74 65 27 29 3b 0a 20 20 20 20 44 45 4c 45  lite');.    DELE
2610: 54 45 20 46 52 4f 4d 20 69 20 57 48 45 52 45 20  TE FROM i WHERE 
2620: 69 20 3d 20 27 53 51 4c 69 74 65 27 3b 0a 20 20  i = 'SQLite';.  
2630: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  }.  catchsql { D
2640: 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 57 48 45  ELETE FROM i WHE
2650: 52 45 20 69 20 3d 20 27 73 71 6c 69 74 65 27 20  RE i = 'sqlite' 
2660: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2670: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2680: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26d0: 2d 2d 2d 0a 23 20 54 68 69 73 20 73 65 63 74 69  ---.# This secti
26e0: 6f 6e 20 28 74 65 73 74 20 63 61 73 65 73 20 66  on (test cases f
26f0: 6b 65 79 32 2d 32 2e 2a 29 20 63 6f 6e 74 61 69  key2-2.*) contai
2700: 6e 73 20 74 65 73 74 73 20 74 6f 20 63 68 65 63  ns tests to chec
2710: 6b 20 74 68 61 74 20 74 68 65 0a 23 20 64 65 66  k that the.# def
2720: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
2730: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6c 6f 67  y constraint log
2740: 69 63 20 77 6f 72 6b 73 2e 0a 23 0a 70 72 6f 63  ic works..#.proc
2750: 20 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 7b 74   fkey2-2-test {t
2760: 6e 20 6e 6f 63 6f 6d 6d 69 74 20 73 71 6c 20 7b  n nocommit sql {
2770: 72 65 73 20 7b 7d 7d 7d 20 7b 0a 20 20 69 66 20  res {}}} {.  if 
2780: 7b 24 72 65 73 20 65 71 20 22 46 4b 56 22 7d 20  {$res eq "FKV"} 
2790: 7b 0a 20 20 20 20 73 65 74 20 65 78 70 65 63 74  {.    set expect
27a0: 65 64 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  ed {1 {foreign k
27b0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
27c0: 69 6c 65 64 7d 7d 0a 20 20 7d 20 65 6c 73 65 20  iled}}.  } else 
27d0: 7b 0a 20 20 20 20 73 65 74 20 65 78 70 65 63 74  {.    set expect
27e0: 65 64 20 5b 6c 69 73 74 20 30 20 24 72 65 73 5d  ed [list 0 $res]
27f0: 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .  }.  do_test f
2800: 6b 65 79 32 2d 32 2e 24 74 6e 20 5b 6c 69 73 74  key2-2.$tn [list
2810: 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 20   catchsql $sql] 
2820: 24 65 78 70 65 63 74 65 64 0a 20 20 69 66 20 7b  $expected.  if {
2830: 24 6e 6f 63 6f 6d 6d 69 74 7d 20 7b 0a 20 20 20  $nocommit} {.   
2840: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32   do_test fkey2-2
2850: 2e 24 7b 74 6e 7d 63 20 7b 0a 20 20 20 20 20 20  .${tn}c {.      
2860: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
2870: 20 20 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67      } {1 {foreig
2880: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2890: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 7d 0a   failed}}.  }.}.
28a0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 20  .fkey2-2-test 1 
28b0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
28c0: 4c 45 20 6e 6f 64 65 28 0a 20 20 20 20 6e 6f 64  LE node(.    nod
28d0: 65 69 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  eid PRIMARY KEY,
28e0: 0a 20 20 20 20 70 61 72 65 6e 74 20 52 45 46 45  .    parent REFE
28f0: 52 45 4e 43 45 53 20 6e 6f 64 65 20 44 45 46 45  RENCES node DEFE
2900: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
2910: 20 44 45 46 45 52 52 45 44 0a 20 20 29 3b 0a 20   DEFERRED.  );. 
2920: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 65   CREATE TABLE le
2930: 61 66 28 0a 20 20 20 20 63 65 6c 6c 69 64 20 50  af(.    cellid P
2940: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
2950: 70 61 72 65 6e 74 20 52 45 46 45 52 45 4e 43 45  parent REFERENCE
2960: 53 20 6e 6f 64 65 20 44 45 46 45 52 52 41 42 4c  S node DEFERRABL
2970: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
2980: 52 52 45 44 0a 20 20 29 3b 0a 7d 0a 0a 66 6b 65  RRED.  );.}..fke
2990: 79 32 2d 32 2d 74 65 73 74 20 31 20 20 30 20 22  y2-2-test 1  0 "
29a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65  INSERT INTO node
29b0: 20 56 41 4c 55 45 53 28 31 2c 20 30 29 22 20 20   VALUES(1, 0)"  
29c0: 20 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32       FKV.fkey2-2
29d0: 2d 74 65 73 74 20 32 20 20 30 20 22 42 45 47 49  -test 2  0 "BEGI
29e0: 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  N".fkey2-2-test 
29f0: 33 20 20 31 20 20 20 22 49 4e 53 45 52 54 20 49  3  1   "INSERT I
2a00: 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28  NTO node VALUES(
2a10: 31 2c 20 30 29 22 0a 66 6b 65 79 32 2d 32 2d 74  1, 0)".fkey2-2-t
2a20: 65 73 74 20 34 20 20 30 20 20 20 22 55 50 44 41  est 4  0   "UPDA
2a30: 54 45 20 6e 6f 64 65 20 53 45 54 20 70 61 72 65  TE node SET pare
2a40: 6e 74 20 3d 20 4e 55 4c 4c 22 0a 66 6b 65 79 32  nt = NULL".fkey2
2a50: 2d 32 2d 74 65 73 74 20 35 20 20 30 20 22 43 4f  -2-test 5  0 "CO
2a60: 4d 4d 49 54 22 0a 66 6b 65 79 32 2d 32 2d 74 65  MMIT".fkey2-2-te
2a70: 73 74 20 36 20 20 30 20 22 53 45 4c 45 43 54 20  st 6  0 "SELECT 
2a80: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2a90: 7b 7d 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65 73  {}}..fkey2-2-tes
2aa0: 74 20 37 20 20 30 20 22 42 45 47 49 4e 22 0a 66  t 7  0 "BEGIN".f
2ab0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 38 20 20 31  key2-2-test 8  1
2ac0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2ad0: 6c 65 61 66 20 56 41 4c 55 45 53 28 27 61 27 2c  leaf VALUES('a',
2ae0: 20 32 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73   2)".fkey2-2-tes
2af0: 74 20 39 20 20 31 20 20 20 22 49 4e 53 45 52 54  t 9  1   "INSERT
2b00: 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45   INTO node VALUE
2b10: 53 28 32 2c 20 30 29 22 0a 66 6b 65 79 32 2d 32  S(2, 0)".fkey2-2
2b20: 2d 74 65 73 74 20 31 30 20 30 20 20 20 22 55 50  -test 10 0   "UP
2b30: 44 41 54 45 20 6e 6f 64 65 20 53 45 54 20 70 61  DATE node SET pa
2b40: 72 65 6e 74 20 3d 20 31 20 57 48 45 52 45 20 6e  rent = 1 WHERE n
2b50: 6f 64 65 69 64 20 3d 20 32 22 0a 66 6b 65 79 32  odeid = 2".fkey2
2b60: 2d 32 2d 74 65 73 74 20 31 31 20 30 20 22 43 4f  -2-test 11 0 "CO
2b70: 4d 4d 49 54 22 0a 66 6b 65 79 32 2d 32 2d 74 65  MMIT".fkey2-2-te
2b80: 73 74 20 31 32 20 30 20 22 53 45 4c 45 43 54 20  st 12 0 "SELECT 
2b90: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2ba0: 7b 7d 20 32 20 31 7d 0a 66 6b 65 79 32 2d 32 2d  {} 2 1}.fkey2-2-
2bb0: 74 65 73 74 20 31 33 20 30 20 22 53 45 4c 45 43  test 13 0 "SELEC
2bc0: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
2bd0: 61 20 32 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  a 2}..fkey2-2-te
2be0: 73 74 20 31 34 20 30 20 22 42 45 47 49 4e 22 0a  st 14 0 "BEGIN".
2bf0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 35 20  fkey2-2-test 15 
2c00: 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  1   "DELETE FROM
2c10: 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f 64 65   node WHERE node
2c20: 69 64 20 3d 20 32 22 0a 66 6b 65 79 32 2d 32 2d  id = 2".fkey2-2-
2c30: 74 65 73 74 20 31 36 20 30 20 20 20 22 49 4e 53  test 16 0   "INS
2c40: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
2c50: 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29 22 0a 66  LUES(2, NULL)".f
2c60: 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 37 20 30  key2-2-test 17 0
2c70: 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65 79 32 2d   "COMMIT".fkey2-
2c80: 32 2d 74 65 73 74 20 31 38 20 30 20 22 53 45 4c  2-test 18 0 "SEL
2c90: 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64 65 22  ECT * FROM node"
2ca0: 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 66 6b 65   {1 {} 2 {}}.fke
2cb0: 79 32 2d 32 2d 74 65 73 74 20 31 39 20 30 20 22  y2-2-test 19 0 "
2cc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 65  SELECT * FROM le
2cd0: 61 66 22 20 7b 61 20 32 7d 0a 0a 66 6b 65 79 32  af" {a 2}..fkey2
2ce0: 2d 32 2d 74 65 73 74 20 32 30 20 30 20 22 42 45  -2-test 20 0 "BE
2cf0: 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73  GIN".fkey2-2-tes
2d00: 74 20 32 31 20 30 20 20 20 22 49 4e 53 45 52 54  t 21 0   "INSERT
2d10: 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45   INTO leaf VALUE
2d20: 53 28 27 62 27 2c 20 31 29 22 0a 66 6b 65 79 32  S('b', 1)".fkey2
2d30: 2d 32 2d 74 65 73 74 20 32 32 20 30 20 20 20 22  -2-test 22 0   "
2d40: 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 22 0a  SAVEPOINT save".
2d50: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 33 20  fkey2-2-test 23 
2d60: 30 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52  0     "DELETE FR
2d70: 4f 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f  OM node WHERE no
2d80: 64 65 69 64 20 3d 20 31 22 0a 66 6b 65 79 32 2d  deid = 1".fkey2-
2d90: 32 2d 74 65 73 74 20 32 34 20 30 20 20 20 22 52  2-test 24 0   "R
2da0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 22  OLLBACK TO save"
2db0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 35  .fkey2-2-test 25
2dc0: 20 30 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65 79   0 "COMMIT".fkey
2dd0: 32 2d 32 2d 74 65 73 74 20 32 36 20 30 20 22 53  2-2-test 26 0 "S
2de0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64  ELECT * FROM nod
2df0: 65 22 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 66  e" {1 {} 2 {}}.f
2e00: 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 37 20 30  key2-2-test 27 0
2e10: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2e20: 6c 65 61 66 22 20 7b 61 20 32 20 62 20 31 7d 0a  leaf" {a 2 b 1}.
2e30: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 38  .fkey2-2-test 28
2e40: 20 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79 32   0 "BEGIN".fkey2
2e50: 2d 32 2d 74 65 73 74 20 32 39 20 30 20 20 20 22  -2-test 29 0   "
2e60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66  INSERT INTO leaf
2e70: 20 56 41 4c 55 45 53 28 27 63 27 2c 20 31 29 22   VALUES('c', 1)"
2e80: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 30  .fkey2-2-test 30
2e90: 20 30 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20   0   "SAVEPOINT 
2ea0: 73 61 76 65 22 0a 66 6b 65 79 32 2d 32 2d 74 65  save".fkey2-2-te
2eb0: 73 74 20 33 31 20 30 20 20 20 20 20 22 44 45 4c  st 31 0     "DEL
2ec0: 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20 57 48  ETE FROM node WH
2ed0: 45 52 45 20 6e 6f 64 65 69 64 20 3d 20 31 22 0a  ERE nodeid = 1".
2ee0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 32 20  fkey2-2-test 32 
2ef0: 31 20 20 20 22 52 45 4c 45 41 53 45 20 73 61 76  1   "RELEASE sav
2f00: 65 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  e".fkey2-2-test 
2f10: 33 33 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  33 1   "DELETE F
2f20: 52 4f 4d 20 6c 65 61 66 20 57 48 45 52 45 20 63  ROM leaf WHERE c
2f30: 65 6c 6c 69 64 20 3d 20 27 62 27 22 0a 66 6b 65  ellid = 'b'".fke
2f40: 79 32 2d 32 2d 74 65 73 74 20 33 34 20 30 20 20  y2-2-test 34 0  
2f50: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65   "DELETE FROM le
2f60: 61 66 20 57 48 45 52 45 20 63 65 6c 6c 69 64 20  af WHERE cellid 
2f70: 3d 20 27 63 27 22 0a 66 6b 65 79 32 2d 32 2d 74  = 'c'".fkey2-2-t
2f80: 65 73 74 20 33 35 20 30 20 22 43 4f 4d 4d 49 54  est 35 0 "COMMIT
2f90: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33  ".fkey2-2-test 3
2fa0: 36 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52  6 0 "SELECT * FR
2fb0: 4f 4d 20 6e 6f 64 65 22 20 7b 32 20 7b 7d 7d 20  OM node" {2 {}} 
2fc0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 37  .fkey2-2-test 37
2fd0: 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   0 "SELECT * FRO
2fe0: 4d 20 6c 65 61 66 22 20 7b 61 20 32 7d 0a 0a 66  M leaf" {a 2}..f
2ff0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 38 20 30  key2-2-test 38 0
3000: 20 22 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65   "SAVEPOINT oute
3010: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
3020: 33 39 20 31 20 20 20 22 49 4e 53 45 52 54 20 49  39 1   "INSERT I
3030: 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28  NTO leaf VALUES(
3040: 27 64 27 2c 20 33 29 22 0a 66 6b 65 79 32 2d 32  'd', 3)".fkey2-2
3050: 2d 74 65 73 74 20 34 30 20 31 20 22 52 45 4c 45  -test 40 1 "RELE
3060: 41 53 45 20 6f 75 74 65 72 22 20 20 20 20 46 4b  ASE outer"    FK
3070: 56 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 34  V.fkey2-2-test 4
3080: 31 20 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e  1 1   "INSERT IN
3090: 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28 27  TO leaf VALUES('
30a0: 65 27 2c 20 33 29 22 0a 66 6b 65 79 32 2d 32 2d  e', 3)".fkey2-2-
30b0: 74 65 73 74 20 34 32 20 30 20 20 20 22 49 4e 53  test 42 0   "INS
30c0: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
30d0: 4c 55 45 53 28 33 2c 20 32 29 22 0a 66 6b 65 79  LUES(3, 2)".fkey
30e0: 32 2d 32 2d 74 65 73 74 20 34 33 20 30 20 22 52  2-2-test 43 0 "R
30f0: 45 4c 45 41 53 45 20 6f 75 74 65 72 22 0a 0a 66  ELEASE outer"..f
3100: 6b 65 79 32 2d 32 2d 74 65 73 74 20 34 34 20 30  key2-2-test 44 0
3110: 20 22 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65   "SAVEPOINT oute
3120: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
3130: 34 35 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  45 1   "DELETE F
3140: 52 4f 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e  ROM node WHERE n
3150: 6f 64 65 69 64 3d 33 22 0a 66 6b 65 79 32 2d 32  odeid=3".fkey2-2
3160: 2d 74 65 73 74 20 34 37 20 30 20 20 20 22 49 4e  -test 47 0   "IN
3170: 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56  SERT INTO node V
3180: 41 4c 55 45 53 28 33 2c 20 32 29 22 0a 66 6b 65  ALUES(3, 2)".fke
3190: 79 32 2d 32 2d 74 65 73 74 20 34 38 20 30 20 22  y2-2-test 48 0 "
31a0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 75 74 65  ROLLBACK TO oute
31b0: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
31c0: 34 39 20 30 20 22 52 45 4c 45 41 53 45 20 6f 75  49 0 "RELEASE ou
31d0: 74 65 72 22 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  ter"..fkey2-2-te
31e0: 73 74 20 35 30 20 30 20 22 53 41 56 45 50 4f 49  st 50 0 "SAVEPOI
31f0: 4e 54 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d  NT outer".fkey2-
3200: 32 2d 74 65 73 74 20 35 31 20 31 20 20 20 22 49  2-test 51 1   "I
3210: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20  NSERT INTO leaf 
3220: 56 41 4c 55 45 53 28 27 66 27 2c 20 34 29 22 0a  VALUES('f', 4)".
3230: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 32 20  fkey2-2-test 52 
3240: 31 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20 69  1   "SAVEPOINT i
3250: 6e 6e 65 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65  nner".fkey2-2-te
3260: 73 74 20 35 33 20 31 20 20 20 20 20 22 49 4e 53  st 53 1     "INS
3270: 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41  ERT INTO leaf VA
3280: 4c 55 45 53 28 27 67 27 2c 20 34 29 22 0a 66 6b  LUES('g', 4)".fk
3290: 65 79 32 2d 32 2d 74 65 73 74 20 35 34 20 31 20  ey2-2-test 54 1 
32a0: 20 22 52 45 4c 45 41 53 45 20 6f 75 74 65 72 22   "RELEASE outer"
32b0: 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32 2d 74     FKV.fkey2-2-t
32c0: 65 73 74 20 35 35 20 31 20 20 20 22 52 4f 4c 4c  est 55 1   "ROLL
32d0: 42 41 43 4b 20 54 4f 20 69 6e 6e 65 72 22 0a 66  BACK TO inner".f
32e0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 36 20 30  key2-2-test 56 0
32f0: 20 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20    "COMMIT"      
3300: 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32 2d      FKV.fkey2-2-
3310: 74 65 73 74 20 35 37 20 30 20 20 20 22 49 4e 53  test 57 0   "INS
3320: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
3330: 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 29 22 0a 66  LUES(4, NULL)".f
3340: 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 38 20 30  key2-2-test 58 0
3350: 20 22 52 45 4c 45 41 53 45 20 6f 75 74 65 72 22   "RELEASE outer"
3360: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 39  .fkey2-2-test 59
3370: 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   0 "SELECT * FRO
3380: 4d 20 6e 6f 64 65 22 20 7b 32 20 7b 7d 20 33 20  M node" {2 {} 3 
3390: 32 20 34 20 7b 7d 7d 0a 66 6b 65 79 32 2d 32 2d  2 4 {}}.fkey2-2-
33a0: 74 65 73 74 20 36 30 20 30 20 22 53 45 4c 45 43  test 60 0 "SELEC
33b0: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
33c0: 61 20 32 20 64 20 33 20 65 20 33 20 66 20 34 7d  a 2 d 3 e 3 f 4}
33d0: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
33e0: 67 20 73 65 74 20 6f 66 20 74 65 73 74 73 20 63  g set of tests c
33f0: 68 65 63 6b 20 74 68 61 74 20 69 66 20 61 20 73  heck that if a s
3400: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 61 66  tatement that af
3410: 66 65 63 74 73 20 0a 23 20 6d 75 6c 74 69 70 6c  fects .# multipl
3420: 65 20 72 6f 77 73 20 76 69 6f 6c 61 74 65 73 20  e rows violates 
3430: 73 6f 6d 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  some foreign key
3440: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
3450: 65 6e 20 73 74 72 69 6b 65 73 20 61 20 0a 23 20  en strikes a .# 
3460: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20  constraint that 
3470: 63 61 75 73 65 73 20 74 68 65 20 73 74 61 74 65  causes the state
3480: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
3490: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
34a0: 63 6b 2c 20 0a 23 20 74 68 65 20 64 65 66 65 72  ck, .# the defer
34b0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
34c0: 6f 75 6e 74 65 72 20 69 73 20 63 6f 72 72 65 63  ounter is correc
34d0: 74 6c 79 20 72 65 73 65 74 20 74 6f 20 74 68 65  tly reset to the
34e0: 20 76 61 6c 75 65 20 69 74 20 0a 23 20 68 61 64   value it .# had
34f0: 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
3500: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
3510: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 23 0a  n was opened..#.
3520: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 31 20  fkey2-2-test 61 
3530: 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79 32 2d  0 "BEGIN".fkey2-
3540: 32 2d 74 65 73 74 20 36 32 20 30 20 20 20 22 44  2-test 62 0   "D
3550: 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 66 22  ELETE FROM leaf"
3560: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 33  .fkey2-2-test 63
3570: 20 30 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   0   "DELETE FRO
3580: 4d 20 6e 6f 64 65 22 0a 66 6b 65 79 32 2d 32 2d  M node".fkey2-2-
3590: 74 65 73 74 20 36 34 20 31 20 20 20 22 49 4e 53  test 64 1   "INS
35a0: 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41  ERT INTO leaf VA
35b0: 4c 55 45 53 28 27 61 27 2c 20 31 29 22 0a 66 6b  LUES('a', 1)".fk
35c0: 65 79 32 2d 32 2d 74 65 73 74 20 36 35 20 31 20  ey2-2-test 65 1 
35d0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c    "INSERT INTO l
35e0: 65 61 66 20 56 41 4c 55 45 53 28 27 62 27 2c 20  eaf VALUES('b', 
35f0: 32 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  2)".fkey2-2-test
3600: 20 36 36 20 31 20 20 20 22 49 4e 53 45 52 54 20   66 1   "INSERT 
3610: 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53  INTO leaf VALUES
3620: 28 27 63 27 2c 20 31 29 22 0a 64 6f 5f 74 65 73  ('c', 1)".do_tes
3630: 74 20 66 6b 65 79 32 2d 32 2d 74 65 73 74 2d 36  t fkey2-2-test-6
3640: 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 20  7 {.  catchsql  
3650: 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
3660: 49 4e 54 4f 20 6e 6f 64 65 20 53 45 4c 45 43 54  INTO node SELECT
3670: 20 70 61 72 65 6e 74 2c 20 33 20 46 52 4f 4d 20   parent, 3 FROM 
3680: 6c 65 61 66 22 0a 7d 20 7b 31 20 7b 50 52 49 4d  leaf".} {1 {PRIM
3690: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
36a0: 75 6e 69 71 75 65 7d 7d 0a 66 6b 65 79 32 2d 32  unique}}.fkey2-2
36b0: 2d 74 65 73 74 20 36 38 20 30 20 22 43 4f 4d 4d  -test 68 0 "COMM
36c0: 49 54 22 20 20 20 20 20 20 20 20 20 20 20 46 4b  IT"           FK
36d0: 56 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36  V.fkey2-2-test 6
36e0: 39 20 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e  9 1   "INSERT IN
36f0: 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 31  TO node VALUES(1
3700: 2c 20 4e 55 4c 4c 29 22 0a 66 6b 65 79 32 2d 32  , NULL)".fkey2-2
3710: 2d 74 65 73 74 20 37 30 20 30 20 20 20 22 49 4e  -test 70 0   "IN
3720: 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56  SERT INTO node V
3730: 41 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29 22 0a  ALUES(2, NULL)".
3740: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 37 31 20  fkey2-2-test 71 
3750: 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 66 6b 65 79  0 "COMMIT"..fkey
3760: 32 2d 32 2d 74 65 73 74 20 37 32 20 30 20 22 42  2-2-test 72 0 "B
3770: 45 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65  EGIN".fkey2-2-te
3780: 73 74 20 37 33 20 31 20 20 20 22 44 45 4c 45 54  st 73 1   "DELET
3790: 45 20 46 52 4f 4d 20 6e 6f 64 65 22 0a 66 6b 65  E FROM node".fke
37a0: 79 32 2d 32 2d 74 65 73 74 20 37 34 20 30 20 20  y2-2-test 74 0  
37b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f   "INSERT INTO no
37c0: 64 65 28 6e 6f 64 65 69 64 29 20 53 45 4c 45 43  de(nodeid) SELEC
37d0: 54 20 44 49 53 54 49 4e 43 54 20 70 61 72 65 6e  T DISTINCT paren
37e0: 74 20 46 52 4f 4d 20 6c 65 61 66 22 0a 66 6b 65  t FROM leaf".fke
37f0: 79 32 2d 32 2d 74 65 73 74 20 37 35 20 30 20 22  y2-2-test 75 0 "
3800: 43 4f 4d 4d 49 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d  COMMIT"..#------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73  ---.# Test cases
3860: 20 66 6b 65 79 32 2d 33 2e 2a 20 74 65 73 74 20   fkey2-3.* test 
3870: 74 68 61 74 20 61 20 70 72 6f 67 72 61 6d 20 74  that a program t
3880: 68 61 74 20 65 78 65 63 75 74 65 73 20 66 6f 72  hat executes for
3890: 65 69 67 6e 20 6b 65 79 0a 23 20 61 63 74 69 6f  eign key.# actio
38a0: 6e 73 20 28 43 41 53 43 41 44 45 2c 20 53 45 54  ns (CASCADE, SET
38b0: 20 44 45 46 41 55 4c 54 2c 20 53 45 54 20 4e 55   DEFAULT, SET NU
38c0: 4c 4c 20 65 74 63 2e 29 20 6f 72 20 74 65 73 74  LL etc.) or test
38d0: 73 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  s FK constraints
38e0: 0a 23 20 6f 70 65 6e 73 20 61 20 73 74 61 74 65  .# opens a state
38f0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
3900: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 23 0a   if required..#.
3910: 23 20 66 6b 65 79 32 2d 33 2e 31 2e 2a 3a 20 54  # fkey2-3.1.*: T
3920: 65 73 74 20 55 50 44 41 54 45 20 73 74 61 74 65  est UPDATE state
3930: 6d 65 6e 74 73 2e 0a 23 20 66 6b 65 79 32 2d 33  ments..# fkey2-3
3940: 2e 32 2e 2a 3a 20 54 65 73 74 20 44 45 4c 45 54  .2.*: Test DELET
3950: 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23 0a  E statements..#.
3960: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
3970: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e  do_test fkey2-3.
3980: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
3990: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
39a0: 4c 45 20 61 62 28 61 20 50 52 49 4d 41 52 59 20  LE ab(a PRIMARY 
39b0: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  KEY, b);.    CRE
39c0: 41 54 45 20 54 41 42 4c 45 20 63 64 28 0a 20 20  ATE TABLE cd(.  
39d0: 20 20 20 20 63 20 50 52 49 4d 41 52 59 20 4b 45      c PRIMARY KE
39e0: 59 20 52 45 46 45 52 45 4e 43 45 53 20 61 62 20  Y REFERENCES ab 
39f0: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
3a00: 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  E ON DELETE CASC
3a10: 41 44 45 2c 20 0a 20 20 20 20 20 20 64 0a 20 20  ADE, .      d.  
3a20: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
3a30: 54 41 42 4c 45 20 65 66 28 0a 20 20 20 20 20 20  TABLE ef(.      
3a40: 65 20 52 45 46 45 52 45 4e 43 45 53 20 63 64 20  e REFERENCES cd 
3a50: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
3a60: 45 2c 20 0a 20 20 20 20 20 20 66 2c 20 43 48 45  E, .      f, CHE
3a70: 43 4b 20 28 65 21 3d 35 29 0a 20 20 20 20 29 3b  CK (e!=5).    );
3a80: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
3a90: 74 20 66 6b 65 79 32 2d 33 2e 31 2e 32 20 7b 0a  t fkey2-3.1.2 {.
3aa0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3ab0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
3ac0: 41 4c 55 45 53 28 31 2c 20 27 62 27 29 3b 0a 20  ALUES(1, 'b');. 
3ad0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
3ae0: 64 20 56 41 4c 55 45 53 28 31 2c 20 27 64 27 29  d VALUES(1, 'd')
3af0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3b00: 4f 20 65 66 20 56 41 4c 55 45 53 28 31 2c 20 27  O ef VALUES(1, '
3b10: 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e');.  }.} {}.do
3b20: 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 31 2e  _test fkey2-3.1.
3b30: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
3b40: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61   UPDATE ab SET a
3b50: 20 3d 20 35 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e   = 5 }.} {1 {con
3b60: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
3b70: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33  .do_test fkey2-3
3b80: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
3b90: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3ba0: 20 61 62 20 7d 0a 7d 20 7b 31 20 62 7d 0a 64 6f   ab }.} {1 b}.do
3bb0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 31 2e  _test fkey2-3.1.
3bc0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45  4 {.  execsql BE
3bd0: 47 49 4e 3b 0a 20 20 63 61 74 63 68 73 71 6c 20  GIN;.  catchsql 
3be0: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
3bf0: 61 20 3d 20 35 20 7d 0a 7d 20 7b 31 20 7b 63 6f  a = 5 }.} {1 {co
3c00: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
3c10: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
3c20: 33 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  3.1.5 {.  execsq
3c30: 6c 20 43 4f 4d 4d 49 54 3b 0a 20 20 65 78 65 63  l COMMIT;.  exec
3c40: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3c50: 52 4f 4d 20 61 62 3b 20 53 45 4c 45 43 54 20 2a  ROM ab; SELECT *
3c60: 20 46 52 4f 4d 20 63 64 3b 20 53 45 4c 45 43 54   FROM cd; SELECT
3c70: 20 2a 20 46 52 4f 4d 20 65 66 20 7d 0a 7d 20 7b   * FROM ef }.} {
3c80: 31 20 62 20 31 20 64 20 31 20 65 7d 0a 0a 64 6f  1 b 1 d 1 e}..do
3c90: 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 32 2e  _test fkey2-3.2.
3ca0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45  1 {.  execsql BE
3cb0: 47 49 4e 3b 0a 20 20 63 61 74 63 68 73 71 6c 20  GIN;.  catchsql 
3cc0: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62  { DELETE FROM ab
3cd0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
3ce0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
3cf0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
3d00: 20 66 6b 65 79 32 2d 33 2e 32 2e 32 20 7b 0a 20   fkey2-3.2.2 {. 
3d10: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
3d20: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
3d30: 43 54 20 2a 20 46 52 4f 4d 20 61 62 3b 20 53 45  CT * FROM ab; SE
3d40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 64 3b 20  LECT * FROM cd; 
3d50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 66  SELECT * FROM ef
3d60: 20 7d 0a 7d 20 7b 31 20 62 20 31 20 64 20 31 20   }.} {1 b 1 d 1 
3d70: 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
3d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3dc0: 20 54 65 73 74 20 63 61 73 65 73 20 66 6b 65 79   Test cases fkey
3dd0: 32 2d 34 2e 2a 20 74 65 73 74 20 74 68 61 74 20  2-4.* test that 
3de0: 72 65 63 75 72 73 69 76 65 20 66 6f 72 65 69 67  recursive foreig
3df0: 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 20 0a 23  n key actions .#
3e00: 20 28 69 2e 65 2e 20 43 41 53 43 41 44 45 29 20   (i.e. CASCADE) 
3e10: 61 72 65 20 61 6c 6c 6f 77 65 64 20 65 76 65 6e  are allowed even
3e20: 20 69 66 20 72 65 63 75 72 73 69 76 65 20 74 72   if recursive tr
3e30: 69 67 67 65 72 73 20 61 72 65 20 64 69 73 61 62  iggers are disab
3e40: 6c 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  led..#.drop_all_
3e50: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66  tables.do_test f
3e60: 6b 65 79 32 2d 34 2e 31 20 7b 0a 20 20 65 78 65  key2-4.1 {.  exe
3e70: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
3e80: 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20  E TABLE t1(.    
3e90: 20 20 6e 6f 64 65 20 50 52 49 4d 41 52 59 20 4b    node PRIMARY K
3ea0: 45 59 2c 20 0a 20 20 20 20 20 20 70 61 72 65 6e  EY, .      paren
3eb0: 74 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  t REFERENCES t1 
3ec0: 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44  ON DELETE CASCAD
3ed0: 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  E.    );.    CRE
3ee0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 6e 6f 64  ATE TABLE t2(nod
3ef0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70  e PRIMARY KEY, p
3f00: 61 72 65 6e 74 29 3b 0a 20 20 20 20 43 52 45 41  arent);.    CREA
3f10: 54 45 20 54 52 49 47 47 45 52 20 74 32 74 20 41  TE TRIGGER t2t A
3f20: 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74  FTER DELETE ON t
3f30: 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45  2 BEGIN.      DE
3f40: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
3f50: 52 45 20 70 61 72 65 6e 74 20 3d 20 6f 6c 64 2e  RE parent = old.
3f60: 6e 6f 64 65 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  node;.    END;. 
3f70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3f80: 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c  1 VALUES(1, NULL
3f90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3fa0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
3fb0: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
3fc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
3fd0: 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   1);.    INSERT 
3fe0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34  INTO t1 VALUES(4
3ff0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
4000: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4010: 35 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 2);.    INSER
4020: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4030: 28 36 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45  (6, 3);.    INSE
4040: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4050: 53 28 37 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53  S(7, 3);.    INS
4060: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
4070: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4080: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
4090: 6b 65 79 32 2d 34 2e 32 20 7b 0a 20 20 65 78 65  key2-4.2 {.  exe
40a0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72 65  csql { PRAGMA re
40b0: 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
40c0: 20 3d 20 6f 66 66 20 7d 0a 20 20 65 78 65 63 73   = off }.  execs
40d0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
40e0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
40f0: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 6f 64 65  OM t1 WHERE node
4100: 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45   = 1;.      SELE
4110: 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 31 3b  CT node FROM t1;
4120: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
4130: 74 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a 20 20  t fkey2-4.3 {.  
4140: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
4150: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
4160: 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a  WHERE node = 1;.
4170: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f 64        SELECT nod
4180: 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 52  e FROM t2;.    R
4190: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
41a0: 34 20 35 20 36 20 37 7d 0a 64 6f 5f 74 65 73 74  4 5 6 7}.do_test
41b0: 20 66 6b 65 79 32 2d 34 2e 34 20 7b 0a 20 20 65   fkey2-4.4 {.  e
41c0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
41d0: 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
41e0: 72 73 20 3d 20 6f 6e 20 7d 0a 20 20 65 78 65 63  rs = on }.  exec
41f0: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
4200: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
4210: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 6f 64  ROM t1 WHERE nod
4220: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c  e = 1;.      SEL
4230: 45 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 31  ECT node FROM t1
4240: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
4250: 73 74 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a 20  st fkey2-4.3 {. 
4260: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
4270: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
4280: 20 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b   WHERE node = 1;
4290: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f  .      SELECT no
42a0: 64 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  de FROM t2;.    
42b0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
42c0: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4310: 20 54 65 73 74 20 63 61 73 65 73 20 66 6b 65 79   Test cases fkey
4320: 32 2d 35 2e 2a 20 76 65 72 69 66 79 20 74 68 61  2-5.* verify tha
4330: 74 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  t the incrementa
4340: 6c 20 62 6c 6f 62 20 41 50 49 20 6d 61 79 20 6e  l blob API may n
4350: 6f 74 0a 23 20 77 72 69 74 65 20 74 6f 20 61 20  ot.# write to a 
4360: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6c 75  foreign key colu
4370: 6d 6e 20 77 68 69 6c 65 20 66 6f 72 65 69 67 6e  mn while foreign
4380: 2d 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65  -keys are enable
4390: 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
43a0: 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20 69  bles.ifcapable i
43b0: 6e 63 72 62 6c 6f 62 20 7b 0a 20 20 64 6f 5f 74  ncrblob {.  do_t
43c0: 65 73 74 20 66 6b 65 79 32 2d 35 2e 31 20 7b 0a  est fkey2-5.1 {.
43d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
43e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
43f0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
4400: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
4410: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
4420: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
4430: 46 45 52 45 4e 43 45 53 20 74 31 28 61 29 29 3b  FERENCES t1(a));
4440: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4450: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 68 65  TO t1 VALUES('he
4460: 6c 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 3b 0a  llo', 'world');.
4470: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4480: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6b 65 79  O t2 VALUES('key
4490: 27 2c 20 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20  ', 'hello');.   
44a0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
44b0: 65 73 74 20 66 6b 65 79 32 2d 35 2e 32 20 7b 0a  est fkey2-5.2 {.
44c0: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
44d0: 68 20 7b 20 73 65 74 20 66 64 20 5b 64 62 20 69  h { set fd [db i
44e0: 6e 63 72 62 6c 6f 62 20 74 32 20 62 20 31 5d 20  ncrblob t2 b 1] 
44f0: 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73 74 20  } msg].    list 
4500: 24 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20  $rc $msg.  } {1 
4510: 7b 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  {cannot open for
4520: 65 69 67 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eign key column 
4530: 66 6f 72 20 77 72 69 74 69 6e 67 7d 7d 0a 20 20  for writing}}.  
4540: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35 2e  do_test fkey2-5.
4550: 33 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b  3 {.    set rc [
4560: 63 61 74 63 68 20 7b 20 73 65 74 20 66 64 20 5b  catch { set fd [
4570: 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61  db incrblob -rea
4580: 64 6f 6e 6c 79 20 74 32 20 62 20 31 5d 20 7d 20  donly t2 b 1] } 
4590: 6d 73 67 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24  msg].    close $
45a0: 66 64 0a 20 20 20 20 73 65 74 20 72 63 0a 20 20  fd.    set rc.  
45b0: 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {0}.  do_test 
45c0: 66 6b 65 79 32 2d 35 2e 34 20 7b 0a 20 20 20 20  fkey2-5.4 {.    
45d0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
45e0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
45f0: 6f 66 66 20 7d 0a 20 20 20 20 73 65 74 20 72 63  off }.    set rc
4600: 20 5b 63 61 74 63 68 20 7b 20 73 65 74 20 66 64   [catch { set fd
4610: 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74 32   [db incrblob t2
4620: 20 62 20 31 5d 20 7d 20 6d 73 67 5d 0a 20 20 20   b 1] } msg].   
4630: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 73   close $fd.    s
4640: 65 74 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20  et rc.  } {0}.  
4650: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35 2e  do_test fkey2-5.
4660: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
4670: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
4680: 5f 6b 65 79 73 20 3d 20 6f 6e 20 7d 0a 20 20 7d  _keys = on }.  }
4690: 20 7b 7d 0a 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f   {}.}..drop_all_
46a0: 74 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65  tables.ifcapable
46b0: 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f 74   vacuum {.  do_t
46c0: 65 73 74 20 66 6b 65 79 32 2d 36 2e 31 20 7b 0a  est fkey2-6.1 {.
46d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
46e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
46f0: 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53   t1(a REFERENCES
4700: 20 74 32 28 63 29 2c 20 62 29 3b 0a 20 20 20 20   t2(c), b);.    
4710: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4720: 32 28 63 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a  2(c UNIQUE, b);.
4730: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4740: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
4750: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
4760: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
4770: 2c 20 32 29 3b 0a 20 20 20 20 20 20 56 41 43 55  , 2);.      VACU
4780: 55 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  UM;.    }.  } {}
4790: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
47e0: 20 54 65 73 74 20 74 68 61 74 20 69 74 20 69 73   Test that it is
47f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
4800: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
4810: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 63  ARY KEY as the c
4820: 68 69 6c 64 20 6b 65 79 0a 23 20 6f 66 20 61 20  hild key.# of a 
4830: 66 6f 72 65 69 67 6e 20 63 6f 6e 73 74 72 61 69  foreign constrai
4840: 6e 74 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f  nt..# .drop_all_
4850: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66  tables.do_test f
4860: 6b 65 79 32 2d 37 2e 31 20 7b 0a 20 20 65 78 65  key2-7.1 {.  exe
4870: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4880: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
4890: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
48a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
48b0: 32 28 63 20 49 4e 54 45 47 45 52 20 50 52 49 4d  2(c INTEGER PRIM
48c0: 41 52 59 20 4b 45 59 20 52 45 46 45 52 45 4e 43  ARY KEY REFERENC
48d0: 45 53 20 74 31 2c 20 62 29 3b 0a 20 20 7d 0a 7d  ES t1, b);.  }.}
48e0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
48f0: 32 2d 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  2-7.2 {.  catchs
4900: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4910: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 41   t2 VALUES(1, 'A
4920: 27 29 3b 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  '); }.} {1 {fore
4930: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
4940: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
4950: 65 73 74 20 66 6b 65 79 32 2d 37 2e 33 20 7b 0a  est fkey2-7.3 {.
4960: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
4970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4980: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
4990: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
49a0: 20 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20   VALUES(2, 3);. 
49b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
49c0: 32 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27 29  2 VALUES(1, 'A')
49d0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
49e0: 73 74 20 66 6b 65 79 32 2d 37 2e 34 20 7b 0a 20  st fkey2-7.4 {. 
49f0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
4a00: 45 20 74 32 20 53 45 54 20 63 20 3d 20 32 20 7d  E t2 SET c = 2 }
4a10: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
4a20: 65 79 32 2d 37 2e 35 20 7b 0a 20 20 63 61 74 63  ey2-7.5 {.  catc
4a30: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32  hsql { UPDATE t2
4a40: 20 53 45 54 20 63 20 3d 20 33 20 7d 0a 7d 20 7b   SET c = 3 }.} {
4a50: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
4a60: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
4a70: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
4a80: 2d 37 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71  -7.6 {.  catchsq
4a90: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
4aa0: 74 31 20 57 48 45 52 45 20 61 20 3d 20 32 20 7d  t1 WHERE a = 2 }
4ab0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
4ac0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
4ad0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
4ae0: 6b 65 79 32 2d 37 2e 37 20 7b 0a 20 20 65 78 65  key2-7.7 {.  exe
4af0: 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  csql { DELETE FR
4b00: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
4b10: 31 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  1 }.} {}.do_test
4b20: 20 66 6b 65 79 32 2d 37 2e 38 20 7b 0a 20 20 63   fkey2-7.8 {.  c
4b30: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
4b40: 20 74 31 20 53 45 54 20 61 20 3d 20 33 20 7d 0a   t1 SET a = 3 }.
4b50: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
4b60: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
4b70: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
4b80: 65 79 32 2d 37 2e 39 20 7b 0a 20 20 63 61 74 63  ey2-7.9 {.  catc
4b90: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32  hsql { UPDATE t2
4ba0: 20 53 45 54 20 72 6f 77 69 64 20 3d 20 33 20 7d   SET rowid = 3 }
4bb0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
4bc0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
4bd0: 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  iled}}..#-------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
4c30: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
4c40: 65 20 74 6f 20 65 6e 61 62 6c 65 2f 64 69 73 61  e to enable/disa
4c50: 62 6c 65 20 46 4b 20 73 75 70 70 6f 72 74 20 77  ble FK support w
4c60: 68 69 6c 65 20 61 0a 23 20 74 72 61 6e 73 61 63  hile a.# transac
4c70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 23 20  tion is open..# 
4c80: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
4c90: 0a 70 72 6f 63 20 66 6b 65 79 32 2d 38 2d 74 65  .proc fkey2-8-te
4ca0: 73 74 20 7b 74 6e 20 7a 53 71 6c 20 76 61 6c 75  st {tn zSql valu
4cb0: 65 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  e} {.  do_test f
4cc0: 6b 65 79 2d 32 2e 38 2e 24 74 6e 2e 31 20 5b 6c  key-2.8.$tn.1 [l
4cd0: 69 73 74 20 65 78 65 63 73 71 6c 20 24 7a 53 71  ist execsql $zSq
4ce0: 6c 5d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20  l] {}.  do_test 
4cf0: 66 6b 65 79 2d 32 2e 38 2e 24 74 6e 2e 32 20 7b  fkey-2.8.$tn.2 {
4d00: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
4d10: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 7d   foreign_keys" }
4d20: 20 24 76 61 6c 75 65 0a 7d 0a 66 6b 65 79 32 2d   $value.}.fkey2-
4d30: 38 2d 74 65 73 74 20 20 31 20 7b 20 50 52 41 47  8-test  1 { PRAG
4d40: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
4d50: 3d 20 30 20 20 20 20 20 7d 20 30 0a 66 6b 65 79  = 0     } 0.fkey
4d60: 32 2d 38 2d 74 65 73 74 20 20 32 20 7b 20 50 52  2-8-test  2 { PR
4d70: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
4d80: 73 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66 6b  s = 1     } 1.fk
4d90: 65 79 32 2d 38 2d 74 65 73 74 20 20 33 20 7b 20  ey2-8-test  3 { 
4da0: 42 45 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  BEGIN           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 31 0a              } 1.
4dc0: 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 34 20  fkey2-8-test  4 
4dd0: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
4de0: 5f 6b 65 79 73 20 3d 20 30 20 20 20 20 20 7d 20  _keys = 0     } 
4df0: 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20  1.fkey2-8-test  
4e00: 35 20 7b 20 43 4f 4d 4d 49 54 20 20 20 20 20 20  5 { COMMIT      
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74  } 1.fkey2-8-test
4e30: 20 20 36 20 7b 20 50 52 41 47 4d 41 20 66 6f 72    6 { PRAGMA for
4e40: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 30 20 20 20  eign_keys = 0   
4e50: 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65    } 0.fkey2-8-te
4e60: 73 74 20 20 37 20 7b 20 42 45 47 49 4e 20 20 20  st  7 { BEGIN   
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d      } 0.fkey2-8-
4e90: 74 65 73 74 20 20 38 20 7b 20 50 52 41 47 4d 41  test  8 { PRAGMA
4ea0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
4eb0: 31 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d  1     } 0.fkey2-
4ec0: 38 2d 74 65 73 74 20 20 39 20 7b 20 43 4f 4d 4d  8-test  9 { COMM
4ed0: 49 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IT              
4ee0: 20 20 20 20 20 20 20 20 7d 20 30 0a 66 6b 65 79          } 0.fkey
4ef0: 32 2d 38 2d 74 65 73 74 20 31 30 20 7b 20 50 52  2-8-test 10 { PR
4f00: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
4f10: 73 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66 6b  s = 1     } 1.fk
4f20: 65 79 32 2d 38 2d 74 65 73 74 20 31 31 20 7b 20  ey2-8-test 11 { 
4f30: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
4f40: 65 79 73 20 3d 20 6f 66 66 20 20 20 7d 20 30 0a  eys = off   } 0.
4f50: 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 31 32 20  fkey2-8-test 12 
4f60: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
4f70: 5f 6b 65 79 73 20 3d 20 6f 6e 20 20 20 20 7d 20  _keys = on    } 
4f80: 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 31  1.fkey2-8-test 1
4f90: 33 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  3 { PRAGMA forei
4fa0: 67 6e 5f 6b 65 79 73 20 3d 20 6e 6f 20 20 20 20  gn_keys = no    
4fb0: 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74  } 0.fkey2-8-test
4fc0: 20 31 34 20 7b 20 50 52 41 47 4d 41 20 66 6f 72   14 { PRAGMA for
4fd0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 79 65 73 20  eign_keys = yes 
4fe0: 20 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65    } 1.fkey2-8-te
4ff0: 73 74 20 31 35 20 7b 20 50 52 41 47 4d 41 20 66  st 15 { PRAGMA f
5000: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 66 61  oreign_keys = fa
5010: 6c 73 65 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d  lse } 0.fkey2-8-
5020: 74 65 73 74 20 31 36 20 7b 20 50 52 41 47 4d 41  test 16 { PRAGMA
5030: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
5040: 74 72 75 65 20 20 7d 20 31 0a 0a 23 2d 2d 2d 2d  true  } 1..#----
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
50a0: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 66 6b 65  owing tests, fke
50b0: 79 32 2d 39 2e 2a 2c 20 74 65 73 74 20 53 45 54  y2-9.*, test SET
50c0: 20 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e 73   DEFAULT actions
50d0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
50e0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  les.do_test fkey
50f0: 32 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  2-9.1.1 {.  exec
5100: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5110: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
5120: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
5130: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
5140: 54 41 42 4c 45 20 74 32 28 0a 20 20 20 20 20 20  TABLE t2(.      
5150: 63 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  c INTEGER PRIMAR
5160: 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 64 20 49  Y KEY,.      d I
5170: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 31  NTEGER DEFAULT 1
5180: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f   REFERENCES t1 O
5190: 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46  N DELETE SET DEF
51a0: 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  AULT.    );.    
51b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
51c0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
51d0: 20 66 6b 65 79 32 2d 39 2e 31 2e 32 20 7b 0a 20   fkey2-9.1.2 {. 
51e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
51f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5200: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
5210: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5220: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t1 VALUES(2, 'tw
5230: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
5240: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
5250: 2c 20 32 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 2);.    SELECT
5260: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
5270: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
5280: 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20 20  HERE a = 2;.    
5290: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
52a0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31 20 31  ;.  }.} {1 2 1 1
52b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
52c0: 39 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  9.1.3 {.  execsq
52d0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
52e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
52f0: 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 55 50 44   'two');.    UPD
5300: 41 54 45 20 74 32 20 53 45 54 20 64 20 3d 20 32  ATE t2 SET d = 2
5310: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
5320: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31  M t1 WHERE a = 1
5330: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
5340: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
5350: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   2}.do_test fkey
5360: 32 2d 39 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  2-9.1.4 {.  exec
5370: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
5380: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 32 20 74 77  ROM t1 }.} {2 tw
5390: 6f 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  o}.do_test fkey2
53a0: 2d 39 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63 68  -9.1.5 {.  catch
53b0: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
53c0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  M t1 }.} {1 {for
53d0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
53e0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f  int failed}}..do
53f0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 39 2e 32 2e  _test fkey2-9.2.
5400: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
5410: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5420: 20 70 70 28 61 2c 20 62 2c 20 63 2c 20 50 52 49   pp(a, b, c, PRI
5430: 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b  MARY KEY(b, c));
5440: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5450: 45 20 63 63 28 64 20 44 45 46 41 55 4c 54 20 33  E cc(d DEFAULT 3
5460: 2c 20 65 20 44 45 46 41 55 4c 54 20 31 2c 20 66  , e DEFAULT 1, f
5470: 20 44 45 46 41 55 4c 54 20 32 2c 0a 20 20 20 20   DEFAULT 2,.    
5480: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28      FOREIGN KEY(
5490: 66 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53  f, d) REFERENCES
54a0: 20 70 70 20 0a 20 20 20 20 20 20 20 20 4f 4e 20   pp .        ON 
54b0: 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55  UPDATE SET DEFAU
54c0: 4c 54 20 0a 20 20 20 20 20 20 20 20 4f 4e 20 44  LT .        ON D
54d0: 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20  ELETE SET NULL. 
54e0: 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
54f0: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
5500: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
5510: 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c  SERT INTO pp VAL
5520: 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20  UES(4, 5, 6);.  
5530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70    INSERT INTO pp
5540: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
5550: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
5560: 73 74 20 66 6b 65 79 32 2d 39 2e 32 2e 32 20 7b  st fkey2-9.2.2 {
5570: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5580: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20   INSERT INTO cc 
5590: 56 41 4c 55 45 53 28 36 2c 20 27 41 27 2c 20 35  VALUES(6, 'A', 5
55a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
55b0: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 36 2c 20  TO cc VALUES(6, 
55c0: 27 42 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53  'B', 5);.    INS
55d0: 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55  ERT INTO cc VALU
55e0: 45 53 28 39 2c 20 27 41 27 2c 20 38 29 3b 0a 20  ES(9, 'A', 8);. 
55f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
5600: 63 20 56 41 4c 55 45 53 28 39 2c 20 27 42 27 2c  c VALUES(9, 'B',
5610: 20 38 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20   8);.    UPDATE 
5620: 70 70 20 53 45 54 20 62 20 3d 20 31 20 57 48 45  pp SET b = 1 WHE
5630: 52 45 20 61 20 3d 20 37 3b 0a 20 20 20 20 53 45  RE a = 7;.    SE
5640: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a  LECT * FROM cc;.
5650: 20 20 7d 0a 7d 20 7b 36 20 41 20 35 20 36 20 42    }.} {6 A 5 6 B
5660: 20 35 20 33 20 41 20 32 20 33 20 42 20 32 7d 0a   5 3 A 2 3 B 2}.
5670: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39 2e  do_test fkey2-9.
5680: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
5690: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
56a0: 4d 20 70 70 20 57 48 45 52 45 20 61 20 3d 20 34  M pp WHERE a = 4
56b0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
56c0: 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b 7b  ROM cc;.  }.} {{
56d0: 7d 20 41 20 7b 7d 20 7b 7d 20 42 20 7b 7d 20 33  } A {} {} B {} 3
56e0: 20 41 20 32 20 33 20 42 20 32 7d 0a 0a 23 2d 2d   A 2 3 B 2}..#--
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
5740: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 66  llowing tests, f
5750: 6b 65 79 32 2d 31 30 2e 2a 2c 20 74 65 73 74 20  key2-10.*, test 
5760: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  "foreign key mis
5770: 6d 61 74 63 68 22 20 61 6e 64 20 0a 23 20 6f 74  match" and .# ot
5780: 68 65 72 20 65 72 72 6f 72 73 2e 0a 23 0a 73 65  her errors..#.se
5790: 74 20 74 6e 20 30 0a 66 6f 72 65 61 63 68 20 7a  t tn 0.foreach z
57a0: 53 71 6c 20 5b 6c 69 73 74 20 7b 0a 20 20 43 52  Sql [list {.  CR
57b0: 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 50  EATE TABLE p(a P
57c0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
57d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
57e0: 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 70 28  (x REFERENCES p(
57f0: 63 29 29 3b 0a 7d 20 7b 0a 20 20 43 52 45 41 54  c));.} {.  CREAT
5800: 45 20 54 41 42 4c 45 20 63 28 78 20 52 45 46 45  E TABLE c(x REFE
5810: 52 45 4e 43 45 53 20 76 28 79 29 29 3b 0a 20 20  RENCES v(y));.  
5820: 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53  CREATE VIEW v AS
5830: 20 53 45 4c 45 43 54 20 78 20 41 53 20 79 20 46   SELECT x AS y F
5840: 52 4f 4d 20 63 3b 0a 7d 20 7b 0a 20 20 43 52 45  ROM c;.} {.  CRE
5850: 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62  ATE TABLE p(a, b
5860: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
5870: 20 62 29 29 3b 0a 20 20 43 52 45 41 54 45 20 54   b));.  CREATE T
5880: 41 42 4c 45 20 63 28 78 20 52 45 46 45 52 45 4e  ABLE c(x REFEREN
5890: 43 45 53 20 70 29 3b 0a 7d 20 7b 0a 20 20 43 52  CES p);.} {.  CR
58a0: 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 43  EATE TABLE p(a C
58b0: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 2c 20 62  OLLATE binary, b
58c0: 29 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51  );.  CREATE UNIQ
58d0: 55 45 20 49 4e 44 45 58 20 69 20 4f 4e 20 70 28  UE INDEX i ON p(
58e0: 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  a COLLATE nocase
58f0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
5900: 45 20 63 28 78 20 52 45 46 45 52 45 4e 43 45 53  E c(x REFERENCES
5910: 20 70 28 61 29 29 3b 0a 7d 5d 20 7b 0a 20 20 64   p(a));.}] {.  d
5920: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
5930: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
5940: 30 2e 31 2e 5b 69 6e 63 72 20 74 6e 5d 20 7b 0a  0.1.[incr tn] {.
5950: 20 20 20 20 65 78 65 63 73 71 6c 20 24 7a 53 71      execsql $zSq
5960: 6c 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  l.    catchsql {
5970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 44   INSERT INTO c D
5980: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a  EFAULT VALUES }.
5990: 20 20 7d 20 7b 2f 31 20 7b 66 6f 72 65 69 67 6e    } {/1 {foreign
59a0: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20   key mismatch - 
59b0: 22 63 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20  "c" referencing 
59c0: 22 2e 22 7d 2f 7d 0a 7d 0a 0a 23 20 22 72 6f 77  "."}/}.}..# "row
59d0: 69 64 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  id" cannot be us
59e0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
59f0: 63 68 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20  child or parent 
5a00: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a  key definition .
5a10: 23 20 75 6e 6c 65 73 73 20 69 74 20 68 61 70 70  # unless it happ
5a20: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 6e 61  ens to be the na
5a30: 6d 65 20 6f 66 20 61 6e 20 65 78 70 6c 69 63 69  me of an explici
5a40: 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
5a50: 75 6d 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  umn..#.do_test f
5a60: 6b 65 79 32 2d 31 30 2e 32 2e 31 20 7b 0a 20 20  key2-10.2.1 {.  
5a70: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
5a80: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
5a90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5aa0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
5ab0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
5ac0: 41 42 4c 45 20 74 32 28 63 2c 20 64 2c 20 46 4f  ABLE t2(c, d, FO
5ad0: 52 45 49 47 4e 20 4b 45 59 28 72 6f 77 69 64 29  REIGN KEY(rowid)
5ae0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61   REFERENCES t1(a
5af0: 29 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e  ));.  }.} {1 {un
5b00: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 72 6f  known column "ro
5b10: 77 69 64 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  wid" in foreign 
5b20: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 7d  key definition}}
5b30: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
5b40: 30 2e 32 2e 32 20 7b 0a 20 20 64 72 6f 70 5f 61  0.2.2 {.  drop_a
5b50: 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63  ll_tables.  catc
5b60: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
5b70: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
5b80: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
5b90: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5ba0: 32 28 72 6f 77 69 64 2c 20 64 2c 20 46 4f 52 45  2(rowid, d, FORE
5bb0: 49 47 4e 20 4b 45 59 28 72 6f 77 69 64 29 20 52  IGN KEY(rowid) R
5bc0: 45 46 45 52 45 4e 43 45 53 20 74 31 28 61 29 29  EFERENCES t1(a))
5bd0: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64  ;.  }.} {0 {}}.d
5be0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 30 2e  o_test fkey2-10.
5bf0: 32 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  2.1 {.  drop_all
5c00: 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68 73  _tables.  catchs
5c10: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5c20: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
5c30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5c40: 20 74 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   t2(c, d, FOREIG
5c50: 4e 20 4b 45 59 28 63 29 20 52 45 46 45 52 45 4e  N KEY(c) REFEREN
5c60: 43 45 53 20 74 31 28 72 6f 77 69 64 29 29 3b 0a  CES t1(rowid));.
5c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5c80: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
5c90: 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b  VALUES(1, 1, 1);
5ca0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5cb0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29   t2 VALUES(1, 1)
5cc0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65  ;.  }.} {1 {fore
5cd0: 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68  ign key mismatch
5ce0: 20 2d 20 22 74 32 22 20 72 65 66 65 72 65 6e 63   - "t2" referenc
5cf0: 69 6e 67 20 22 74 31 22 7d 7d 0a 64 6f 5f 74 65  ing "t1"}}.do_te
5d00: 73 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e 32 20  st fkey2-10.2.2 
5d10: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
5d20: 6c 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  les.  catchsql {
5d30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5d40: 45 20 74 31 28 72 6f 77 69 64 20 50 52 49 4d 41  E t1(rowid PRIMA
5d50: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
5d60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
5d70: 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  c, d, FOREIGN KE
5d80: 59 28 63 29 20 52 45 46 45 52 45 4e 43 45 53 20  Y(c) REFERENCES 
5d90: 74 31 28 72 6f 77 69 64 29 29 3b 0a 20 20 20 20  t1(rowid));.    
5da0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72  INSERT INTO t1(r
5db0: 6f 77 69 64 2c 20 62 29 20 56 41 4c 55 45 53 28  owid, b) VALUES(
5dc0: 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 1);.    INSER
5dd0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5de0: 28 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 30  (1, 1);.  }.} {0
5df0: 20 7b 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}}...#--------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e40: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
5e50: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
5e60: 31 2e 2a 2c 20 74 65 73 74 20 43 41 53 43 41 44  1.*, test CASCAD
5e70: 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72 6f  E actions..#.dro
5e80: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
5e90: 74 65 73 74 20 66 6b 65 79 32 2d 31 31 2e 31 2e  test fkey2-11.1.
5ea0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
5eb0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5ec0: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
5ed0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
5ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5ef0: 74 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  t2(c, d, FOREIGN
5f00: 20 4b 45 59 28 63 29 20 52 45 46 45 52 45 4e 43   KEY(c) REFERENC
5f10: 45 53 20 74 31 28 61 29 20 4f 4e 20 55 50 44 41  ES t1(a) ON UPDA
5f20: 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a 20 20  TE CASCADE);..  
5f30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5f40: 20 56 41 4c 55 45 53 28 31 30 2c 20 31 30 30 29   VALUES(10, 100)
5f50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5f60: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 30 2c 20  O t2 VALUES(10, 
5f70: 31 30 30 29 3b 0a 20 20 20 20 55 50 44 41 54 45  100);.    UPDATE
5f80: 20 74 31 20 53 45 54 20 61 20 3d 20 31 35 3b 0a   t1 SET a = 15;.
5f90: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5fa0: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 35 20  M t2;.  }.} {15 
5fb0: 31 30 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  100}..#---------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6000: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6010: 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 32   tests, fkey2-12
6020: 2e 2a 2c 20 74 65 73 74 20 52 45 53 54 52 49 43  .*, test RESTRIC
6030: 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72 6f  T actions..#.dro
6040: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
6050: 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e  test fkey2-12.1.
6060: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
6070: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6080: 20 74 31 28 61 2c 20 62 20 50 52 49 4d 41 52 59   t1(a, b PRIMARY
6090: 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54   KEY);.    CREAT
60a0: 45 20 54 41 42 4c 45 20 74 32 28 0a 20 20 20 20  E TABLE t2(.    
60b0: 20 20 78 20 52 45 46 45 52 45 4e 43 45 53 20 74    x REFERENCES t
60c0: 31 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54  1 ON UPDATE REST
60d0: 52 49 43 54 20 44 45 46 45 52 52 41 42 4c 45 20  RICT DEFERRABLE 
60e0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
60f0: 45 44 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 49  ED .    );.    I
6100: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6110: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
6120: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6130: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t1 VALUES(2, 'tw
6140: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
6150: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
6160: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a  , 'three');.  }.
6170: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
6180: 79 32 2d 31 32 2e 31 2e 32 20 7b 20 0a 20 20 65  y2-12.1.2 { .  e
6190: 78 65 63 73 71 6c 20 22 42 45 47 49 4e 22 0a 20  xecsql "BEGIN". 
61a0: 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54   execsql "INSERT
61b0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
61c0: 27 74 77 6f 27 29 22 0a 7d 20 7b 7d 0a 64 6f 5f  'two')".} {}.do_
61d0: 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e  test fkey2-12.1.
61e0: 33 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 22  3 { .  execsql "
61f0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
6200: 3d 20 27 66 6f 75 72 27 20 57 48 45 52 45 20 62  = 'four' WHERE b
6210: 20 3d 20 27 6f 6e 65 27 22 0a 7d 20 7b 7d 0a 64   = 'one'".} {}.d
6220: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e  o_test fkey2-12.
6230: 31 2e 34 20 7b 20 0a 20 20 63 61 74 63 68 73 71  1.4 { .  catchsq
6240: 6c 20 22 55 50 44 41 54 45 20 74 31 20 53 45 54  l "UPDATE t1 SET
6250: 20 62 20 3d 20 27 66 69 76 65 27 20 57 48 45 52   b = 'five' WHER
6260: 45 20 62 20 3d 20 27 74 77 6f 27 22 0a 7d 20 7b  E b = 'two'".} {
6270: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
6280: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
6290: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
62a0: 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 65 78 65  -12.1.5 { .  exe
62b0: 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  csql "DELETE FRO
62c0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
62d0: 74 77 6f 27 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  two'".} {}.do_te
62e0: 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e 36 20  st fkey2-12.1.6 
62f0: 7b 20 0a 20 20 63 61 74 63 68 73 71 6c 20 22 43  { .  catchsql "C
6300: 4f 4d 4d 49 54 22 0a 7d 20 7b 31 20 7b 66 6f 72  OMMIT".} {1 {for
6310: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
6320: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
6330: 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e  test fkey2-12.1.
6340: 37 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b  7 { .  execsql {
6350: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6360: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
6370: 77 6f 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  wo');.    COMMIT
6380: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f 70  ;.  }.} {}..drop
6390: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
63a0: 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 32 2e 31  est fkey2-12.2.1
63b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
63c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
63d0: 74 31 28 78 20 43 4f 4c 4c 41 54 45 20 4e 4f 43  t1(x COLLATE NOC
63e0: 41 53 45 20 50 52 49 4d 41 52 59 20 4b 45 59 29  ASE PRIMARY KEY)
63f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
6400: 47 47 45 52 20 74 74 31 20 41 46 54 45 52 20 44  GGER tt1 AFTER D
6410: 45 4c 45 54 45 20 4f 4e 20 74 31 20 0a 20 20 20  ELETE ON t1 .   
6420: 20 20 20 57 48 45 4e 20 45 58 49 53 54 53 20 28     WHEN EXISTS (
6430: 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74   SELECT 1 FROM t
6440: 32 20 57 48 45 52 45 20 6f 6c 64 2e 78 20 3d 20  2 WHERE old.x = 
6450: 79 20 29 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  y ).    BEGIN.  
6460: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6470: 74 31 20 56 41 4c 55 45 53 28 6f 6c 64 2e 78 29  t1 VALUES(old.x)
6480: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
6490: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79  REATE TABLE t2(y
64a0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b   REFERENCES t1);
64b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
64c0: 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 29 3b   t1 VALUES('A');
64d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
64e0: 20 74 31 20 56 41 4c 55 45 53 28 27 42 27 29 3b   t1 VALUES('B');
64f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6500: 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 29 3b   t2 VALUES('a');
6510: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6520: 20 74 32 20 56 41 4c 55 45 53 28 27 62 27 29 3b   t2 VALUES('b');
6530: 0a 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ..    SELECT * F
6540: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45  ROM t1;.    SELE
6550: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
6560: 7d 0a 7d 20 7b 41 20 42 20 61 20 62 7d 0a 64 6f  }.} {A B a b}.do
6570: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 32  _test fkey2-12.2
6580: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
6590: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
65a0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
65b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
65c0: 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t1;.    SELECT *
65d0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
65e0: 7b 41 20 42 20 61 20 62 7d 0a 64 6f 5f 74 65 73  {A B a b}.do_tes
65f0: 74 20 66 6b 65 79 32 2d 31 32 2e 32 2e 33 20 7b  t fkey2-12.2.3 {
6600: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6610: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
6620: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6630: 20 74 32 28 79 20 52 45 46 45 52 45 4e 43 45 53   t2(y REFERENCES
6640: 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20 52 45   t1 ON DELETE RE
6650: 53 54 52 49 43 54 29 3b 0a 20 20 20 20 49 4e 53  STRICT);.    INS
6660: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6670: 45 53 28 27 61 27 29 3b 0a 20 20 20 20 49 4e 53  ES('a');.    INS
6680: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6690: 45 53 28 27 62 27 29 3b 0a 20 20 7d 0a 20 20 63  ES('b');.  }.  c
66a0: 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
66b0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
66c0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
66d0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
66e0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
66f0: 32 2e 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  2.2.4 {.  execsq
6700: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
6710: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45   FROM t1;.    SE
6720: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6730: 20 20 7d 0a 7d 20 7b 41 20 42 20 61 20 62 7d 0a    }.} {A B a b}.
6740: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
6750: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
6760: 32 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  2.3.1 {.  execsq
6770: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
6780: 41 42 4c 45 20 75 70 28 0a 20 20 20 20 20 20 63  ABLE up(.      c
6790: 30 30 2c 20 63 30 31 2c 20 63 30 32 2c 20 63 30  00, c01, c02, c0
67a0: 33 2c 20 63 30 34 2c 20 63 30 35 2c 20 63 30 36  3, c04, c05, c06
67b0: 2c 20 63 30 37 2c 20 63 30 38 2c 20 63 30 39 2c  , c07, c08, c09,
67c0: 0a 20 20 20 20 20 20 63 31 30 2c 20 63 31 31 2c  .      c10, c11,
67d0: 20 63 31 32 2c 20 63 31 33 2c 20 63 31 34 2c 20   c12, c13, c14, 
67e0: 63 31 35 2c 20 63 31 36 2c 20 63 31 37 2c 20 63  c15, c16, c17, c
67f0: 31 38 2c 20 63 31 39 2c 0a 20 20 20 20 20 20 63  18, c19,.      c
6800: 32 30 2c 20 63 32 31 2c 20 63 32 32 2c 20 63 32  20, c21, c22, c2
6810: 33 2c 20 63 32 34 2c 20 63 32 35 2c 20 63 32 36  3, c24, c25, c26
6820: 2c 20 63 32 37 2c 20 63 32 38 2c 20 63 32 39 2c  , c27, c28, c29,
6830: 0a 20 20 20 20 20 20 63 33 30 2c 20 63 33 31 2c  .      c30, c31,
6840: 20 63 33 32 2c 20 63 33 33 2c 20 63 33 34 2c 20   c32, c33, c34, 
6850: 63 33 35 2c 20 63 33 36 2c 20 63 33 37 2c 20 63  c35, c36, c37, c
6860: 33 38 2c 20 63 33 39 2c 0a 20 20 20 20 20 20 50  38, c39,.      P
6870: 52 49 4d 41 52 59 20 4b 45 59 28 63 33 34 2c 20  RIMARY KEY(c34, 
6880: 63 33 35 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  c35).    );.    
6890: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f 77  CREATE TABLE dow
68a0: 6e 28 0a 20 20 20 20 20 20 63 30 30 2c 20 63 30  n(.      c00, c0
68b0: 31 2c 20 63 30 32 2c 20 63 30 33 2c 20 63 30 34  1, c02, c03, c04
68c0: 2c 20 63 30 35 2c 20 63 30 36 2c 20 63 30 37 2c  , c05, c06, c07,
68d0: 20 63 30 38 2c 20 63 30 39 2c 0a 20 20 20 20 20   c08, c09,.     
68e0: 20 63 31 30 2c 20 63 31 31 2c 20 63 31 32 2c 20   c10, c11, c12, 
68f0: 63 31 33 2c 20 63 31 34 2c 20 63 31 35 2c 20 63  c13, c14, c15, c
6900: 31 36 2c 20 63 31 37 2c 20 63 31 38 2c 20 63 31  16, c17, c18, c1
6910: 39 2c 0a 20 20 20 20 20 20 63 32 30 2c 20 63 32  9,.      c20, c2
6920: 31 2c 20 63 32 32 2c 20 63 32 33 2c 20 63 32 34  1, c22, c23, c24
6930: 2c 20 63 32 35 2c 20 63 32 36 2c 20 63 32 37 2c  , c25, c26, c27,
6940: 20 63 32 38 2c 20 63 32 39 2c 0a 20 20 20 20 20   c28, c29,.     
6950: 20 63 33 30 2c 20 63 33 31 2c 20 63 33 32 2c 20   c30, c31, c32, 
6960: 63 33 33 2c 20 63 33 34 2c 20 63 33 35 2c 20 63  c33, c34, c35, c
6970: 33 36 2c 20 63 33 37 2c 20 63 33 38 2c 20 63 33  36, c37, c38, c3
6980: 39 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e  9,.      FOREIGN
6990: 20 4b 45 59 28 63 33 39 2c 20 63 33 38 29 20 52   KEY(c39, c38) R
69a0: 45 46 45 52 45 4e 43 45 53 20 75 70 20 4f 4e 20  EFERENCES up ON 
69b0: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a 20  UPDATE CASCADE. 
69c0: 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64     );.  }.} {}.d
69d0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e  o_test fkey2-12.
69e0: 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
69f0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
6a00: 4f 20 75 70 28 63 33 34 2c 20 63 33 35 29 20 56  O up(c34, c35) V
6a10: 41 4c 55 45 53 28 27 79 65 73 27 2c 20 27 6e 6f  ALUES('yes', 'no
6a20: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
6a30: 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20 63 33  NTO down(c39, c3
6a40: 38 29 20 56 41 4c 55 45 53 28 27 79 65 73 27 2c  8) VALUES('yes',
6a50: 20 27 6e 6f 27 29 3b 0a 20 20 20 20 55 50 44 41   'no');.    UPDA
6a60: 54 45 20 75 70 20 53 45 54 20 63 33 34 20 3d 20  TE up SET c34 = 
6a70: 27 70 6f 73 73 69 62 6c 79 27 3b 0a 20 20 20 20  'possibly';.    
6a80: 53 45 4c 45 43 54 20 63 33 38 2c 20 63 33 39 20  SELECT c38, c39 
6a90: 46 52 4f 4d 20 64 6f 77 6e 3b 0a 20 20 20 20 44  FROM down;.    D
6aa0: 45 4c 45 54 45 20 46 52 4f 4d 20 64 6f 77 6e 3b  ELETE FROM down;
6ab0: 0a 20 20 7d 0a 7d 20 7b 6e 6f 20 70 6f 73 73 69  .  }.} {no possi
6ac0: 62 6c 79 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  bly}.do_test fke
6ad0: 79 32 2d 31 32 2e 33 2e 33 20 7b 0a 20 20 63 61  y2-12.3.3 {.  ca
6ae0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
6af0: 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20 63  INTO down(c39, c
6b00: 33 38 29 20 56 41 4c 55 45 53 28 27 79 65 73 27  38) VALUES('yes'
6b10: 2c 20 27 6e 6f 27 29 20 7d 0a 7d 20 7b 31 20 7b  , 'no') }.} {1 {
6b20: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
6b30: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
6b40: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32  do_test fkey2-12
6b50: 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.4 {.  execsql
6b60: 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49   { .    INSERT I
6b70: 4e 54 4f 20 75 70 28 63 33 34 2c 20 63 33 35 29  NTO up(c34, c35)
6b80: 20 56 41 4c 55 45 53 28 27 79 65 73 27 2c 20 27   VALUES('yes', '
6b90: 6e 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  no');.    INSERT
6ba0: 20 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20   INTO down(c39, 
6bb0: 63 33 38 29 20 56 41 4c 55 45 53 28 27 79 65 73  c38) VALUES('yes
6bc0: 27 2c 20 27 6e 6f 27 29 3b 0a 20 20 7d 0a 20 20  ', 'no');.  }.  
6bd0: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
6be0: 45 20 46 52 4f 4d 20 75 70 20 57 48 45 52 45 20  E FROM up WHERE 
6bf0: 63 33 34 20 3d 20 27 79 65 73 27 20 7d 0a 7d 20  c34 = 'yes' }.} 
6c00: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
6c10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
6c20: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
6c30: 32 2d 31 32 2e 33 2e 35 20 7b 0a 20 20 65 78 65  2-12.3.5 {.  exe
6c40: 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c 45  csql { .    DELE
6c50: 54 45 20 46 52 4f 4d 20 75 70 20 57 48 45 52 45  TE FROM up WHERE
6c60: 20 63 33 34 20 3d 20 27 70 6f 73 73 69 62 6c 79   c34 = 'possibly
6c70: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 33  ';.    SELECT c3
6c80: 34 2c 20 63 33 35 20 46 52 4f 4d 20 75 70 3b 0a  4, c35 FROM up;.
6c90: 20 20 20 20 53 45 4c 45 43 54 20 63 33 39 2c 20      SELECT c39, 
6ca0: 63 33 38 20 46 52 4f 4d 20 64 6f 77 6e 3b 0a 20  c38 FROM down;. 
6cb0: 20 7d 0a 7d 20 7b 79 65 73 20 6e 6f 20 79 65 73   }.} {yes no yes
6cc0: 20 6e 6f 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   no}..#---------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6d20: 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 33   tests, fkey2-13
6d30: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 46 4b  .*, test that FK
6d40: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 70   processing is p
6d50: 65 72 66 6f 72 6d 65 64 0a 23 20 77 68 65 6e 20  erformed.# when 
6d60: 72 6f 77 73 20 61 72 65 20 52 45 50 4c 41 43 45  rows are REPLACE
6d70: 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  d..#.drop_all_ta
6d80: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65  bles.do_test fke
6d90: 79 32 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 65 78  y2-13.1.1 {.  ex
6da0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
6db0: 54 45 20 54 41 42 4c 45 20 70 70 28 61 20 55 4e  TE TABLE pp(a UN
6dc0: 49 51 55 45 2c 20 62 2c 20 63 2c 20 50 52 49 4d  IQUE, b, c, PRIM
6dd0: 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
6de0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6df0: 20 63 63 28 64 2c 20 65 2c 20 66 20 55 4e 49 51   cc(d, e, f UNIQ
6e00: 55 45 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28  UE, FOREIGN KEY(
6e10: 64 2c 20 65 29 20 52 45 46 45 52 45 4e 43 45 53  d, e) REFERENCES
6e20: 20 70 70 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   pp);.    INSERT
6e30: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
6e40: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
6e50: 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c  SERT INTO cc VAL
6e60: 55 45 53 28 32 2c 20 33 2c 20 31 29 3b 0a 20 20  UES(2, 3, 1);.  
6e70: 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  }.} {}.foreach {
6e80: 74 6e 20 73 74 6d 74 7d 20 7b 0a 20 20 31 20 20  tn stmt} {.  1  
6e90: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70   "REPLACE INTO p
6ea0: 70 20 56 41 4c 55 45 53 28 31 2c 20 34 2c 20 35  p VALUES(1, 4, 5
6eb0: 29 22 0a 20 20 32 20 20 20 22 52 45 50 4c 41 43  )".  2   "REPLAC
6ec0: 45 20 49 4e 54 4f 20 70 70 28 72 6f 77 69 64 2c  E INTO pp(rowid,
6ed0: 20 61 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53   a, b, c) VALUES
6ee0: 28 31 2c 20 32 2c 20 33 2c 20 34 29 22 0a 7d 20  (1, 2, 3, 4)".} 
6ef0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  {.  do_test fkey
6f00: 32 2d 31 33 2e 31 2e 24 74 6e 2e 31 20 7b 0a 20  2-13.1.$tn.1 {. 
6f10: 20 20 20 63 61 74 63 68 73 71 6c 20 24 73 74 6d     catchsql $stm
6f20: 74 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67  t.  } {1 {foreig
6f30: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
6f40: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74   failed}}.  do_t
6f50: 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e 24  est fkey2-13.1.$
6f60: 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.2 {.    execs
6f70: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
6f80: 54 20 2a 20 46 52 4f 4d 20 70 70 3b 0a 20 20 20  T * FROM pp;.   
6f90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6fa0: 20 63 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   cc;.    }.  } {
6fb0: 31 20 32 20 33 20 32 20 33 20 31 7d 0a 20 20 64  1 2 3 2 3 1}.  d
6fc0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e  o_test fkey2-13.
6fd0: 31 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78  1.$tn.3 {.    ex
6fe0: 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20 20  ecsql BEGIN;.   
6ff0: 20 63 61 74 63 68 73 71 6c 20 24 73 74 6d 74 0a   catchsql $stmt.
7000: 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20    } {1 {foreign 
7010: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
7020: 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ailed}}.  do_tes
7030: 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e 24 74 6e  t fkey2-13.1.$tn
7040: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
7050: 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b   {.      COMMIT;
7060: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
7070: 46 52 4f 4d 20 70 70 3b 0a 20 20 20 20 20 20 53  FROM pp;.      S
7080: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b  ELECT * FROM cc;
7090: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20  .    }.  } {1 2 
70a0: 33 20 32 20 33 20 31 7d 0a 7d 0a 64 6f 5f 74 65  3 2 3 1}.}.do_te
70b0: 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e 33 20  st fkey2-13.1.3 
70c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
70d0: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
70e0: 70 70 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  pp(rowid, a, b, 
70f0: 63 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c) VALUES(1, 2, 
7100: 32 2c 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43  2, 3);.    SELEC
7110: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
7120: 70 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  pp;.    SELECT *
7130: 20 46 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20   FROM cc;.  }.} 
7140: 7b 31 20 32 20 32 20 33 20 32 20 33 20 31 7d 0a  {1 2 2 3 2 3 1}.
7150: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 33  do_test fkey2-13
7160: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
7170: 20 7b 20 0a 20 20 20 20 52 45 50 4c 41 43 45 20   { .    REPLACE 
7180: 49 4e 54 4f 20 70 70 28 72 6f 77 69 64 2c 20 61  INTO pp(rowid, a
7190: 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28 32  , b, c) VALUES(2
71a0: 2c 20 32 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  , 2, 2, 3);.    
71b0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
71c0: 46 52 4f 4d 20 70 70 3b 0a 20 20 20 20 53 45 4c  FROM pp;.    SEL
71d0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a 20  ECT * FROM cc;. 
71e0: 20 7d 0a 7d 20 7b 32 20 32 20 32 20 33 20 32 20   }.} {2 2 2 3 2 
71f0: 33 20 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  3 1}..#---------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
7250: 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 34   tests, fkey2-14
7260: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74 68  .*, test that th
7270: 65 20 22 44 52 4f 50 20 54 41 42 4c 45 22 20 61  e "DROP TABLE" a
7280: 6e 64 20 22 41 4c 54 45 52 0a 23 20 54 41 42 4c  nd "ALTER.# TABL
7290: 45 22 20 63 6f 6d 6d 61 6e 64 73 20 77 6f 72 6b  E" commands work
72a0: 20 61 73 20 65 78 70 65 63 74 65 64 20 77 72 74   as expected wrt
72b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
72c0: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 66 6b  straints..#.# fk
72d0: 65 79 32 2d 31 34 2e 31 2a 3a 20 41 4c 54 45 52  ey2-14.1*: ALTER
72e0: 20 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55 4d   TABLE ADD COLUM
72f0: 4e 0a 23 20 66 6b 65 79 32 2d 31 34 2e 32 2a 3a  N.# fkey2-14.2*:
7300: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e   ALTER TABLE REN
7310: 41 4d 45 20 54 41 42 4c 45 0a 23 20 66 6b 65 79  AME TABLE.# fkey
7320: 32 2d 31 34 2e 33 2a 3a 20 44 52 4f 50 20 54 41  2-14.3*: DROP TA
7330: 42 4c 45 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  BLE.#.drop_all_t
7340: 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20  ables.ifcapable 
7350: 61 6c 74 65 72 74 61 62 6c 65 20 7b 0a 20 20 64  altertable {.  d
7360: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
7370: 31 2e 31 20 7b 0a 20 20 20 20 23 20 41 64 64 69  1.1 {.    # Addi
7380: 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  ng a column with
7390: 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c   a REFERENCES cl
73a0: 61 75 73 65 20 69 73 20 6e 6f 74 20 73 75 70 70  ause is not supp
73b0: 6f 72 74 65 64 2e 0a 20 20 20 20 65 78 65 63 73  orted..    execs
73c0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41  ql { .      CREA
73d0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
73e0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
73f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7400: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20  2(a, b);.    }. 
7410: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
7420: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
7430: 20 43 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52 45   COLUMN c REFERE
7440: 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30  NCES t1 }.  } {0
7450: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66   {}}.  do_test f
7460: 6b 65 79 32 2d 31 34 2e 31 2e 32 20 7b 0a 20 20  key2-14.1.2 {.  
7470: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
7480: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
7490: 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c 54  COLUMN d DEFAULT
74a0: 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53   NULL REFERENCES
74b0: 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d   t1 }.  } {0 {}}
74c0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
74d0: 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 20 20 63 61  -14.1.3 {.    ca
74e0: 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54  tchsql { ALTER T
74f0: 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55  ABLE t2 ADD COLU
7500: 4d 4e 20 65 20 52 45 46 45 52 45 4e 43 45 53 20  MN e REFERENCES 
7510: 74 31 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 7d  t1 DEFAULT NULL}
7520: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
7530: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31  _test fkey2-14.1
7540: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
7550: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
7560: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 20  t2 ADD COLUMN f 
7570: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45  REFERENCES t1 DE
7580: 46 41 55 4c 54 20 27 74 65 78 74 27 7d 0a 20 20  FAULT 'text'}.  
7590: 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64  } {1 {Cannot add
75a0: 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f   a REFERENCES co
75b0: 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55  lumn with non-NU
75c0: 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
75d0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
75e0: 79 32 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 20 20  y2-14.1.5 {.    
75f0: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
7600: 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f   TABLE t2 ADD CO
7610: 4c 55 4d 4e 20 67 20 44 45 46 41 55 4c 54 20 43  LUMN g DEFAULT C
7620: 55 52 52 45 4e 54 5f 54 49 4d 45 20 52 45 46 45  URRENT_TIME REFE
7630: 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d 20  RENCES t1 }.  } 
7640: 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61  {1 {Cannot add a
7650: 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75   REFERENCES colu
7660: 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c  mn with non-NULL
7670: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d   default value}}
7680: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
7690: 2d 31 34 2e 31 2e 36 20 7b 0a 20 20 20 20 65 78  -14.1.6 {.    ex
76a0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50  ecsql { .      P
76b0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
76c0: 79 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20  ys = off;.      
76d0: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20 41  ALTER TABLE t2 A
76e0: 44 44 20 43 4f 4c 55 4d 4e 20 68 20 44 45 46 41  DD COLUMN h DEFA
76f0: 55 4c 54 20 27 74 65 78 74 27 20 52 45 46 45 52  ULT 'text' REFER
7700: 45 4e 43 45 53 20 74 31 3b 0a 20 20 20 20 20 20  ENCES t1;.      
7710: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
7720: 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 20 20  eys = on;.      
7730: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
7740: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
7750: 45 52 45 20 6e 61 6d 65 3d 27 74 32 27 3b 0a 20  ERE name='t2';. 
7760: 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52 45 41 54     }.  } {{CREAT
7770: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c  E TABLE t2(a, b,
7780: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   c REFERENCES t1
7790: 2c 20 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c  , d DEFAULT NULL
77a0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
77b0: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
77c0: 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 68 20  DEFAULT NULL, h 
77d0: 44 45 46 41 55 4c 54 20 27 74 65 78 74 27 20 52  DEFAULT 'text' R
77e0: 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d 7d 0a  EFERENCES t1)}}.
77f0: 20 20 0a 20 20 0a 20 20 23 20 54 65 73 74 20 74    .  .  # Test t
7800: 68 65 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65  he sqlite_rename
7810: 5f 70 61 72 65 6e 74 28 29 20 66 75 6e 63 74 69  _parent() functi
7820: 6f 6e 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 23  on directly..  #
7830: 0a 20 20 70 72 6f 63 20 74 65 73 74 5f 72 65 6e  .  proc test_ren
7840: 61 6d 65 5f 70 61 72 65 6e 74 20 7b 7a 43 72 65  ame_parent {zCre
7850: 61 74 65 20 7a 4f 6c 64 20 7a 4e 65 77 7d 20 7b  ate zOld zNew} {
7860: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
7870: 4c 45 43 54 20 73 71 6c 69 74 65 5f 72 65 6e 61  LECT sqlite_rena
7880: 6d 65 5f 70 61 72 65 6e 74 28 24 7a 43 72 65 61  me_parent($zCrea
7890: 74 65 2c 20 24 7a 4f 6c 64 2c 20 24 7a 4e 65 77  te, $zOld, $zNew
78a0: 29 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  )}.  }.  do_test
78b0: 20 66 6b 65 79 32 2d 31 34 2e 32 2e 31 2e 31 20   fkey2-14.2.1.1 
78c0: 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d  {.    test_renam
78d0: 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45  e_parent {CREATE
78e0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
78f0: 52 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20 74  RENCES t2)} t2 t
7900: 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54  3.  } {{CREATE T
7910: 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45  ABLE t1(a REFERE
7920: 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 64  NCES "t3")}}.  d
7930: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
7940: 32 2e 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74  2.1.2 {.    test
7950: 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b  _rename_parent {
7960: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
7970: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  a REFERENCES t2)
7980: 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b 7b 43 52  } t4 t3.  } {{CR
7990: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
79a0: 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d  REFERENCES t2)}}
79b0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
79c0: 2d 31 34 2e 32 2e 31 2e 33 20 7b 0a 20 20 20 20  -14.2.1.3 {.    
79d0: 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65  test_rename_pare
79e0: 6e 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45  nt {CREATE TABLE
79f0: 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53   t1(a REFERENCES
7a00: 20 22 74 32 22 29 7d 20 74 32 20 74 33 0a 20 20   "t2")} t2 t3.  
7a10: 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45  } {{CREATE TABLE
7a20: 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53   t1(a REFERENCES
7a30: 20 22 74 33 22 29 7d 7d 0a 20 20 0a 20 20 23 20   "t3")}}.  .  # 
7a40: 54 65 73 74 20 41 4c 54 45 52 20 54 41 42 4c 45  Test ALTER TABLE
7a50: 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 20 61 20   RENAME TABLE a 
7a60: 62 69 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  bit..  #.  do_te
7a70: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e  st fkey2-14.2.2.
7a80: 31 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c  1 {.    drop_all
7a90: 5f 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63  _tables.    exec
7aa0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
7ab0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
7ac0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
7ad0: 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 20  ERENCES t1);.   
7ae0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7af0: 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t2(a PRIMARY KEY
7b00: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74  , b REFERENCES t
7b10: 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  1, c REFERENCES 
7b20: 74 32 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  t2);.      CREAT
7b30: 45 20 54 41 42 4c 45 20 74 33 28 61 20 52 45 46  E TABLE t3(a REF
7b40: 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45  ERENCES t1, b RE
7b50: 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52  FERENCES t2, c R
7b60: 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20  EFERENCES t1);. 
7b70: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
7b80: 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52   { SELECT sql FR
7b90: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
7ba0: 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74   WHERE type = 't
7bb0: 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74  able'}.  } [list
7bc0: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
7bd0: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
7be0: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
7bf0: 43 45 53 20 74 31 29 7d 20 20 20 20 20 20 20 20  CES t1)}        
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
7c10: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
7c20: 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t2(a PRIMARY KE
7c30: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
7c40: 74 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t1, c REFERENCES
7c50: 20 74 32 29 7d 20 20 20 20 5c 0a 20 20 20 20 7b   t2)}    \.    {
7c60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
7c70: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c  a REFERENCES t1,
7c80: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   b REFERENCES t2
7c90: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74  , c REFERENCES t
7ca0: 31 29 7d 20 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f  1)}  \.  ].  do_
7cb0: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e  test fkey2-14.2.
7cc0: 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.2 {.    execsq
7cd0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
7ce0: 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34 20  t1 RENAME TO t4 
7cf0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
7d00: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
7d10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
7d20: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
7d30: 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a  e'}.  } [list \.
7d40: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
7d50: 45 20 22 74 34 22 28 61 20 50 52 49 4d 41 52 59  E "t4"(a PRIMARY
7d60: 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43   KEY, b REFERENC
7d70: 45 53 20 22 74 34 22 29 7d 20 20 20 20 20 20 20  ES "t4")}       
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
7d90: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
7da0: 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t2(a PRIMARY KE
7db0: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
7dc0: 22 74 34 22 2c 20 63 20 52 45 46 45 52 45 4e 43  "t4", c REFERENC
7dd0: 45 53 20 74 32 29 7d 20 20 20 20 20 5c 0a 20 20  ES t2)}     \.  
7de0: 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20    {CREATE TABLE 
7df0: 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t3(a REFERENCES 
7e00: 22 74 34 22 2c 20 62 20 52 45 46 45 52 45 4e 43  "t4", b REFERENC
7e10: 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e  ES t2, c REFEREN
7e20: 43 45 53 20 22 74 34 22 29 7d 20 5c 0a 20 20 5d  CES "t4")} \.  ]
7e30: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
7e40: 2d 31 34 2e 32 2e 32 2e 33 20 7b 0a 20 20 20 20  -14.2.2.3 {.    
7e50: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
7e60: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
7e70: 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 7d 20  (1, 2, 3) }.  } 
7e80: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
7e90: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7ea0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  d}}.  do_test fk
7eb0: 65 79 32 2d 31 34 2e 32 2e 32 2e 34 20 7b 0a 20  ey2-14.2.2.4 {. 
7ec0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
7ed0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
7ee0: 45 53 28 31 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20  ES(1, NULL) }.  
7ef0: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  } {}.  do_test f
7f00: 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 35 20 7b 0a  key2-14.2.2.5 {.
7f10: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55      catchsql { U
7f20: 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20 3d  PDATE t4 SET b =
7f30: 20 35 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72   5 }.  } {1 {for
7f40: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
7f50: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64  int failed}}.  d
7f60: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
7f70: 32 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74 63  2.2.6 {.    catc
7f80: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34  hsql { UPDATE t4
7f90: 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20 7d   SET b = 1 }.  }
7fa0: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
7fb0: 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 37  t fkey2-14.2.2.7
7fc0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
7fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
7fe0: 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20  VALUES(1, NULL, 
7ff0: 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23  1) }.  } {}..  #
8000: 20 52 65 70 65 61 74 20 66 6f 72 20 54 45 4d 50   Repeat for TEMP
8010: 20 74 61 62 6c 65 73 0a 20 20 23 0a 20 20 64 72   tables.  #.  dr
8020: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
8030: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
8040: 2e 31 74 6d 70 2e 31 20 7b 0a 20 20 20 20 23 20  .1tmp.1 {.    # 
8050: 41 64 64 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 20  Adding a column 
8060: 77 69 74 68 20 61 20 52 45 46 45 52 45 4e 43 45  with a REFERENCE
8070: 53 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  S clause is not 
8080: 73 75 70 70 6f 72 74 65 64 2e 0a 20 20 20 20 65  supported..    e
8090: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
80a0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
80b0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
80c0: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
80d0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28  E TEMP TABLE t2(
80e0: 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a, b);.    }.   
80f0: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
8100: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
8110: 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43  OLUMN c REFERENC
8120: 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b  ES t1 }.  } {0 {
8130: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
8140: 79 32 2d 31 34 2e 31 74 6d 70 2e 32 20 7b 0a 20  y2-14.1tmp.2 {. 
8150: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
8160: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
8170: 20 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c   COLUMN d DEFAUL
8180: 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45  T NULL REFERENCE
8190: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  S t1 }.  } {0 {}
81a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
81b0: 32 2d 31 34 2e 31 74 6d 70 2e 33 20 7b 0a 20 20  2-14.1tmp.3 {.  
81c0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
81d0: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
81e0: 43 4f 4c 55 4d 4e 20 65 20 52 45 46 45 52 45 4e  COLUMN e REFEREN
81f0: 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 4e  CES t1 DEFAULT N
8200: 55 4c 4c 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a  ULL}.  } {0 {}}.
8210: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
8220: 31 34 2e 31 74 6d 70 2e 34 20 7b 0a 20 20 20 20  14.1tmp.4 {.    
8230: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
8240: 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f   TABLE t2 ADD CO
8250: 4c 55 4d 4e 20 66 20 52 45 46 45 52 45 4e 43 45  LUMN f REFERENCE
8260: 53 20 74 31 20 44 45 46 41 55 4c 54 20 27 74 65  S t1 DEFAULT 'te
8270: 78 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43 61 6e  xt'}.  } {1 {Can
8280: 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45  not add a REFERE
8290: 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68  NCES column with
82a0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
82b0: 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74  t value}}.  do_t
82c0: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 74 6d  est fkey2-14.1tm
82d0: 70 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73  p.5 {.    catchs
82e0: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
82f0: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 67   t2 ADD COLUMN g
8300: 20 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54   DEFAULT CURRENT
8310: 5f 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45 53  _TIME REFERENCES
8320: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43 61   t1 }.  } {1 {Ca
8330: 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
8340: 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
8350: 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
8360: 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f  lt value}}.  do_
8370: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 74  test fkey2-14.1t
8380: 6d 70 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73  mp.6 {.    execs
8390: 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  ql { .      PRAG
83a0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
83b0: 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 41 4c 54  = off;.      ALT
83c0: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
83d0: 43 4f 4c 55 4d 4e 20 68 20 44 45 46 41 55 4c 54  COLUMN h DEFAULT
83e0: 20 27 74 65 78 74 27 20 52 45 46 45 52 45 4e 43   'text' REFERENC
83f0: 45 53 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41  ES t1;.      PRA
8400: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
8410: 20 3d 20 6f 6e 3b 0a 20 20 20 20 20 20 53 45 4c   = on;.      SEL
8420: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
8430: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
8440: 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 32 27 3b  WHERE name='t2';
8450: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52 45  .    }.  } {{CRE
8460: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
8470: 62 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  b, c REFERENCES 
8480: 74 31 2c 20 64 20 44 45 46 41 55 4c 54 20 4e 55  t1, d DEFAULT NU
8490: 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  LL REFERENCES t1
84a0: 2c 20 65 20 52 45 46 45 52 45 4e 43 45 53 20 74  , e REFERENCES t
84b0: 31 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c 20  1 DEFAULT NULL, 
84c0: 68 20 44 45 46 41 55 4c 54 20 27 74 65 78 74 27  h DEFAULT 'text'
84d0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d   REFERENCES t1)}
84e0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }..  do_test fke
84f0: 79 32 2d 31 34 2e 32 74 6d 70 2e 31 2e 31 20 7b  y2-14.2tmp.1.1 {
8500: 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65  .    test_rename
8510: 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20  _parent {CREATE 
8520: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
8530: 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20 74 33  ENCES t2)} t2 t3
8540: 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41  .  } {{CREATE TA
8550: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
8560: 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 64 6f  CES "t3")}}.  do
8570: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
8580: 74 6d 70 2e 31 2e 32 20 7b 0a 20 20 20 20 74 65  tmp.1.2 {.    te
8590: 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74  st_rename_parent
85a0: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
85b0: 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  1(a REFERENCES t
85c0: 32 29 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b 7b  2)} t4 t3.  } {{
85d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
85e0: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  a REFERENCES t2)
85f0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
8600: 79 32 2d 31 34 2e 32 74 6d 70 2e 31 2e 33 20 7b  y2-14.2tmp.1.3 {
8610: 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65  .    test_rename
8620: 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20  _parent {CREATE 
8630: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
8640: 45 4e 43 45 53 20 22 74 32 22 29 7d 20 74 32 20  ENCES "t2")} t2 
8650: 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20  t3.  } {{CREATE 
8660: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
8670: 45 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20  ENCES "t3")}}.  
8680: 0a 20 20 23 20 54 65 73 74 20 41 4c 54 45 52 20  .  # Test ALTER 
8690: 54 41 42 4c 45 20 52 45 4e 41 4d 45 20 54 41 42  TABLE RENAME TAB
86a0: 4c 45 20 61 20 62 69 74 2e 0a 20 20 23 0a 20 20  LE a bit..  #.  
86b0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
86c0: 2e 32 74 6d 70 2e 32 2e 31 20 7b 0a 20 20 20 20  .2tmp.2.1 {.    
86d0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
86e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
86f0: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
8700: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
8710: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
8720: 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 20 20  NCES t1);.      
8730: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
8740: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
8750: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
8760: 20 74 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45   t1, c REFERENCE
8770: 53 20 74 32 29 3b 0a 20 20 20 20 20 20 43 52 45  S t2);.      CRE
8780: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
8790: 33 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  3(a REFERENCES t
87a0: 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  1, b REFERENCES 
87b0: 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t2, c REFERENCES
87c0: 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   t1);.    }.    
87d0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
87e0: 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
87f0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 57 48 45  _temp_master WHE
8800: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
8810: 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20  '}.  } [list \. 
8820: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
8830: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
8840: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
8850: 74 31 29 7d 20 20 20 20 20 20 20 20 20 20 20 20  t1)}            
8860: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7b           \.    {
8870: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
8880: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
8890: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
88a0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  c REFERENCES t2)
88b0: 7d 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45 41  }    \.    {CREA
88c0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52 45  TE TABLE t3(a RE
88d0: 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20 52  FERENCES t1, b R
88e0: 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20  EFERENCES t2, c 
88f0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d 20  REFERENCES t1)} 
8900: 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74   \.  ].  do_test
8910: 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e 32   fkey2-14.2tmp.2
8920: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
8930: 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
8940: 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34 20 7d  1 RENAME TO t4 }
8950: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
8960: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
8970: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
8980: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
8990: 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73  table'}.  } [lis
89a0: 74 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20  t \.    {CREATE 
89b0: 54 41 42 4c 45 20 22 74 34 22 28 61 20 50 52 49  TABLE "t4"(a PRI
89c0: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
89d0: 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 20 20  RENCES "t4")}   
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
8a00: 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52  ABLE t2(a PRIMAR
8a10: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
8a20: 43 45 53 20 22 74 34 22 2c 20 63 20 52 45 46 45  CES "t4", c REFE
8a30: 52 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20 20  RENCES t2)}     
8a40: 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41  \.    {CREATE TA
8a50: 42 4c 45 20 74 33 28 61 20 52 45 46 45 52 45 4e  BLE t3(a REFEREN
8a60: 43 45 53 20 22 74 34 22 2c 20 62 20 52 45 46 45  CES "t4", b REFE
8a70: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
8a80: 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 5c  ERENCES "t4")} \
8a90: 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .  ].  do_test f
8aa0: 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e 32 2e 33  key2-14.2tmp.2.3
8ab0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
8ac0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33  { INSERT INTO t3
8ad0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
8ae0: 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69   }.  } {1 {forei
8af0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
8b00: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
8b10: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 74  test fkey2-14.2t
8b20: 6d 70 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65  mp.2.4 {.    exe
8b30: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
8b40: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20  TO t4 VALUES(1, 
8b50: 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20  NULL) }.  } {}. 
8b60: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
8b70: 34 2e 32 74 6d 70 2e 32 2e 35 20 7b 0a 20 20 20  4.2tmp.2.5 {.   
8b80: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
8b90: 54 45 20 74 34 20 53 45 54 20 62 20 3d 20 35 20  TE t4 SET b = 5 
8ba0: 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67  }.  } {1 {foreig
8bb0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
8bc0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74   failed}}.  do_t
8bd0: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d  est fkey2-14.2tm
8be0: 70 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74 63  p.2.6 {.    catc
8bf0: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34  hsql { UPDATE t4
8c00: 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20 7d   SET b = 1 }.  }
8c10: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
8c20: 74 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e  t fkey2-14.2tmp.
8c30: 32 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.7 {.    execsq
8c40: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
8c50: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  t3 VALUES(1, NUL
8c60: 4c 2c 20 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  L, 1) }.  } {}..
8c70: 20 20 23 20 52 65 70 65 61 74 20 66 6f 72 20 41    # Repeat for A
8c80: 54 54 41 43 48 2d 65 64 20 74 61 62 6c 65 73 0a  TTACH-ed tables.
8c90: 20 20 23 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74    #.  drop_all_t
8ca0: 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  ables.  do_test 
8cb0: 66 6b 65 79 32 2d 31 34 2e 31 61 75 78 2e 31 20  fkey2-14.1aux.1 
8cc0: 7b 0a 20 20 20 20 23 20 41 64 64 69 6e 67 20 61  {.    # Adding a
8cd0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 52   column with a R
8ce0: 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65  EFERENCES clause
8cf0: 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
8d00: 64 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  d..    execsql {
8d10: 20 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27   .      ATTACH '
8d20: 3a 6d 65 6d 6f 72 79 3a 27 20 41 53 20 61 75 78  :memory:' AS aux
8d30: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
8d40: 41 42 4c 45 20 61 75 78 2e 74 31 28 61 20 50 52  ABLE aux.t1(a PR
8d50: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
8d60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
8d70: 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  ux.t2(a, b);.   
8d80: 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   }.    catchsql 
8d90: 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32  { ALTER TABLE t2
8da0: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 52 45   ADD COLUMN c RE
8db0: 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20  FERENCES t1 }.  
8dc0: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
8dd0: 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78  st fkey2-14.1aux
8de0: 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .2 {.    catchsq
8df0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
8e00: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 64 20  t2 ADD COLUMN d 
8e10: 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46  DEFAULT NULL REF
8e20: 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d  ERENCES t1 }.  }
8e30: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
8e40: 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78 2e  t fkey2-14.1aux.
8e50: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
8e60: 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
8e70: 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 65 20 52  2 ADD COLUMN e R
8e80: 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46  EFERENCES t1 DEF
8e90: 41 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20 7d 20 7b  AULT NULL}.  } {
8ea0: 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  0 {}}.  do_test 
8eb0: 66 6b 65 79 32 2d 31 34 2e 31 61 75 78 2e 34 20  fkey2-14.1aux.4 
8ec0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
8ed0: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20   ALTER TABLE t2 
8ee0: 41 44 44 20 43 4f 4c 55 4d 4e 20 66 20 52 45 46  ADD COLUMN f REF
8ef0: 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41 55  ERENCES t1 DEFAU
8f00: 4c 54 20 27 74 65 78 74 27 7d 0a 20 20 7d 20 7b  LT 'text'}.  } {
8f10: 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61 20  1 {Cannot add a 
8f20: 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75 6d  REFERENCES colum
8f30: 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20  n with non-NULL 
8f40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d 0a  default value}}.
8f50: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
8f60: 31 34 2e 31 61 75 78 2e 35 20 7b 0a 20 20 20 20  14.1aux.5 {.    
8f70: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
8f80: 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f   TABLE t2 ADD CO
8f90: 4c 55 4d 4e 20 67 20 44 45 46 41 55 4c 54 20 43  LUMN g DEFAULT C
8fa0: 55 52 52 45 4e 54 5f 54 49 4d 45 20 52 45 46 45  URRENT_TIME REFE
8fb0: 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d 20  RENCES t1 }.  } 
8fc0: 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61  {1 {Cannot add a
8fd0: 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75   REFERENCES colu
8fe0: 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c  mn with non-NULL
8ff0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d   default value}}
9000: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
9010: 2d 31 34 2e 31 61 75 78 2e 36 20 7b 0a 20 20 20  -14.1aux.6 {.   
9020: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
9030: 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e    PRAGMA foreign
9040: 5f 6b 65 79 73 20 3d 20 6f 66 66 3b 0a 20 20 20  _keys = off;.   
9050: 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74     ALTER TABLE t
9060: 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 68 20 44  2 ADD COLUMN h D
9070: 45 46 41 55 4c 54 20 27 74 65 78 74 27 20 52 45  EFAULT 'text' RE
9080: 46 45 52 45 4e 43 45 53 20 74 31 3b 0a 20 20 20  FERENCES t1;.   
9090: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
90a0: 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 20  n_keys = on;.   
90b0: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
90c0: 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61  OM aux.sqlite_ma
90d0: 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d  ster WHERE name=
90e0: 27 74 32 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  't2';.    }.  } 
90f0: 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  {{CREATE TABLE t
9100: 32 28 61 2c 20 62 2c 20 63 20 52 45 46 45 52 45  2(a, b, c REFERE
9110: 4e 43 45 53 20 74 31 2c 20 64 20 44 45 46 41 55  NCES t1, d DEFAU
9120: 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43  LT NULL REFERENC
9130: 45 53 20 74 31 2c 20 65 20 52 45 46 45 52 45 4e  ES t1, e REFEREN
9140: 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 4e  CES t1 DEFAULT N
9150: 55 4c 4c 2c 20 68 20 44 45 46 41 55 4c 54 20 27  ULL, h DEFAULT '
9160: 74 65 78 74 27 20 52 45 46 45 52 45 4e 43 45 53  text' REFERENCES
9170: 20 74 31 29 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73   t1)}}..  do_tes
9180: 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e  t fkey2-14.2aux.
9190: 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 5f 72  1.1 {.    test_r
91a0: 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52  ename_parent {CR
91b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
91c0: 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 20  REFERENCES t2)} 
91d0: 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41  t2 t3.  } {{CREA
91e0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45  TE TABLE t1(a RE
91f0: 46 45 52 45 4e 43 45 53 20 22 74 33 22 29 7d 7d  FERENCES "t3")}}
9200: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
9210: 2d 31 34 2e 32 61 75 78 2e 31 2e 32 20 7b 0a 20  -14.2aux.1.2 {. 
9220: 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70     test_rename_p
9230: 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20 54 41  arent {CREATE TA
9240: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
9250: 43 45 53 20 74 32 29 7d 20 74 34 20 74 33 0a 20  CES t2)} t4 t3. 
9260: 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c   } {{CREATE TABL
9270: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
9280: 53 20 74 32 29 7d 7d 0a 20 20 64 6f 5f 74 65 73  S t2)}}.  do_tes
9290: 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e  t fkey2-14.2aux.
92a0: 31 2e 33 20 7b 0a 20 20 20 20 74 65 73 74 5f 72  1.3 {.    test_r
92b0: 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52  ename_parent {CR
92c0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
92d0: 52 45 46 45 52 45 4e 43 45 53 20 22 74 32 22 29  REFERENCES "t2")
92e0: 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52  } t2 t3.  } {{CR
92f0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
9300: 52 45 46 45 52 45 4e 43 45 53 20 22 74 33 22 29  REFERENCES "t3")
9310: 7d 7d 0a 20 20 0a 20 20 23 20 54 65 73 74 20 41  }}.  .  # Test A
9320: 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41 4d  LTER TABLE RENAM
9330: 45 20 54 41 42 4c 45 20 61 20 62 69 74 2e 0a 20  E TABLE a bit.. 
9340: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65   #.  do_test fke
9350: 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e 31 20 7b  y2-14.2aux.2.1 {
9360: 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61  .    drop_all_ta
9370: 62 6c 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c  bles.    execsql
9380: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
9390: 54 41 42 4c 45 20 61 75 78 2e 74 31 28 61 20 50  TABLE aux.t1(a P
93a0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
93b0: 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20  FERENCES t1);.  
93c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
93d0: 20 61 75 78 2e 74 32 28 61 20 50 52 49 4d 41 52   aux.t2(a PRIMAR
93e0: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
93f0: 43 45 53 20 74 31 2c 20 63 20 52 45 46 45 52 45  CES t1, c REFERE
9400: 4e 43 45 53 20 74 32 29 3b 0a 20 20 20 20 20 20  NCES t2);.      
9410: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
9420: 2e 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53  .t3(a REFERENCES
9430: 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45   t1, b REFERENCE
9440: 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43  S t2, c REFERENC
9450: 45 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ES t1);.    }.  
9460: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
9470: 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e  CT sql FROM aux.
9480: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
9490: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
94a0: 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a  e'}.  } [list \.
94b0: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
94c0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
94d0: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
94e0: 20 74 31 29 7d 20 20 20 20 20 20 20 20 20 20 20   t1)}           
94f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
9500: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
9510: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
9520: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c  b REFERENCES t1,
9530: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   c REFERENCES t2
9540: 29 7d 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45  )}    \.    {CRE
9550: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52  ATE TABLE t3(a R
9560: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20  EFERENCES t1, b 
9570: 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63  REFERENCES t2, c
9580: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d   REFERENCES t1)}
9590: 20 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73    \.  ].  do_tes
95a0: 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e  t fkey2-14.2aux.
95b0: 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.2 {.    execsq
95c0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
95d0: 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34 20  t1 RENAME TO t4 
95e0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
95f0: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
9600: 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  aux.sqlite_maste
9610: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
9620: 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73  table'}.  } [lis
9630: 74 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20  t \.    {CREATE 
9640: 54 41 42 4c 45 20 22 74 34 22 28 61 20 50 52 49  TABLE "t4"(a PRI
9650: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
9660: 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 20 20  RENCES "t4")}   
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
9690: 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52  ABLE t2(a PRIMAR
96a0: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
96b0: 43 45 53 20 22 74 34 22 2c 20 63 20 52 45 46 45  CES "t4", c REFE
96c0: 52 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20 20  RENCES t2)}     
96d0: 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41  \.    {CREATE TA
96e0: 42 4c 45 20 74 33 28 61 20 52 45 46 45 52 45 4e  BLE t3(a REFEREN
96f0: 43 45 53 20 22 74 34 22 2c 20 62 20 52 45 46 45  CES "t4", b REFE
9700: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
9710: 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 5c  ERENCES "t4")} \
9720: 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .  ].  do_test f
9730: 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e 33  key2-14.2aux.2.3
9740: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
9750: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33  { INSERT INTO t3
9760: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
9770: 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69   }.  } {1 {forei
9780: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
9790: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
97a0: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61  test fkey2-14.2a
97b0: 75 78 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65  ux.2.4 {.    exe
97c0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
97d0: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20  TO t4 VALUES(1, 
97e0: 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20  NULL) }.  } {}. 
97f0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
9800: 34 2e 32 61 75 78 2e 32 2e 35 20 7b 0a 20 20 20  4.2aux.2.5 {.   
9810: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
9820: 54 45 20 74 34 20 53 45 54 20 62 20 3d 20 35 20  TE t4 SET b = 5 
9830: 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67  }.  } {1 {foreig
9840: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
9850: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74   failed}}.  do_t
9860: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75  est fkey2-14.2au
9870: 78 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74 63  x.2.6 {.    catc
9880: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34  hsql { UPDATE t4
9890: 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20 7d   SET b = 1 }.  }
98a0: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
98b0: 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e  t fkey2-14.2aux.
98c0: 32 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.7 {.    execsq
98d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
98e0: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  t3 VALUES(1, NUL
98f0: 4c 2c 20 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a 7d  L, 1) }.  } {}.}
9900: 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32  ..do_test fkey-2
9910: 2e 31 34 2e 33 2e 31 20 7b 0a 20 20 64 72 6f 70  .14.3.1 {.  drop
9920: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78  _all_tables.  ex
9930: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
9940: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
9950: 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73 75   REFERENCES nosu
9960: 63 68 74 61 62 6c 65 29 3b 0a 20 20 20 20 44 52  chtable);.    DR
9970: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d  OP TABLE t1;.  }
9980: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
9990: 65 79 2d 32 2e 31 34 2e 33 2e 32 20 7b 0a 20 20  ey-2.14.3.2 {.  
99a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
99b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
99c0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
99d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
99e0: 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t1 VALUES('a', 
99f0: 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  1);.    CREATE T
9a00: 41 42 4c 45 20 74 32 28 78 20 52 45 46 45 52 45  ABLE t2(x REFERE
9a10: 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 49 4e  NCES t1);.    IN
9a20: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
9a30: 55 45 53 28 27 61 27 29 3b 0a 20 20 7d 0a 7d 20  UES('a');.  }.} 
9a40: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  {}.do_test fkey-
9a50: 32 2e 31 34 2e 33 2e 33 20 7b 0a 20 20 63 61 74  2.14.3.3 {.  cat
9a60: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
9a70: 4c 45 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f  LE t1 }.} {1 {fo
9a80: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
9a90: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
9aa0: 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e  _test fkey-2.14.
9ab0: 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.4 {.  execsql 
9ac0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
9ad0: 4d 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20 54  M t2;.    DROP T
9ae0: 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  ABLE t1;.  }.} {
9af0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32  }.do_test fkey-2
9b00: 2e 31 34 2e 33 2e 34 20 7b 0a 20 20 63 61 74 63  .14.3.4 {.  catc
9b10: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
9b20: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78 27  TO t2 VALUES('x'
9b30: 29 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  ) }.} {1 {no suc
9b40: 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 74 31  h table: main.t1
9b50: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  }}.do_test fkey-
9b60: 32 2e 31 34 2e 33 2e 35 20 7b 0a 20 20 65 78 65  2.14.3.5 {.  exe
9b70: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
9b80: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
9b90: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49  MARY KEY);.    I
9ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
9bb0: 4c 55 45 53 28 27 78 27 29 3b 0a 20 20 7d 0a 20  LUES('x');.  }. 
9bc0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
9bd0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
9be0: 28 27 78 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ('x') }.} {}.do_
9bf0: 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33  test fkey-2.14.3
9c00: 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .6 {.  catchsql 
9c10: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
9c20: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
9c30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
9c40: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
9c50: 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 37 20 7b 0a  fkey-2.14.3.7 {.
9c60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
9c70: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
9c80: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
9c90: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9ca0: 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 38  st fkey-2.14.3.8
9cb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
9cc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9cd0: 70 70 28 78 2c 20 79 2c 20 50 52 49 4d 41 52 59  pp(x, y, PRIMARY
9ce0: 20 4b 45 59 28 78 2c 20 79 29 29 3b 0a 20 20 20   KEY(x, y));.   
9cf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 63   CREATE TABLE cc
9d00: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
9d10: 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45 4e  EY(a, b) REFEREN
9d20: 43 45 53 20 70 70 28 78 2c 20 7a 29 29 3b 0a 20  CES pp(x, z));. 
9d30: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
9d40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
9d50: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20  ALUES(1, 2) }.} 
9d60: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
9d70: 6d 69 73 6d 61 74 63 68 20 2d 20 22 63 63 22 20  mismatch - "cc" 
9d80: 72 65 66 65 72 65 6e 63 69 6e 67 20 22 70 70 22  referencing "pp"
9d90: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  }}.do_test fkey-
9da0: 32 2e 31 34 2e 33 2e 39 20 7b 0a 20 20 65 78 65  2.14.3.9 {.  exe
9db0: 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  csql { DROP TABL
9dc0: 45 20 63 63 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  E cc }.} {}.do_t
9dd0: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9de0: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 {.  execsql {
9df0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9e00: 45 20 63 63 28 61 2c 20 62 2c 20 0a 20 20 20 20  E cc(a, b, .    
9e10: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c    FOREIGN KEY(a,
9e20: 20 62 29 20 52 45 46 45 52 45 4e 43 45 53 20 70   b) REFERENCES p
9e30: 70 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  p DEFERRABLE INI
9e40: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
9e50: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 65 78 65      );.  }.  exe
9e60: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
9e70: 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53  T INTO pp VALUES
9e80: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
9e90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
9ea0: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
9eb0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9ec0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 70 3b    DROP TABLE pp;
9ed0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
9ee0: 42 4c 45 20 70 70 28 61 2c 20 62 2c 20 63 2c 20  BLE pp(a, b, c, 
9ef0: 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63  PRIMARY KEY(b, c
9f00: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
9f10: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
9f20: 31 2c 20 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  1, 'a', 'b');.  
9f30: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
9f40: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  {}.do_test fkey-
9f50: 32 2e 31 34 2e 33 2e 31 31 20 7b 0a 20 20 65 78  2.14.3.11 {.  ex
9f60: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47  ecsql { .    BEG
9f70: 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  IN;.      DROP T
9f80: 41 42 4c 45 20 63 63 3b 0a 20 20 20 20 20 20 44  ABLE cc;.      D
9f90: 52 4f 50 20 54 41 42 4c 45 20 70 70 3b 0a 20 20  ROP TABLE pp;.  
9fa0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
9fb0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  {}.do_test fkey-
9fc0: 32 2e 31 34 2e 33 2e 31 32 20 7b 0a 20 20 65 78  2.14.3.12 {.  ex
9fd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
9fe0: 54 45 20 54 41 42 4c 45 20 62 31 28 61 2c 20 62  TE TABLE b1(a, b
9ff0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
a000: 42 4c 45 20 62 32 28 61 2c 20 62 20 52 45 46 45  BLE b2(a, b REFE
a010: 52 45 4e 43 45 53 20 62 31 29 3b 0a 20 20 20 20  RENCES b1);.    
a020: 44 52 4f 50 20 54 41 42 4c 45 20 62 31 3b 0a 20  DROP TABLE b1;. 
a030: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
a040: 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 31 33 20 7b  fkey-2.14.3.13 {
a050: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a060: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 33   CREATE TABLE b3
a070: 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  (a, b REFERENCES
a080: 20 62 32 20 44 45 46 45 52 52 41 42 4c 45 20 49   b2 DEFERRABLE I
a090: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
a0a0: 44 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  D);.    DROP TAB
a0b0: 4c 45 20 62 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  LE b2;.  }.} {}.
a0c0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f 74  .# Test that not
a0d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
a0e0: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 61 20  when dropping a 
a0f0: 74 61 62 6c 65 20 74 68 61 74 20 72 65 66 65 72  table that refer
a100: 73 20 74 6f 20 61 20 76 69 65 77 2e 0a 23 20 4f  s to a view..# O
a110: 72 20 64 72 6f 70 70 69 6e 67 20 61 20 76 69 65  r dropping a vie
a120: 77 20 74 68 61 74 20 61 6e 20 65 78 69 73 74 69  w that an existi
a130: 6e 67 20 46 4b 20 28 69 6e 63 6f 72 72 65 63 74  ng FK (incorrect
a140: 6c 79 29 20 72 65 66 65 72 73 20 74 6f 2e 20 4f  ly) refers to. O
a150: 72 20 65 69 74 68 65 72 0a 23 20 6f 66 20 74 68  r either.# of th
a160: 65 20 61 62 6f 76 65 20 73 63 65 6e 61 72 69 6f  e above scenario
a170: 73 20 77 69 74 68 20 61 20 76 69 72 74 75 61 6c  s with a virtual
a180: 20 74 61 62 6c 65 2e 0a 64 72 6f 70 5f 61 6c 6c   table..drop_all
a190: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
a1a0: 66 6b 65 79 2d 32 2e 31 34 2e 34 2e 31 20 7b 0a  fkey-2.14.4.1 {.
a1b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a1c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a1d0: 78 20 52 45 46 45 52 45 4e 43 45 53 20 76 29 3b  x REFERENCES v);
a1e0: 20 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 45   .    CREATE VIE
a1f0: 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a 20  W v AS SELECT * 
a200: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
a210: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32  }.do_test fkey-2
a220: 2e 31 34 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63  .14.4.2 {.  exec
a230: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 56  sql {.    DROP V
a240: 49 45 57 20 76 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  IEW v;.  }.} {}.
a250: 69 66 63 61 70 61 62 6c 65 20 76 74 61 62 20 7b  ifcapable vtab {
a260: 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f  .  register_echo
a270: 5f 6d 6f 64 75 6c 65 20 64 62 0a 20 20 64 6f 5f  _module db.  do_
a280: 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 34  test fkey-2.14.4
a290: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
a2a0: 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41   { CREATE VIRTUA
a2b0: 4c 20 54 41 42 4c 45 20 76 20 55 53 49 4e 47 20  L TABLE v USING 
a2c0: 65 63 68 6f 28 74 31 29 20 7d 0a 20 20 7d 20 7b  echo(t1) }.  } {
a2d0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
a2e0: 2d 32 2e 31 34 2e 34 2e 32 20 7b 0a 20 20 20 20  -2.14.4.2 {.    
a2f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
a300: 44 52 4f 50 20 54 41 42 4c 45 20 76 3b 0a 20 20  DROP TABLE v;.  
a310: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d    }.  } {}.}..#-
a320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
a370: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20  ollowing tests, 
a380: 66 6b 65 79 32 2d 31 35 2e 2a 2c 20 74 65 73 74  fkey2-15.*, test
a390: 20 74 68 61 74 20 75 6e 6e 65 63 65 73 73 61 72   that unnecessar
a3a0: 79 20 46 4b 20 72 65 6c 61 74 65 64 20 73 63 61  y FK related sca
a3b0: 6e 73 20 0a 23 20 61 6e 64 20 6c 6f 6f 6b 75 70  ns .# and lookup
a3c0: 73 20 61 72 65 20 61 76 6f 69 64 65 64 20 77 68  s are avoided wh
a3d0: 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
a3e0: 74 20 63 6f 75 6e 74 65 72 73 20 61 72 65 20 7a  t counters are z
a3f0: 65 72 6f 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ero..#.drop_all_
a400: 74 61 62 6c 65 73 0a 70 72 6f 63 20 65 78 65 63  tables.proc exec
a410: 73 71 6c 53 20 7b 7a 53 71 6c 7d 20 7b 0a 20 20  sqlS {zSql} {.  
a420: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 65 61  set ::sqlite_sea
a430: 72 63 68 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65  rch_count 0.  se
a440: 74 20 3a 3a 73 71 6c 69 74 65 5f 66 6f 75 6e 64  t ::sqlite_found
a450: 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 72  _count 0.  set r
a460: 65 73 20 5b 75 70 6c 65 76 65 6c 20 5b 6c 69 73  es [uplevel [lis
a470: 74 20 65 78 65 63 73 71 6c 20 24 7a 53 71 6c 5d  t execsql $zSql]
a480: 5d 0a 20 20 63 6f 6e 63 61 74 20 5b 65 78 70 72  ].  concat [expr
a490: 20 24 3a 3a 73 71 6c 69 74 65 5f 66 6f 75 6e 64   $::sqlite_found
a4a0: 5f 63 6f 75 6e 74 20 2b 20 24 3a 3a 73 71 6c 69  _count + $::sqli
a4b0: 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 5d  te_search_count]
a4c0: 20 24 72 65 73 0a 7d 0a 64 6f 5f 74 65 73 74 20   $res.}.do_test 
a4d0: 66 6b 65 79 32 2d 31 35 2e 31 2e 31 20 7b 0a 20  fkey2-15.1.1 {. 
a4e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
a4f0: 52 45 41 54 45 20 54 41 42 4c 45 20 70 70 28 61  REATE TABLE pp(a
a500: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
a510: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a520: 4c 45 20 63 63 28 78 2c 20 79 20 52 45 46 45 52  LE cc(x, y REFER
a530: 45 4e 43 45 53 20 70 70 20 44 45 46 45 52 52 41  ENCES pp DEFERRA
a540: 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  BLE INITIALLY DE
a550: 46 45 52 52 45 44 29 3b 0a 20 20 20 20 49 4e 53  FERRED);.    INS
a560: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
a570: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20  ES(1, 'one');.  
a580: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70    INSERT INTO pp
a590: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
a5a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a5b0: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27 6e 65  TO cc VALUES('ne
a5c0: 75 6e 67 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e  ung', 1);.    IN
a5d0: 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c  SERT INTO cc VAL
a5e0: 55 45 53 28 27 73 6f 6e 67 27 2c 20 32 29 3b 0a  UES('song', 2);.
a5f0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
a600: 20 66 6b 65 79 32 2d 31 35 2e 31 2e 32 20 7b 0a   fkey2-15.1.2 {.
a610: 20 20 65 78 65 63 73 71 6c 53 20 7b 20 49 4e 53    execsqlS { INS
a620: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
a630: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 20 7d  ES(3, 'three') }
a640: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66  .} {0}.do_test f
a650: 6b 65 79 32 2d 31 35 2e 31 2e 33 20 7b 0a 20 20  key2-15.1.3 {.  
a660: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
a670: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
a680: 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53  T INTO cc VALUES
a690: 28 27 73 65 65 27 2c 20 34 29 3b 20 20 20 20 2d  ('see', 4);    -
a6a0: 2d 20 56 69 6f 6c 61 74 65 73 20 64 65 66 65 72  - Violates defer
a6b0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  red constraint. 
a6c0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 53 20 7b 20   }.  execsqlS { 
a6d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56  INSERT INTO pp V
a6e0: 41 4c 55 45 53 28 35 2c 20 27 66 69 76 65 27 29  ALUES(5, 'five')
a6f0: 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74   }.} {2}.do_test
a700: 20 66 6b 65 79 32 2d 31 35 2e 31 2e 34 20 7b 0a   fkey2-15.1.4 {.
a710: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45    execsql { DELE
a720: 54 45 20 46 52 4f 4d 20 63 63 20 57 48 45 52 45  TE FROM cc WHERE
a730: 20 78 20 3d 20 27 73 65 65 27 20 7d 0a 20 20 65   x = 'see' }.  e
a740: 78 65 63 73 71 6c 53 20 7b 20 49 4e 53 45 52 54  xecsqlS { INSERT
a750: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
a760: 36 2c 20 27 73 69 78 27 29 20 7d 0a 7d 20 7b 30  6, 'six') }.} {0
a770: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
a780: 31 35 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  15.1.5 {.  execs
a790: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64  ql COMMIT.} {}.d
a7a0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 35 2e  o_test fkey2-15.
a7b0: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
a7c0: 42 45 47 49 4e 0a 20 20 65 78 65 63 73 71 6c 53  BEGIN.  execsqlS
a7d0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
a7e0: 4f 4d 20 63 63 20 57 48 45 52 45 20 78 20 3d 20  OM cc WHERE x = 
a7f0: 27 6e 65 75 6e 67 27 3b 0a 20 20 20 20 52 4f 4c  'neung';.    ROL
a800: 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 31 7d  LBACK;.  }.} {1}
a810: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
a820: 35 2e 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  5.1.7 {.  execsq
a830: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
a840: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
a850: 70 70 20 57 48 45 52 45 20 61 20 3d 20 32 3b 0a  pp WHERE a = 2;.
a860: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 53 20 7b    }.  execsqlS {
a870: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
a880: 20 63 63 20 57 48 45 52 45 20 78 20 3d 20 27 6e   cc WHERE x = 'n
a890: 65 75 6e 67 27 3b 0a 20 20 20 20 52 4f 4c 4c 42  eung';.    ROLLB
a8a0: 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 0a  ACK;.  }.} {2}..
a8b0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
a900: 73 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  s next block of 
a910: 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 36 2e  tests, fkey2-16.
a920: 2a 2c 20 74 65 73 74 20 74 68 61 74 20 72 6f 77  *, test that row
a930: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 0a  s that refer to.
a940: 23 20 74 68 65 6d 73 65 6c 76 65 73 20 6d 61 79  # themselves may
a950: 20 62 65 20 69 6e 73 65 72 74 65 64 20 61 6e 64   be inserted and
a960: 20 64 65 6c 65 74 65 64 2e 0a 23 0a 66 6f 72 65   deleted..#.fore
a970: 61 63 68 20 7b 74 6e 20 7a 53 63 68 65 6d 61 7d  ach {tn zSchema}
a980: 20 7b 0a 20 20 31 20 7b 20 43 52 45 41 54 45 20   {.  1 { CREATE 
a990: 54 41 42 4c 45 20 73 65 6c 66 28 61 20 49 4e 54  TABLE self(a INT
a9a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a9b0: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 73  , b REFERENCES s
a9c0: 65 6c 66 28 61 29 29 20 7d 0a 20 20 32 20 7b 20  elf(a)) }.  2 { 
a9d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 65 6c  CREATE TABLE sel
a9e0: 66 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  f(a PRIMARY KEY,
a9f0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 73 65   b REFERENCES se
aa00: 6c 66 28 61 29 29 20 7d 0a 20 20 33 20 7b 20 43  lf(a)) }.  3 { C
aa10: 52 45 41 54 45 20 54 41 42 4c 45 20 73 65 6c 66  REATE TABLE self
aa20: 28 61 20 55 4e 49 51 55 45 2c 20 62 20 49 4e 54  (a UNIQUE, b INT
aa30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
aa40: 20 52 45 46 45 52 45 4e 43 45 53 20 73 65 6c 66   REFERENCES self
aa50: 28 61 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 72 6f  (a)) }.} {.  dro
aa60: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64  p_all_tables.  d
aa70: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 36 2e  o_test fkey2-16.
aa80: 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  1.$tn.1 {.    ex
aa90: 65 63 73 71 6c 20 24 7a 53 63 68 65 6d 61 0a 20  ecsql $zSchema. 
aaa0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
aab0: 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 20 56 41  ERT INTO self VA
aac0: 4c 55 45 53 28 31 33 2c 20 31 33 29 20 7d 0a 20  LUES(13, 13) }. 
aad0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
aae0: 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 32  fkey2-16.1.$tn.2
aaf0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
ab00: 20 55 50 44 41 54 45 20 73 65 6c 66 20 53 45 54   UPDATE self SET
ab10: 20 61 20 3d 20 31 34 2c 20 62 20 3d 20 31 34 20   a = 14, b = 14 
ab20: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  }.  } {}..  do_t
ab30: 65 73 74 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24  est fkey2-16.1.$
ab40: 74 6e 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.3 {.    catch
ab50: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73 65 6c  sql { UPDATE sel
ab60: 66 20 53 45 54 20 62 20 3d 20 31 35 20 7d 0a 20  f SET b = 15 }. 
ab70: 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b   } {1 {foreign k
ab80: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
ab90: 69 6c 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73  iled}}..  do_tes
aba0: 74 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e  t fkey2-16.1.$tn
abb0: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
abc0: 6c 20 7b 20 55 50 44 41 54 45 20 73 65 6c 66 20  l { UPDATE self 
abd0: 53 45 54 20 61 20 3d 20 31 35 20 7d 0a 20 20 7d  SET a = 15 }.  }
abe0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
abf0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
ac00: 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ed}}..  do_test 
ac10: 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 35  fkey2-16.1.$tn.5
ac20: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
ac30: 7b 20 55 50 44 41 54 45 20 73 65 6c 66 20 53 45  { UPDATE self SE
ac40: 54 20 61 20 3d 20 31 35 2c 20 62 20 3d 20 31 36  T a = 15, b = 16
ac50: 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69   }.  } {1 {forei
ac60: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
ac70: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 20 20 64 6f  t failed}}..  do
ac80: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 36 2e 31  _test fkey2-16.1
ac90: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 63 61 74  .$tn.6 {.    cat
aca0: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73  chsql { UPDATE s
acb0: 65 6c 66 20 53 45 54 20 61 20 3d 20 31 37 2c 20  elf SET a = 17, 
acc0: 62 20 3d 20 31 37 20 7d 0a 20 20 7d 20 7b 30 20  b = 17 }.  } {0 
acd0: 7b 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66  {}}..  do_test f
ace0: 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 37 20  key2-16.1.$tn.7 
acf0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ad00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 65 6c 66  DELETE FROM self
ad10: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
ad20: 65 73 74 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24  est fkey2-16.1.$
ad30: 74 6e 2e 38 20 7b 0a 20 20 20 20 63 61 74 63 68  tn.8 {.    catch
ad40: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
ad50: 4f 20 73 65 6c 66 20 56 41 4c 55 45 53 28 32 30  O self VALUES(20
ad60: 2c 20 32 31 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  , 21) }.  } {1 {
ad70: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
ad80: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
ad90: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
ade0: 54 68 69 73 20 6e 65 78 74 20 62 6c 6f 63 6b 20  This next block 
adf0: 6f 66 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d  of tests, fkey2-
ae00: 31 37 2e 2a 2c 20 74 65 73 74 73 20 74 68 61 74  17.*, tests that
ae10: 20 69 66 20 22 50 52 41 47 4d 41 20 63 6f 75 6e   if "PRAGMA coun
ae20: 74 5f 63 68 61 6e 67 65 73 22 0a 23 20 69 73 20  t_changes".# is 
ae30: 74 75 72 6e 65 64 20 6f 6e 20 73 74 61 74 65 6d  turned on statem
ae40: 65 6e 74 73 20 74 68 61 74 20 76 69 6f 6c 61 74  ents that violat
ae50: 65 20 69 6d 6d 65 64 69 61 74 65 20 46 4b 20 63  e immediate FK c
ae60: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 74 75 72  onstraints retur
ae70: 6e 0a 23 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  n.# SQLITE_CONST
ae80: 52 41 49 4e 54 20 69 6d 6d 65 64 69 61 74 65 6c  RAINT immediatel
ae90: 79 2c 20 6e 6f 74 20 61 66 74 65 72 20 72 65 74  y, not after ret
aea0: 75 72 6e 69 6e 67 20 61 20 6e 75 6d 62 65 72 20  urning a number 
aeb0: 6f 66 20 72 6f 77 73 2e 0a 23 20 57 68 65 72 65  of rows..# Where
aec0: 61 73 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  as statements th
aed0: 61 74 20 76 69 6f 6c 61 74 65 20 64 65 66 65 72  at violate defer
aee0: 72 65 64 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e  red FK constrain
aef0: 74 73 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ts return the nu
af00: 6d 62 65 72 0a 23 20 6f 66 20 72 6f 77 73 20 62  mber.# of rows b
af10: 65 66 6f 72 65 20 66 61 69 6c 69 6e 67 2e 0a 23  efore failing..#
af20: 0a 23 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61  .# Also test tha
af30: 74 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 20  t rows modified 
af40: 62 79 20 46 4b 20 61 63 74 69 6f 6e 73 20 61 72  by FK actions ar
af50: 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 20 69 6e  e not counted in
af60: 20 65 69 74 68 65 72 20 74 68 65 0a 23 20 72 65   either the.# re
af70: 74 75 72 6e 65 64 20 72 6f 77 20 63 6f 75 6e 74  turned row count
af80: 20 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 72   or the values r
af90: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
afa0: 65 33 5f 63 68 61 6e 67 65 73 28 29 2e 20 4c 69  e3_changes(). Li
afb0: 6b 65 0a 23 20 74 72 69 67 67 65 72 20 72 65 6c  ke.# trigger rel
afc0: 61 74 65 64 20 63 68 61 6e 67 65 73 2c 20 74 68  ated changes, th
afd0: 65 79 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20  ey are included 
afe0: 69 6e 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  in sqlite3_total
aff0: 5f 63 68 61 6e 67 65 73 28 29 20 74 68 6f 75 67  _changes() thoug
b000: 68 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  h..#.drop_all_ta
b010: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65  bles.do_test fke
b020: 79 32 2d 31 37 2e 31 2e 31 20 7b 0a 20 20 65 78  y2-17.1.1 {.  ex
b030: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
b040: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 3d 20 31  ount_changes = 1
b050: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   }.  execsql { .
b060: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b070: 20 6f 6e 65 28 61 2c 20 62 2c 20 63 2c 20 55 4e   one(a, b, c, UN
b080: 49 51 55 45 28 62 2c 20 63 29 29 3b 0a 20 20 20  IQUE(b, c));.   
b090: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77   CREATE TABLE tw
b0a0: 6f 28 64 2c 20 65 2c 20 66 2c 20 46 4f 52 45 49  o(d, e, f, FOREI
b0b0: 47 4e 20 4b 45 59 28 65 2c 20 66 29 20 52 45 46  GN KEY(e, f) REF
b0c0: 45 52 45 4e 43 45 53 20 6f 6e 65 28 62 2c 20 63  ERENCES one(b, c
b0d0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
b0e0: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 31  NTO one VALUES(1
b0f0: 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b  , 2, 3);.  }.} {
b100: 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  1}.do_test fkey2
b110: 2d 31 37 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20  -17.1.2 {.  set 
b120: 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72  STMT [sqlite3_pr
b130: 65 70 61 72 65 5f 76 32 20 64 62 20 22 49 4e 53  epare_v2 db "INS
b140: 45 52 54 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c  ERT INTO two VAL
b150: 55 45 53 28 34 2c 20 35 2c 20 36 29 22 20 2d 31  UES(4, 5, 6)" -1
b160: 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65   dummy].  sqlite
b170: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 7b  3_step $STMT.} {
b180: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b190: 54 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72 72  T}.verify_ex_err
b1a0: 63 6f 64 65 20 66 6b 65 79 32 2d 31 37 2e 31 2e  code fkey2-17.1.
b1b0: 32 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  2b SQLITE_CONSTR
b1c0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a  AINT_FOREIGNKEY.
b1d0: 69 66 63 61 70 61 62 6c 65 20 61 75 74 6f 72 65  ifcapable autore
b1e0: 73 65 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  set {.  do_test 
b1f0: 66 6b 65 79 32 2d 31 37 2e 31 2e 33 20 7b 0a 20  fkey2-17.1.3 {. 
b200: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20     sqlite3_step 
b210: 24 53 54 4d 54 0a 20 20 7d 20 7b 53 51 4c 49 54  $STMT.  } {SQLIT
b220: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 20 20  E_CONSTRAINT}.  
b230: 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64  verify_ex_errcod
b240: 65 20 66 6b 65 79 32 2d 31 37 2e 31 2e 33 62 20  e fkey2-17.1.3b 
b250: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b260: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 7d 20 65  T_FOREIGNKEY.} e
b270: 6c 73 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  lse {.  do_test 
b280: 66 6b 65 79 32 2d 31 37 2e 31 2e 33 20 7b 0a 20  fkey2-17.1.3 {. 
b290: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20     sqlite3_step 
b2a0: 24 53 54 4d 54 0a 20 20 7d 20 7b 53 51 4c 49 54  $STMT.  } {SQLIT
b2b0: 45 5f 4d 49 53 55 53 45 7d 0a 7d 0a 64 6f 5f 74  E_MISUSE}.}.do_t
b2c0: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 34  est fkey2-17.1.4
b2d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   {.  sqlite3_fin
b2e0: 61 6c 69 7a 65 20 24 53 54 4d 54 0a 7d 20 7b 53  alize $STMT.} {S
b2f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b300: 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63  }.verify_ex_errc
b310: 6f 64 65 20 66 6b 65 79 32 2d 31 37 2e 31 2e 34  ode fkey2-17.1.4
b320: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
b330: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 64  INT_FOREIGNKEY.d
b340: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e  o_test fkey2-17.
b350: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
b360: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
b370: 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 32 2c 20  O one VALUES(2, 
b380: 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  3, 4);.    INSER
b390: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
b3a0: 53 28 33 2c 20 34 2c 20 35 29 3b 0a 20 20 20 20  S(3, 4, 5);.    
b3b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 77 6f 20  INSERT INTO two 
b3c0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
b3d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b3e0: 20 74 77 6f 20 56 41 4c 55 45 53 28 32 2c 20 33   two VALUES(2, 3
b3f0: 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 4);.    INSERT
b400: 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53   INTO two VALUES
b410: 28 33 2c 20 34 2c 20 35 29 3b 0a 20 20 7d 0a 7d  (3, 4, 5);.  }.}
b420: 20 7b 31 20 31 20 31 20 31 20 31 7d 0a 64 6f 5f   {1 1 1 1 1}.do_
b430: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e  test fkey2-17.1.
b440: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
b450: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
b460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e    INSERT INTO on
b470: 65 20 56 41 4c 55 45 53 28 30 2c 20 30 2c 20 30  e VALUES(0, 0, 0
b480: 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  );.      UPDATE 
b490: 74 77 6f 20 53 45 54 20 65 3d 65 2b 31 2c 20 66  two SET e=e+1, f
b4a0: 3d 66 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  =f+1;.  }.} {1 {
b4b0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
b4c0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
b4d0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
b4e0: 2e 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.7 {.  execsql
b4f0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
b500: 20 6f 6e 65 20 7d 0a 7d 20 7b 31 20 32 20 33 20   one }.} {1 2 3 
b510: 32 20 33 20 34 20 33 20 34 20 35 20 30 20 30 20  2 3 4 3 4 5 0 0 
b520: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  0}.do_test fkey2
b530: 2d 31 37 2e 31 2e 38 20 7b 0a 20 20 65 78 65 63  -17.1.8 {.  exec
b540: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
b550: 52 4f 4d 20 74 77 6f 20 7d 0a 7d 20 7b 31 20 32  ROM two }.} {1 2
b560: 20 33 20 32 20 33 20 34 20 33 20 34 20 35 7d 0a   3 2 3 4 3 4 5}.
b570: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
b580: 2e 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.9 {.  execsql
b590: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f 5f   COMMIT.} {}.do_
b5a0: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e  test fkey2-17.1.
b5b0: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 {.  execsql {
b5c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
b5d0: 45 20 74 68 72 65 65 28 0a 20 20 20 20 20 20 67  E three(.      g
b5e0: 2c 20 68 2c 20 69 2c 20 0a 20 20 20 20 20 20 46  , h, i, .      F
b5f0: 4f 52 45 49 47 4e 20 4b 45 59 28 68 2c 20 69 29  OREIGN KEY(h, i)
b600: 20 52 45 46 45 52 45 4e 43 45 53 20 6f 6e 65 28   REFERENCES one(
b610: 62 2c 20 63 29 20 44 45 46 45 52 52 41 42 4c 45  b, c) DEFERRABLE
b620: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
b630: 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  RED.    );.  }.}
b640: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
b650: 32 2d 31 37 2e 31 2e 31 31 20 7b 0a 20 20 73 65  2-17.1.11 {.  se
b660: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
b670: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 22 49  prepare_v2 db "I
b680: 4e 53 45 52 54 20 49 4e 54 4f 20 74 68 72 65 65  NSERT INTO three
b690: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
b6a0: 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71  " -1 dummy].  sq
b6b0: 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54  lite3_step $STMT
b6c0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 52 4f 57 7d 0a  .} {SQLITE_ROW}.
b6d0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
b6e0: 2e 31 2e 31 32 20 7b 0a 20 20 73 71 6c 69 74 65  .1.12 {.  sqlite
b6f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53  3_column_text $S
b700: 54 4d 54 20 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  TMT 0.} {1}.do_t
b710: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 31  est fkey2-17.1.1
b720: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  3 {.  sqlite3_st
b730: 65 70 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49  ep $STMT.} {SQLI
b740: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76  TE_CONSTRAINT}.v
b750: 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65  erify_ex_errcode
b760: 20 66 6b 65 79 32 2d 31 37 2e 31 2e 31 33 62 20   fkey2-17.1.13b 
b770: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b780: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 64 6f 5f  T_FOREIGNKEY.do_
b790: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e  test fkey2-17.1.
b7a0: 31 34 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  14 {.  sqlite3_f
b7b0: 69 6e 61 6c 69 7a 65 20 24 53 54 4d 54 0a 7d 20  inalize $STMT.} 
b7c0: 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  {SQLITE_CONSTRAI
b7d0: 4e 54 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72  NT}.verify_ex_er
b7e0: 72 63 6f 64 65 20 66 6b 65 79 32 2d 31 37 2e 31  rcode fkey2-17.1
b7f0: 2e 31 34 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53  .14b SQLITE_CONS
b800: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
b810: 59 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  Y..drop_all_tabl
b820: 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  es.do_test fkey2
b830: 2d 31 37 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  -17.2.1 {.  exec
b840: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
b850: 20 54 41 42 4c 45 20 68 69 67 68 28 22 61 27 62   TABLE high("a'b
b860: 21 22 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  !" PRIMARY KEY, 
b870: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
b880: 41 42 4c 45 20 6c 6f 77 28 0a 20 20 20 20 20 20  ABLE low(.      
b890: 63 2c 20 0a 20 20 20 20 20 20 22 64 26 36 22 20  c, .      "d&6" 
b8a0: 52 45 46 45 52 45 4e 43 45 53 20 68 69 67 68 20  REFERENCES high 
b8b0: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
b8c0: 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  E ON DELETE CASC
b8d0: 41 44 45 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  ADE.    );.  }.}
b8e0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
b8f0: 32 2d 31 37 2e 32 2e 32 20 7b 0a 20 20 65 78 65  2-17.2.2 {.  exe
b900: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
b910: 54 20 49 4e 54 4f 20 68 69 67 68 20 56 41 4c 55  T INTO high VALU
b920: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
b930: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
b940: 77 20 56 41 4c 55 45 53 28 27 62 27 2c 20 27 61  w VALUES('b', 'a
b950: 27 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61  ');.  }.  db cha
b960: 6e 67 65 73 0a 7d 20 7b 31 7d 0a 73 65 74 20 6e  nges.} {1}.set n
b970: 54 6f 74 61 6c 20 5b 64 62 20 74 6f 74 61 6c 5f  Total [db total_
b980: 63 68 61 6e 67 65 73 5d 0a 64 6f 5f 74 65 73 74  changes].do_test
b990: 20 66 6b 65 79 32 2d 31 37 2e 32 2e 33 20 7b 0a   fkey2-17.2.3 {.
b9a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
b9b0: 54 45 20 68 69 67 68 20 53 45 54 20 22 61 27 62  TE high SET "a'b
b9c0: 21 22 20 3d 20 27 63 27 20 7d 0a 7d 20 7b 31 7d  !" = 'c' }.} {1}
b9d0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
b9e0: 37 2e 32 2e 34 20 7b 0a 20 20 64 62 20 63 68 61  7.2.4 {.  db cha
b9f0: 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  nges.} {1}.do_te
ba00: 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 35 20  st fkey2-17.2.5 
ba10: 7b 0a 20 20 65 78 70 72 20 5b 64 62 20 74 6f 74  {.  expr [db tot
ba20: 61 6c 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 6e  al_changes] - $n
ba30: 54 6f 74 61 6c 0a 7d 20 7b 32 7d 0a 64 6f 5f 74  Total.} {2}.do_t
ba40: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 36  est fkey2-17.2.6
ba50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
ba60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 68 69 67  ELECT * FROM hig
ba70: 68 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  h ; SELECT * FRO
ba80: 4d 20 6c 6f 77 20 7d 0a 7d 20 7b 63 20 62 20 62  M low }.} {c b b
ba90: 20 63 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   c}.do_test fkey
baa0: 32 2d 31 37 2e 32 2e 37 20 7b 0a 20 20 65 78 65  2-17.2.7 {.  exe
bab0: 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  csql { DELETE FR
bac0: 4f 4d 20 68 69 67 68 20 7d 0a 7d 20 7b 31 7d 0a  OM high }.} {1}.
bad0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
bae0: 2e 32 2e 38 20 7b 0a 20 20 64 62 20 63 68 61 6e  .2.8 {.  db chan
baf0: 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ges.} {1}.do_tes
bb00: 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 39 20 7b  t fkey2-17.2.9 {
bb10: 0a 20 20 65 78 70 72 20 5b 64 62 20 74 6f 74 61  .  expr [db tota
bb20: 6c 5f 63 68 61 6e 67 65 73 5d 20 2d 20 24 6e 54  l_changes] - $nT
bb30: 6f 74 61 6c 0a 7d 20 7b 34 7d 0a 64 6f 5f 74 65  otal.} {4}.do_te
bb40: 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 31 30  st fkey2-17.2.10
bb50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
bb60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 68 69 67  ELECT * FROM hig
bb70: 68 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  h ; SELECT * FRO
bb80: 4d 20 6c 6f 77 20 7d 0a 7d 20 7b 7d 0a 65 78 65  M low }.} {}.exe
bb90: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 6f  csql { PRAGMA co
bba0: 75 6e 74 5f 63 68 61 6e 67 65 73 20 3d 20 30 20  unt_changes = 0 
bbb0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
bbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
bc00: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 61 75  Test that the au
bc10: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
bc20: 62 61 63 6b 20 77 6f 72 6b 73 2e 0a 23 0a 0a 69  back works..#..i
bc30: 66 63 61 70 61 62 6c 65 20 61 75 74 68 20 7b 0a  fcapable auth {.
bc40: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
bc50: 31 38 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  18.1 {.    execs
bc60: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
bc70: 45 20 54 41 42 4c 45 20 6c 6f 6e 67 28 61 2c 20  E TABLE long(a, 
bc80: 62 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  b PRIMARY KEY, c
bc90: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
bca0: 54 41 42 4c 45 20 73 68 6f 72 74 28 64 2c 20 65  TABLE short(d, e
bcb0: 2c 20 66 20 52 45 46 45 52 45 4e 43 45 53 20 6c  , f REFERENCES l
bcc0: 6f 6e 67 29 3b 0a 20 20 20 20 20 20 43 52 45 41  ong);.      CREA
bcd0: 54 45 20 54 41 42 4c 45 20 6d 69 64 28 67 2c 20  TE TABLE mid(g, 
bce0: 68 2c 20 69 20 52 45 46 45 52 45 4e 43 45 53 20  h, i REFERENCES 
bcf0: 6c 6f 6e 67 20 44 45 46 45 52 52 41 42 4c 45 20  long DEFERRABLE 
bd00: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
bd10: 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ED);.    }.  } {
bd20: 7d 0a 0a 20 20 70 72 6f 63 20 61 75 74 68 20 7b  }..  proc auth {
bd30: 61 72 67 73 7d 20 7b 65 76 61 6c 20 6c 61 70 70  args} {eval lapp
bd40: 65 6e 64 20 3a 3a 61 75 74 68 61 72 67 73 20 24  end ::authargs $
bd50: 61 72 67 73 20 3b 20 72 65 74 75 72 6e 20 53 51  args ; return SQ
bd60: 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 62 20 61 75  LITE_OK}.  db au
bd70: 74 68 20 61 75 74 68 0a 0a 20 20 23 20 41 6e 20  th auth..  # An 
bd80: 69 6e 73 65 72 74 20 6f 6e 20 74 68 65 20 70 61  insert on the pa
bd90: 72 65 6e 74 20 74 61 62 6c 65 20 6d 75 73 74 20  rent table must 
bda0: 72 65 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b  read the child k
bdb0: 65 79 20 6f 66 20 61 6e 79 20 64 65 66 65 72 72  ey of any deferr
bdc0: 65 64 0a 20 20 23 20 66 6f 72 65 69 67 6e 20 6b  ed.  # foreign k
bdd0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ey constraints. 
bde0: 42 75 74 20 6e 6f 74 20 74 68 65 20 63 68 69 6c  But not the chil
bdf0: 64 20 6b 65 79 20 6f 66 20 69 6d 6d 65 64 69 61  d key of immedia
be00: 74 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  te constraints..
be10: 20 20 73 65 74 20 61 75 74 68 61 72 67 73 20 7b    set authargs {
be20: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
be30: 32 2d 31 38 2e 32 20 7b 0a 20 20 20 20 65 78 65  2-18.2 {.    exe
be40: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
be50: 54 4f 20 6c 6f 6e 67 20 56 41 4c 55 45 53 28 31  TO long VALUES(1
be60: 2c 20 32 2c 20 33 29 20 7d 0a 20 20 20 20 73 65  , 2, 3) }.    se
be70: 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d 20 7b  t authargs.  } {
be80: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 6c 6f  SQLITE_INSERT lo
be90: 6e 67 20 7b 7d 20 6d 61 69 6e 20 7b 7d 20 53 51  ng {} main {} SQ
bea0: 4c 49 54 45 5f 52 45 41 44 20 6d 69 64 20 69 20  LITE_READ mid i 
beb0: 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20 23 20 41 6e  main {}}..  # An
bec0: 20 69 6e 73 65 72 74 20 6f 6e 20 74 68 65 20 63   insert on the c
bed0: 68 69 6c 64 20 74 61 62 6c 65 20 6f 66 20 61 6e  hild table of an
bee0: 20 69 6d 6d 65 64 69 61 74 65 20 63 6f 6e 73 74   immediate const
bef0: 72 61 69 6e 74 20 6d 75 73 74 20 72 65 61 64 20  raint must read 
bf00: 74 68 65 0a 20 20 23 20 70 61 72 65 6e 74 20 6b  the.  # parent k
bf10: 65 79 20 63 6f 6c 75 6d 6e 73 20 28 74 6f 20 73  ey columns (to s
bf20: 65 65 20 69 66 20 69 74 20 69 73 20 61 20 76 69  ee if it is a vi
bf30: 6f 6c 61 74 69 6f 6e 20 6f 72 20 6e 6f 74 29 2e  olation or not).
bf40: 0a 20 20 73 65 74 20 61 75 74 68 61 72 67 73 20  .  set authargs 
bf50: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  {}.  do_test fke
bf60: 79 32 2d 31 38 2e 33 20 7b 0a 20 20 20 20 65 78  y2-18.3 {.    ex
bf70: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
bf80: 4e 54 4f 20 73 68 6f 72 74 20 56 41 4c 55 45 53  NTO short VALUES
bf90: 28 31 2c 20 33 2c 20 32 29 20 7d 0a 20 20 20 20  (1, 3, 2) }.    
bfa0: 73 65 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d  set authargs.  }
bfb0: 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20   {SQLITE_INSERT 
bfc0: 73 68 6f 72 74 20 7b 7d 20 6d 61 69 6e 20 7b 7d  short {} main {}
bfd0: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6c 6f 6e   SQLITE_READ lon
bfe0: 67 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a 20 20 0a  g b main {}}.  .
bff0: 20 20 23 20 41 73 20 6d 75 73 74 20 61 6e 20 69    # As must an i
c000: 6e 73 65 72 74 20 6f 6e 20 74 68 65 20 63 68 69  nsert on the chi
c010: 6c 64 20 74 61 62 6c 65 20 6f 66 20 61 20 64 65  ld table of a de
c020: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
c030: 74 2e 0a 20 20 73 65 74 20 61 75 74 68 61 72 67  t..  set autharg
c040: 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  s {}.  do_test f
c050: 6b 65 79 32 2d 31 38 2e 34 20 7b 0a 20 20 20 20  key2-18.4 {.    
c060: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
c070: 20 49 4e 54 4f 20 6d 69 64 20 56 41 4c 55 45 53   INTO mid VALUES
c080: 28 31 2c 20 33 2c 20 32 29 20 7d 0a 20 20 20 20  (1, 3, 2) }.    
c090: 73 65 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d  set authargs.  }
c0a0: 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20   {SQLITE_INSERT 
c0b0: 6d 69 64 20 7b 7d 20 6d 61 69 6e 20 7b 7d 20 53  mid {} main {} S
c0c0: 51 4c 49 54 45 5f 52 45 41 44 20 6c 6f 6e 67 20  QLITE_READ long 
c0d0: 62 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20 64 6f  b main {}}..  do
c0e0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 35  _test fkey2-18.5
c0f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c100: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
c110: 42 4c 45 20 6e 6f 75 67 68 74 28 61 2c 20 62 20  BLE nought(a, b 
c120: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 29 3b  PRIMARY KEY, c);
c130: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
c140: 42 4c 45 20 63 72 6f 73 73 28 64 2c 20 65 2c 20  BLE cross(d, e, 
c150: 66 2c 0a 20 20 20 20 20 20 20 20 46 4f 52 45 49  f,.        FOREI
c160: 47 4e 20 4b 45 59 28 65 29 20 52 45 46 45 52 45  GN KEY(e) REFERE
c170: 4e 43 45 53 20 6e 6f 75 67 68 74 28 62 29 20 4f  NCES nought(b) O
c180: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
c190: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
c1a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
c1b0: 53 45 52 54 20 49 4e 54 4f 20 6e 6f 75 67 68 74  SERT INTO nought
c1c0: 20 56 41 4c 55 45 53 28 32 2c 20 31 2c 20 32 29   VALUES(2, 1, 2)
c1d0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
c1e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 72 6f   INSERT INTO cro
c1f0: 73 73 20 56 41 4c 55 45 53 28 30 2c 20 31 2c 20  ss VALUES(0, 1, 
c200: 30 29 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74  0) }.    set aut
c210: 68 61 72 67 73 20 5b 6c 69 73 74 5d 0a 20 20 20  hargs [list].   
c220: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
c230: 45 20 6e 6f 75 67 68 74 20 53 45 54 20 62 20 3d  E nought SET b =
c240: 20 35 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74   5 }.    set aut
c250: 68 61 72 67 73 0a 20 20 7d 20 7b 53 51 4c 49 54  hargs.  } {SQLIT
c260: 45 5f 55 50 44 41 54 45 20 6e 6f 75 67 68 74 20  E_UPDATE nought 
c270: 62 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45  b main {} SQLITE
c280: 5f 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d 61  _READ cross e ma
c290: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
c2a0: 44 20 63 72 6f 73 73 20 65 20 6d 61 69 6e 20 7b  D cross e main {
c2b0: 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f  } SQLITE_READ no
c2c0: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53  ught b main {} S
c2d0: 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f 75 67 68  QLITE_READ nough
c2e0: 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49  t b main {} SQLI
c2f0: 54 45 5f 52 45 41 44 20 6e 6f 75 67 68 74 20 62  TE_READ nought b
c300: 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f   main {} SQLITE_
c310: 55 50 44 41 54 45 20 63 72 6f 73 73 20 65 20 6d  UPDATE cross e m
c320: 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45  ain {} SQLITE_RE
c330: 41 44 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e  AD nought b main
c340: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
c350: 63 72 6f 73 73 20 65 20 6d 61 69 6e 20 7b 7d 20  cross e main {} 
c360: 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f 75 67  SQLITE_READ noug
c370: 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53 51 4c  ht b main {} SQL
c380: 49 54 45 5f 52 45 41 44 20 6e 6f 75 67 68 74 20  ITE_READ nought 
c390: 62 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20 64 6f  b main {}}..  do
c3a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 36  _test fkey2-18.6
c3b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c3c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 72  SELECT * FROM cr
c3d0: 6f 73 73 7d 0a 20 20 7d 20 7b 30 20 35 20 30 7d  oss}.  } {0 5 0}
c3e0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  ..  do_test fkey
c3f0: 32 2d 31 38 2e 37 20 7b 0a 20 20 20 20 65 78 65  2-18.7 {.    exe
c400: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
c410: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 20  ATE TABLE one(a 
c420: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c430: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43  KEY, b);.      C
c440: 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 28  REATE TABLE two(
c450: 62 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  b, c REFERENCES 
c460: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  one);.      INSE
c470: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
c480: 45 53 28 31 30 31 2c 20 31 30 32 29 3b 0a 20 20  ES(101, 102);.  
c490: 20 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74 68    }.    set auth
c4a0: 61 72 67 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20  args [list].    
c4b0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
c4c0: 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53   INTO two VALUES
c4d0: 28 31 30 30 2c 20 31 30 31 29 3b 20 7d 0a 20 20  (100, 101); }.  
c4e0: 20 20 73 65 74 20 61 75 74 68 61 72 67 73 0a 20    set authargs. 
c4f0: 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45 52   } {SQLITE_INSER
c500: 54 20 74 77 6f 20 7b 7d 20 6d 61 69 6e 20 7b 7d  T two {} main {}
c510: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6f 6e 65   SQLITE_READ one
c520: 20 61 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20 20 23   a main {}}..  #
c530: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   Return SQLITE_I
c540: 47 4e 4f 52 45 20 74 6f 20 72 65 71 75 65 73 74  GNORE to request
c550: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74  s to read from t
c560: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
c570: 20 54 68 69 73 0a 20 20 23 20 63 61 75 73 65 73   This.  # causes
c580: 20 69 6e 73 65 72 74 73 20 6f 66 20 6e 6f 6e 2d   inserts of non-
c590: 4e 55 4c 4c 20 6b 65 79 73 20 69 6e 74 6f 20 74  NULL keys into t
c5a0: 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 74  he child table t
c5b0: 6f 20 66 61 69 6c 2e 0a 20 20 23 0a 20 20 72 65  o fail..  #.  re
c5c0: 6e 61 6d 65 20 61 75 74 68 20 7b 7d 0a 20 20 70  name auth {}.  p
c5d0: 72 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d 20  roc auth {args} 
c5e0: 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65  {.    if {[linde
c5f0: 78 20 24 61 72 67 73 20 31 5d 20 3d 3d 20 22 6c  x $args 1] == "l
c600: 6f 6e 67 22 7d 20 7b 72 65 74 75 72 6e 20 53 51  ong"} {return SQ
c610: 4c 49 54 45 5f 49 47 4e 4f 52 45 7d 0a 20 20 20  LITE_IGNORE}.   
c620: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c630: 4b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  K.  }.  do_test 
c640: 66 6b 65 79 32 2d 31 38 2e 38 20 7b 0a 20 20 20  fkey2-18.8 {.   
c650: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
c660: 52 54 20 49 4e 54 4f 20 73 68 6f 72 74 20 56 41  RT INTO short VA
c670: 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d 0a  LUES(1, 3, 2) }.
c680: 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20    } {1 {foreign 
c690: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
c6a0: 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ailed}}.  do_tes
c6b0: 74 20 66 6b 65 79 32 2d 31 38 2e 39 20 7b 0a 20  t fkey2-18.9 {. 
c6c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
c6d0: 45 52 54 20 49 4e 54 4f 20 73 68 6f 72 74 20 56  ERT INTO short V
c6e0: 41 4c 55 45 53 28 31 2c 20 33 2c 20 4e 55 4c 4c  ALUES(1, 3, NULL
c6f0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
c700: 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 31 30  test fkey2-18.10
c710: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
c720: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
c730: 68 6f 72 74 20 7d 0a 20 20 7d 20 7b 31 20 33 20  hort }.  } {1 3 
c740: 32 20 31 20 33 20 7b 7d 7d 0a 20 20 64 6f 5f 74  2 1 3 {}}.  do_t
c750: 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 31 31 20  est fkey2-18.11 
c760: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
c770: 20 55 50 44 41 54 45 20 73 68 6f 72 74 20 53 45   UPDATE short SE
c780: 54 20 66 20 3d 20 32 20 57 48 45 52 45 20 66 20  T f = 2 WHERE f 
c790: 49 53 20 4e 55 4c 4c 20 7d 0a 20 20 7d 20 7b 31  IS NULL }.  } {1
c7a0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
c7b0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
c7c0: 7d 0a 0a 20 20 64 62 20 61 75 74 68 20 7b 7d 0a  }..  db auth {}.
c7d0: 20 20 75 6e 73 65 74 20 61 75 74 68 61 72 67 73    unset authargs
c7e0: 0a 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65  .}...do_test fke
c7f0: 79 32 2d 31 39 2e 31 20 7b 0a 20 20 65 78 65 63  y2-19.1 {.  exec
c800: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
c810: 20 54 41 42 4c 45 20 6d 61 69 6e 28 69 64 20 49   TABLE main(id I
c820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
c830: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
c840: 54 41 42 4c 45 20 73 75 62 28 69 64 20 49 4e 54  TABLE sub(id INT
c850: 20 52 45 46 45 52 45 4e 43 45 53 20 6d 61 69 6e   REFERENCES main
c860: 28 69 64 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  (id));.    INSER
c870: 54 20 49 4e 54 4f 20 6d 61 69 6e 20 56 41 4c 55  T INTO main VALU
c880: 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(1);.    INSER
c890: 54 20 49 4e 54 4f 20 6d 61 69 6e 20 56 41 4c 55  T INTO main VALU
c8a0: 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(2);.    INSER
c8b0: 54 20 49 4e 54 4f 20 73 75 62 20 56 41 4c 55 45  T INTO sub VALUE
c8c0: 53 28 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  S(2);.  }.} {}.d
c8d0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 39 2e  o_test fkey2-19.
c8e0: 32 20 7b 0a 20 20 73 65 74 20 53 20 5b 73 71 6c  2 {.  set S [sql
c8f0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
c900: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
c910: 6d 61 69 6e 20 57 48 45 52 45 20 69 64 20 3d 20  main WHERE id = 
c920: 3f 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73  ?" -1 dummy].  s
c930: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
c940: 24 53 20 31 20 32 0a 20 20 73 71 6c 69 74 65 33  $S 1 2.  sqlite3
c950: 5f 73 74 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49  _step $S.} {SQLI
c960: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76  TE_CONSTRAINT}.v
c970: 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65  erify_ex_errcode
c980: 20 66 6b 65 79 32 2d 31 39 2e 32 62 20 53 51 4c   fkey2-19.2b SQL
c990: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
c9a0: 4f 52 45 49 47 4e 4b 45 59 0a 64 6f 5f 74 65 73  OREIGNKEY.do_tes
c9b0: 74 20 66 6b 65 79 32 2d 31 39 2e 33 20 7b 0a 20  t fkey2-19.3 {. 
c9c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24   sqlite3_reset $
c9d0: 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53  S.} {SQLITE_CONS
c9e0: 54 52 41 49 4e 54 7d 0a 76 65 72 69 66 79 5f 65  TRAINT}.verify_e
c9f0: 78 5f 65 72 72 63 6f 64 65 20 66 6b 65 79 32 2d  x_errcode fkey2-
ca00: 31 39 2e 33 62 20 53 51 4c 49 54 45 5f 43 4f 4e  19.3b SQLITE_CON
ca10: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
ca20: 45 59 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  EY.do_test fkey2
ca30: 2d 31 39 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  -19.4 {.  sqlite
ca40: 33 5f 62 69 6e 64 5f 69 6e 74 20 24 53 20 31 20  3_bind_int $S 1 
ca50: 31 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  1.  sqlite3_step
ca60: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f   $S.} {SQLITE_DO
ca70: 4e 45 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  NE}.do_test fkey
ca80: 32 2d 31 39 2e 34 20 7b 0a 20 20 73 71 6c 69 74  2-19.4 {.  sqlit
ca90: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 0a 7d  e3_finalize $S.}
caa0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 72   {SQLITE_OK}..dr
cab0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
cac0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 31  _test fkey2-20.1
cad0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
cae0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
caf0: 70 70 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  pp(a PRIMARY KEY
cb00: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
cb10: 20 54 41 42 4c 45 20 63 63 28 63 20 50 52 49 4d   TABLE cc(c PRIM
cb20: 41 52 59 20 4b 45 59 2c 20 64 20 52 45 46 45 52  ARY KEY, d REFER
cb30: 45 4e 43 45 53 20 70 70 29 3b 0a 20 20 7d 0a 7d  ENCES pp);.  }.}
cb40: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
cb50: 20 69 6e 73 65 72 74 7d 20 7b 0a 20 20 31 20 22   insert} {.  1 "
cb60: 49 4e 53 45 52 54 22 0a 20 20 32 20 22 49 4e 53  INSERT".  2 "INS
cb70: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 22 0a 20  ERT OR IGNORE". 
cb80: 20 33 20 22 49 4e 53 45 52 54 20 4f 52 20 41 42   3 "INSERT OR AB
cb90: 4f 52 54 22 0a 20 20 34 20 22 49 4e 53 45 52 54  ORT".  4 "INSERT
cba0: 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 22 0a 20 20   OR ROLLBACK".  
cbb0: 35 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50  5 "INSERT OR REP
cbc0: 4c 41 43 45 22 0a 20 20 36 20 22 49 4e 53 45 52  LACE".  6 "INSER
cbd0: 54 20 4f 52 20 46 41 49 4c 22 0a 7d 20 7b 0a 20  T OR FAIL".} {. 
cbe0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32   do_test fkey2-2
cbf0: 30 2e 32 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  0.2.$tn.1 {.    
cc00: 63 61 74 63 68 73 71 6c 20 22 24 69 6e 73 65 72  catchsql "$inser
cc10: 74 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53  t INTO cc VALUES
cc20: 28 31 2c 20 32 29 22 0a 20 20 7d 20 7b 31 20 7b  (1, 2)".  } {1 {
cc30: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
cc40: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
cc50: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
cc60: 32 30 2e 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  20.2.$tn.2 {.   
cc70: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
cc80: 54 20 2a 20 46 52 4f 4d 20 63 63 20 7d 0a 20 20  T * FROM cc }.  
cc90: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  } {}.  do_test f
cca0: 6b 65 79 32 2d 32 30 2e 32 2e 24 74 6e 2e 33 20  key2-20.2.$tn.3 
ccb0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
ccc0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
ccd0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
cce0: 20 70 70 20 56 41 4c 55 45 53 28 32 2c 20 27 74   pp VALUES(2, 't
ccf0: 77 6f 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  wo');.        IN
cd00: 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c  SERT INTO cc VAL
cd10: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(1, 2);.    }
cd20: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 24  .    catchsql "$
cd30: 69 6e 73 65 72 74 20 49 4e 54 4f 20 63 63 20 56  insert INTO cc V
cd40: 41 4c 55 45 53 28 33 2c 20 34 29 22 0a 20 20 7d  ALUES(3, 4)".  }
cd50: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
cd60: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
cd70: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ed}}.  do_test f
cd80: 6b 65 79 32 2d 32 30 2e 32 2e 24 74 6e 2e 34 20  key2-20.2.$tn.4 
cd90: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
cda0: 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20  COMMIT ; SELECT 
cdb0: 2a 20 46 52 4f 4d 20 63 63 20 7d 0a 20 20 7d 20  * FROM cc }.  } 
cdc0: 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20  {1 2}.  do_test 
cdd0: 66 6b 65 79 32 2d 32 30 2e 32 2e 24 74 6e 2e 35  fkey2-20.2.$tn.5
cde0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
cdf0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20   DELETE FROM cc 
ce00: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 70  ; DELETE FROM pp
ce10: 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 66 6f 72   }.  } {}.}..for
ce20: 65 61 63 68 20 7b 74 6e 20 75 70 64 61 74 65 7d  each {tn update}
ce30: 20 7b 0a 20 20 31 20 22 55 50 44 41 54 45 22 0a   {.  1 "UPDATE".
ce40: 20 20 32 20 22 55 50 44 41 54 45 20 4f 52 20 49    2 "UPDATE OR I
ce50: 47 4e 4f 52 45 22 0a 20 20 33 20 22 55 50 44 41  GNORE".  3 "UPDA
ce60: 54 45 20 4f 52 20 41 42 4f 52 54 22 0a 20 20 34  TE OR ABORT".  4
ce70: 20 22 55 50 44 41 54 45 20 4f 52 20 52 4f 4c 4c   "UPDATE OR ROLL
ce80: 42 41 43 4b 22 0a 20 20 35 20 22 55 50 44 41 54  BACK".  5 "UPDAT
ce90: 45 20 4f 52 20 52 45 50 4c 41 43 45 22 0a 20 20  E OR REPLACE".  
cea0: 36 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49  6 "UPDATE OR FAI
ceb0: 4c 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  L".} {.  do_test
cec0: 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24 74 6e 2e   fkey2-20.3.$tn.
ced0: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
cee0: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
cef0: 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28 32 2c  NTO pp VALUES(2,
cf00: 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 20 20 49   'two');.      I
cf10: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
cf20: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
cf30: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
cf40: 73 74 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24 74  st fkey2-20.3.$t
cf50: 6e 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.2 {.    catchs
cf60: 71 6c 20 22 24 75 70 64 61 74 65 20 70 70 20 53  ql "$update pp S
cf70: 45 54 20 61 20 3d 20 31 22 0a 20 20 7d 20 7b 31  ET a = 1".  } {1
cf80: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
cf90: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
cfa0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
cfb0: 32 2d 32 30 2e 33 2e 24 74 6e 2e 33 20 7b 0a 20  2-20.3.$tn.3 {. 
cfc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
cfd0: 45 43 54 20 2a 20 46 52 4f 4d 20 70 70 20 7d 0a  ECT * FROM pp }.
cfe0: 20 20 7d 20 7b 32 20 74 77 6f 7d 0a 20 20 64 6f    } {2 two}.  do
cff0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 33  _test fkey2-20.3
d000: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 63 61 74  .$tn.4 {.    cat
d010: 63 68 73 71 6c 20 22 24 75 70 64 61 74 65 20 63  chsql "$update c
d020: 63 20 53 45 54 20 64 20 3d 20 31 22 0a 20 20 7d  c SET d = 1".  }
d030: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
d040: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
d050: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ed}}.  do_test f
d060: 6b 65 79 32 2d 32 30 2e 33 2e 24 74 6e 2e 35 20  key2-20.3.$tn.5 
d070: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
d080: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63  SELECT * FROM cc
d090: 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64   }.  } {1 2}.  d
d0a0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30 2e  o_test fkey2-20.
d0b0: 33 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 65 78  3.$tn.6 {.    ex
d0c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
d0d0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN;.        INS
d0e0: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
d0f0: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
d100: 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73      }.    catchs
d110: 71 6c 20 22 24 75 70 64 61 74 65 20 70 70 20 53  ql "$update pp S
d120: 45 54 20 61 20 3d 20 31 20 57 48 45 52 45 20 61  ET a = 1 WHERE a
d130: 20 3d 20 32 22 0a 20 20 7d 20 7b 31 20 7b 66 6f   = 2".  } {1 {fo
d140: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
d150: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20  aint failed}}.  
d160: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30  do_test fkey2-20
d170: 2e 33 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 65  .3.$tn.7 {.    e
d180: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
d190: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
d1a0: 70 70 20 7d 0a 20 20 7d 20 7b 32 20 74 77 6f 20  pp }.  } {2 two 
d1b0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
d1c0: 73 74 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24 74  st fkey2-20.3.$t
d1d0: 6e 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.8 {.    execsq
d1e0: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
d1f0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
d200: 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 32  INTO cc VALUES(2
d210: 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 2);.    }.    
d220: 63 61 74 63 68 73 71 6c 20 22 24 75 70 64 61 74  catchsql "$updat
d230: 65 20 63 63 20 53 45 54 20 64 20 3d 20 31 20 57  e cc SET d = 1 W
d240: 48 45 52 45 20 63 20 3d 20 31 22 0a 20 20 7d 20  HERE c = 1".  } 
d250: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
d260: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d270: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  d}}.  do_test fk
d280: 65 79 32 2d 32 30 2e 33 2e 24 74 6e 2e 39 20 7b  ey2-20.3.$tn.9 {
d290: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43  .    execsql { C
d2a0: 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20 2a  OMMIT ; SELECT *
d2b0: 20 46 52 4f 4d 20 63 63 20 7d 0a 20 20 7d 20 7b   FROM cc }.  } {
d2c0: 31 20 32 20 32 20 32 7d 0a 20 20 64 6f 5f 74 65  1 2 2 2}.  do_te
d2d0: 73 74 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24 74  st fkey2-20.3.$t
d2e0: 6e 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73  n.10 {.    execs
d2f0: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
d300: 20 63 63 20 3b 20 44 45 4c 45 54 45 20 46 52 4f   cc ; DELETE FRO
d310: 4d 20 70 70 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a  M pp }.  } {}.}.
d320: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
d330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
d370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
d380: 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 68 6f 73  k of tests, thos
d390: 65 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  e prefixed with 
d3a0: 22 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 22  "fkey2-genfkey."
d3b0: 2c 20 61 72 65 20 0a 23 20 74 68 65 20 73 61 6d  , are .# the sam
d3c0: 65 20 74 65 73 74 73 20 74 68 61 74 20 77 65 72  e tests that wer
d3d0: 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  e used to test t
d3e0: 68 65 20 22 2e 67 65 6e 66 6b 65 79 22 20 63 6f  he ".genfkey" co
d3f0: 6d 6d 61 6e 64 20 70 72 6f 76 69 64 65 64 20 0a  mmand provided .
d400: 23 20 62 79 20 74 68 65 20 73 68 65 6c 6c 20 74  # by the shell t
d410: 6f 6f 6c 2e 20 53 6f 20 74 68 65 73 65 20 74 65  ool. So these te
d420: 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
d430: 65 20 62 75 69 6c 74 2d 69 6e 20 66 6f 72 65 69  e built-in forei
d440: 67 6e 20 6b 65 79 20 0a 23 20 69 6d 70 6c 65 6d  gn key .# implem
d450: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  entation is more
d460: 20 6f 72 20 6c 65 73 73 20 63 6f 6d 70 61 74 69   or less compati
d470: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 72 69  ble with the tri
d480: 67 67 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  ggers generated 
d490: 0a 23 20 62 79 20 67 65 6e 66 6b 65 79 2e 0a 23  .# by genfkey..#
d4a0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
d4b0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
d4c0: 65 6e 66 6b 65 79 2e 31 2e 31 20 7b 0a 20 20 65  enfkey.1.1 {.  e
d4d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
d4e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
d4f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d500: 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45  EY, b, c, UNIQUE
d510: 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 43 52 45  (b, c));.    CRE
d520: 41 54 45 20 54 41 42 4c 45 20 74 32 28 65 20 52  ATE TABLE t2(e R
d530: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 66 29  EFERENCES t1, f)
d540: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
d550: 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 46  LE t3(g, h, i, F
d560: 4f 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69  OREIGN KEY (h, i
d570: 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  ) REFERENCES t1(
d580: 62 2c 20 63 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  b, c));.  }.} {}
d590: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
d5a0: 65 6e 66 6b 65 79 2e 31 2e 32 20 7b 0a 20 20 63  enfkey.1.2 {.  c
d5b0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
d5c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
d5d0: 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  1, 2) }.} {1 {fo
d5e0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
d5f0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
d600: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
d610: 6b 65 79 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  key.1.3 {.  exec
d620: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
d630: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d640: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
d650: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
d660: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d  UES(1, 2);.  }.}
d670: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
d680: 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 34 20 7b 0a  2-genfkey.1.4 {.
d690: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
d6a0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
d6b0: 53 28 4e 55 4c 4c 2c 20 33 29 20 7d 0a 7d 20 7b  S(NULL, 3) }.} {
d6c0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
d6d0: 67 65 6e 66 6b 65 79 2e 31 2e 35 20 7b 0a 20 20  genfkey.1.5 {.  
d6e0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
d6f0: 45 20 74 32 20 53 45 54 20 65 20 3d 20 35 20 57  E t2 SET e = 5 W
d700: 48 45 52 45 20 65 20 49 53 20 4e 55 4c 4c 20 7d  HERE e IS NULL }
d710: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
d720: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
d730: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
d740: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 36  key2-genfkey.1.6
d750: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
d760: 50 44 41 54 45 20 74 32 20 53 45 54 20 65 20 3d  PDATE t2 SET e =
d770: 20 31 20 57 48 45 52 45 20 65 20 49 53 20 4e 55   1 WHERE e IS NU
d780: 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  LL }.} {}.do_tes
d790: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
d7a0: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
d7b0: 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  { UPDATE t2 SET 
d7c0: 65 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 66  e = NULL WHERE f
d7d0: 20 3d 20 33 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   = 3 }.} {}.do_t
d7e0: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
d7f0: 79 2e 31 2e 38 20 7b 0a 20 20 63 61 74 63 68 73  y.1.8 {.  catchs
d800: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  ql { UPDATE t1 S
d810: 45 54 20 61 20 3d 20 31 30 20 7d 0a 7d 20 7b 31  ET a = 10 }.} {1
d820: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
d830: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
d840: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
d850: 67 65 6e 66 6b 65 79 2e 31 2e 39 20 7b 0a 20 20  genfkey.1.9 {.  
d860: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
d870: 45 20 74 31 20 53 45 54 20 61 20 3d 20 4e 55 4c  E t1 SET a = NUL
d880: 4c 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79  L }.} {1 {dataty
d890: 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f  pe mismatch}}.do
d8a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
d8b0: 6b 65 79 2e 31 2e 31 30 20 7b 0a 20 20 63 61 74  key.1.10 {.  cat
d8c0: 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
d8d0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66  ROM t1 }.} {1 {f
d8e0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
d8f0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
d900: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
d910: 66 6b 65 79 2e 31 2e 31 31 20 7b 0a 20 20 65 78  fkey.1.11 {.  ex
d920: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  ecsql { UPDATE t
d930: 32 20 53 45 54 20 65 20 3d 20 4e 55 4c 4c 20 7d  2 SET e = NULL }
d940: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
d950: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 32  ey2-genfkey.1.12
d960: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
d970: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
d980: 54 20 61 20 3d 20 31 30 3b 0a 20 20 20 20 44 45  T a = 10;.    DE
d990: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
d9a0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
d9b0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
d9c0: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
d9d0: 2e 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  .1.13 {.  execsq
d9e0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
d9f0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
da00: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
da10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
da20: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 4e 55   VALUES(1, 2, NU
da30: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
da40: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
da50: 2c 20 4e 55 4c 4c 2c 20 33 29 3b 0a 20 20 7d 0a  , NULL, 3);.  }.
da60: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
da70: 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 34 20  y2-genfkey.1.14 
da80: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
da90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
daa0: 4c 55 45 53 28 33 2c 20 31 2c 20 34 29 20 7d 0a  LUES(3, 1, 4) }.
dab0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
dac0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
dad0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
dae0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 35  ey2-genfkey.1.15
daf0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
db00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
db10: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20  t1 VALUES(1, 1, 
db20: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
db30: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
db40: 20 31 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d   1, 4);.  }.} {}
db50: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
db60: 65 6e 66 6b 65 79 2e 31 2e 31 36 20 7b 0a 20 20  enfkey.1.16 {.  
db70: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
db80: 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  E FROM t1 }.} {1
db90: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
dba0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
dbb0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
dbc0: 67 65 6e 66 6b 65 79 2e 31 2e 31 37 20 7b 0a 20  genfkey.1.17 {. 
dbd0: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
dbe0: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 31 30  TE t1 SET b = 10
dbf0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
dc00: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
dc10: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
dc20: 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e  fkey2-genfkey.1.
dc30: 31 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  18 {.  execsql {
dc40: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
dc50: 20 3d 20 31 30 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   = 10}.} {}.do_t
dc60: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
dc70: 79 2e 31 2e 31 39 20 7b 0a 20 20 63 61 74 63 68  y.1.19 {.  catch
dc80: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 33 20  sql { UPDATE t3 
dc90: 53 45 54 20 68 20 3d 20 27 68 65 6c 6c 6f 27 20  SET h = 'hello' 
dca0: 57 48 45 52 45 20 69 20 3d 20 33 7d 0a 7d 20 7b  WHERE i = 3}.} {
dcb0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
dcc0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
dcd0: 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  }}..drop_all_tab
dce0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  les.do_test fkey
dcf0: 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 31 20 7b 0a  2-genfkey.2.1 {.
dd00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
dd10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
dd20: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
dd30: 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49  Y KEY, b, c, UNI
dd40: 51 55 45 28 62 2c 20 63 29 29 3b 0a 20 20 20 20  QUE(b, c));.    
dd50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
dd60: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
dd70: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
dd80: 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  E ON DELETE CASC
dd90: 41 44 45 2c 20 66 29 3b 0a 20 20 20 20 43 52 45  ADE, f);.    CRE
dda0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20  ATE TABLE t3(g, 
ddb0: 68 2c 20 69 2c 20 0a 20 20 20 20 20 20 20 20 46  h, i, .        F
ddc0: 4f 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69  OREIGN KEY (h, i
ddd0: 29 20 0a 20 20 20 20 20 20 20 20 52 45 46 45 52  ) .        REFER
dde0: 45 4e 43 45 53 20 74 31 28 62 2c 20 63 29 20 4f  ENCES t1(b, c) O
ddf0: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
de00: 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
de10: 44 45 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  DE.    );.  }.} 
de20: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  {}.do_test fkey2
de30: 2d 67 65 6e 66 6b 65 79 2e 32 2e 32 20 7b 0a 20  -genfkey.2.2 {. 
de40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
de50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
de60: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
de70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
de80: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36  1 VALUES(4, 5, 6
de90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
dea0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
deb0: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'one');.    INSE
dec0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
ded0: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
dee0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
def0: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 33  key2-genfkey.2.3
df00: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
df10: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
df20: 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20 3d   a = 2 WHERE a =
df30: 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   1;.    SELECT *
df40: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
df50: 7b 32 20 6f 6e 65 20 34 20 66 6f 75 72 7d 0a 64  {2 one 4 four}.d
df60: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
df70: 66 6b 65 79 2e 32 2e 34 20 7b 0a 20 20 65 78 65  fkey.2.4 {.  exe
df80: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
df90: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
dfa0: 61 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43  a = 4;.    SELEC
dfb0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
dfc0: 0a 7d 20 7b 32 20 6f 6e 65 7d 0a 0a 64 6f 5f 74  .} {2 one}..do_t
dfd0: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
dfe0: 79 2e 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  y.2.5 {.  execsq
dff0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
e000: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 68  NTO t3 VALUES('h
e010: 65 6c 6c 6f 27 2c 20 32 2c 20 33 29 3b 0a 20 20  ello', 2, 3);.  
e020: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
e030: 63 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43  c = 2;.    SELEC
e040: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d  T * FROM t3;.  }
e050: 0a 7d 20 7b 68 65 6c 6c 6f 20 32 20 32 7d 0a 64  .} {hello 2 2}.d
e060: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
e070: 66 6b 65 79 2e 32 2e 36 20 7b 0a 20 20 65 78 65  fkey.2.6 {.  exe
e080: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
e090: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  E FROM t1;.    S
e0a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
e0b0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f 70 5f  .  }.} {}..drop_
e0c0: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
e0d0: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
e0e0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
e0f0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
e100: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
e110: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
e120: 20 63 2c 20 55 4e 49 51 55 45 28 63 2c 20 62 29   c, UNIQUE(c, b)
e130: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
e140: 42 4c 45 20 74 32 28 65 20 52 45 46 45 52 45 4e  BLE t2(e REFEREN
e150: 43 45 53 20 74 31 20 4f 4e 20 55 50 44 41 54 45  CES t1 ON UPDATE
e160: 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c   SET NULL ON DEL
e170: 45 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 66 29  ETE SET NULL, f)
e180: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
e190: 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 0a  LE t3(g, h, i, .
e1a0: 20 20 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20          FOREIGN 
e1b0: 4b 45 59 20 28 68 2c 20 69 29 20 0a 20 20 20 20  KEY (h, i) .    
e1c0: 20 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 74      REFERENCES t
e1d0: 31 28 62 2c 20 63 29 20 4f 4e 20 55 50 44 41 54  1(b, c) ON UPDAT
e1e0: 45 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45  E SET NULL ON DE
e1f0: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20  LETE SET NULL.  
e200: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
e210: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
e220: 6b 65 79 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63  key.3.2 {.  exec
e230: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
e240: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
e250: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
e260: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
e270: 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20  UES(4, 5, 6);.  
e280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
e290: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
e2a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e2b0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20  TO t2 VALUES(4, 
e2c0: 27 66 6f 75 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b  'four');.  }.} {
e2d0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
e2e0: 67 65 6e 66 6b 65 79 2e 33 2e 33 20 7b 0a 20 20  genfkey.3.3 {.  
e2f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
e300: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
e310: 32 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  2 WHERE a = 1;. 
e320: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
e330: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f   t2;.  }.} {{} o
e340: 6e 65 20 34 20 66 6f 75 72 7d 0a 64 6f 5f 74 65  ne 4 four}.do_te
e350: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
e360: 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.4 {.  execsql
e370: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
e380: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
e390: 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  4;.    SELECT * 
e3a0: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
e3b0: 7b 7d 20 6f 6e 65 20 7b 7d 20 66 6f 75 72 7d 0a  {} one {} four}.
e3c0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
e3d0: 6e 66 6b 65 79 2e 33 2e 35 20 7b 0a 20 20 65 78  nfkey.3.5 {.  ex
e3e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
e3f0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
e400: 53 28 27 68 65 6c 6c 6f 27 2c 20 32 2c 20 33 29  S('hello', 2, 3)
e410: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
e420: 53 45 54 20 63 20 3d 20 32 3b 0a 20 20 20 20 53  SET c = 2;.    S
e430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
e440: 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 7b 7d  .  }.} {hello {}
e450: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65   {}}.do_test fke
e460: 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e 36 20 7b  y2-genfkey.3.6 {
e470: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e480: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 68   UPDATE t3 SET h
e490: 20 3d 20 32 2c 20 69 20 3d 20 32 3b 0a 20 20 20   = 2, i = 2;.   
e4a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
e4b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
e4c0: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65  OM t3;.  }.} {he
e4d0: 6c 6c 6f 20 7b 7d 20 7b 7d 7d 0a 0a 23 2d 2d 2d  llo {} {}}..#---
e4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e520: 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20  ------.# Verify 
e530: 74 68 61 74 20 74 69 63 6b 65 74 20 64 64 30 38  that ticket dd08
e540: 65 35 61 39 38 38 64 30 30 64 65 63 63 34 61 35  e5a988d00decc4a5
e550: 34 33 64 61 61 38 64 62 62 66 61 62 39 63 35 37  43daa8dbbfab9c57
e560: 37 61 64 38 20 68 61 73 20 62 65 65 6e 0a 23 20  7ad8 has been.# 
e570: 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  fixed..#.do_test
e580: 20 66 6b 65 79 32 2d 64 64 30 38 65 35 2e 31 2e   fkey2-dd08e5.1.
e590: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
e5a0: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
e5b0: 67 6e 5f 6b 65 79 73 3d 4f 4e 3b 0a 20 20 20 20  gn_keys=ON;.    
e5c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 64 64  CREATE TABLE tdd
e5d0: 30 38 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  08(a INTEGER PRI
e5e0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
e5f0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
e600: 49 4e 44 45 58 20 69 64 64 30 38 20 4f 4e 20 74  INDEX idd08 ON t
e610: 64 64 30 38 28 61 2c 62 29 3b 0a 20 20 20 20 49  dd08(a,b);.    I
e620: 4e 53 45 52 54 20 49 4e 54 4f 20 74 64 64 30 38  NSERT INTO tdd08
e630: 20 56 41 4c 55 45 53 28 32 30 30 2c 33 30 30 29   VALUES(200,300)
e640: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  ;..    CREATE TA
e650: 42 4c 45 20 74 64 64 30 38 5f 62 28 77 2c 78 2c  BLE tdd08_b(w,x,
e660: 79 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 78  y, FOREIGN KEY(x
e670: 2c 79 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  ,y) REFERENCES t
e680: 64 64 30 38 28 61 2c 62 29 29 3b 0a 20 20 20 20  dd08(a,b));.    
e690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 64 64 30  INSERT INTO tdd0
e6a0: 38 5f 62 20 56 41 4c 55 45 53 28 31 30 30 2c 32  8_b VALUES(100,2
e6b0: 30 30 2c 33 30 30 29 3b 0a 20 20 7d 0a 7d 20 7b  00,300);.  }.} {
e6c0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
e6d0: 64 64 30 38 65 35 2e 31 2e 32 20 7b 0a 20 20 63  dd08e5.1.2 {.  c
e6e0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 45  atchsql {.    DE
e6f0: 4c 45 54 45 20 46 52 4f 4d 20 74 64 64 30 38 3b  LETE FROM tdd08;
e700: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  .  }.} {1 {forei
e710: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
e720: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
e730: 73 74 20 66 6b 65 79 32 2d 64 64 30 38 65 35 2e  st fkey2-dd08e5.
e740: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
e750: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
e760: 52 4f 4d 20 74 64 64 30 38 3b 0a 20 20 7d 0a 7d  ROM tdd08;.  }.}
e770: 20 7b 32 30 30 20 33 30 30 7d 0a 64 6f 5f 74 65   {200 300}.do_te
e780: 73 74 20 66 6b 65 79 32 2d 64 64 30 38 65 35 2e  st fkey2-dd08e5.
e790: 31 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.4 {.  catchsql
e7a0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
e7b0: 54 4f 20 74 64 64 30 38 5f 62 20 56 41 4c 55 45  TO tdd08_b VALUE
e7c0: 53 28 34 30 30 2c 35 30 30 2c 33 30 30 29 3b 0a  S(400,500,300);.
e7d0: 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67    }.} {1 {foreig
e7e0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
e7f0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
e800: 74 20 66 6b 65 79 32 2d 64 64 30 38 65 35 2e 31  t fkey2-dd08e5.1
e810: 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .5 {.  catchsql 
e820: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 64 64  {.    UPDATE tdd
e830: 30 38 5f 62 20 53 45 54 20 78 3d 78 2b 31 3b 0a  08_b SET x=x+1;.
e840: 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67    }.} {1 {foreig
e850: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
e860: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
e870: 74 20 66 6b 65 79 32 2d 64 64 30 38 65 35 2e 31  t fkey2-dd08e5.1
e880: 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .6 {.  catchsql 
e890: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 64 64  {.    UPDATE tdd
e8a0: 30 38 20 53 45 54 20 61 3d 61 2b 31 3b 0a 20 20  08 SET a=a+1;.  
e8b0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
e8c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
e8d0: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
e8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e920: 2d 2d 2d 0a 23 20 56 65 72 69 66 79 20 74 68 61  ---.# Verify tha
e930: 74 20 74 69 63 6b 65 74 20 63 65 37 63 31 33 33  t ticket ce7c133
e940: 65 61 36 63 63 39 63 63 64 63 31 61 36 30 64 38  ea6cc9ccdc1a60d8
e950: 30 34 34 31 66 38 30 62 36 31 38 30 66 35 65 62  0441f80b6180f5eb
e960: 61 0a 23 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f  a.# fixed..#.do_
e970: 74 65 73 74 20 66 6b 65 79 32 2d 63 65 37 63 31  test fkey2-ce7c1
e980: 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.1.1 {.  execsq
e990: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
e9a0: 41 42 4c 45 20 74 63 65 37 31 28 61 20 49 4e 54  ABLE tce71(a INT
e9b0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
e9c0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
e9d0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69 63   UNIQUE INDEX ic
e9e0: 65 37 31 20 4f 4e 20 74 63 65 37 31 28 61 2c 62  e71 ON tce71(a,b
e9f0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ea00: 54 4f 20 74 63 65 37 31 20 56 41 4c 55 45 53 28  TO tce71 VALUES(
ea10: 31 30 30 2c 32 30 30 29 3b 0a 20 20 20 20 43 52  100,200);.    CR
ea20: 45 41 54 45 20 54 41 42 4c 45 20 74 63 65 37 32  EATE TABLE tce72
ea30: 28 77 2c 20 78 2c 20 79 2c 20 46 4f 52 45 49 47  (w, x, y, FOREIG
ea40: 4e 20 4b 45 59 28 78 2c 79 29 20 52 45 46 45 52  N KEY(x,y) REFER
ea50: 45 4e 43 45 53 20 74 63 65 37 31 28 61 2c 62 29  ENCES tce71(a,b)
ea60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ea70: 54 4f 20 74 63 65 37 32 20 56 41 4c 55 45 53 28  TO tce72 VALUES(
ea80: 33 30 30 2c 31 30 30 2c 32 30 30 29 3b 0a 20 20  300,100,200);.  
ea90: 20 20 55 50 44 41 54 45 20 74 63 65 37 31 20 73    UPDATE tce71 s
eaa0: 65 74 20 62 20 3d 20 32 30 30 20 77 68 65 72 65  et b = 200 where
eab0: 20 61 20 3d 20 31 30 30 3b 0a 20 20 20 20 53 45   a = 100;.    SE
eac0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 63 65 37  LECT * FROM tce7
ead0: 31 2c 20 74 63 65 37 32 3b 0a 20 20 7d 0a 7d 20  1, tce72;.  }.} 
eae0: 7b 31 30 30 20 32 30 30 20 33 30 30 20 31 30 30  {100 200 300 100
eaf0: 20 32 30 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b   200}.do_test fk
eb00: 65 79 32 2d 63 65 37 63 31 33 2e 31 2e 32 20 7b  ey2-ce7c13.1.2 {
eb10: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
eb20: 20 20 55 50 44 41 54 45 20 74 63 65 37 31 20 73    UPDATE tce71 s
eb30: 65 74 20 62 20 3d 20 32 30 31 20 77 68 65 72 65  et b = 201 where
eb40: 20 61 20 3d 20 31 30 30 3b 0a 20 20 7d 0a 7d 20   a = 100;.  }.} 
eb50: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
eb60: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
eb70: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
eb80: 32 2d 63 65 37 63 31 33 2e 31 2e 33 20 7b 0a 20  2-ce7c13.1.3 {. 
eb90: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
eba0: 55 50 44 41 54 45 20 74 63 65 37 31 20 73 65 74  UPDATE tce71 set
ebb0: 20 61 20 3d 20 31 30 31 20 77 68 65 72 65 20 61   a = 101 where a
ebc0: 20 3d 20 31 30 30 3b 0a 20 20 7d 0a 7d 20 7b 31   = 100;.  }.} {1
ebd0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
ebe0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
ebf0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
ec00: 63 65 37 63 31 33 2e 31 2e 34 20 7b 0a 20 20 65  ce7c13.1.4 {.  e
ec10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ec20: 41 54 45 20 54 41 42 4c 45 20 74 63 65 37 33 28  ATE TABLE tce73(
ec30: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
ec40: 59 20 4b 45 59 2c 20 62 2c 20 55 4e 49 51 55 45  Y KEY, b, UNIQUE
ec50: 28 61 2c 62 29 29 3b 0a 20 20 20 20 49 4e 53 45  (a,b));.    INSE
ec60: 52 54 20 49 4e 54 4f 20 74 63 65 37 33 20 56 41  RT INTO tce73 VA
ec70: 4c 55 45 53 28 31 30 30 2c 32 30 30 29 3b 0a 20  LUES(100,200);. 
ec80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ec90: 74 63 65 37 34 28 77 2c 20 78 2c 20 79 2c 20 46  tce74(w, x, y, F
eca0: 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20  OREIGN KEY(x,y) 
ecb0: 52 45 46 45 52 45 4e 43 45 53 20 74 63 65 37 33  REFERENCES tce73
ecc0: 28 61 2c 62 29 29 3b 0a 20 20 20 20 49 4e 53 45  (a,b));.    INSE
ecd0: 52 54 20 49 4e 54 4f 20 74 63 65 37 34 20 56 41  RT INTO tce74 VA
ece0: 4c 55 45 53 28 33 30 30 2c 31 30 30 2c 32 30 30  LUES(300,100,200
ecf0: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63  );.    UPDATE tc
ed00: 65 37 33 20 73 65 74 20 62 20 3d 20 32 30 30 20  e73 set b = 200 
ed10: 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
ed20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ed30: 20 74 63 65 37 33 2c 20 74 63 65 37 34 3b 0a 20   tce73, tce74;. 
ed40: 20 7d 0a 7d 20 7b 31 30 30 20 32 30 30 20 33 30   }.} {100 200 30
ed50: 30 20 31 30 30 20 32 30 30 7d 0a 64 6f 5f 74 65  0 100 200}.do_te
ed60: 73 74 20 66 6b 65 79 32 2d 63 65 37 63 31 33 2e  st fkey2-ce7c13.
ed70: 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.5 {.  catchsql
ed80: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63   {.    UPDATE tc
ed90: 65 37 33 20 73 65 74 20 62 20 3d 20 32 30 31 20  e73 set b = 201 
eda0: 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
edb0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
edc0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
edd0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
ede0: 20 66 6b 65 79 32 2d 63 65 37 63 31 33 2e 31 2e   fkey2-ce7c13.1.
edf0: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
ee00: 0a 20 20 20 20 55 50 44 41 54 45 20 74 63 65 37  .    UPDATE tce7
ee10: 33 20 73 65 74 20 61 20 3d 20 31 30 31 20 77 68  3 set a = 101 wh
ee20: 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20 20 7d  ere a = 100;.  }
ee30: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
ee40: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
ee50: 69 6c 65 64 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74  iled}}..finish_t
ee60: 65 73 74 0a                                      est.