/ Hex Artifact Content
Login

Artifact 223c624e7eccee21e89c98d4d127ac88d774b940:


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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b 45 59 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: 46 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f            {1 {FO
1490: 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45          {1 {FORE
14e0: 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
20e0: 4b 45 59 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 46 4f 52  OM i }.} {1 {FOR
2290: 45 49 47 4e 20 4b 45 59 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 46  FROM i }.} {1 {F
23f0: 4f 52 45 49 47 4e 20 4b 45 59 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 46 4f  ite') }.} {1 {FO
2580: 52 45 49 47 4e 20 4b 45 59 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 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
2670: 4b 45 59 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 46 4f 52 45 49 47 4e 20 4b  ed {1 {FOREIGN K
27b0: 45 59 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 46 4f 52 45 49 47      } {1 {FOREIG
2880: 4e 20 4b 45 59 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 55 4e 49 51  leaf".} {1 {UNIQ
3690: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
36a0: 69 6c 65 64 3a 20 6e 6f 64 65 2e 6e 6f 64 65 69  iled: node.nodei
36b0: 64 7d 7d 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  d}}.fkey2-2-test
36c0: 20 36 38 20 30 20 22 43 4f 4d 4d 49 54 22 20 20   68 0 "COMMIT"  
36d0: 20 20 20 20 20 20 20 20 20 46 4b 56 0a 66 6b 65           FKV.fke
36e0: 79 32 2d 32 2d 74 65 73 74 20 36 39 20 31 20 20  y2-2-test 69 1  
36f0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f   "INSERT INTO no
3700: 64 65 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  de VALUES(1, NUL
3710: 4c 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  L)".fkey2-2-test
3720: 20 37 30 20 30 20 20 20 22 49 4e 53 45 52 54 20   70 0   "INSERT 
3730: 49 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53  INTO node VALUES
3740: 28 32 2c 20 4e 55 4c 4c 29 22 0a 66 6b 65 79 32  (2, NULL)".fkey2
3750: 2d 32 2d 74 65 73 74 20 37 31 20 30 20 22 43 4f  -2-test 71 0 "CO
3760: 4d 4d 49 54 22 0a 0a 66 6b 65 79 32 2d 32 2d 74  MMIT"..fkey2-2-t
3770: 65 73 74 20 37 32 20 30 20 22 42 45 47 49 4e 22  est 72 0 "BEGIN"
3780: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 37 33  .fkey2-2-test 73
3790: 20 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   1   "DELETE FRO
37a0: 4d 20 6e 6f 64 65 22 0a 66 6b 65 79 32 2d 32 2d  M node".fkey2-2-
37b0: 74 65 73 74 20 37 34 20 30 20 20 20 22 49 4e 53  test 74 0   "INS
37c0: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 28 6e 6f  ERT INTO node(no
37d0: 64 65 69 64 29 20 53 45 4c 45 43 54 20 44 49 53  deid) SELECT DIS
37e0: 54 49 4e 43 54 20 70 61 72 65 6e 74 20 46 52 4f  TINCT parent FRO
37f0: 4d 20 6c 65 61 66 22 0a 66 6b 65 79 32 2d 32 2d  M leaf".fkey2-2-
3800: 74 65 73 74 20 37 35 20 30 20 22 43 4f 4d 4d 49  test 75 0 "COMMI
3810: 54 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  T"..#-----------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
3860: 20 54 65 73 74 20 63 61 73 65 73 20 66 6b 65 79   Test cases fkey
3870: 32 2d 33 2e 2a 20 74 65 73 74 20 74 68 61 74 20  2-3.* test that 
3880: 61 20 70 72 6f 67 72 61 6d 20 74 68 61 74 20 65  a program that e
3890: 78 65 63 75 74 65 73 20 66 6f 72 65 69 67 6e 20  xecutes foreign 
38a0: 6b 65 79 0a 23 20 61 63 74 69 6f 6e 73 20 28 43  key.# actions (C
38b0: 41 53 43 41 44 45 2c 20 53 45 54 20 44 45 46 41  ASCADE, SET DEFA
38c0: 55 4c 54 2c 20 53 45 54 20 4e 55 4c 4c 20 65 74  ULT, SET NULL et
38d0: 63 2e 29 20 6f 72 20 74 65 73 74 73 20 46 4b 20  c.) or tests FK 
38e0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 23 20 6f 70  constraints.# op
38f0: 65 6e 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ens a statement 
3900: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 72  transaction if r
3910: 65 71 75 69 72 65 64 2e 0a 23 0a 23 20 66 6b 65  equired..#.# fke
3920: 79 32 2d 33 2e 31 2e 2a 3a 20 54 65 73 74 20 55  y2-3.1.*: Test U
3930: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
3940: 2e 0a 23 20 66 6b 65 79 32 2d 33 2e 32 2e 2a 3a  ..# fkey2-3.2.*:
3950: 20 54 65 73 74 20 44 45 4c 45 54 45 20 73 74 61   Test DELETE sta
3960: 74 65 6d 65 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f  tements..#.drop_
3970: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
3980: 73 74 20 66 6b 65 79 32 2d 33 2e 31 2e 31 20 7b  st fkey2-3.1.1 {
3990: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
39a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
39b0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
39c0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
39d0: 41 42 4c 45 20 63 64 28 0a 20 20 20 20 20 20 63  ABLE cd(.      c
39e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45 46   PRIMARY KEY REF
39f0: 45 52 45 4e 43 45 53 20 61 62 20 4f 4e 20 55 50  ERENCES ab ON UP
3a00: 44 41 54 45 20 43 41 53 43 41 44 45 20 4f 4e 20  DATE CASCADE ON 
3a10: 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20  DELETE CASCADE, 
3a20: 0a 20 20 20 20 20 20 64 0a 20 20 20 20 29 3b 0a  .      d.    );.
3a30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3a40: 20 65 66 28 0a 20 20 20 20 20 20 65 20 52 45 46   ef(.      e REF
3a50: 45 52 45 4e 43 45 53 20 63 64 20 4f 4e 20 55 50  ERENCES cd ON UP
3a60: 44 41 54 45 20 43 41 53 43 41 44 45 2c 20 0a 20  DATE CASCADE, . 
3a70: 20 20 20 20 20 66 2c 20 43 48 45 43 4b 20 28 65       f, CHECK (e
3a80: 21 3d 35 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  !=5).    );.  }.
3a90: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
3aa0: 79 32 2d 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  y2-3.1.2 {.  exe
3ab0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
3ac0: 54 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53  T INTO ab VALUES
3ad0: 28 31 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e  (1, 'b');.    IN
3ae0: 53 45 52 54 20 49 4e 54 4f 20 63 64 20 56 41 4c  SERT INTO cd VAL
3af0: 55 45 53 28 31 2c 20 27 64 27 29 3b 0a 20 20 20  UES(1, 'd');.   
3b00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 66 20   INSERT INTO ef 
3b10: 56 41 4c 55 45 53 28 31 2c 20 27 65 27 29 3b 0a  VALUES(1, 'e');.
3b20: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
3b30: 20 66 6b 65 79 32 2d 33 2e 31 2e 33 20 7b 0a 20   fkey2-3.1.3 {. 
3b40: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
3b50: 54 45 20 61 62 20 53 45 54 20 61 20 3d 20 35 20  TE ab SET a = 5 
3b60: 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f  }.} {1 {CHECK co
3b70: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
3b80: 20 65 66 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b   ef}}.do_test fk
3b90: 65 79 32 2d 33 2e 31 2e 34 20 7b 0a 20 20 65 78  ey2-3.1.4 {.  ex
3ba0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3bb0: 20 46 52 4f 4d 20 61 62 20 7d 0a 7d 20 7b 31 20   FROM ab }.} {1 
3bc0: 62 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  b}.do_test fkey2
3bd0: 2d 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -3.1.4 {.  execs
3be0: 71 6c 20 42 45 47 49 4e 3b 0a 20 20 63 61 74 63  ql BEGIN;.  catc
3bf0: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  hsql { UPDATE ab
3c00: 20 53 45 54 20 61 20 3d 20 35 20 7d 0a 7d 20 7b   SET a = 5 }.} {
3c10: 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  1 {CHECK constra
3c20: 69 6e 74 20 66 61 69 6c 65 64 3a 20 65 66 7d 7d  int failed: ef}}
3c30: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33  .do_test fkey2-3
3c40: 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.5 {.  execsql
3c50: 20 43 4f 4d 4d 49 54 3b 0a 20 20 65 78 65 63 73   COMMIT;.  execs
3c60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
3c70: 4f 4d 20 61 62 3b 20 53 45 4c 45 43 54 20 2a 20  OM ab; SELECT * 
3c80: 46 52 4f 4d 20 63 64 3b 20 53 45 4c 45 43 54 20  FROM cd; SELECT 
3c90: 2a 20 46 52 4f 4d 20 65 66 20 7d 0a 7d 20 7b 31  * FROM ef }.} {1
3ca0: 20 62 20 31 20 64 20 31 20 65 7d 0a 0a 64 6f 5f   b 1 d 1 e}..do_
3cb0: 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 32 2e 31  test fkey2-3.2.1
3cc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47   {.  execsql BEG
3cd0: 49 4e 3b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  IN;.  catchsql {
3ce0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 20   DELETE FROM ab 
3cf0: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
3d00: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
3d10: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
3d20: 66 6b 65 79 32 2d 33 2e 32 2e 32 20 7b 0a 20 20  fkey2-3.2.2 {.  
3d30: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
3d40: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3d50: 54 20 2a 20 46 52 4f 4d 20 61 62 3b 20 53 45 4c  T * FROM ab; SEL
3d60: 45 43 54 20 2a 20 46 52 4f 4d 20 63 64 3b 20 53  ECT * FROM cd; S
3d70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 66 20  ELECT * FROM ef 
3d80: 7d 0a 7d 20 7b 31 20 62 20 31 20 64 20 31 20 65  }.} {1 b 1 d 1 e
3d90: 7d 0a 0a 23 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 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3de0: 54 65 73 74 20 63 61 73 65 73 20 66 6b 65 79 32  Test cases fkey2
3df0: 2d 34 2e 2a 20 74 65 73 74 20 74 68 61 74 20 72  -4.* test that r
3e00: 65 63 75 72 73 69 76 65 20 66 6f 72 65 69 67 6e  ecursive foreign
3e10: 20 6b 65 79 20 61 63 74 69 6f 6e 73 20 0a 23 20   key actions .# 
3e20: 28 69 2e 65 2e 20 43 41 53 43 41 44 45 29 20 61  (i.e. CASCADE) a
3e30: 72 65 20 61 6c 6c 6f 77 65 64 20 65 76 65 6e 20  re allowed even 
3e40: 69 66 20 72 65 63 75 72 73 69 76 65 20 74 72 69  if recursive tri
3e50: 67 67 65 72 73 20 61 72 65 20 64 69 73 61 62 6c  ggers are disabl
3e60: 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
3e70: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b  ables.do_test fk
3e80: 65 79 32 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63  ey2-4.1 {.  exec
3e90: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3ea0: 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20 20   TABLE t1(.     
3eb0: 20 6e 6f 64 65 20 50 52 49 4d 41 52 59 20 4b 45   node PRIMARY KE
3ec0: 59 2c 20 0a 20 20 20 20 20 20 70 61 72 65 6e 74  Y, .      parent
3ed0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f   REFERENCES t1 O
3ee0: 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
3ef0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41  .    );.    CREA
3f00: 54 45 20 54 41 42 4c 45 20 74 32 28 6e 6f 64 65  TE TABLE t2(node
3f10: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 70 61   PRIMARY KEY, pa
3f20: 72 65 6e 74 29 3b 0a 20 20 20 20 43 52 45 41 54  rent);.    CREAT
3f30: 45 20 54 52 49 47 47 45 52 20 74 32 74 20 41 46  E TRIGGER t2t AF
3f40: 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 32  TER DELETE ON t2
3f50: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c   BEGIN.      DEL
3f60: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
3f70: 45 20 70 61 72 65 6e 74 20 3d 20 6f 6c 64 2e 6e  E parent = old.n
3f80: 6f 64 65 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  ode;.    END;.  
3f90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3fa0: 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29   VALUES(1, NULL)
3fb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3fc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 31  O t1 VALUES(2, 1
3fd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3fe0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
3ff0: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
4000: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
4010: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
4020: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
4030: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
4040: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4050: 36 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  6, 3);.    INSER
4060: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4070: 28 37 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45  (7, 3);.    INSE
4080: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
4090: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
40a0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
40b0: 65 79 32 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63  ey2-4.2 {.  exec
40c0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72 65 63  sql { PRAGMA rec
40d0: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20  ursive_triggers 
40e0: 3d 20 6f 66 66 20 7d 0a 20 20 65 78 65 63 73 71  = off }.  execsq
40f0: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
4100: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
4110: 4d 20 74 31 20 57 48 45 52 45 20 6e 6f 64 65 20  M t1 WHERE node 
4120: 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  = 1;.      SELEC
4130: 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 31 3b 0a  T node FROM t1;.
4140: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
4150: 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a 20 20 65   fkey2-4.3 {.  e
4160: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
4170: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
4180: 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a 20  HERE node = 1;. 
4190: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f 64 65       SELECT node
41a0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 52 4f   FROM t2;.    RO
41b0: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 34  LLBACK;.  }.} {4
41c0: 20 35 20 36 20 37 7d 0a 64 6f 5f 74 65 73 74 20   5 6 7}.do_test 
41d0: 66 6b 65 79 32 2d 34 2e 34 20 7b 0a 20 20 65 78  fkey2-4.4 {.  ex
41e0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72  ecsql { PRAGMA r
41f0: 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
4200: 73 20 3d 20 6f 6e 20 7d 0a 20 20 65 78 65 63 73  s = on }.  execs
4210: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
4220: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
4230: 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 6f 64 65  OM t1 WHERE node
4240: 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45   = 1;.      SELE
4250: 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 31 3b  CT node FROM t1;
4260: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
4270: 74 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a 20 20  t fkey2-4.3 {.  
4280: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
4290: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
42a0: 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a  WHERE node = 1;.
42b0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f 64        SELECT nod
42c0: 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 52  e FROM t2;.    R
42d0: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b  OLLBACK;.  }.} {
42e0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4330: 54 65 73 74 20 63 61 73 65 73 20 66 6b 65 79 32  Test cases fkey2
4340: 2d 35 2e 2a 20 76 65 72 69 66 79 20 74 68 61 74  -5.* verify that
4350: 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
4360: 20 62 6c 6f 62 20 41 50 49 20 6d 61 79 20 6e 6f   blob API may no
4370: 74 0a 23 20 77 72 69 74 65 20 74 6f 20 61 20 66  t.# write to a f
4380: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6c 75 6d  oreign key colum
4390: 6e 20 77 68 69 6c 65 20 66 6f 72 65 69 67 6e 2d  n while foreign-
43a0: 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c 65 64  keys are enabled
43b0: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
43c0: 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20 69 6e  les.ifcapable in
43d0: 63 72 62 6c 6f 62 20 7b 0a 20 20 64 6f 5f 74 65  crblob {.  do_te
43e0: 73 74 20 66 6b 65 79 32 2d 35 2e 31 20 7b 0a 20  st fkey2-5.1 {. 
43f0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
4400: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4410: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
4420: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
4430: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52  TE TABLE t2(a PR
4440: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
4450: 45 52 45 4e 43 45 53 20 74 31 28 61 29 29 3b 0a  ERENCES t1(a));.
4460: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4470: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 68 65 6c  O t1 VALUES('hel
4480: 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 3b 0a 20  lo', 'world');. 
4490: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
44a0: 20 74 32 20 56 41 4c 55 45 53 28 27 6b 65 79 27   t2 VALUES('key'
44b0: 2c 20 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20  , 'hello');.    
44c0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
44d0: 73 74 20 66 6b 65 79 32 2d 35 2e 32 20 7b 0a 20  st fkey2-5.2 {. 
44e0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
44f0: 20 7b 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e   { set fd [db in
4500: 63 72 62 6c 6f 62 20 74 32 20 62 20 31 5d 20 7d  crblob t2 b 1] }
4510: 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73 74 20 24   msg].    list $
4520: 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b  rc $msg.  } {1 {
4530: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 65  cannot open fore
4540: 69 67 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 66  ign key column f
4550: 6f 72 20 77 72 69 74 69 6e 67 7d 7d 0a 20 20 64  or writing}}.  d
4560: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35 2e 33  o_test fkey2-5.3
4570: 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63   {.    set rc [c
4580: 61 74 63 68 20 7b 20 73 65 74 20 66 64 20 5b 64  atch { set fd [d
4590: 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64  b incrblob -read
45a0: 6f 6e 6c 79 20 74 32 20 62 20 31 5d 20 7d 20 6d  only t2 b 1] } m
45b0: 73 67 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  sg].    close $f
45c0: 64 0a 20 20 20 20 73 65 74 20 72 63 0a 20 20 7d  d.    set rc.  }
45d0: 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66   {0}.  do_test f
45e0: 6b 65 79 32 2d 35 2e 34 20 7b 0a 20 20 20 20 65  key2-5.4 {.    e
45f0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4600: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
4610: 66 66 20 7d 0a 20 20 20 20 73 65 74 20 72 63 20  ff }.    set rc 
4620: 5b 63 61 74 63 68 20 7b 20 73 65 74 20 66 64 20  [catch { set fd 
4630: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74 32 20  [db incrblob t2 
4640: 62 20 31 5d 20 7d 20 6d 73 67 5d 0a 20 20 20 20  b 1] } msg].    
4650: 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 73 65  close $fd.    se
4660: 74 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20 64  t rc.  } {0}.  d
4670: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35 2e 35  o_test fkey2-5.5
4680: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4690: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
46a0: 6b 65 79 73 20 3d 20 6f 6e 20 7d 0a 20 20 7d 20  keys = on }.  } 
46b0: 7b 7d 0a 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74  {}.}..drop_all_t
46c0: 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20  ables.ifcapable 
46d0: 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f 74 65  vacuum {.  do_te
46e0: 73 74 20 66 6b 65 79 32 2d 36 2e 31 20 7b 0a 20  st fkey2-6.1 {. 
46f0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
4700: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4710: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
4720: 74 32 28 63 29 2c 20 62 29 3b 0a 20 20 20 20 20  t2(c), b);.     
4730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
4740: 28 63 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a 20  (c UNIQUE, b);. 
4750: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4760: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t2 VALUES(1, 2)
4770: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4780: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
4790: 20 32 29 3b 0a 20 20 20 20 20 20 56 41 43 55 55   2);.      VACUU
47a0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  M;.    }.  } {}.
47b0: 7d 0a 0a 23 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 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4800: 54 65 73 74 20 74 68 61 74 20 69 74 20 69 73 20  Test that it is 
4810: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
4820: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
4830: 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 63 68  RY KEY as the ch
4840: 69 6c 64 20 6b 65 79 0a 23 20 6f 66 20 61 20 66  ild key.# of a f
4850: 6f 72 65 69 67 6e 20 63 6f 6e 73 74 72 61 69 6e  oreign constrain
4860: 74 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74  t..# .drop_all_t
4870: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b  ables.do_test fk
4880: 65 79 32 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63  ey2-7.1 {.  exec
4890: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
48a0: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
48b0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
48c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
48d0: 28 63 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (c INTEGER PRIMA
48e0: 52 59 20 4b 45 59 20 52 45 46 45 52 45 4e 43 45  RY KEY REFERENCE
48f0: 53 20 74 31 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  S t1, b);.  }.} 
4900: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  {}.do_test fkey2
4910: 2d 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -7.2 {.  catchsq
4920: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4930: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27  t2 VALUES(1, 'A'
4940: 29 3b 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  ); }.} {1 {FOREI
4950: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
4960: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
4970: 73 74 20 66 6b 65 79 32 2d 37 2e 33 20 7b 0a 20  st fkey2-7.3 {. 
4980: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
4990: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
49a0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
49b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
49c0: 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a 20 20  VALUES(2, 3);.  
49d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
49e0: 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27 29 3b   VALUES(1, 'A');
49f0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
4a00: 74 20 66 6b 65 79 32 2d 37 2e 34 20 7b 0a 20 20  t fkey2-7.4 {.  
4a10: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
4a20: 20 74 32 20 53 45 54 20 63 20 3d 20 32 20 7d 0a   t2 SET c = 2 }.
4a30: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
4a40: 79 32 2d 37 2e 35 20 7b 0a 20 20 63 61 74 63 68  y2-7.5 {.  catch
4a50: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32 20  sql { UPDATE t2 
4a60: 53 45 54 20 63 20 3d 20 33 20 7d 0a 7d 20 7b 31  SET c = 3 }.} {1
4a70: 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   {FOREIGN KEY co
4a80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
4a90: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
4aa0: 37 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  7.6 {.  catchsql
4ab0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
4ac0: 31 20 57 48 45 52 45 20 61 20 3d 20 32 20 7d 0a  1 WHERE a = 2 }.
4ad0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
4ae0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
4af0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
4b00: 65 79 32 2d 37 2e 37 20 7b 0a 20 20 65 78 65 63  ey2-7.7 {.  exec
4b10: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
4b20: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31  M t1 WHERE a = 1
4b30: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
4b40: 66 6b 65 79 32 2d 37 2e 38 20 7b 0a 20 20 63 61  fkey2-7.8 {.  ca
4b50: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
4b60: 74 31 20 53 45 54 20 61 20 3d 20 33 20 7d 0a 7d  t1 SET a = 3 }.}
4b70: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
4b80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
4b90: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  ed}}.do_test fke
4ba0: 79 32 2d 37 2e 39 20 7b 0a 20 20 63 61 74 63 68  y2-7.9 {.  catch
4bb0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32 20  sql { UPDATE t2 
4bc0: 53 45 54 20 72 6f 77 69 64 20 3d 20 33 20 7d 0a  SET rowid = 3 }.
4bd0: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
4be0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
4bf0: 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  led}}..#--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c40: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 74  -.# Test that it
4c50: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
4c60: 20 74 6f 20 65 6e 61 62 6c 65 2f 64 69 73 61 62   to enable/disab
4c70: 6c 65 20 46 4b 20 73 75 70 70 6f 72 74 20 77 68  le FK support wh
4c80: 69 6c 65 20 61 0a 23 20 74 72 61 6e 73 61 63 74  ile a.# transact
4c90: 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 23 20 0a  ion is open..# .
4ca0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
4cb0: 70 72 6f 63 20 66 6b 65 79 32 2d 38 2d 74 65 73  proc fkey2-8-tes
4cc0: 74 20 7b 74 6e 20 7a 53 71 6c 20 76 61 6c 75 65  t {tn zSql value
4cd0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  } {.  do_test fk
4ce0: 65 79 2d 32 2e 38 2e 24 74 6e 2e 31 20 5b 6c 69  ey-2.8.$tn.1 [li
4cf0: 73 74 20 65 78 65 63 73 71 6c 20 24 7a 53 71 6c  st execsql $zSql
4d00: 5d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ] {}.  do_test f
4d10: 6b 65 79 2d 32 2e 38 2e 24 74 6e 2e 32 20 7b 20  key-2.8.$tn.2 { 
4d20: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
4d30: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20 7d 20  foreign_keys" } 
4d40: 24 76 61 6c 75 65 0a 7d 0a 66 6b 65 79 32 2d 38  $value.}.fkey2-8
4d50: 2d 74 65 73 74 20 20 31 20 7b 20 50 52 41 47 4d  -test  1 { PRAGM
4d60: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
4d70: 20 30 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32   0     } 0.fkey2
4d80: 2d 38 2d 74 65 73 74 20 20 32 20 7b 20 50 52 41  -8-test  2 { PRA
4d90: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
4da0: 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66 6b 65   = 1     } 1.fke
4db0: 79 32 2d 38 2d 74 65 73 74 20 20 33 20 7b 20 42  y2-8-test  3 { B
4dc0: 45 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20  EGIN            
4dd0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 31 0a 66             } 1.f
4de0: 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 34 20 7b  key2-8-test  4 {
4df0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
4e00: 6b 65 79 73 20 3d 20 30 20 20 20 20 20 7d 20 31  keys = 0     } 1
4e10: 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 35  .fkey2-8-test  5
4e20: 20 7b 20 43 4f 4d 4d 49 54 20 20 20 20 20 20 20   { COMMIT       
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4e40: 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20   1.fkey2-8-test 
4e50: 20 36 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65   6 { PRAGMA fore
4e60: 69 67 6e 5f 6b 65 79 73 20 3d 20 30 20 20 20 20  ign_keys = 0    
4e70: 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73   } 0.fkey2-8-tes
4e80: 74 20 20 37 20 7b 20 42 45 47 49 4e 20 20 20 20  t  7 { BEGIN    
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74     } 0.fkey2-8-t
4eb0: 65 73 74 20 20 38 20 7b 20 50 52 41 47 4d 41 20  est  8 { PRAGMA 
4ec0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31  foreign_keys = 1
4ed0: 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38       } 0.fkey2-8
4ee0: 2d 74 65 73 74 20 20 39 20 7b 20 43 4f 4d 4d 49  -test  9 { COMMI
4ef0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
4f00: 20 20 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32         } 0.fkey2
4f10: 2d 38 2d 74 65 73 74 20 31 30 20 7b 20 50 52 41  -8-test 10 { PRA
4f20: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
4f30: 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66 6b 65   = 1     } 1.fke
4f40: 79 32 2d 38 2d 74 65 73 74 20 31 31 20 7b 20 50  y2-8-test 11 { P
4f50: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
4f60: 79 73 20 3d 20 6f 66 66 20 20 20 7d 20 30 0a 66  ys = off   } 0.f
4f70: 6b 65 79 32 2d 38 2d 74 65 73 74 20 31 32 20 7b  key2-8-test 12 {
4f80: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
4f90: 6b 65 79 73 20 3d 20 6f 6e 20 20 20 20 7d 20 31  keys = on    } 1
4fa0: 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 31 33  .fkey2-8-test 13
4fb0: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
4fc0: 6e 5f 6b 65 79 73 20 3d 20 6e 6f 20 20 20 20 7d  n_keys = no    }
4fd0: 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20   0.fkey2-8-test 
4fe0: 31 34 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  14 { PRAGMA fore
4ff0: 69 67 6e 5f 6b 65 79 73 20 3d 20 79 65 73 20 20  ign_keys = yes  
5000: 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73   } 1.fkey2-8-tes
5010: 74 20 31 35 20 7b 20 50 52 41 47 4d 41 20 66 6f  t 15 { PRAGMA fo
5020: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 66 61 6c  reign_keys = fal
5030: 73 65 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74  se } 0.fkey2-8-t
5040: 65 73 74 20 31 36 20 7b 20 50 52 41 47 4d 41 20  est 16 { PRAGMA 
5050: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 74  foreign_keys = t
5060: 72 75 65 20 20 7d 20 31 0a 0a 23 2d 2d 2d 2d 2d  rue  } 1..#-----
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
50c0: 77 69 6e 67 20 74 65 73 74 73 2c 20 66 6b 65 79  wing tests, fkey
50d0: 32 2d 39 2e 2a 2c 20 74 65 73 74 20 53 45 54 20  2-9.*, test SET 
50e0: 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e 73 2e  DEFAULT actions.
50f0: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
5100: 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  es.do_test fkey2
5110: 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -9.1.1 {.  execs
5120: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5130: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
5140: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
5150: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
5160: 41 42 4c 45 20 74 32 28 0a 20 20 20 20 20 20 63  ABLE t2(.      c
5170: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5180: 20 4b 45 59 2c 0a 20 20 20 20 20 20 64 20 49 4e   KEY,.      d IN
5190: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 31 20  TEGER DEFAULT 1 
51a0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e  REFERENCES t1 ON
51b0: 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41   DELETE SET DEFA
51c0: 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 44  ULT.    );.    D
51d0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
51e0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
51f0: 66 6b 65 79 32 2d 39 2e 31 2e 32 20 7b 0a 20 20  fkey2-9.1.2 {.  
5200: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
5210: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5220: 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20  UES(1, 'one');. 
5230: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5240: 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f  1 VALUES(2, 'two
5250: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
5260: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
5270: 20 32 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   2);.    SELECT 
5280: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44  * FROM t2;.    D
5290: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
52a0: 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20 20 53  ERE a = 2;.    S
52b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
52c0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31 20 31 7d  .  }.} {1 2 1 1}
52d0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39  .do_test fkey2-9
52e0: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
52f0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
5300: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
5310: 27 74 77 6f 27 29 3b 0a 20 20 20 20 55 50 44 41  'two');.    UPDA
5320: 54 45 20 74 32 20 53 45 54 20 64 20 3d 20 32 3b  TE t2 SET d = 2;
5330: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
5340: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31 3b   t1 WHERE a = 1;
5350: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
5360: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
5370: 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  2}.do_test fkey2
5380: 2d 39 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -9.1.4 {.  execs
5390: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
53a0: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 32 20 74 77 6f  OM t1 }.} {2 two
53b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
53c0: 39 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  9.1.5 {.  catchs
53d0: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
53e0: 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45   t1 }.} {1 {FORE
53f0: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
5400: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f  nt failed}}..do_
5410: 74 65 73 74 20 66 6b 65 79 32 2d 39 2e 32 2e 31  test fkey2-9.2.1
5420: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5430: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5440: 70 70 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  pp(a, b, c, PRIM
5450: 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
5460: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5470: 20 63 63 28 64 20 44 45 46 41 55 4c 54 20 33 2c   cc(d DEFAULT 3,
5480: 20 65 20 44 45 46 41 55 4c 54 20 31 2c 20 66 20   e DEFAULT 1, f 
5490: 44 45 46 41 55 4c 54 20 32 2c 0a 20 20 20 20 20  DEFAULT 2,.     
54a0: 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 66     FOREIGN KEY(f
54b0: 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45 53 20  , d) REFERENCES 
54c0: 70 70 20 0a 20 20 20 20 20 20 20 20 4f 4e 20 55  pp .        ON U
54d0: 50 44 41 54 45 20 53 45 54 20 44 45 46 41 55 4c  PDATE SET DEFAUL
54e0: 54 20 0a 20 20 20 20 20 20 20 20 4f 4e 20 44 45  T .        ON DE
54f0: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20  LETE SET NULL.  
5500: 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20    );.    INSERT 
5510: 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28 31  INTO pp VALUES(1
5520: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53  , 2, 3);.    INS
5530: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
5540: 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20  ES(4, 5, 6);.   
5550: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20   INSERT INTO pp 
5560: 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b  VALUES(7, 8, 9);
5570: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
5580: 74 20 66 6b 65 79 32 2d 39 2e 32 2e 32 20 7b 0a  t fkey2-9.2.2 {.
5590: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
55a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
55b0: 41 4c 55 45 53 28 36 2c 20 27 41 27 2c 20 35 29  ALUES(6, 'A', 5)
55c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
55d0: 4f 20 63 63 20 56 41 4c 55 45 53 28 36 2c 20 27  O cc VALUES(6, '
55e0: 42 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45  B', 5);.    INSE
55f0: 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45  RT INTO cc VALUE
5600: 53 28 39 2c 20 27 41 27 2c 20 38 29 3b 0a 20 20  S(9, 'A', 8);.  
5610: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63    INSERT INTO cc
5620: 20 56 41 4c 55 45 53 28 39 2c 20 27 42 27 2c 20   VALUES(9, 'B', 
5630: 38 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70  8);.    UPDATE p
5640: 70 20 53 45 54 20 62 20 3d 20 31 20 57 48 45 52  p SET b = 1 WHER
5650: 45 20 61 20 3d 20 37 3b 0a 20 20 20 20 53 45 4c  E a = 7;.    SEL
5660: 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a 20  ECT * FROM cc;. 
5670: 20 7d 0a 7d 20 7b 36 20 41 20 35 20 36 20 42 20   }.} {6 A 5 6 B 
5680: 35 20 33 20 41 20 32 20 33 20 42 20 32 7d 0a 64  5 3 A 2 3 B 2}.d
5690: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39 2e 32  o_test fkey2-9.2
56a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
56b0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
56c0: 20 70 70 20 57 48 45 52 45 20 61 20 3d 20 34 3b   pp WHERE a = 4;
56d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
56e0: 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  OM cc;.  }.} {{}
56f0: 20 41 20 7b 7d 20 7b 7d 20 42 20 7b 7d 20 33 20   A {} {} B {} 3 
5700: 41 20 32 20 33 20 42 20 32 7d 0a 0a 23 2d 2d 2d  A 2 3 B 2}..#---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
5760: 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 66 6b  lowing tests, fk
5770: 65 79 32 2d 31 30 2e 2a 2c 20 74 65 73 74 20 22  ey2-10.*, test "
5780: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d  foreign key mism
5790: 61 74 63 68 22 20 61 6e 64 20 0a 23 20 6f 74 68  atch" and .# oth
57a0: 65 72 20 65 72 72 6f 72 73 2e 0a 23 0a 73 65 74  er errors..#.set
57b0: 20 74 6e 20 30 0a 66 6f 72 65 61 63 68 20 7a 53   tn 0.foreach zS
57c0: 71 6c 20 5b 6c 69 73 74 20 7b 0a 20 20 43 52 45  ql [list {.  CRE
57d0: 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 50 52  ATE TABLE p(a PR
57e0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
57f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28   CREATE TABLE c(
5800: 78 20 52 45 46 45 52 45 4e 43 45 53 20 70 28 63  x REFERENCES p(c
5810: 29 29 3b 0a 7d 20 7b 0a 20 20 43 52 45 41 54 45  ));.} {.  CREATE
5820: 20 54 41 42 4c 45 20 63 28 78 20 52 45 46 45 52   TABLE c(x REFER
5830: 45 4e 43 45 53 20 76 28 79 29 29 3b 0a 20 20 43  ENCES v(y));.  C
5840: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20  REATE VIEW v AS 
5850: 53 45 4c 45 43 54 20 78 20 41 53 20 79 20 46 52  SELECT x AS y FR
5860: 4f 4d 20 63 3b 0a 7d 20 7b 0a 20 20 43 52 45 41  OM c;.} {.  CREA
5870: 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20 62 2c  TE TABLE p(a, b,
5880: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
5890: 62 29 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  b));.  CREATE TA
58a0: 42 4c 45 20 63 28 78 20 52 45 46 45 52 45 4e 43  BLE c(x REFERENC
58b0: 45 53 20 70 29 3b 0a 7d 20 7b 0a 20 20 43 52 45  ES p);.} {.  CRE
58c0: 41 54 45 20 54 41 42 4c 45 20 70 28 61 20 43 4f  ATE TABLE p(a CO
58d0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 2c 20 62 29  LLATE binary, b)
58e0: 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55  ;.  CREATE UNIQU
58f0: 45 20 49 4e 44 45 58 20 69 20 4f 4e 20 70 28 61  E INDEX i ON p(a
5900: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
5910: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
5920: 20 63 28 78 20 52 45 46 45 52 45 4e 43 45 53 20   c(x REFERENCES 
5930: 70 28 61 29 29 3b 0a 7d 5d 20 7b 0a 20 20 64 72  p(a));.}] {.  dr
5940: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
5950: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 30  do_test fkey2-10
5960: 2e 31 2e 5b 69 6e 63 72 20 74 6e 5d 20 7b 0a 20  .1.[incr tn] {. 
5970: 20 20 20 65 78 65 63 73 71 6c 20 24 7a 53 71 6c     execsql $zSql
5980: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
5990: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 44 45  INSERT INTO c DE
59a0: 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d 0a 20  FAULT VALUES }. 
59b0: 20 7d 20 7b 2f 31 20 7b 66 6f 72 65 69 67 6e 20   } {/1 {foreign 
59c0: 6b 65 79 20 6d 69 73 6d 61 74 63 68 20 2d 20 22  key mismatch - "
59d0: 63 22 20 72 65 66 65 72 65 6e 63 69 6e 67 20 22  c" referencing "
59e0: 2e 22 7d 2f 7d 0a 7d 0a 0a 23 20 22 72 6f 77 69  ."}/}.}..# "rowi
59f0: 64 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  d" cannot be use
5a00: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 63  d as part of a c
5a10: 68 69 6c 64 20 6f 72 20 70 61 72 65 6e 74 20 6b  hild or parent k
5a20: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 0a 23  ey definition .#
5a30: 20 75 6e 6c 65 73 73 20 69 74 20 68 61 70 70 65   unless it happe
5a40: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 6e 61 6d  ns to be the nam
5a50: 65 20 6f 66 20 61 6e 20 65 78 70 6c 69 63 69 74  e of an explicit
5a60: 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
5a70: 6d 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 6b  mn..#.do_test fk
5a80: 65 79 32 2d 31 30 2e 32 2e 31 20 7b 0a 20 20 64  ey2-10.2.1 {.  d
5a90: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
5aa0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
5ab0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
5ac0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
5ad0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5ae0: 42 4c 45 20 74 32 28 63 2c 20 64 2c 20 46 4f 52  BLE t2(c, d, FOR
5af0: 45 49 47 4e 20 4b 45 59 28 72 6f 77 69 64 29 20  EIGN KEY(rowid) 
5b00: 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 61 29  REFERENCES t1(a)
5b10: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 6b  );.  }.} {1 {unk
5b20: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 22 72 6f 77  nown column "row
5b30: 69 64 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  id" in foreign k
5b40: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 7d 7d 0a  ey definition}}.
5b50: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 30  do_test fkey2-10
5b60: 2e 32 2e 32 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  .2.2 {.  drop_al
5b70: 6c 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68  l_tables.  catch
5b80: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5b90: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
5ba0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
5bb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
5bc0: 28 72 6f 77 69 64 2c 20 64 2c 20 46 4f 52 45 49  (rowid, d, FOREI
5bd0: 47 4e 20 4b 45 59 28 72 6f 77 69 64 29 20 52 45  GN KEY(rowid) RE
5be0: 46 45 52 45 4e 43 45 53 20 74 31 28 61 29 29 3b  FERENCES t1(a));
5bf0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
5c00: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 30 2e 32  _test fkey2-10.2
5c10: 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .1 {.  drop_all_
5c20: 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68 73 71  tables.  catchsq
5c30: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
5c40: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
5c50: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5c60: 74 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e  t2(c, d, FOREIGN
5c70: 20 4b 45 59 28 63 29 20 52 45 46 45 52 45 4e 43   KEY(c) REFERENC
5c80: 45 53 20 74 31 28 72 6f 77 69 64 29 29 3b 0a 20  ES t1(rowid));. 
5c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5ca0: 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 56  1(rowid, a, b) V
5cb0: 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a  ALUES(1, 1, 1);.
5cc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5cd0: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b  t2 VALUES(1, 1);
5ce0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  .  }.} {1 {forei
5cf0: 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 20  gn key mismatch 
5d00: 2d 20 22 74 32 22 20 72 65 66 65 72 65 6e 63 69  - "t2" referenci
5d10: 6e 67 20 22 74 31 22 7d 7d 0a 64 6f 5f 74 65 73  ng "t1"}}.do_tes
5d20: 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e 32 20 7b  t fkey2-10.2.2 {
5d30: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
5d40: 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  es.  catchsql {.
5d50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5d60: 20 74 31 28 72 6f 77 69 64 20 50 52 49 4d 41 52   t1(rowid PRIMAR
5d70: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
5d80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63  REATE TABLE t2(c
5d90: 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
5da0: 28 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 74  (c) REFERENCES t
5db0: 31 28 72 6f 77 69 64 29 29 3b 0a 20 20 20 20 49  1(rowid));.    I
5dc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f  NSERT INTO t1(ro
5dd0: 77 69 64 2c 20 62 29 20 56 41 4c 55 45 53 28 31  wid, b) VALUES(1
5de0: 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
5df0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5e00: 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20  1, 1);.  }.} {0 
5e10: 7b 7d 7d 0a 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e60: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
5e70: 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 31   tests, fkey2-11
5e80: 2e 2a 2c 20 74 65 73 74 20 43 41 53 43 41 44 45  .*, test CASCADE
5e90: 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72 6f 70   actions..#.drop
5ea0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
5eb0: 65 73 74 20 66 6b 65 79 32 2d 31 31 2e 31 2e 31  est fkey2-11.1.1
5ec0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5ed0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5ee0: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
5ef0: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 72 6f 77  MARY KEY, b, row
5f00: 69 64 2c 20 5f 72 6f 77 69 64 5f 2c 20 6f 69 64  id, _rowid_, oid
5f10: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5f20: 42 4c 45 20 74 32 28 63 2c 20 64 2c 20 46 4f 52  BLE t2(c, d, FOR
5f30: 45 49 47 4e 20 4b 45 59 28 63 29 20 52 45 46 45  EIGN KEY(c) REFE
5f40: 52 45 4e 43 45 53 20 74 31 28 61 29 20 4f 4e 20  RENCES t1(a) ON 
5f50: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29 3b  UPDATE CASCADE);
5f60: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
5f70: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20  O t1 VALUES(10, 
5f80: 31 30 30 2c 20 27 61 62 63 27 2c 20 27 64 65 66  100, 'abc', 'def
5f90: 27 2c 20 27 67 68 69 27 29 3b 0a 20 20 20 20 49  ', 'ghi');.    I
5fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
5fb0: 4c 55 45 53 28 31 30 2c 20 31 30 30 29 3b 0a 20  LUES(10, 100);. 
5fc0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
5fd0: 20 61 20 3d 20 31 35 3b 0a 20 20 20 20 53 45 4c   a = 15;.    SEL
5fe0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
5ff0: 20 7d 0a 7d 20 7b 31 35 20 31 30 30 7d 0a 0a 23   }.} {15 100}..#
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
6050: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
6060: 20 66 6b 65 79 32 2d 31 32 2e 2a 2c 20 74 65 73   fkey2-12.*, tes
6070: 74 20 52 45 53 54 52 49 43 54 20 61 63 74 69 6f  t RESTRICT actio
6080: 6e 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ns..#.drop_all_t
6090: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b  ables.do_test fk
60a0: 65 79 32 2d 31 32 2e 31 2e 31 20 7b 0a 20 20 65  ey2-12.1.1 {.  e
60b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
60c0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
60d0: 62 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  b PRIMARY KEY);.
60e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
60f0: 20 74 32 28 0a 20 20 20 20 20 20 78 20 52 45 46   t2(.      x REF
6100: 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 55 50  ERENCES t1 ON UP
6110: 44 41 54 45 20 52 45 53 54 52 49 43 54 20 44 45  DATE RESTRICT DE
6120: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
6130: 4c 59 20 44 45 46 45 52 52 45 44 20 0a 20 20 20  LY DEFERRED .   
6140: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
6150: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
6160: 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53   'one');.    INS
6170: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6180: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
6190: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
61a0: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
61b0: 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e');.  }.} {}.do
61c0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31  _test fkey2-12.1
61d0: 2e 32 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20  .2 { .  execsql 
61e0: 22 42 45 47 49 4e 22 0a 20 20 65 78 65 63 73 71  "BEGIN".  execsq
61f0: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
6200: 32 20 56 41 4c 55 45 53 28 27 74 77 6f 27 29 22  2 VALUES('two')"
6210: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
6220: 65 79 32 2d 31 32 2e 31 2e 33 20 7b 20 0a 20 20  ey2-12.1.3 { .  
6230: 65 78 65 63 73 71 6c 20 22 55 50 44 41 54 45 20  execsql "UPDATE 
6240: 74 31 20 53 45 54 20 62 20 3d 20 27 66 6f 75 72  t1 SET b = 'four
6250: 27 20 57 48 45 52 45 20 62 20 3d 20 27 6f 6e 65  ' WHERE b = 'one
6260: 27 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  '".} {}.do_test 
6270: 66 6b 65 79 32 2d 31 32 2e 31 2e 34 20 7b 20 0a  fkey2-12.1.4 { .
6280: 20 20 63 61 74 63 68 73 71 6c 20 22 55 50 44 41    catchsql "UPDA
6290: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27 66  TE t1 SET b = 'f
62a0: 69 76 65 27 20 57 48 45 52 45 20 62 20 3d 20 27  ive' WHERE b = '
62b0: 74 77 6f 27 22 0a 7d 20 7b 31 20 7b 46 4f 52 45  two'".} {1 {FORE
62c0: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
62d0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
62e0: 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e 35  est fkey2-12.1.5
62f0: 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 22 44   { .  execsql "D
6300: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
6310: 45 52 45 20 62 20 3d 20 27 74 77 6f 27 22 0a 7d  ERE b = 'two'".}
6320: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
6330: 32 2d 31 32 2e 31 2e 36 20 7b 20 0a 20 20 63 61  2-12.1.6 { .  ca
6340: 74 63 68 73 71 6c 20 22 43 4f 4d 4d 49 54 22 0a  tchsql "COMMIT".
6350: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
6360: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
6370: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
6380: 65 79 32 2d 31 32 2e 31 2e 37 20 7b 20 0a 20 20  ey2-12.1.7 { .  
6390: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
63a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
63b0: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
63c0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
63d0: 20 7b 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61   {}..drop_all_ta
63e0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65  bles.do_test fke
63f0: 79 32 2d 31 32 2e 32 2e 31 20 7b 0a 20 20 65 78  y2-12.2.1 {.  ex
6400: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
6410: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 43 4f  TE TABLE t1(x CO
6420: 4c 4c 41 54 45 20 4e 4f 43 41 53 45 20 50 52 49  LLATE NOCASE PRI
6430: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
6440: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 74  REATE TRIGGER tt
6450: 31 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f  1 AFTER DELETE O
6460: 4e 20 74 31 20 0a 20 20 20 20 20 20 57 48 45 4e  N t1 .      WHEN
6470: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
6480: 20 31 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   1 FROM t2 WHERE
6490: 20 6f 6c 64 2e 78 20 3d 20 79 20 29 0a 20 20 20   old.x = y ).   
64a0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
64b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
64c0: 45 53 28 6f 6c 64 2e 78 29 3b 0a 20 20 20 20 45  ES(old.x);.    E
64d0: 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ND;.    CREATE T
64e0: 41 42 4c 45 20 74 32 28 79 20 52 45 46 45 52 45  ABLE t2(y REFERE
64f0: 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 49 4e  NCES t1);.    IN
6500: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6510: 55 45 53 28 27 41 27 29 3b 0a 20 20 20 20 49 4e  UES('A');.    IN
6520: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6530: 55 45 53 28 27 42 27 29 3b 0a 20 20 20 20 49 4e  UES('B');.    IN
6540: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
6550: 55 45 53 28 27 61 27 29 3b 0a 20 20 20 20 49 4e  UES('a');.    IN
6560: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
6570: 55 45 53 28 27 62 27 29 3b 0a 0a 20 20 20 20 53  UES('b');..    S
6580: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
6590: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
65a0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 41 20  OM t2;.  }.} {A 
65b0: 42 20 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20 66  B a b}.do_test f
65c0: 6b 65 79 32 2d 31 32 2e 32 2e 32 20 7b 0a 20 20  key2-12.2.2 {.  
65d0: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
65e0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65   FROM t1 }.  exe
65f0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
6600: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
6610: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6620: 32 3b 0a 20 20 7d 0a 7d 20 7b 41 20 42 20 61 20  2;.  }.} {A B a 
6630: 62 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  b}.do_test fkey2
6640: 2d 31 32 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63  -12.2.3 {.  exec
6650: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
6660: 41 42 4c 45 20 74 32 3b 0a 20 20 20 20 43 52 45  ABLE t2;.    CRE
6670: 41 54 45 20 54 41 42 4c 45 20 74 32 28 79 20 52  ATE TABLE t2(y R
6680: 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20  EFERENCES t1 ON 
6690: 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54 29  DELETE RESTRICT)
66a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
66b0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 29  O t2 VALUES('a')
66c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
66d0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62 27 29  O t2 VALUES('b')
66e0: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
66f0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
6700: 31 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47  1 }.} {1 {FOREIG
6710: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
6720: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
6730: 74 20 66 6b 65 79 32 2d 31 32 2e 32 2e 34 20 7b  t fkey2-12.2.4 {
6740: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6750: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6760: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
6770: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
6780: 41 20 42 20 61 20 62 7d 0a 0a 64 72 6f 70 5f 61  A B a b}..drop_a
6790: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
67a0: 74 20 66 6b 65 79 32 2d 31 32 2e 33 2e 31 20 7b  t fkey2-12.3.1 {
67b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
67c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 75 70   CREATE TABLE up
67d0: 28 0a 20 20 20 20 20 20 63 30 30 2c 20 63 30 31  (.      c00, c01
67e0: 2c 20 63 30 32 2c 20 63 30 33 2c 20 63 30 34 2c  , c02, c03, c04,
67f0: 20 63 30 35 2c 20 63 30 36 2c 20 63 30 37 2c 20   c05, c06, c07, 
6800: 63 30 38 2c 20 63 30 39 2c 0a 20 20 20 20 20 20  c08, c09,.      
6810: 63 31 30 2c 20 63 31 31 2c 20 63 31 32 2c 20 63  c10, c11, c12, c
6820: 31 33 2c 20 63 31 34 2c 20 63 31 35 2c 20 63 31  13, c14, c15, c1
6830: 36 2c 20 63 31 37 2c 20 63 31 38 2c 20 63 31 39  6, c17, c18, c19
6840: 2c 0a 20 20 20 20 20 20 63 32 30 2c 20 63 32 31  ,.      c20, c21
6850: 2c 20 63 32 32 2c 20 63 32 33 2c 20 63 32 34 2c  , c22, c23, c24,
6860: 20 63 32 35 2c 20 63 32 36 2c 20 63 32 37 2c 20   c25, c26, c27, 
6870: 63 32 38 2c 20 63 32 39 2c 0a 20 20 20 20 20 20  c28, c29,.      
6880: 63 33 30 2c 20 63 33 31 2c 20 63 33 32 2c 20 63  c30, c31, c32, c
6890: 33 33 2c 20 63 33 34 2c 20 63 33 35 2c 20 63 33  33, c34, c35, c3
68a0: 36 2c 20 63 33 37 2c 20 63 33 38 2c 20 63 33 39  6, c37, c38, c39
68b0: 2c 0a 20 20 20 20 20 20 50 52 49 4d 41 52 59 20  ,.      PRIMARY 
68c0: 4b 45 59 28 63 33 34 2c 20 63 33 35 29 0a 20 20  KEY(c34, c35).  
68d0: 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20    );.    CREATE 
68e0: 54 41 42 4c 45 20 64 6f 77 6e 28 0a 20 20 20 20  TABLE down(.    
68f0: 20 20 63 30 30 2c 20 63 30 31 2c 20 63 30 32 2c    c00, c01, c02,
6900: 20 63 30 33 2c 20 63 30 34 2c 20 63 30 35 2c 20   c03, c04, c05, 
6910: 63 30 36 2c 20 63 30 37 2c 20 63 30 38 2c 20 63  c06, c07, c08, c
6920: 30 39 2c 0a 20 20 20 20 20 20 63 31 30 2c 20 63  09,.      c10, c
6930: 31 31 2c 20 63 31 32 2c 20 63 31 33 2c 20 63 31  11, c12, c13, c1
6940: 34 2c 20 63 31 35 2c 20 63 31 36 2c 20 63 31 37  4, c15, c16, c17
6950: 2c 20 63 31 38 2c 20 63 31 39 2c 0a 20 20 20 20  , c18, c19,.    
6960: 20 20 63 32 30 2c 20 63 32 31 2c 20 63 32 32 2c    c20, c21, c22,
6970: 20 63 32 33 2c 20 63 32 34 2c 20 63 32 35 2c 20   c23, c24, c25, 
6980: 63 32 36 2c 20 63 32 37 2c 20 63 32 38 2c 20 63  c26, c27, c28, c
6990: 32 39 2c 0a 20 20 20 20 20 20 63 33 30 2c 20 63  29,.      c30, c
69a0: 33 31 2c 20 63 33 32 2c 20 63 33 33 2c 20 63 33  31, c32, c33, c3
69b0: 34 2c 20 63 33 35 2c 20 63 33 36 2c 20 63 33 37  4, c35, c36, c37
69c0: 2c 20 63 33 38 2c 20 63 33 39 2c 0a 20 20 20 20  , c38, c39,.    
69d0: 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63 33    FOREIGN KEY(c3
69e0: 39 2c 20 63 33 38 29 20 52 45 46 45 52 45 4e 43  9, c38) REFERENC
69f0: 45 53 20 75 70 20 4f 4e 20 55 50 44 41 54 45 20  ES up ON UPDATE 
6a00: 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20  CASCADE.    );. 
6a10: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
6a20: 66 6b 65 79 32 2d 31 32 2e 33 2e 32 20 7b 0a 20  fkey2-12.3.2 {. 
6a30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
6a40: 4e 53 45 52 54 20 49 4e 54 4f 20 75 70 28 63 33  NSERT INTO up(c3
6a50: 34 2c 20 63 33 35 29 20 56 41 4c 55 45 53 28 27  4, c35) VALUES('
6a60: 79 65 73 27 2c 20 27 6e 6f 27 29 3b 0a 20 20 20  yes', 'no');.   
6a70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f 77   INSERT INTO dow
6a80: 6e 28 63 33 39 2c 20 63 33 38 29 20 56 41 4c 55  n(c39, c38) VALU
6a90: 45 53 28 27 79 65 73 27 2c 20 27 6e 6f 27 29 3b  ES('yes', 'no');
6aa0: 0a 20 20 20 20 55 50 44 41 54 45 20 75 70 20 53  .    UPDATE up S
6ab0: 45 54 20 63 33 34 20 3d 20 27 70 6f 73 73 69 62  ET c34 = 'possib
6ac0: 6c 79 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ly';.    SELECT 
6ad0: 63 33 38 2c 20 63 33 39 20 46 52 4f 4d 20 64 6f  c38, c39 FROM do
6ae0: 77 6e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  wn;.    DELETE F
6af0: 52 4f 4d 20 64 6f 77 6e 3b 0a 20 20 7d 0a 7d 20  ROM down;.  }.} 
6b00: 7b 6e 6f 20 70 6f 73 73 69 62 6c 79 7d 0a 64 6f  {no possibly}.do
6b10: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 33  _test fkey2-12.3
6b20: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
6b30: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f  { INSERT INTO do
6b40: 77 6e 28 63 33 39 2c 20 63 33 38 29 20 56 41 4c  wn(c39, c38) VAL
6b50: 55 45 53 28 27 79 65 73 27 2c 20 27 6e 6f 27 29  UES('yes', 'no')
6b60: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
6b70: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
6b80: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
6b90: 20 66 6b 65 79 32 2d 31 32 2e 33 2e 34 20 7b 0a   fkey2-12.3.4 {.
6ba0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
6bb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 70 28   INSERT INTO up(
6bc0: 63 33 34 2c 20 63 33 35 29 20 56 41 4c 55 45 53  c34, c35) VALUES
6bd0: 28 27 79 65 73 27 2c 20 27 6e 6f 27 29 3b 0a 20  ('yes', 'no');. 
6be0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64     INSERT INTO d
6bf0: 6f 77 6e 28 63 33 39 2c 20 63 33 38 29 20 56 41  own(c39, c38) VA
6c00: 4c 55 45 53 28 27 79 65 73 27 2c 20 27 6e 6f 27  LUES('yes', 'no'
6c10: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
6c20: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
6c30: 75 70 20 57 48 45 52 45 20 63 33 34 20 3d 20 27  up WHERE c34 = '
6c40: 79 65 73 27 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  yes' }.} {1 {FOR
6c50: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
6c60: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
6c70: 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 33 2e  test fkey2-12.3.
6c80: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
6c90: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
6ca0: 20 75 70 20 57 48 45 52 45 20 63 33 34 20 3d 20   up WHERE c34 = 
6cb0: 27 70 6f 73 73 69 62 6c 79 27 3b 0a 20 20 20 20  'possibly';.    
6cc0: 53 45 4c 45 43 54 20 63 33 34 2c 20 63 33 35 20  SELECT c34, c35 
6cd0: 46 52 4f 4d 20 75 70 3b 0a 20 20 20 20 53 45 4c  FROM up;.    SEL
6ce0: 45 43 54 20 63 33 39 2c 20 63 33 38 20 46 52 4f  ECT c39, c38 FRO
6cf0: 4d 20 64 6f 77 6e 3b 0a 20 20 7d 0a 7d 20 7b 79  M down;.  }.} {y
6d00: 65 73 20 6e 6f 20 79 65 73 20 6e 6f 7d 0a 0a 23  es no yes no}..#
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
6d60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
6d70: 20 66 6b 65 79 32 2d 31 33 2e 2a 2c 20 74 65 73   fkey2-13.*, tes
6d80: 74 20 74 68 61 74 20 46 4b 20 70 72 6f 63 65 73  t that FK proces
6d90: 73 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  sing is performe
6da0: 64 0a 23 20 77 68 65 6e 20 72 6f 77 73 20 61 72  d.# when rows ar
6db0: 65 20 52 45 50 4c 41 43 45 64 2e 0a 23 0a 64 72  e REPLACEd..#.dr
6dc0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
6dd0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31  _test fkey2-13.1
6de0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
6df0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6e00: 45 20 70 70 28 61 20 55 4e 49 51 55 45 2c 20 62  E pp(a UNIQUE, b
6e10: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
6e20: 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 43 52 45  (b, c));.    CRE
6e30: 41 54 45 20 54 41 42 4c 45 20 63 63 28 64 2c 20  ATE TABLE cc(d, 
6e40: 65 2c 20 66 20 55 4e 49 51 55 45 2c 20 46 4f 52  e, f UNIQUE, FOR
6e50: 45 49 47 4e 20 4b 45 59 28 64 2c 20 65 29 20 52  EIGN KEY(d, e) R
6e60: 45 46 45 52 45 4e 43 45 53 20 70 70 29 3b 0a 20  EFERENCES pp);. 
6e70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
6e80: 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  p VALUES(1, 2, 3
6e90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6ea0: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 32 2c 20  TO cc VALUES(2, 
6eb0: 33 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  3, 1);.  }.} {}.
6ec0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 74 6d 74  foreach {tn stmt
6ed0: 7d 20 7b 0a 20 20 31 20 20 20 22 52 45 50 4c 41  } {.  1   "REPLA
6ee0: 43 45 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45  CE INTO pp VALUE
6ef0: 53 28 31 2c 20 34 2c 20 35 29 22 0a 20 20 32 20  S(1, 4, 5)".  2 
6f00: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6f10: 70 70 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  pp(rowid, a, b, 
6f20: 63 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c) VALUES(1, 2, 
6f30: 33 2c 20 34 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f  3, 4)".} {.  do_
6f40: 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e  test fkey2-13.1.
6f50: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63  $tn.1 {.    catc
6f60: 68 73 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20 7b  hsql $stmt.  } {
6f70: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
6f80: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
6f90: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
6fa0: 79 32 2d 31 33 2e 31 2e 24 74 6e 2e 32 20 7b 0a  y2-13.1.$tn.2 {.
6fb0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
6fc0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6fd0: 4d 20 70 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  M pp;.      SELE
6fe0: 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a 20 20  CT * FROM cc;.  
6ff0: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 32    }.  } {1 2 3 2
7000: 20 33 20 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 1}.  do_test 
7010: 66 6b 65 79 32 2d 31 33 2e 31 2e 24 74 6e 2e 33  fkey2-13.1.$tn.3
7020: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 42   {.    execsql B
7030: 45 47 49 4e 3b 0a 20 20 20 20 63 61 74 63 68 73  EGIN;.    catchs
7040: 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20 7b 31 20  ql $stmt.  } {1 
7050: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
7060: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
7070: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
7080: 2d 31 33 2e 31 2e 24 74 6e 2e 34 20 7b 0a 20 20  -13.1.$tn.4 {.  
7090: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
70a0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
70b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 70  SELECT * FROM pp
70c0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
70d0: 20 46 52 4f 4d 20 63 63 3b 0a 20 20 20 20 7d 0a   FROM cc;.    }.
70e0: 20 20 7d 20 7b 31 20 32 20 33 20 32 20 33 20 31    } {1 2 3 2 3 1
70f0: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.}.do_test fkey
7100: 32 2d 31 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65  2-13.1.3 {.  exe
7110: 63 73 71 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c  csql { .    REPL
7120: 41 43 45 20 49 4e 54 4f 20 70 70 28 72 6f 77 69  ACE INTO pp(rowi
7130: 64 2c 20 61 2c 20 62 2c 20 63 29 20 56 41 4c 55  d, a, b, c) VALU
7140: 45 53 28 31 2c 20 32 2c 20 32 2c 20 33 29 3b 0a  ES(1, 2, 2, 3);.
7150: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
7160: 2c 20 2a 20 46 52 4f 4d 20 70 70 3b 0a 20 20 20  , * FROM pp;.   
7170: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
7180: 63 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 32 20  c;.  }.} {1 2 2 
7190: 33 20 32 20 33 20 31 7d 0a 64 6f 5f 74 65 73 74  3 2 3 1}.do_test
71a0: 20 66 6b 65 79 32 2d 31 33 2e 31 2e 34 20 7b 0a   fkey2-13.1.4 {.
71b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
71c0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 70   REPLACE INTO pp
71d0: 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 29  (rowid, a, b, c)
71e0: 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 32 2c   VALUES(2, 2, 2,
71f0: 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   3);.    SELECT 
7200: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 70 70  rowid, * FROM pp
7210: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
7220: 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b 32  ROM cc;.  }.} {2
7230: 20 32 20 32 20 33 20 32 20 33 20 31 7d 0a 0a 23   2 2 3 2 3 1}..#
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
7290: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
72a0: 20 66 6b 65 79 32 2d 31 34 2e 2a 2c 20 74 65 73   fkey2-14.*, tes
72b0: 74 20 74 68 61 74 20 74 68 65 20 22 44 52 4f 50  t that the "DROP
72c0: 20 54 41 42 4c 45 22 20 61 6e 64 20 22 41 4c 54   TABLE" and "ALT
72d0: 45 52 0a 23 20 54 41 42 4c 45 22 20 63 6f 6d 6d  ER.# TABLE" comm
72e0: 61 6e 64 73 20 77 6f 72 6b 20 61 73 20 65 78 70  ands work as exp
72f0: 65 63 74 65 64 20 77 72 74 20 66 6f 72 65 69 67  ected wrt foreig
7300: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
7310: 73 2e 0a 23 0a 23 20 66 6b 65 79 32 2d 31 34 2e  s..#.# fkey2-14.
7320: 31 2a 3a 20 41 4c 54 45 52 20 54 41 42 4c 45 20  1*: ALTER TABLE 
7330: 41 44 44 20 43 4f 4c 55 4d 4e 0a 23 20 66 6b 65  ADD COLUMN.# fke
7340: 79 32 2d 31 34 2e 32 2a 3a 20 41 4c 54 45 52 20  y2-14.2*: ALTER 
7350: 54 41 42 4c 45 20 52 45 4e 41 4d 45 20 54 41 42  TABLE RENAME TAB
7360: 4c 45 0a 23 20 66 6b 65 79 32 2d 31 34 2e 33 2a  LE.# fkey2-14.3*
7370: 3a 20 44 52 4f 50 20 54 41 42 4c 45 0a 23 0a 64  : DROP TABLE.#.d
7380: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 69  rop_all_tables.i
7390: 66 63 61 70 61 62 6c 65 20 61 6c 74 65 72 74 61  fcapable alterta
73a0: 62 6c 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ble {.  do_test 
73b0: 66 6b 65 79 32 2d 31 34 2e 31 2e 31 20 7b 0a 20  fkey2-14.1.1 {. 
73c0: 20 20 20 23 20 41 64 64 69 6e 67 20 61 20 63 6f     # Adding a co
73d0: 6c 75 6d 6e 20 77 69 74 68 20 61 20 52 45 46 45  lumn with a REFE
73e0: 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 69 73  RENCES clause is
73f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 0a   not supported..
7400: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
7410: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
7420: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
7430: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
7440: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
7450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63  ;.    }.    catc
7460: 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  hsql { ALTER TAB
7470: 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e  LE t2 ADD COLUMN
7480: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   c REFERENCES t1
7490: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
74a0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
74b0: 2e 31 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68  .1.2 {.    catch
74c0: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
74d0: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
74e0: 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52  d DEFAULT NULL R
74f0: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
7500: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
7510: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 2e 33  est fkey2-14.1.3
7520: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
7530: 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32  { ALTER TABLE t2
7540: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 65 20 52 45   ADD COLUMN e RE
7550: 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41  FERENCES t1 DEFA
7560: 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20 7d 20 7b 30  ULT NULL}.  } {0
7570: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66   {}}.  do_test f
7580: 6b 65 79 32 2d 31 34 2e 31 2e 34 20 7b 0a 20 20  key2-14.1.4 {.  
7590: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
75a0: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
75b0: 43 4f 4c 55 4d 4e 20 66 20 52 45 46 45 52 45 4e  COLUMN f REFEREN
75c0: 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 27  CES t1 DEFAULT '
75d0: 74 65 78 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43  text'}.  } {1 {C
75e0: 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45  annot add a REFE
75f0: 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69  RENCES column wi
7600: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61  th non-NULL defa
7610: 75 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f  ult value}}.  do
7620: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31  _test fkey2-14.1
7630: 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .5 {.    catchsq
7640: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
7650: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 67 20  t2 ADD COLUMN g 
7660: 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54 5f  DEFAULT CURRENT_
7670: 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45 53 20  TIME REFERENCES 
7680: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43 61 6e  t1 }.  } {1 {Can
7690: 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45  not add a REFERE
76a0: 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68  NCES column with
76b0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
76c0: 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74  t value}}.  do_t
76d0: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 2e 36  est fkey2-14.1.6
76e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
76f0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66   .      PRAGMA f
7700: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 66  oreign_keys = of
7710: 66 3b 0a 20 20 20 20 20 20 41 4c 54 45 52 20 54  f;.      ALTER T
7720: 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55  ABLE t2 ADD COLU
7730: 4d 4e 20 68 20 44 45 46 41 55 4c 54 20 27 74 65  MN h DEFAULT 'te
7740: 78 74 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xt' REFERENCES t
7750: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
7760: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
7770: 6e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  n;.      SELECT 
7780: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
7790: 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
77a0: 65 3d 27 74 32 27 3b 0a 20 20 20 20 7d 0a 20 20  e='t2';.    }.  
77b0: 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45  } {{CREATE TABLE
77c0: 20 74 32 28 61 2c 20 62 2c 20 63 20 52 45 46 45   t2(a, b, c REFE
77d0: 52 45 4e 43 45 53 20 74 31 2c 20 64 20 44 45 46  RENCES t1, d DEF
77e0: 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45  AULT NULL REFERE
77f0: 4e 43 45 53 20 74 31 2c 20 65 20 52 45 46 45 52  NCES t1, e REFER
7800: 45 4e 43 45 53 20 74 31 20 44 45 46 41 55 4c 54  ENCES t1 DEFAULT
7810: 20 4e 55 4c 4c 2c 20 68 20 44 45 46 41 55 4c 54   NULL, h DEFAULT
7820: 20 27 74 65 78 74 27 20 52 45 46 45 52 45 4e 43   'text' REFERENC
7830: 45 53 20 74 31 29 7d 7d 0a 20 20 0a 20 20 0a 20  ES t1)}}.  .  . 
7840: 20 23 20 54 65 73 74 20 74 68 65 20 73 71 6c 69   # Test the sqli
7850: 74 65 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74  te_rename_parent
7860: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  () function dire
7870: 63 74 6c 79 2e 0a 20 20 23 0a 20 20 70 72 6f 63  ctly..  #.  proc
7880: 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72   test_rename_par
7890: 65 6e 74 20 7b 7a 43 72 65 61 74 65 20 7a 4f 6c  ent {zCreate zOl
78a0: 64 20 7a 4e 65 77 7d 20 7b 0a 20 20 20 20 64 62  d zNew} {.    db
78b0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73 71   eval {SELECT sq
78c0: 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 70 61 72 65  lite_rename_pare
78d0: 6e 74 28 24 7a 43 72 65 61 74 65 2c 20 24 7a 4f  nt($zCreate, $zO
78e0: 6c 64 2c 20 24 7a 4e 65 77 29 7d 0a 20 20 7d 0a  ld, $zNew)}.  }.
78f0: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
7900: 31 34 2e 32 2e 31 2e 31 20 7b 0a 20 20 20 20 74  14.2.1.1 {.    t
7910: 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e  est_rename_paren
7920: 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  t {CREATE TABLE 
7930: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
7940: 74 32 29 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b  t2)} t2 t3.  } {
7950: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
7960: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 22 74  (a REFERENCES "t
7970: 33 22 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3")}}.  do_test 
7980: 66 6b 65 79 32 2d 31 34 2e 32 2e 31 2e 32 20 7b  fkey2-14.2.1.2 {
7990: 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65  .    test_rename
79a0: 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20  _parent {CREATE 
79b0: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
79c0: 45 4e 43 45 53 20 74 32 29 7d 20 74 34 20 74 33  ENCES t2)} t4 t3
79d0: 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41  .  } {{CREATE TA
79e0: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
79f0: 43 45 53 20 74 32 29 7d 7d 0a 20 20 64 6f 5f 74  CES t2)}}.  do_t
7a00: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 31  est fkey2-14.2.1
7a10: 2e 33 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65  .3 {.    test_re
7a20: 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45  name_parent {CRE
7a30: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
7a40: 45 46 45 52 45 4e 43 45 53 20 22 74 32 22 29 7d  EFERENCES "t2")}
7a50: 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45   t2 t3.  } {{CRE
7a60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
7a70: 45 46 45 52 45 4e 43 45 53 20 22 74 33 22 29 7d  EFERENCES "t3")}
7a80: 7d 0a 20 20 0a 20 20 23 20 54 65 73 74 20 41 4c  }.  .  # Test AL
7a90: 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41 4d 45  TER TABLE RENAME
7aa0: 20 54 41 42 4c 45 20 61 20 62 69 74 2e 0a 20 20   TABLE a bit..  
7ab0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  #.  do_test fkey
7ac0: 32 2d 31 34 2e 32 2e 32 2e 31 20 7b 0a 20 20 20  2-14.2.2.1 {.   
7ad0: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
7ae0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
7af0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
7b00: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
7b10: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
7b20: 20 74 31 29 3b 0a 20 20 20 20 20 20 43 52 45 41   t1);.      CREA
7b30: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52  TE TABLE t2(a PR
7b40: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
7b50: 45 52 45 4e 43 45 53 20 74 31 2c 20 63 20 52 45  ERENCES t1, c RE
7b60: 46 45 52 45 4e 43 45 53 20 74 32 29 3b 0a 20 20  FERENCES t2);.  
7b70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7b80: 20 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53   t3(a REFERENCES
7b90: 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45   t1, b REFERENCE
7ba0: 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43  S t2, c REFERENC
7bb0: 45 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ES t1);.    }.  
7bc0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
7bd0: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
7be0: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
7bf0: 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a  type = 'table'}.
7c00: 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20    } [list \.    
7c10: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
7c20: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
7c30: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
7c40: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
7c50: 20 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45        \.    {CRE
7c60: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
7c70: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
7c80: 46 45 52 45 4e 43 45 53 20 74 31 2c 20 63 20 52  FERENCES t1, c R
7c90: 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 20 20  EFERENCES t2)}  
7ca0: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
7cb0: 54 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52  TABLE t3(a REFER
7cc0: 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45 46 45  ENCES t1, b REFE
7cd0: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
7ce0: 45 52 45 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a  ERENCES t1)}  \.
7cf0: 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b    ].  do_test fk
7d00: 65 79 32 2d 31 34 2e 32 2e 32 2e 32 20 7b 0a 20  ey2-14.2.2.2 {. 
7d10: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54     execsql { ALT
7d20: 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41  ER TABLE t1 RENA
7d30: 4d 45 20 54 4f 20 74 34 20 7d 0a 20 20 20 20 65  ME TO t4 }.    e
7d40: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
7d50: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
7d60: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
7d70: 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d  e = 'table'}.  }
7d80: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52   [list \.    {CR
7d90: 45 41 54 45 20 54 41 42 4c 45 20 22 74 34 22 28  EATE TABLE "t4"(
7da0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
7db0: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34 22   REFERENCES "t4"
7dc0: 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )}              
7dd0: 20 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45        \.    {CRE
7de0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
7df0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
7e00: 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c 20 63  FERENCES "t4", c
7e10: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d   REFERENCES t2)}
7e20: 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45 41       \.    {CREA
7e30: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52 45  TE TABLE t3(a RE
7e40: 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c 20 62  FERENCES "t4", b
7e50: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20   REFERENCES t2, 
7e60: 63 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  c REFERENCES "t4
7e70: 22 29 7d 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74  ")} \.  ].  do_t
7e80: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32  est fkey2-14.2.2
7e90: 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .3 {.    catchsq
7ea0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
7eb0: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t3 VALUES(1, 2, 
7ec0: 33 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 46 4f 52  3) }.  } {1 {FOR
7ed0: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
7ee0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64  int failed}}.  d
7ef0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
7f00: 32 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  2.2.4 {.    exec
7f10: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
7f20: 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20 4e  O t4 VALUES(1, N
7f30: 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  ULL) }.  } {}.  
7f40: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
7f50: 2e 32 2e 32 2e 35 20 7b 0a 20 20 20 20 63 61 74  .2.2.5 {.    cat
7f60: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
7f70: 34 20 53 45 54 20 62 20 3d 20 35 20 7d 0a 20 20  4 SET b = 5 }.  
7f80: 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45  } {1 {FOREIGN KE
7f90: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
7fa0: 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  led}}.  do_test 
7fb0: 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 36 20 7b  fkey2-14.2.2.6 {
7fc0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
7fd0: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20  UPDATE t4 SET b 
7fe0: 3d 20 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  = 1 }.  } {0 {}}
7ff0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
8000: 2d 31 34 2e 32 2e 32 2e 37 20 7b 0a 20 20 20 20  -14.2.2.7 {.    
8010: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
8020: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
8030: 31 2c 20 4e 55 4c 4c 2c 20 31 29 20 7d 0a 20 20  1, NULL, 1) }.  
8040: 7d 20 7b 7d 0a 0a 20 20 23 20 52 65 70 65 61 74  } {}..  # Repeat
8050: 20 66 6f 72 20 54 45 4d 50 20 74 61 62 6c 65 73   for TEMP tables
8060: 0a 20 20 23 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .  #.  drop_all_
8070: 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74  tables.  do_test
8080: 20 66 6b 65 79 32 2d 31 34 2e 31 74 6d 70 2e 31   fkey2-14.1tmp.1
8090: 20 7b 0a 20 20 20 20 23 20 41 64 64 69 6e 67 20   {.    # Adding 
80a0: 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  a column with a 
80b0: 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73  REFERENCES claus
80c0: 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  e is not support
80d0: 65 64 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ed..    execsql 
80e0: 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  { .      CREATE 
80f0: 54 45 4d 50 20 54 41 42 4c 45 20 74 31 28 61 20  TEMP TABLE t1(a 
8100: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
8110: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
8120: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
8130: 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73      }.    catchs
8140: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
8150: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63   t2 ADD COLUMN c
8160: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d   REFERENCES t1 }
8170: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
8180: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31  _test fkey2-14.1
8190: 74 6d 70 2e 32 20 7b 0a 20 20 20 20 63 61 74 63  tmp.2 {.    catc
81a0: 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  hsql { ALTER TAB
81b0: 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e  LE t2 ADD COLUMN
81c0: 20 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20   d DEFAULT NULL 
81d0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a  REFERENCES t1 }.
81e0: 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f    } {0 {}}.  do_
81f0: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 74  test fkey2-14.1t
8200: 6d 70 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68  mp.3 {.    catch
8210: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
8220: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
8230: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
8240: 44 45 46 41 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20  DEFAULT NULL}.  
8250: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
8260: 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 74 6d 70  st fkey2-14.1tmp
8270: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
8280: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
8290: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 20  t2 ADD COLUMN f 
82a0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45  REFERENCES t1 DE
82b0: 46 41 55 4c 54 20 27 74 65 78 74 27 7d 0a 20 20  FAULT 'text'}.  
82c0: 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64  } {1 {Cannot add
82d0: 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f   a REFERENCES co
82e0: 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55  lumn with non-NU
82f0: 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
8300: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
8310: 79 32 2d 31 34 2e 31 74 6d 70 2e 35 20 7b 0a 20  y2-14.1tmp.5 {. 
8320: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
8330: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
8340: 20 43 4f 4c 55 4d 4e 20 67 20 44 45 46 41 55 4c   COLUMN g DEFAUL
8350: 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 20 52  T CURRENT_TIME R
8360: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
8370: 20 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64   } {1 {Cannot ad
8380: 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  d a REFERENCES c
8390: 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e  olumn with non-N
83a0: 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
83b0: 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  e}}.  do_test fk
83c0: 65 79 32 2d 31 34 2e 31 74 6d 70 2e 36 20 7b 0a  ey2-14.1tmp.6 {.
83d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
83e0: 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65       PRAGMA fore
83f0: 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 66 66 3b 0a  ign_keys = off;.
8400: 20 20 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c        ALTER TABL
8410: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
8420: 68 20 44 45 46 41 55 4c 54 20 27 74 65 78 74 27  h DEFAULT 'text'
8430: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 3b 0a   REFERENCES t1;.
8440: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
8450: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a  eign_keys = on;.
8460: 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c        SELECT sql
8470: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
8480: 70 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  p_master WHERE n
8490: 61 6d 65 3d 27 74 32 27 3b 0a 20 20 20 20 7d 0a  ame='t2';.    }.
84a0: 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42    } {{CREATE TAB
84b0: 4c 45 20 74 32 28 61 2c 20 62 2c 20 63 20 52 45  LE t2(a, b, c RE
84c0: 46 45 52 45 4e 43 45 53 20 74 31 2c 20 64 20 44  FERENCES t1, d D
84d0: 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45  EFAULT NULL REFE
84e0: 52 45 4e 43 45 53 20 74 31 2c 20 65 20 52 45 46  RENCES t1, e REF
84f0: 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41 55  ERENCES t1 DEFAU
8500: 4c 54 20 4e 55 4c 4c 2c 20 68 20 44 45 46 41 55  LT NULL, h DEFAU
8510: 4c 54 20 27 74 65 78 74 27 20 52 45 46 45 52 45  LT 'text' REFERE
8520: 4e 43 45 53 20 74 31 29 7d 7d 0a 0a 20 20 64 6f  NCES t1)}}..  do
8530: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
8540: 74 6d 70 2e 31 2e 31 20 7b 0a 20 20 20 20 74 65  tmp.1.1 {.    te
8550: 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74  st_rename_parent
8560: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
8570: 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  1(a REFERENCES t
8580: 32 29 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b  2)} t2 t3.  } {{
8590: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
85a0: 61 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 33  a REFERENCES "t3
85b0: 22 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ")}}.  do_test f
85c0: 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e 31 2e 32  key2-14.2tmp.1.2
85d0: 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61   {.    test_rena
85e0: 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54  me_parent {CREAT
85f0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46  E TABLE t1(a REF
8600: 45 52 45 4e 43 45 53 20 74 32 29 7d 20 74 34 20  ERENCES t2)} t4 
8610: 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20  t3.  } {{CREATE 
8620: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
8630: 45 4e 43 45 53 20 74 32 29 7d 7d 0a 20 20 64 6f  ENCES t2)}}.  do
8640: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
8650: 74 6d 70 2e 31 2e 33 20 7b 0a 20 20 20 20 74 65  tmp.1.3 {.    te
8660: 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74  st_rename_parent
8670: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
8680: 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 22  1(a REFERENCES "
8690: 74 32 22 29 7d 20 74 32 20 74 33 0a 20 20 7d 20  t2")} t2 t3.  } 
86a0: 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  {{CREATE TABLE t
86b0: 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 22  1(a REFERENCES "
86c0: 74 33 22 29 7d 7d 0a 20 20 0a 20 20 23 20 54 65  t3")}}.  .  # Te
86d0: 73 74 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52  st ALTER TABLE R
86e0: 45 4e 41 4d 45 20 54 41 42 4c 45 20 61 20 62 69  ENAME TABLE a bi
86f0: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
8700: 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e 32   fkey2-14.2tmp.2
8710: 2e 31 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c  .1 {.    drop_al
8720: 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65  l_tables.    exe
8730: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
8740: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
8750: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
8760: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
8770: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
8780: 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28 61 20  TEMP TABLE t2(a 
8790: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
87a0: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 63 20  EFERENCES t1, c 
87b0: 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 3b 0a  REFERENCES t2);.
87c0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
87d0: 50 20 54 41 42 4c 45 20 74 33 28 61 20 52 45 46  P TABLE t3(a REF
87e0: 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45  ERENCES t1, b RE
87f0: 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52  FERENCES t2, c R
8800: 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20  EFERENCES t1);. 
8810: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
8820: 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52   { SELECT sql FR
8830: 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
8840: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
8850: 20 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d 20   = 'table'}.  } 
8860: 5b 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52 45  [list \.    {CRE
8870: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
8880: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
8890: 46 45 52 45 4e 43 45 53 20 74 31 29 7d 20 20 20  FERENCES t1)}   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
88c0: 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41  TABLE t2(a PRIMA
88d0: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
88e0: 4e 43 45 53 20 74 31 2c 20 63 20 52 45 46 45 52  NCES t1, c REFER
88f0: 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20 5c 0a  ENCES t2)}    \.
8900: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
8910: 45 20 74 33 28 61 20 52 45 46 45 52 45 4e 43 45  E t3(a REFERENCE
8920: 53 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43  S t1, b REFERENC
8930: 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e  ES t2, c REFEREN
8940: 43 45 53 20 74 31 29 7d 20 20 5c 0a 20 20 5d 0a  CES t1)}  \.  ].
8950: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
8960: 31 34 2e 32 74 6d 70 2e 32 2e 32 20 7b 0a 20 20  14.2tmp.2.2 {.  
8970: 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54 45    execsql { ALTE
8980: 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d  R TABLE t1 RENAM
8990: 45 20 54 4f 20 74 34 20 7d 0a 20 20 20 20 65 78  E TO t4 }.    ex
89a0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
89b0: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  ql FROM sqlite_t
89c0: 65 6d 70 5f 6d 61 73 74 65 72 20 57 48 45 52 45  emp_master WHERE
89d0: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d   type = 'table'}
89e0: 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20  .  } [list \.   
89f0: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   {CREATE TABLE "
8a00: 74 34 22 28 61 20 50 52 49 4d 41 52 59 20 4b 45  t4"(a PRIMARY KE
8a10: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
8a20: 22 74 34 22 29 7d 20 20 20 20 20 20 20 20 20 20  "t4")}          
8a30: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
8a40: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
8a50: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
8a60: 62 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  b REFERENCES "t4
8a70: 22 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  ", c REFERENCES 
8a80: 74 32 29 7d 20 20 20 20 20 5c 0a 20 20 20 20 7b  t2)}     \.    {
8a90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8aa0: 61 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  a REFERENCES "t4
8ab0: 22 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  ", b REFERENCES 
8ac0: 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t2, c REFERENCES
8ad0: 20 22 74 34 22 29 7d 20 5c 0a 20 20 5d 0a 20 20   "t4")} \.  ].  
8ae0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
8af0: 2e 32 74 6d 70 2e 32 2e 33 20 7b 0a 20 20 20 20  .2tmp.2.3 {.    
8b00: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
8b10: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
8b20: 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 7d 20  (1, 2, 3) }.  } 
8b30: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
8b40: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
8b50: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  d}}.  do_test fk
8b60: 65 79 32 2d 31 34 2e 32 74 6d 70 2e 32 2e 34 20  ey2-14.2tmp.2.4 
8b70: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
8b80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
8b90: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 20 7d  ALUES(1, NULL) }
8ba0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
8bb0: 74 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e  t fkey2-14.2tmp.
8bc0: 32 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73  2.5 {.    catchs
8bd0: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20 53  ql { UPDATE t4 S
8be0: 45 54 20 62 20 3d 20 35 20 7d 0a 20 20 7d 20 7b  ET b = 5 }.  } {
8bf0: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
8c00: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
8c10: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
8c20: 79 32 2d 31 34 2e 32 74 6d 70 2e 32 2e 36 20 7b  y2-14.2tmp.2.6 {
8c30: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
8c40: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20  UPDATE t4 SET b 
8c50: 3d 20 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  = 1 }.  } {0 {}}
8c60: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
8c70: 2d 31 34 2e 32 74 6d 70 2e 32 2e 37 20 7b 0a 20  -14.2tmp.2.7 {. 
8c80: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
8c90: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
8ca0: 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 31 29 20 7d  ES(1, NULL, 1) }
8cb0: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 52 65 70  .  } {}..  # Rep
8cc0: 65 61 74 20 66 6f 72 20 41 54 54 41 43 48 2d 65  eat for ATTACH-e
8cd0: 64 20 74 61 62 6c 65 73 0a 20 20 23 0a 20 20 64  d tables.  #.  d
8ce0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
8cf0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
8d00: 34 2e 31 61 75 78 2e 31 20 7b 0a 20 20 20 20 23  4.1aux.1 {.    #
8d10: 20 41 64 64 69 6e 67 20 61 20 63 6f 6c 75 6d 6e   Adding a column
8d20: 20 77 69 74 68 20 61 20 52 45 46 45 52 45 4e 43   with a REFERENC
8d30: 45 53 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ES clause is not
8d40: 20 73 75 70 70 6f 72 74 65 64 2e 0a 20 20 20 20   supported..    
8d50: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
8d60: 20 41 54 54 41 43 48 20 27 3a 6d 65 6d 6f 72 79   ATTACH ':memory
8d70: 3a 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20  :' AS aux;.     
8d80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
8d90: 78 2e 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  x.t1(a PRIMARY K
8da0: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
8db0: 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61  E TABLE aux.t2(a
8dc0: 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , b);.    }.    
8dd0: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
8de0: 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f   TABLE t2 ADD CO
8df0: 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e 43 45  LUMN c REFERENCE
8e00: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  S t1 }.  } {0 {}
8e10: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
8e20: 32 2d 31 34 2e 31 61 75 78 2e 32 20 7b 0a 20 20  2-14.1aux.2 {.  
8e30: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
8e40: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
8e50: 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c 54  COLUMN d DEFAULT
8e60: 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53   NULL REFERENCES
8e70: 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d   t1 }.  } {0 {}}
8e80: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
8e90: 2d 31 34 2e 31 61 75 78 2e 33 20 7b 0a 20 20 20  -14.1aux.3 {.   
8ea0: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
8eb0: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
8ec0: 4f 4c 55 4d 4e 20 65 20 52 45 46 45 52 45 4e 43  OLUMN e REFERENC
8ed0: 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 4e 55  ES t1 DEFAULT NU
8ee0: 4c 4c 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20  LL}.  } {0 {}}. 
8ef0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
8f00: 34 2e 31 61 75 78 2e 34 20 7b 0a 20 20 20 20 63  4.1aux.4 {.    c
8f10: 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20  atchsql { ALTER 
8f20: 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c  TABLE t2 ADD COL
8f30: 55 4d 4e 20 66 20 52 45 46 45 52 45 4e 43 45 53  UMN f REFERENCES
8f40: 20 74 31 20 44 45 46 41 55 4c 54 20 27 74 65 78   t1 DEFAULT 'tex
8f50: 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43 61 6e 6e  t'}.  } {1 {Cann
8f60: 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45 4e  ot add a REFEREN
8f70: 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  CES column with 
8f80: 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74  non-NULL default
8f90: 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74 65   value}}.  do_te
8fa0: 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78  st fkey2-14.1aux
8fb0: 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .5 {.    catchsq
8fc0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
8fd0: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 67 20  t2 ADD COLUMN g 
8fe0: 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54 5f  DEFAULT CURRENT_
8ff0: 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45 53 20  TIME REFERENCES 
9000: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43 61 6e  t1 }.  } {1 {Can
9010: 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45  not add a REFERE
9020: 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68  NCES column with
9030: 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
9040: 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74  t value}}.  do_t
9050: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75  est fkey2-14.1au
9060: 78 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71  x.6 {.    execsq
9070: 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  l { .      PRAGM
9080: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
9090: 20 6f 66 66 3b 0a 20 20 20 20 20 20 41 4c 54 45   off;.      ALTE
90a0: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
90b0: 4f 4c 55 4d 4e 20 68 20 44 45 46 41 55 4c 54 20  OLUMN h DEFAULT 
90c0: 27 74 65 78 74 27 20 52 45 46 45 52 45 4e 43 45  'text' REFERENCE
90d0: 53 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47  S t1;.      PRAG
90e0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
90f0: 3d 20 6f 6e 3b 0a 20 20 20 20 20 20 53 45 4c 45  = on;.      SELE
9100: 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e  CT sql FROM aux.
9110: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
9120: 45 52 45 20 6e 61 6d 65 3d 27 74 32 27 3b 0a 20  ERE name='t2';. 
9130: 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52 45 41 54     }.  } {{CREAT
9140: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c  E TABLE t2(a, b,
9150: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   c REFERENCES t1
9160: 2c 20 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c  , d DEFAULT NULL
9170: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20   REFERENCES t1, 
9180: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
9190: 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 68 20  DEFAULT NULL, h 
91a0: 44 45 46 41 55 4c 54 20 27 74 65 78 74 27 20 52  DEFAULT 'text' R
91b0: 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d 7d 0a  EFERENCES t1)}}.
91c0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
91d0: 2d 31 34 2e 32 61 75 78 2e 31 2e 31 20 7b 0a 20  -14.2aux.1.1 {. 
91e0: 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70     test_rename_p
91f0: 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20 54 41  arent {CREATE TA
9200: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
9210: 43 45 53 20 74 32 29 7d 20 74 32 20 74 33 0a 20  CES t2)} t2 t3. 
9220: 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c   } {{CREATE TABL
9230: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
9240: 53 20 22 74 33 22 29 7d 7d 0a 20 20 64 6f 5f 74  S "t3")}}.  do_t
9250: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75  est fkey2-14.2au
9260: 78 2e 31 2e 32 20 7b 0a 20 20 20 20 74 65 73 74  x.1.2 {.    test
9270: 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b  _rename_parent {
9280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
9290: 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29  a REFERENCES t2)
92a0: 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b 7b 43 52  } t4 t3.  } {{CR
92b0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
92c0: 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 7d  REFERENCES t2)}}
92d0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
92e0: 2d 31 34 2e 32 61 75 78 2e 31 2e 33 20 7b 0a 20  -14.2aux.1.3 {. 
92f0: 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70     test_rename_p
9300: 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20 54 41  arent {CREATE TA
9310: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
9320: 43 45 53 20 22 74 32 22 29 7d 20 74 32 20 74 33  CES "t2")} t2 t3
9330: 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41  .  } {{CREATE TA
9340: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
9350: 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 0a 20  CES "t3")}}.  . 
9360: 20 23 20 54 65 73 74 20 41 4c 54 45 52 20 54 41   # Test ALTER TA
9370: 42 4c 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45  BLE RENAME TABLE
9380: 20 61 20 62 69 74 2e 0a 20 20 23 0a 20 20 64 6f   a bit..  #.  do
9390: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
93a0: 61 75 78 2e 32 2e 31 20 7b 0a 20 20 20 20 64 72  aux.2.1 {.    dr
93b0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20  op_all_tables.  
93c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
93d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
93e0: 75 78 2e 74 31 28 61 20 50 52 49 4d 41 52 59 20  ux.t1(a PRIMARY 
93f0: 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
9400: 53 20 74 31 29 3b 0a 20 20 20 20 20 20 43 52 45  S t1);.      CRE
9410: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
9420: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
9430: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c  b REFERENCES t1,
9440: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   c REFERENCES t2
9450: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
9460: 54 41 42 4c 45 20 61 75 78 2e 74 33 28 61 20 52  TABLE aux.t3(a R
9470: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20  EFERENCES t1, b 
9480: 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63  REFERENCES t2, c
9490: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b   REFERENCES t1);
94a0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
94b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20  ql { SELECT sql 
94c0: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
94d0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
94e0: 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d  e = 'table'}.  }
94f0: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52   [list \.    {CR
9500: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
9510: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
9520: 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d 20 20  EFERENCES t1)}  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45     \.    {CREATE
9550: 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d   TABLE t2(a PRIM
9560: 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52  ARY KEY, b REFER
9570: 45 4e 43 45 53 20 74 31 2c 20 63 20 52 45 46 45  ENCES t1, c REFE
9580: 52 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20 5c  RENCES t2)}    \
9590: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
95a0: 4c 45 20 74 33 28 61 20 52 45 46 45 52 45 4e 43  LE t3(a REFERENC
95b0: 45 53 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e  ES t1, b REFEREN
95c0: 43 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45  CES t2, c REFERE
95d0: 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a 20 20 5d  NCES t1)}  \.  ]
95e0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
95f0: 2d 31 34 2e 32 61 75 78 2e 32 2e 32 20 7b 0a 20  -14.2aux.2.2 {. 
9600: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54     execsql { ALT
9610: 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41  ER TABLE t1 RENA
9620: 4d 45 20 54 4f 20 74 34 20 7d 0a 20 20 20 20 65  ME TO t4 }.    e
9630: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9640: 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c  sql FROM aux.sql
9650: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
9660: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d   type = 'table'}
9670: 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20  .  } [list \.   
9680: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   {CREATE TABLE "
9690: 74 34 22 28 61 20 50 52 49 4d 41 52 59 20 4b 45  t4"(a PRIMARY KE
96a0: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
96b0: 22 74 34 22 29 7d 20 20 20 20 20 20 20 20 20 20  "t4")}          
96c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
96d0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
96e0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
96f0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  b REFERENCES "t4
9700: 22 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  ", c REFERENCES 
9710: 74 32 29 7d 20 20 20 20 20 5c 0a 20 20 20 20 7b  t2)}     \.    {
9720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
9730: 61 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  a REFERENCES "t4
9740: 22 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  ", b REFERENCES 
9750: 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t2, c REFERENCES
9760: 20 22 74 34 22 29 7d 20 5c 0a 20 20 5d 0a 20 20   "t4")} \.  ].  
9770: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
9780: 2e 32 61 75 78 2e 32 2e 33 20 7b 0a 20 20 20 20  .2aux.2.3 {.    
9790: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
97a0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
97b0: 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 7d 20  (1, 2, 3) }.  } 
97c0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
97d0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
97e0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  d}}.  do_test fk
97f0: 65 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e 34 20  ey2-14.2aux.2.4 
9800: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
9810: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
9820: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 20 7d  ALUES(1, NULL) }
9830: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
9840: 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e  t fkey2-14.2aux.
9850: 32 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73  2.5 {.    catchs
9860: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 34 20 53  ql { UPDATE t4 S
9870: 45 54 20 62 20 3d 20 35 20 7d 0a 20 20 7d 20 7b  ET b = 5 }.  } {
9880: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
9890: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
98a0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
98b0: 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e 36 20 7b  y2-14.2aux.2.6 {
98c0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
98d0: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20  UPDATE t4 SET b 
98e0: 3d 20 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  = 1 }.  } {0 {}}
98f0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
9900: 2d 31 34 2e 32 61 75 78 2e 32 2e 37 20 7b 0a 20  -14.2aux.2.7 {. 
9910: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
9920: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
9930: 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 31 29 20 7d  ES(1, NULL, 1) }
9940: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65  .  } {}.}..do_te
9950: 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 31  st fkey-2.14.3.1
9960: 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
9970: 62 6c 65 73 0a 20 20 65 78 65 63 73 71 6c 20 7b  bles.  execsql {
9980: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9990: 45 20 74 31 28 61 2c 20 62 20 52 45 46 45 52 45  E t1(a, b REFERE
99a0: 4e 43 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65  NCES nosuchtable
99b0: 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  );.    DROP TABL
99c0: 45 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  E t1;.  }.} {}.d
99d0: 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34  o_test fkey-2.14
99e0: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
99f0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
9a00: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
9a10: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e   KEY, b);.    IN
9a20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9a30: 55 45 53 28 27 61 27 2c 20 31 29 3b 0a 20 20 20  UES('a', 1);.   
9a40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
9a50: 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  (x REFERENCES t1
9a60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9a70: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61 27  TO t2 VALUES('a'
9a80: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
9a90: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9aa0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
9ab0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20 7d   DROP TABLE t1 }
9ac0: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
9ad0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
9ae0: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
9af0: 6b 65 79 2d 32 2e 31 34 2e 33 2e 34 20 7b 0a 20  key-2.14.3.4 {. 
9b00: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
9b10: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20  ELETE FROM t2;. 
9b20: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
9b30: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9b40: 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 34  st fkey-2.14.3.4
9b50: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
9b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
9b70: 41 4c 55 45 53 28 27 78 27 29 20 7d 0a 7d 20 7b  ALUES('x') }.} {
9b80: 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
9b90: 3a 20 6d 61 69 6e 2e 74 31 7d 7d 0a 64 6f 5f 74  : main.t1}}.do_t
9ba0: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9bb0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
9bc0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9bd0: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
9be0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
9bf0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78  NTO t1 VALUES('x
9c00: 27 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ');.  }.  execsq
9c10: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
9c20: 74 32 20 56 41 4c 55 45 53 28 27 78 27 29 20 7d  t2 VALUES('x') }
9c30: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
9c40: 65 79 2d 32 2e 31 34 2e 33 2e 36 20 7b 0a 20 20  ey-2.14.3.6 {.  
9c50: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
9c60: 54 41 42 4c 45 20 74 31 20 7d 0a 7d 20 7b 31 20  TABLE t1 }.} {1 
9c70: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
9c80: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
9c90: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
9ca0: 31 34 2e 33 2e 37 20 7b 0a 20 20 65 78 65 63 73  14.3.7 {.  execs
9cb0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
9cc0: 42 4c 45 20 74 32 3b 0a 20 20 20 20 44 52 4f 50  BLE t2;.    DROP
9cd0: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d   TABLE t1;.  }.}
9ce0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
9cf0: 2d 32 2e 31 34 2e 33 2e 38 20 7b 0a 20 20 65 78  -2.14.3.8 {.  ex
9d00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
9d10: 54 45 20 54 41 42 4c 45 20 70 70 28 78 2c 20 79  TE TABLE pp(x, y
9d20: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c  , PRIMARY KEY(x,
9d30: 20 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   y));.    CREATE
9d40: 20 54 41 42 4c 45 20 63 63 28 61 2c 20 62 2c 20   TABLE cc(a, b, 
9d50: 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 2c 20 62  FOREIGN KEY(a, b
9d60: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 70 28  ) REFERENCES pp(
9d70: 78 2c 20 7a 29 29 3b 0a 20 20 7d 0a 20 20 63 61  x, z));.  }.  ca
9d80: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
9d90: 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 31  INTO cc VALUES(1
9da0: 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  , 2) }.} {1 {for
9db0: 65 69 67 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63  eign key mismatc
9dc0: 68 20 2d 20 22 63 63 22 20 72 65 66 65 72 65 6e  h - "cc" referen
9dd0: 63 69 6e 67 20 22 70 70 22 7d 7d 0a 64 6f 5f 74  cing "pp"}}.do_t
9de0: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9df0: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  9 {.  execsql { 
9e00: 44 52 4f 50 20 54 41 42 4c 45 20 63 63 20 7d 0a  DROP TABLE cc }.
9e10: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
9e20: 79 2d 32 2e 31 34 2e 33 2e 31 30 20 7b 0a 20 20  y-2.14.3.10 {.  
9e30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
9e40: 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 61 2c  EATE TABLE cc(a,
9e50: 20 62 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   b, .      FOREI
9e60: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
9e70: 45 52 45 4e 43 45 53 20 70 70 20 44 45 46 45 52  ERENCES pp DEFER
9e80: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
9e90: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
9ea0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
9eb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9ec0: 70 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  pp VALUES('a', '
9ed0: 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
9ee0: 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27  INTO cc VALUES('
9ef0: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 42 45  a', 'b');.    BE
9f00: 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  GIN;.      DROP 
9f10: 54 41 42 4c 45 20 70 70 3b 0a 20 20 20 20 20 20  TABLE pp;.      
9f20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 70 28  CREATE TABLE pp(
9f30: 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  a, b, c, PRIMARY
9f40: 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 20   KEY(b, c));.   
9f50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
9f60: 70 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27 2c  p VALUES(1, 'a',
9f70: 20 27 62 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49   'b');.    COMMI
9f80: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
9f90: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9fa0: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
9fb0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
9fc0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 63 63     DROP TABLE cc
9fd0: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
9fe0: 4c 45 20 70 70 3b 0a 20 20 20 20 43 4f 4d 4d 49  LE pp;.    COMMI
9ff0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
a000: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
a010: 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  12 {.  execsql {
a020: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
a030: 45 20 62 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E b1(a, b);.    
a040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 32 28  CREATE TABLE b2(
a050: 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  a, b REFERENCES 
a060: 62 31 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  b1);.    DROP TA
a070: 42 4c 45 20 62 31 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE b1;.  }.} {}
a080: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
a090: 31 34 2e 33 2e 31 33 20 7b 0a 20 20 65 78 65 63  14.3.13 {.  exec
a0a0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
a0b0: 20 54 41 42 4c 45 20 62 33 28 61 2c 20 62 20 52   TABLE b3(a, b R
a0c0: 45 46 45 52 45 4e 43 45 53 20 62 32 20 44 45 46  EFERENCES b2 DEF
a0d0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
a0e0: 59 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20  Y DEFERRED);.   
a0f0: 20 44 52 4f 50 20 54 41 42 4c 45 20 62 32 3b 0a   DROP TABLE b2;.
a100: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74    }.} {}..# Test
a110: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 67 6f   that nothing go
a120: 65 73 20 77 72 6f 6e 67 20 77 68 65 6e 20 64 72  es wrong when dr
a130: 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 74  opping a table t
a140: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
a150: 76 69 65 77 2e 0a 23 20 4f 72 20 64 72 6f 70 70  view..# Or dropp
a160: 69 6e 67 20 61 20 76 69 65 77 20 74 68 61 74 20  ing a view that 
a170: 61 6e 20 65 78 69 73 74 69 6e 67 20 46 4b 20 28  an existing FK (
a180: 69 6e 63 6f 72 72 65 63 74 6c 79 29 20 72 65 66  incorrectly) ref
a190: 65 72 73 20 74 6f 2e 20 4f 72 20 65 69 74 68 65  ers to. Or eithe
a1a0: 72 0a 23 20 6f 66 20 74 68 65 20 61 62 6f 76 65  r.# of the above
a1b0: 20 73 63 65 6e 61 72 69 6f 73 20 77 69 74 68 20   scenarios with 
a1c0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
a1d0: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
a1e0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
a1f0: 31 34 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  14.4.1 {.  execs
a200: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
a210: 54 41 42 4c 45 20 74 31 28 78 20 52 45 46 45 52  TABLE t1(x REFER
a220: 45 4e 43 45 53 20 76 29 3b 20 0a 20 20 20 20 43  ENCES v); .    C
a230: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20  REATE VIEW v AS 
a240: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
a250: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
a260: 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 34 2e 32  st fkey-2.14.4.2
a270: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
a280: 20 20 20 44 52 4f 50 20 56 49 45 57 20 76 3b 0a     DROP VIEW v;.
a290: 20 20 7d 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62    }.} {}.ifcapab
a2a0: 6c 65 20 76 74 61 62 20 7b 0a 20 20 72 65 67 69  le vtab {.  regi
a2b0: 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65  ster_echo_module
a2c0: 20 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b   db.  do_test fk
a2d0: 65 79 2d 32 2e 31 34 2e 34 2e 33 20 7b 0a 20 20  ey-2.14.4.3 {.  
a2e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
a2f0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
a300: 20 76 20 55 53 49 4e 47 20 65 63 68 6f 28 74 31   v USING echo(t1
a310: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
a320: 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 34  test fkey-2.14.4
a330: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
a340: 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41   {.      DROP TA
a350: 42 4c 45 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d  BLE v;.    }.  }
a360: 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}.}..#--------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3b0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
a3c0: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
a3d0: 35 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 75  5.*, test that u
a3e0: 6e 6e 65 63 65 73 73 61 72 79 20 46 4b 20 72 65  nnecessary FK re
a3f0: 6c 61 74 65 64 20 73 63 61 6e 73 20 0a 23 20 61  lated scans .# a
a400: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 61  nd lookups are a
a410: 76 6f 69 64 65 64 20 77 68 65 6e 20 74 68 65 20  voided when the 
a420: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
a430: 65 72 73 20 61 72 65 20 7a 65 72 6f 2e 0a 23 0a  ers are zero..#.
a440: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
a450: 70 72 6f 63 20 65 78 65 63 73 71 6c 53 20 7b 7a  proc execsqlS {z
a460: 53 71 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73  Sql} {.  set ::s
a470: 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
a480: 6e 74 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 6c  nt 0.  set ::sql
a490: 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 20  ite_found_count 
a4a0: 30 0a 20 20 73 65 74 20 72 65 73 20 5b 75 70 6c  0.  set res [upl
a4b0: 65 76 65 6c 20 5b 6c 69 73 74 20 65 78 65 63 73  evel [list execs
a4c0: 71 6c 20 24 7a 53 71 6c 5d 5d 0a 20 20 63 6f 6e  ql $zSql]].  con
a4d0: 63 61 74 20 5b 65 78 70 72 20 24 3a 3a 73 71 6c  cat [expr $::sql
a4e0: 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 20  ite_found_count 
a4f0: 2b 20 24 3a 3a 73 71 6c 69 74 65 5f 73 65 61 72  + $::sqlite_sear
a500: 63 68 5f 63 6f 75 6e 74 5d 20 24 72 65 73 0a 7d  ch_count] $res.}
a510: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
a520: 35 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.1.1 {.  execsq
a530: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a540: 41 42 4c 45 20 70 70 28 61 20 50 52 49 4d 41 52  ABLE pp(a PRIMAR
a550: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
a560: 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 78  REATE TABLE cc(x
a570: 2c 20 79 20 52 45 46 45 52 45 4e 43 45 53 20 70  , y REFERENCES p
a580: 70 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  p DEFERRABLE INI
a590: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29  TIALLY DEFERRED)
a5a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a5b0: 4f 20 70 70 20 56 41 4c 55 45 53 28 31 2c 20 27  O pp VALUES(1, '
a5c0: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
a5d0: 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53  T INTO pp VALUES
a5e0: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
a5f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
a600: 41 4c 55 45 53 28 27 6e 65 75 6e 67 27 2c 20 31  ALUES('neung', 1
a610: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a620: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27 73 6f  TO cc VALUES('so
a630: 6e 67 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ng', 2);.  }.} {
a640: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
a650: 31 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  15.1.2 {.  execs
a660: 71 6c 53 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  qlS { INSERT INT
a670: 4f 20 70 70 20 56 41 4c 55 45 53 28 33 2c 20 27  O pp VALUES(3, '
a680: 74 68 72 65 65 27 29 20 7d 0a 7d 20 7b 30 7d 0a  three') }.} {0}.
a690: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 35  do_test fkey2-15
a6a0: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
a6b0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
a6c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a6d0: 63 63 20 56 41 4c 55 45 53 28 27 73 65 65 27 2c  cc VALUES('see',
a6e0: 20 34 29 3b 20 20 20 20 2d 2d 20 56 69 6f 6c 61   4);    -- Viola
a6f0: 74 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  tes deferred con
a700: 73 74 72 61 69 6e 74 0a 20 20 7d 0a 20 20 65 78  straint.  }.  ex
a710: 65 63 73 71 6c 53 20 7b 20 49 4e 53 45 52 54 20  ecsqlS { INSERT 
a720: 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28 35  INTO pp VALUES(5
a730: 2c 20 27 66 69 76 65 27 29 20 7d 0a 7d 20 7b 32  , 'five') }.} {2
a740: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
a750: 31 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  15.1.4 {.  execs
a760: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
a770: 20 63 63 20 57 48 45 52 45 20 78 20 3d 20 27 73   cc WHERE x = 's
a780: 65 65 27 20 7d 0a 20 20 65 78 65 63 73 71 6c 53  ee' }.  execsqlS
a790: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70   { INSERT INTO p
a7a0: 70 20 56 41 4c 55 45 53 28 36 2c 20 27 73 69 78  p VALUES(6, 'six
a7b0: 27 29 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  ') }.} {0}.do_te
a7c0: 73 74 20 66 6b 65 79 32 2d 31 35 2e 31 2e 35 20  st fkey2-15.1.5 
a7d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
a7e0: 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  IT.} {}.do_test 
a7f0: 66 6b 65 79 32 2d 31 35 2e 31 2e 36 20 7b 0a 20  fkey2-15.1.6 {. 
a800: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20   execsql BEGIN. 
a810: 20 65 78 65 63 73 71 6c 53 20 7b 0a 20 20 20 20   execsqlS {.    
a820: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 57  DELETE FROM cc W
a830: 48 45 52 45 20 78 20 3d 20 27 6e 65 75 6e 67 27  HERE x = 'neung'
a840: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
a850: 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73    }.} {1}.do_tes
a860: 74 20 66 6b 65 79 32 2d 31 35 2e 31 2e 37 20 7b  t fkey2-15.1.7 {
a870: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
a880: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c    BEGIN;.    DEL
a890: 45 54 45 20 46 52 4f 4d 20 70 70 20 57 48 45 52  ETE FROM pp WHER
a8a0: 45 20 61 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 65  E a = 2;.  }.  e
a8b0: 78 65 63 73 71 6c 53 20 7b 0a 20 20 20 20 44 45  xecsqlS {.    DE
a8c0: 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 57 48 45  LETE FROM cc WHE
a8d0: 52 45 20 78 20 3d 20 27 6e 65 75 6e 67 27 3b 0a  RE x = 'neung';.
a8e0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
a8f0: 7d 0a 7d 20 7b 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {2}..#------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a940: 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65 78 74 20  ---.# This next 
a950: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20  block of tests, 
a960: 66 6b 65 79 32 2d 31 36 2e 2a 2c 20 74 65 73 74  fkey2-16.*, test
a970: 20 74 68 61 74 20 72 6f 77 73 20 74 68 61 74 20   that rows that 
a980: 72 65 66 65 72 20 74 6f 0a 23 20 74 68 65 6d 73  refer to.# thems
a990: 65 6c 76 65 73 20 6d 61 79 20 62 65 20 69 6e 73  elves may be ins
a9a0: 65 72 74 65 64 20 61 6e 64 20 64 65 6c 65 74 65  erted and delete
a9b0: 64 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  d..#.foreach {tn
a9c0: 20 7a 53 63 68 65 6d 61 7d 20 7b 0a 20 20 31 20   zSchema} {.  1 
a9d0: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  { CREATE TABLE s
a9e0: 65 6c 66 28 61 20 49 4e 54 45 47 45 52 20 50 52  elf(a INTEGER PR
a9f0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
aa00: 45 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29  ERENCES self(a))
aa10: 20 7d 0a 20 20 32 20 7b 20 43 52 45 41 54 45 20   }.  2 { CREATE 
aa20: 54 41 42 4c 45 20 73 65 6c 66 28 61 20 50 52 49  TABLE self(a PRI
aa30: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
aa40: 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29 20  RENCES self(a)) 
aa50: 7d 0a 20 20 33 20 7b 20 43 52 45 41 54 45 20 54  }.  3 { CREATE T
aa60: 41 42 4c 45 20 73 65 6c 66 28 61 20 55 4e 49 51  ABLE self(a UNIQ
aa70: 55 45 2c 20 62 20 49 4e 54 45 47 45 52 20 50 52  UE, b INTEGER PR
aa80: 49 4d 41 52 59 20 4b 45 59 20 52 45 46 45 52 45  IMARY KEY REFERE
aa90: 4e 43 45 53 20 73 65 6c 66 28 61 29 29 20 7d 0a  NCES self(a)) }.
aaa0: 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  } {.  drop_all_t
aab0: 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  ables.  do_test 
aac0: 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 31  fkey2-16.1.$tn.1
aad0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24   {.    execsql $
aae0: 7a 53 63 68 65 6d 61 0a 20 20 20 20 65 78 65 63  zSchema.    exec
aaf0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
ab00: 4f 20 73 65 6c 66 20 56 41 4c 55 45 53 28 31 33  O self VALUES(13
ab10: 2c 20 31 33 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20  , 13) }.  } {}. 
ab20: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
ab30: 36 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  6.1.$tn.2 {.    
ab40: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
ab50: 20 73 65 6c 66 20 53 45 54 20 61 20 3d 20 31 34   self SET a = 14
ab60: 2c 20 62 20 3d 20 31 34 20 7d 0a 20 20 7d 20 7b  , b = 14 }.  } {
ab70: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }..  do_test fke
ab80: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 33 20 7b 0a  y2-16.1.$tn.3 {.
ab90: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55      catchsql { U
aba0: 50 44 41 54 45 20 73 65 6c 66 20 53 45 54 20 62  PDATE self SET b
abb0: 20 3d 20 31 35 20 7d 0a 20 20 7d 20 7b 31 20 7b   = 15 }.  } {1 {
abc0: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
abd0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
abe0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
abf0: 2d 31 36 2e 31 2e 24 74 6e 2e 34 20 7b 0a 20 20  -16.1.$tn.4 {.  
ac00: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44    catchsql { UPD
ac10: 41 54 45 20 73 65 6c 66 20 53 45 54 20 61 20 3d  ATE self SET a =
ac20: 20 31 35 20 7d 0a 20 20 7d 20 7b 31 20 7b 46 4f   15 }.  } {1 {FO
ac30: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
ac40: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 20  aint failed}}.. 
ac50: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
ac60: 36 2e 31 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  6.1.$tn.5 {.    
ac70: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
ac80: 45 20 73 65 6c 66 20 53 45 54 20 61 20 3d 20 31  E self SET a = 1
ac90: 35 2c 20 62 20 3d 20 31 36 20 7d 0a 20 20 7d 20  5, b = 16 }.  } 
aca0: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
acb0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
acc0: 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66  d}}..  do_test f
acd0: 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 36 20  key2-16.1.$tn.6 
ace0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
acf0: 20 55 50 44 41 54 45 20 73 65 6c 66 20 53 45 54   UPDATE self SET
ad00: 20 61 20 3d 20 31 37 2c 20 62 20 3d 20 31 37 20   a = 17, b = 17 
ad10: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20  }.  } {0 {}}..  
ad20: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 36  do_test fkey2-16
ad30: 2e 31 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 65  .1.$tn.7 {.    e
ad40: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
ad50: 46 52 4f 4d 20 73 65 6c 66 20 7d 0a 20 20 7d 20  FROM self }.  } 
ad60: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  {}.  do_test fke
ad70: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 38 20 7b 0a  y2-16.1.$tn.8 {.
ad80: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
ad90: 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 20  NSERT INTO self 
ada0: 56 41 4c 55 45 53 28 32 30 2c 20 32 31 29 20 7d  VALUES(20, 21) }
adb0: 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  .  } {1 {FOREIGN
adc0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
add0: 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d  failed}}.}..#---
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65  ------.# This ne
ae30: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  xt block of test
ae40: 73 2c 20 66 6b 65 79 32 2d 31 37 2e 2a 2c 20 74  s, fkey2-17.*, t
ae50: 65 73 74 73 20 74 68 61 74 20 69 66 20 22 50 52  ests that if "PR
ae60: 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67  AGMA count_chang
ae70: 65 73 22 0a 23 20 69 73 20 74 75 72 6e 65 64 20  es".# is turned 
ae80: 6f 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  on statements th
ae90: 61 74 20 76 69 6f 6c 61 74 65 20 69 6d 6d 65 64  at violate immed
aea0: 69 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69  iate FK constrai
aeb0: 6e 74 73 20 72 65 74 75 72 6e 0a 23 20 53 51 4c  nts return.# SQL
aec0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 69  ITE_CONSTRAINT i
aed0: 6d 6d 65 64 69 61 74 65 6c 79 2c 20 6e 6f 74 20  mmediately, not 
aee0: 61 66 74 65 72 20 72 65 74 75 72 6e 69 6e 67 20  after returning 
aef0: 61 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  a number of rows
af00: 2e 0a 23 20 57 68 65 72 65 61 73 20 73 74 61 74  ..# Whereas stat
af10: 65 6d 65 6e 74 73 20 74 68 61 74 20 76 69 6f 6c  ements that viol
af20: 61 74 65 20 64 65 66 65 72 72 65 64 20 46 4b 20  ate deferred FK 
af30: 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 74 75  constraints retu
af40: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 23 20  rn the number.# 
af50: 6f 66 20 72 6f 77 73 20 62 65 66 6f 72 65 20 66  of rows before f
af60: 61 69 6c 69 6e 67 2e 0a 23 0a 23 20 41 6c 73 6f  ailing..#.# Also
af70: 20 74 65 73 74 20 74 68 61 74 20 72 6f 77 73 20   test that rows 
af80: 6d 6f 64 69 66 69 65 64 20 62 79 20 46 4b 20 61  modified by FK a
af90: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 63  ctions are not c
afa0: 6f 75 6e 74 65 64 20 69 6e 20 65 69 74 68 65 72  ounted in either
afb0: 20 74 68 65 0a 23 20 72 65 74 75 72 6e 65 64 20   the.# returned 
afc0: 72 6f 77 20 63 6f 75 6e 74 20 6f 72 20 74 68 65  row count or the
afd0: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
afe0: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 68 61 6e   by sqlite3_chan
aff0: 67 65 73 28 29 2e 20 4c 69 6b 65 0a 23 20 74 72  ges(). Like.# tr
b000: 69 67 67 65 72 20 72 65 6c 61 74 65 64 20 63 68  igger related ch
b010: 61 6e 67 65 73 2c 20 74 68 65 79 20 61 72 65 20  anges, they are 
b020: 69 6e 63 6c 75 64 65 64 20 69 6e 20 73 71 6c 69  included in sqli
b030: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
b040: 73 28 29 20 74 68 6f 75 67 68 2e 0a 23 0a 64 72  s() though..#.dr
b050: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
b060: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31  _test fkey2-17.1
b070: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
b080: 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68   PRAGMA count_ch
b090: 61 6e 67 65 73 20 3d 20 31 20 7d 0a 20 20 65 78  anges = 1 }.  ex
b0a0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45  ecsql { .    CRE
b0b0: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 2c  ATE TABLE one(a,
b0c0: 20 62 2c 20 63 2c 20 55 4e 49 51 55 45 28 62 2c   b, c, UNIQUE(b,
b0d0: 20 63 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   c));.    CREATE
b0e0: 20 54 41 42 4c 45 20 74 77 6f 28 64 2c 20 65 2c   TABLE two(d, e,
b0f0: 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   f, FOREIGN KEY(
b100: 65 2c 20 66 29 20 52 45 46 45 52 45 4e 43 45 53  e, f) REFERENCES
b110: 20 6f 6e 65 28 62 2c 20 63 29 29 3b 0a 20 20 20   one(b, c));.   
b120: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
b130: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
b140: 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ;.  }.} {1}.do_t
b150: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 32  est fkey2-17.1.2
b160: 20 7b 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73   {.  set STMT [s
b170: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
b180: 32 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54  2 db "INSERT INT
b190: 4f 20 74 77 6f 20 56 41 4c 55 45 53 28 34 2c 20  O two VALUES(4, 
b1a0: 35 2c 20 36 29 22 20 2d 31 20 64 75 6d 6d 79 5d  5, 6)" -1 dummy]
b1b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
b1c0: 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f  $STMT.} {SQLITE_
b1d0: 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72 69  CONSTRAINT}.veri
b1e0: 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 66 6b  fy_ex_errcode fk
b1f0: 65 79 32 2d 31 37 2e 31 2e 32 62 20 53 51 4c 49  ey2-17.1.2b SQLI
b200: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
b210: 52 45 49 47 4e 4b 45 59 0a 69 66 63 61 70 61 62  REIGNKEY.ifcapab
b220: 6c 65 20 61 75 74 6f 72 65 73 65 74 20 7b 0a 20  le autoreset {. 
b230: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
b240: 37 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69  7.1.3 {.    sqli
b250: 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20  te3_step $STMT. 
b260: 20 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54   } {SQLITE_CONST
b270: 52 41 49 4e 54 7d 0a 20 20 76 65 72 69 66 79 5f  RAINT}.  verify_
b280: 65 78 5f 65 72 72 63 6f 64 65 20 66 6b 65 79 32  ex_errcode fkey2
b290: 2d 31 37 2e 31 2e 33 62 20 53 51 4c 49 54 45 5f  -17.1.3b SQLITE_
b2a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
b2b0: 47 4e 4b 45 59 0a 7d 20 65 6c 73 65 20 7b 0a 20  GNKEY.} else {. 
b2c0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
b2d0: 37 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69  7.1.3 {.    sqli
b2e0: 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 20  te3_step $STMT. 
b2f0: 20 7d 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55 53   } {SQLITE_MISUS
b300: 45 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  E}.}.do_test fke
b310: 79 32 2d 31 37 2e 31 2e 34 20 7b 0a 20 20 73 71  y2-17.1.4 {.  sq
b320: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
b330: 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 43  STMT.} {SQLITE_C
b340: 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72 69 66  ONSTRAINT}.verif
b350: 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 66 6b 65  y_ex_errcode fke
b360: 79 32 2d 31 37 2e 31 2e 34 62 20 53 51 4c 49 54  y2-17.1.4b SQLIT
b370: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
b380: 45 49 47 4e 4b 45 59 0a 64 6f 5f 74 65 73 74 20  EIGNKEY.do_test 
b390: 66 6b 65 79 32 2d 31 37 2e 31 2e 35 20 7b 0a 20  fkey2-17.1.5 {. 
b3a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
b3b0: 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56  NSERT INTO one V
b3c0: 41 4c 55 45 53 28 32 2c 20 33 2c 20 34 29 3b 0a  ALUES(2, 3, 4);.
b3d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b3e0: 6f 6e 65 20 56 41 4c 55 45 53 28 33 2c 20 34 2c  one VALUES(3, 4,
b3f0: 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   5);.    INSERT 
b400: 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45 53 28  INTO two VALUES(
b410: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
b420: 53 45 52 54 20 49 4e 54 4f 20 74 77 6f 20 56 41  SERT INTO two VA
b430: 4c 55 45 53 28 32 2c 20 33 2c 20 34 29 3b 0a 20  LUES(2, 3, 4);. 
b440: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b450: 77 6f 20 56 41 4c 55 45 53 28 33 2c 20 34 2c 20  wo VALUES(3, 4, 
b460: 35 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 31  5);.  }.} {1 1 1
b470: 20 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b   1 1}.do_test fk
b480: 65 79 32 2d 31 37 2e 31 2e 36 20 7b 0a 20 20 63  ey2-17.1.6 {.  c
b490: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 42 45  atchsql {.    BE
b4a0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
b4b0: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
b4c0: 53 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  S(0, 0, 0);.    
b4d0: 20 20 55 50 44 41 54 45 20 74 77 6f 20 53 45 54    UPDATE two SET
b4e0: 20 65 3d 65 2b 31 2c 20 66 3d 66 2b 31 3b 0a 20   e=e+1, f=f+1;. 
b4f0: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
b500: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
b510: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
b520: 20 66 6b 65 79 32 2d 31 37 2e 31 2e 37 20 7b 0a   fkey2-17.1.7 {.
b530: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
b540: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 20 7d 0a  CT * FROM one }.
b550: 7d 20 7b 31 20 32 20 33 20 32 20 33 20 34 20 33  } {1 2 3 2 3 4 3
b560: 20 34 20 35 20 30 20 30 20 30 7d 0a 64 6f 5f 74   4 5 0 0 0}.do_t
b570: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 38  est fkey2-17.1.8
b580: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
b590: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
b5a0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20 33 20   }.} {1 2 3 2 3 
b5b0: 34 20 33 20 34 20 35 7d 0a 64 6f 5f 74 65 73 74  4 3 4 5}.do_test
b5c0: 20 66 6b 65 79 32 2d 31 37 2e 31 2e 39 20 7b 0a   fkey2-17.1.9 {.
b5d0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
b5e0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
b5f0: 65 79 32 2d 31 37 2e 31 2e 31 30 20 7b 0a 20 20  ey2-17.1.10 {.  
b600: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
b610: 45 41 54 45 20 54 41 42 4c 45 20 74 68 72 65 65  EATE TABLE three
b620: 28 0a 20 20 20 20 20 20 67 2c 20 68 2c 20 69 2c  (.      g, h, i,
b630: 20 0a 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20   .      FOREIGN 
b640: 4b 45 59 28 68 2c 20 69 29 20 52 45 46 45 52 45  KEY(h, i) REFERE
b650: 4e 43 45 53 20 6f 6e 65 28 62 2c 20 63 29 20 44  NCES one(b, c) D
b660: 45 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41  EFERRABLE INITIA
b670: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 20  LLY DEFERRED.   
b680: 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   );.  }.} {}.do_
b690: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e  test fkey2-17.1.
b6a0: 31 31 20 7b 0a 20 20 73 65 74 20 53 54 4d 54 20  11 {.  set STMT 
b6b0: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
b6c0: 5f 76 32 20 64 62 20 22 49 4e 53 45 52 54 20 49  _v2 db "INSERT I
b6d0: 4e 54 4f 20 74 68 72 65 65 20 56 41 4c 55 45 53  NTO three VALUES
b6e0: 28 37 2c 20 38 2c 20 39 29 22 20 2d 31 20 64 75  (7, 8, 9)" -1 du
b6f0: 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73  mmy].  sqlite3_s
b700: 74 65 70 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c  tep $STMT.} {SQL
b710: 49 54 45 5f 52 4f 57 7d 0a 64 6f 5f 74 65 73 74  ITE_ROW}.do_test
b720: 20 66 6b 65 79 32 2d 31 37 2e 31 2e 31 32 20 7b   fkey2-17.1.12 {
b730: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .  sqlite3_colum
b740: 6e 5f 74 65 78 74 20 24 53 54 4d 54 20 30 0a 7d  n_text $STMT 0.}
b750: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65   {1}.do_test fke
b760: 79 32 2d 31 37 2e 31 2e 31 33 20 7b 0a 20 20 73  y2-17.1.13 {.  s
b770: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d  qlite3_step $STM
b780: 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53  T.} {SQLITE_CONS
b790: 54 52 41 49 4e 54 7d 0a 76 65 72 69 66 79 5f 65  TRAINT}.verify_e
b7a0: 78 5f 65 72 72 63 6f 64 65 20 66 6b 65 79 32 2d  x_errcode fkey2-
b7b0: 31 37 2e 31 2e 31 33 62 20 53 51 4c 49 54 45 5f  17.1.13b SQLITE_
b7c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
b7d0: 47 4e 4b 45 59 0a 64 6f 5f 74 65 73 74 20 66 6b  GNKEY.do_test fk
b7e0: 65 79 32 2d 31 37 2e 31 2e 31 34 20 7b 0a 20 20  ey2-17.1.14 {.  
b7f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b800: 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45   $STMT.} {SQLITE
b810: 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72  _CONSTRAINT}.ver
b820: 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 66  ify_ex_errcode f
b830: 6b 65 79 32 2d 31 37 2e 31 2e 31 34 62 20 53 51  key2-17.1.14b SQ
b840: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b850: 46 4f 52 45 49 47 4e 4b 45 59 0a 0a 64 72 6f 70  FOREIGNKEY..drop
b860: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
b870: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 31  est fkey2-17.2.1
b880: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
b890: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b8a0: 68 69 67 68 28 22 61 27 62 21 22 20 50 52 49 4d  high("a'b!" PRIM
b8b0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
b8c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
b8d0: 77 28 0a 20 20 20 20 20 20 63 2c 20 0a 20 20 20  w(.      c, .   
b8e0: 20 20 20 22 64 26 36 22 20 52 45 46 45 52 45 4e     "d&6" REFEREN
b8f0: 43 45 53 20 68 69 67 68 20 4f 4e 20 55 50 44 41  CES high ON UPDA
b900: 54 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45  TE CASCADE ON DE
b910: 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20 20 20  LETE CASCADE.   
b920: 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   );.  }.} {}.do_
b930: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e  test fkey2-17.2.
b940: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
b950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b960: 68 69 67 68 20 56 41 4c 55 45 53 28 27 61 27 2c  high VALUES('a',
b970: 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
b980: 54 20 49 4e 54 4f 20 6c 6f 77 20 56 41 4c 55 45  T INTO low VALUE
b990: 53 28 27 62 27 2c 20 27 61 27 29 3b 0a 20 20 7d  S('b', 'a');.  }
b9a0: 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  .  db changes.} 
b9b0: 7b 31 7d 0a 73 65 74 20 6e 54 6f 74 61 6c 20 5b  {1}.set nTotal [
b9c0: 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
b9d0: 5d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  ].do_test fkey2-
b9e0: 31 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  17.2.3 {.  execs
b9f0: 71 6c 20 7b 20 55 50 44 41 54 45 20 68 69 67 68  ql { UPDATE high
ba00: 20 53 45 54 20 22 61 27 62 21 22 20 3d 20 27 63   SET "a'b!" = 'c
ba10: 27 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ' }.} {1}.do_tes
ba20: 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e 34 20 7b  t fkey2-17.2.4 {
ba30: 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  .  db changes.} 
ba40: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  {1}.do_test fkey
ba50: 32 2d 31 37 2e 32 2e 35 20 7b 0a 20 20 65 78 70  2-17.2.5 {.  exp
ba60: 72 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e  r [db total_chan
ba70: 67 65 73 5d 20 2d 20 24 6e 54 6f 74 61 6c 0a 7d  ges] - $nTotal.}
ba80: 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65   {2}.do_test fke
ba90: 79 32 2d 31 37 2e 32 2e 36 20 7b 0a 20 20 65 78  y2-17.2.6 {.  ex
baa0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
bab0: 20 46 52 4f 4d 20 68 69 67 68 20 3b 20 53 45 4c   FROM high ; SEL
bac0: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 77 20 7d  ECT * FROM low }
bad0: 0a 7d 20 7b 63 20 62 20 62 20 63 7d 0a 64 6f 5f  .} {c b b c}.do_
bae0: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 32 2e  test fkey2-17.2.
baf0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
bb00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 68 69 67 68  DELETE FROM high
bb10: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
bb20: 20 66 6b 65 79 32 2d 31 37 2e 32 2e 38 20 7b 0a   fkey2-17.2.8 {.
bb30: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b    db changes.} {
bb40: 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  1}.do_test fkey2
bb50: 2d 31 37 2e 32 2e 39 20 7b 0a 20 20 65 78 70 72  -17.2.9 {.  expr
bb60: 20 5b 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   [db total_chang
bb70: 65 73 5d 20 2d 20 24 6e 54 6f 74 61 6c 0a 7d 20  es] - $nTotal.} 
bb80: 7b 34 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  {4}.do_test fkey
bb90: 32 2d 31 37 2e 32 2e 31 30 20 7b 0a 20 20 65 78  2-17.2.10 {.  ex
bba0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
bbb0: 20 46 52 4f 4d 20 68 69 67 68 20 3b 20 53 45 4c   FROM high ; SEL
bbc0: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 77 20 7d  ECT * FROM low }
bbd0: 0a 7d 20 7b 7d 0a 65 78 65 63 73 71 6c 20 7b 20  .} {}.execsql { 
bbe0: 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61  PRAGMA count_cha
bbf0: 6e 67 65 73 20 3d 20 30 20 7d 0a 0a 23 2d 2d 2d  nges = 0 }..#---
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
bc50: 61 74 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61  at the authoriza
bc60: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 6f  tion callback wo
bc70: 72 6b 73 2e 0a 23 0a 0a 69 66 63 61 70 61 62 6c  rks..#..ifcapabl
bc80: 65 20 61 75 74 68 20 7b 0a 20 20 64 6f 5f 74 65  e auth {.  do_te
bc90: 73 74 20 66 6b 65 79 32 2d 31 38 2e 31 20 7b 0a  st fkey2-18.1 {.
bca0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
bcb0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
bcc0: 20 6c 6f 6e 67 28 61 2c 20 62 20 50 52 49 4d 41   long(a, b PRIMA
bcd0: 52 59 20 4b 45 59 2c 20 63 29 3b 0a 20 20 20 20  RY KEY, c);.    
bce0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73    CREATE TABLE s
bcf0: 68 6f 72 74 28 64 2c 20 65 2c 20 66 20 52 45 46  hort(d, e, f REF
bd00: 45 52 45 4e 43 45 53 20 6c 6f 6e 67 29 3b 0a 20  ERENCES long);. 
bd10: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
bd20: 45 20 6d 69 64 28 67 2c 20 68 2c 20 69 20 52 45  E mid(g, h, i RE
bd30: 46 45 52 45 4e 43 45 53 20 6c 6f 6e 67 20 44 45  FERENCES long DE
bd40: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
bd50: 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20  LY DEFERRED);.  
bd60: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 70 72    }.  } {}..  pr
bd70: 6f 63 20 61 75 74 68 20 7b 61 72 67 73 7d 20 7b  oc auth {args} {
bd80: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 61  eval lappend ::a
bd90: 75 74 68 61 72 67 73 20 5b 6c 72 61 6e 67 65 20  uthargs [lrange 
bda0: 24 61 72 67 73 20 30 20 34 5d 3b 20 72 65 74 75  $args 0 4]; retu
bdb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20  rn SQLITE_OK}.  
bdc0: 64 62 20 61 75 74 68 20 61 75 74 68 0a 0a 20 20  db auth auth..  
bdd0: 23 20 41 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74  # An insert on t
bde0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
bdf0: 6d 75 73 74 20 72 65 61 64 20 74 68 65 20 63 68  must read the ch
be00: 69 6c 64 20 6b 65 79 20 6f 66 20 61 6e 79 20 64  ild key of any d
be10: 65 66 65 72 72 65 64 0a 20 20 23 20 66 6f 72 65  eferred.  # fore
be20: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
be30: 6e 74 73 2e 20 42 75 74 20 6e 6f 74 20 74 68 65  nts. But not the
be40: 20 63 68 69 6c 64 20 6b 65 79 20 6f 66 20 69 6d   child key of im
be50: 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69  mediate constrai
be60: 6e 74 73 2e 0a 20 20 73 65 74 20 61 75 74 68 61  nts..  set autha
be70: 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  rgs {}.  do_test
be80: 20 66 6b 65 79 32 2d 31 38 2e 32 20 7b 0a 20 20   fkey2-18.2 {.  
be90: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
bea0: 52 54 20 49 4e 54 4f 20 6c 6f 6e 67 20 56 41 4c  RT INTO long VAL
beb0: 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20  UES(1, 2, 3) }. 
bec0: 20 20 20 73 65 74 20 61 75 74 68 61 72 67 73 0a     set authargs.
bed0: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45    } {SQLITE_INSE
bee0: 52 54 20 6c 6f 6e 67 20 7b 7d 20 6d 61 69 6e 20  RT long {} main 
bef0: 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6d  {} SQLITE_READ m
bf00: 69 64 20 69 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20  id i main {}}.. 
bf10: 20 23 20 41 6e 20 69 6e 73 65 72 74 20 6f 6e 20   # An insert on 
bf20: 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
bf30: 6f 66 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  of an immediate 
bf40: 63 6f 6e 73 74 72 61 69 6e 74 20 6d 75 73 74 20  constraint must 
bf50: 72 65 61 64 20 74 68 65 0a 20 20 23 20 70 61 72  read the.  # par
bf60: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
bf70: 28 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73  (to see if it is
bf80: 20 61 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 72 20   a violation or 
bf90: 6e 6f 74 29 2e 0a 20 20 73 65 74 20 61 75 74 68  not)..  set auth
bfa0: 61 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  args {}.  do_tes
bfb0: 74 20 66 6b 65 79 32 2d 31 38 2e 33 20 7b 0a 20  t fkey2-18.3 {. 
bfc0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
bfd0: 45 52 54 20 49 4e 54 4f 20 73 68 6f 72 74 20 56  ERT INTO short V
bfe0: 41 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d  ALUES(1, 3, 2) }
bff0: 0a 20 20 20 20 73 65 74 20 61 75 74 68 61 72 67  .    set autharg
c000: 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e  s.  } {SQLITE_IN
c010: 53 45 52 54 20 73 68 6f 72 74 20 7b 7d 20 6d 61  SERT short {} ma
c020: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
c030: 44 20 6c 6f 6e 67 20 62 20 6d 61 69 6e 20 7b 7d  D long b main {}
c040: 7d 0a 20 20 0a 20 20 23 20 41 73 20 6d 75 73 74  }.  .  # As must
c050: 20 61 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74 68   an insert on th
c060: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6f 66  e child table of
c070: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
c080: 74 72 61 69 6e 74 2e 0a 20 20 73 65 74 20 61 75  traint..  set au
c090: 74 68 61 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74  thargs {}.  do_t
c0a0: 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 34 20 7b  est fkey2-18.4 {
c0b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
c0c0: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 69 64 20 56  NSERT INTO mid V
c0d0: 41 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d  ALUES(1, 3, 2) }
c0e0: 0a 20 20 20 20 73 65 74 20 61 75 74 68 61 72 67  .    set autharg
c0f0: 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e  s.  } {SQLITE_IN
c100: 53 45 52 54 20 6d 69 64 20 7b 7d 20 6d 61 69 6e  SERT mid {} main
c110: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
c120: 6c 6f 6e 67 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a  long b main {}}.
c130: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
c140: 2d 31 38 2e 35 20 7b 0a 20 20 20 20 65 78 65 63  -18.5 {.    exec
c150: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
c160: 54 45 20 54 41 42 4c 45 20 6e 6f 75 67 68 74 28  TE TABLE nought(
c170: 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59  a, b PRIMARY KEY
c180: 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , c);.      CREA
c190: 54 45 20 54 41 42 4c 45 20 63 72 6f 73 73 28 64  TE TABLE cross(d
c1a0: 2c 20 65 2c 20 66 2c 0a 20 20 20 20 20 20 20 20  , e, f,.        
c1b0: 46 4f 52 45 49 47 4e 20 4b 45 59 28 65 29 20 52  FOREIGN KEY(e) R
c1c0: 45 46 45 52 45 4e 43 45 53 20 6e 6f 75 67 68 74  EFERENCES nought
c1d0: 28 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41  (b) ON UPDATE CA
c1e0: 53 43 41 44 45 0a 20 20 20 20 20 20 29 3b 0a 20  SCADE.      );. 
c1f0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
c200: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e   { INSERT INTO n
c210: 6f 75 67 68 74 20 56 41 4c 55 45 53 28 32 2c 20  ought VALUES(2, 
c220: 31 2c 20 32 29 20 7d 0a 20 20 20 20 65 78 65 63  1, 2) }.    exec
c230: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
c240: 4f 20 63 72 6f 73 73 20 56 41 4c 55 45 53 28 30  O cross VALUES(0
c250: 2c 20 31 2c 20 30 29 20 7d 0a 20 20 20 20 73 65  , 1, 0) }.    se
c260: 74 20 61 75 74 68 61 72 67 73 20 5b 6c 69 73 74  t authargs [list
c270: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ].    execsql { 
c280: 55 50 44 41 54 45 20 6e 6f 75 67 68 74 20 53 45  UPDATE nought SE
c290: 54 20 62 20 3d 20 35 20 7d 0a 20 20 20 20 73 65  T b = 5 }.    se
c2a0: 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d 20 7b  t authargs.  } {
c2b0: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6e 6f  SQLITE_UPDATE 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 63 72 6f 73 73  QLITE_READ cross
c2e0: 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54   e main {} SQLIT
c2f0: 45 5f 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d  E_READ cross e m
c300: 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45  ain {} SQLITE_RE
c310: 41 44 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e  AD nought b main
c320: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
c330: 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d  nought b main {}
c340: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f 75   SQLITE_READ nou
c350: 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53 51  ght b main {} SQ
c360: 4c 49 54 45 5f 55 50 44 41 54 45 20 63 72 6f 73  LITE_UPDATE cros
c370: 73 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49  s e main {} SQLI
c380: 54 45 5f 52 45 41 44 20 6e 6f 75 67 68 74 20 62  TE_READ nought b
c390: 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f   main {} SQLITE_
c3a0: 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d 61 69  READ cross e mai
c3b0: 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44  n {} SQLITE_READ
c3c0: 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b   nought b main {
c3d0: 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f  } SQLITE_READ no
c3e0: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a  ught b main {}}.
c3f0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
c400: 2d 31 38 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  -18.6 {.    exec
c410: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
c420: 4f 4d 20 63 72 6f 73 73 7d 0a 20 20 7d 20 7b 30  OM cross}.  } {0
c430: 20 35 20 30 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   5 0}..  do_test
c440: 20 66 6b 65 79 32 2d 31 38 2e 37 20 7b 0a 20 20   fkey2-18.7 {.  
c450: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
c460: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
c470: 6e 65 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  ne(a INTEGER PRI
c480: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
c490: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
c4a0: 20 74 77 6f 28 62 2c 20 63 20 52 45 46 45 52 45   two(b, c REFERE
c4b0: 4e 43 45 53 20 6f 6e 65 29 3b 0a 20 20 20 20 20  NCES one);.     
c4c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
c4d0: 20 56 41 4c 55 45 53 28 31 30 31 2c 20 31 30 32   VALUES(101, 102
c4e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  );.    }.    set
c4f0: 20 61 75 74 68 61 72 67 73 20 5b 6c 69 73 74 5d   authargs [list]
c500: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
c510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 77 6f 20 56  NSERT INTO two V
c520: 41 4c 55 45 53 28 31 30 30 2c 20 31 30 31 29 3b  ALUES(100, 101);
c530: 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74 68 61   }.    set autha
c540: 72 67 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  rgs.  } {SQLITE_
c550: 49 4e 53 45 52 54 20 74 77 6f 20 7b 7d 20 6d 61  INSERT two {} ma
c560: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
c570: 44 20 6f 6e 65 20 61 20 6d 61 69 6e 20 7b 7d 7d  D one a main {}}
c580: 0a 0a 20 20 23 20 52 65 74 75 72 6e 20 53 51 4c  ..  # Return SQL
c590: 49 54 45 5f 49 47 4e 4f 52 45 20 74 6f 20 72 65  ITE_IGNORE to re
c5a0: 71 75 65 73 74 73 20 74 6f 20 72 65 61 64 20 66  quests to read f
c5b0: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74  rom the parent t
c5c0: 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 23 20 63  able. This.  # c
c5d0: 61 75 73 65 73 20 69 6e 73 65 72 74 73 20 6f 66  auses inserts of
c5e0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 6b 65 79 73 20 69   non-NULL keys i
c5f0: 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 20 74 61  nto the child ta
c600: 62 6c 65 20 74 6f 20 66 61 69 6c 2e 0a 20 20 23  ble to fail..  #
c610: 0a 20 20 72 65 6e 61 6d 65 20 61 75 74 68 20 7b  .  rename auth {
c620: 7d 0a 20 20 70 72 6f 63 20 61 75 74 68 20 7b 61  }.  proc auth {a
c630: 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  rgs} {.    if {[
c640: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 31 5d 20  lindex $args 1] 
c650: 3d 3d 20 22 6c 6f 6e 67 22 7d 20 7b 72 65 74 75  == "long"} {retu
c660: 72 6e 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  rn SQLITE_IGNORE
c670: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
c680: 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 64 6f 5f  ITE_OK.  }.  do_
c690: 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 38 20  test fkey2-18.8 
c6a0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
c6b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 68 6f   INSERT INTO sho
c6c0: 72 74 20 56 41 4c 55 45 53 28 31 2c 20 33 2c 20  rt VALUES(1, 3, 
c6d0: 32 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 46 4f 52  2) }.  } {1 {FOR
c6e0: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
c6f0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64  int failed}}.  d
c700: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e  o_test fkey2-18.
c710: 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  9 {.    execsql 
c720: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 68  { INSERT INTO sh
c730: 6f 72 74 20 56 41 4c 55 45 53 28 31 2c 20 33 2c  ort VALUES(1, 3,
c740: 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a   NULL) }.  } {}.
c750: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
c760: 31 38 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63  18.10 {.    exec
c770: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
c780: 52 4f 4d 20 73 68 6f 72 74 20 7d 0a 20 20 7d 20  ROM short }.  } 
c790: 7b 31 20 33 20 32 20 31 20 33 20 7b 7d 7d 0a 20  {1 3 2 1 3 {}}. 
c7a0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
c7b0: 38 2e 31 31 20 7b 0a 20 20 20 20 63 61 74 63 68  8.11 {.    catch
c7c0: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73 68 6f  sql { UPDATE sho
c7d0: 72 74 20 53 45 54 20 66 20 3d 20 32 20 57 48 45  rt SET f = 2 WHE
c7e0: 52 45 20 66 20 49 53 20 4e 55 4c 4c 20 7d 0a 20  RE f IS NULL }. 
c7f0: 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b   } {1 {FOREIGN K
c800: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
c810: 69 6c 65 64 7d 7d 0a 0a 20 20 64 62 20 61 75 74  iled}}..  db aut
c820: 68 20 7b 7d 0a 20 20 75 6e 73 65 74 20 61 75 74  h {}.  unset aut
c830: 68 61 72 67 73 0a 7d 0a 0a 0a 64 6f 5f 74 65 73  hargs.}...do_tes
c840: 74 20 66 6b 65 79 32 2d 31 39 2e 31 20 7b 0a 20  t fkey2-19.1 {. 
c850: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
c860: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
c870: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
c880: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52  ARY KEY);.    CR
c890: 45 41 54 45 20 54 41 42 4c 45 20 73 75 62 28 69  EATE TABLE sub(i
c8a0: 64 20 49 4e 54 20 52 45 46 45 52 45 4e 43 45 53  d INT REFERENCES
c8b0: 20 6d 61 69 6e 28 69 64 29 29 3b 0a 20 20 20 20   main(id));.    
c8c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e  INSERT INTO main
c8d0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
c8e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e  INSERT INTO main
c8f0: 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20   VALUES(2);.    
c900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 75 62 20  INSERT INTO sub 
c910: 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 7d 0a 7d  VALUES(2);.  }.}
c920: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
c930: 32 2d 31 39 2e 32 20 7b 0a 20 20 73 65 74 20 53  2-19.2 {.  set S
c940: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
c950: 65 5f 76 32 20 64 62 20 22 44 45 4c 45 54 45 20  e_v2 db "DELETE 
c960: 46 52 4f 4d 20 6d 61 69 6e 20 57 48 45 52 45 20  FROM main WHERE 
c970: 69 64 20 3d 20 3f 22 20 2d 31 20 64 75 6d 6d 79  id = ?" -1 dummy
c980: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ].  sqlite3_bind
c990: 5f 69 6e 74 20 24 53 20 31 20 32 0a 20 20 73 71  _int $S 1 2.  sq
c9a0: 6c 69 74 65 33 5f 73 74 65 70 20 24 53 0a 7d 20  lite3_step $S.} 
c9b0: 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  {SQLITE_CONSTRAI
c9c0: 4e 54 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72  NT}.verify_ex_er
c9d0: 72 63 6f 64 65 20 66 6b 65 79 32 2d 31 39 2e 32  rcode fkey2-19.2
c9e0: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
c9f0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 64  INT_FOREIGNKEY.d
ca00: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 39 2e  o_test fkey2-19.
ca10: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  3 {.  sqlite3_re
ca20: 73 65 74 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45  set $S.} {SQLITE
ca30: 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 76 65 72  _CONSTRAINT}.ver
ca40: 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 66  ify_ex_errcode f
ca50: 6b 65 79 32 2d 31 39 2e 33 62 20 53 51 4c 49 54  key2-19.3b SQLIT
ca60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
ca70: 45 49 47 4e 4b 45 59 0a 64 6f 5f 74 65 73 74 20  EIGNKEY.do_test 
ca80: 66 6b 65 79 32 2d 31 39 2e 34 20 7b 0a 20 20 73  fkey2-19.4 {.  s
ca90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
caa0: 24 53 20 31 20 31 0a 20 20 73 71 6c 69 74 65 33  $S 1 1.  sqlite3
cab0: 5f 73 74 65 70 20 24 53 0a 7d 20 7b 53 51 4c 49  _step $S.} {SQLI
cac0: 54 45 5f 44 4f 4e 45 7d 0a 64 6f 5f 74 65 73 74  TE_DONE}.do_test
cad0: 20 66 6b 65 79 32 2d 31 39 2e 34 20 7b 0a 20 20   fkey2-19.4 {.  
cae0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
caf0: 20 24 53 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   $S.} {SQLITE_OK
cb00: 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  }..drop_all_tabl
cb10: 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  es.do_test fkey2
cb20: 2d 32 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -20.1 {.  execsq
cb30: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
cb40: 41 42 4c 45 20 70 70 28 61 20 50 52 49 4d 41 52  ABLE pp(a PRIMAR
cb50: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
cb60: 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 63  REATE TABLE cc(c
cb70: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 20   PRIMARY KEY, d 
cb80: 52 45 46 45 52 45 4e 43 45 53 20 70 70 29 3b 0a  REFERENCES pp);.
cb90: 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63    }.} {}..foreac
cba0: 68 20 7b 74 6e 20 69 6e 73 65 72 74 7d 20 7b 0a  h {tn insert} {.
cbb0: 20 20 31 20 22 49 4e 53 45 52 54 22 0a 20 20 32    1 "INSERT".  2
cbc0: 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
cbd0: 52 45 22 0a 20 20 33 20 22 49 4e 53 45 52 54 20  RE".  3 "INSERT 
cbe0: 4f 52 20 41 42 4f 52 54 22 0a 20 20 34 20 22 49  OR ABORT".  4 "I
cbf0: 4e 53 45 52 54 20 4f 52 20 52 4f 4c 4c 42 41 43  NSERT OR ROLLBAC
cc00: 4b 22 0a 20 20 35 20 22 49 4e 53 45 52 54 20 4f  K".  5 "INSERT O
cc10: 52 20 52 45 50 4c 41 43 45 22 0a 20 20 36 20 22  R REPLACE".  6 "
cc20: 49 4e 53 45 52 54 20 4f 52 20 46 41 49 4c 22 0a  INSERT OR FAIL".
cc30: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  } {.  do_test fk
cc40: 65 79 32 2d 32 30 2e 32 2e 24 74 6e 2e 31 20 7b  ey2-20.2.$tn.1 {
cc50: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 24  .    catchsql "$
cc60: 69 6e 73 65 72 74 20 49 4e 54 4f 20 63 63 20 56  insert INTO cc V
cc70: 41 4c 55 45 53 28 31 2c 20 32 29 22 0a 20 20 7d  ALUES(1, 2)".  }
cc80: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
cc90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
cca0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ed}}.  do_test f
ccb0: 6b 65 79 32 2d 32 30 2e 32 2e 24 74 6e 2e 32 20  key2-20.2.$tn.2 
ccc0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
ccd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63  SELECT * FROM cc
cce0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
ccf0: 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 32 2e 24  est fkey2-20.2.$
cd00: 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.3 {.    execs
cd10: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
cd20: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
cd30: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
cd40: 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 20  2, 'two');.     
cd50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
cd60: 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  c VALUES(1, 2);.
cd70: 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73      }.    catchs
cd80: 71 6c 20 22 24 69 6e 73 65 72 74 20 49 4e 54 4f  ql "$insert INTO
cd90: 20 63 63 20 56 41 4c 55 45 53 28 33 2c 20 34 29   cc VALUES(3, 4)
cda0: 22 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ".  } {1 {FOREIG
cdb0: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
cdc0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74   failed}}.  do_t
cdd0: 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 32 2e 24  est fkey2-20.2.$
cde0: 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.4 {.    execs
cdf0: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 3b 20 53 45  ql { COMMIT ; SE
ce00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 20 7d  LECT * FROM cc }
ce10: 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f  .  } {1 2}.  do_
ce20: 74 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 32 2e  test fkey2-20.2.
ce30: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65 63  $tn.5 {.    exec
ce40: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
ce50: 4d 20 63 63 20 3b 20 44 45 4c 45 54 45 20 46 52  M cc ; DELETE FR
ce60: 4f 4d 20 70 70 20 7d 0a 20 20 7d 20 7b 7d 0a 7d  OM pp }.  } {}.}
ce70: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75 70  ..foreach {tn up
ce80: 64 61 74 65 7d 20 7b 0a 20 20 31 20 22 55 50 44  date} {.  1 "UPD
ce90: 41 54 45 22 0a 20 20 32 20 22 55 50 44 41 54 45  ATE".  2 "UPDATE
cea0: 20 4f 52 20 49 47 4e 4f 52 45 22 0a 20 20 33 20   OR IGNORE".  3 
ceb0: 22 55 50 44 41 54 45 20 4f 52 20 41 42 4f 52 54  "UPDATE OR ABORT
cec0: 22 0a 20 20 34 20 22 55 50 44 41 54 45 20 4f 52  ".  4 "UPDATE OR
ced0: 20 52 4f 4c 4c 42 41 43 4b 22 0a 20 20 35 20 22   ROLLBACK".  5 "
cee0: 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43  UPDATE OR REPLAC
cef0: 45 22 0a 20 20 36 20 22 55 50 44 41 54 45 20 4f  E".  6 "UPDATE O
cf00: 52 20 46 41 49 4c 22 0a 7d 20 7b 0a 20 20 64 6f  R FAIL".} {.  do
cf10: 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 33  _test fkey2-20.3
cf20: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65  .$tn.1 {.    exe
cf30: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
cf40: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
cf50: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
cf60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cf70: 63 63 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  cc VALUES(1, 2);
cf80: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
cf90: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30  do_test fkey2-20
cfa0: 2e 33 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63  .3.$tn.2 {.    c
cfb0: 61 74 63 68 73 71 6c 20 22 24 75 70 64 61 74 65  atchsql "$update
cfc0: 20 70 70 20 53 45 54 20 61 20 3d 20 31 22 0a 20   pp SET a = 1". 
cfd0: 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b   } {1 {FOREIGN K
cfe0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
cff0: 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  iled}}.  do_test
d000: 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24 74 6e 2e   fkey2-20.3.$tn.
d010: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
d020: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
d030: 70 70 20 7d 0a 20 20 7d 20 7b 32 20 74 77 6f 7d  pp }.  } {2 two}
d040: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
d050: 2d 32 30 2e 33 2e 24 74 6e 2e 34 20 7b 0a 20 20  -20.3.$tn.4 {.  
d060: 20 20 63 61 74 63 68 73 71 6c 20 22 24 75 70 64    catchsql "$upd
d070: 61 74 65 20 63 63 20 53 45 54 20 64 20 3d 20 31  ate cc SET d = 1
d080: 22 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47  ".  } {1 {FOREIG
d090: 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
d0a0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74   failed}}.  do_t
d0b0: 65 73 74 20 66 6b 65 79 32 2d 32 30 2e 33 2e 24  est fkey2-20.3.$
d0c0: 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.5 {.    execs
d0d0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
d0e0: 4f 4d 20 63 63 20 7d 0a 20 20 7d 20 7b 31 20 32  OM cc }.  } {1 2
d0f0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
d100: 32 2d 32 30 2e 33 2e 24 74 6e 2e 36 20 7b 0a 20  2-20.3.$tn.6 {. 
d110: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
d120: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
d130: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 70    INSERT INTO pp
d140: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
d150: 65 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  e');.    }.    c
d160: 61 74 63 68 73 71 6c 20 22 24 75 70 64 61 74 65  atchsql "$update
d170: 20 70 70 20 53 45 54 20 61 20 3d 20 31 20 57 48   pp SET a = 1 WH
d180: 45 52 45 20 61 20 3d 20 32 22 0a 20 20 7d 20 7b  ERE a = 2".  } {
d190: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
d1a0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d1b0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
d1c0: 79 32 2d 32 30 2e 33 2e 24 74 6e 2e 37 20 7b 0a  y2-20.3.$tn.7 {.
d1d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f      execsql { CO
d1e0: 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20  MMIT ; SELECT * 
d1f0: 46 52 4f 4d 20 70 70 20 7d 0a 20 20 7d 20 7b 32  FROM pp }.  } {2
d200: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
d210: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30  do_test fkey2-20
d220: 2e 33 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 65  .3.$tn.8 {.    e
d230: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
d240: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e  EGIN;.        IN
d250: 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c  SERT INTO cc VAL
d260: 55 45 53 28 32 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(2, 2);.    }
d270: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 22 24  .    catchsql "$
d280: 75 70 64 61 74 65 20 63 63 20 53 45 54 20 64 20  update cc SET d 
d290: 3d 20 31 20 57 48 45 52 45 20 63 20 3d 20 31 22  = 1 WHERE c = 1"
d2a0: 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  .  } {1 {FOREIGN
d2b0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
d2c0: 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  failed}}.  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 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.9 {.    execsq
d2f0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 3b 20 53 45 4c  l { COMMIT ; SEL
d300: 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 20 7d 0a  ECT * FROM cc }.
d310: 20 20 7d 20 7b 31 20 32 20 32 20 32 7d 0a 20 20    } {1 2 2 2}.  
d320: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 30  do_test fkey2-20
d330: 2e 33 2e 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20  .3.$tn.10 {.    
d340: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
d350: 20 46 52 4f 4d 20 63 63 20 3b 20 44 45 4c 45 54   FROM cc ; DELET
d360: 45 20 46 52 4f 4d 20 70 70 20 7d 0a 20 20 7d 20  E FROM pp }.  } 
d370: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
d380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
d3d0: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c   block of tests,
d3e0: 20 74 68 6f 73 65 20 70 72 65 66 69 78 65 64 20   those prefixed 
d3f0: 77 69 74 68 20 22 66 6b 65 79 32 2d 67 65 6e 66  with "fkey2-genf
d400: 6b 65 79 2e 22 2c 20 61 72 65 20 0a 23 20 74 68  key.", are .# th
d410: 65 20 73 61 6d 65 20 74 65 73 74 73 20 74 68 61  e same tests tha
d420: 74 20 77 65 72 65 20 75 73 65 64 20 74 6f 20 74  t were used to t
d430: 65 73 74 20 74 68 65 20 22 2e 67 65 6e 66 6b 65  est the ".genfke
d440: 79 22 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 76 69  y" command provi
d450: 64 65 64 20 0a 23 20 62 79 20 74 68 65 20 73 68  ded .# by the sh
d460: 65 6c 6c 20 74 6f 6f 6c 2e 20 53 6f 20 74 68 65  ell tool. So the
d470: 73 65 20 74 65 73 74 73 20 73 68 6f 77 20 74 68  se tests show th
d480: 61 74 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  at the built-in 
d490: 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a 23 20 69  foreign key .# i
d4a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
d4b0: 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20 63 6f   more or less co
d4c0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
d4d0: 65 20 74 72 69 67 67 65 72 73 20 67 65 6e 65 72  e triggers gener
d4e0: 61 74 65 64 20 0a 23 20 62 79 20 67 65 6e 66 6b  ated .# by genfk
d4f0: 65 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ey..#.drop_all_t
d500: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b  ables.do_test fk
d510: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 20  ey2-genfkey.1.1 
d520: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
d530: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d540: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
d550: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 55  ARY KEY, b, c, U
d560: 4e 49 51 55 45 28 62 2c 20 63 29 29 3b 0a 20 20  NIQUE(b, c));.  
d570: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d580: 32 28 65 20 52 45 46 45 52 45 4e 43 45 53 20 74  2(e REFERENCES t
d590: 31 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41 54  1, f);.    CREAT
d5a0: 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20 68 2c  E TABLE t3(g, h,
d5b0: 20 69 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 20   i, FOREIGN KEY 
d5c0: 28 68 2c 20 69 29 20 52 45 46 45 52 45 4e 43 45  (h, i) REFERENCE
d5d0: 53 20 74 31 28 62 2c 20 63 29 29 3b 0a 20 20 7d  S t1(b, c));.  }
d5e0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
d5f0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 32 20  ey2-genfkey.1.2 
d600: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
d610: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
d620: 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d 20 7b  LUES(1, 2) }.} {
d630: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
d640: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
d650: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
d660: 2d 67 65 6e 66 6b 65 79 2e 31 2e 33 20 7b 0a 20  -genfkey.1.3 {. 
d670: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
d680: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
d690: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
d6a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d6b0: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  2 VALUES(1, 2);.
d6c0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
d6d0: 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31   fkey2-genfkey.1
d6e0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
d6f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
d700: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 33 29 20  VALUES(NULL, 3) 
d710: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
d720: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 35  key2-genfkey.1.5
d730: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
d740: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 65 20  UPDATE t2 SET e 
d750: 3d 20 35 20 57 48 45 52 45 20 65 20 49 53 20 4e  = 5 WHERE e IS N
d760: 55 4c 4c 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  ULL }.} {1 {FORE
d770: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
d780: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
d790: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
d7a0: 79 2e 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  y.1.6 {.  execsq
d7b0: 6c 20 7b 20 55 50 44 41 54 45 20 74 32 20 53 45  l { UPDATE t2 SE
d7c0: 54 20 65 20 3d 20 31 20 57 48 45 52 45 20 65 20  T e = 1 WHERE e 
d7d0: 49 53 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64  IS NULL }.} {}.d
d7e0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
d7f0: 66 6b 65 79 2e 31 2e 37 20 7b 0a 20 20 65 78 65  fkey.1.7 {.  exe
d800: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32  csql { UPDATE t2
d810: 20 53 45 54 20 65 20 3d 20 4e 55 4c 4c 20 57 48   SET e = NULL WH
d820: 45 52 45 20 66 20 3d 20 33 20 7d 0a 7d 20 7b 7d  ERE f = 3 }.} {}
d830: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
d840: 65 6e 66 6b 65 79 2e 31 2e 38 20 7b 0a 20 20 63  enfkey.1.8 {.  c
d850: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
d860: 20 74 31 20 53 45 54 20 61 20 3d 20 31 30 20 7d   t1 SET a = 10 }
d870: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
d880: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
d890: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
d8a0: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 39  key2-genfkey.1.9
d8b0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
d8c0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
d8d0: 3d 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 31 20 7b 64  = NULL }.} {1 {d
d8e0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
d8f0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
d900: 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 30 20 7b 0a  -genfkey.1.10 {.
d910: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c    catchsql { DEL
d920: 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  ETE FROM t1 }.} 
d930: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
d940: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
d950: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
d960: 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 31 20 7b  2-genfkey.1.11 {
d970: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
d980: 41 54 45 20 74 32 20 53 45 54 20 65 20 3d 20 4e  ATE t2 SET e = N
d990: 55 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ULL }.} {}.do_te
d9a0: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
d9b0: 2e 31 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71  .1.12 {.  execsq
d9c0: 6c 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  l { .    UPDATE 
d9d0: 74 31 20 53 45 54 20 61 20 3d 20 31 30 3b 0a 20  t1 SET a = 10;. 
d9e0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
d9f0: 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  1;.    DELETE FR
da00: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t2;.  }.} {}.
da10: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
da20: 6e 66 6b 65 79 2e 31 2e 31 33 20 7b 0a 20 20 65  nfkey.1.13 {.  e
da30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
da40: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
da50: 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ES(1, NULL, NULL
da60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
da70: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20  TO t3 VALUES(1, 
da80: 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  2, NULL);.    IN
da90: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
daa0: 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 33 29 3b  UES(1, NULL, 3);
dab0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
dac0: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
dad0: 31 2e 31 34 20 7b 0a 20 20 63 61 74 63 68 73 71  1.14 {.  catchsq
dae0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
daf0: 74 33 20 56 41 4c 55 45 53 28 33 2c 20 31 2c 20  t3 VALUES(3, 1, 
db00: 34 29 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49  4) }.} {1 {FOREI
db10: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
db20: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65  t failed}}.do_te
db30: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
db40: 2e 31 2e 31 35 20 7b 0a 20 20 65 78 65 63 73 71  .1.15 {.  execsq
db50: 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  l { .    INSERT 
db60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
db70: 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53  , 1, 4);.    INS
db80: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
db90: 45 53 28 33 2c 20 31 2c 20 34 29 3b 0a 20 20 7d  ES(3, 1, 4);.  }
dba0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
dbb0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 36  ey2-genfkey.1.16
dbc0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
dbd0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d  DELETE FROM t1 }
dbe0: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
dbf0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
dc00: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
dc10: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31  key2-genfkey.1.1
dc20: 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  7 {.  catchsql {
dc30: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
dc40: 20 3d 20 31 30 7d 0a 7d 20 7b 31 20 7b 46 4f 52   = 10}.} {1 {FOR
dc50: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
dc60: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
dc70: 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b  test fkey2-genfk
dc80: 65 79 2e 31 2e 31 38 20 7b 0a 20 20 65 78 65 63  ey.1.18 {.  exec
dc90: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20  sql { UPDATE t1 
dca0: 53 45 54 20 61 20 3d 20 31 30 7d 0a 7d 20 7b 7d  SET a = 10}.} {}
dcb0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
dcc0: 65 6e 66 6b 65 79 2e 31 2e 31 39 20 7b 0a 20 20  enfkey.1.19 {.  
dcd0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
dce0: 45 20 74 33 20 53 45 54 20 68 20 3d 20 27 68 65  E t3 SET h = 'he
dcf0: 6c 6c 6f 27 20 57 48 45 52 45 20 69 20 3d 20 33  llo' WHERE i = 3
dd00: 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20  }.} {1 {FOREIGN 
dd10: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
dd20: 61 69 6c 65 64 7d 7d 0a 0a 64 72 6f 70 5f 61 6c  ailed}}..drop_al
dd30: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
dd40: 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32   fkey2-genfkey.2
dd50: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
dd60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dd70: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
dd80: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
dd90: 2c 20 55 4e 49 51 55 45 28 62 2c 20 63 29 29 3b  , UNIQUE(b, c));
dda0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ddb0: 45 20 74 32 28 65 20 52 45 46 45 52 45 4e 43 45  E t2(e REFERENCE
ddc0: 53 20 74 31 20 4f 4e 20 55 50 44 41 54 45 20 43  S t1 ON UPDATE C
ddd0: 41 53 43 41 44 45 20 4f 4e 20 44 45 4c 45 54 45  ASCADE ON DELETE
dde0: 20 43 41 53 43 41 44 45 2c 20 66 29 3b 0a 20 20   CASCADE, f);.  
ddf0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
de00: 33 28 67 2c 20 68 2c 20 69 2c 20 0a 20 20 20 20  3(g, h, i, .    
de10: 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59 20      FOREIGN KEY 
de20: 28 68 2c 20 69 29 20 0a 20 20 20 20 20 20 20 20  (h, i) .        
de30: 52 45 46 45 52 45 4e 43 45 53 20 74 31 28 62 2c  REFERENCES t1(b,
de40: 20 63 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41   c) ON UPDATE CA
de50: 53 43 41 44 45 20 4f 4e 20 44 45 4c 45 54 45 20  SCADE ON DELETE 
de60: 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a 20  CASCADE.    );. 
de70: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
de80: 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32 2e  fkey2-genfkey.2.
de90: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
dea0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
deb0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t1 VALUES(1, 2, 
dec0: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
ded0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
dee0: 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45   5, 6);.    INSE
def0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
df00: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20  S(1, 'one');.   
df10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
df20: 56 41 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 27  VALUES(4, 'four'
df30: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
df40: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
df50: 79 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  y.2.3 {.  execsq
df60: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
df70: 31 20 53 45 54 20 61 20 3d 20 32 20 57 48 45 52  1 SET a = 2 WHER
df80: 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c  E a = 1;.    SEL
df90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
dfa0: 20 7d 0a 7d 20 7b 32 20 6f 6e 65 20 34 20 66 6f   }.} {2 one 4 fo
dfb0: 75 72 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  ur}.do_test fkey
dfc0: 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 34 20 7b 0a  2-genfkey.2.4 {.
dfd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
dfe0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
dff0: 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20  HERE a = 4;.    
e000: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
e010: 3b 0a 20 20 7d 0a 7d 20 7b 32 20 6f 6e 65 7d 0a  ;.  }.} {2 one}.
e020: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
e030: 65 6e 66 6b 65 79 2e 32 2e 35 20 7b 0a 20 20 65  enfkey.2.5 {.  e
e040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
e050: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
e060: 45 53 28 27 68 65 6c 6c 6f 27 2c 20 32 2c 20 33  ES('hello', 2, 3
e070: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  );.    UPDATE t1
e080: 20 53 45 54 20 63 20 3d 20 32 3b 0a 20 20 20 20   SET c = 2;.    
e090: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
e0a0: 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 32  ;.  }.} {hello 2
e0b0: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   2}.do_test fkey
e0c0: 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 36 20 7b 0a  2-genfkey.2.6 {.
e0d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e0e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
e0f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
e100: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  M t3;.  }.} {}..
e110: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
e120: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
e130: 6e 66 6b 65 79 2e 33 2e 31 20 7b 0a 20 20 65 78  nfkey.3.1 {.  ex
e140: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
e150: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
e160: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
e170: 59 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45 28  Y, b, c, UNIQUE(
e180: 63 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45 41  c, b));.    CREA
e190: 54 45 20 54 41 42 4c 45 20 74 32 28 65 20 52 45  TE TABLE t2(e RE
e1a0: 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 55  FERENCES t1 ON U
e1b0: 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 20 4f  PDATE SET NULL O
e1c0: 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c  N DELETE SET NUL
e1d0: 4c 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41 54  L, f);.    CREAT
e1e0: 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20 68 2c  E TABLE t3(g, h,
e1f0: 20 69 2c 20 0a 20 20 20 20 20 20 20 20 46 4f 52   i, .        FOR
e200: 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69 29 20  EIGN KEY (h, i) 
e210: 0a 20 20 20 20 20 20 20 20 52 45 46 45 52 45 4e  .        REFEREN
e220: 43 45 53 20 74 31 28 62 2c 20 63 29 20 4f 4e 20  CES t1(b, c) ON 
e230: 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 20  UPDATE SET NULL 
e240: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
e250: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  LL.    );.  }.} 
e260: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  {}.do_test fkey2
e270: 2d 67 65 6e 66 6b 65 79 2e 33 2e 32 20 7b 0a 20  -genfkey.3.2 {. 
e280: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
e290: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
e2a0: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
e2b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e2c0: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36  1 VALUES(4, 5, 6
e2d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e2e0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
e2f0: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'one');.    INSE
e300: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
e310: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
e320: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
e330: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e 33  key2-genfkey.3.3
e340: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
e350: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
e360: 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20 3d   a = 2 WHERE a =
e370: 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   1;.    SELECT *
e380: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
e390: 7b 7b 7d 20 6f 6e 65 20 34 20 66 6f 75 72 7d 0a  {{} one 4 four}.
e3a0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
e3b0: 6e 66 6b 65 79 2e 33 2e 34 20 7b 0a 20 20 65 78  nfkey.3.4 {.  ex
e3c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
e3d0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
e3e0: 20 61 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45   a = 4;.    SELE
e3f0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
e400: 7d 0a 7d 20 7b 7b 7d 20 6f 6e 65 20 7b 7d 20 66  }.} {{} one {} f
e410: 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  our}.do_test fke
e420: 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e 35 20 7b  y2-genfkey.3.5 {
e430: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e440: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
e450: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20  VALUES('hello', 
e460: 32 2c 20 33 29 3b 0a 20 20 20 20 55 50 44 41 54  2, 3);.    UPDAT
e470: 45 20 74 31 20 53 45 54 20 63 20 3d 20 32 3b 0a  E t1 SET c = 2;.
e480: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
e490: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c  M t3;.  }.} {hel
e4a0: 6c 6f 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  lo {} {}}.do_tes
e4b0: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
e4c0: 33 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.6 {.  execsql 
e4d0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33 20  {.    UPDATE t3 
e4e0: 53 45 54 20 68 20 3d 20 32 2c 20 69 20 3d 20 32  SET h = 2, i = 2
e4f0: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
e500: 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t1;.    SELECT
e510: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a   * FROM t3;.  }.
e520: 7d 20 7b 68 65 6c 6c 6f 20 7b 7d 20 7b 7d 7d 0a  } {hello {} {}}.
e530: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65  -----------.# Ve
e580: 72 69 66 79 20 74 68 61 74 20 74 69 63 6b 65 74  rify that ticket
e590: 20 64 64 30 38 65 35 61 39 38 38 64 30 30 64 65   dd08e5a988d00de
e5a0: 63 63 34 61 35 34 33 64 61 61 38 64 62 62 66 61  cc4a543daa8dbbfa
e5b0: 62 39 63 35 37 37 61 64 38 20 68 61 73 20 62 65  b9c577ad8 has be
e5c0: 65 6e 0a 23 20 66 69 78 65 64 2e 0a 23 0a 64 6f  en.# fixed..#.do
e5d0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 64 64 30 38  _test fkey2-dd08
e5e0: 65 35 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  e5.1.1 {.  execs
e5f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
e600: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 4e 3b  foreign_keys=ON;
e610: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e620: 45 20 74 64 64 30 38 28 61 20 49 4e 54 45 47 45  E tdd08(a INTEGE
e630: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
e640: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  );.    CREATE UN
e650: 49 51 55 45 20 49 4e 44 45 58 20 69 64 64 30 38  IQUE INDEX idd08
e660: 20 4f 4e 20 74 64 64 30 38 28 61 2c 62 29 3b 0a   ON tdd08(a,b);.
e670: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e680: 74 64 64 30 38 20 56 41 4c 55 45 53 28 32 30 30  tdd08 VALUES(200
e690: 2c 33 30 30 29 3b 0a 0a 20 20 20 20 43 52 45 41  ,300);..    CREA
e6a0: 54 45 20 54 41 42 4c 45 20 74 64 64 30 38 5f 62  TE TABLE tdd08_b
e6b0: 28 77 2c 78 2c 79 2c 20 46 4f 52 45 49 47 4e 20  (w,x,y, FOREIGN 
e6c0: 4b 45 59 28 78 2c 79 29 20 52 45 46 45 52 45 4e  KEY(x,y) REFEREN
e6d0: 43 45 53 20 74 64 64 30 38 28 61 2c 62 29 29 3b  CES tdd08(a,b));
e6e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e6f0: 20 74 64 64 30 38 5f 62 20 56 41 4c 55 45 53 28   tdd08_b VALUES(
e700: 31 30 30 2c 32 30 30 2c 33 30 30 29 3b 0a 20 20  100,200,300);.  
e710: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
e720: 6b 65 79 32 2d 64 64 30 38 65 35 2e 31 2e 32 20  key2-dd08e5.1.2 
e730: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
e740: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
e750: 64 64 30 38 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  dd08;.  }.} {1 {
e760: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
e770: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
e780: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 64 64  do_test fkey2-dd
e790: 30 38 65 35 2e 31 2e 33 20 7b 0a 20 20 65 78 65  08e5.1.3 {.  exe
e7a0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
e7b0: 54 20 2a 20 46 52 4f 4d 20 74 64 64 30 38 3b 0a  T * FROM tdd08;.
e7c0: 20 20 7d 0a 7d 20 7b 32 30 30 20 33 30 30 7d 0a    }.} {200 300}.
e7d0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 64 64  do_test fkey2-dd
e7e0: 30 38 65 35 2e 31 2e 34 20 7b 0a 20 20 63 61 74  08e5.1.4 {.  cat
e7f0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
e800: 52 54 20 49 4e 54 4f 20 74 64 64 30 38 5f 62 20  RT INTO tdd08_b 
e810: 56 41 4c 55 45 53 28 34 30 30 2c 35 30 30 2c 33  VALUES(400,500,3
e820: 30 30 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46  00);.  }.} {1 {F
e830: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
e840: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
e850: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 64 64 30  o_test fkey2-dd0
e860: 38 65 35 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63  8e5.1.5 {.  catc
e870: 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  hsql {.    UPDAT
e880: 45 20 74 64 64 30 38 5f 62 20 53 45 54 20 78 3d  E tdd08_b SET x=
e890: 78 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46  x+1;.  }.} {1 {F
e8a0: 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
e8b0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
e8c0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 64 64 30  o_test fkey2-dd0
e8d0: 38 65 35 2e 31 2e 36 20 7b 0a 20 20 63 61 74 63  8e5.1.6 {.  catc
e8e0: 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  hsql {.    UPDAT
e8f0: 45 20 74 64 64 30 38 20 53 45 54 20 61 3d 61 2b  E tdd08 SET a=a+
e900: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52  1;.  }.} {1 {FOR
e910: 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
e920: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d  int failed}}..#-
e930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69 66  --------.# Verif
e980: 79 20 74 68 61 74 20 74 69 63 6b 65 74 20 63 65  y that ticket ce
e990: 37 63 31 33 33 65 61 36 63 63 39 63 63 64 63 31  7c133ea6cc9ccdc1
e9a0: 61 36 30 64 38 30 34 34 31 66 38 30 62 36 31 38  a60d80441f80b618
e9b0: 30 66 35 65 62 61 0a 23 20 66 69 78 65 64 2e 0a  0f5eba.# fixed..
e9c0: 23 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  #.do_test fkey2-
e9d0: 63 65 37 63 31 33 2e 31 2e 31 20 7b 0a 20 20 65  ce7c13.1.1 {.  e
e9e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
e9f0: 41 54 45 20 54 41 42 4c 45 20 74 63 65 37 31 28  ATE TABLE tce71(
ea00: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
ea10: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
ea20: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
ea30: 45 58 20 69 63 65 37 31 20 4f 4e 20 74 63 65 37  EX ice71 ON tce7
ea40: 31 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45  1(a,b);.    INSE
ea50: 52 54 20 49 4e 54 4f 20 74 63 65 37 31 20 56 41  RT INTO tce71 VA
ea60: 4c 55 45 53 28 31 30 30 2c 32 30 30 29 3b 0a 20  LUES(100,200);. 
ea70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
ea80: 74 63 65 37 32 28 77 2c 20 78 2c 20 79 2c 20 46  tce72(w, x, y, F
ea90: 4f 52 45 49 47 4e 20 4b 45 59 28 78 2c 79 29 20  OREIGN KEY(x,y) 
eaa0: 52 45 46 45 52 45 4e 43 45 53 20 74 63 65 37 31  REFERENCES tce71
eab0: 28 61 2c 62 29 29 3b 0a 20 20 20 20 49 4e 53 45  (a,b));.    INSE
eac0: 52 54 20 49 4e 54 4f 20 74 63 65 37 32 20 56 41  RT INTO tce72 VA
ead0: 4c 55 45 53 28 33 30 30 2c 31 30 30 2c 32 30 30  LUES(300,100,200
eae0: 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63  );.    UPDATE tc
eaf0: 65 37 31 20 73 65 74 20 62 20 3d 20 32 30 30 20  e71 set b = 200 
eb00: 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
eb10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
eb20: 20 74 63 65 37 31 2c 20 74 63 65 37 32 3b 0a 20   tce71, tce72;. 
eb30: 20 7d 0a 7d 20 7b 31 30 30 20 32 30 30 20 33 30   }.} {100 200 30
eb40: 30 20 31 30 30 20 32 30 30 7d 0a 64 6f 5f 74 65  0 100 200}.do_te
eb50: 73 74 20 66 6b 65 79 32 2d 63 65 37 63 31 33 2e  st fkey2-ce7c13.
eb60: 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.2 {.  catchsql
eb70: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 63   {.    UPDATE tc
eb80: 65 37 31 20 73 65 74 20 62 20 3d 20 32 30 31 20  e71 set b = 201 
eb90: 77 68 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20  where a = 100;. 
eba0: 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e   }.} {1 {FOREIGN
ebb0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
ebc0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
ebd0: 20 66 6b 65 79 32 2d 63 65 37 63 31 33 2e 31 2e   fkey2-ce7c13.1.
ebe0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
ebf0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 63 65 37  .    UPDATE tce7
ec00: 31 20 73 65 74 20 61 20 3d 20 31 30 31 20 77 68  1 set a = 101 wh
ec10: 65 72 65 20 61 20 3d 20 31 30 30 3b 0a 20 20 7d  ere a = 100;.  }
ec20: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
ec30: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
ec40: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
ec50: 6b 65 79 32 2d 63 65 37 63 31 33 2e 31 2e 34 20  key2-ce7c13.1.4 
ec60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ec70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ec80: 63 65 37 33 28 61 20 49 4e 54 45 47 45 52 20 50  ce73(a INTEGER P
ec90: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 55  RIMARY KEY, b, U
eca0: 4e 49 51 55 45 28 61 2c 62 29 29 3b 0a 20 20 20  NIQUE(a,b));.   
ecb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 63 65   INSERT INTO tce
ecc0: 37 33 20 56 41 4c 55 45 53 28 31 30 30 2c 32 30  73 VALUES(100,20
ecd0: 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  0);.    CREATE T
ece0: 41 42 4c 45 20 74 63 65 37 34 28 77 2c 20 78 2c  ABLE tce74(w, x,
ecf0: 20 79 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   y, FOREIGN KEY(
ed00: 78 2c 79 29 20 52 45 46 45 52 45 4e 43 45 53 20  x,y) REFERENCES 
ed10: 74 63 65 37 33 28 61 2c 62 29 29 3b 0a 20 20 20  tce73(a,b));.   
ed20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 63 65   INSERT INTO tce
ed30: 37 34 20 56 41 4c 55 45 53 28 33 30 30 2c 31 30  74 VALUES(300,10
ed40: 30 2c 32 30 30 29 3b 0a 20 20 20 20 55 50 44 41  0,200);.    UPDA
ed50: 54 45 20 74 63 65 37 33 20 73 65 74 20 62 20 3d  TE tce73 set b =
ed60: 20 32 30 30 20 77 68 65 72 65 20 61 20 3d 20 31   200 where a = 1
ed70: 30 30 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  00;.    SELECT *
ed80: 20 46 52 4f 4d 20 74 63 65 37 33 2c 20 74 63 65   FROM tce73, tce
ed90: 37 34 3b 0a 20 20 7d 0a 7d 20 7b 31 30 30 20 32  74;.  }.} {100 2
eda0: 30 30 20 33 30 30 20 31 30 30 20 32 30 30 7d 0a  00 300 100 200}.
edb0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 63 65  do_test fkey2-ce
edc0: 37 63 31 33 2e 31 2e 35 20 7b 0a 20 20 63 61 74  7c13.1.5 {.  cat
edd0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  chsql {.    UPDA
ede0: 54 45 20 74 63 65 37 33 20 73 65 74 20 62 20 3d  TE tce73 set b =
edf0: 20 32 30 31 20 77 68 65 72 65 20 61 20 3d 20 31   201 where a = 1
ee00: 30 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f  00;.  }.} {1 {FO
ee10: 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
ee20: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
ee30: 5f 74 65 73 74 20 66 6b 65 79 32 2d 63 65 37 63  _test fkey2-ce7c
ee40: 31 33 2e 31 2e 36 20 7b 0a 20 20 63 61 74 63 68  13.1.6 {.  catch
ee50: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
ee60: 20 74 63 65 37 33 20 73 65 74 20 61 20 3d 20 31   tce73 set a = 1
ee70: 30 31 20 77 68 65 72 65 20 61 20 3d 20 31 30 30  01 where a = 100
ee80: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 46 4f 52 45  ;.  }.} {1 {FORE
ee90: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
eea0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 66 69 6e  nt failed}}..fin
eeb0: 69 73 68 5f 74 65 73 74 0a                       ish_test.