/ Hex Artifact Content
Login

Artifact e71f5baf9bb42cdba4700d73cba6f4d82fd6b925:


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 67 65 6e 66 6b 65 79 2e 2a 3a 20  key2-genfkey.*: 
0a60: 54 65 73 74 73 20 74 68 61 74 20 77 65 72 65 20  Tests that were 
0a70: 75 73 65 64 20 77 69 74 68 20 74 68 65 20 73 68  used with the sh
0a80: 65 6c 6c 20 74 6f 6f 6c 20 2e 67 65 6e 66 6b 65  ell tool .genfke
0a90: 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 63  y.#            c
0aa0: 6f 6d 6d 61 6e 64 2e 20 52 65 63 79 63 6c 65 64  ommand. Recycled
0ab0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 62 75 69   to test the bui
0ac0: 6c 74 2d 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  lt-in implementa
0ad0: 74 69 6f 6e 2e 0a 23 0a 0a 0a 65 78 65 63 73 71  tion..#...execsq
0ae0: 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  l { PRAGMA forei
0af0: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 20 7d 0a 0a  gn_keys = on }..
0b00: 73 65 74 20 46 6b 65 79 53 69 6d 70 6c 65 53 63  set FkeySimpleSc
0b10: 68 65 6d 61 20 7b 0a 20 20 50 52 41 47 4d 41 20  hema {.  PRAGMA 
0b20: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
0b30: 6e 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  n;.  CREATE TABL
0b40: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
0b50: 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  EY, b);.  CREATE
0b60: 20 54 41 42 4c 45 20 74 32 28 63 20 52 45 46 45   TABLE t2(c REFE
0b70: 52 45 4e 43 45 53 20 74 31 28 61 29 20 2f 44 2f  RENCES t1(a) /D/
0b80: 20 2c 20 64 29 3b 0a 0a 20 20 43 52 45 41 54 45   , d);..  CREATE
0b90: 20 54 41 42 4c 45 20 74 33 28 61 20 50 52 49 4d   TABLE t3(a PRIM
0ba0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 43  ARY KEY, b);.  C
0bb0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 63  REATE TABLE t4(c
0bc0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 33 20 2f   REFERENCES t3 /
0bd0: 44 2f 2c 20 64 29 3b 0a 0a 20 20 43 52 45 41 54  D/, d);..  CREAT
0be0: 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 20  E TABLE t7(a, b 
0bf0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0c00: 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45 20 54  KEY);.  CREATE T
0c10: 41 42 4c 45 20 74 38 28 63 20 52 45 46 45 52 45  ABLE t8(c REFERE
0c20: 4e 43 45 53 20 74 37 20 2f 44 2f 2c 20 64 29 3b  NCES t7 /D/, d);
0c30: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
0c40: 20 74 39 28 61 20 52 45 46 45 52 45 4e 43 45 53   t9(a REFERENCES
0c50: 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20 62 29   nosuchtable, b)
0c60: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0c70: 20 74 31 30 28 61 20 52 45 46 45 52 45 4e 43 45   t10(a REFERENCE
0c80: 53 20 74 39 28 63 29 20 2f 44 2f 2c 20 62 29 3b  S t9(c) /D/, b);
0c90: 0a 7d 0a 0a 0a 73 65 74 20 46 6b 65 79 53 69 6d  .}...set FkeySim
0ca0: 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 31 2e 31  pleTests {.  1.1
0cb0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0cc0: 32 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20  2 VALUES(1, 3)" 
0cd0: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
0ce0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0cf0: 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 32 20 20  failed}}.  1.2  
0d00: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
0d10: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 20 20 20  VALUES(1, 2)"   
0d20: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 33 20     {0 {}}.  1.3 
0d30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   "INSERT INTO t2
0d40: 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20   VALUES(1, 3)"  
0d50: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 34      {0 {}}.  1.4
0d60: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0d70: 32 20 56 41 4c 55 45 53 28 32 2c 20 34 29 22 20  2 VALUES(2, 4)" 
0d80: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
0d90: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0da0: 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 35 20 20  failed}}.  1.5  
0db0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20  "INSERT INTO t2 
0dc0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34 29 22  VALUES(NULL, 4)"
0dd0: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 36 20     {0 {}}.  1.6 
0de0: 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20   "UPDATE t2 SET 
0df0: 63 3d 32 20 57 48 45 52 45 20 64 3d 34 22 20 20  c=2 WHERE d=4"  
0e00: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
0e10: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
0e20: 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 37 20 20 22  ailed}}.  1.7  "
0e30: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 63 3d  UPDATE t2 SET c=
0e40: 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 20  1 WHERE d=4"    
0e50: 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 39 20 20    {0 {}}.  1.9  
0e60: 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20 63  "UPDATE t2 SET c
0e70: 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20  =1 WHERE d=4"   
0e80: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 31 30     {0 {}}.  1.10
0e90: 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20   "UPDATE t2 SET 
0ea0: 63 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64 3d 34  c=NULL WHERE d=4
0eb0: 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 31  "   {0 {}}.  1.1
0ec0: 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  1 "DELETE FROM t
0ed0: 31 20 57 48 45 52 45 20 61 3d 31 22 20 20 20 20  1 WHERE a=1"    
0ee0: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
0ef0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0f00: 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 31 32 20  failed}}.  1.12 
0f10: 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61  "UPDATE t1 SET a
0f20: 20 3d 20 32 22 20 20 20 20 20 20 20 20 20 20 20   = 2"           
0f30: 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b     {1 {foreign k
0f40: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
0f50: 69 6c 65 64 7d 7d 0a 20 20 31 2e 31 33 20 22 55  iled}}.  1.13 "U
0f60: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
0f70: 20 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20   1"             
0f80: 20 7b 30 20 7b 7d 7d 0a 0a 20 20 32 2e 31 20 20   {0 {}}..  2.1  
0f90: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20  "INSERT INTO t4 
0fa0: 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20  VALUES(1, 3)"   
0fb0: 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b     {1 {foreign k
0fc0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
0fd0: 69 6c 65 64 7d 7d 0a 20 20 32 2e 32 20 20 22 49  iled}}.  2.2  "I
0fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0ff0: 4c 55 45 53 28 31 2c 20 32 29 22 20 20 20 20 20  LUES(1, 2)"     
1000: 20 7b 30 20 7b 7d 7d 0a 20 20 32 2e 33 20 20 22   {0 {}}.  2.3  "
1010: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1020: 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20 20  ALUES(1, 3)"    
1030: 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 34 2e 31 20    {0 {}}..  4.1 
1040: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38   "INSERT INTO t8
1050: 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20   VALUES(1, 3)"  
1060: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
1070: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
1080: 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 32 20 20 22  ailed}}.  4.2  "
1090: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
10a0: 41 4c 55 45 53 28 32 2c 20 31 29 22 20 20 20 20  ALUES(2, 1)"    
10b0: 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 33 20 20    {0 {}}.  4.3  
10c0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20  "INSERT INTO t8 
10d0: 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20  VALUES(1, 3)"   
10e0: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 34 20     {0 {}}.  4.4 
10f0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38   "INSERT INTO t8
1100: 20 56 41 4c 55 45 53 28 32 2c 20 34 29 22 20 20   VALUES(2, 4)"  
1110: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
1120: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
1130: 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 35 20 20 22  ailed}}.  4.5  "
1140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56  INSERT INTO t8 V
1150: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34 29 22 20  ALUES(NULL, 4)" 
1160: 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 36 20 20    {0 {}}.  4.6  
1170: 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63  "UPDATE t8 SET c
1180: 3d 32 20 57 48 45 52 45 20 64 3d 34 22 20 20 20  =2 WHERE d=4"   
1190: 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b     {1 {foreign k
11a0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
11b0: 69 6c 65 64 7d 7d 0a 20 20 34 2e 37 20 20 22 55  iled}}.  4.7  "U
11c0: 50 44 41 54 45 20 74 38 20 53 45 54 20 63 3d 31  PDATE t8 SET c=1
11d0: 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 20 20   WHERE d=4"     
11e0: 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 39 20 20 22   {0 {}}.  4.9  "
11f0: 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63 3d  UPDATE t8 SET c=
1200: 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20 20  1 WHERE d=4"    
1210: 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 30 20    {0 {}}.  4.10 
1220: 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63  "UPDATE t8 SET c
1230: 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64 3d 34 22  =NULL WHERE d=4"
1240: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 31     {0 {}}.  4.11
1250: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37   "DELETE FROM t7
1260: 20 57 48 45 52 45 20 62 3d 31 22 20 20 20 20 20   WHERE b=1"     
1270: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
1280: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
1290: 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 31 32 20 22  ailed}}.  4.12 "
12a0: 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62 20  UPDATE t7 SET b 
12b0: 3d 20 32 22 20 20 20 20 20 20 20 20 20 20 20 20  = 2"            
12c0: 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65    {1 {foreign ke
12d0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
12e0: 6c 65 64 7d 7d 0a 20 20 34 2e 31 33 20 22 55 50  led}}.  4.13 "UP
12f0: 44 41 54 45 20 74 37 20 53 45 54 20 62 20 3d 20  DATE t7 SET b = 
1300: 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1"              
1310: 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 34 20 22 49  {0 {}}.  4.14 "I
1320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
1330: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 22 20  LUES('a', 'b')" 
1340: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
1350: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
1360: 65 64 7d 7d 0a 20 20 34 2e 31 35 20 22 55 50 44  ed}}.  4.15 "UPD
1370: 41 54 45 20 74 37 20 53 45 54 20 62 20 3d 20 35  ATE t7 SET b = 5
1380: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  "              {
1390: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
13a0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
13b0: 7d 7d 0a 20 20 34 2e 31 36 20 22 55 50 44 41 54  }}.  4.16 "UPDAT
13c0: 45 20 74 37 20 53 45 54 20 72 6f 77 69 64 20 3d  E t7 SET rowid =
13d0: 20 35 22 20 20 20 20 20 20 20 20 20 20 7b 31 20   5"          {1 
13e0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
13f0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
1400: 0a 20 20 34 2e 31 37 20 22 55 50 44 41 54 45 20  .  4.17 "UPDATE 
1410: 74 37 20 53 45 54 20 61 20 3d 20 31 30 22 20 20  t7 SET a = 10"  
1420: 20 20 20 20 20 20 20 20 20 20 20 7b 30 20 7b 7d             {0 {}
1430: 7d 0a 0a 20 20 35 2e 31 20 20 22 49 4e 53 45 52  }..  5.1  "INSER
1440: 54 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53  T INTO t9 VALUES
1450: 28 31 2c 20 33 29 22 20 20 20 20 20 20 7b 31 20  (1, 3)"      {1 
1460: 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  {no such table: 
1470: 6d 61 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65  main.nosuchtable
1480: 7d 7d 0a 20 20 35 2e 32 20 20 22 49 4e 53 45 52  }}.  5.2  "INSER
1490: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
14a0: 53 28 31 2c 20 33 29 22 20 20 20 20 20 7b 31 20  S(1, 3)"     {1 
14b0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69 73  {foreign key mis
14c0: 6d 61 74 63 68 7d 7d 0a 7d 0a 0a 64 6f 5f 74 65  match}}.}..do_te
14d0: 73 74 20 66 6b 65 79 32 2d 31 2e 31 2e 30 20 7b  st fkey2-1.1.0 {
14e0: 0a 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69  .  execsql [stri
14f0: 6e 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20  ng map {/D/ {}} 
1500: 24 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d  $FkeySimpleSchem
1510: 61 5d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20  a].} {}.foreach 
1520: 7b 74 6e 20 7a 53 71 6c 20 72 65 73 7d 20 24 46  {tn zSql res} $F
1530: 6b 65 79 53 69 6d 70 6c 65 54 65 73 74 73 20 7b  keySimpleTests {
1540: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
1550: 2d 31 2e 31 2e 24 74 6e 20 7b 20 63 61 74 63 68  -1.1.$tn { catch
1560: 73 71 6c 20 24 7a 53 71 6c 20 7d 20 24 72 65 73  sql $zSql } $res
1570: 0a 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .}.drop_all_tabl
1580: 65 73 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  es..do_test fkey
1590: 32 2d 31 2e 32 2e 30 20 7b 0a 20 20 65 78 65 63  2-1.2.0 {.  exec
15a0: 73 71 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  sql [string map 
15b0: 7b 2f 44 2f 20 7b 44 45 46 45 52 52 41 42 4c 45  {/D/ {DEFERRABLE
15c0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
15d0: 52 45 44 7d 7d 20 24 46 6b 65 79 53 69 6d 70 6c  RED}} $FkeySimpl
15e0: 65 53 63 68 65 6d 61 5d 0a 7d 20 7b 7d 0a 66 6f  eSchema].} {}.fo
15f0: 72 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72  reach {tn zSql r
1600: 65 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 54  es} $FkeySimpleT
1610: 65 73 74 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ests {.  do_test
1620: 20 66 6b 65 79 32 2d 31 2e 32 2e 24 74 6e 20 7b   fkey2-1.2.$tn {
1630: 20 63 61 74 63 68 73 71 6c 20 24 7a 53 71 6c 20   catchsql $zSql 
1640: 7d 20 24 72 65 73 0a 7d 0a 64 72 6f 70 5f 61 6c  } $res.}.drop_al
1650: 6c 5f 74 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73  l_tables..do_tes
1660: 74 20 66 6b 65 79 32 2d 31 2e 33 2e 30 20 7b 0a  t fkey2-1.3.0 {.
1670: 20 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e    execsql [strin
1680: 67 20 6d 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24  g map {/D/ {}} $
1690: 46 6b 65 79 53 69 6d 70 6c 65 53 63 68 65 6d 61  FkeySimpleSchema
16a0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  ].  execsql { PR
16b0: 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67  AGMA count_chang
16c0: 65 73 20 3d 20 31 20 7d 0a 7d 20 7b 7d 0a 66 6f  es = 1 }.} {}.fo
16d0: 72 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72  reach {tn zSql r
16e0: 65 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 54  es} $FkeySimpleT
16f0: 65 73 74 73 20 7b 0a 20 20 69 66 20 7b 24 72 65  ests {.  if {$re
1700: 73 20 3d 3d 20 22 30 20 7b 7d 22 7d 20 7b 20 73  s == "0 {}"} { s
1710: 65 74 20 72 65 73 20 7b 30 20 31 7d 20 7d 0a 20  et res {0 1} }. 
1720: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
1730: 2e 33 2e 24 74 6e 20 7b 20 63 61 74 63 68 73 71  .3.$tn { catchsq
1740: 6c 20 24 7a 53 71 6c 20 7d 20 24 72 65 73 0a 7d  l $zSql } $res.}
1750: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
1760: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
1770: 3d 20 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74  = 0 }.drop_all_t
1780: 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73 74 20 66  ables..do_test f
1790: 6b 65 79 32 2d 31 2e 34 2e 30 20 7b 0a 20 20 65  key2-1.4.0 {.  e
17a0: 78 65 63 73 71 6c 20 5b 73 74 72 69 6e 67 20 6d  xecsql [string m
17b0: 61 70 20 7b 2f 44 2f 20 7b 7d 7d 20 24 46 6b 65  ap {/D/ {}} $Fke
17c0: 79 53 69 6d 70 6c 65 53 63 68 65 6d 61 5d 0a 20  ySimpleSchema]. 
17d0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
17e0: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20  A count_changes 
17f0: 3d 20 31 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61  = 1 }.} {}.forea
1800: 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72 65 73 7d  ch {tn zSql res}
1810: 20 24 46 6b 65 79 53 69 6d 70 6c 65 54 65 73 74   $FkeySimpleTest
1820: 73 20 7b 0a 20 20 69 66 20 7b 24 72 65 73 20 3d  s {.  if {$res =
1830: 3d 20 22 30 20 7b 7d 22 7d 20 7b 20 73 65 74 20  = "0 {}"} { set 
1840: 72 65 73 20 7b 30 20 31 7d 20 7d 0a 20 20 65 78  res {0 1} }.  ex
1850: 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 64 6f  ecsql BEGIN.  do
1860: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 34 2e  _test fkey2-1.4.
1870: 24 74 6e 20 7b 20 63 61 74 63 68 73 71 6c 20 24  $tn { catchsql $
1880: 7a 53 71 6c 20 7d 20 24 72 65 73 0a 20 20 65 78  zSql } $res.  ex
1890: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 0a 65  ecsql COMMIT.}.e
18a0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
18b0: 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 3d 20  count_changes = 
18c0: 30 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  0 }.drop_all_tab
18d0: 6c 65 73 0a 0a 23 20 53 70 65 63 69 61 6c 20 74  les..# Special t
18e0: 65 73 74 3a 20 57 68 65 6e 20 74 68 65 20 70 61  est: When the pa
18f0: 72 65 6e 74 20 6b 65 79 20 69 73 20 61 6e 20 49  rent key is an I
1900: 50 4b 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  PK, make sure th
1910: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 0a 23 20  e affinity of.# 
1920: 74 68 65 20 49 50 4b 20 69 73 20 6e 6f 74 20 61  the IPK is not a
1930: 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 63 68  pplied to the ch
1940: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 20 62 65  ild key value be
1950: 66 6f 72 65 20 69 74 20 69 73 20 69 6e 73 65 72  fore it is inser
1960: 74 65 64 0a 23 20 69 6e 74 6f 20 74 68 65 20 63  ted.# into the c
1970: 68 69 6c 64 20 74 61 62 6c 65 2e 0a 64 6f 5f 74  hild table..do_t
1980: 65 73 74 20 66 6b 65 79 32 2d 31 2e 35 2e 31 20  est fkey2-1.5.1 
1990: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
19a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69    CREATE TABLE i
19b0: 28 69 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (i INTEGER PRIMA
19c0: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
19d0: 41 54 45 20 54 41 42 4c 45 20 6a 28 6a 20 52 45  ATE TABLE j(j RE
19e0: 46 45 52 45 4e 43 45 53 20 69 29 3b 0a 20 20 20  FERENCES i);.   
19f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 20 56   INSERT INTO i V
1a00: 41 4c 55 45 53 28 33 35 29 3b 0a 20 20 20 20 49  ALUES(35);.    I
1a10: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
1a20: 55 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20 20  UES('35.0');.   
1a30: 20 53 45 4c 45 43 54 20 6a 2c 20 74 79 70 65 6f   SELECT j, typeo
1a40: 66 28 6a 29 20 46 52 4f 4d 20 6a 3b 0a 20 20 7d  f(j) FROM j;.  }
1a50: 0a 7d 20 7b 33 35 2e 30 20 74 65 78 74 7d 0a 64  .} {35.0 text}.d
1a60: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 35  o_test fkey2-1.5
1a70: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
1a80: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20  { DELETE FROM i 
1a90: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
1aa0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
1ab0: 61 69 6c 65 64 7d 7d 0a 0a 23 20 53 61 6d 65 20  ailed}}..# Same 
1ac0: 74 65 73 74 20 75 73 69 6e 67 20 61 20 72 65 67  test using a reg
1ad0: 75 6c 61 72 20 70 72 69 6d 61 72 79 20 6b 65 79  ular primary key
1ae0: 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 61 66   with integer af
1af0: 66 69 6e 69 74 79 2e 0a 64 72 6f 70 5f 61 6c 6c  finity..drop_all
1b00: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
1b10: 66 6b 65 79 32 2d 31 2e 36 2e 31 20 7b 0a 20 20  fkey2-1.6.1 {.  
1b20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1b30: 45 41 54 45 20 54 41 42 4c 45 20 69 28 69 20 49  EATE TABLE i(i I
1b40: 4e 54 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20  NT UNIQUE);.    
1b50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a 28 6a  CREATE TABLE j(j
1b60: 20 52 45 46 45 52 45 4e 43 45 53 20 69 28 69 29   REFERENCES i(i)
1b70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1b80: 54 4f 20 69 20 56 41 4c 55 45 53 28 27 33 35 2e  TO i VALUES('35.
1b90: 30 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0');.    INSERT 
1ba0: 49 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 33  INTO j VALUES('3
1bb0: 35 2e 30 27 29 3b 0a 20 20 20 20 53 45 4c 45 43  5.0');.    SELEC
1bc0: 54 20 6a 2c 20 74 79 70 65 6f 66 28 6a 29 20 46  T j, typeof(j) F
1bd0: 52 4f 4d 20 6a 3b 0a 20 20 20 20 53 45 4c 45 43  ROM j;.    SELEC
1be0: 54 20 69 2c 20 74 79 70 65 6f 66 28 69 29 20 46  T i, typeof(i) F
1bf0: 52 4f 4d 20 69 3b 0a 20 20 7d 0a 7d 20 7b 33 35  ROM i;.  }.} {35
1c00: 2e 30 20 74 65 78 74 20 33 35 20 69 6e 74 65 67  .0 text 35 integ
1c10: 65 72 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  er}.do_test fkey
1c20: 32 2d 31 2e 36 2e 32 20 7b 0a 20 20 63 61 74 63  2-1.6.2 {.  catc
1c30: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
1c40: 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  OM i }.} {1 {for
1c50: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
1c60: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 20  int failed}}..# 
1c70: 55 73 65 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  Use a collation 
1c80: 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 20  sequence on the 
1c90: 70 61 72 65 6e 74 20 6b 65 79 2e 0a 64 72 6f 70  parent key..drop
1ca0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
1cb0: 65 73 74 20 66 6b 65 79 32 2d 31 2e 37 2e 31 20  est fkey2-1.7.1 
1cc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1cd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69    CREATE TABLE i
1ce0: 28 69 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20  (i TEXT COLLATE 
1cf0: 6e 6f 63 61 73 65 20 50 52 49 4d 41 52 59 20 4b  nocase PRIMARY K
1d00: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
1d10: 54 41 42 4c 45 20 6a 28 6a 20 54 45 58 54 20 43  TABLE j(j TEXT C
1d20: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 52 45  OLLATE binary RE
1d30: 46 45 52 45 4e 43 45 53 20 69 28 69 29 29 3b 0a  FERENCES i(i));.
1d40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1d50: 69 20 56 41 4c 55 45 53 28 27 53 51 4c 69 74 65  i VALUES('SQLite
1d60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
1d70: 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71  NTO j VALUES('sq
1d80: 6c 69 74 65 27 29 3b 0a 20 20 7d 0a 20 20 63 61  lite');.  }.  ca
1d90: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
1da0: 46 52 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 66  FROM i }.} {1 {f
1db0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
1dc0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
1dd0: 23 20 55 73 65 20 74 68 65 20 70 61 72 65 6e 74  # Use the parent
1de0: 20 6b 65 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 65   key collation e
1df0: 76 65 6e 20 69 66 20 69 74 20 69 73 20 64 65 66  ven if it is def
1e00: 61 75 6c 74 20 61 6e 64 20 74 68 65 20 63 68 69  ault and the chi
1e10: 6c 64 20 6b 65 79 0a 23 20 68 61 73 20 61 6e 20  ld key.# has an 
1e20: 65 78 70 6c 69 63 69 74 20 76 61 6c 75 65 2e 0a  explicit value..
1e30: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
1e40: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e  do_test fkey2-1.
1e50: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
1e60: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1e70: 4c 45 20 69 28 69 20 54 45 58 54 20 50 52 49 4d  LE i(i TEXT PRIM
1e80: 41 52 59 20 4b 45 59 29 3b 20 20 20 20 20 20 20  ARY KEY);       
1e90: 20 2d 2d 20 43 6f 6c 73 65 71 20 69 73 20 22 42   -- Colseq is "B
1ea0: 49 4e 41 52 59 22 0a 20 20 20 20 43 52 45 41 54  INARY".    CREAT
1eb0: 45 20 54 41 42 4c 45 20 6a 28 6a 20 54 45 58 54  E TABLE j(j TEXT
1ec0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
1ed0: 52 45 46 45 52 45 4e 43 45 53 20 69 28 69 29 29  REFERENCES i(i))
1ee0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1ef0: 4f 20 69 20 56 41 4c 55 45 53 28 27 53 51 4c 69  O i VALUES('SQLi
1f00: 74 65 27 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63  te');.  }.  catc
1f10: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
1f20: 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71 6c  TO j VALUES('sql
1f30: 69 74 65 27 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  ite') }.} {1 {fo
1f40: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1f50: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
1f60: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 37 2e  _test fkey2-1.7.
1f70: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
1f80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1f90: 69 20 56 41 4c 55 45 53 28 27 73 71 6c 69 74 65  i VALUES('sqlite
1fa0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
1fb0: 4e 54 4f 20 6a 20 56 41 4c 55 45 53 28 27 73 71  NTO j VALUES('sq
1fc0: 6c 69 74 65 27 29 3b 0a 20 20 20 20 44 45 4c 45  lite');.    DELE
1fd0: 54 45 20 46 52 4f 4d 20 69 20 57 48 45 52 45 20  TE FROM i WHERE 
1fe0: 69 20 3d 20 27 53 51 4c 69 74 65 27 3b 0a 20 20  i = 'SQLite';.  
1ff0: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  }.  catchsql { D
2000: 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 57 48 45  ELETE FROM i WHE
2010: 52 45 20 69 20 3d 20 27 73 71 6c 69 74 65 27 20  RE i = 'sqlite' 
2020: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
2030: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
2040: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 0a 23 20 54 68 69 73 20 73 65 63 74 69  ---.# This secti
20a0: 6f 6e 20 28 74 65 73 74 20 63 61 73 65 73 20 66  on (test cases f
20b0: 6b 65 79 32 2d 32 2e 2a 29 20 63 6f 6e 74 61 69  key2-2.*) contai
20c0: 6e 73 20 74 65 73 74 73 20 74 6f 20 63 68 65 63  ns tests to chec
20d0: 6b 20 74 68 61 74 20 74 68 65 0a 23 20 64 65 66  k that the.# def
20e0: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
20f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6c 6f 67  y constraint log
2100: 69 63 20 77 6f 72 6b 73 2e 0a 23 0a 70 72 6f 63  ic works..#.proc
2110: 20 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 7b 74   fkey2-2-test {t
2120: 6e 20 6e 6f 63 6f 6d 6d 69 74 20 73 71 6c 20 7b  n nocommit sql {
2130: 72 65 73 20 7b 7d 7d 7d 20 7b 0a 20 20 69 66 20  res {}}} {.  if 
2140: 7b 24 72 65 73 20 65 71 20 22 46 4b 56 22 7d 20  {$res eq "FKV"} 
2150: 7b 0a 20 20 20 20 73 65 74 20 65 78 70 65 63 74  {.    set expect
2160: 65 64 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  ed {1 {foreign k
2170: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
2180: 69 6c 65 64 7d 7d 0a 20 20 7d 20 65 6c 73 65 20  iled}}.  } else 
2190: 7b 0a 20 20 20 20 73 65 74 20 65 78 70 65 63 74  {.    set expect
21a0: 65 64 20 5b 6c 69 73 74 20 30 20 24 72 65 73 5d  ed [list 0 $res]
21b0: 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .  }.  do_test f
21c0: 6b 65 79 32 2d 32 2e 24 74 6e 20 5b 6c 69 73 74  key2-2.$tn [list
21d0: 20 63 61 74 63 68 73 71 6c 20 24 73 71 6c 5d 20   catchsql $sql] 
21e0: 24 65 78 70 65 63 74 65 64 0a 20 20 69 66 20 7b  $expected.  if {
21f0: 24 6e 6f 63 6f 6d 6d 69 74 7d 20 7b 0a 20 20 20  $nocommit} {.   
2200: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32   do_test fkey2-2
2210: 2e 24 7b 74 6e 7d 63 20 7b 0a 20 20 20 20 20 20  .${tn}c {.      
2220: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a  catchsql COMMIT.
2230: 20 20 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67      } {1 {foreig
2240: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2250: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 7d 0a 7d 0a   failed}}.  }.}.
2260: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 20  .fkey2-2-test 1 
2270: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
2280: 4c 45 20 6e 6f 64 65 28 0a 20 20 20 20 6e 6f 64  LE node(.    nod
2290: 65 69 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  eid PRIMARY KEY,
22a0: 0a 20 20 20 20 70 61 72 65 6e 74 20 52 45 46 45  .    parent REFE
22b0: 52 45 4e 43 45 53 20 6e 6f 64 65 20 44 45 46 45  RENCES node DEFE
22c0: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
22d0: 20 44 45 46 45 52 52 45 44 0a 20 20 29 3b 0a 20   DEFERRED.  );. 
22e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 65   CREATE TABLE le
22f0: 61 66 28 0a 20 20 20 20 63 65 6c 6c 69 64 20 50  af(.    cellid P
2300: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
2310: 70 61 72 65 6e 74 20 52 45 46 45 52 45 4e 43 45  parent REFERENCE
2320: 53 20 6e 6f 64 65 20 44 45 46 45 52 52 41 42 4c  S node DEFERRABL
2330: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
2340: 52 52 45 44 0a 20 20 29 3b 0a 7d 0a 0a 66 6b 65  RRED.  );.}..fke
2350: 79 32 2d 32 2d 74 65 73 74 20 31 20 20 30 20 22  y2-2-test 1  0 "
2360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65  INSERT INTO node
2370: 20 56 41 4c 55 45 53 28 31 2c 20 30 29 22 20 20   VALUES(1, 0)"  
2380: 20 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32       FKV.fkey2-2
2390: 2d 74 65 73 74 20 32 20 20 30 20 22 42 45 47 49  -test 2  0 "BEGI
23a0: 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  N".fkey2-2-test 
23b0: 33 20 20 31 20 20 20 22 49 4e 53 45 52 54 20 49  3  1   "INSERT I
23c0: 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28  NTO node VALUES(
23d0: 31 2c 20 30 29 22 0a 66 6b 65 79 32 2d 32 2d 74  1, 0)".fkey2-2-t
23e0: 65 73 74 20 34 20 20 30 20 20 20 22 55 50 44 41  est 4  0   "UPDA
23f0: 54 45 20 6e 6f 64 65 20 53 45 54 20 70 61 72 65  TE node SET pare
2400: 6e 74 20 3d 20 4e 55 4c 4c 22 0a 66 6b 65 79 32  nt = NULL".fkey2
2410: 2d 32 2d 74 65 73 74 20 35 20 20 30 20 22 43 4f  -2-test 5  0 "CO
2420: 4d 4d 49 54 22 0a 66 6b 65 79 32 2d 32 2d 74 65  MMIT".fkey2-2-te
2430: 73 74 20 36 20 20 30 20 22 53 45 4c 45 43 54 20  st 6  0 "SELECT 
2440: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2450: 7b 7d 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65 73  {}}..fkey2-2-tes
2460: 74 20 37 20 20 30 20 22 42 45 47 49 4e 22 0a 66  t 7  0 "BEGIN".f
2470: 6b 65 79 32 2d 32 2d 74 65 73 74 20 38 20 20 31  key2-2-test 8  1
2480: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2490: 6c 65 61 66 20 56 41 4c 55 45 53 28 27 61 27 2c  leaf VALUES('a',
24a0: 20 32 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73   2)".fkey2-2-tes
24b0: 74 20 39 20 20 31 20 20 20 22 49 4e 53 45 52 54  t 9  1   "INSERT
24c0: 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45   INTO node VALUE
24d0: 53 28 32 2c 20 30 29 22 0a 66 6b 65 79 32 2d 32  S(2, 0)".fkey2-2
24e0: 2d 74 65 73 74 20 31 30 20 30 20 20 20 22 55 50  -test 10 0   "UP
24f0: 44 41 54 45 20 6e 6f 64 65 20 53 45 54 20 70 61  DATE node SET pa
2500: 72 65 6e 74 20 3d 20 31 20 57 48 45 52 45 20 6e  rent = 1 WHERE n
2510: 6f 64 65 69 64 20 3d 20 32 22 0a 66 6b 65 79 32  odeid = 2".fkey2
2520: 2d 32 2d 74 65 73 74 20 31 31 20 30 20 22 43 4f  -2-test 11 0 "CO
2530: 4d 4d 49 54 22 0a 66 6b 65 79 32 2d 32 2d 74 65  MMIT".fkey2-2-te
2540: 73 74 20 31 32 20 30 20 22 53 45 4c 45 43 54 20  st 12 0 "SELECT 
2550: 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20  * FROM node" {1 
2560: 7b 7d 20 32 20 31 7d 0a 66 6b 65 79 32 2d 32 2d  {} 2 1}.fkey2-2-
2570: 74 65 73 74 20 31 33 20 30 20 22 53 45 4c 45 43  test 13 0 "SELEC
2580: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
2590: 61 20 32 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  a 2}..fkey2-2-te
25a0: 73 74 20 31 34 20 30 20 22 42 45 47 49 4e 22 0a  st 14 0 "BEGIN".
25b0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 35 20  fkey2-2-test 15 
25c0: 31 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  1   "DELETE FROM
25d0: 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f 64 65   node WHERE node
25e0: 69 64 20 3d 20 32 22 0a 66 6b 65 79 32 2d 32 2d  id = 2".fkey2-2-
25f0: 74 65 73 74 20 31 36 20 30 20 20 20 22 49 4e 53  test 16 0   "INS
2600: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
2610: 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29 22 0a 66  LUES(2, NULL)".f
2620: 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 37 20 30  key2-2-test 17 0
2630: 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65 79 32 2d   "COMMIT".fkey2-
2640: 32 2d 74 65 73 74 20 31 38 20 30 20 22 53 45 4c  2-test 18 0 "SEL
2650: 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64 65 22  ECT * FROM node"
2660: 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 66 6b 65   {1 {} 2 {}}.fke
2670: 79 32 2d 32 2d 74 65 73 74 20 31 39 20 30 20 22  y2-2-test 19 0 "
2680: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 65  SELECT * FROM le
2690: 61 66 22 20 7b 61 20 32 7d 0a 0a 66 6b 65 79 32  af" {a 2}..fkey2
26a0: 2d 32 2d 74 65 73 74 20 32 30 20 30 20 22 42 45  -2-test 20 0 "BE
26b0: 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73  GIN".fkey2-2-tes
26c0: 74 20 32 31 20 30 20 20 20 22 49 4e 53 45 52 54  t 21 0   "INSERT
26d0: 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45   INTO leaf VALUE
26e0: 53 28 27 62 27 2c 20 31 29 22 0a 66 6b 65 79 32  S('b', 1)".fkey2
26f0: 2d 32 2d 74 65 73 74 20 32 32 20 30 20 20 20 22  -2-test 22 0   "
2700: 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 22 0a  SAVEPOINT save".
2710: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 33 20  fkey2-2-test 23 
2720: 30 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52  0     "DELETE FR
2730: 4f 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f  OM node WHERE no
2740: 64 65 69 64 20 3d 20 31 22 0a 66 6b 65 79 32 2d  deid = 1".fkey2-
2750: 32 2d 74 65 73 74 20 32 34 20 30 20 20 20 22 52  2-test 24 0   "R
2760: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 22  OLLBACK TO save"
2770: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 35  .fkey2-2-test 25
2780: 20 30 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65 79   0 "COMMIT".fkey
2790: 32 2d 32 2d 74 65 73 74 20 32 36 20 30 20 22 53  2-2-test 26 0 "S
27a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64  ELECT * FROM nod
27b0: 65 22 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 0a 66  e" {1 {} 2 {}}.f
27c0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 37 20 30  key2-2-test 27 0
27d0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
27e0: 6c 65 61 66 22 20 7b 61 20 32 20 62 20 31 7d 0a  leaf" {a 2 b 1}.
27f0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 38  .fkey2-2-test 28
2800: 20 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79 32   0 "BEGIN".fkey2
2810: 2d 32 2d 74 65 73 74 20 32 39 20 30 20 20 20 22  -2-test 29 0   "
2820: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66  INSERT INTO leaf
2830: 20 56 41 4c 55 45 53 28 27 63 27 2c 20 31 29 22   VALUES('c', 1)"
2840: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 30  .fkey2-2-test 30
2850: 20 30 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20   0   "SAVEPOINT 
2860: 73 61 76 65 22 0a 66 6b 65 79 32 2d 32 2d 74 65  save".fkey2-2-te
2870: 73 74 20 33 31 20 30 20 20 20 20 20 22 44 45 4c  st 31 0     "DEL
2880: 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20 57 48  ETE FROM node WH
2890: 45 52 45 20 6e 6f 64 65 69 64 20 3d 20 31 22 0a  ERE nodeid = 1".
28a0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 32 20  fkey2-2-test 32 
28b0: 31 20 20 20 22 52 45 4c 45 41 53 45 20 73 61 76  1   "RELEASE sav
28c0: 65 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  e".fkey2-2-test 
28d0: 33 33 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  33 1   "DELETE F
28e0: 52 4f 4d 20 6c 65 61 66 20 57 48 45 52 45 20 63  ROM leaf WHERE c
28f0: 65 6c 6c 69 64 20 3d 20 27 62 27 22 0a 66 6b 65  ellid = 'b'".fke
2900: 79 32 2d 32 2d 74 65 73 74 20 33 34 20 30 20 20  y2-2-test 34 0  
2910: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65   "DELETE FROM le
2920: 61 66 20 57 48 45 52 45 20 63 65 6c 6c 69 64 20  af WHERE cellid 
2930: 3d 20 27 63 27 22 0a 66 6b 65 79 32 2d 32 2d 74  = 'c'".fkey2-2-t
2940: 65 73 74 20 33 35 20 30 20 22 43 4f 4d 4d 49 54  est 35 0 "COMMIT
2950: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33  ".fkey2-2-test 3
2960: 36 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52  6 0 "SELECT * FR
2970: 4f 4d 20 6e 6f 64 65 22 20 7b 32 20 7b 7d 7d 20  OM node" {2 {}} 
2980: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 37  .fkey2-2-test 37
2990: 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   0 "SELECT * FRO
29a0: 4d 20 6c 65 61 66 22 20 7b 61 20 32 7d 0a 0a 66  M leaf" {a 2}..f
29b0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 33 38 20 30  key2-2-test 38 0
29c0: 20 22 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65   "SAVEPOINT oute
29d0: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
29e0: 33 39 20 31 20 20 20 22 49 4e 53 45 52 54 20 49  39 1   "INSERT I
29f0: 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28  NTO leaf VALUES(
2a00: 27 64 27 2c 20 33 29 22 0a 66 6b 65 79 32 2d 32  'd', 3)".fkey2-2
2a10: 2d 74 65 73 74 20 34 30 20 31 20 22 52 45 4c 45  -test 40 1 "RELE
2a20: 41 53 45 20 6f 75 74 65 72 22 20 20 20 20 46 4b  ASE outer"    FK
2a30: 56 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 34  V.fkey2-2-test 4
2a40: 31 20 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e  1 1   "INSERT IN
2a50: 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28 27  TO leaf VALUES('
2a60: 65 27 2c 20 33 29 22 0a 66 6b 65 79 32 2d 32 2d  e', 3)".fkey2-2-
2a70: 74 65 73 74 20 34 32 20 30 20 20 20 22 49 4e 53  test 42 0   "INS
2a80: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
2a90: 4c 55 45 53 28 33 2c 20 32 29 22 0a 66 6b 65 79  LUES(3, 2)".fkey
2aa0: 32 2d 32 2d 74 65 73 74 20 34 33 20 30 20 22 52  2-2-test 43 0 "R
2ab0: 45 4c 45 41 53 45 20 6f 75 74 65 72 22 0a 0a 66  ELEASE outer"..f
2ac0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 34 34 20 30  key2-2-test 44 0
2ad0: 20 22 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65   "SAVEPOINT oute
2ae0: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
2af0: 34 35 20 31 20 20 20 22 44 45 4c 45 54 45 20 46  45 1   "DELETE F
2b00: 52 4f 4d 20 6e 6f 64 65 20 57 48 45 52 45 20 6e  ROM node WHERE n
2b10: 6f 64 65 69 64 3d 33 22 0a 66 6b 65 79 32 2d 32  odeid=3".fkey2-2
2b20: 2d 74 65 73 74 20 34 37 20 30 20 20 20 22 49 4e  -test 47 0   "IN
2b30: 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56  SERT INTO node V
2b40: 41 4c 55 45 53 28 33 2c 20 32 29 22 0a 66 6b 65  ALUES(3, 2)".fke
2b50: 79 32 2d 32 2d 74 65 73 74 20 34 38 20 30 20 22  y2-2-test 48 0 "
2b60: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 75 74 65  ROLLBACK TO oute
2b70: 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  r".fkey2-2-test 
2b80: 34 39 20 30 20 22 52 45 4c 45 41 53 45 20 6f 75  49 0 "RELEASE ou
2b90: 74 65 72 22 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  ter"..fkey2-2-te
2ba0: 73 74 20 35 30 20 30 20 22 53 41 56 45 50 4f 49  st 50 0 "SAVEPOI
2bb0: 4e 54 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d  NT outer".fkey2-
2bc0: 32 2d 74 65 73 74 20 35 31 20 31 20 20 20 22 49  2-test 51 1   "I
2bd0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20  NSERT INTO leaf 
2be0: 56 41 4c 55 45 53 28 27 66 27 2c 20 34 29 22 0a  VALUES('f', 4)".
2bf0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 32 20  fkey2-2-test 52 
2c00: 31 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20 69  1   "SAVEPOINT i
2c10: 6e 6e 65 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65  nner".fkey2-2-te
2c20: 73 74 20 35 33 20 31 20 20 20 20 20 22 49 4e 53  st 53 1     "INS
2c30: 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41  ERT INTO leaf VA
2c40: 4c 55 45 53 28 27 67 27 2c 20 34 29 22 0a 66 6b  LUES('g', 4)".fk
2c50: 65 79 32 2d 32 2d 74 65 73 74 20 35 34 20 31 20  ey2-2-test 54 1 
2c60: 20 22 52 45 4c 45 41 53 45 20 6f 75 74 65 72 22   "RELEASE outer"
2c70: 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32 2d 74     FKV.fkey2-2-t
2c80: 65 73 74 20 35 35 20 31 20 20 20 22 52 4f 4c 4c  est 55 1   "ROLL
2c90: 42 41 43 4b 20 54 4f 20 69 6e 6e 65 72 22 0a 66  BACK TO inner".f
2ca0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 36 20 30  key2-2-test 56 0
2cb0: 20 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20 20    "COMMIT"      
2cc0: 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32 2d      FKV.fkey2-2-
2cd0: 74 65 73 74 20 35 37 20 30 20 20 20 22 49 4e 53  test 57 0   "INS
2ce0: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20 56 41  ERT INTO node VA
2cf0: 4c 55 45 53 28 34 2c 20 4e 55 4c 4c 29 22 0a 66  LUES(4, NULL)".f
2d00: 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 38 20 30  key2-2-test 58 0
2d10: 20 22 52 45 4c 45 41 53 45 20 6f 75 74 65 72 22   "RELEASE outer"
2d20: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 39  .fkey2-2-test 59
2d30: 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   0 "SELECT * FRO
2d40: 4d 20 6e 6f 64 65 22 20 7b 32 20 7b 7d 20 33 20  M node" {2 {} 3 
2d50: 32 20 34 20 7b 7d 7d 0a 66 6b 65 79 32 2d 32 2d  2 4 {}}.fkey2-2-
2d60: 74 65 73 74 20 36 30 20 30 20 22 53 45 4c 45 43  test 60 0 "SELEC
2d70: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
2d80: 61 20 32 20 64 20 33 20 65 20 33 20 66 20 34 7d  a 2 d 3 e 3 f 4}
2d90: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
2da0: 67 20 73 65 74 20 6f 66 20 74 65 73 74 73 20 63  g set of tests c
2db0: 68 65 63 6b 20 74 68 61 74 20 69 66 20 61 20 73  heck that if a s
2dc0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 61 66  tatement that af
2dd0: 66 65 63 74 73 20 0a 23 20 6d 75 6c 74 69 70 6c  fects .# multipl
2de0: 65 20 72 6f 77 73 20 76 69 6f 6c 61 74 65 73 20  e rows violates 
2df0: 73 6f 6d 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  some foreign key
2e00: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
2e10: 65 6e 20 73 74 72 69 6b 65 73 20 61 20 0a 23 20  en strikes a .# 
2e20: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20  constraint that 
2e30: 63 61 75 73 65 73 20 74 68 65 20 73 74 61 74 65  causes the state
2e40: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
2e50: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
2e60: 63 6b 2c 20 0a 23 20 74 68 65 20 64 65 66 65 72  ck, .# the defer
2e70: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
2e80: 6f 75 6e 74 65 72 20 69 73 20 63 6f 72 72 65 63  ounter is correc
2e90: 74 6c 79 20 72 65 73 65 74 20 74 6f 20 74 68 65  tly reset to the
2ea0: 20 76 61 6c 75 65 20 69 74 20 0a 23 20 68 61 64   value it .# had
2eb0: 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
2ec0: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
2ed0: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 23 0a  n was opened..#.
2ee0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 31 20  fkey2-2-test 61 
2ef0: 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79 32 2d  0 "BEGIN".fkey2-
2f00: 32 2d 74 65 73 74 20 36 32 20 30 20 20 20 22 44  2-test 62 0   "D
2f10: 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 66 22  ELETE FROM leaf"
2f20: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 33  .fkey2-2-test 63
2f30: 20 30 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   0   "DELETE FRO
2f40: 4d 20 6e 6f 64 65 22 0a 66 6b 65 79 32 2d 32 2d  M node".fkey2-2-
2f50: 74 65 73 74 20 36 34 20 31 20 20 20 22 49 4e 53  test 64 1   "INS
2f60: 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41  ERT INTO leaf VA
2f70: 4c 55 45 53 28 27 61 27 2c 20 31 29 22 0a 66 6b  LUES('a', 1)".fk
2f80: 65 79 32 2d 32 2d 74 65 73 74 20 36 35 20 31 20  ey2-2-test 65 1 
2f90: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c    "INSERT INTO l
2fa0: 65 61 66 20 56 41 4c 55 45 53 28 27 62 27 2c 20  eaf VALUES('b', 
2fb0: 32 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  2)".fkey2-2-test
2fc0: 20 36 36 20 31 20 20 20 22 49 4e 53 45 52 54 20   66 1   "INSERT 
2fd0: 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53  INTO leaf VALUES
2fe0: 28 27 63 27 2c 20 31 29 22 0a 64 6f 5f 74 65 73  ('c', 1)".do_tes
2ff0: 74 20 66 6b 65 79 32 2d 32 2d 74 65 73 74 2d 36  t fkey2-2-test-6
3000: 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 20  7 {.  catchsql  
3010: 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
3020: 49 4e 54 4f 20 6e 6f 64 65 20 53 45 4c 45 43 54  INTO node SELECT
3030: 20 70 61 72 65 6e 74 2c 20 33 20 46 52 4f 4d 20   parent, 3 FROM 
3040: 6c 65 61 66 22 0a 7d 20 7b 31 20 7b 63 6f 6c 75  leaf".} {1 {colu
3050: 6d 6e 20 6e 6f 64 65 69 64 20 69 73 20 6e 6f 74  mn nodeid is not
3060: 20 75 6e 69 71 75 65 7d 7d 0a 66 6b 65 79 32 2d   unique}}.fkey2-
3070: 32 2d 74 65 73 74 20 36 38 20 30 20 22 43 4f 4d  2-test 68 0 "COM
3080: 4d 49 54 22 20 20 20 20 20 20 20 20 20 20 20 46  MIT"           F
3090: 4b 56 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  KV.fkey2-2-test 
30a0: 36 39 20 31 20 20 20 22 49 4e 53 45 52 54 20 49  69 1   "INSERT I
30b0: 4e 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28  NTO node VALUES(
30c0: 31 2c 20 4e 55 4c 4c 29 22 0a 66 6b 65 79 32 2d  1, NULL)".fkey2-
30d0: 32 2d 74 65 73 74 20 37 30 20 30 20 20 20 22 49  2-test 70 0   "I
30e0: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20  NSERT INTO node 
30f0: 56 41 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 29 22  VALUES(2, NULL)"
3100: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 37 31  .fkey2-2-test 71
3110: 20 30 20 22 43 4f 4d 4d 49 54 22 0a 0a 66 6b 65   0 "COMMIT"..fke
3120: 79 32 2d 32 2d 74 65 73 74 20 37 32 20 30 20 22  y2-2-test 72 0 "
3130: 42 45 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74  BEGIN".fkey2-2-t
3140: 65 73 74 20 37 33 20 31 20 20 20 22 44 45 4c 45  est 73 1   "DELE
3150: 54 45 20 46 52 4f 4d 20 6e 6f 64 65 22 0a 66 6b  TE FROM node".fk
3160: 65 79 32 2d 32 2d 74 65 73 74 20 37 34 20 30 20  ey2-2-test 74 0 
3170: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e    "INSERT INTO n
3180: 6f 64 65 28 6e 6f 64 65 69 64 29 20 53 45 4c 45  ode(nodeid) SELE
3190: 43 54 20 44 49 53 54 49 4e 43 54 20 70 61 72 65  CT DISTINCT pare
31a0: 6e 74 20 46 52 4f 4d 20 6c 65 61 66 22 0a 66 6b  nt FROM leaf".fk
31b0: 65 79 32 2d 32 2d 74 65 73 74 20 37 35 20 30 20  ey2-2-test 75 0 
31c0: 22 43 4f 4d 4d 49 54 22 0a 0a 23 2d 2d 2d 2d 2d  "COMMIT"..#-----
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
3220: 73 20 66 6b 65 79 32 2d 33 2e 2a 20 74 65 73 74  s fkey2-3.* test
3230: 20 74 68 61 74 20 61 20 70 72 6f 67 72 61 6d 20   that a program 
3240: 74 68 61 74 20 65 78 65 63 75 74 65 73 20 66 6f  that executes fo
3250: 72 65 69 67 6e 20 6b 65 79 0a 23 20 61 63 74 69  reign key.# acti
3260: 6f 6e 73 20 28 43 41 53 43 41 44 45 2c 20 53 45  ons (CASCADE, SE
3270: 54 20 44 45 46 41 55 4c 54 2c 20 53 45 54 20 4e  T DEFAULT, SET N
3280: 55 4c 4c 20 65 74 63 2e 29 20 6f 72 20 74 65 73  ULL etc.) or tes
3290: 74 73 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  ts FK constraint
32a0: 73 0a 23 20 6f 70 65 6e 73 20 61 20 73 74 61 74  s.# opens a stat
32b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
32c0: 6e 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 23  n if required..#
32d0: 0a 23 20 66 6b 65 79 32 2d 33 2e 31 2e 2a 3a 20  .# fkey2-3.1.*: 
32e0: 54 65 73 74 20 55 50 44 41 54 45 20 73 74 61 74  Test UPDATE stat
32f0: 65 6d 65 6e 74 73 2e 0a 23 20 66 6b 65 79 32 2d  ements..# fkey2-
3300: 33 2e 32 2e 2a 3a 20 54 65 73 74 20 44 45 4c 45  3.2.*: Test DELE
3310: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23  TE statements..#
3320: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
3330: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33  .do_test fkey2-3
3340: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
3350: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
3360: 42 4c 45 20 61 62 28 61 20 50 52 49 4d 41 52 59  BLE ab(a PRIMARY
3370: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
3380: 45 41 54 45 20 54 41 42 4c 45 20 63 64 28 0a 20  EATE TABLE cd(. 
3390: 20 20 20 20 20 63 20 50 52 49 4d 41 52 59 20 4b       c PRIMARY K
33a0: 45 59 20 52 45 46 45 52 45 4e 43 45 53 20 61 62  EY REFERENCES ab
33b0: 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
33c0: 44 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53  DE ON DELETE CAS
33d0: 43 41 44 45 2c 20 0a 20 20 20 20 20 20 64 0a 20  CADE, .      d. 
33e0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
33f0: 20 54 41 42 4c 45 20 65 66 28 0a 20 20 20 20 20   TABLE ef(.     
3400: 20 65 20 52 45 46 45 52 45 4e 43 45 53 20 63 64   e REFERENCES cd
3410: 20 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41   ON UPDATE CASCA
3420: 44 45 2c 20 0a 20 20 20 20 20 20 66 2c 20 43 48  DE, .      f, CH
3430: 45 43 4b 20 28 65 21 3d 35 29 0a 20 20 20 20 29  ECK (e!=5).    )
3440: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
3450: 73 74 20 66 6b 65 79 32 2d 33 2e 31 2e 32 20 7b  st fkey2-3.1.2 {
3460: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
3480: 56 41 4c 55 45 53 28 31 2c 20 27 62 27 29 3b 0a  VALUES(1, 'b');.
3490: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
34a0: 63 64 20 56 41 4c 55 45 53 28 31 2c 20 27 64 27  cd VALUES(1, 'd'
34b0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
34c0: 54 4f 20 65 66 20 56 41 4c 55 45 53 28 31 2c 20  TO ef VALUES(1, 
34d0: 27 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  'e');.  }.} {}.d
34e0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 31  o_test fkey2-3.1
34f0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
3500: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
3510: 61 20 3d 20 35 20 7d 0a 7d 20 7b 31 20 7b 63 6f  a = 5 }.} {1 {co
3520: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
3530: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
3540: 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  3.1.4 {.  execsq
3550: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
3560: 4d 20 61 62 20 7d 0a 7d 20 7b 31 20 62 7d 0a 64  M ab }.} {1 b}.d
3570: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 31  o_test fkey2-3.1
3580: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42  .4 {.  execsql B
3590: 45 47 49 4e 3b 0a 20 20 63 61 74 63 68 73 71 6c  EGIN;.  catchsql
35a0: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
35b0: 20 61 20 3d 20 35 20 7d 0a 7d 20 7b 31 20 7b 63   a = 5 }.} {1 {c
35c0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
35d0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
35e0: 2d 33 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  -3.1.5 {.  execs
35f0: 71 6c 20 43 4f 4d 4d 49 54 3b 0a 20 20 65 78 65  ql COMMIT;.  exe
3600: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
3610: 46 52 4f 4d 20 61 62 3b 20 53 45 4c 45 43 54 20  FROM ab; SELECT 
3620: 2a 20 46 52 4f 4d 20 63 64 3b 20 53 45 4c 45 43  * FROM cd; SELEC
3630: 54 20 2a 20 46 52 4f 4d 20 65 66 20 7d 0a 7d 20  T * FROM ef }.} 
3640: 7b 31 20 62 20 31 20 64 20 31 20 65 7d 0a 0a 64  {1 b 1 d 1 e}..d
3650: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e 32  o_test fkey2-3.2
3660: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42  .1 {.  execsql B
3670: 45 47 49 4e 3b 0a 20 20 63 61 74 63 68 73 71 6c  EGIN;.  catchsql
3680: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61   { DELETE FROM a
3690: 62 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  b }.} {1 {foreig
36a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
36b0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
36c0: 74 20 66 6b 65 79 32 2d 33 2e 32 2e 32 20 7b 0a  t fkey2-3.2.2 {.
36d0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
36e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
36f0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 3b 20 53  ECT * FROM ab; S
3700: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 64 3b  ELECT * FROM cd;
3710: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
3720: 66 20 7d 0a 7d 20 7b 31 20 62 20 31 20 64 20 31  f }.} {1 b 1 d 1
3730: 20 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   e}..#----------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3780: 23 20 54 65 73 74 20 63 61 73 65 73 20 66 6b 65  # Test cases fke
3790: 79 32 2d 34 2e 2a 20 74 65 73 74 20 74 68 61 74  y2-4.* test that
37a0: 20 72 65 63 75 72 73 69 76 65 20 66 6f 72 65 69   recursive forei
37b0: 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 73 20 0a  gn key actions .
37c0: 23 20 28 69 2e 65 2e 20 43 41 53 43 41 44 45 29  # (i.e. CASCADE)
37d0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 65 76 65   are allowed eve
37e0: 6e 20 69 66 20 72 65 63 75 72 73 69 76 65 20 74  n if recursive t
37f0: 72 69 67 67 65 72 73 20 61 72 65 20 64 69 73 61  riggers are disa
3800: 62 6c 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  bled..#.drop_all
3810: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
3820: 66 6b 65 79 32 2d 34 2e 31 20 7b 0a 20 20 65 78  fkey2-4.1 {.  ex
3830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3840: 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20  TE TABLE t1(.   
3850: 20 20 20 6e 6f 64 65 20 50 52 49 4d 41 52 59 20     node PRIMARY 
3860: 4b 45 59 2c 20 0a 20 20 20 20 20 20 70 61 72 65  KEY, .      pare
3870: 6e 74 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  nt REFERENCES t1
3880: 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
3890: 44 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52  DE.    );.    CR
38a0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 6e 6f  EATE TABLE t2(no
38b0: 64 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  de PRIMARY KEY, 
38c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 43 52 45  parent);.    CRE
38d0: 41 54 45 20 54 52 49 47 47 45 52 20 74 32 74 20  ATE TRIGGER t2t 
38e0: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
38f0: 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44  t2 BEGIN.      D
3900: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
3910: 45 52 45 20 70 61 72 65 6e 74 20 3d 20 6f 6c 64  ERE parent = old
3920: 2e 6e 6f 64 65 3b 0a 20 20 20 20 45 4e 44 3b 0a  .node;.    END;.
3930: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3940: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  t1 VALUES(1, NUL
3950: 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  L);.    INSERT I
3960: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
3970: 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   1);.    INSERT 
3980: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
3990: 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
39a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
39b0: 34 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  4, 2);.    INSER
39c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
39d0: 28 35 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (5, 2);.    INSE
39e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
39f0: 53 28 36 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53  S(6, 3);.    INS
3a00: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3a10: 45 53 28 37 2c 20 33 29 3b 0a 20 20 20 20 49 4e  ES(7, 3);.    IN
3a20: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
3a30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
3a40: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
3a50: 66 6b 65 79 32 2d 34 2e 32 20 7b 0a 20 20 65 78  fkey2-4.2 {.  ex
3a60: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72  ecsql { PRAGMA r
3a70: 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
3a80: 73 20 3d 20 6f 66 66 20 7d 0a 20 20 65 78 65 63  s = off }.  exec
3a90: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
3aa0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
3ab0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 6f 64  ROM t1 WHERE nod
3ac0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c  e = 1;.      SEL
3ad0: 45 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 31  ECT node FROM t1
3ae0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
3af0: 73 74 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a 20  st fkey2-4.3 {. 
3b00: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
3b10: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
3b20: 20 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b   WHERE node = 1;
3b30: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 6f  .      SELECT no
3b40: 64 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  de FROM t2;.    
3b50: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
3b60: 7b 34 20 35 20 36 20 37 7d 0a 64 6f 5f 74 65 73  {4 5 6 7}.do_tes
3b70: 74 20 66 6b 65 79 32 2d 34 2e 34 20 7b 0a 20 20  t fkey2-4.4 {.  
3b80: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
3b90: 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
3ba0: 65 72 73 20 3d 20 6f 6e 20 7d 0a 20 20 65 78 65  ers = on }.  exe
3bb0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
3bc0: 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  N;.      DELETE 
3bd0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6e 6f  FROM t1 WHERE no
3be0: 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45  de = 1;.      SE
3bf0: 4c 45 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74  LECT node FROM t
3c00: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
3c10: 65 73 74 20 66 6b 65 79 32 2d 34 2e 33 20 7b 0a  est fkey2-4.3 {.
3c20: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
3c30: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
3c40: 32 20 57 48 45 52 45 20 6e 6f 64 65 20 3d 20 31  2 WHERE node = 1
3c50: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e  ;.      SELECT n
3c60: 6f 64 65 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ode FROM t2;.   
3c70: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
3c80: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3cd0: 23 20 54 65 73 74 20 63 61 73 65 73 20 66 6b 65  # Test cases fke
3ce0: 79 32 2d 35 2e 2a 20 76 65 72 69 66 79 20 74 68  y2-5.* verify th
3cf0: 61 74 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  at the increment
3d00: 61 6c 20 62 6c 6f 62 20 41 50 49 20 6d 61 79 20  al blob API may 
3d10: 6e 6f 74 0a 23 20 77 72 69 74 65 20 74 6f 20 61  not.# write to a
3d20: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6c   foreign key col
3d30: 75 6d 6e 20 77 68 69 6c 65 20 66 6f 72 65 69 67  umn while foreig
3d40: 6e 2d 6b 65 79 73 20 61 72 65 20 65 6e 61 62 6c  n-keys are enabl
3d50: 65 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  ed..#.drop_all_t
3d60: 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65 20  ables.ifcapable 
3d70: 69 6e 63 72 62 6c 6f 62 20 7b 0a 20 20 64 6f 5f  incrblob {.  do_
3d80: 74 65 73 74 20 66 6b 65 79 32 2d 35 2e 31 20 7b  test fkey2-5.1 {
3d90: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3da0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
3db0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
3dc0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  EY, b);.      CR
3dd0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
3de0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
3df0: 45 46 45 52 45 4e 43 45 53 20 74 31 28 61 29 29  EFERENCES t1(a))
3e00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3e10: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 68  NTO t1 VALUES('h
3e20: 65 6c 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 3b  ello', 'world');
3e30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3e40: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6b 65  TO t2 VALUES('ke
3e50: 79 27 2c 20 27 68 65 6c 6c 6f 27 29 3b 0a 20 20  y', 'hello');.  
3e60: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
3e70: 74 65 73 74 20 66 6b 65 79 32 2d 35 2e 32 20 7b  test fkey2-5.2 {
3e80: 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74  .    set rc [cat
3e90: 63 68 20 7b 20 73 65 74 20 66 64 20 5b 64 62 20  ch { set fd [db 
3ea0: 69 6e 63 72 62 6c 6f 62 20 74 32 20 62 20 31 5d  incrblob t2 b 1]
3eb0: 20 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73 74   } msg].    list
3ec0: 20 24 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b 31   $rc $msg.  } {1
3ed0: 20 7b 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 6f   {cannot open fo
3ee0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6c 75 6d 6e  reign key column
3ef0: 20 66 6f 72 20 77 72 69 74 69 6e 67 7d 7d 0a 20   for writing}}. 
3f00: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35   do_test fkey2-5
3f10: 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20  .3 {.    set rc 
3f20: 5b 63 61 74 63 68 20 7b 20 73 65 74 20 66 64 20  [catch { set fd 
3f30: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
3f40: 61 64 6f 6e 6c 79 20 74 32 20 62 20 31 5d 20 7d  adonly t2 b 1] }
3f50: 20 6d 73 67 5d 0a 20 20 20 20 63 6c 6f 73 65 20   msg].    close 
3f60: 24 66 64 0a 20 20 20 20 73 65 74 20 72 63 0a 20  $fd.    set rc. 
3f70: 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74   } {0}.  do_test
3f80: 20 66 6b 65 79 32 2d 35 2e 34 20 7b 0a 20 20 20   fkey2-5.4 {.   
3f90: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
3fa0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
3fb0: 20 6f 66 66 20 7d 0a 20 20 20 20 73 65 74 20 72   off }.    set r
3fc0: 63 20 5b 63 61 74 63 68 20 7b 20 73 65 74 20 66  c [catch { set f
3fd0: 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74  d [db incrblob t
3fe0: 32 20 62 20 31 5d 20 7d 20 6d 73 67 5d 0a 20 20  2 b 1] } msg].  
3ff0: 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20    close $fd.    
4000: 73 65 74 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20  set rc.  } {0}. 
4010: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35   do_test fkey2-5
4020: 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .5 {.    execsql
4030: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
4040: 6e 5f 6b 65 79 73 20 3d 20 6f 6e 20 7d 0a 20 20  n_keys = on }.  
4050: 7d 20 7b 7d 0a 7d 0a 0a 64 72 6f 70 5f 61 6c 6c  } {}.}..drop_all
4060: 5f 74 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c  _tables.ifcapabl
4070: 65 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f  e vacuum {.  do_
4080: 74 65 73 74 20 66 6b 65 79 32 2d 36 2e 31 20 7b  test fkey2-6.1 {
4090: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
40a0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
40b0: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
40c0: 53 20 74 32 28 63 29 2c 20 62 29 3b 0a 20 20 20  S t2(c), b);.   
40d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
40e0: 74 32 28 63 20 55 4e 49 51 55 45 2c 20 62 29 3b  t2(c UNIQUE, b);
40f0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4100: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
4110: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
4120: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4130: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 56 41 43  1, 2);.      VAC
4140: 55 55 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  UUM;.    }.  } {
4150: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
41a0: 23 20 54 65 73 74 20 74 68 61 74 20 69 74 20 69  # Test that it i
41b0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  s possible to us
41c0: 65 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  e an INTEGER PRI
41d0: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
41e0: 63 68 69 6c 64 20 6b 65 79 0a 23 20 6f 66 20 61  child key.# of a
41f0: 20 66 6f 72 65 69 67 6e 20 63 6f 6e 73 74 72 61   foreign constra
4200: 69 6e 74 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c  int..# .drop_all
4210: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
4220: 66 6b 65 79 32 2d 37 2e 31 20 7b 0a 20 20 65 78  fkey2-7.1 {.  ex
4230: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
4240: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
4250: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
4260: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4270: 74 32 28 63 20 49 4e 54 45 47 45 52 20 50 52 49  t2(c INTEGER PRI
4280: 4d 41 52 59 20 4b 45 59 20 52 45 46 45 52 45 4e  MARY KEY REFEREN
4290: 43 45 53 20 74 31 2c 20 62 29 3b 0a 20 20 7d 0a  CES t1, b);.  }.
42a0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
42b0: 79 32 2d 37 2e 32 20 7b 0a 20 20 63 61 74 63 68  y2-7.2 {.  catch
42c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
42d0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27  O t2 VALUES(1, '
42e0: 41 27 29 3b 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72  A'); }.} {1 {for
42f0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
4300: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
4310: 74 65 73 74 20 66 6b 65 79 32 2d 37 2e 33 20 7b  test fkey2-7.3 {
4320: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
4330: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4340: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
4350: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4360: 31 20 56 41 4c 55 45 53 28 32 2c 20 33 29 3b 0a  1 VALUES(2, 3);.
4370: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4380: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27  t2 VALUES(1, 'A'
4390: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
43a0: 65 73 74 20 66 6b 65 79 32 2d 37 2e 34 20 7b 0a  est fkey2-7.4 {.
43b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
43c0: 54 45 20 74 32 20 53 45 54 20 63 20 3d 20 32 20  TE t2 SET c = 2 
43d0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
43e0: 6b 65 79 32 2d 37 2e 35 20 7b 0a 20 20 63 61 74  key2-7.5 {.  cat
43f0: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
4400: 32 20 53 45 54 20 63 20 3d 20 33 20 7d 0a 7d 20  2 SET c = 3 }.} 
4410: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
4420: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
4430: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
4440: 32 2d 37 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  2-7.6 {.  catchs
4450: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
4460: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 32 20   t1 WHERE a = 2 
4470: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
4480: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
4490: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
44a0: 66 6b 65 79 32 2d 37 2e 37 20 7b 0a 20 20 65 78  fkey2-7.7 {.  ex
44b0: 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
44c0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
44d0: 20 31 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   1 }.} {}.do_tes
44e0: 74 20 66 6b 65 79 32 2d 37 2e 38 20 7b 0a 20 20  t fkey2-7.8 {.  
44f0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
4500: 45 20 74 31 20 53 45 54 20 61 20 3d 20 33 20 7d  E t1 SET a = 3 }
4510: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
4520: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
4530: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
4540: 6b 65 79 32 2d 37 2e 39 20 7b 0a 20 20 63 61 74  key2-7.9 {.  cat
4550: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
4560: 32 20 53 45 54 20 72 6f 77 69 64 20 3d 20 33 20  2 SET rowid = 3 
4570: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
4580: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
4590: 61 69 6c 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ailed}}..#------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
45f0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
4600: 6c 65 20 74 6f 20 65 6e 61 62 6c 65 2f 64 69 73  le to enable/dis
4610: 61 62 6c 65 20 46 4b 20 73 75 70 70 6f 72 74 20  able FK support 
4620: 77 68 69 6c 65 20 61 0a 23 20 74 72 61 6e 73 61  while a.# transa
4630: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 23  ction is open..#
4640: 20 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65   .drop_all_table
4650: 73 0a 70 72 6f 63 20 66 6b 65 79 32 2d 38 2d 74  s.proc fkey2-8-t
4660: 65 73 74 20 7b 74 6e 20 7a 53 71 6c 20 76 61 6c  est {tn zSql val
4670: 75 65 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ue} {.  do_test 
4680: 66 6b 65 79 2d 32 2e 38 2e 24 74 6e 2e 31 20 5b  fkey-2.8.$tn.1 [
4690: 6c 69 73 74 20 65 78 65 63 73 71 6c 20 24 7a 53  list execsql $zS
46a0: 71 6c 5d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  ql] {}.  do_test
46b0: 20 66 6b 65 79 2d 32 2e 38 2e 24 74 6e 2e 32 20   fkey-2.8.$tn.2 
46c0: 7b 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d  { execsql "PRAGM
46d0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22 20  A foreign_keys" 
46e0: 7d 20 24 76 61 6c 75 65 0a 7d 0a 66 6b 65 79 32  } $value.}.fkey2
46f0: 2d 38 2d 74 65 73 74 20 20 31 20 7b 20 50 52 41  -8-test  1 { PRA
4700: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
4710: 20 3d 20 30 20 20 20 20 20 7d 20 30 0a 66 6b 65   = 0     } 0.fke
4720: 79 32 2d 38 2d 74 65 73 74 20 20 32 20 7b 20 50  y2-8-test  2 { P
4730: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
4740: 79 73 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66  ys = 1     } 1.f
4750: 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 33 20 7b  key2-8-test  3 {
4760: 20 42 45 47 49 4e 20 20 20 20 20 20 20 20 20 20   BEGIN          
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 31               } 1
4780: 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 34  .fkey2-8-test  4
4790: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
47a0: 6e 5f 6b 65 79 73 20 3d 20 30 20 20 20 20 20 7d  n_keys = 0     }
47b0: 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20   1.fkey2-8-test 
47c0: 20 35 20 7b 20 43 4f 4d 4d 49 54 20 20 20 20 20   5 { COMMIT     
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73   } 1.fkey2-8-tes
47f0: 74 20 20 36 20 7b 20 50 52 41 47 4d 41 20 66 6f  t  6 { PRAGMA fo
4800: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 30 20 20  reign_keys = 0  
4810: 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74     } 0.fkey2-8-t
4820: 65 73 74 20 20 37 20 7b 20 42 45 47 49 4e 20 20  est  7 { BEGIN  
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38       } 0.fkey2-8
4850: 2d 74 65 73 74 20 20 38 20 7b 20 50 52 41 47 4d  -test  8 { PRAGM
4860: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
4870: 20 31 20 20 20 20 20 7d 20 30 0a 66 6b 65 79 32   1     } 0.fkey2
4880: 2d 38 2d 74 65 73 74 20 20 39 20 7b 20 43 4f 4d  -8-test  9 { COM
4890: 4d 49 54 20 20 20 20 20 20 20 20 20 20 20 20 20  MIT             
48a0: 20 20 20 20 20 20 20 20 20 7d 20 30 0a 66 6b 65           } 0.fke
48b0: 79 32 2d 38 2d 74 65 73 74 20 31 30 20 7b 20 50  y2-8-test 10 { P
48c0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
48d0: 79 73 20 3d 20 31 20 20 20 20 20 7d 20 31 0a 66  ys = 1     } 1.f
48e0: 6b 65 79 32 2d 38 2d 74 65 73 74 20 31 31 20 7b  key2-8-test 11 {
48f0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
4900: 6b 65 79 73 20 3d 20 6f 66 66 20 20 20 7d 20 30  keys = off   } 0
4910: 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 31 32  .fkey2-8-test 12
4920: 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67   { PRAGMA foreig
4930: 6e 5f 6b 65 79 73 20 3d 20 6f 6e 20 20 20 20 7d  n_keys = on    }
4940: 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20   1.fkey2-8-test 
4950: 31 33 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65  13 { PRAGMA fore
4960: 69 67 6e 5f 6b 65 79 73 20 3d 20 6e 6f 20 20 20  ign_keys = no   
4970: 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73   } 0.fkey2-8-tes
4980: 74 20 31 34 20 7b 20 50 52 41 47 4d 41 20 66 6f  t 14 { PRAGMA fo
4990: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 79 65 73  reign_keys = yes
49a0: 20 20 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74     } 1.fkey2-8-t
49b0: 65 73 74 20 31 35 20 7b 20 50 52 41 47 4d 41 20  est 15 { PRAGMA 
49c0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 66  foreign_keys = f
49d0: 61 6c 73 65 20 7d 20 30 0a 66 6b 65 79 32 2d 38  alse } 0.fkey2-8
49e0: 2d 74 65 73 74 20 31 36 20 7b 20 50 52 41 47 4d  -test 16 { PRAGM
49f0: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
4a00: 20 74 72 75 65 20 20 7d 20 31 0a 0a 23 2d 2d 2d   true  } 1..#---
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
4a60: 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 66 6b  lowing tests, fk
4a70: 65 79 32 2d 39 2e 2a 2c 20 74 65 73 74 20 53 45  ey2-9.*, test SE
4a80: 54 20 44 45 46 41 55 4c 54 20 61 63 74 69 6f 6e  T DEFAULT action
4a90: 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61  s..#.drop_all_ta
4aa0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65  bles.do_test fke
4ab0: 79 32 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65  y2-9.1.1 {.  exe
4ac0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4ad0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
4ae0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4af0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
4b00: 20 54 41 42 4c 45 20 74 32 28 0a 20 20 20 20 20   TABLE t2(.     
4b10: 20 63 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41   c INTEGER PRIMA
4b20: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 64 20  RY KEY,.      d 
4b30: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
4b40: 31 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  1 REFERENCES t1 
4b50: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
4b60: 46 41 55 4c 54 0a 20 20 20 20 29 3b 0a 20 20 20  FAULT.    );.   
4b70: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
4b80: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
4b90: 74 20 66 6b 65 79 32 2d 39 2e 31 2e 32 20 7b 0a  t fkey2-9.1.2 {.
4ba0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4bb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4bc0: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
4bd0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4be0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
4bf0: 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
4c00: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
4c10: 31 2c 20 32 29 3b 0a 20 20 20 20 53 45 4c 45 43  1, 2);.    SELEC
4c20: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
4c30: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
4c40: 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 20  WHERE a = 2;.   
4c50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4c60: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31 20  2;.  }.} {1 2 1 
4c70: 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  1}.do_test fkey2
4c80: 2d 39 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  -9.1.3 {.  execs
4c90: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
4ca0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
4cb0: 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 55 50  , 'two');.    UP
4cc0: 44 41 54 45 20 74 32 20 53 45 54 20 64 20 3d 20  DATE t2 SET d = 
4cd0: 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  2;.    DELETE FR
4ce0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
4cf0: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
4d00: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
4d10: 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  1 2}.do_test fke
4d20: 79 32 2d 39 2e 31 2e 34 20 7b 0a 20 20 65 78 65  y2-9.1.4 {.  exe
4d30: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
4d40: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 32 20 74  FROM t1 }.} {2 t
4d50: 77 6f 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  wo}.do_test fkey
4d60: 32 2d 39 2e 31 2e 35 20 7b 0a 20 20 63 61 74 63  2-9.1.5 {.  catc
4d70: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
4d80: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f  OM t1 }.} {1 {fo
4d90: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
4da0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64  aint failed}}..d
4db0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39 2e 32  o_test fkey2-9.2
4dc0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
4dd0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4de0: 45 20 70 70 28 61 2c 20 62 2c 20 63 2c 20 50 52  E pp(a, b, c, PR
4df0: 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
4e00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
4e10: 4c 45 20 63 63 28 64 20 44 45 46 41 55 4c 54 20  LE cc(d DEFAULT 
4e20: 33 2c 20 65 20 44 45 46 41 55 4c 54 20 31 2c 20  3, e DEFAULT 1, 
4e30: 66 20 44 45 46 41 55 4c 54 20 32 2c 0a 20 20 20  f DEFAULT 2,.   
4e40: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
4e50: 28 66 2c 20 64 29 20 52 45 46 45 52 45 4e 43 45  (f, d) REFERENCE
4e60: 53 20 70 70 20 0a 20 20 20 20 20 20 20 20 4f 4e  S pp .        ON
4e70: 20 55 50 44 41 54 45 20 53 45 54 20 44 45 46 41   UPDATE SET DEFA
4e80: 55 4c 54 20 0a 20 20 20 20 20 20 20 20 4f 4e 20  ULT .        ON 
4e90: 44 45 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a  DELETE SET NULL.
4ea0: 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52      );.    INSER
4eb0: 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53  T INTO pp VALUES
4ec0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49  (1, 2, 3);.    I
4ed0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41  NSERT INTO pp VA
4ee0: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20  LUES(4, 5, 6);. 
4ef0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
4f00: 70 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39  p VALUES(7, 8, 9
4f10: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
4f20: 65 73 74 20 66 6b 65 79 32 2d 39 2e 32 2e 32 20  est fkey2-9.2.2 
4f30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4f40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63    INSERT INTO cc
4f50: 20 56 41 4c 55 45 53 28 36 2c 20 27 41 27 2c 20   VALUES(6, 'A', 
4f60: 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  5);.    INSERT I
4f70: 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 36 2c  NTO cc VALUES(6,
4f80: 20 27 42 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e   'B', 5);.    IN
4f90: 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41 4c  SERT INTO cc VAL
4fa0: 55 45 53 28 39 2c 20 27 41 27 2c 20 38 29 3b 0a  UES(9, 'A', 8);.
4fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4fc0: 63 63 20 56 41 4c 55 45 53 28 39 2c 20 27 42 27  cc VALUES(9, 'B'
4fd0: 2c 20 38 29 3b 0a 20 20 20 20 55 50 44 41 54 45  , 8);.    UPDATE
4fe0: 20 70 70 20 53 45 54 20 62 20 3d 20 31 20 57 48   pp SET b = 1 WH
4ff0: 45 52 45 20 61 20 3d 20 37 3b 0a 20 20 20 20 53  ERE a = 7;.    S
5000: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b  ELECT * FROM cc;
5010: 0a 20 20 7d 0a 7d 20 7b 36 20 41 20 35 20 36 20  .  }.} {6 A 5 6 
5020: 42 20 35 20 33 20 41 20 32 20 33 20 42 20 32 7d  B 5 3 A 2 3 B 2}
5030: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39  .do_test fkey2-9
5040: 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.3 {.  execsql
5050: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
5060: 4f 4d 20 70 70 20 57 48 45 52 45 20 61 20 3d 20  OM pp WHERE a = 
5070: 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  4;.    SELECT * 
5080: 46 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b  FROM cc;.  }.} {
5090: 7b 7d 20 41 20 7b 7d 20 7b 7d 20 42 20 7b 7d 20  {} A {} {} B {} 
50a0: 33 20 41 20 32 20 33 20 42 20 32 7d 0a 0a 23 2d  3 A 2 3 B 2}..#-
50b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
5100: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20  ollowing tests, 
5110: 66 6b 65 79 32 2d 31 30 2e 2a 2c 20 74 65 73 74  fkey2-10.*, test
5120: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d 69   "foreign key mi
5130: 73 6d 61 74 63 68 22 20 61 6e 64 20 0a 23 20 6f  smatch" and .# o
5140: 74 68 65 72 20 65 72 72 6f 72 73 2e 0a 23 0a 73  ther errors..#.s
5150: 65 74 20 74 6e 20 30 0a 66 6f 72 65 61 63 68 20  et tn 0.foreach 
5160: 7a 53 71 6c 20 5b 6c 69 73 74 20 7b 0a 20 20 43  zSql [list {.  C
5170: 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20  REATE TABLE p(a 
5180: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
5190: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
51a0: 63 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 70  c(x REFERENCES p
51b0: 28 63 29 29 3b 0a 7d 20 7b 0a 20 20 43 52 45 41  (c));.} {.  CREA
51c0: 54 45 20 54 41 42 4c 45 20 63 28 78 20 52 45 46  TE TABLE c(x REF
51d0: 45 52 45 4e 43 45 53 20 76 28 79 29 29 3b 0a 20  ERENCES v(y));. 
51e0: 20 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41   CREATE VIEW v A
51f0: 53 20 53 45 4c 45 43 54 20 78 20 41 53 20 79 20  S SELECT x AS y 
5200: 46 52 4f 4d 20 63 3b 0a 7d 20 7b 0a 20 20 43 52  FROM c;.} {.  CR
5210: 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 2c 20  EATE TABLE p(a, 
5220: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
5230: 2c 20 62 29 29 3b 0a 20 20 43 52 45 41 54 45 20  , b));.  CREATE 
5240: 54 41 42 4c 45 20 63 28 78 20 52 45 46 45 52 45  TABLE c(x REFERE
5250: 4e 43 45 53 20 70 29 3b 0a 7d 20 7b 0a 20 20 43  NCES p);.} {.  C
5260: 52 45 41 54 45 20 54 41 42 4c 45 20 70 28 61 20  REATE TABLE p(a 
5270: 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 2c 20  COLLATE binary, 
5280: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49  b);.  CREATE UNI
5290: 51 55 45 20 49 4e 44 45 58 20 69 20 4f 4e 20 70  QUE INDEX i ON p
52a0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
52b0: 65 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  e);.  CREATE TAB
52c0: 4c 45 20 63 28 78 20 52 45 46 45 52 45 4e 43 45  LE c(x REFERENCE
52d0: 53 20 70 28 61 29 29 3b 0a 7d 5d 20 7b 0a 20 20  S p(a));.}] {.  
52e0: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
52f0: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
5300: 31 30 2e 31 2e 5b 69 6e 63 72 20 74 6e 5d 20 7b  10.1.[incr tn] {
5310: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 7a 53  .    execsql $zS
5320: 71 6c 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  ql.    catchsql 
5330: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20  { INSERT INTO c 
5340: 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20 7d  DEFAULT VALUES }
5350: 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  .  } {1 {foreign
5360: 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a   key mismatch}}.
5370: 7d 0a 0a 23 20 22 72 6f 77 69 64 22 20 63 61 6e  }..# "rowid" can
5380: 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 70  not be used as p
5390: 61 72 74 20 6f 66 20 61 20 63 68 69 6c 64 20 6f  art of a child o
53a0: 72 20 70 61 72 65 6e 74 20 6b 65 79 20 64 65 66  r parent key def
53b0: 69 6e 69 74 69 6f 6e 20 0a 23 20 75 6e 6c 65 73  inition .# unles
53c0: 73 20 69 74 20 68 61 70 70 65 6e 73 20 74 6f 20  s it happens to 
53d0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
53e0: 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  n explicitly dec
53f0: 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  lared column..#.
5400: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 30  do_test fkey2-10
5410: 2e 32 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61 6c  .2.1 {.  drop_al
5420: 6c 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63 68  l_tables.  catch
5430: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5440: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
5450: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
5460: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
5470: 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
5480: 45 59 28 72 6f 77 69 64 29 20 52 45 46 45 52 45  EY(rowid) REFERE
5490: 4e 43 45 53 20 74 31 28 61 29 29 3b 0a 20 20 7d  NCES t1(a));.  }
54a0: 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 63  .} {1 {unknown c
54b0: 6f 6c 75 6d 6e 20 22 72 6f 77 69 64 22 20 69 6e  olumn "rowid" in
54c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
54d0: 69 6e 69 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73  inition}}.do_tes
54e0: 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e 32 20 7b  t fkey2-10.2.2 {
54f0: 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .  drop_all_tabl
5500: 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  es.  catchsql {.
5510: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5520: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
5530: 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  Y, b);.    CREAT
5540: 45 20 54 41 42 4c 45 20 74 32 28 72 6f 77 69 64  E TABLE t2(rowid
5550: 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  , d, FOREIGN KEY
5560: 28 72 6f 77 69 64 29 20 52 45 46 45 52 45 4e 43  (rowid) REFERENC
5570: 45 53 20 74 31 28 61 29 29 3b 0a 20 20 7d 0a 7d  ES t1(a));.  }.}
5580: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
5590: 66 6b 65 79 32 2d 31 30 2e 32 2e 31 20 7b 0a 20  fkey2-10.2.1 {. 
55a0: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
55b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
55c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
55d0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
55e0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20  ATE TABLE t2(c, 
55f0: 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 63  d, FOREIGN KEY(c
5600: 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  ) REFERENCES t1(
5610: 72 6f 77 69 64 29 29 3b 0a 20 20 20 20 49 4e 53  rowid));.    INS
5620: 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69  ERT INTO t1(rowi
5630: 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45 53 28  d, a, b) VALUES(
5640: 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e  1, 1, 1);.    IN
5650: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
5660: 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  UES(1, 1);.  }.}
5670: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
5680: 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74   mismatch}}.do_t
5690: 65 73 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e 32  est fkey2-10.2.2
56a0: 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61   {.  drop_all_ta
56b0: 62 6c 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20  bles.  catchsql 
56c0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
56d0: 4c 45 20 74 31 28 72 6f 77 69 64 20 50 52 49 4d  LE t1(rowid PRIM
56e0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
56f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
5700: 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b  (c, d, FOREIGN K
5710: 45 59 28 63 29 20 52 45 46 45 52 45 4e 43 45 53  EY(c) REFERENCES
5720: 20 74 31 28 72 6f 77 69 64 29 29 3b 0a 20 20 20   t1(rowid));.   
5730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
5740: 72 6f 77 69 64 2c 20 62 29 20 56 41 4c 55 45 53  rowid, b) VALUES
5750: 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 1);.    INSE
5760: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
5770: 53 28 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b  S(1, 1);.  }.} {
5780: 30 20 7b 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  0 {}}...#-------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
57e0: 6e 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d  ng tests, fkey2-
57f0: 31 31 2e 2a 2c 20 74 65 73 74 20 43 41 53 43 41  11.*, test CASCA
5800: 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72  DE actions..#.dr
5810: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
5820: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 31 2e 31  _test fkey2-11.1
5830: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5840: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5850: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
5860: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
5870: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5880: 20 74 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47   t2(c, d, FOREIG
5890: 4e 20 4b 45 59 28 63 29 20 52 45 46 45 52 45 4e  N KEY(c) REFEREN
58a0: 43 45 53 20 74 31 28 61 29 20 4f 4e 20 55 50 44  CES t1(a) ON UPD
58b0: 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a 20  ATE CASCADE);.. 
58c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
58d0: 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 30 30  1 VALUES(10, 100
58e0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
58f0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 30 2c  TO t2 VALUES(10,
5900: 20 31 30 30 29 3b 0a 20 20 20 20 55 50 44 41 54   100);.    UPDAT
5910: 45 20 74 31 20 53 45 54 20 61 20 3d 20 31 35 3b  E t1 SET a = 15;
5920: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
5930: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 35  OM t2;.  }.} {15
5940: 20 31 30 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   100}..#--------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
59a0: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
59b0: 32 2e 2a 2c 20 74 65 73 74 20 52 45 53 54 52 49  2.*, test RESTRI
59c0: 43 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64 72  CT actions..#.dr
59d0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
59e0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31  _test fkey2-12.1
59f0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5a00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5a10: 45 20 74 31 28 61 2c 20 62 20 50 52 49 4d 41 52  E t1(a, b PRIMAR
5a20: 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45 41  Y KEY);.    CREA
5a30: 54 45 20 54 41 42 4c 45 20 74 32 28 0a 20 20 20  TE TABLE t2(.   
5a40: 20 20 20 78 20 52 45 46 45 52 45 4e 43 45 53 20     x REFERENCES 
5a50: 74 31 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53  t1 ON UPDATE RES
5a60: 54 52 49 43 54 20 44 45 46 45 52 52 41 42 4c 45  TRICT DEFERRABLE
5a70: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
5a80: 52 45 44 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  RED .    );.    
5a90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5aa0: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
5ab0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5ac0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t1 VALUES(2, 't
5ad0: 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
5ae0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5af0: 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d  3, 'three');.  }
5b00: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
5b10: 65 79 32 2d 31 32 2e 31 2e 32 20 7b 20 0a 20 20  ey2-12.1.2 { .  
5b20: 65 78 65 63 73 71 6c 20 22 42 45 47 49 4e 22 0a  execsql "BEGIN".
5b30: 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52    execsql "INSER
5b40: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5b50: 28 27 74 77 6f 27 29 22 0a 7d 20 7b 7d 0a 64 6f  ('two')".} {}.do
5b60: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31  _test fkey2-12.1
5b70: 2e 33 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20  .3 { .  execsql 
5b80: 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62  "UPDATE t1 SET b
5b90: 20 3d 20 27 66 6f 75 72 27 20 57 48 45 52 45 20   = 'four' WHERE 
5ba0: 62 20 3d 20 27 6f 6e 65 27 22 0a 7d 20 7b 7d 0a  b = 'one'".} {}.
5bb0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32  do_test fkey2-12
5bc0: 2e 31 2e 34 20 7b 20 0a 20 20 63 61 74 63 68 73  .1.4 { .  catchs
5bd0: 71 6c 20 22 55 50 44 41 54 45 20 74 31 20 53 45  ql "UPDATE t1 SE
5be0: 54 20 62 20 3d 20 27 66 69 76 65 27 20 57 48 45  T b = 'five' WHE
5bf0: 52 45 20 62 20 3d 20 27 74 77 6f 27 22 0a 7d 20  RE b = 'two'".} 
5c00: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
5c10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
5c20: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
5c30: 32 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 65 78  2-12.1.5 { .  ex
5c40: 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52  ecsql "DELETE FR
5c50: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20  OM t1 WHERE b = 
5c60: 27 74 77 6f 27 22 0a 7d 20 7b 7d 0a 64 6f 5f 74  'two'".} {}.do_t
5c70: 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31 2e 36  est fkey2-12.1.6
5c80: 20 7b 20 0a 20 20 63 61 74 63 68 73 71 6c 20 22   { .  catchsql "
5c90: 43 4f 4d 4d 49 54 22 0a 7d 20 7b 31 20 7b 66 6f  COMMIT".} {1 {fo
5ca0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
5cb0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
5cc0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31  _test fkey2-12.1
5cd0: 2e 37 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20  .7 { .  execsql 
5ce0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5cf0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O t1 VALUES(2, '
5d00: 74 77 6f 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  two');.    COMMI
5d10: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f  T;.  }.} {}..dro
5d20: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f  p_all_tables.do_
5d30: 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 32 2e  test fkey2-12.2.
5d40: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
5d50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5d60: 20 74 31 28 78 20 43 4f 4c 4c 41 54 45 20 4e 4f   t1(x COLLATE NO
5d70: 43 41 53 45 20 50 52 49 4d 41 52 59 20 4b 45 59  CASE PRIMARY KEY
5d80: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
5d90: 49 47 47 45 52 20 74 74 31 20 41 46 54 45 52 20  IGGER tt1 AFTER 
5da0: 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 0a 20 20  DELETE ON t1 .  
5db0: 20 20 20 20 57 48 45 4e 20 45 58 49 53 54 53 20      WHEN EXISTS 
5dc0: 28 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ( SELECT 1 FROM 
5dd0: 74 32 20 57 48 45 52 45 20 6f 6c 64 2e 78 20 3d  t2 WHERE old.x =
5de0: 20 79 20 29 0a 20 20 20 20 42 45 47 49 4e 0a 20   y ).    BEGIN. 
5df0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5e00: 20 74 31 20 56 41 4c 55 45 53 28 6f 6c 64 2e 78   t1 VALUES(old.x
5e10: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
5e20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
5e30: 79 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  y REFERENCES t1)
5e40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5e50: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 29  O t1 VALUES('A')
5e60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5e70: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 42 27 29  O t1 VALUES('B')
5e80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5e90: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 29  O t2 VALUES('a')
5ea0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5eb0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62 27 29  O t2 VALUES('b')
5ec0: 3b 0a 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ;..    SELECT * 
5ed0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c  FROM t1;.    SEL
5ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
5ef0: 20 7d 0a 7d 20 7b 41 20 42 20 61 20 62 7d 0a 64   }.} {A B a b}.d
5f00: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e  o_test fkey2-12.
5f10: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
5f20: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  { DELETE FROM t1
5f30: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
5f40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
5f50: 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t1;.    SELECT 
5f60: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
5f70: 20 7b 41 20 42 20 61 20 62 7d 0a 64 6f 5f 74 65   {A B a b}.do_te
5f80: 73 74 20 66 6b 65 79 32 2d 31 32 2e 32 2e 33 20  st fkey2-12.2.3 
5f90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5fa0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
5fb0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5fc0: 45 20 74 32 28 79 20 52 45 46 45 52 45 4e 43 45  E t2(y REFERENCE
5fd0: 53 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20 52  S t1 ON DELETE R
5fe0: 45 53 54 52 49 43 54 29 3b 0a 20 20 20 20 49 4e  ESTRICT);.    IN
5ff0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
6000: 55 45 53 28 27 61 27 29 3b 0a 20 20 20 20 49 4e  UES('a');.    IN
6010: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
6020: 55 45 53 28 27 62 27 29 3b 0a 20 20 7d 0a 20 20  UES('b');.  }.  
6030: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
6040: 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  E FROM t1 }.} {1
6050: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
6060: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
6070: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
6080: 31 32 2e 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  12.2.4 {.  execs
6090: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
60a0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  * FROM t1;.    S
60b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
60c0: 0a 20 20 7d 0a 7d 20 7b 41 20 42 20 61 20 62 7d  .  }.} {A B a b}
60d0: 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  ..drop_all_table
60e0: 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  s.do_test fkey2-
60f0: 31 32 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  12.3.1 {.  execs
6100: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
6110: 54 41 42 4c 45 20 75 70 28 0a 20 20 20 20 20 20  TABLE up(.      
6120: 63 30 30 2c 20 63 30 31 2c 20 63 30 32 2c 20 63  c00, c01, c02, c
6130: 30 33 2c 20 63 30 34 2c 20 63 30 35 2c 20 63 30  03, c04, c05, c0
6140: 36 2c 20 63 30 37 2c 20 63 30 38 2c 20 63 30 39  6, c07, c08, c09
6150: 2c 0a 20 20 20 20 20 20 63 31 30 2c 20 63 31 31  ,.      c10, c11
6160: 2c 20 63 31 32 2c 20 63 31 33 2c 20 63 31 34 2c  , c12, c13, c14,
6170: 20 63 31 35 2c 20 63 31 36 2c 20 63 31 37 2c 20   c15, c16, c17, 
6180: 63 31 38 2c 20 63 31 39 2c 0a 20 20 20 20 20 20  c18, c19,.      
6190: 63 32 30 2c 20 63 32 31 2c 20 63 32 32 2c 20 63  c20, c21, c22, c
61a0: 32 33 2c 20 63 32 34 2c 20 63 32 35 2c 20 63 32  23, c24, c25, c2
61b0: 36 2c 20 63 32 37 2c 20 63 32 38 2c 20 63 32 39  6, c27, c28, c29
61c0: 2c 0a 20 20 20 20 20 20 63 33 30 2c 20 63 33 31  ,.      c30, c31
61d0: 2c 20 63 33 32 2c 20 63 33 33 2c 20 63 33 34 2c  , c32, c33, c34,
61e0: 20 63 33 35 2c 20 63 33 36 2c 20 63 33 37 2c 20   c35, c36, c37, 
61f0: 63 33 38 2c 20 63 33 39 2c 0a 20 20 20 20 20 20  c38, c39,.      
6200: 50 52 49 4d 41 52 59 20 4b 45 59 28 63 33 34 2c  PRIMARY KEY(c34,
6210: 20 63 33 35 29 0a 20 20 20 20 29 3b 0a 20 20 20   c35).    );.   
6220: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f   CREATE TABLE do
6230: 77 6e 28 0a 20 20 20 20 20 20 63 30 30 2c 20 63  wn(.      c00, c
6240: 30 31 2c 20 63 30 32 2c 20 63 30 33 2c 20 63 30  01, c02, c03, c0
6250: 34 2c 20 63 30 35 2c 20 63 30 36 2c 20 63 30 37  4, c05, c06, c07
6260: 2c 20 63 30 38 2c 20 63 30 39 2c 0a 20 20 20 20  , c08, c09,.    
6270: 20 20 63 31 30 2c 20 63 31 31 2c 20 63 31 32 2c    c10, c11, c12,
6280: 20 63 31 33 2c 20 63 31 34 2c 20 63 31 35 2c 20   c13, c14, c15, 
6290: 63 31 36 2c 20 63 31 37 2c 20 63 31 38 2c 20 63  c16, c17, c18, c
62a0: 31 39 2c 0a 20 20 20 20 20 20 63 32 30 2c 20 63  19,.      c20, c
62b0: 32 31 2c 20 63 32 32 2c 20 63 32 33 2c 20 63 32  21, c22, c23, c2
62c0: 34 2c 20 63 32 35 2c 20 63 32 36 2c 20 63 32 37  4, c25, c26, c27
62d0: 2c 20 63 32 38 2c 20 63 32 39 2c 0a 20 20 20 20  , c28, c29,.    
62e0: 20 20 63 33 30 2c 20 63 33 31 2c 20 63 33 32 2c    c30, c31, c32,
62f0: 20 63 33 33 2c 20 63 33 34 2c 20 63 33 35 2c 20   c33, c34, c35, 
6300: 63 33 36 2c 20 63 33 37 2c 20 63 33 38 2c 20 63  c36, c37, c38, c
6310: 33 39 2c 0a 20 20 20 20 20 20 46 4f 52 45 49 47  39,.      FOREIG
6320: 4e 20 4b 45 59 28 63 33 39 2c 20 63 33 38 29 20  N KEY(c39, c38) 
6330: 52 45 46 45 52 45 4e 43 45 53 20 75 70 20 4f 4e  REFERENCES up ON
6340: 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 0a   UPDATE CASCADE.
6350: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
6360: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32  do_test fkey2-12
6370: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
6380: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
6390: 54 4f 20 75 70 28 63 33 34 2c 20 63 33 35 29 20  TO up(c34, c35) 
63a0: 56 41 4c 55 45 53 28 27 79 65 73 27 2c 20 27 6e  VALUES('yes', 'n
63b0: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
63c0: 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20 63  INTO down(c39, c
63d0: 33 38 29 20 56 41 4c 55 45 53 28 27 79 65 73 27  38) VALUES('yes'
63e0: 2c 20 27 6e 6f 27 29 3b 0a 20 20 20 20 55 50 44  , 'no');.    UPD
63f0: 41 54 45 20 75 70 20 53 45 54 20 63 33 34 20 3d  ATE up SET c34 =
6400: 20 27 70 6f 73 73 69 62 6c 79 27 3b 0a 20 20 20   'possibly';.   
6410: 20 53 45 4c 45 43 54 20 63 33 38 2c 20 63 33 39   SELECT c38, c39
6420: 20 46 52 4f 4d 20 64 6f 77 6e 3b 0a 20 20 20 20   FROM down;.    
6430: 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 6f 77 6e  DELETE FROM down
6440: 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 20 70 6f 73 73  ;.  }.} {no poss
6450: 69 62 6c 79 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  ibly}.do_test fk
6460: 65 79 32 2d 31 32 2e 33 2e 33 20 7b 0a 20 20 63  ey2-12.3.3 {.  c
6470: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
6480: 20 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c 20   INTO down(c39, 
6490: 63 33 38 29 20 56 41 4c 55 45 53 28 27 79 65 73  c38) VALUES('yes
64a0: 27 2c 20 27 6e 6f 27 29 20 7d 0a 7d 20 7b 31 20  ', 'no') }.} {1 
64b0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
64c0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
64d0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
64e0: 32 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  2.3.4 {.  execsq
64f0: 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  l { .    INSERT 
6500: 49 4e 54 4f 20 75 70 28 63 33 34 2c 20 63 33 35  INTO up(c34, c35
6510: 29 20 56 41 4c 55 45 53 28 27 79 65 73 27 2c 20  ) VALUES('yes', 
6520: 27 6e 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  'no');.    INSER
6530: 54 20 49 4e 54 4f 20 64 6f 77 6e 28 63 33 39 2c  T INTO down(c39,
6540: 20 63 33 38 29 20 56 41 4c 55 45 53 28 27 79 65   c38) VALUES('ye
6550: 73 27 2c 20 27 6e 6f 27 29 3b 0a 20 20 7d 0a 20  s', 'no');.  }. 
6560: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
6570: 54 45 20 46 52 4f 4d 20 75 70 20 57 48 45 52 45  TE FROM up WHERE
6580: 20 63 33 34 20 3d 20 27 79 65 73 27 20 7d 0a 7d   c34 = 'yes' }.}
6590: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
65a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
65b0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  ed}}.do_test fke
65c0: 79 32 2d 31 32 2e 33 2e 35 20 7b 0a 20 20 65 78  y2-12.3.5 {.  ex
65d0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45 4c  ecsql { .    DEL
65e0: 45 54 45 20 46 52 4f 4d 20 75 70 20 57 48 45 52  ETE FROM up WHER
65f0: 45 20 63 33 34 20 3d 20 27 70 6f 73 73 69 62 6c  E c34 = 'possibl
6600: 79 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  y';.    SELECT c
6610: 33 34 2c 20 63 33 35 20 46 52 4f 4d 20 75 70 3b  34, c35 FROM up;
6620: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 33 39 2c  .    SELECT c39,
6630: 20 63 33 38 20 46 52 4f 4d 20 64 6f 77 6e 3b 0a   c38 FROM down;.
6640: 20 20 7d 0a 7d 20 7b 79 65 73 20 6e 6f 20 79 65    }.} {yes no ye
6650: 73 20 6e 6f 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  s no}..#--------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
66b0: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
66c0: 33 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 46  3.*, test that F
66d0: 4b 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  K processing is 
66e0: 70 65 72 66 6f 72 6d 65 64 0a 23 20 77 68 65 6e  performed.# when
66f0: 20 72 6f 77 73 20 61 72 65 20 52 45 50 4c 41 43   rows are REPLAC
6700: 45 64 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74  Ed..#.drop_all_t
6710: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b  ables.do_test fk
6720: 65 79 32 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 65  ey2-13.1.1 {.  e
6730: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
6740: 41 54 45 20 54 41 42 4c 45 20 70 70 28 61 20 55  ATE TABLE pp(a U
6750: 4e 49 51 55 45 2c 20 62 2c 20 63 2c 20 50 52 49  NIQUE, b, c, PRI
6760: 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b  MARY KEY(b, c));
6770: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6780: 45 20 63 63 28 64 2c 20 65 2c 20 66 20 55 4e 49  E cc(d, e, f UNI
6790: 51 55 45 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59  QUE, FOREIGN KEY
67a0: 28 64 2c 20 65 29 20 52 45 46 45 52 45 4e 43 45  (d, e) REFERENCE
67b0: 53 20 70 70 29 3b 0a 20 20 20 20 49 4e 53 45 52  S pp);.    INSER
67c0: 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53  T INTO pp VALUES
67d0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49  (1, 2, 3);.    I
67e0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
67f0: 4c 55 45 53 28 32 2c 20 33 2c 20 31 29 3b 0a 20  LUES(2, 3, 1);. 
6800: 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20   }.} {}.foreach 
6810: 7b 74 6e 20 73 74 6d 74 7d 20 7b 0a 20 20 31 20  {tn stmt} {.  1 
6820: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6830: 70 70 20 56 41 4c 55 45 53 28 31 2c 20 34 2c 20  pp VALUES(1, 4, 
6840: 35 29 22 0a 20 20 32 20 20 20 22 52 45 50 4c 41  5)".  2   "REPLA
6850: 43 45 20 49 4e 54 4f 20 70 70 28 72 6f 77 69 64  CE INTO pp(rowid
6860: 2c 20 61 2c 20 62 2c 20 63 29 20 56 41 4c 55 45  , a, b, c) VALUE
6870: 53 28 31 2c 20 32 2c 20 33 2c 20 34 29 22 0a 7d  S(1, 2, 3, 4)".}
6880: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65   {.  do_test fke
6890: 79 32 2d 31 33 2e 31 2e 24 74 6e 2e 31 20 7b 0a  y2-13.1.$tn.1 {.
68a0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 24 73 74      catchsql $st
68b0: 6d 74 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69  mt.  } {1 {forei
68c0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
68d0: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
68e0: 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e  test fkey2-13.1.
68f0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
6900: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
6910: 43 54 20 2a 20 46 52 4f 4d 20 70 70 3b 0a 20 20  CT * FROM pp;.  
6920: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6930: 4d 20 63 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M cc;.    }.  } 
6940: 7b 31 20 32 20 33 20 32 20 33 20 31 7d 0a 20 20  {1 2 3 2 3 1}.  
6950: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 33  do_test fkey2-13
6960: 2e 31 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65  .1.$tn.3 {.    e
6970: 78 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20  xecsql BEGIN;.  
6980: 20 20 63 61 74 63 68 73 71 6c 20 24 73 74 6d 74    catchsql $stmt
6990: 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  .  } {1 {foreign
69a0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
69b0: 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  failed}}.  do_te
69c0: 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e 24 74  st fkey2-13.1.$t
69d0: 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.4 {.    execsq
69e0: 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  l {.      COMMIT
69f0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
6a00: 20 46 52 4f 4d 20 70 70 3b 0a 20 20 20 20 20 20   FROM pp;.      
6a10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63  SELECT * FROM cc
6a20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
6a30: 20 33 20 32 20 33 20 31 7d 0a 7d 0a 64 6f 5f 74   3 2 3 1}.}.do_t
6a40: 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e 33  est fkey2-13.1.3
6a50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
6a60: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
6a70: 20 70 70 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c   pp(rowid, a, b,
6a80: 20 63 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   c) VALUES(1, 2,
6a90: 20 32 2c 20 33 29 3b 0a 20 20 20 20 53 45 4c 45   2, 3);.    SELE
6aa0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
6ab0: 20 70 70 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   pp;.    SELECT 
6ac0: 2a 20 46 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d  * FROM cc;.  }.}
6ad0: 20 7b 31 20 32 20 32 20 33 20 32 20 33 20 31 7d   {1 2 2 3 2 3 1}
6ae0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
6af0: 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  3.1.4 {.  execsq
6b00: 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c 41 43 45  l { .    REPLACE
6b10: 20 49 4e 54 4f 20 70 70 28 72 6f 77 69 64 2c 20   INTO pp(rowid, 
6b20: 61 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28  a, b, c) VALUES(
6b30: 32 2c 20 32 2c 20 32 2c 20 33 29 3b 0a 20 20 20  2, 2, 2, 3);.   
6b40: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a   SELECT rowid, *
6b50: 20 46 52 4f 4d 20 70 70 3b 0a 20 20 20 20 53 45   FROM pp;.    SE
6b60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a  LECT * FROM cc;.
6b70: 20 20 7d 0a 7d 20 7b 32 20 32 20 32 20 33 20 32    }.} {2 2 2 3 2
6b80: 20 33 20 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   3 1}..#--------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
6be0: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
6bf0: 34 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74  4.*, test that t
6c00: 68 65 20 22 44 52 4f 50 20 54 41 42 4c 45 22 20  he "DROP TABLE" 
6c10: 61 6e 64 20 22 41 4c 54 45 52 0a 23 20 54 41 42  and "ALTER.# TAB
6c20: 4c 45 22 20 63 6f 6d 6d 61 6e 64 73 20 77 6f 72  LE" commands wor
6c30: 6b 20 61 73 20 65 78 70 65 63 74 65 64 20 77 72  k as expected wr
6c40: 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  t foreign key co
6c50: 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 23 20 66  nstraints..#.# f
6c60: 6b 65 79 32 2d 31 34 2e 31 2a 3a 20 41 4c 54 45  key2-14.1*: ALTE
6c70: 52 20 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55  R TABLE ADD COLU
6c80: 4d 4e 0a 23 20 66 6b 65 79 32 2d 31 34 2e 32 2a  MN.# fkey2-14.2*
6c90: 3a 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45  : ALTER TABLE RE
6ca0: 4e 41 4d 45 20 54 41 42 4c 45 0a 23 20 66 6b 65  NAME TABLE.# fke
6cb0: 79 32 2d 31 34 2e 33 2a 3a 20 44 52 4f 50 20 54  y2-14.3*: DROP T
6cc0: 41 42 4c 45 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f  ABLE.#.drop_all_
6cd0: 74 61 62 6c 65 73 0a 69 66 63 61 70 61 62 6c 65  tables.ifcapable
6ce0: 20 61 6c 74 65 72 74 61 62 6c 65 20 7b 0a 20 20   altertable {.  
6cf0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
6d00: 2e 31 2e 31 20 7b 0a 20 20 20 20 23 20 41 64 64  .1.1 {.    # Add
6d10: 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74  ing a column wit
6d20: 68 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  h a REFERENCES c
6d30: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73 75 70  lause is not sup
6d40: 70 6f 72 74 65 64 2e 0a 20 20 20 20 65 78 65 63  ported..    exec
6d50: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 43 52 45  sql { .      CRE
6d60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
6d70: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
6d80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6d90: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a  t2(a, b);.    }.
6da0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41      catchsql { A
6db0: 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44  LTER TABLE t2 AD
6dc0: 44 20 43 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52  D COLUMN c REFER
6dd0: 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b  ENCES t1 }.  } {
6de0: 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  0 {}}.  do_test 
6df0: 66 6b 65 79 32 2d 31 34 2e 31 2e 32 20 7b 0a 20  fkey2-14.1.2 {. 
6e00: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
6e10: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
6e20: 20 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c   COLUMN d DEFAUL
6e30: 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43 45  T NULL REFERENCE
6e40: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  S t1 }.  } {0 {}
6e50: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
6e60: 32 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 20 20 63  2-14.1.3 {.    c
6e70: 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20  atchsql { ALTER 
6e80: 54 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c  TABLE t2 ADD COL
6e90: 55 4d 4e 20 65 20 52 45 46 45 52 45 4e 43 45 53  UMN e REFERENCES
6ea0: 20 74 31 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c   t1 DEFAULT NULL
6eb0: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
6ec0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
6ed0: 31 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73  1.4 {.    catchs
6ee0: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
6ef0: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66   t2 ADD COLUMN f
6f00: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44   REFERENCES t1 D
6f10: 45 46 41 55 4c 54 20 27 74 65 78 74 27 7d 0a 20  EFAULT 'text'}. 
6f20: 20 7d 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64   } {1 {Cannot ad
6f30: 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  d a REFERENCES c
6f40: 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e  olumn with non-N
6f50: 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
6f60: 65 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  e}}.  do_test fk
6f70: 65 79 32 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 20  ey2-14.1.5 {.   
6f80: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
6f90: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
6fa0: 4f 4c 55 4d 4e 20 67 20 44 45 46 41 55 4c 54 20  OLUMN g DEFAULT 
6fb0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 20 52 45 46  CURRENT_TIME REF
6fc0: 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d  ERENCES t1 }.  }
6fd0: 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20   {1 {Cannot add 
6fe0: 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c  a REFERENCES col
6ff0: 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c  umn with non-NUL
7000: 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d  L default value}
7010: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
7020: 32 2d 31 34 2e 31 2e 36 20 7b 0a 20 20 20 20 65  2-14.1.6 {.    e
7030: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
7040: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
7050: 65 79 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20  eys = off;.     
7060: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20   ALTER TABLE t2 
7070: 41 44 44 20 43 4f 4c 55 4d 4e 20 68 20 44 45 46  ADD COLUMN h DEF
7080: 41 55 4c 54 20 27 74 65 78 74 27 20 52 45 46 45  AULT 'text' REFE
7090: 52 45 4e 43 45 53 20 74 31 3b 0a 20 20 20 20 20  RENCES t1;.     
70a0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
70b0: 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 20  keys = on;.     
70c0: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
70d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
70e0: 48 45 52 45 20 6e 61 6d 65 3d 27 74 32 27 3b 0a  HERE name='t2';.
70f0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52 45 41      }.  } {{CREA
7100: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
7110: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74  , c REFERENCES t
7120: 31 2c 20 64 20 44 45 46 41 55 4c 54 20 4e 55 4c  1, d DEFAULT NUL
7130: 4c 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c  L REFERENCES t1,
7140: 20 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   e REFERENCES t1
7150: 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c 20 68   DEFAULT NULL, h
7160: 20 44 45 46 41 55 4c 54 20 27 74 65 78 74 27 20   DEFAULT 'text' 
7170: 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d 7d  REFERENCES t1)}}
7180: 0a 20 20 0a 20 20 0a 20 20 23 20 54 65 73 74 20  .  .  .  # Test 
7190: 74 68 65 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d  the sqlite_renam
71a0: 65 5f 70 61 72 65 6e 74 28 29 20 66 75 6e 63 74  e_parent() funct
71b0: 69 6f 6e 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ion directly..  
71c0: 23 0a 20 20 70 72 6f 63 20 74 65 73 74 5f 72 65  #.  proc test_re
71d0: 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 7a 43 72  name_parent {zCr
71e0: 65 61 74 65 20 7a 4f 6c 64 20 7a 4e 65 77 7d 20  eate zOld zNew} 
71f0: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53  {.    db eval {S
7200: 45 4c 45 43 54 20 73 71 6c 69 74 65 5f 72 65 6e  ELECT sqlite_ren
7210: 61 6d 65 5f 70 61 72 65 6e 74 28 24 7a 43 72 65  ame_parent($zCre
7220: 61 74 65 2c 20 24 7a 4f 6c 64 2c 20 24 7a 4e 65  ate, $zOld, $zNe
7230: 77 29 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73  w)}.  }.  do_tes
7240: 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 31 2e 31  t fkey2-14.2.1.1
7250: 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61   {.    test_rena
7260: 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54  me_parent {CREAT
7270: 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46  E TABLE t1(a REF
7280: 45 52 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20  ERENCES t2)} t2 
7290: 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20  t3.  } {{CREATE 
72a0: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
72b0: 45 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20  ENCES "t3")}}.  
72c0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
72d0: 2e 32 2e 31 2e 32 20 7b 0a 20 20 20 20 74 65 73  .2.1.2 {.    tes
72e0: 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20  t_rename_parent 
72f0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
7300: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  (a REFERENCES t2
7310: 29 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b 7b 43  )} t4 t3.  } {{C
7320: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
7330: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d   REFERENCES t2)}
7340: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
7350: 32 2d 31 34 2e 32 2e 31 2e 33 20 7b 0a 20 20 20  2-14.2.1.3 {.   
7360: 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72   test_rename_par
7370: 65 6e 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c  ent {CREATE TABL
7380: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
7390: 53 20 22 74 32 22 29 7d 20 74 32 20 74 33 0a 20  S "t2")} t2 t3. 
73a0: 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c   } {{CREATE TABL
73b0: 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43 45  E t1(a REFERENCE
73c0: 53 20 22 74 33 22 29 7d 7d 0a 20 20 0a 20 20 23  S "t3")}}.  .  #
73d0: 20 54 65 73 74 20 41 4c 54 45 52 20 54 41 42 4c   Test ALTER TABL
73e0: 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 20 61  E RENAME TABLE a
73f0: 20 62 69 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74   bit..  #.  do_t
7400: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32  est fkey2-14.2.2
7410: 2e 31 20 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c  .1 {.    drop_al
7420: 6c 5f 74 61 62 6c 65 73 0a 20 20 20 20 65 78 65  l_tables.    exe
7430: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
7440: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
7450: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
7460: 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20 20  FERENCES t1);.  
7470: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7480: 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t2(a PRIMARY KE
7490: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
74a0: 74 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53  t1, c REFERENCES
74b0: 20 74 32 29 3b 0a 20 20 20 20 20 20 43 52 45 41   t2);.      CREA
74c0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52 45  TE TABLE t3(a RE
74d0: 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20 52  FERENCES t1, b R
74e0: 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20  EFERENCES t2, c 
74f0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a  REFERENCES t1);.
7500: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
7510: 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46  l { SELECT sql F
7520: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
7530: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
7540: 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73  table'}.  } [lis
7550: 74 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20  t \.    {CREATE 
7560: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
7570: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
7580: 4e 43 45 53 20 74 31 29 7d 20 20 20 20 20 20 20  NCES t1)}       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
75a0: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
75b0: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
75c0: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
75d0: 20 74 31 2c 20 63 20 52 45 46 45 52 45 4e 43 45   t1, c REFERENCE
75e0: 53 20 74 32 29 7d 20 20 20 20 5c 0a 20 20 20 20  S t2)}    \.    
75f0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33  {CREATE TABLE t3
7600: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  (a REFERENCES t1
7610: 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74  , b REFERENCES t
7620: 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20  2, c REFERENCES 
7630: 74 31 29 7d 20 20 5c 0a 20 20 5d 0a 20 20 64 6f  t1)}  \.  ].  do
7640: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
7650: 2e 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.2 {.    execs
7660: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
7670: 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34   t1 RENAME TO t4
7680: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
7690: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
76a0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
76b0: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
76c0: 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c  le'}.  } [list \
76d0: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
76e0: 4c 45 20 22 74 34 22 28 61 20 50 52 49 4d 41 52  LE "t4"(a PRIMAR
76f0: 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e  Y KEY, b REFEREN
7700: 43 45 53 20 22 74 34 22 29 7d 20 20 20 20 20 20  CES "t4")}      
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
7720: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
7730: 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b  E t2(a PRIMARY K
7740: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
7750: 20 22 74 34 22 2c 20 63 20 52 45 46 45 52 45 4e   "t4", c REFEREN
7760: 43 45 53 20 74 32 29 7d 20 20 20 20 20 5c 0a 20  CES t2)}     \. 
7770: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
7780: 20 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53   t3(a REFERENCES
7790: 20 22 74 34 22 2c 20 62 20 52 45 46 45 52 45 4e   "t4", b REFEREN
77a0: 43 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45  CES t2, c REFERE
77b0: 4e 43 45 53 20 22 74 34 22 29 7d 20 5c 0a 20 20  NCES "t4")} \.  
77c0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  ].  do_test fkey
77d0: 32 2d 31 34 2e 32 2e 32 2e 33 20 7b 0a 20 20 20  2-14.2.2.3 {.   
77e0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
77f0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
7800: 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 7d  S(1, 2, 3) }.  }
7810: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
7820: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
7830: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ed}}.  do_test f
7840: 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 34 20 7b 0a  key2-14.2.2.4 {.
7850: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
7860: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
7870: 55 45 53 28 31 2c 20 4e 55 4c 4c 29 20 7d 0a 20  UES(1, NULL) }. 
7880: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
7890: 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 35 20 7b  fkey2-14.2.2.5 {
78a0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
78b0: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20  UPDATE t4 SET b 
78c0: 3d 20 35 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f  = 5 }.  } {1 {fo
78d0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
78e0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20  aint failed}}.  
78f0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
7900: 2e 32 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74  .2.2.6 {.    cat
7910: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
7920: 34 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20  4 SET b = 1 }.  
7930: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
7940: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e  st fkey2-14.2.2.
7950: 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  7 {.    execsql 
7960: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33  { INSERT INTO t3
7970: 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c   VALUES(1, NULL,
7980: 20 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20   1) }.  } {}..  
7990: 23 20 52 65 70 65 61 74 20 66 6f 72 20 54 45 4d  # Repeat for TEM
79a0: 50 20 74 61 62 6c 65 73 0a 20 20 23 0a 20 20 64  P tables.  #.  d
79b0: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20  rop_all_tables. 
79c0: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
79d0: 34 2e 31 74 6d 70 2e 31 20 7b 0a 20 20 20 20 23  4.1tmp.1 {.    #
79e0: 20 41 64 64 69 6e 67 20 61 20 63 6f 6c 75 6d 6e   Adding a column
79f0: 20 77 69 74 68 20 61 20 52 45 46 45 52 45 4e 43   with a REFERENC
7a00: 45 53 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ES clause is not
7a10: 20 73 75 70 70 6f 72 74 65 64 2e 0a 20 20 20 20   supported..    
7a20: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
7a30: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
7a40: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
7a50: 4b 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41  KEY);.      CREA
7a60: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32  TE TEMP TABLE t2
7a70: 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (a, b);.    }.  
7a80: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
7a90: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
7aa0: 43 4f 4c 55 4d 4e 20 63 20 52 45 46 45 52 45 4e  COLUMN c REFEREN
7ab0: 43 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20  CES t1 }.  } {0 
7ac0: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  {}}.  do_test fk
7ad0: 65 79 32 2d 31 34 2e 31 74 6d 70 2e 32 20 7b 0a  ey2-14.1tmp.2 {.
7ae0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41      catchsql { A
7af0: 4c 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44  LTER TABLE t2 AD
7b00: 44 20 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55  D COLUMN d DEFAU
7b10: 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e 43  LT NULL REFERENC
7b20: 45 53 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b  ES t1 }.  } {0 {
7b30: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
7b40: 79 32 2d 31 34 2e 31 74 6d 70 2e 33 20 7b 0a 20  y2-14.1tmp.3 {. 
7b50: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c     catchsql { AL
7b60: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
7b70: 20 43 4f 4c 55 4d 4e 20 65 20 52 45 46 45 52 45   COLUMN e REFERE
7b80: 4e 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20  NCES t1 DEFAULT 
7b90: 4e 55 4c 4c 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  NULL}.  } {0 {}}
7ba0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
7bb0: 2d 31 34 2e 31 74 6d 70 2e 34 20 7b 0a 20 20 20  -14.1tmp.4 {.   
7bc0: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
7bd0: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
7be0: 4f 4c 55 4d 4e 20 66 20 52 45 46 45 52 45 4e 43  OLUMN f REFERENC
7bf0: 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 27 74  ES t1 DEFAULT 't
7c00: 65 78 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43 61  ext'}.  } {1 {Ca
7c10: 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52  nnot add a REFER
7c20: 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74  ENCES column wit
7c30: 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75  h non-NULL defau
7c40: 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f  lt value}}.  do_
7c50: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 74  test fkey2-14.1t
7c60: 6d 70 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68  mp.5 {.    catch
7c70: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
7c80: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
7c90: 67 20 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e  g DEFAULT CURREN
7ca0: 54 5f 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45  T_TIME REFERENCE
7cb0: 53 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43  S t1 }.  } {1 {C
7cc0: 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45  annot add a REFE
7cd0: 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69  RENCES column wi
7ce0: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61  th non-NULL defa
7cf0: 75 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f  ult value}}.  do
7d00: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31  _test fkey2-14.1
7d10: 74 6d 70 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  tmp.6 {.    exec
7d20: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41  sql { .      PRA
7d30: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
7d40: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 41 4c   = off;.      AL
7d50: 54 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44  TER TABLE t2 ADD
7d60: 20 43 4f 4c 55 4d 4e 20 68 20 44 45 46 41 55 4c   COLUMN h DEFAUL
7d70: 54 20 27 74 65 78 74 27 20 52 45 46 45 52 45 4e  T 'text' REFEREN
7d80: 43 45 53 20 74 31 3b 0a 20 20 20 20 20 20 50 52  CES t1;.      PR
7d90: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
7da0: 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 20 20 53 45  s = on;.      SE
7db0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
7dc0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
7dd0: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 32 27   WHERE name='t2'
7de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7b 43 52  ;.    }.  } {{CR
7df0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
7e00: 20 62 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53   b, c REFERENCES
7e10: 20 74 31 2c 20 64 20 44 45 46 41 55 4c 54 20 4e   t1, d DEFAULT N
7e20: 55 4c 4c 20 52 45 46 45 52 45 4e 43 45 53 20 74  ULL REFERENCES t
7e30: 31 2c 20 65 20 52 45 46 45 52 45 4e 43 45 53 20  1, e REFERENCES 
7e40: 74 31 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 2c  t1 DEFAULT NULL,
7e50: 20 68 20 44 45 46 41 55 4c 54 20 27 74 65 78 74   h DEFAULT 'text
7e60: 27 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  ' REFERENCES t1)
7e70: 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  }}..  do_test fk
7e80: 65 79 32 2d 31 34 2e 32 74 6d 70 2e 31 2e 31 20  ey2-14.2tmp.1.1 
7e90: 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d  {.    test_renam
7ea0: 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45  e_parent {CREATE
7eb0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
7ec0: 52 45 4e 43 45 53 20 74 32 29 7d 20 74 32 20 74  RENCES t2)} t2 t
7ed0: 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54  3.  } {{CREATE T
7ee0: 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45  ABLE t1(a REFERE
7ef0: 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20 20 64  NCES "t3")}}.  d
7f00: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
7f10: 32 74 6d 70 2e 31 2e 32 20 7b 0a 20 20 20 20 74  2tmp.1.2 {.    t
7f20: 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e  est_rename_paren
7f30: 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  t {CREATE TABLE 
7f40: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
7f50: 74 32 29 7d 20 74 34 20 74 33 0a 20 20 7d 20 7b  t2)} t4 t3.  } {
7f60: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
7f70: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 32  (a REFERENCES t2
7f80: 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  )}}.  do_test fk
7f90: 65 79 32 2d 31 34 2e 32 74 6d 70 2e 31 2e 33 20  ey2-14.2tmp.1.3 
7fa0: 7b 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d  {.    test_renam
7fb0: 65 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45  e_parent {CREATE
7fc0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
7fd0: 52 45 4e 43 45 53 20 22 74 32 22 29 7d 20 74 32  RENCES "t2")} t2
7fe0: 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45   t3.  } {{CREATE
7ff0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
8000: 52 45 4e 43 45 53 20 22 74 33 22 29 7d 7d 0a 20  RENCES "t3")}}. 
8010: 20 0a 20 20 23 20 54 65 73 74 20 41 4c 54 45 52   .  # Test ALTER
8020: 20 54 41 42 4c 45 20 52 45 4e 41 4d 45 20 54 41   TABLE RENAME TA
8030: 42 4c 45 20 61 20 62 69 74 2e 0a 20 20 23 0a 20  BLE a bit..  #. 
8040: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
8050: 34 2e 32 74 6d 70 2e 32 2e 31 20 7b 0a 20 20 20  4.2tmp.2.1 {.   
8060: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
8070: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
8080: 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
8090: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
80a0: 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52  ARY KEY, b REFER
80b0: 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 20  ENCES t1);.     
80c0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
80d0: 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20  LE t2(a PRIMARY 
80e0: 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
80f0: 53 20 74 31 2c 20 63 20 52 45 46 45 52 45 4e 43  S t1, c REFERENC
8100: 45 53 20 74 32 29 3b 0a 20 20 20 20 20 20 43 52  ES t2);.      CR
8110: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
8120: 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t3(a REFERENCES 
8130: 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  t1, b REFERENCES
8140: 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43 45   t2, c REFERENCE
8150: 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S t1);.    }.   
8160: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
8170: 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
8180: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 57 48  e_temp_master WH
8190: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
81a0: 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c 0a  e'}.  } [list \.
81b0: 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c      {CREATE TABL
81c0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
81d0: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
81e0: 20 74 31 29 7d 20 20 20 20 20 20 20 20 20 20 20   t1)}           
81f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
8200: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
8210: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
8220: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c  b REFERENCES t1,
8230: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   c REFERENCES t2
8240: 29 7d 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45  )}    \.    {CRE
8250: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52  ATE TABLE t3(a R
8260: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 20  EFERENCES t1, b 
8270: 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20 63  REFERENCES t2, c
8280: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 7d   REFERENCES t1)}
8290: 20 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73    \.  ].  do_tes
82a0: 74 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e  t fkey2-14.2tmp.
82b0: 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2.2 {.    execsq
82c0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
82d0: 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34 20  t1 RENAME TO t4 
82e0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
82f0: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
8300: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
8310: 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
8320: 27 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69  'table'}.  } [li
8330: 73 74 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45  st \.    {CREATE
8340: 20 54 41 42 4c 45 20 22 74 34 22 28 61 20 50 52   TABLE "t4"(a PR
8350: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
8360: 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 20  ERENCES "t4")}  
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
8390: 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41  TABLE t2(a PRIMA
83a0: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
83b0: 4e 43 45 53 20 22 74 34 22 2c 20 63 20 52 45 46  NCES "t4", c REF
83c0: 45 52 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20  ERENCES t2)}    
83d0: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
83e0: 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52 45  ABLE t3(a REFERE
83f0: 4e 43 45 53 20 22 74 34 22 2c 20 62 20 52 45 46  NCES "t4", b REF
8400: 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45  ERENCES t2, c RE
8410: 46 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20  FERENCES "t4")} 
8420: 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20  \.  ].  do_test 
8430: 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70 2e 32 2e  fkey2-14.2tmp.2.
8440: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
8450: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
8460: 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  3 VALUES(1, 2, 3
8470: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65  ) }.  } {1 {fore
8480: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
8490: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f  nt failed}}.  do
84a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
84b0: 74 6d 70 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78  tmp.2.4 {.    ex
84c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
84d0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
84e0: 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a   NULL) }.  } {}.
84f0: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
8500: 31 34 2e 32 74 6d 70 2e 32 2e 35 20 7b 0a 20 20  14.2tmp.2.5 {.  
8510: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44    catchsql { UPD
8520: 41 54 45 20 74 34 20 53 45 54 20 62 20 3d 20 35  ATE t4 SET b = 5
8530: 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69   }.  } {1 {forei
8540: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
8550: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
8560: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 74  test fkey2-14.2t
8570: 6d 70 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74  mp.2.6 {.    cat
8580: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
8590: 34 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20  4 SET b = 1 }.  
85a0: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
85b0: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 74 6d 70  st fkey2-14.2tmp
85c0: 2e 32 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.7 {.    execs
85d0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
85e0: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55   t3 VALUES(1, NU
85f0: 4c 4c 2c 20 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a  LL, 1) }.  } {}.
8600: 0a 20 20 23 20 52 65 70 65 61 74 20 66 6f 72 20  .  # Repeat for 
8610: 41 54 54 41 43 48 2d 65 64 20 74 61 62 6c 65 73  ATTACH-ed tables
8620: 0a 20 20 23 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f  .  #.  drop_all_
8630: 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74  tables.  do_test
8640: 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78 2e 31   fkey2-14.1aux.1
8650: 20 7b 0a 20 20 20 20 23 20 41 64 64 69 6e 67 20   {.    # Adding 
8660: 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  a column with a 
8670: 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73  REFERENCES claus
8680: 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  e is not support
8690: 65 64 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ed..    execsql 
86a0: 7b 20 0a 20 20 20 20 20 20 41 54 54 41 43 48 20  { .      ATTACH 
86b0: 27 3a 6d 65 6d 6f 72 79 3a 27 20 41 53 20 61 75  ':memory:' AS au
86c0: 78 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  x;.      CREATE 
86d0: 54 41 42 4c 45 20 61 75 78 2e 74 31 28 61 20 50  TABLE aux.t1(a P
86e0: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
86f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8700: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
8710: 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c    }.    catchsql
8720: 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74   { ALTER TABLE t
8730: 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 63 20 52  2 ADD COLUMN c R
8740: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
8750: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
8760: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75  est fkey2-14.1au
8770: 78 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  x.2 {.    catchs
8780: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
8790: 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 64   t2 ADD COLUMN d
87a0: 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52 45   DEFAULT NULL RE
87b0: 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20  FERENCES t1 }.  
87c0: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
87d0: 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78  st fkey2-14.1aux
87e0: 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .3 {.    catchsq
87f0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
8800: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 65 20  t2 ADD COLUMN e 
8810: 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 44 45  REFERENCES t1 DE
8820: 46 41 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20 7d 20  FAULT NULL}.  } 
8830: 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {0 {}}.  do_test
8840: 20 66 6b 65 79 32 2d 31 34 2e 31 61 75 78 2e 34   fkey2-14.1aux.4
8850: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
8860: 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32  { ALTER TABLE t2
8870: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 20 52 45   ADD COLUMN f RE
8880: 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41  FERENCES t1 DEFA
8890: 55 4c 54 20 27 74 65 78 74 27 7d 0a 20 20 7d 20  ULT 'text'}.  } 
88a0: 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20 61  {1 {Cannot add a
88b0: 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c 75   REFERENCES colu
88c0: 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c 4c  mn with non-NULL
88d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d 7d   default value}}
88e0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
88f0: 2d 31 34 2e 31 61 75 78 2e 35 20 7b 0a 20 20 20  -14.1aux.5 {.   
8900: 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45   catchsql { ALTE
8910: 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20 43  R TABLE t2 ADD C
8920: 4f 4c 55 4d 4e 20 67 20 44 45 46 41 55 4c 54 20  OLUMN g DEFAULT 
8930: 43 55 52 52 45 4e 54 5f 54 49 4d 45 20 52 45 46  CURRENT_TIME REF
8940: 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20 20 7d  ERENCES t1 }.  }
8950: 20 7b 31 20 7b 43 61 6e 6e 6f 74 20 61 64 64 20   {1 {Cannot add 
8960: 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f 6c  a REFERENCES col
8970: 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55 4c  umn with non-NUL
8980: 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 7d  L default value}
8990: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
89a0: 32 2d 31 34 2e 31 61 75 78 2e 36 20 7b 0a 20 20  2-14.1aux.6 {.  
89b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
89c0: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
89d0: 6e 5f 6b 65 79 73 20 3d 20 6f 66 66 3b 0a 20 20  n_keys = off;.  
89e0: 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20      ALTER TABLE 
89f0: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 68 20  t2 ADD COLUMN h 
8a00: 44 45 46 41 55 4c 54 20 27 74 65 78 74 27 20 52  DEFAULT 'text' R
8a10: 45 46 45 52 45 4e 43 45 53 20 74 31 3b 0a 20 20  EFERENCES t1;.  
8a20: 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69      PRAGMA forei
8a30: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20  gn_keys = on;.  
8a40: 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46      SELECT sql F
8a50: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
8a60: 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
8a70: 3d 27 74 32 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  ='t2';.    }.  }
8a80: 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20   {{CREATE TABLE 
8a90: 74 32 28 61 2c 20 62 2c 20 63 20 52 45 46 45 52  t2(a, b, c REFER
8aa0: 45 4e 43 45 53 20 74 31 2c 20 64 20 44 45 46 41  ENCES t1, d DEFA
8ab0: 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45 4e  ULT NULL REFEREN
8ac0: 43 45 53 20 74 31 2c 20 65 20 52 45 46 45 52 45  CES t1, e REFERE
8ad0: 4e 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20  NCES t1 DEFAULT 
8ae0: 4e 55 4c 4c 2c 20 68 20 44 45 46 41 55 4c 54 20  NULL, h DEFAULT 
8af0: 27 74 65 78 74 27 20 52 45 46 45 52 45 4e 43 45  'text' REFERENCE
8b00: 53 20 74 31 29 7d 7d 0a 0a 20 20 64 6f 5f 74 65  S t1)}}..  do_te
8b10: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78  st fkey2-14.2aux
8b20: 2e 31 2e 31 20 7b 0a 20 20 20 20 74 65 73 74 5f  .1.1 {.    test_
8b30: 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43  rename_parent {C
8b40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8b50: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d   REFERENCES t2)}
8b60: 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45   t2 t3.  } {{CRE
8b70: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
8b80: 45 46 45 52 45 4e 43 45 53 20 22 74 33 22 29 7d  EFERENCES "t3")}
8b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.  do_test fkey
8ba0: 32 2d 31 34 2e 32 61 75 78 2e 31 2e 32 20 7b 0a  2-14.2aux.1.2 {.
8bb0: 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f      test_rename_
8bc0: 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20 54  parent {CREATE T
8bd0: 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45  ABLE t1(a REFERE
8be0: 4e 43 45 53 20 74 32 29 7d 20 74 34 20 74 33 0a  NCES t2)} t4 t3.
8bf0: 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42    } {{CREATE TAB
8c00: 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43  LE t1(a REFERENC
8c10: 45 53 20 74 32 29 7d 7d 0a 20 20 64 6f 5f 74 65  ES t2)}}.  do_te
8c20: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78  st fkey2-14.2aux
8c30: 2e 31 2e 33 20 7b 0a 20 20 20 20 74 65 73 74 5f  .1.3 {.    test_
8c40: 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43  rename_parent {C
8c50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8c60: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 32 22   REFERENCES "t2"
8c70: 29 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43  )} t2 t3.  } {{C
8c80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8c90: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 33 22   REFERENCES "t3"
8ca0: 29 7d 7d 0a 20 20 0a 20 20 23 20 54 65 73 74 20  )}}.  .  # Test 
8cb0: 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41  ALTER TABLE RENA
8cc0: 4d 45 20 54 41 42 4c 45 20 61 20 62 69 74 2e 0a  ME TABLE a bit..
8cd0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b    #.  do_test fk
8ce0: 65 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e 31 20  ey2-14.2aux.2.1 
8cf0: 7b 0a 20 20 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  {.    drop_all_t
8d00: 61 62 6c 65 73 0a 20 20 20 20 65 78 65 63 73 71  ables.    execsq
8d10: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
8d20: 20 54 41 42 4c 45 20 61 75 78 2e 74 31 28 61 20   TABLE aux.t1(a 
8d30: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
8d40: 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a 20  EFERENCES t1);. 
8d50: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
8d60: 45 20 61 75 78 2e 74 32 28 61 20 50 52 49 4d 41  E aux.t2(a PRIMA
8d70: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
8d80: 4e 43 45 53 20 74 31 2c 20 63 20 52 45 46 45 52  NCES t1, c REFER
8d90: 45 4e 43 45 53 20 74 32 29 3b 0a 20 20 20 20 20  ENCES t2);.     
8da0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
8db0: 78 2e 74 33 28 61 20 52 45 46 45 52 45 4e 43 45  x.t3(a REFERENCE
8dc0: 53 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43  S t1, b REFERENC
8dd0: 45 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e  ES t2, c REFEREN
8de0: 43 45 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20  CES t1);.    }. 
8df0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
8e00: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78  ECT sql FROM aux
8e10: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57  .sqlite_master W
8e20: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
8e30: 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 5c  le'}.  } [list \
8e40: 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54 41 42  .    {CREATE TAB
8e50: 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20  LE t1(a PRIMARY 
8e60: 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
8e70: 53 20 74 31 29 7d 20 20 20 20 20 20 20 20 20 20  S t1)}          
8e80: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8e90: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
8ea0: 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  2(a PRIMARY KEY,
8eb0: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   b REFERENCES t1
8ec0: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74  , c REFERENCES t
8ed0: 32 29 7d 20 20 20 20 5c 0a 20 20 20 20 7b 43 52  2)}    \.    {CR
8ee0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20  EATE TABLE t3(a 
8ef0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62  REFERENCES t1, b
8f00: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20   REFERENCES t2, 
8f10: 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  c REFERENCES t1)
8f20: 7d 20 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65  }  \.  ].  do_te
8f30: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78  st fkey2-14.2aux
8f40: 2e 32 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.2 {.    execs
8f50: 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45  ql { ALTER TABLE
8f60: 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 74 34   t1 RENAME TO t4
8f70: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
8f80: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
8f90: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
8fa0: 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
8fb0: 27 74 61 62 6c 65 27 7d 0a 20 20 7d 20 5b 6c 69  'table'}.  } [li
8fc0: 73 74 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45  st \.    {CREATE
8fd0: 20 54 41 42 4c 45 20 22 74 34 22 28 61 20 50 52   TABLE "t4"(a PR
8fe0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
8ff0: 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20 20  ERENCES "t4")}  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
9020: 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41  TABLE t2(a PRIMA
9030: 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45 52 45  RY KEY, b REFERE
9040: 4e 43 45 53 20 22 74 34 22 2c 20 63 20 52 45 46  NCES "t4", c REF
9050: 45 52 45 4e 43 45 53 20 74 32 29 7d 20 20 20 20  ERENCES t2)}    
9060: 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20 54   \.    {CREATE T
9070: 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52 45  ABLE t3(a REFERE
9080: 4e 43 45 53 20 22 74 34 22 2c 20 62 20 52 45 46  NCES "t4", b REF
9090: 45 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45  ERENCES t2, c RE
90a0: 46 45 52 45 4e 43 45 53 20 22 74 34 22 29 7d 20  FERENCES "t4")} 
90b0: 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20  \.  ].  do_test 
90c0: 66 6b 65 79 32 2d 31 34 2e 32 61 75 78 2e 32 2e  fkey2-14.2aux.2.
90d0: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
90e0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
90f0: 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  3 VALUES(1, 2, 3
9100: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65  ) }.  } {1 {fore
9110: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
9120: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f  nt failed}}.  do
9130: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32  _test fkey2-14.2
9140: 61 75 78 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78  aux.2.4 {.    ex
9150: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
9160: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
9170: 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a   NULL) }.  } {}.
9180: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
9190: 31 34 2e 32 61 75 78 2e 32 2e 35 20 7b 0a 20 20  14.2aux.2.5 {.  
91a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44    catchsql { UPD
91b0: 41 54 45 20 74 34 20 53 45 54 20 62 20 3d 20 35  ATE t4 SET b = 5
91c0: 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69   }.  } {1 {forei
91d0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
91e0: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
91f0: 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61  test fkey2-14.2a
9200: 75 78 2e 32 2e 36 20 7b 0a 20 20 20 20 63 61 74  ux.2.6 {.    cat
9210: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
9220: 34 20 53 45 54 20 62 20 3d 20 31 20 7d 0a 20 20  4 SET b = 1 }.  
9230: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65  } {0 {}}.  do_te
9240: 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 61 75 78  st fkey2-14.2aux
9250: 2e 32 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73  .2.7 {.    execs
9260: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
9270: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55   t3 VALUES(1, NU
9280: 4c 4c 2c 20 31 29 20 7d 0a 20 20 7d 20 7b 7d 0a  LL, 1) }.  } {}.
9290: 7d 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  }..do_test fkey-
92a0: 32 2e 31 34 2e 33 2e 31 20 7b 0a 20 20 64 72 6f  2.14.3.1 {.  dro
92b0: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65  p_all_tables.  e
92c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
92d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
92e0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73  b REFERENCES nos
92f0: 75 63 68 74 61 62 6c 65 29 3b 0a 20 20 20 20 44  uchtable);.    D
9300: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
9310: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
9320: 6b 65 79 2d 32 2e 31 34 2e 33 2e 32 20 7b 0a 20  key-2.14.3.2 {. 
9330: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
9340: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
9350: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
9360: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9370: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
9380: 20 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   1);.    CREATE 
9390: 54 41 42 4c 45 20 74 32 28 78 20 52 45 46 45 52  TABLE t2(x REFER
93a0: 45 4e 43 45 53 20 74 31 29 3b 0a 20 20 20 20 49  ENCES t1);.    I
93b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
93c0: 4c 55 45 53 28 27 61 27 29 3b 0a 20 20 7d 0a 7d  LUES('a');.  }.}
93d0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
93e0: 2d 32 2e 31 34 2e 33 2e 33 20 7b 0a 20 20 63 61  -2.14.3.3 {.  ca
93f0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
9400: 42 4c 45 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66  BLE t1 }.} {1 {f
9410: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
9420: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
9430: 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34  o_test fkey-2.14
9440: 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.4 {.  execsql
9450: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
9460: 4f 4d 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20  OM t2;.    DROP 
9470: 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d 20  TABLE t1;.  }.} 
9480: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  {}.do_test fkey-
9490: 32 2e 31 34 2e 33 2e 34 20 7b 0a 20 20 63 61 74  2.14.3.4 {.  cat
94a0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
94b0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78  NTO t2 VALUES('x
94c0: 27 29 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  ') }.} {1 {no su
94d0: 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 74  ch table: main.t
94e0: 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  1}}.do_test fkey
94f0: 2d 32 2e 31 34 2e 33 2e 35 20 7b 0a 20 20 65 78  -2.14.3.5 {.  ex
9500: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
9510: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
9520: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
9530: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9540: 41 4c 55 45 53 28 27 78 27 29 3b 0a 20 20 7d 0a  ALUES('x');.  }.
9550: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
9560: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
9570: 53 28 27 78 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f  S('x') }.} {}.do
9580: 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e  _test fkey-2.14.
9590: 33 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.6 {.  catchsql
95a0: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31   { DROP TABLE t1
95b0: 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e   }.} {1 {foreign
95c0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
95d0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
95e0: 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 37 20 7b   fkey-2.14.3.7 {
95f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
9600: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
9610: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
9620: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
9630: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9640: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  8 {.  execsql {.
9650: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9660: 20 70 70 28 78 2c 20 79 2c 20 50 52 49 4d 41 52   pp(x, y, PRIMAR
9670: 59 20 4b 45 59 28 78 2c 20 79 29 29 3b 0a 20 20  Y KEY(x, y));.  
9680: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
9690: 63 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  c(a, b, FOREIGN 
96a0: 4b 45 59 28 61 2c 20 62 29 20 52 45 46 45 52 45  KEY(a, b) REFERE
96b0: 4e 43 45 53 20 70 70 28 78 2c 20 7a 29 29 3b 0a  NCES pp(x, z));.
96c0: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
96d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20   INSERT INTO cc 
96e0: 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 7d  VALUES(1, 2) }.}
96f0: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
9700: 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f 74   mismatch}}.do_t
9710: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9720: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  9 {.  execsql { 
9730: 44 52 4f 50 20 54 41 42 4c 45 20 63 63 20 7d 0a  DROP TABLE cc }.
9740: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
9750: 79 2d 32 2e 31 34 2e 33 2e 31 30 20 7b 0a 20 20  y-2.14.3.10 {.  
9760: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
9770: 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 61 2c  EATE TABLE cc(a,
9780: 20 62 2c 20 0a 20 20 20 20 20 20 46 4f 52 45 49   b, .      FOREI
9790: 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52 45 46  GN KEY(a, b) REF
97a0: 45 52 45 4e 43 45 53 20 70 70 20 44 45 46 45 52  ERENCES pp DEFER
97b0: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
97c0: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
97d0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
97e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
97f0: 70 70 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  pp VALUES('a', '
9800: 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
9810: 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27  INTO cc VALUES('
9820: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 42 45  a', 'b');.    BE
9830: 47 49 4e 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  GIN;.      DROP 
9840: 54 41 42 4c 45 20 70 70 3b 0a 20 20 20 20 20 20  TABLE pp;.      
9850: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 70 28  CREATE TABLE pp(
9860: 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59  a, b, c, PRIMARY
9870: 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 20   KEY(b, c));.   
9880: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
9890: 70 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27 2c  p VALUES(1, 'a',
98a0: 20 27 62 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49   'b');.    COMMI
98b0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
98c0: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
98d0: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
98e0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
98f0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 63 63     DROP TABLE cc
9900: 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42  ;.      DROP TAB
9910: 4c 45 20 70 70 3b 0a 20 20 20 20 43 4f 4d 4d 49  LE pp;.    COMMI
9920: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
9930: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
9940: 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  12 {.  execsql {
9950: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9960: 45 20 62 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E b1(a, b);.    
9970: 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 32 28  CREATE TABLE b2(
9980: 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  a, b REFERENCES 
9990: 62 31 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  b1);.    DROP TA
99a0: 42 4c 45 20 62 31 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE b1;.  }.} {}
99b0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
99c0: 31 34 2e 33 2e 31 33 20 7b 0a 20 20 65 78 65 63  14.3.13 {.  exec
99d0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
99e0: 20 54 41 42 4c 45 20 62 33 28 61 2c 20 62 20 52   TABLE b3(a, b R
99f0: 45 46 45 52 45 4e 43 45 53 20 62 32 20 44 45 46  EFERENCES b2 DEF
9a00: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
9a10: 59 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20  Y DEFERRED);.   
9a20: 20 44 52 4f 50 20 54 41 42 4c 45 20 62 32 3b 0a   DROP TABLE b2;.
9a30: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74    }.} {}..# Test
9a40: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 67 6f   that nothing go
9a50: 65 73 20 77 72 6f 6e 67 20 77 68 65 6e 20 64 72  es wrong when dr
9a60: 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20 74  opping a table t
9a70: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
9a80: 76 69 65 77 2e 0a 23 20 4f 72 20 64 72 6f 70 70  view..# Or dropp
9a90: 69 6e 67 20 61 20 76 69 65 77 20 74 68 61 74 20  ing a view that 
9aa0: 61 6e 20 65 78 69 73 74 69 6e 67 20 46 4b 20 28  an existing FK (
9ab0: 69 6e 63 6f 72 72 65 63 74 6c 79 29 20 72 65 66  incorrectly) ref
9ac0: 65 72 73 20 74 6f 2e 20 4f 72 20 65 69 74 68 65  ers to. Or eithe
9ad0: 72 0a 23 20 6f 66 20 74 68 65 20 61 62 6f 76 65  r.# of the above
9ae0: 20 73 63 65 6e 61 72 69 6f 73 20 77 69 74 68 20   scenarios with 
9af0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
9b00: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
9b10: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
9b20: 31 34 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  14.4.1 {.  execs
9b30: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
9b40: 54 41 42 4c 45 20 74 31 28 78 20 52 45 46 45 52  TABLE t1(x REFER
9b50: 45 4e 43 45 53 20 76 29 3b 20 0a 20 20 20 20 43  ENCES v); .    C
9b60: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20  REATE VIEW v AS 
9b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9b80: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9b90: 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 34 2e 32  st fkey-2.14.4.2
9ba0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
9bb0: 20 20 20 44 52 4f 50 20 56 49 45 57 20 76 3b 0a     DROP VIEW v;.
9bc0: 20 20 7d 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62    }.} {}.ifcapab
9bd0: 6c 65 20 76 74 61 62 20 7b 0a 20 20 72 65 67 69  le vtab {.  regi
9be0: 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65  ster_echo_module
9bf0: 20 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b   db.  do_test fk
9c00: 65 79 2d 32 2e 31 34 2e 34 2e 33 20 7b 0a 20 20  ey-2.14.4.3 {.  
9c10: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
9c20: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
9c30: 20 76 20 55 53 49 4e 47 20 65 63 68 6f 28 74 31   v USING echo(t1
9c40: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
9c50: 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 34  test fkey-2.14.4
9c60: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
9c70: 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41   {.      DROP TA
9c80: 42 4c 45 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d  BLE v;.    }.  }
9c90: 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   {}.}..#--------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ce0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
9cf0: 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d 31  g tests, fkey2-1
9d00: 35 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 75  5.*, test that u
9d10: 6e 6e 65 63 65 73 73 61 72 79 20 46 4b 20 72 65  nnecessary FK re
9d20: 6c 61 74 65 64 20 73 63 61 6e 73 20 0a 23 20 61  lated scans .# a
9d30: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 61  nd lookups are a
9d40: 76 6f 69 64 65 64 20 77 68 65 6e 20 74 68 65 20  voided when the 
9d50: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
9d60: 65 72 73 20 61 72 65 20 7a 65 72 6f 2e 0a 23 0a  ers are zero..#.
9d70: 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a  drop_all_tables.
9d80: 70 72 6f 63 20 65 78 65 63 73 71 6c 53 20 7b 7a  proc execsqlS {z
9d90: 53 71 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73  Sql} {.  set ::s
9da0: 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
9db0: 6e 74 20 30 0a 20 20 73 65 74 20 3a 3a 73 71 6c  nt 0.  set ::sql
9dc0: 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 20  ite_found_count 
9dd0: 30 0a 20 20 73 65 74 20 72 65 73 20 5b 75 70 6c  0.  set res [upl
9de0: 65 76 65 6c 20 5b 6c 69 73 74 20 65 78 65 63 73  evel [list execs
9df0: 71 6c 20 24 7a 53 71 6c 5d 5d 0a 20 20 63 6f 6e  ql $zSql]].  con
9e00: 63 61 74 20 5b 65 78 70 72 20 24 3a 3a 73 71 6c  cat [expr $::sql
9e10: 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 20  ite_found_count 
9e20: 2b 20 24 3a 3a 73 71 6c 69 74 65 5f 73 65 61 72  + $::sqlite_sear
9e30: 63 68 5f 63 6f 75 6e 74 5d 20 24 72 65 73 0a 7d  ch_count] $res.}
9e40: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
9e50: 35 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.1.1 {.  execsq
9e60: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
9e70: 41 42 4c 45 20 70 70 28 61 20 50 52 49 4d 41 52  ABLE pp(a PRIMAR
9e80: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
9e90: 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 28 78  REATE TABLE cc(x
9ea0: 2c 20 79 20 52 45 46 45 52 45 4e 43 45 53 20 70  , y REFERENCES p
9eb0: 70 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e 49  p DEFERRABLE INI
9ec0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 29  TIALLY DEFERRED)
9ed0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9ee0: 4f 20 70 70 20 56 41 4c 55 45 53 28 31 2c 20 27  O pp VALUES(1, '
9ef0: 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  one');.    INSER
9f00: 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53  T INTO pp VALUES
9f10: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  (2, 'two');.    
9f20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56  INSERT INTO cc V
9f30: 41 4c 55 45 53 28 27 6e 65 75 6e 67 27 2c 20 31  ALUES('neung', 1
9f40: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9f50: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27 73 6f  TO cc VALUES('so
9f60: 6e 67 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  ng', 2);.  }.} {
9f70: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
9f80: 31 35 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  15.1.2 {.  execs
9f90: 71 6c 53 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  qlS { INSERT INT
9fa0: 4f 20 70 70 20 56 41 4c 55 45 53 28 33 2c 20 27  O pp VALUES(3, '
9fb0: 74 68 72 65 65 27 29 20 7d 0a 7d 20 7b 30 7d 0a  three') }.} {0}.
9fc0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 35  do_test fkey2-15
9fd0: 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
9fe0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
9ff0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a000: 63 63 20 56 41 4c 55 45 53 28 27 73 65 65 27 2c  cc VALUES('see',
a010: 20 34 29 3b 20 20 20 20 2d 2d 20 56 69 6f 6c 61   4);    -- Viola
a020: 74 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  tes deferred con
a030: 73 74 72 61 69 6e 74 0a 20 20 7d 0a 20 20 65 78  straint.  }.  ex
a040: 65 63 73 71 6c 53 20 7b 20 49 4e 53 45 52 54 20  ecsqlS { INSERT 
a050: 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28 35  INTO pp VALUES(5
a060: 2c 20 27 66 69 76 65 27 29 20 7d 0a 7d 20 7b 32  , 'five') }.} {2
a070: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
a080: 31 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  15.1.4 {.  execs
a090: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
a0a0: 20 63 63 20 57 48 45 52 45 20 78 20 3d 20 27 73   cc WHERE x = 's
a0b0: 65 65 27 20 7d 0a 20 20 65 78 65 63 73 71 6c 53  ee' }.  execsqlS
a0c0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70   { INSERT INTO p
a0d0: 70 20 56 41 4c 55 45 53 28 36 2c 20 27 73 69 78  p VALUES(6, 'six
a0e0: 27 29 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  ') }.} {0}.do_te
a0f0: 73 74 20 66 6b 65 79 32 2d 31 35 2e 31 2e 35 20  st fkey2-15.1.5 
a100: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
a110: 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  IT.} {}.do_test 
a120: 66 6b 65 79 32 2d 31 35 2e 31 2e 36 20 7b 0a 20  fkey2-15.1.6 {. 
a130: 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20   execsql BEGIN. 
a140: 20 65 78 65 63 73 71 6c 53 20 7b 0a 20 20 20 20   execsqlS {.    
a150: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 57  DELETE FROM cc W
a160: 48 45 52 45 20 78 20 3d 20 27 6e 65 75 6e 67 27  HERE x = 'neung'
a170: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
a180: 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73    }.} {1}.do_tes
a190: 74 20 66 6b 65 79 32 2d 31 35 2e 31 2e 37 20 7b  t fkey2-15.1.7 {
a1a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
a1b0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c    BEGIN;.    DEL
a1c0: 45 54 45 20 46 52 4f 4d 20 70 70 20 57 48 45 52  ETE FROM pp WHER
a1d0: 45 20 61 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 65  E a = 2;.  }.  e
a1e0: 78 65 63 73 71 6c 53 20 7b 0a 20 20 20 20 44 45  xecsqlS {.    DE
a1f0: 4c 45 54 45 20 46 52 4f 4d 20 63 63 20 57 48 45  LETE FROM cc WHE
a200: 52 45 20 78 20 3d 20 27 6e 65 75 6e 67 27 3b 0a  RE x = 'neung';.
a210: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
a220: 7d 0a 7d 20 7b 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {2}..#------
a230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a270: 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65 78 74 20  ---.# This next 
a280: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20  block of tests, 
a290: 66 6b 65 79 32 2d 31 36 2e 2a 2c 20 74 65 73 74  fkey2-16.*, test
a2a0: 20 74 68 61 74 20 72 6f 77 73 20 74 68 61 74 20   that rows that 
a2b0: 72 65 66 65 72 20 74 6f 0a 23 20 74 68 65 6d 73  refer to.# thems
a2c0: 65 6c 76 65 73 20 6d 61 79 20 62 65 20 69 6e 73  elves may be ins
a2d0: 65 72 74 65 64 20 61 6e 64 20 64 65 6c 65 74 65  erted and delete
a2e0: 64 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  d..#.foreach {tn
a2f0: 20 7a 53 63 68 65 6d 61 7d 20 7b 0a 20 20 31 20   zSchema} {.  1 
a300: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  { CREATE TABLE s
a310: 65 6c 66 28 61 20 49 4e 54 45 47 45 52 20 50 52  elf(a INTEGER PR
a320: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
a330: 45 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29  ERENCES self(a))
a340: 20 7d 0a 20 20 32 20 7b 20 43 52 45 41 54 45 20   }.  2 { CREATE 
a350: 54 41 42 4c 45 20 73 65 6c 66 28 61 20 50 52 49  TABLE self(a PRI
a360: 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46 45  MARY KEY, b REFE
a370: 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29 29 20  RENCES self(a)) 
a380: 7d 0a 20 20 33 20 7b 20 43 52 45 41 54 45 20 54  }.  3 { CREATE T
a390: 41 42 4c 45 20 73 65 6c 66 28 61 20 55 4e 49 51  ABLE self(a UNIQ
a3a0: 55 45 2c 20 62 20 49 4e 54 45 47 45 52 20 50 52  UE, b INTEGER PR
a3b0: 49 4d 41 52 59 20 4b 45 59 20 52 45 46 45 52 45  IMARY KEY REFERE
a3c0: 4e 43 45 53 20 73 65 6c 66 28 61 29 29 20 7d 0a  NCES self(a)) }.
a3d0: 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  } {.  drop_all_t
a3e0: 61 62 6c 65 73 0a 20 20 64 6f 5f 74 65 73 74 20  ables.  do_test 
a3f0: 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 31  fkey2-16.1.$tn.1
a400: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24   {.    execsql $
a410: 7a 53 63 68 65 6d 61 0a 20 20 20 20 65 78 65 63  zSchema.    exec
a420: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
a430: 4f 20 73 65 6c 66 20 56 41 4c 55 45 53 28 31 33  O self VALUES(13
a440: 2c 20 31 33 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20  , 13) }.  } {}. 
a450: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
a460: 36 2e 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  6.1.$tn.2 {.    
a470: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
a480: 20 73 65 6c 66 20 53 45 54 20 61 20 3d 20 31 34   self SET a = 14
a490: 2c 20 62 20 3d 20 31 34 20 7d 0a 20 20 7d 20 7b  , b = 14 }.  } {
a4a0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }..  do_test fke
a4b0: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 33 20 7b 0a  y2-16.1.$tn.3 {.
a4c0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55      catchsql { U
a4d0: 50 44 41 54 45 20 73 65 6c 66 20 53 45 54 20 62  PDATE self SET b
a4e0: 20 3d 20 31 35 20 7d 0a 20 20 7d 20 7b 31 20 7b   = 15 }.  } {1 {
a4f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a500: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
a510: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
a520: 2d 31 36 2e 31 2e 24 74 6e 2e 34 20 7b 0a 20 20  -16.1.$tn.4 {.  
a530: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44    catchsql { UPD
a540: 41 54 45 20 73 65 6c 66 20 53 45 54 20 61 20 3d  ATE self SET a =
a550: 20 31 35 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f   15 }.  } {1 {fo
a560: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
a570: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 20  aint failed}}.. 
a580: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
a590: 36 2e 31 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  6.1.$tn.5 {.    
a5a0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
a5b0: 45 20 73 65 6c 66 20 53 45 54 20 61 20 3d 20 31  E self SET a = 1
a5c0: 35 2c 20 62 20 3d 20 31 36 20 7d 0a 20 20 7d 20  5, b = 16 }.  } 
a5d0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
a5e0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a5f0: 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66  d}}..  do_test f
a600: 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 36 20  key2-16.1.$tn.6 
a610: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
a620: 20 55 50 44 41 54 45 20 73 65 6c 66 20 53 45 54   UPDATE self SET
a630: 20 61 20 3d 20 31 37 2c 20 62 20 3d 20 31 37 20   a = 17, b = 17 
a640: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20  }.  } {0 {}}..  
a650: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 36  do_test fkey2-16
a660: 2e 31 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 65  .1.$tn.7 {.    e
a670: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
a680: 46 52 4f 4d 20 73 65 6c 66 20 7d 0a 20 20 7d 20  FROM self }.  } 
a690: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  {}.  do_test fke
a6a0: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 38 20 7b 0a  y2-16.1.$tn.8 {.
a6b0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
a6c0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 20  NSERT INTO self 
a6d0: 56 41 4c 55 45 53 28 32 30 2c 20 32 31 29 20 7d  VALUES(20, 21) }
a6e0: 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e  .  } {1 {foreign
a6f0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a700: 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a 23 2d 2d 2d  failed}}.}..#---
a710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a750: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65  ------.# This ne
a760: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  xt block of test
a770: 73 2c 20 66 6b 65 79 32 2d 31 37 2e 2a 2c 20 74  s, fkey2-17.*, t
a780: 65 73 74 73 20 74 68 61 74 20 69 66 20 22 50 52  ests that if "PR
a790: 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67  AGMA count_chang
a7a0: 65 73 22 0a 23 20 69 73 20 74 75 72 6e 65 64 20  es".# is turned 
a7b0: 6f 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  on statements th
a7c0: 61 74 20 76 69 6f 6c 61 74 65 20 69 6d 6d 65 64  at violate immed
a7d0: 69 61 74 65 20 46 4b 20 63 6f 6e 73 74 72 61 69  iate FK constrai
a7e0: 6e 74 73 20 72 65 74 75 72 6e 0a 23 20 53 51 4c  nts return.# SQL
a7f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 69  ITE_CONSTRAINT i
a800: 6d 6d 65 64 69 61 74 65 6c 79 2c 20 6e 6f 74 20  mmediately, not 
a810: 61 66 74 65 72 20 72 65 74 75 72 6e 69 6e 67 20  after returning 
a820: 61 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  a number of rows
a830: 2e 0a 23 20 57 68 65 72 65 61 73 20 73 74 61 74  ..# Whereas stat
a840: 65 6d 65 6e 74 73 20 74 68 61 74 20 76 69 6f 6c  ements that viol
a850: 61 74 65 20 64 65 66 65 72 72 65 64 20 46 4b 20  ate deferred FK 
a860: 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 74 75  constraints retu
a870: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 23 20  rn the number.# 
a880: 6f 66 20 72 6f 77 73 20 62 65 66 6f 72 65 20 66  of rows before f
a890: 61 69 6c 69 6e 67 2e 0a 23 0a 23 20 41 6c 73 6f  ailing..#.# Also
a8a0: 20 74 65 73 74 20 74 68 61 74 20 72 6f 77 73 20   test that rows 
a8b0: 6d 6f 64 69 66 69 65 64 20 62 79 20 46 4b 20 61  modified by FK a
a8c0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 63  ctions are not c
a8d0: 6f 75 6e 74 65 64 20 69 6e 20 65 69 74 68 65 72  ounted in either
a8e0: 20 74 68 65 0a 23 20 72 65 74 75 72 6e 65 64 20   the.# returned 
a8f0: 72 6f 77 20 63 6f 75 6e 74 20 6f 72 20 74 68 65  row count or the
a900: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
a910: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 68 61 6e   by sqlite3_chan
a920: 67 65 73 28 29 2e 20 4c 69 6b 65 0a 23 20 74 72  ges(). Like.# tr
a930: 69 67 67 65 72 20 72 65 6c 61 74 65 64 20 63 68  igger related ch
a940: 61 6e 67 65 73 2c 20 74 68 65 79 20 61 72 65 20  anges, they are 
a950: 69 6e 63 6c 75 64 65 64 20 69 6e 20 73 71 6c 69  included in sqli
a960: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
a970: 73 28 29 20 74 68 6f 75 67 68 2e 0a 23 0a 64 72  s() though..#.dr
a980: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
a990: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31  _test fkey2-17.1
a9a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
a9b0: 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68   PRAGMA count_ch
a9c0: 61 6e 67 65 73 20 3d 20 31 20 7d 0a 20 20 65 78  anges = 1 }.  ex
a9d0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45  ecsql { .    CRE
a9e0: 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 2c  ATE TABLE one(a,
a9f0: 20 62 2c 20 63 2c 20 55 4e 49 51 55 45 28 62 2c   b, c, UNIQUE(b,
aa00: 20 63 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   c));.    CREATE
aa10: 20 54 41 42 4c 45 20 74 77 6f 28 64 2c 20 65 2c   TABLE two(d, e,
aa20: 20 66 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   f, FOREIGN KEY(
aa30: 65 2c 20 66 29 20 52 45 46 45 52 45 4e 43 45 53  e, f) REFERENCES
aa40: 20 6f 6e 65 28 62 2c 20 63 29 29 3b 0a 20 20 20   one(b, c));.   
aa50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
aa60: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
aa70: 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ;.  }.} {1}.do_t
aa80: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 32  est fkey2-17.1.2
aa90: 20 7b 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73   {.  set STMT [s
aaa0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
aab0: 32 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54  2 db "INSERT INT
aac0: 4f 20 74 77 6f 20 56 41 4c 55 45 53 28 34 2c 20  O two VALUES(4, 
aad0: 35 2c 20 36 29 22 20 2d 31 20 64 75 6d 6d 79 5d  5, 6)" -1 dummy]
aae0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
aaf0: 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f  $STMT.} {SQLITE_
ab00: 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 64 6f 5f 74  CONSTRAINT}.do_t
ab10: 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 33  est fkey2-17.1.3
ab20: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65   {.  sqlite3_ste
ab30: 70 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54  p $STMT.} {SQLIT
ab40: 45 5f 4d 49 53 55 53 45 7d 0a 64 6f 5f 74 65 73  E_MISUSE}.do_tes
ab50: 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e 34 20 7b  t fkey2-17.1.4 {
ab60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
ab70: 69 7a 65 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c  ize $STMT.} {SQL
ab80: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a  ITE_CONSTRAINT}.
ab90: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
aba0: 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.5 {.  execsql
abb0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
abc0: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 32 2c  TO one VALUES(2,
abd0: 20 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45   3, 4);.    INSE
abe0: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
abf0: 45 53 28 33 2c 20 34 2c 20 35 29 3b 0a 20 20 20  ES(3, 4, 5);.   
ac00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 77 6f   INSERT INTO two
ac10: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
ac20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ac30: 4f 20 74 77 6f 20 56 41 4c 55 45 53 28 32 2c 20  O two VALUES(2, 
ac40: 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  3, 4);.    INSER
ac50: 54 20 49 4e 54 4f 20 74 77 6f 20 56 41 4c 55 45  T INTO two VALUE
ac60: 53 28 33 2c 20 34 2c 20 35 29 3b 0a 20 20 7d 0a  S(3, 4, 5);.  }.
ac70: 7d 20 7b 31 20 31 20 31 20 31 20 31 7d 0a 64 6f  } {1 1 1 1 1}.do
ac80: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31  _test fkey2-17.1
ac90: 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .6 {.  catchsql 
aca0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
acb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f     INSERT INTO o
acc0: 6e 65 20 56 41 4c 55 45 53 28 30 2c 20 30 2c 20  ne VALUES(0, 0, 
acd0: 30 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  0);.      UPDATE
ace0: 20 74 77 6f 20 53 45 54 20 65 3d 65 2b 31 2c 20   two SET e=e+1, 
acf0: 66 3d 66 2b 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  f=f+1;.  }.} {1 
ad00: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
ad10: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
ad20: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
ad30: 37 2e 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  7.1.7 {.  execsq
ad40: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
ad50: 4d 20 6f 6e 65 20 7d 0a 7d 20 7b 31 20 32 20 33  M one }.} {1 2 3
ad60: 20 32 20 33 20 34 20 33 20 34 20 35 20 30 20 30   2 3 4 3 4 5 0 0
ad70: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   0}.do_test fkey
ad80: 32 2d 31 37 2e 31 2e 38 20 7b 0a 20 20 65 78 65  2-17.1.8 {.  exe
ad90: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
ada0: 46 52 4f 4d 20 74 77 6f 20 7d 0a 7d 20 7b 31 20  FROM two }.} {1 
adb0: 32 20 33 20 32 20 33 20 34 20 33 20 34 20 35 7d  2 3 2 3 4 3 4 5}
adc0: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
add0: 37 2e 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  7.1.9 {.  execsq
ade0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f  l COMMIT.} {}.do
adf0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31  _test fkey2-17.1
ae00: 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .10 {.  execsql 
ae10: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
ae20: 4c 45 20 74 68 72 65 65 28 0a 20 20 20 20 20 20  LE three(.      
ae30: 67 2c 20 68 2c 20 69 2c 20 0a 20 20 20 20 20 20  g, h, i, .      
ae40: 46 4f 52 45 49 47 4e 20 4b 45 59 28 68 2c 20 69  FOREIGN KEY(h, i
ae50: 29 20 52 45 46 45 52 45 4e 43 45 53 20 6f 6e 65  ) REFERENCES one
ae60: 28 62 2c 20 63 29 20 44 45 46 45 52 52 41 42 4c  (b, c) DEFERRABL
ae70: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
ae80: 52 52 45 44 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  RRED.    );.  }.
ae90: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
aea0: 79 32 2d 31 37 2e 31 2e 31 31 20 7b 0a 20 20 73  y2-17.1.11 {.  s
aeb0: 65 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33  et STMT [sqlite3
aec0: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 22  _prepare_v2 db "
aed0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 68 72 65  INSERT INTO thre
aee0: 65 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39  e VALUES(7, 8, 9
aef0: 29 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73  )" -1 dummy].  s
af00: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d  qlite3_step $STM
af10: 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 52 4f 57 7d  T.} {SQLITE_ROW}
af20: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
af30: 37 2e 31 2e 31 32 20 7b 0a 20 20 73 71 6c 69 74  7.1.12 {.  sqlit
af40: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
af50: 53 54 4d 54 20 30 0a 7d 20 7b 31 7d 0a 64 6f 5f  STMT 0.} {1}.do_
af60: 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 31 2e  test fkey2-17.1.
af70: 31 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  13 {.  sqlite3_s
af80: 74 65 70 20 24 53 54 4d 54 0a 7d 20 7b 53 51 4c  tep $STMT.} {SQL
af90: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 7d 0a  ITE_CONSTRAINT}.
afa0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
afb0: 2e 31 2e 31 34 20 7b 0a 20 20 73 71 6c 69 74 65  .1.14 {.  sqlite
afc0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54 4d 54  3_finalize $STMT
afd0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .} {SQLITE_CONST
afe0: 52 41 49 4e 54 7d 0a 0a 64 72 6f 70 5f 61 6c 6c  RAINT}..drop_all
aff0: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
b000: 66 6b 65 79 32 2d 31 37 2e 32 2e 31 20 7b 0a 20  fkey2-17.2.1 {. 
b010: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
b020: 52 45 41 54 45 20 54 41 42 4c 45 20 68 69 67 68  REATE TABLE high
b030: 28 22 61 27 62 21 22 20 50 52 49 4d 41 52 59 20  ("a'b!" PRIMARY 
b040: 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  KEY, b);.    CRE
b050: 41 54 45 20 54 41 42 4c 45 20 6c 6f 77 28 0a 20  ATE TABLE low(. 
b060: 20 20 20 20 20 63 2c 20 0a 20 20 20 20 20 20 22       c, .      "
b070: 64 26 36 22 20 52 45 46 45 52 45 4e 43 45 53 20  d&6" REFERENCES 
b080: 68 69 67 68 20 4f 4e 20 55 50 44 41 54 45 20 43  high ON UPDATE C
b090: 41 53 43 41 44 45 20 4f 4e 20 44 45 4c 45 54 45  ASCADE ON DELETE
b0a0: 20 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a   CASCADE.    );.
b0b0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
b0c0: 20 66 6b 65 79 32 2d 31 37 2e 32 2e 32 20 7b 0a   fkey2-17.2.2 {.
b0d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
b0e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 69 67 68  INSERT INTO high
b0f0: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
b100: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
b110: 54 4f 20 6c 6f 77 20 56 41 4c 55 45 53 28 27 62  TO low VALUES('b
b120: 27 2c 20 27 61 27 29 3b 0a 20 20 7d 0a 20 20 64  ', 'a');.  }.  d
b130: 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a  b changes.} {1}.
b140: 73 65 74 20 6e 54 6f 74 61 6c 20 5b 64 62 20 74  set nTotal [db t
b150: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 0a 64 6f  otal_changes].do
b160: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e 32  _test fkey2-17.2
b170: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
b180: 20 55 50 44 41 54 45 20 68 69 67 68 20 53 45 54   UPDATE high SET
b190: 20 22 61 27 62 21 22 20 3d 20 27 63 27 20 7d 0a   "a'b!" = 'c' }.
b1a0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  } {1}.do_test fk
b1b0: 65 79 32 2d 31 37 2e 32 2e 34 20 7b 0a 20 20 64  ey2-17.2.4 {.  d
b1c0: 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a  b changes.} {1}.
b1d0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
b1e0: 2e 32 2e 35 20 7b 0a 20 20 65 78 70 72 20 5b 64  .2.5 {.  expr [d
b1f0: 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d  b total_changes]
b200: 20 2d 20 24 6e 54 6f 74 61 6c 0a 7d 20 7b 32 7d   - $nTotal.} {2}
b210: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
b220: 37 2e 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  7.2.6 {.  execsq
b230: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
b240: 4d 20 68 69 67 68 20 3b 20 53 45 4c 45 43 54 20  M high ; SELECT 
b250: 2a 20 46 52 4f 4d 20 6c 6f 77 20 7d 0a 7d 20 7b  * FROM low }.} {
b260: 63 20 62 20 62 20 63 7d 0a 64 6f 5f 74 65 73 74  c b b c}.do_test
b270: 20 66 6b 65 79 32 2d 31 37 2e 32 2e 37 20 7b 0a   fkey2-17.2.7 {.
b280: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45    execsql { DELE
b290: 54 45 20 46 52 4f 4d 20 68 69 67 68 20 7d 0a 7d  TE FROM high }.}
b2a0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65   {1}.do_test fke
b2b0: 79 32 2d 31 37 2e 32 2e 38 20 7b 0a 20 20 64 62  y2-17.2.8 {.  db
b2c0: 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64   changes.} {1}.d
b2d0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37 2e  o_test fkey2-17.
b2e0: 32 2e 39 20 7b 0a 20 20 65 78 70 72 20 5b 64 62  2.9 {.  expr [db
b2f0: 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 5d 20   total_changes] 
b300: 2d 20 24 6e 54 6f 74 61 6c 0a 7d 20 7b 34 7d 0a  - $nTotal.} {4}.
b310: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 37  do_test fkey2-17
b320: 2e 32 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  .2.10 {.  execsq
b330: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
b340: 4d 20 68 69 67 68 20 3b 20 53 45 4c 45 43 54 20  M high ; SELECT 
b350: 2a 20 46 52 4f 4d 20 6c 6f 77 20 7d 0a 7d 20 7b  * FROM low }.} {
b360: 7d 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  }.execsql { PRAG
b370: 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  MA count_changes
b380: 20 3d 20 30 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   = 0 }..#-------
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  --.# Test that t
b3e0: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
b3f0: 20 63 61 6c 6c 62 61 63 6b 20 77 6f 72 6b 73 2e   callback works.
b400: 0a 23 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 75  .#..ifcapable au
b410: 74 68 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  th {.  do_test f
b420: 6b 65 79 32 2d 31 38 2e 31 20 7b 0a 20 20 20 20  key2-18.1 {.    
b430: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
b440: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 6e  CREATE TABLE lon
b450: 67 28 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b  g(a, b PRIMARY K
b460: 45 59 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52  EY, c);.      CR
b470: 45 41 54 45 20 54 41 42 4c 45 20 73 68 6f 72 74  EATE TABLE short
b480: 28 64 2c 20 65 2c 20 66 20 52 45 46 45 52 45 4e  (d, e, f REFEREN
b490: 43 45 53 20 6c 6f 6e 67 29 3b 0a 20 20 20 20 20  CES long);.     
b4a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 69   CREATE TABLE mi
b4b0: 64 28 67 2c 20 68 2c 20 69 20 52 45 46 45 52 45  d(g, h, i REFERE
b4c0: 4e 43 45 53 20 6c 6f 6e 67 20 44 45 46 45 52 52  NCES long DEFERR
b4d0: 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44  ABLE INITIALLY D
b4e0: 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20 7d 0a  EFERRED);.    }.
b4f0: 20 20 7d 20 7b 7d 0a 0a 20 20 70 72 6f 63 20 61    } {}..  proc a
b500: 75 74 68 20 7b 61 72 67 73 7d 20 7b 65 76 61 6c  uth {args} {eval
b510: 20 6c 61 70 70 65 6e 64 20 3a 3a 61 75 74 68 61   lappend ::autha
b520: 72 67 73 20 24 61 72 67 73 20 3b 20 72 65 74 75  rgs $args ; retu
b530: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20  rn SQLITE_OK}.  
b540: 64 62 20 61 75 74 68 20 61 75 74 68 0a 0a 20 20  db auth auth..  
b550: 23 20 41 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74  # An insert on t
b560: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
b570: 6d 75 73 74 20 72 65 61 64 20 74 68 65 20 63 68  must read the ch
b580: 69 6c 64 20 6b 65 79 20 6f 66 20 61 6e 79 20 64  ild key of any d
b590: 65 66 65 72 72 65 64 0a 20 20 23 20 66 6f 72 65  eferred.  # fore
b5a0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
b5b0: 6e 74 73 2e 20 42 75 74 20 6e 6f 74 20 74 68 65  nts. But not the
b5c0: 20 63 68 69 6c 64 20 6b 65 79 20 6f 66 20 69 6d   child key of im
b5d0: 6d 65 64 69 61 74 65 20 63 6f 6e 73 74 72 61 69  mediate constrai
b5e0: 6e 74 73 2e 0a 20 20 73 65 74 20 61 75 74 68 61  nts..  set autha
b5f0: 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  rgs {}.  do_test
b600: 20 66 6b 65 79 32 2d 31 38 2e 32 20 7b 0a 20 20   fkey2-18.2 {.  
b610: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
b620: 52 54 20 49 4e 54 4f 20 6c 6f 6e 67 20 56 41 4c  RT INTO long VAL
b630: 55 45 53 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20  UES(1, 2, 3) }. 
b640: 20 20 20 73 65 74 20 61 75 74 68 61 72 67 73 0a     set authargs.
b650: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e 53 45    } {SQLITE_INSE
b660: 52 54 20 6c 6f 6e 67 20 7b 7d 20 6d 61 69 6e 20  RT long {} main 
b670: 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6d  {} SQLITE_READ m
b680: 69 64 20 69 20 6d 61 69 6e 20 7b 7d 7d 0a 0a 20  id i main {}}.. 
b690: 20 23 20 41 6e 20 69 6e 73 65 72 74 20 6f 6e 20   # An insert on 
b6a0: 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
b6b0: 6f 66 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  of an immediate 
b6c0: 63 6f 6e 73 74 72 61 69 6e 74 20 6d 75 73 74 20  constraint must 
b6d0: 72 65 61 64 20 74 68 65 0a 20 20 23 20 70 61 72  read the.  # par
b6e0: 65 6e 74 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ent key columns 
b6f0: 28 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73  (to see if it is
b700: 20 61 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 72 20   a violation or 
b710: 6e 6f 74 29 2e 0a 20 20 73 65 74 20 61 75 74 68  not)..  set auth
b720: 61 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  args {}.  do_tes
b730: 74 20 66 6b 65 79 32 2d 31 38 2e 33 20 7b 0a 20  t fkey2-18.3 {. 
b740: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
b750: 45 52 54 20 49 4e 54 4f 20 73 68 6f 72 74 20 56  ERT INTO short V
b760: 41 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d  ALUES(1, 3, 2) }
b770: 0a 20 20 20 20 73 65 74 20 61 75 74 68 61 72 67  .    set autharg
b780: 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e  s.  } {SQLITE_IN
b790: 53 45 52 54 20 73 68 6f 72 74 20 7b 7d 20 6d 61  SERT short {} ma
b7a0: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
b7b0: 44 20 6c 6f 6e 67 20 62 20 6d 61 69 6e 20 7b 7d  D long b main {}
b7c0: 7d 0a 20 20 0a 20 20 23 20 41 73 20 6d 75 73 74  }.  .  # As must
b7d0: 20 61 6e 20 69 6e 73 65 72 74 20 6f 6e 20 74 68   an insert on th
b7e0: 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6f 66  e child table of
b7f0: 20 61 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73   a deferred cons
b800: 74 72 61 69 6e 74 2e 0a 20 20 73 65 74 20 61 75  traint..  set au
b810: 74 68 61 72 67 73 20 7b 7d 0a 20 20 64 6f 5f 74  thargs {}.  do_t
b820: 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 34 20 7b  est fkey2-18.4 {
b830: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
b840: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 69 64 20 56  NSERT INTO mid V
b850: 41 4c 55 45 53 28 31 2c 20 33 2c 20 32 29 20 7d  ALUES(1, 3, 2) }
b860: 0a 20 20 20 20 73 65 74 20 61 75 74 68 61 72 67  .    set autharg
b870: 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 49 4e  s.  } {SQLITE_IN
b880: 53 45 52 54 20 6d 69 64 20 7b 7d 20 6d 61 69 6e  SERT mid {} main
b890: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
b8a0: 6c 6f 6e 67 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a  long b main {}}.
b8b0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
b8c0: 2d 31 38 2e 35 20 7b 0a 20 20 20 20 65 78 65 63  -18.5 {.    exec
b8d0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
b8e0: 54 45 20 54 41 42 4c 45 20 6e 6f 75 67 68 74 28  TE TABLE nought(
b8f0: 61 2c 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59  a, b PRIMARY KEY
b900: 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , c);.      CREA
b910: 54 45 20 54 41 42 4c 45 20 63 72 6f 73 73 28 64  TE TABLE cross(d
b920: 2c 20 65 2c 20 66 2c 0a 20 20 20 20 20 20 20 20  , e, f,.        
b930: 46 4f 52 45 49 47 4e 20 4b 45 59 28 65 29 20 52  FOREIGN KEY(e) R
b940: 45 46 45 52 45 4e 43 45 53 20 6e 6f 75 67 68 74  EFERENCES nought
b950: 28 62 29 20 4f 4e 20 55 50 44 41 54 45 20 43 41  (b) ON UPDATE CA
b960: 53 43 41 44 45 0a 20 20 20 20 20 20 29 3b 0a 20  SCADE.      );. 
b970: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
b980: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e   { INSERT INTO n
b990: 6f 75 67 68 74 20 56 41 4c 55 45 53 28 32 2c 20  ought VALUES(2, 
b9a0: 31 2c 20 32 29 20 7d 0a 20 20 20 20 65 78 65 63  1, 2) }.    exec
b9b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
b9c0: 4f 20 63 72 6f 73 73 20 56 41 4c 55 45 53 28 30  O cross VALUES(0
b9d0: 2c 20 31 2c 20 30 29 20 7d 0a 20 20 20 20 73 65  , 1, 0) }.    se
b9e0: 74 20 61 75 74 68 61 72 67 73 20 5b 6c 69 73 74  t authargs [list
b9f0: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ].    execsql { 
ba00: 55 50 44 41 54 45 20 6e 6f 75 67 68 74 20 53 45  UPDATE nought SE
ba10: 54 20 62 20 3d 20 35 20 7d 0a 20 20 20 20 73 65  T b = 5 }.    se
ba20: 74 20 61 75 74 68 61 72 67 73 0a 20 20 7d 20 7b  t authargs.  } {
ba30: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6e 6f  SQLITE_UPDATE no
ba40: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53  ught b main {} S
ba50: 51 4c 49 54 45 5f 52 45 41 44 20 63 72 6f 73 73  QLITE_READ cross
ba60: 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54   e main {} SQLIT
ba70: 45 5f 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d  E_READ cross e m
ba80: 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45  ain {} SQLITE_RE
ba90: 41 44 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e  AD nought b main
baa0: 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   {} SQLITE_READ 
bab0: 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d  nought b main {}
bac0: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f 75   SQLITE_READ nou
bad0: 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 20 53 51  ght b main {} SQ
bae0: 4c 49 54 45 5f 55 50 44 41 54 45 20 63 72 6f 73  LITE_UPDATE cros
baf0: 73 20 65 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49  s e main {} SQLI
bb00: 54 45 5f 52 45 41 44 20 6e 6f 75 67 68 74 20 62  TE_READ nought b
bb10: 20 6d 61 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f   main {} SQLITE_
bb20: 52 45 41 44 20 63 72 6f 73 73 20 65 20 6d 61 69  READ cross e mai
bb30: 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41 44  n {} SQLITE_READ
bb40: 20 6e 6f 75 67 68 74 20 62 20 6d 61 69 6e 20 7b   nought b main {
bb50: 7d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 6e 6f  } SQLITE_READ no
bb60: 75 67 68 74 20 62 20 6d 61 69 6e 20 7b 7d 7d 0a  ught b main {}}.
bb70: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
bb80: 2d 31 38 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  -18.6 {.    exec
bb90: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
bba0: 4f 4d 20 63 72 6f 73 73 7d 0a 20 20 7d 20 7b 30  OM cross}.  } {0
bbb0: 20 35 20 30 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   5 0}..  do_test
bbc0: 20 66 6b 65 79 32 2d 31 38 2e 37 20 7b 0a 20 20   fkey2-18.7 {.  
bbd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
bbe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
bbf0: 6e 65 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  ne(a INTEGER PRI
bc00: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
bc10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
bc20: 20 74 77 6f 28 62 2c 20 63 20 52 45 46 45 52 45   two(b, c REFERE
bc30: 4e 43 45 53 20 6f 6e 65 29 3b 0a 20 20 20 20 20  NCES one);.     
bc40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
bc50: 20 56 41 4c 55 45 53 28 31 30 31 2c 20 31 30 32   VALUES(101, 102
bc60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  );.    }.    set
bc70: 20 61 75 74 68 61 72 67 73 20 5b 6c 69 73 74 5d   authargs [list]
bc80: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
bc90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 77 6f 20 56  NSERT INTO two V
bca0: 41 4c 55 45 53 28 31 30 30 2c 20 31 30 31 29 3b  ALUES(100, 101);
bcb0: 20 7d 0a 20 20 20 20 73 65 74 20 61 75 74 68 61   }.    set autha
bcc0: 72 67 73 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f  rgs.  } {SQLITE_
bcd0: 49 4e 53 45 52 54 20 74 77 6f 20 7b 7d 20 6d 61  INSERT two {} ma
bce0: 69 6e 20 7b 7d 20 53 51 4c 49 54 45 5f 52 45 41  in {} SQLITE_REA
bcf0: 44 20 6f 6e 65 20 61 20 6d 61 69 6e 20 7b 7d 7d  D one a main {}}
bd00: 0a 0a 20 20 23 20 52 65 74 75 72 6e 20 53 51 4c  ..  # Return SQL
bd10: 49 54 45 5f 49 47 4e 4f 52 45 20 74 6f 20 72 65  ITE_IGNORE to re
bd20: 71 75 65 73 74 73 20 74 6f 20 72 65 61 64 20 66  quests to read f
bd30: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 74  rom the parent t
bd40: 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 23 20 63  able. This.  # c
bd50: 61 75 73 65 73 20 69 6e 73 65 72 74 73 20 6f 66  auses inserts of
bd60: 20 6e 6f 6e 2d 4e 55 4c 4c 20 6b 65 79 73 20 69   non-NULL keys i
bd70: 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 20 74 61  nto the child ta
bd80: 62 6c 65 20 74 6f 20 66 61 69 6c 2e 0a 20 20 23  ble to fail..  #
bd90: 0a 20 20 72 65 6e 61 6d 65 20 61 75 74 68 20 7b  .  rename auth {
bda0: 7d 0a 20 20 70 72 6f 63 20 61 75 74 68 20 7b 61  }.  proc auth {a
bdb0: 72 67 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  rgs} {.    if {[
bdc0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 31 5d 20  lindex $args 1] 
bdd0: 3d 3d 20 22 6c 6f 6e 67 22 7d 20 7b 72 65 74 75  == "long"} {retu
bde0: 72 6e 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  rn SQLITE_IGNORE
bdf0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
be00: 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 64 6f 5f  ITE_OK.  }.  do_
be10: 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e 38 20  test fkey2-18.8 
be20: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
be30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 68 6f   INSERT INTO sho
be40: 72 74 20 56 41 4c 55 45 53 28 31 2c 20 33 2c 20  rt VALUES(1, 3, 
be50: 32 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72  2) }.  } {1 {for
be60: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
be70: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64  int failed}}.  d
be80: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 38 2e  o_test fkey2-18.
be90: 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  9 {.    execsql 
bea0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 68  { INSERT INTO sh
beb0: 6f 72 74 20 56 41 4c 55 45 53 28 31 2c 20 33 2c  ort VALUES(1, 3,
bec0: 20 4e 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a   NULL) }.  } {}.
bed0: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
bee0: 31 38 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63  18.10 {.    exec
bef0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
bf00: 52 4f 4d 20 73 68 6f 72 74 20 7d 0a 20 20 7d 20  ROM short }.  } 
bf10: 7b 31 20 33 20 32 20 31 20 33 20 7b 7d 7d 0a 20  {1 3 2 1 3 {}}. 
bf20: 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31   do_test fkey2-1
bf30: 38 2e 31 31 20 7b 0a 20 20 20 20 63 61 74 63 68  8.11 {.    catch
bf40: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 73 68 6f  sql { UPDATE sho
bf50: 72 74 20 53 45 54 20 66 20 3d 20 32 20 57 48 45  rt SET f = 2 WHE
bf60: 52 45 20 66 20 49 53 20 4e 55 4c 4c 20 7d 0a 20  RE f IS NULL }. 
bf70: 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b   } {1 {foreign k
bf80: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
bf90: 69 6c 65 64 7d 7d 0a 0a 20 20 64 62 20 61 75 74  iled}}..  db aut
bfa0: 68 20 7b 7d 0a 20 20 75 6e 73 65 74 20 61 75 74  h {}.  unset aut
bfb0: 68 61 72 67 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  hargs.}..#------
bfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c000: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
c010: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ing block of tes
c020: 74 73 2c 20 74 68 6f 73 65 20 70 72 65 66 69 78  ts, those prefix
c030: 65 64 20 77 69 74 68 20 22 66 6b 65 79 32 2d 67  ed with "fkey2-g
c040: 65 6e 66 6b 65 79 2e 22 2c 20 61 72 65 20 0a 23  enfkey.", are .#
c050: 20 74 68 65 20 73 61 6d 65 20 74 65 73 74 73 20   the same tests 
c060: 74 68 61 74 20 77 65 72 65 20 75 73 65 64 20 74  that were used t
c070: 6f 20 74 65 73 74 20 74 68 65 20 22 2e 67 65 6e  o test the ".gen
c080: 66 6b 65 79 22 20 63 6f 6d 6d 61 6e 64 20 70 72  fkey" command pr
c090: 6f 76 69 64 65 64 20 0a 23 20 62 79 20 74 68 65  ovided .# by the
c0a0: 20 73 68 65 6c 6c 20 74 6f 6f 6c 2e 20 53 6f 20   shell tool. So 
c0b0: 74 68 65 73 65 20 74 65 73 74 73 20 73 68 6f 77  these tests show
c0c0: 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 74 2d   that the built-
c0d0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 0a  in foreign key .
c0e0: 23 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  # implementation
c0f0: 20 69 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73   is more or less
c100: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
c110: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 67 65   the triggers ge
c120: 6e 65 72 61 74 65 64 20 0a 23 20 62 79 20 67 65  nerated .# by ge
c130: 6e 66 6b 65 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c  nfkey..#.drop_al
c140: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74  l_tables.do_test
c150: 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31   fkey2-genfkey.1
c160: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
c170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
c180: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
c190: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
c1a0: 2c 20 55 4e 49 51 55 45 28 62 2c 20 63 29 29 3b  , UNIQUE(b, c));
c1b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
c1c0: 45 20 74 32 28 65 20 52 45 46 45 52 45 4e 43 45  E t2(e REFERENCE
c1d0: 53 20 74 31 2c 20 66 29 3b 0a 20 20 20 20 43 52  S t1, f);.    CR
c1e0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 67 2c  EATE TABLE t3(g,
c1f0: 20 68 2c 20 69 2c 20 46 4f 52 45 49 47 4e 20 4b   h, i, FOREIGN K
c200: 45 59 20 28 68 2c 20 69 29 20 52 45 46 45 52 45  EY (h, i) REFERE
c210: 4e 43 45 53 20 74 31 28 62 2c 20 63 29 29 3b 0a  NCES t1(b, c));.
c220: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
c230: 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31   fkey2-genfkey.1
c240: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
c250: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
c260: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
c270: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
c280: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
c290: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
c2a0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 33 20  ey2-genfkey.1.3 
c2b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
c2c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c2d0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
c2e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c2f0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
c300: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
c310: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
c320: 79 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  y.1.4 {.  execsq
c330: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
c340: 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t2 VALUES(NULL, 
c350: 33 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  3) }.} {}.do_tes
c360: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
c370: 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.5 {.  catchsql
c380: 20 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54   { UPDATE t2 SET
c390: 20 65 20 3d 20 35 20 57 48 45 52 45 20 65 20 49   e = 5 WHERE e I
c3a0: 53 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 31 20 7b 66  S NULL }.} {1 {f
c3b0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
c3c0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
c3d0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
c3e0: 66 6b 65 79 2e 31 2e 36 20 7b 0a 20 20 65 78 65  fkey.1.6 {.  exe
c3f0: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 32  csql { UPDATE t2
c400: 20 53 45 54 20 65 20 3d 20 31 20 57 48 45 52 45   SET e = 1 WHERE
c410: 20 65 20 49 53 20 4e 55 4c 4c 20 7d 0a 7d 20 7b   e IS NULL }.} {
c420: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
c430: 67 65 6e 66 6b 65 79 2e 31 2e 37 20 7b 0a 20 20  genfkey.1.7 {.  
c440: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
c450: 20 74 32 20 53 45 54 20 65 20 3d 20 4e 55 4c 4c   t2 SET e = NULL
c460: 20 57 48 45 52 45 20 66 20 3d 20 33 20 7d 0a 7d   WHERE f = 3 }.}
c470: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
c480: 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 38 20 7b 0a  2-genfkey.1.8 {.
c490: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44    catchsql { UPD
c4a0: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 31  ATE t1 SET a = 1
c4b0: 30 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  0 }.} {1 {foreig
c4c0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
c4d0: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
c4e0: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
c4f0: 31 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.9 {.  catchsql
c500: 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54   { UPDATE t1 SET
c510: 20 61 20 3d 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 31   a = NULL }.} {1
c520: 20 7b 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   {datatype misma
c530: 74 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  tch}}.do_test fk
c540: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 30  ey2-genfkey.1.10
c550: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
c560: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d  DELETE FROM t1 }
c570: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
c580: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
c590: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
c5a0: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31  key2-genfkey.1.1
c5b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
c5c0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 65 20  UPDATE t2 SET e 
c5d0: 3d 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f  = NULL }.} {}.do
c5e0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
c5f0: 6b 65 79 2e 31 2e 31 32 20 7b 0a 20 20 65 78 65  key.1.12 {.  exe
c600: 63 73 71 6c 20 7b 20 0a 20 20 20 20 55 50 44 41  csql { .    UPDA
c610: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 31 30  TE t1 SET a = 10
c620: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
c630: 4d 20 74 31 3b 0a 20 20 20 20 44 45 4c 45 54 45  M t1;.    DELETE
c640: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
c650: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  {}.do_test fkey2
c660: 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 33 20 7b 0a  -genfkey.1.13 {.
c670: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
c680: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
c690: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 4e  ALUES(1, NULL, N
c6a0: 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
c6b0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
c6c0: 31 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  1, 2, NULL);.   
c6d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
c6e0: 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20  VALUES(1, NULL, 
c6f0: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  3);.  }.} {}.do_
c700: 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b  test fkey2-genfk
c710: 65 79 2e 31 2e 31 34 20 7b 0a 20 20 63 61 74 63  ey.1.14 {.  catc
c720: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
c730: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20  TO t3 VALUES(3, 
c740: 31 2c 20 34 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  1, 4) }.} {1 {fo
c750: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
c760: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
c770: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
c780: 6b 65 79 2e 31 2e 31 35 20 7b 0a 20 20 65 78 65  key.1.15 {.  exe
c790: 63 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45  csql { .    INSE
c7a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
c7b0: 53 28 31 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20  S(1, 1, 4);.    
c7c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
c7d0: 41 4c 55 45 53 28 33 2c 20 31 2c 20 34 29 3b 0a  ALUES(3, 1, 4);.
c7e0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
c7f0: 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31   fkey2-genfkey.1
c800: 2e 31 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .16 {.  catchsql
c810: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
c820: 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  1 }.} {1 {foreig
c830: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
c840: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
c850: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
c860: 31 2e 31 37 20 7b 0a 20 20 63 61 74 63 68 73 71  1.17 {.  catchsq
c870: 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  l { UPDATE t1 SE
c880: 54 20 62 20 3d 20 31 30 7d 0a 7d 20 7b 31 20 7b  T b = 10}.} {1 {
c890: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
c8a0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
c8b0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
c8c0: 6e 66 6b 65 79 2e 31 2e 31 38 20 7b 0a 20 20 65  nfkey.1.18 {.  e
c8d0: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
c8e0: 74 31 20 53 45 54 20 61 20 3d 20 31 30 7d 0a 7d  t1 SET a = 10}.}
c8f0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
c900: 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 39 20 7b  2-genfkey.1.19 {
c910: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50  .  catchsql { UP
c920: 44 41 54 45 20 74 33 20 53 45 54 20 68 20 3d 20  DATE t3 SET h = 
c930: 27 68 65 6c 6c 6f 27 20 57 48 45 52 45 20 69 20  'hello' WHERE i 
c940: 3d 20 33 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69  = 3}.} {1 {forei
c950: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
c960: 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 72 6f 70  t failed}}..drop
c970: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74  _all_tables.do_t
c980: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
c990: 79 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  y.2.1 {.  execsq
c9a0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
c9b0: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
c9c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
c9d0: 2c 20 63 2c 20 55 4e 49 51 55 45 28 62 2c 20 63  , c, UNIQUE(b, c
c9e0: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
c9f0: 41 42 4c 45 20 74 32 28 65 20 52 45 46 45 52 45  ABLE t2(e REFERE
ca00: 4e 43 45 53 20 74 31 20 4f 4e 20 55 50 44 41 54  NCES t1 ON UPDAT
ca10: 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45 4c  E CASCADE ON DEL
ca20: 45 54 45 20 43 41 53 43 41 44 45 2c 20 66 29 3b  ETE CASCADE, f);
ca30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
ca40: 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 0a 20  E t3(g, h, i, . 
ca50: 20 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b         FOREIGN K
ca60: 45 59 20 28 68 2c 20 69 29 20 0a 20 20 20 20 20  EY (h, i) .     
ca70: 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 74 31     REFERENCES t1
ca80: 28 62 2c 20 63 29 20 4f 4e 20 55 50 44 41 54 45  (b, c) ON UPDATE
ca90: 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45 4c 45   CASCADE ON DELE
caa0: 54 45 20 43 41 53 43 41 44 45 0a 20 20 20 20 29  TE CASCADE.    )
cab0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
cac0: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
cad0: 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.2 {.  execsql
cae0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
caf0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
cb00: 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  2, 3);.    INSER
cb10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
cb20: 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 49  (4, 5, 6);.    I
cb30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
cb40: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
cb50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
cb60: 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f  t2 VALUES(4, 'fo
cb70: 75 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ur');.  }.} {}.d
cb80: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
cb90: 66 6b 65 79 2e 32 2e 33 20 7b 0a 20 20 65 78 65  fkey.2.3 {.  exe
cba0: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
cbb0: 45 20 74 31 20 53 45 54 20 61 20 3d 20 32 20 57  E t1 SET a = 2 W
cbc0: 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
cbd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
cbe0: 3b 0a 20 20 7d 0a 7d 20 7b 32 20 6f 6e 65 20 34  ;.  }.} {2 one 4
cbf0: 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 66   four}.do_test f
cc00: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 34  key2-genfkey.2.4
cc10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
cc20: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
cc30: 31 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20  1 WHERE a = 4;. 
cc40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
cc50: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 32 20 6f 6e   t2;.  }.} {2 on
cc60: 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  e}..do_test fkey
cc70: 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 35 20 7b 0a  2-genfkey.2.5 {.
cc80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
cc90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
cca0: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 32  ALUES('hello', 2
ccb0: 2c 20 33 29 3b 0a 20 20 20 20 55 50 44 41 54 45  , 3);.    UPDATE
ccc0: 20 74 31 20 53 45 54 20 63 20 3d 20 32 3b 0a 20   t1 SET c = 2;. 
ccd0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
cce0: 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c   t3;.  }.} {hell
ccf0: 6f 20 32 20 32 7d 0a 64 6f 5f 74 65 73 74 20 66  o 2 2}.do_test f
cd00: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 36  key2-genfkey.2.6
cd10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
cd20: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
cd30: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
cd40: 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b  FROM t3;.  }.} {
cd50: 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  }..drop_all_tabl
cd60: 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  es.do_test fkey2
cd70: 2d 67 65 6e 66 6b 65 79 2e 33 2e 31 20 7b 0a 20  -genfkey.3.1 {. 
cd80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
cd90: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
cda0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
cdb0: 20 4b 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49 51   KEY, b, c, UNIQ
cdc0: 55 45 28 63 2c 20 62 29 29 3b 0a 20 20 20 20 43  UE(c, b));.    C
cdd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 65  REATE TABLE t2(e
cde0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f   REFERENCES t1 O
cdf0: 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c  N UPDATE SET NUL
ce00: 4c 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  L ON DELETE SET 
ce10: 4e 55 4c 4c 2c 20 66 29 3b 0a 20 20 20 20 43 52  NULL, f);.    CR
ce20: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 67 2c  EATE TABLE t3(g,
ce30: 20 68 2c 20 69 2c 20 0a 20 20 20 20 20 20 20 20   h, i, .        
ce40: 46 4f 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20  FOREIGN KEY (h, 
ce50: 69 29 20 0a 20 20 20 20 20 20 20 20 52 45 46 45  i) .        REFE
ce60: 52 45 4e 43 45 53 20 74 31 28 62 2c 20 63 29 20  RENCES t1(b, c) 
ce70: 4f 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55  ON UPDATE SET NU
ce80: 4c 4c 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54  LL ON DELETE SET
ce90: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d   NULL.    );.  }
cea0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
ceb0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e 32 20  ey2-genfkey.3.2 
cec0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ced0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cee0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
cef0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
cf00: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35  O t1 VALUES(4, 5
cf10: 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 6);.    INSERT
cf20: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
cf30: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  1, 'one');.    I
cf40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
cf50: 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b  LUES(4, 'four');
cf60: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
cf70: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
cf80: 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
cf90: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  {.    UPDATE t1 
cfa0: 53 45 54 20 61 20 3d 20 32 20 57 48 45 52 45 20  SET a = 2 WHERE 
cfb0: 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43  a = 1;.    SELEC
cfc0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
cfd0: 0a 7d 20 7b 7b 7d 20 6f 6e 65 20 34 20 66 6f 75  .} {{} one 4 fou
cfe0: 72 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  r}.do_test fkey2
cff0: 2d 67 65 6e 66 6b 65 79 2e 33 2e 34 20 7b 0a 20  -genfkey.3.4 {. 
d000: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
d010: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
d020: 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53  ERE a = 4;.    S
d030: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
d040: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f 6e 65 20 7b  .  }.} {{} one {
d050: 7d 20 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20  } four}.do_test 
d060: 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e  fkey2-genfkey.3.
d070: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
d080: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d090: 74 33 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f  t3 VALUES('hello
d0a0: 27 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 55 50  ', 2, 3);.    UP
d0b0: 44 41 54 45 20 74 31 20 53 45 54 20 63 20 3d 20  DATE t1 SET c = 
d0c0: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
d0d0: 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b  FROM t3;.  }.} {
d0e0: 68 65 6c 6c 6f 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f  hello {} {}}.do_
d0f0: 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b  test fkey2-genfk
d100: 65 79 2e 33 2e 36 20 7b 0a 20 20 65 78 65 63 73  ey.3.6 {.  execs
d110: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
d120: 74 33 20 53 45 54 20 68 20 3d 20 32 2c 20 69 20  t3 SET h = 2, i 
d130: 3d 20 32 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  = 2;.    DELETE 
d140: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c  FROM t1;.    SEL
d150: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
d160: 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 7b 7d 20 7b   }.} {hello {} {
d170: 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }}..finish_test.