/ Hex Artifact Content
Login

Artifact 73f7f72f9890f53b3e6a6c9c121d110761d8801c:


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 67 65 6e 66 6b 65 79 2e 2a 3a 20 54 65 73 74  -genfkey.*: Test
0980: 73 20 74 68 61 74 20 77 65 72 65 20 75 73 65 64  s that were used
0990: 20 77 69 74 68 20 74 68 65 20 73 68 65 6c 6c 20   with the shell 
09a0: 74 6f 6f 6c 20 2e 67 65 6e 66 6b 65 79 0a 23 20  tool .genfkey.# 
09b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61             comma
09c0: 6e 64 2e 20 52 65 63 79 63 6c 65 64 20 74 6f 20  nd. Recycled to 
09d0: 74 65 73 74 20 74 68 65 20 62 75 69 6c 74 2d 69  test the built-i
09e0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
09f0: 2e 0a 23 0a 0a 0a 70 72 6f 63 20 64 72 6f 70 5f  ..#...proc drop_
0a00: 61 6c 6c 5f 74 61 62 6c 65 73 20 7b 7b 64 62 20  all_tables {{db 
0a10: 64 62 7d 7d 20 7b 0a 20 20 73 65 74 20 74 62 6c  db}} {.  set tbl
0a20: 73 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  s [execsql {SELE
0a30: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
0a40: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
0a50: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d   type = 'table'}
0a60: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  ].  execsql { PR
0a70: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
0a80: 73 20 3d 20 4f 46 46 20 7d 0a 20 20 66 6f 72 65  s = OFF }.  fore
0a90: 61 63 68 20 74 20 5b 65 78 65 63 73 71 6c 20 7b  ach t [execsql {
0aa0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
0ab0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
0ac0: 74 65 72 20 0a 20 20 20 20 57 48 45 52 45 20 74  ter .    WHERE t
0ad0: 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
0ae0: 44 20 6e 61 6d 65 20 4e 4f 54 20 6c 69 6b 65 20  D name NOT like 
0af0: 27 73 71 6c 69 74 65 5f 25 27 0a 20 20 7d 5d 20  'sqlite_%'.  }] 
0b00: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 44  {.    execsql "D
0b10: 52 4f 50 20 54 41 42 4c 45 20 24 74 22 0a 20 20  ROP TABLE $t".  
0b20: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
0b30: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
0b40: 73 20 3d 20 4f 4e 20 7d 0a 7d 0a 0a 65 78 65 63  s = ON }.}..exec
0b50: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  sql { PRAGMA for
0b60: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 20 7d  eign_keys = on }
0b70: 0a 0a 73 65 74 20 46 6b 65 79 53 69 6d 70 6c 65  ..set FkeySimple
0b80: 53 63 68 65 6d 61 20 7b 0a 20 20 50 52 41 47 4d  Schema {.  PRAGM
0b90: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  A foreign_keys =
0ba0: 20 6f 6e 3b 0a 20 20 43 52 45 41 54 45 20 54 41   on;.  CREATE TA
0bb0: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
0bc0: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41   KEY, b);.  CREA
0bd0: 54 45 20 54 41 42 4c 45 20 74 32 28 63 20 52 45  TE TABLE t2(c RE
0be0: 46 45 52 45 4e 43 45 53 20 74 31 28 61 29 20 2f  FERENCES t1(a) /
0bf0: 44 2f 20 2c 20 64 29 3b 0a 0a 20 20 43 52 45 41  D/ , d);..  CREA
0c00: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 50 52  TE TABLE t3(a PR
0c10: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
0c20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
0c30: 28 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 33  (c REFERENCES t3
0c40: 20 2f 44 2f 2c 20 64 29 3b 0a 0a 20 20 43 52 45   /D/, d);..  CRE
0c50: 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20  ATE TABLE t7(a, 
0c60: 62 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  b INTEGER PRIMAR
0c70: 59 20 4b 45 59 29 3b 0a 20 20 43 52 45 41 54 45  Y KEY);.  CREATE
0c80: 20 54 41 42 4c 45 20 74 38 28 63 20 52 45 46 45   TABLE t8(c REFE
0c90: 52 45 4e 43 45 53 20 74 37 20 2f 44 2f 2c 20 64  RENCES t7 /D/, d
0ca0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
0cb0: 4c 45 20 74 39 28 61 20 52 45 46 45 52 45 4e 43  LE t9(a REFERENC
0cc0: 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20  ES nosuchtable, 
0cd0: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  b);.  CREATE TAB
0ce0: 4c 45 20 74 31 30 28 61 20 52 45 46 45 52 45 4e  LE t10(a REFEREN
0cf0: 43 45 53 20 74 39 28 63 29 20 2f 44 2f 2c 20 62  CES t9(c) /D/, b
0d00: 29 3b 0a 7d 0a 0a 0a 73 65 74 20 46 6b 65 79 53  );.}...set FkeyS
0d10: 69 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 31  impleTests {.  1
0d20: 2e 31 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  .1  "INSERT INTO
0d30: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 33 29   t2 VALUES(1, 3)
0d40: 22 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69  "      {1 {forei
0d50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
0d60: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 32  t failed}}.  1.2
0d70: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0d80: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22 20  1 VALUES(1, 2)" 
0d90: 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e       {0 {}}.  1.
0da0: 33 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  3  "INSERT INTO 
0db0: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22  t2 VALUES(1, 3)"
0dc0: 20 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31        {0 {}}.  1
0dd0: 2e 34 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  .4  "INSERT INTO
0de0: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 34 29   t2 VALUES(2, 4)
0df0: 22 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69  "      {1 {forei
0e00: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
0e10: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 35  t failed}}.  1.5
0e20: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0e30: 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34  2 VALUES(NULL, 4
0e40: 29 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e  )"   {0 {}}.  1.
0e50: 36 20 20 22 55 50 44 41 54 45 20 74 32 20 53 45  6  "UPDATE t2 SE
0e60: 54 20 63 3d 32 20 57 48 45 52 45 20 64 3d 34 22  T c=2 WHERE d=4"
0e70: 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67        {1 {foreig
0e80: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
0e90: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 37 20   failed}}.  1.7 
0ea0: 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20   "UPDATE t2 SET 
0eb0: 63 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20  c=1 WHERE d=4"  
0ec0: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e 39      {0 {}}.  1.9
0ed0: 20 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54    "UPDATE t2 SET
0ee0: 20 63 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20   c=1 WHERE d=4" 
0ef0: 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31 2e       {0 {}}.  1.
0f00: 31 30 20 22 55 50 44 41 54 45 20 74 32 20 53 45  10 "UPDATE t2 SE
0f10: 54 20 63 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64  T c=NULL WHERE d
0f20: 3d 34 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 31  =4"   {0 {}}.  1
0f30: 2e 31 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  .11 "DELETE FROM
0f40: 20 74 31 20 57 48 45 52 45 20 61 3d 31 22 20 20   t1 WHERE a=1"  
0f50: 20 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69         {1 {forei
0f60: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
0f70: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 31  t failed}}.  1.1
0f80: 32 20 22 55 50 44 41 54 45 20 74 31 20 53 45 54  2 "UPDATE t1 SET
0f90: 20 61 20 3d 20 32 22 20 20 20 20 20 20 20 20 20   a = 2"         
0fa0: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
0fb0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
0fc0: 66 61 69 6c 65 64 7d 7d 0a 20 20 31 2e 31 33 20  failed}}.  1.13 
0fd0: 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61  "UPDATE t1 SET a
0fe0: 20 3d 20 31 22 20 20 20 20 20 20 20 20 20 20 20   = 1"           
0ff0: 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 32 2e 31     {0 {}}..  2.1
1000: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
1010: 34 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20  4 VALUES(1, 3)" 
1020: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
1030: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
1040: 66 61 69 6c 65 64 7d 7d 0a 20 20 32 2e 32 20 20  failed}}.  2.2  
1050: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20  "INSERT INTO t3 
1060: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 20 20 20  VALUES(1, 2)"   
1070: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 32 2e 33 20     {0 {}}.  2.3 
1080: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34   "INSERT INTO t4
1090: 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20   VALUES(1, 3)"  
10a0: 20 20 20 20 7b 30 20 7b 7d 7d 0a 0a 20 20 34 2e      {0 {}}..  4.
10b0: 31 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  1  "INSERT INTO 
10c0: 74 38 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22  t8 VALUES(1, 3)"
10d0: 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67        {1 {foreig
10e0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
10f0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 32 20   failed}}.  4.2 
1100: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37   "INSERT INTO t7
1110: 20 56 41 4c 55 45 53 28 32 2c 20 31 29 22 20 20   VALUES(2, 1)"  
1120: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 33      {0 {}}.  4.3
1130: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
1140: 38 20 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20  8 VALUES(1, 3)" 
1150: 20 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e       {0 {}}.  4.
1160: 34 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  4  "INSERT INTO 
1170: 74 38 20 56 41 4c 55 45 53 28 32 2c 20 34 29 22  t8 VALUES(2, 4)"
1180: 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67        {1 {foreig
1190: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
11a0: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 35 20   failed}}.  4.5 
11b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38   "INSERT INTO t8
11c0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 34 29   VALUES(NULL, 4)
11d0: 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 36  "   {0 {}}.  4.6
11e0: 20 20 22 55 50 44 41 54 45 20 74 38 20 53 45 54    "UPDATE t8 SET
11f0: 20 63 3d 32 20 57 48 45 52 45 20 64 3d 34 22 20   c=2 WHERE d=4" 
1200: 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e       {1 {foreign
1210: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
1220: 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 37 20 20  failed}}.  4.7  
1230: 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20 63  "UPDATE t8 SET c
1240: 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20 20  =1 WHERE d=4"   
1250: 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 39 20     {0 {}}.  4.9 
1260: 20 22 55 50 44 41 54 45 20 74 38 20 53 45 54 20   "UPDATE t8 SET 
1270: 63 3d 31 20 57 48 45 52 45 20 64 3d 34 22 20 20  c=1 WHERE d=4"  
1280: 20 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31      {0 {}}.  4.1
1290: 30 20 22 55 50 44 41 54 45 20 74 38 20 53 45 54  0 "UPDATE t8 SET
12a0: 20 63 3d 4e 55 4c 4c 20 57 48 45 52 45 20 64 3d   c=NULL WHERE d=
12b0: 34 22 20 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e  4"   {0 {}}.  4.
12c0: 31 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  11 "DELETE FROM 
12d0: 74 37 20 57 48 45 52 45 20 62 3d 31 22 20 20 20  t7 WHERE b=1"   
12e0: 20 20 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67        {1 {foreig
12f0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
1300: 20 66 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 31 32   failed}}.  4.12
1310: 20 22 55 50 44 41 54 45 20 74 37 20 53 45 54 20   "UPDATE t7 SET 
1320: 62 20 3d 20 32 22 20 20 20 20 20 20 20 20 20 20  b = 2"          
1330: 20 20 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20      {1 {foreign 
1340: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
1350: 61 69 6c 65 64 7d 7d 0a 20 20 34 2e 31 33 20 22  ailed}}.  4.13 "
1360: 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62 20  UPDATE t7 SET b 
1370: 3d 20 31 22 20 20 20 20 20 20 20 20 20 20 20 20  = 1"            
1380: 20 20 7b 30 20 7b 7d 7d 0a 20 20 34 2e 31 34 20    {0 {}}.  4.14 
1390: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20  "INSERT INTO t8 
13a0: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
13b0: 22 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  "  {1 {foreign k
13c0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
13d0: 69 6c 65 64 7d 7d 0a 0a 20 20 35 2e 31 20 20 22  iled}}..  5.1  "
13e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56  INSERT INTO t9 V
13f0: 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20 20  ALUES(1, 3)"    
1400: 20 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61    {1 {no such ta
1410: 62 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75 63 68  ble: main.nosuch
1420: 74 61 62 6c 65 7d 7d 0a 20 20 35 2e 32 20 20 22  table}}.  5.2  "
1430: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20  INSERT INTO t10 
1440: 56 41 4c 55 45 53 28 31 2c 20 33 29 22 20 20 20  VALUES(1, 3)"   
1450: 20 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65    {1 {foreign ke
1460: 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 7d 0a 0a  y mismatch}}.}..
1470: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e  do_test fkey2-1.
1480: 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.0 {.  execsql 
1490: 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 2f 44 2f  [string map {/D/
14a0: 20 7b 7d 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65   {}} $FkeySimple
14b0: 53 63 68 65 6d 61 5d 0a 7d 20 7b 7d 0a 66 6f 72  Schema].} {}.for
14c0: 65 61 63 68 20 7b 74 6e 20 7a 53 71 6c 20 72 65  each {tn zSql re
14d0: 73 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 54 65  s} $FkeySimpleTe
14e0: 73 74 73 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  sts {.  do_test 
14f0: 66 6b 65 79 32 2d 31 2e 31 2e 24 74 6e 20 7b 20  fkey2-1.1.$tn { 
1500: 63 61 74 63 68 73 71 6c 20 24 7a 53 71 6c 20 7d  catchsql $zSql }
1510: 20 24 72 65 73 0a 7d 0a 64 72 6f 70 5f 61 6c 6c   $res.}.drop_all
1520: 5f 74 61 62 6c 65 73 0a 0a 64 6f 5f 74 65 73 74  _tables..do_test
1530: 20 66 6b 65 79 32 2d 31 2e 32 2e 30 20 7b 0a 20   fkey2-1.2.0 {. 
1540: 20 65 78 65 63 73 71 6c 20 5b 73 74 72 69 6e 67   execsql [string
1550: 20 6d 61 70 20 7b 2f 44 2f 20 7b 44 45 46 45 52   map {/D/ {DEFER
1560: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
1570: 44 45 46 45 52 52 45 44 7d 7d 20 24 46 6b 65 79  DEFERRED}} $Fkey
1580: 53 69 6d 70 6c 65 53 63 68 65 6d 61 5d 0a 7d 20  SimpleSchema].} 
1590: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a  {}.foreach {tn z
15a0: 53 71 6c 20 72 65 73 7d 20 24 46 6b 65 79 53 69  Sql res} $FkeySi
15b0: 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 64 6f  mpleTests {.  do
15c0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 32 2e  _test fkey2-1.2.
15d0: 24 74 6e 20 7b 20 63 61 74 63 68 73 71 6c 20 24  $tn { catchsql $
15e0: 7a 53 71 6c 20 7d 20 24 72 65 73 0a 7d 0a 64 72  zSql } $res.}.dr
15f0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 0a 64  op_all_tables..d
1600: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 33  o_test fkey2-1.3
1610: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 5b  .0 {.  execsql [
1620: 73 74 72 69 6e 67 20 6d 61 70 20 7b 2f 44 2f 20  string map {/D/ 
1630: 7b 7d 7d 20 24 46 6b 65 79 53 69 6d 70 6c 65 53  {}} $FkeySimpleS
1640: 63 68 65 6d 61 5d 0a 20 20 65 78 65 63 73 71 6c  chema].  execsql
1650: 20 7b 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f   { PRAGMA count_
1660: 63 68 61 6e 67 65 73 20 3d 20 31 20 7d 0a 7d 20  changes = 1 }.} 
1670: 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 7a  {}.foreach {tn z
1680: 53 71 6c 20 72 65 73 7d 20 24 46 6b 65 79 53 69  Sql res} $FkeySi
1690: 6d 70 6c 65 54 65 73 74 73 20 7b 0a 20 20 69 66  mpleTests {.  if
16a0: 20 7b 24 72 65 73 20 3d 3d 20 22 30 20 7b 7d 22   {$res == "0 {}"
16b0: 7d 20 7b 20 73 65 74 20 72 65 73 20 7b 30 20 31  } { set res {0 1
16c0: 7d 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b  } }.  do_test fk
16d0: 65 79 32 2d 31 2e 33 2e 24 74 6e 20 7b 20 63 61  ey2-1.3.$tn { ca
16e0: 74 63 68 73 71 6c 20 24 7a 53 71 6c 20 7d 20 24  tchsql $zSql } $
16f0: 72 65 73 0a 7d 0a 65 78 65 63 73 71 6c 20 7b 20  res.}.execsql { 
1700: 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61  PRAGMA count_cha
1710: 6e 67 65 73 20 3d 20 30 20 7d 0a 64 72 6f 70 5f  nges = 0 }.drop_
1720: 61 6c 6c 5f 74 61 62 6c 65 73 0a 0a 23 20 53 70  all_tables..# Sp
1730: 65 63 69 61 6c 20 74 65 73 74 3a 20 57 68 65 6e  ecial test: When
1740: 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65 79 20   the parent key 
1750: 69 73 20 61 6e 20 49 50 4b 2c 20 6d 61 6b 65 20  is an IPK, make 
1760: 73 75 72 65 20 74 68 65 20 61 66 66 69 6e 69 74  sure the affinit
1770: 79 20 6f 66 0a 23 20 74 68 65 20 49 50 4b 20 69  y of.# the IPK i
1780: 73 20 6e 6f 74 20 61 70 70 6c 69 65 64 20 74 6f  s not applied to
1790: 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76   the child key v
17a0: 61 6c 75 65 20 62 65 66 6f 72 65 20 69 74 20 69  alue before it i
17b0: 73 20 69 6e 73 65 72 74 65 64 0a 23 20 69 6e 74  s inserted.# int
17c0: 6f 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  o the child tabl
17d0: 65 2e 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  e..do_test fkey2
17e0: 2d 31 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  -1.4.1 {.  execs
17f0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1800: 54 41 42 4c 45 20 69 28 69 20 49 4e 54 45 47 45  TABLE i(i INTEGE
1810: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  R PRIMARY KEY);.
1820: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1830: 20 6a 28 6a 20 52 45 46 45 52 45 4e 43 45 53 20   j(j REFERENCES 
1840: 69 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  i);.    INSERT I
1850: 4e 54 4f 20 69 20 56 41 4c 55 45 53 28 33 35 29  NTO i VALUES(35)
1860: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1870: 4f 20 6a 20 56 41 4c 55 45 53 28 27 33 35 2e 30  O j VALUES('35.0
1880: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6a  ');.    SELECT j
1890: 2c 20 74 79 70 65 6f 66 28 6a 29 20 46 52 4f 4d  , typeof(j) FROM
18a0: 20 6a 3b 0a 20 20 7d 0a 7d 20 7b 33 35 2e 30 20   j;.  }.} {35.0 
18b0: 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  text}.do_test fk
18c0: 65 79 32 2d 31 2e 34 2e 32 20 7b 0a 20 20 63 61  ey2-1.4.2 {.  ca
18d0: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
18e0: 46 52 4f 4d 20 69 20 7d 0a 7d 20 7b 31 20 7b 66  FROM i }.} {1 {f
18f0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
1900: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
1910: 23 20 53 61 6d 65 20 74 65 73 74 20 75 73 69 6e  # Same test usin
1920: 67 20 61 20 72 65 67 75 6c 61 72 20 70 72 69 6d  g a regular prim
1930: 61 72 79 20 6b 65 79 20 77 69 74 68 20 69 6e 74  ary key with int
1940: 65 67 65 72 20 61 66 66 69 6e 69 74 79 2e 0a 64  eger affinity..d
1950: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
1960: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 2e 35  o_test fkey2-1.5
1970: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1980: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1990: 45 20 69 28 69 20 49 4e 54 20 55 4e 49 51 55 45  E i(i INT UNIQUE
19a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
19b0: 42 4c 45 20 6a 28 6a 20 52 45 46 45 52 45 4e 43  BLE j(j REFERENC
19c0: 45 53 20 69 28 69 29 29 3b 0a 20 20 20 20 49 4e  ES i(i));.    IN
19d0: 53 45 52 54 20 49 4e 54 4f 20 69 20 56 41 4c 55  SERT INTO i VALU
19e0: 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20 20 20  ES('35.0');.    
19f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41  INSERT INTO j VA
1a00: 4c 55 45 53 28 27 33 35 2e 30 27 29 3b 0a 20 20  LUES('35.0');.  
1a10: 20 20 53 45 4c 45 43 54 20 6a 2c 20 74 79 70 65    SELECT j, type
1a20: 6f 66 28 6a 29 20 46 52 4f 4d 20 6a 3b 0a 20 20  of(j) FROM j;.  
1a30: 20 20 53 45 4c 45 43 54 20 69 2c 20 74 79 70 65    SELECT i, type
1a40: 6f 66 28 69 29 20 46 52 4f 4d 20 69 3b 0a 20 20  of(i) FROM i;.  
1a50: 7d 0a 7d 20 7b 33 35 2e 30 20 74 65 78 74 20 33  }.} {35.0 text 3
1a60: 35 20 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 74 65  5 integer}.do_te
1a70: 73 74 20 66 6b 65 79 32 2d 31 2e 35 2e 32 20 7b  st fkey2-1.5.2 {
1a80: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45  .  catchsql { DE
1a90: 4c 45 54 45 20 46 52 4f 4d 20 69 20 7d 0a 7d 20  LETE FROM i }.} 
1aa0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
1ab0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
1ac0: 64 7d 7d 0a 0a 23 20 55 73 65 20 61 20 63 6f 6c  d}}..# Use a col
1ad0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1ae0: 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 6b 65  on the parent ke
1af0: 79 2e 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  y..drop_all_tabl
1b00: 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  es.do_test fkey2
1b10: 2d 31 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  -1.6.1 {.  execs
1b20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1b30: 54 41 42 4c 45 20 69 28 69 20 54 45 58 54 20 43  TABLE i(i TEXT C
1b40: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 50 52  OLLATE nocase PR
1b50: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
1b60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a 28 6a  CREATE TABLE j(j
1b70: 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 62 69   TEXT COLLATE bi
1b80: 6e 61 72 79 20 52 45 46 45 52 45 4e 43 45 53 20  nary REFERENCES 
1b90: 69 28 69 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  i(i));.    INSER
1ba0: 54 20 49 4e 54 4f 20 69 20 56 41 4c 55 45 53 28  T INTO i VALUES(
1bb0: 27 53 51 4c 69 74 65 27 29 3b 0a 20 20 20 20 49  'SQLite');.    I
1bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
1bd0: 55 45 53 28 27 73 71 6c 69 74 65 27 29 3b 0a 20  UES('sqlite');. 
1be0: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
1bf0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 20 7d 0a  DELETE FROM i }.
1c00: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
1c10: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
1c20: 6c 65 64 7d 7d 0a 0a 23 20 55 73 65 20 74 68 65  led}}..# Use the
1c30: 20 70 61 72 65 6e 74 20 6b 65 79 20 63 6f 6c 6c   parent key coll
1c40: 61 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 69 74  ation even if it
1c50: 20 69 73 20 64 65 66 61 75 6c 74 20 61 6e 64 20   is default and 
1c60: 74 68 65 20 63 68 69 6c 64 20 6b 65 79 0a 23 20  the child key.# 
1c70: 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20  has an explicit 
1c80: 76 61 6c 75 65 2e 0a 64 72 6f 70 5f 61 6c 6c 5f  value..drop_all_
1c90: 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66  tables.do_test f
1ca0: 6b 65 79 32 2d 31 2e 36 2e 32 20 7b 0a 20 20 65  key2-1.6.2 {.  e
1cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
1cc0: 41 54 45 20 54 41 42 4c 45 20 69 28 69 20 54 45  ATE TABLE i(i TE
1cd0: 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  XT PRIMARY KEY);
1ce0: 20 20 20 20 20 20 20 20 2d 2d 20 43 6f 6c 73 65          -- Colse
1cf0: 71 20 69 73 20 22 42 49 4e 41 52 59 22 0a 20 20  q is "BINARY".  
1d00: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6a    CREATE TABLE j
1d10: 28 6a 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20  (j TEXT COLLATE 
1d20: 6e 6f 63 61 73 65 20 52 45 46 45 52 45 4e 43 45  nocase REFERENCE
1d30: 53 20 69 28 69 29 29 3b 0a 20 20 20 20 49 4e 53  S i(i));.    INS
1d40: 45 52 54 20 49 4e 54 4f 20 69 20 56 41 4c 55 45  ERT INTO i VALUE
1d50: 53 28 27 53 51 4c 69 74 65 27 29 3b 0a 20 20 7d  S('SQLite');.  }
1d60: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
1d70: 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c 55  SERT INTO j VALU
1d80: 45 53 28 27 73 71 6c 69 74 65 27 29 20 7d 0a 7d  ES('sqlite') }.}
1d90: 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79   {1 {foreign key
1da0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
1db0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  ed}}.do_test fke
1dc0: 79 32 2d 31 2e 36 2e 33 20 7b 0a 20 20 65 78 65  y2-1.6.3 {.  exe
1dd0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
1de0: 54 20 49 4e 54 4f 20 69 20 56 41 4c 55 45 53 28  T INTO i VALUES(
1df0: 27 73 71 6c 69 74 65 27 29 3b 0a 20 20 20 20 49  'sqlite');.    I
1e00: 4e 53 45 52 54 20 49 4e 54 4f 20 6a 20 56 41 4c  NSERT INTO j VAL
1e10: 55 45 53 28 27 73 71 6c 69 74 65 27 29 3b 0a 20  UES('sqlite');. 
1e20: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 69     DELETE FROM i
1e30: 20 57 48 45 52 45 20 69 20 3d 20 27 53 51 4c 69   WHERE i = 'SQLi
1e40: 74 65 27 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68  te';.  }.  catch
1e50: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
1e60: 4d 20 69 20 57 48 45 52 45 20 69 20 3d 20 27 73  M i WHERE i = 's
1e70: 71 6c 69 74 65 27 20 7d 0a 7d 20 7b 31 20 7b 66  qlite' }.} {1 {f
1e80: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
1e90: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
1ea0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
1ef0: 73 20 73 65 63 74 69 6f 6e 20 28 74 65 73 74 20  s section (test 
1f00: 63 61 73 65 73 20 66 6b 65 79 32 2d 32 2e 2a 29  cases fkey2-2.*)
1f10: 20 63 6f 6e 74 61 69 6e 73 20 74 65 73 74 73 20   contains tests 
1f20: 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  to check that th
1f30: 65 0a 23 20 64 65 66 65 72 72 65 64 20 66 6f 72  e.# deferred for
1f40: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
1f50: 69 6e 74 20 6c 6f 67 69 63 20 77 6f 72 6b 73 2e  int logic works.
1f60: 0a 23 0a 70 72 6f 63 20 66 6b 65 79 32 2d 32 2d  .#.proc fkey2-2-
1f70: 74 65 73 74 20 7b 74 6e 20 6e 6f 63 6f 6d 6d 69  test {tn nocommi
1f80: 74 20 73 71 6c 20 7b 72 65 73 20 7b 7d 7d 7d 20  t sql {res {}}} 
1f90: 7b 0a 20 20 69 66 20 7b 24 72 65 73 20 65 71 20  {.  if {$res eq 
1fa0: 22 46 4b 56 22 7d 20 7b 0a 20 20 20 20 73 65 74  "FKV"} {.    set
1fb0: 20 65 78 70 65 63 74 65 64 20 7b 31 20 7b 66 6f   expected {1 {fo
1fc0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
1fd0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20  aint failed}}.  
1fe0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
1ff0: 20 65 78 70 65 63 74 65 64 20 5b 6c 69 73 74 20   expected [list 
2000: 30 20 24 72 65 73 5d 0a 20 20 7d 0a 20 20 64 6f  0 $res].  }.  do
2010: 5f 74 65 73 74 20 66 6b 65 79 32 2d 32 2e 24 74  _test fkey2-2.$t
2020: 6e 20 5b 6c 69 73 74 20 63 61 74 63 68 73 71 6c  n [list catchsql
2030: 20 24 73 71 6c 5d 20 24 65 78 70 65 63 74 65 64   $sql] $expected
2040: 0a 20 20 69 66 20 7b 24 6e 6f 63 6f 6d 6d 69 74  .  if {$nocommit
2050: 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  } {.    do_test 
2060: 66 6b 65 79 32 2d 32 2e 24 7b 74 6e 7d 63 20 7b  fkey2-2.${tn}c {
2070: 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20  .      catchsql 
2080: 43 4f 4d 4d 49 54 0a 20 20 20 20 7d 20 7b 31 20  COMMIT.    } {1 
2090: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
20a0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
20b0: 0a 20 20 7d 0a 7d 0a 0a 66 6b 65 79 32 2d 32 2d  .  }.}..fkey2-2-
20c0: 74 65 73 74 20 31 20 30 20 7b 0a 20 20 43 52 45  test 1 0 {.  CRE
20d0: 41 54 45 20 54 41 42 4c 45 20 6e 6f 64 65 28 0a  ATE TABLE node(.
20e0: 20 20 20 20 6e 6f 64 65 69 64 20 50 52 49 4d 41      nodeid PRIMA
20f0: 52 59 20 4b 45 59 2c 0a 20 20 20 20 70 61 72 65  RY KEY,.    pare
2100: 6e 74 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f  nt REFERENCES no
2110: 64 65 20 44 45 46 45 52 52 41 42 4c 45 20 49 4e  de DEFERRABLE IN
2120: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
2130: 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20 54  .  );.  CREATE T
2140: 41 42 4c 45 20 6c 65 61 66 28 0a 20 20 20 20 63  ABLE leaf(.    c
2150: 65 6c 6c 69 64 20 50 52 49 4d 41 52 59 20 4b 45  ellid PRIMARY KE
2160: 59 2c 0a 20 20 20 20 70 61 72 65 6e 74 20 52 45  Y,.    parent RE
2170: 46 45 52 45 4e 43 45 53 20 6e 6f 64 65 20 44 45  FERENCES node DE
2180: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
2190: 4c 59 20 44 45 46 45 52 52 45 44 0a 20 20 29 3b  LY DEFERRED.  );
21a0: 0a 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  .}..fkey2-2-test
21b0: 20 31 20 20 30 20 22 49 4e 53 45 52 54 20 49 4e   1  0 "INSERT IN
21c0: 54 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 31  TO node VALUES(1
21d0: 2c 20 30 29 22 20 20 20 20 20 20 20 46 4b 56 0a  , 0)"       FKV.
21e0: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 20 20  fkey2-2-test 2  
21f0: 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79 32 2d  0 "BEGIN".fkey2-
2200: 32 2d 74 65 73 74 20 33 20 20 31 20 20 20 22 49  2-test 3  1   "I
2210: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20  NSERT INTO node 
2220: 56 41 4c 55 45 53 28 31 2c 20 30 29 22 0a 66 6b  VALUES(1, 0)".fk
2230: 65 79 32 2d 32 2d 74 65 73 74 20 34 20 20 30 20  ey2-2-test 4  0 
2240: 20 20 22 55 50 44 41 54 45 20 6e 6f 64 65 20 53    "UPDATE node S
2250: 45 54 20 70 61 72 65 6e 74 20 3d 20 4e 55 4c 4c  ET parent = NULL
2260: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35  ".fkey2-2-test 5
2270: 20 20 30 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65    0 "COMMIT".fke
2280: 79 32 2d 32 2d 74 65 73 74 20 36 20 20 30 20 22  y2-2-test 6  0 "
2290: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f  SELECT * FROM no
22a0: 64 65 22 20 7b 31 20 7b 7d 7d 0a 0a 66 6b 65 79  de" {1 {}}..fkey
22b0: 32 2d 32 2d 74 65 73 74 20 37 20 20 30 20 22 42  2-2-test 7  0 "B
22c0: 45 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74 65  EGIN".fkey2-2-te
22d0: 73 74 20 38 20 20 31 20 20 20 22 49 4e 53 45 52  st 8  1   "INSER
22e0: 54 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55  T INTO leaf VALU
22f0: 45 53 28 27 61 27 2c 20 32 29 22 0a 66 6b 65 79  ES('a', 2)".fkey
2300: 32 2d 32 2d 74 65 73 74 20 39 20 20 31 20 20 20  2-2-test 9  1   
2310: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64  "INSERT INTO nod
2320: 65 20 56 41 4c 55 45 53 28 32 2c 20 30 29 22 0a  e VALUES(2, 0)".
2330: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 30 20  fkey2-2-test 10 
2340: 30 20 20 20 22 55 50 44 41 54 45 20 6e 6f 64 65  0   "UPDATE node
2350: 20 53 45 54 20 70 61 72 65 6e 74 20 3d 20 31 20   SET parent = 1 
2360: 57 48 45 52 45 20 6e 6f 64 65 69 64 20 3d 20 32  WHERE nodeid = 2
2370: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31  ".fkey2-2-test 1
2380: 31 20 30 20 22 43 4f 4d 4d 49 54 22 0a 66 6b 65  1 0 "COMMIT".fke
2390: 79 32 2d 32 2d 74 65 73 74 20 31 32 20 30 20 22  y2-2-test 12 0 "
23a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f  SELECT * FROM no
23b0: 64 65 22 20 7b 31 20 7b 7d 20 32 20 31 7d 0a 66  de" {1 {} 2 1}.f
23c0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 33 20 30  key2-2-test 13 0
23d0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
23e0: 6c 65 61 66 22 20 7b 61 20 32 7d 0a 0a 66 6b 65  leaf" {a 2}..fke
23f0: 79 32 2d 32 2d 74 65 73 74 20 31 34 20 30 20 22  y2-2-test 14 0 "
2400: 42 45 47 49 4e 22 0a 66 6b 65 79 32 2d 32 2d 74  BEGIN".fkey2-2-t
2410: 65 73 74 20 31 35 20 31 20 20 20 22 44 45 4c 45  est 15 1   "DELE
2420: 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20 57 48 45  TE FROM node WHE
2430: 52 45 20 6e 6f 64 65 69 64 20 3d 20 32 22 0a 66  RE nodeid = 2".f
2440: 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 36 20 30  key2-2-test 16 0
2450: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2460: 6e 6f 64 65 20 56 41 4c 55 45 53 28 32 2c 20 4e  node VALUES(2, N
2470: 55 4c 4c 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65  ULL)".fkey2-2-te
2480: 73 74 20 31 37 20 30 20 22 43 4f 4d 4d 49 54 22  st 17 0 "COMMIT"
2490: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 31 38  .fkey2-2-test 18
24a0: 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   0 "SELECT * FRO
24b0: 4d 20 6e 6f 64 65 22 20 7b 31 20 7b 7d 20 32 20  M node" {1 {} 2 
24c0: 7b 7d 7d 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  {}}.fkey2-2-test
24d0: 20 31 39 20 30 20 22 53 45 4c 45 43 54 20 2a 20   19 0 "SELECT * 
24e0: 46 52 4f 4d 20 6c 65 61 66 22 20 7b 61 20 32 7d  FROM leaf" {a 2}
24f0: 0a 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32  ..fkey2-2-test 2
2500: 30 20 30 20 22 42 45 47 49 4e 22 0a 66 6b 65 79  0 0 "BEGIN".fkey
2510: 32 2d 32 2d 74 65 73 74 20 32 31 20 30 20 20 20  2-2-test 21 0   
2520: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61  "INSERT INTO lea
2530: 66 20 56 41 4c 55 45 53 28 27 62 27 2c 20 31 29  f VALUES('b', 1)
2540: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32  ".fkey2-2-test 2
2550: 32 20 30 20 20 20 22 53 41 56 45 50 4f 49 4e 54  2 0   "SAVEPOINT
2560: 20 73 61 76 65 22 0a 66 6b 65 79 32 2d 32 2d 74   save".fkey2-2-t
2570: 65 73 74 20 32 33 20 30 20 20 20 20 20 22 44 45  est 23 0     "DE
2580: 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20 57  LETE FROM node W
2590: 48 45 52 45 20 6e 6f 64 65 69 64 20 3d 20 31 22  HERE nodeid = 1"
25a0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32 34  .fkey2-2-test 24
25b0: 20 30 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54   0   "ROLLBACK T
25c0: 4f 20 73 61 76 65 22 0a 66 6b 65 79 32 2d 32 2d  O save".fkey2-2-
25d0: 74 65 73 74 20 32 35 20 30 20 22 43 4f 4d 4d 49  test 25 0 "COMMI
25e0: 54 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  T".fkey2-2-test 
25f0: 32 36 20 30 20 22 53 45 4c 45 43 54 20 2a 20 46  26 0 "SELECT * F
2600: 52 4f 4d 20 6e 6f 64 65 22 20 7b 31 20 7b 7d 20  ROM node" {1 {} 
2610: 32 20 7b 7d 7d 0a 66 6b 65 79 32 2d 32 2d 74 65  2 {}}.fkey2-2-te
2620: 73 74 20 32 37 20 30 20 22 53 45 4c 45 43 54 20  st 27 0 "SELECT 
2630: 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b 61 20  * FROM leaf" {a 
2640: 32 20 62 20 31 7d 0a 0a 66 6b 65 79 32 2d 32 2d  2 b 1}..fkey2-2-
2650: 74 65 73 74 20 32 38 20 30 20 22 42 45 47 49 4e  test 28 0 "BEGIN
2660: 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 32  ".fkey2-2-test 2
2670: 39 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e  9 0   "INSERT IN
2680: 54 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28 27  TO leaf VALUES('
2690: 63 27 2c 20 31 29 22 0a 66 6b 65 79 32 2d 32 2d  c', 1)".fkey2-2-
26a0: 74 65 73 74 20 33 30 20 30 20 20 20 22 53 41 56  test 30 0   "SAV
26b0: 45 50 4f 49 4e 54 20 73 61 76 65 22 0a 66 6b 65  EPOINT save".fke
26c0: 79 32 2d 32 2d 74 65 73 74 20 33 31 20 30 20 20  y2-2-test 31 0  
26d0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
26e0: 6e 6f 64 65 20 57 48 45 52 45 20 6e 6f 64 65 69  node WHERE nodei
26f0: 64 20 3d 20 31 22 0a 66 6b 65 79 32 2d 32 2d 74  d = 1".fkey2-2-t
2700: 65 73 74 20 33 32 20 31 20 20 20 22 52 45 4c 45  est 32 1   "RELE
2710: 41 53 45 20 73 61 76 65 22 0a 66 6b 65 79 32 2d  ASE save".fkey2-
2720: 32 2d 74 65 73 74 20 33 33 20 31 20 20 20 22 44  2-test 33 1   "D
2730: 45 4c 45 54 45 20 46 52 4f 4d 20 6c 65 61 66 20  ELETE FROM leaf 
2740: 57 48 45 52 45 20 63 65 6c 6c 69 64 20 3d 20 27  WHERE cellid = '
2750: 62 27 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  b'".fkey2-2-test
2760: 20 33 34 20 30 20 20 20 22 44 45 4c 45 54 45 20   34 0   "DELETE 
2770: 46 52 4f 4d 20 6c 65 61 66 20 57 48 45 52 45 20  FROM leaf WHERE 
2780: 63 65 6c 6c 69 64 20 3d 20 27 63 27 22 0a 66 6b  cellid = 'c'".fk
2790: 65 79 32 2d 32 2d 74 65 73 74 20 33 35 20 30 20  ey2-2-test 35 0 
27a0: 22 43 4f 4d 4d 49 54 22 0a 66 6b 65 79 32 2d 32  "COMMIT".fkey2-2
27b0: 2d 74 65 73 74 20 33 36 20 30 20 22 53 45 4c 45  -test 36 0 "SELE
27c0: 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20  CT * FROM node" 
27d0: 7b 32 20 7b 7d 7d 20 0a 66 6b 65 79 32 2d 32 2d  {2 {}} .fkey2-2-
27e0: 74 65 73 74 20 33 37 20 30 20 22 53 45 4c 45 43  test 37 0 "SELEC
27f0: 54 20 2a 20 46 52 4f 4d 20 6c 65 61 66 22 20 7b  T * FROM leaf" {
2800: 61 20 32 7d 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  a 2}..fkey2-2-te
2810: 73 74 20 33 38 20 30 20 22 53 41 56 45 50 4f 49  st 38 0 "SAVEPOI
2820: 4e 54 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d  NT outer".fkey2-
2830: 32 2d 74 65 73 74 20 33 39 20 31 20 20 20 22 49  2-test 39 1   "I
2840: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20  NSERT INTO leaf 
2850: 56 41 4c 55 45 53 28 27 64 27 2c 20 33 29 22 0a  VALUES('d', 3)".
2860: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 34 30 20  fkey2-2-test 40 
2870: 31 20 22 52 45 4c 45 41 53 45 20 6f 75 74 65 72  1 "RELEASE outer
2880: 22 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d 32  "    FKV.fkey2-2
2890: 2d 74 65 73 74 20 34 31 20 31 20 20 20 22 49 4e  -test 41 1   "IN
28a0: 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66 20 56  SERT INTO leaf V
28b0: 41 4c 55 45 53 28 27 65 27 2c 20 33 29 22 0a 66  ALUES('e', 3)".f
28c0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 34 32 20 30  key2-2-test 42 0
28d0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
28e0: 6e 6f 64 65 20 56 41 4c 55 45 53 28 33 2c 20 32  node VALUES(3, 2
28f0: 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20  )".fkey2-2-test 
2900: 34 33 20 30 20 22 52 45 4c 45 41 53 45 20 6f 75  43 0 "RELEASE ou
2910: 74 65 72 22 0a 0a 66 6b 65 79 32 2d 32 2d 74 65  ter"..fkey2-2-te
2920: 73 74 20 34 34 20 30 20 22 53 41 56 45 50 4f 49  st 44 0 "SAVEPOI
2930: 4e 54 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d  NT outer".fkey2-
2940: 32 2d 74 65 73 74 20 34 35 20 31 20 20 20 22 44  2-test 45 1   "D
2950: 45 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 20  ELETE FROM node 
2960: 57 48 45 52 45 20 6e 6f 64 65 69 64 3d 33 22 0a  WHERE nodeid=3".
2970: 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 34 37 20  fkey2-2-test 47 
2980: 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  0   "INSERT INTO
2990: 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 33 2c 20   node VALUES(3, 
29a0: 32 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  2)".fkey2-2-test
29b0: 20 34 38 20 30 20 22 52 4f 4c 4c 42 41 43 4b 20   48 0 "ROLLBACK 
29c0: 54 4f 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d  TO outer".fkey2-
29d0: 32 2d 74 65 73 74 20 34 39 20 30 20 22 52 45 4c  2-test 49 0 "REL
29e0: 45 41 53 45 20 6f 75 74 65 72 22 0a 0a 66 6b 65  EASE outer"..fke
29f0: 79 32 2d 32 2d 74 65 73 74 20 35 30 20 30 20 22  y2-2-test 50 0 "
2a00: 53 41 56 45 50 4f 49 4e 54 20 6f 75 74 65 72 22  SAVEPOINT outer"
2a10: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 31  .fkey2-2-test 51
2a20: 20 31 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54   1   "INSERT INT
2a30: 4f 20 6c 65 61 66 20 56 41 4c 55 45 53 28 27 66  O leaf VALUES('f
2a40: 27 2c 20 34 29 22 0a 66 6b 65 79 32 2d 32 2d 74  ', 4)".fkey2-2-t
2a50: 65 73 74 20 35 32 20 31 20 20 20 22 53 41 56 45  est 52 1   "SAVE
2a60: 50 4f 49 4e 54 20 69 6e 6e 65 72 22 0a 66 6b 65  POINT inner".fke
2a70: 79 32 2d 32 2d 74 65 73 74 20 35 33 20 31 20 20  y2-2-test 53 1  
2a80: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2a90: 6c 65 61 66 20 56 41 4c 55 45 53 28 27 67 27 2c  leaf VALUES('g',
2aa0: 20 34 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73   4)".fkey2-2-tes
2ab0: 74 20 35 34 20 31 20 20 22 52 45 4c 45 41 53 45  t 54 1  "RELEASE
2ac0: 20 6f 75 74 65 72 22 20 20 20 46 4b 56 0a 66 6b   outer"   FKV.fk
2ad0: 65 79 32 2d 32 2d 74 65 73 74 20 35 35 20 31 20  ey2-2-test 55 1 
2ae0: 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 69    "ROLLBACK TO i
2af0: 6e 6e 65 72 22 0a 66 6b 65 79 32 2d 32 2d 74 65  nner".fkey2-2-te
2b00: 73 74 20 35 36 20 30 20 20 22 43 4f 4d 4d 49 54  st 56 0  "COMMIT
2b10: 22 20 20 20 20 20 20 20 20 20 20 46 4b 56 0a 66  "          FKV.f
2b20: 6b 65 79 32 2d 32 2d 74 65 73 74 20 35 37 20 30  key2-2-test 57 0
2b30: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2b40: 6e 6f 64 65 20 56 41 4c 55 45 53 28 34 2c 20 4e  node VALUES(4, N
2b50: 55 4c 4c 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65  ULL)".fkey2-2-te
2b60: 73 74 20 35 38 20 30 20 22 52 45 4c 45 41 53 45  st 58 0 "RELEASE
2b70: 20 6f 75 74 65 72 22 0a 66 6b 65 79 32 2d 32 2d   outer".fkey2-2-
2b80: 74 65 73 74 20 35 39 20 30 20 22 53 45 4c 45 43  test 59 0 "SELEC
2b90: 54 20 2a 20 46 52 4f 4d 20 6e 6f 64 65 22 20 7b  T * FROM node" {
2ba0: 32 20 7b 7d 20 33 20 32 20 34 20 7b 7d 7d 0a 66  2 {} 3 2 4 {}}.f
2bb0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 30 20 30  key2-2-test 60 0
2bc0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2bd0: 6c 65 61 66 22 20 7b 61 20 32 20 64 20 33 20 65  leaf" {a 2 d 3 e
2be0: 20 33 20 66 20 34 7d 0a 0a 23 20 54 68 65 20 66   3 f 4}..# The f
2bf0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
2c00: 74 65 73 74 73 20 63 68 65 63 6b 20 74 68 61 74  tests check that
2c10: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
2c20: 74 68 61 74 20 61 66 66 65 63 74 73 20 0a 23 20  that affects .# 
2c30: 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 76 69  multiple rows vi
2c40: 6f 6c 61 74 65 73 20 73 6f 6d 65 20 66 6f 72 65  olates some fore
2c50: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2c60: 6e 74 73 2c 20 74 68 65 6e 20 73 74 72 69 6b 65  nts, then strike
2c70: 73 20 61 20 0a 23 20 63 6f 6e 73 74 72 61 69 6e  s a .# constrain
2c80: 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
2c90: 65 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  e statement-tran
2ca0: 73 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 72 6f  saction to be ro
2cb0: 6c 6c 65 64 20 62 61 63 6b 2c 20 0a 23 20 74 68  lled back, .# th
2cc0: 65 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  e deferred const
2cd0: 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73  raint counter is
2ce0: 20 63 6f 72 72 65 63 74 6c 79 20 72 65 73 65 74   correctly reset
2cf0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
2d00: 20 0a 23 20 68 61 64 20 62 65 66 6f 72 65 20 74   .# had before t
2d10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  he statement-tra
2d20: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
2d30: 6e 65 64 2e 0a 23 0a 66 6b 65 79 32 2d 32 2d 74  ned..#.fkey2-2-t
2d40: 65 73 74 20 36 31 20 30 20 22 42 45 47 49 4e 22  est 61 0 "BEGIN"
2d50: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 32  .fkey2-2-test 62
2d60: 20 30 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f   0   "DELETE FRO
2d70: 4d 20 6c 65 61 66 22 0a 66 6b 65 79 32 2d 32 2d  M leaf".fkey2-2-
2d80: 74 65 73 74 20 36 33 20 30 20 20 20 22 44 45 4c  test 63 0   "DEL
2d90: 45 54 45 20 46 52 4f 4d 20 6e 6f 64 65 22 0a 66  ETE FROM node".f
2da0: 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 34 20 31  key2-2-test 64 1
2db0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2dc0: 6c 65 61 66 20 56 41 4c 55 45 53 28 27 61 27 2c  leaf VALUES('a',
2dd0: 20 31 29 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73   1)".fkey2-2-tes
2de0: 74 20 36 35 20 31 20 20 20 22 49 4e 53 45 52 54  t 65 1   "INSERT
2df0: 20 49 4e 54 4f 20 6c 65 61 66 20 56 41 4c 55 45   INTO leaf VALUE
2e00: 53 28 27 62 27 2c 20 32 29 22 0a 66 6b 65 79 32  S('b', 2)".fkey2
2e10: 2d 32 2d 74 65 73 74 20 36 36 20 31 20 20 20 22  -2-test 66 1   "
2e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 65 61 66  INSERT INTO leaf
2e30: 20 56 41 4c 55 45 53 28 27 63 27 2c 20 31 29 22   VALUES('c', 1)"
2e40: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 32  .do_test fkey2-2
2e50: 2d 74 65 73 74 2d 36 37 20 7b 0a 20 20 63 61 74  -test-67 {.  cat
2e60: 63 68 73 71 6c 20 20 20 20 20 20 20 20 20 20 22  chsql          "
2e70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65  INSERT INTO node
2e80: 20 53 45 4c 45 43 54 20 70 61 72 65 6e 74 2c 20   SELECT parent, 
2e90: 33 20 46 52 4f 4d 20 6c 65 61 66 22 0a 7d 20 7b  3 FROM leaf".} {
2ea0: 31 20 7b 63 6f 6c 75 6d 6e 20 6e 6f 64 65 69 64  1 {column nodeid
2eb0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
2ec0: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 36 38  .fkey2-2-test 68
2ed0: 20 30 20 22 43 4f 4d 4d 49 54 22 20 20 20 20 20   0 "COMMIT"     
2ee0: 20 20 20 20 20 20 46 4b 56 0a 66 6b 65 79 32 2d        FKV.fkey2-
2ef0: 32 2d 74 65 73 74 20 36 39 20 31 20 20 20 22 49  2-test 69 1   "I
2f00: 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 20  NSERT INTO node 
2f10: 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 22  VALUES(1, NULL)"
2f20: 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74 20 37 30  .fkey2-2-test 70
2f30: 20 30 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54   0   "INSERT INT
2f40: 4f 20 6e 6f 64 65 20 56 41 4c 55 45 53 28 32 2c  O node VALUES(2,
2f50: 20 4e 55 4c 4c 29 22 0a 66 6b 65 79 32 2d 32 2d   NULL)".fkey2-2-
2f60: 74 65 73 74 20 37 31 20 30 20 22 43 4f 4d 4d 49  test 71 0 "COMMI
2f70: 54 22 0a 0a 66 6b 65 79 32 2d 32 2d 74 65 73 74  T"..fkey2-2-test
2f80: 20 37 32 20 30 20 22 42 45 47 49 4e 22 0a 66 6b   72 0 "BEGIN".fk
2f90: 65 79 32 2d 32 2d 74 65 73 74 20 37 33 20 31 20  ey2-2-test 73 1 
2fa0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e    "DELETE FROM n
2fb0: 6f 64 65 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73  ode".fkey2-2-tes
2fc0: 74 20 37 34 20 30 20 20 20 22 49 4e 53 45 52 54  t 74 0   "INSERT
2fd0: 20 49 4e 54 4f 20 6e 6f 64 65 28 6e 6f 64 65 69   INTO node(nodei
2fe0: 64 29 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  d) SELECT DISTIN
2ff0: 43 54 20 70 61 72 65 6e 74 20 46 52 4f 4d 20 6c  CT parent FROM l
3000: 65 61 66 22 0a 66 6b 65 79 32 2d 32 2d 74 65 73  eaf".fkey2-2-tes
3010: 74 20 37 35 20 30 20 22 43 4f 4d 4d 49 54 22 0a  t 75 0 "COMMIT".
3020: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
3070: 73 74 20 63 61 73 65 73 20 66 6b 65 79 32 2d 33  st cases fkey2-3
3080: 2e 2a 20 74 65 73 74 20 74 68 61 74 20 61 20 70  .* test that a p
3090: 72 6f 67 72 61 6d 20 74 68 61 74 20 65 78 65 63  rogram that exec
30a0: 75 74 65 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  utes foreign key
30b0: 0a 23 20 61 63 74 69 6f 6e 73 20 28 43 41 53 43  .# actions (CASC
30c0: 41 44 45 2c 20 53 45 54 20 44 45 46 41 55 4c 54  ADE, SET DEFAULT
30d0: 2c 20 53 45 54 20 4e 55 4c 4c 20 65 74 63 2e 29  , SET NULL etc.)
30e0: 20 6f 72 20 74 65 73 74 73 20 46 4b 20 63 6f 6e   or tests FK con
30f0: 73 74 72 61 69 6e 74 73 0a 23 20 6f 70 65 6e 73  straints.# opens
3100: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
3110: 6e 73 61 63 74 69 6f 6e 20 69 66 20 72 65 71 75  nsaction if requ
3120: 69 72 65 64 2e 0a 23 0a 23 20 66 6b 65 79 32 2d  ired..#.# fkey2-
3130: 33 2e 31 2e 2a 3a 20 54 65 73 74 20 55 50 44 41  3.1.*: Test UPDA
3140: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23  TE statements..#
3150: 20 66 6b 65 79 32 2d 33 2e 32 2e 2a 3a 20 54 65   fkey2-3.2.*: Te
3160: 73 74 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  st DELETE statem
3170: 65 6e 74 73 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c  ents..#.drop_all
3180: 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20  _tables.do_test 
3190: 66 6b 65 79 32 2d 33 2e 31 2e 31 20 7b 0a 20 20  fkey2-3.1.1 {.  
31a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
31b0: 45 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 20  EATE TABLE ab(a 
31c0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
31d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
31e0: 45 20 63 64 28 0a 20 20 20 20 20 20 63 20 50 52  E cd(.      c PR
31f0: 49 4d 41 52 59 20 4b 45 59 20 52 45 46 45 52 45  IMARY KEY REFERE
3200: 4e 43 45 53 20 61 62 20 4f 4e 20 55 50 44 41 54  NCES ab ON UPDAT
3210: 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44 45 4c  E CASCADE ON DEL
3220: 45 54 45 20 43 41 53 43 41 44 45 2c 20 0a 20 20  ETE CASCADE, .  
3230: 20 20 20 20 64 0a 20 20 20 20 29 3b 0a 20 20 20      d.    );.   
3240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 65 66   CREATE TABLE ef
3250: 28 0a 20 20 20 20 20 20 65 20 52 45 46 45 52 45  (.      e REFERE
3260: 4e 43 45 53 20 63 64 20 4f 4e 20 55 50 44 41 54  NCES cd ON UPDAT
3270: 45 20 43 41 53 43 41 44 45 2c 20 0a 20 20 20 20  E CASCADE, .    
3280: 20 20 66 2c 20 43 48 45 43 4b 20 28 65 21 3d 35    f, CHECK (e!=5
3290: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b  ).    );.  }.} {
32a0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
32b0: 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.1.2 {.  execsq
32c0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
32d0: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 31 2c  NTO ab VALUES(1,
32e0: 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'b');.    INSER
32f0: 54 20 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53  T INTO cd VALUES
3300: 28 31 2c 20 27 64 27 29 3b 0a 20 20 20 20 49 4e  (1, 'd');.    IN
3310: 53 45 52 54 20 49 4e 54 4f 20 65 66 20 56 41 4c  SERT INTO ef VAL
3320: 55 45 53 28 31 2c 20 27 65 27 29 3b 0a 20 20 7d  UES(1, 'e');.  }
3330: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
3340: 65 79 32 2d 33 2e 31 2e 33 20 7b 0a 20 20 63 61  ey2-3.1.3 {.  ca
3350: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
3360: 61 62 20 53 45 54 20 61 20 3d 20 35 20 7d 0a 7d  ab SET a = 5 }.}
3370: 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20   {1 {constraint 
3380: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
3390: 20 66 6b 65 79 32 2d 33 2e 31 2e 34 20 7b 0a 20   fkey2-3.1.4 {. 
33a0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
33b0: 54 20 2a 20 46 52 4f 4d 20 61 62 20 7d 0a 7d 20  T * FROM ab }.} 
33c0: 7b 31 20 62 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  {1 b}.do_test fk
33d0: 65 79 32 2d 33 2e 31 2e 34 20 7b 0a 20 20 65 78  ey2-3.1.4 {.  ex
33e0: 65 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20 63  ecsql BEGIN;.  c
33f0: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
3400: 20 61 62 20 53 45 54 20 61 20 3d 20 35 20 7d 0a   ab SET a = 5 }.
3410: 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74  } {1 {constraint
3420: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
3430: 74 20 66 6b 65 79 32 2d 33 2e 31 2e 35 20 7b 0a  t fkey2-3.1.5 {.
3440: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
3450: 3b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  ;.  execsql { SE
3460: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 3b 20  LECT * FROM ab; 
3470: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 64  SELECT * FROM cd
3480: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
3490: 65 66 20 7d 0a 7d 20 7b 31 20 62 20 31 20 64 20  ef }.} {1 b 1 d 
34a0: 31 20 65 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  1 e}.do_test fke
34b0: 79 32 2d 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65  y2-3.2.1 {.  exe
34c0: 63 73 71 6c 20 42 45 47 49 4e 3b 0a 20 20 63 61  csql BEGIN;.  ca
34d0: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
34e0: 46 52 4f 4d 20 61 62 20 7d 0a 7d 20 7b 31 20 7b  FROM ab }.} {1 {
34f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
3500: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
3510: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 33 2e  do_test fkey2-3.
3520: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
3530: 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71 6c  COMMIT.  execsql
3540: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3550: 20 61 62 3b 20 53 45 4c 45 43 54 20 2a 20 46 52   ab; SELECT * FR
3560: 4f 4d 20 63 64 3b 20 53 45 4c 45 43 54 20 2a 20  OM cd; SELECT * 
3570: 46 52 4f 4d 20 65 66 20 7d 0a 7d 20 7b 31 20 62  FROM ef }.} {1 b
3580: 20 31 20 64 20 31 20 65 7d 0a 0a 23 2d 2d 2d 2d   1 d 1 e}..#----
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
35e0: 65 73 20 66 6b 65 79 32 2d 34 2e 2a 20 74 65 73  es fkey2-4.* tes
35f0: 74 20 74 68 61 74 20 72 65 63 75 72 73 69 76 65  t that recursive
3600: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 61 63 74   foreign key act
3610: 69 6f 6e 73 20 0a 23 20 28 69 2e 65 2e 20 43 41  ions .# (i.e. CA
3620: 53 43 41 44 45 29 20 61 72 65 20 61 6c 6c 6f 77  SCADE) are allow
3630: 65 64 20 65 76 65 6e 20 69 66 20 72 65 63 75 72  ed even if recur
3640: 73 69 76 65 20 74 72 69 67 67 65 72 73 20 61 72  sive triggers ar
3650: 65 20 64 69 73 61 62 6c 65 64 2e 0a 23 0a 64 72  e disabled..#.dr
3660: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
3670: 5f 74 65 73 74 20 66 6b 65 79 32 2d 34 2e 31 20  _test fkey2-4.1 
3680: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3690: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
36a0: 31 28 0a 20 20 20 20 20 20 6e 6f 64 65 20 50 52  1(.      node PR
36b0: 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20  IMARY KEY, .    
36c0: 20 20 70 61 72 65 6e 74 20 52 45 46 45 52 45 4e    parent REFEREN
36d0: 43 45 53 20 74 31 20 4f 4e 20 44 45 4c 45 54 45  CES t1 ON DELETE
36e0: 20 43 41 53 43 41 44 45 0a 20 20 20 20 29 3b 0a   CASCADE.    );.
36f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3700: 20 74 32 28 6e 6f 64 65 20 50 52 49 4d 41 52 59   t2(node PRIMARY
3710: 20 4b 45 59 2c 20 70 61 72 65 6e 74 29 3b 0a 20   KEY, parent);. 
3720: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
3730: 52 20 74 32 74 20 41 46 54 45 52 20 44 45 4c 45  R t2t AFTER DELE
3740: 54 45 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20  TE ON t2 BEGIN. 
3750: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
3760: 20 74 32 20 57 48 45 52 45 20 70 61 72 65 6e 74   t2 WHERE parent
3770: 20 3d 20 6f 6c 64 2e 6e 6f 64 65 3b 0a 20 20 20   = old.node;.   
3780: 20 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54   END;.    INSERT
3790: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
37a0: 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  1, NULL);.    IN
37b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
37c0: 55 45 53 28 32 2c 20 31 29 3b 0a 20 20 20 20 49  UES(2, 1);.    I
37d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
37e0: 4c 55 45 53 28 33 2c 20 31 29 3b 0a 20 20 20 20  LUES(3, 1);.    
37f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3800: 41 4c 55 45 53 28 34 2c 20 32 29 3b 0a 20 20 20  ALUES(4, 2);.   
3810: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3820: 56 41 4c 55 45 53 28 35 2c 20 32 29 3b 0a 20 20  VALUES(5, 2);.  
3830: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3840: 20 56 41 4c 55 45 53 28 36 2c 20 33 29 3b 0a 20   VALUES(6, 3);. 
3850: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3860: 31 20 56 41 4c 55 45 53 28 37 2c 20 33 29 3b 0a  1 VALUES(7, 3);.
3870: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3880: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3890: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   t1;.  }.} {}.do
38a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 34 2e 32 20  _test fkey2-4.2 
38b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
38c0: 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
38d0: 72 69 67 67 65 72 73 20 3d 20 6f 66 66 20 7d 0a  riggers = off }.
38e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
38f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
3900: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
3910: 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a 20 20 20  RE node = 1;.   
3920: 20 20 20 53 45 4c 45 43 54 20 6e 6f 64 65 20 46     SELECT node F
3930: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d  ROM t1;.  }.} {}
3940: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 34  .do_test fkey2-4
3950: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3960: 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46   .      DELETE F
3970: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 6e 6f 64  ROM t2 WHERE nod
3980: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45 4c  e = 1;.      SEL
3990: 45 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74 32  ECT node FROM t2
39a0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
39b0: 20 20 7d 0a 7d 20 7b 34 20 35 20 36 20 37 7d 0a    }.} {4 5 6 7}.
39c0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 34 2e  do_test fkey2-4.
39d0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
39e0: 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
39f0: 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 6e 20 7d  _triggers = on }
3a00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
3a10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
3a20: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
3a30: 45 52 45 20 6e 6f 64 65 20 3d 20 31 3b 0a 20 20  ERE node = 1;.  
3a40: 20 20 20 20 53 45 4c 45 43 54 20 6e 6f 64 65 20      SELECT node 
3a50: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
3a60: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
3a70: 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.3 {.  execsql 
3a80: 7b 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  { .      DELETE 
3a90: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 6e 6f  FROM t2 WHERE no
3aa0: 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45  de = 1;.      SE
3ab0: 4c 45 43 54 20 6e 6f 64 65 20 46 52 4f 4d 20 74  LECT node FROM t
3ac0: 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  2;.    ROLLBACK;
3ad0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
3ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
3b30: 65 73 20 66 6b 65 79 32 2d 35 2e 2a 20 76 65 72  es fkey2-5.* ver
3b40: 69 66 79 20 74 68 61 74 20 74 68 65 20 69 6e 63  ify that the inc
3b50: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 41 50  remental blob AP
3b60: 49 20 6d 61 79 20 6e 6f 74 0a 23 20 77 72 69 74  I may not.# writ
3b70: 65 20 74 6f 20 61 20 66 6f 72 65 69 67 6e 20 6b  e to a foreign k
3b80: 65 79 20 63 6f 6c 75 6d 6e 20 77 68 69 6c 65 20  ey column while 
3b90: 66 6f 72 65 69 67 6e 2d 6b 65 79 73 20 61 72 65  foreign-keys are
3ba0: 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 64 72 6f 70   enabled..#.drop
3bb0: 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 69 66 63 61  _all_tables.ifca
3bc0: 70 61 62 6c 65 20 69 6e 63 72 62 6c 6f 62 20 7b  pable incrblob {
3bd0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
3be0: 2d 35 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  -5.1 {.    execs
3bf0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
3c00: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
3c10: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
3c20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3c30: 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t2(a PRIMARY KE
3c40: 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53 20  Y, b REFERENCES 
3c50: 74 31 28 61 29 29 3b 0a 20 20 20 20 20 20 49 4e  t1(a));.      IN
3c60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3c70: 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 27 77 6f  UES('hello', 'wo
3c80: 72 6c 64 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  rld');.      INS
3c90: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
3ca0: 45 53 28 27 6b 65 79 27 2c 20 27 68 65 6c 6c 6f  ES('key', 'hello
3cb0: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ');.    }.  } {}
3cc0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
3cd0: 2d 35 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 72  -5.2 {.    set r
3ce0: 63 20 5b 63 61 74 63 68 20 7b 20 73 65 74 20 66  c [catch { set f
3cf0: 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74  d [db incrblob t
3d00: 32 20 62 20 31 5d 20 7d 20 6d 73 67 5d 0a 20 20  2 b 1] } msg].  
3d10: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
3d20: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f    } {1 {cannot o
3d30: 70 65 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  pen foreign key 
3d40: 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 72 69 74 69  column for writi
3d50: 6e 67 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  ng}}.  do_test f
3d60: 6b 65 79 32 2d 35 2e 33 20 7b 0a 20 20 20 20 73  key2-5.3 {.    s
3d70: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73  et rc [catch { s
3d80: 65 74 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c  et fd [db incrbl
3d90: 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 32 20  ob -readonly t2 
3da0: 62 20 31 5d 20 7d 20 6d 73 67 5d 0a 20 20 20 20  b 1] } msg].    
3db0: 63 6c 6f 73 65 20 24 66 64 0a 20 20 20 20 73 65  close $fd.    se
3dc0: 74 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20 64  t rc.  } {0}.  d
3dd0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 35 2e 34  o_test fkey2-5.4
3de0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3df0: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
3e00: 6b 65 79 73 20 3d 20 6f 66 66 20 7d 0a 20 20 20  keys = off }.   
3e10: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
3e20: 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e 63 72   set fd [db incr
3e30: 62 6c 6f 62 20 74 32 20 62 20 31 5d 20 7d 20 6d  blob t2 b 1] } m
3e40: 73 67 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  sg].    close $f
3e50: 64 0a 20 20 20 20 73 65 74 20 72 63 0a 20 20 7d  d.    set rc.  }
3e60: 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66   {0}.  do_test f
3e70: 6b 65 79 32 2d 35 2e 35 20 7b 0a 20 20 20 20 65  key2-5.5 {.    e
3e80: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
3e90: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
3ea0: 6e 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 64 72  n }.  } {}.}..dr
3eb0: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 69 66  op_all_tables.if
3ec0: 63 61 70 61 62 6c 65 20 76 61 63 75 75 6d 20 7b  capable vacuum {
3ed0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
3ee0: 2d 36 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  -6.1 {.    execs
3ef0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
3f00: 45 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46  E TABLE t1(a REF
3f10: 45 52 45 4e 43 45 53 20 74 32 28 63 29 2c 20 62  ERENCES t2(c), b
3f20: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
3f30: 54 41 42 4c 45 20 74 32 28 63 20 55 4e 49 51 55  TABLE t2(c UNIQU
3f40: 45 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  E, b);.      INS
3f50: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
3f60: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
3f70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f80: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f90: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 20 20 7d     VACUUM;.    }
3fa0: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
4000: 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
4010: 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 54 45 47   to use an INTEG
4020: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ER PRIMARY KEY a
4030: 73 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 0a  s the child key.
4040: 23 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 63  # of a foreign c
4050: 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 20 0a 64 72  onstraint..# .dr
4060: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
4070: 5f 74 65 73 74 20 66 6b 65 79 32 2d 37 2e 31 20  _test fkey2-7.1 
4080: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4090: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
40a0: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
40b0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
40c0: 54 41 42 4c 45 20 74 32 28 63 20 49 4e 54 45 47  TABLE t2(c INTEG
40d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52  ER PRIMARY KEY R
40e0: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 62 29  EFERENCES t1, b)
40f0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
4100: 73 74 20 66 6b 65 79 32 2d 37 2e 32 20 7b 0a 20  st fkey2-7.2 {. 
4110: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
4120: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
4130: 53 28 31 2c 20 27 41 27 29 3b 20 7d 0a 7d 20 7b  S(1, 'A'); }.} {
4140: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
4150: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
4160: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  }}.do_test fkey2
4170: 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.3 {.  execsql
4180: 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49   { .    INSERT I
4190: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
41a0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
41b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
41c0: 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 3);.    INSERT
41d0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
41e0: 31 2c 20 27 41 27 29 3b 0a 20 20 7d 0a 7d 20 7b  1, 'A');.  }.} {
41f0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
4200: 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.4 {.  execsql 
4210: 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  { UPDATE t2 SET 
4220: 63 20 3d 20 32 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  c = 2 }.} {}.do_
4230: 74 65 73 74 20 66 6b 65 79 32 2d 37 2e 35 20 7b  test fkey2-7.5 {
4240: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50  .  catchsql { UP
4250: 44 41 54 45 20 74 32 20 53 45 54 20 63 20 3d 20  DATE t2 SET c = 
4260: 33 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  3 }.} {1 {foreig
4270: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
4280: 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73   failed}}.do_tes
4290: 74 20 66 6b 65 79 32 2d 37 2e 36 20 7b 0a 20 20  t fkey2-7.6 {.  
42a0: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
42b0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
42c0: 61 20 3d 20 32 20 7d 0a 7d 20 7b 31 20 7b 66 6f  a = 2 }.} {1 {fo
42d0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
42e0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
42f0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 37 2e 37 20  _test fkey2-7.7 
4300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45  {.  execsql { DE
4310: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
4320: 52 45 20 61 20 3d 20 31 20 7d 0a 7d 20 7b 7d 0a  RE a = 1 }.} {}.
4330: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 37 2e  do_test fkey2-7.
4340: 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  8 {.  catchsql {
4350: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
4360: 20 3d 20 33 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72   = 3 }.} {1 {for
4370: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
4380: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23 2d  int failed}}..#-
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
43e0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
43f0: 6f 73 73 69 62 6c 65 20 74 6f 20 65 6e 61 62 6c  ossible to enabl
4400: 65 2f 64 69 73 61 62 6c 65 20 46 4b 20 73 75 70  e/disable FK sup
4410: 70 6f 72 74 20 77 68 69 6c 65 20 61 0a 23 20 74  port while a.# t
4420: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
4430: 65 6e 2e 0a 23 20 0a 64 72 6f 70 5f 61 6c 6c 5f  en..# .drop_all_
4440: 74 61 62 6c 65 73 0a 70 72 6f 63 20 66 6b 65 79  tables.proc fkey
4450: 32 2d 38 2d 74 65 73 74 20 7b 74 6e 20 7a 53 71  2-8-test {tn zSq
4460: 6c 20 76 61 6c 75 65 7d 20 7b 0a 20 20 64 6f 5f  l value} {.  do_
4470: 74 65 73 74 20 66 6b 65 79 2d 32 2e 38 2e 24 74  test fkey-2.8.$t
4480: 6e 2e 31 20 5b 6c 69 73 74 20 65 78 65 63 73 71  n.1 [list execsq
4490: 6c 20 24 7a 53 71 6c 5d 20 7b 7d 0a 20 20 64 6f  l $zSql] {}.  do
44a0: 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 38 2e 24  _test fkey-2.8.$
44b0: 74 6e 2e 32 20 7b 20 65 78 65 63 73 71 6c 20 22  tn.2 { execsql "
44c0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
44d0: 65 79 73 22 20 7d 20 24 76 61 6c 75 65 0a 7d 0a  eys" } $value.}.
44e0: 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 31 20  fkey2-8-test  1 
44f0: 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e  { PRAGMA foreign
4500: 5f 6b 65 79 73 20 3d 20 30 20 20 20 20 20 7d 20  _keys = 0     } 
4510: 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20  0.fkey2-8-test  
4520: 32 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  2 { PRAGMA forei
4530: 67 6e 5f 6b 65 79 73 20 3d 20 31 20 20 20 20 20  gn_keys = 1     
4540: 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74  } 1.fkey2-8-test
4550: 20 20 33 20 7b 20 42 45 47 49 4e 20 20 20 20 20    3 { BEGIN     
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65    } 1.fkey2-8-te
4580: 73 74 20 20 34 20 7b 20 50 52 41 47 4d 41 20 66  st  4 { PRAGMA f
4590: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 30 20  oreign_keys = 0 
45a0: 20 20 20 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d      } 1.fkey2-8-
45b0: 74 65 73 74 20 20 35 20 7b 20 43 4f 4d 4d 49 54  test  5 { COMMIT
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 7d 20 31 0a 66 6b 65 79 32 2d        } 1.fkey2-
45e0: 38 2d 74 65 73 74 20 20 36 20 7b 20 50 52 41 47  8-test  6 { PRAG
45f0: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
4600: 3d 20 30 20 20 20 20 20 7d 20 30 0a 66 6b 65 79  = 0     } 0.fkey
4610: 32 2d 38 2d 74 65 73 74 20 20 37 20 7b 20 42 45  2-8-test  7 { BE
4620: 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  GIN             
4630: 20 20 20 20 20 20 20 20 20 20 7d 20 30 0a 66 6b            } 0.fk
4640: 65 79 32 2d 38 2d 74 65 73 74 20 20 38 20 7b 20  ey2-8-test  8 { 
4650: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
4660: 65 79 73 20 3d 20 31 20 20 20 20 20 7d 20 30 0a  eys = 1     } 0.
4670: 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 20 39 20  fkey2-8-test  9 
4680: 7b 20 43 4f 4d 4d 49 54 20 20 20 20 20 20 20 20  { COMMIT        
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
46a0: 30 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74 20 31  0.fkey2-8-test 1
46b0: 30 20 7b 20 50 52 41 47 4d 41 20 66 6f 72 65 69  0 { PRAGMA forei
46c0: 67 6e 5f 6b 65 79 73 20 3d 20 31 20 20 20 20 20  gn_keys = 1     
46d0: 7d 20 31 0a 66 6b 65 79 32 2d 38 2d 74 65 73 74  } 1.fkey2-8-test
46e0: 20 31 31 20 7b 20 50 52 41 47 4d 41 20 66 6f 72   11 { PRAGMA for
46f0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 66 66 20  eign_keys = off 
4700: 20 20 7d 20 30 0a 66 6b 65 79 32 2d 38 2d 74 65    } 0.fkey2-8-te
4710: 73 74 20 31 32 20 7b 20 50 52 41 47 4d 41 20 66  st 12 { PRAGMA f
4720: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e  oreign_keys = on
4730: 20 20 20 20 7d 20 31 0a 66 6b 65 79 32 2d 38 2d      } 1.fkey2-8-
4740: 74 65 73 74 20 31 33 20 7b 20 50 52 41 47 4d 41  test 13 { PRAGMA
4750: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
4760: 6e 6f 20 20 20 20 7d 20 30 0a 66 6b 65 79 32 2d  no    } 0.fkey2-
4770: 38 2d 74 65 73 74 20 31 34 20 7b 20 50 52 41 47  8-test 14 { PRAG
4780: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
4790: 3d 20 79 65 73 20 20 20 7d 20 31 0a 66 6b 65 79  = yes   } 1.fkey
47a0: 32 2d 38 2d 74 65 73 74 20 31 35 20 7b 20 50 52  2-8-test 15 { PR
47b0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
47c0: 73 20 3d 20 66 61 6c 73 65 20 7d 20 30 0a 66 6b  s = false } 0.fk
47d0: 65 79 32 2d 38 2d 74 65 73 74 20 31 36 20 7b 20  ey2-8-test 16 { 
47e0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
47f0: 65 79 73 20 3d 20 74 72 75 65 20 20 7d 20 31 0a  eys = true  } 1.
4800: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
4850: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
4860: 73 2c 20 66 6b 65 79 32 2d 39 2e 2a 2c 20 74 65  s, fkey2-9.*, te
4870: 73 74 20 53 45 54 20 44 45 46 41 55 4c 54 20 61  st SET DEFAULT a
4880: 63 74 69 6f 6e 73 2e 0a 23 0a 64 72 6f 70 5f 61  ctions..#.drop_a
4890: 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65 73  ll_tables.do_tes
48a0: 74 20 66 6b 65 79 32 2d 39 2e 31 2e 31 20 7b 0a  t fkey2-9.1.1 {.
48b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
48c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
48d0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
48e0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43  Y KEY, b);.    C
48f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 0a  REATE TABLE t2(.
4900: 20 20 20 20 20 20 63 20 49 4e 54 45 47 45 52 20        c INTEGER 
4910: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
4920: 20 20 20 64 20 49 4e 54 45 47 45 52 20 44 45 46     d INTEGER DEF
4930: 41 55 4c 54 20 31 20 52 45 46 45 52 45 4e 43 45  AULT 1 REFERENCE
4940: 53 20 74 31 20 4f 4e 20 44 45 4c 45 54 45 20 53  S t1 ON DELETE S
4950: 45 54 20 44 45 46 41 55 4c 54 0a 20 20 20 20 29  ET DEFAULT.    )
4960: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
4970: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M t1;.  }.} {}.d
4980: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 39 2e 31  o_test fkey2-9.1
4990: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
49a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
49b0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   t1 VALUES(1, 'o
49c0: 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ne');.    INSERT
49d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
49e0: 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 49  2, 'two');.    I
49f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
4a00: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
4a10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
4a20: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
4a30: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 32  M t1 WHERE a = 2
4a40: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
4a50: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
4a60: 20 32 20 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20   2 1 1}.do_test 
4a70: 66 6b 65 79 32 2d 39 2e 31 2e 33 20 7b 0a 20 20  fkey2-9.1.3 {.  
4a80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
4a90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4aa0: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
4ab0: 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45 54     UPDATE t2 SET
4ac0: 20 64 20 3d 20 32 3b 0a 20 20 20 20 44 45 4c 45   d = 2;.    DELE
4ad0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
4ae0: 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   a = 1;.    SELE
4af0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
4b00: 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  }.} {1 2}.do_tes
4b10: 74 20 66 6b 65 79 32 2d 39 2e 31 2e 34 20 7b 0a  t fkey2-9.1.4 {.
4b20: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4b30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
4b40: 20 7b 32 20 74 77 6f 7d 0a 64 6f 5f 74 65 73 74   {2 two}.do_test
4b50: 20 66 6b 65 79 32 2d 39 2e 31 2e 35 20 7b 0a 20   fkey2-9.1.5 {. 
4b60: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
4b70: 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b  TE FROM t1 }.} {
4b80: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
4b90: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
4ba0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4bf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
4c00: 65 73 74 73 2c 20 66 6b 65 79 32 2d 31 30 2e 2a  ests, fkey2-10.*
4c10: 2c 20 74 65 73 74 20 22 66 6f 72 65 69 67 6e 20  , test "foreign 
4c20: 6b 65 79 20 6d 69 73 6d 61 74 63 68 22 20 61 6e  key mismatch" an
4c30: 64 20 0a 23 20 6f 74 68 65 72 20 65 72 72 6f 72  d .# other error
4c40: 73 2e 0a 23 0a 73 65 74 20 74 6e 20 31 0a 66 6f  s..#.set tn 1.fo
4c50: 72 65 61 63 68 20 7a 53 71 6c 20 5b 6c 69 73 74  reach zSql [list
4c60: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
4c70: 45 20 70 28 61 20 50 52 49 4d 41 52 59 20 4b 45  E p(a PRIMARY KE
4c80: 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  Y, b);.  CREATE 
4c90: 54 41 42 4c 45 20 63 28 78 20 52 45 46 45 52 45  TABLE c(x REFERE
4ca0: 4e 43 45 53 20 70 28 63 29 29 3b 0a 7d 20 7b 0a  NCES p(c));.} {.
4cb0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
4cc0: 28 78 20 52 45 46 45 52 45 4e 43 45 53 20 76 28  (x REFERENCES v(
4cd0: 79 29 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49  y));.  CREATE VI
4ce0: 45 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 78  EW v AS SELECT x
4cf0: 20 41 53 20 79 20 46 52 4f 4d 20 63 3b 0a 7d 20   AS y FROM c;.} 
4d00: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
4d10: 20 70 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59   p(a, b, PRIMARY
4d20: 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 43   KEY(a, b));.  C
4d30: 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 78 20  REATE TABLE c(x 
4d40: 52 45 46 45 52 45 4e 43 45 53 20 70 29 3b 0a 7d  REFERENCES p);.}
4d50: 5d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  ] {.  drop_all_t
4d60: 61 62 6c 65 73 0a 0a 20 20 64 6f 5f 74 65 73 74  ables..  do_test
4d70: 20 66 6b 65 79 32 2d 31 30 2e 31 2e 24 74 6e 20   fkey2-10.1.$tn 
4d80: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 7a  {.    execsql $z
4d90: 53 71 6c 0a 20 20 20 20 63 61 74 63 68 73 71 6c  Sql.    catchsql
4da0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63   { INSERT INTO c
4db0: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20   DEFAULT VALUES 
4dc0: 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67  }.  } {1 {foreig
4dd0: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
4de0: 0a 7d 0a 0a 23 20 22 72 6f 77 69 64 22 20 63 61  .}..# "rowid" ca
4df0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
4e00: 70 61 72 74 20 6f 66 20 61 20 63 68 69 6c 64 20  part of a child 
4e10: 6f 72 20 70 61 72 65 6e 74 20 6b 65 79 20 64 65  or parent key de
4e20: 66 69 6e 69 74 69 6f 6e 20 0a 23 20 75 6e 6c 65  finition .# unle
4e30: 73 73 20 69 74 20 68 61 70 70 65 6e 73 20 74 6f  ss it happens to
4e40: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
4e50: 61 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  an explicitly de
4e60: 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 0a 23  clared column..#
4e70: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31  .do_test fkey2-1
4e80: 30 2e 32 2e 31 20 7b 0a 20 20 64 72 6f 70 5f 61  0.2.1 {.  drop_a
4e90: 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 63 61 74 63  ll_tables.  catc
4ea0: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
4eb0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
4ec0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
4ed0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4ee0: 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20  2(c, d, FOREIGN 
4ef0: 4b 45 59 28 72 6f 77 69 64 29 20 52 45 46 45 52  KEY(rowid) REFER
4f00: 45 4e 43 45 53 20 74 31 28 61 29 29 3b 0a 20 20  ENCES t1(a));.  
4f10: 7d 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20  }.} {1 {unknown 
4f20: 63 6f 6c 75 6d 6e 20 22 72 6f 77 69 64 22 20 69  column "rowid" i
4f30: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
4f40: 66 69 6e 69 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65  finition}}.do_te
4f50: 73 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e 32 20  st fkey2-10.2.2 
4f60: 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  {.  drop_all_tab
4f70: 6c 65 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  les.  catchsql {
4f80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4f90: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
4fa0: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
4fb0: 54 45 20 54 41 42 4c 45 20 74 32 28 72 6f 77 69  TE TABLE t2(rowi
4fc0: 64 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45  d, d, FOREIGN KE
4fd0: 59 28 72 6f 77 69 64 29 20 52 45 46 45 52 45 4e  Y(rowid) REFEREN
4fe0: 43 45 53 20 74 31 28 61 29 29 3b 0a 20 20 7d 0a  CES t1(a));.  }.
4ff0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
5000: 20 66 6b 65 79 32 2d 31 30 2e 32 2e 31 20 7b 0a   fkey2-10.2.1 {.
5010: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
5020: 73 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  s.  catchsql {. 
5030: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5040: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
5050: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c  EATE TABLE t2(c,
5060: 20 64 2c 20 46 4f 52 45 49 47 4e 20 4b 45 59 28   d, FOREIGN KEY(
5070: 63 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 31  c) REFERENCES t1
5080: 28 72 6f 77 69 64 29 29 3b 0a 20 20 20 20 49 4e  (rowid));.    IN
5090: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
50a0: 69 64 2c 20 61 2c 20 62 29 20 56 41 4c 55 45 53  id, a, b) VALUES
50b0: 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 49  (1, 1, 1);.    I
50c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
50d0: 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 7d 0a  LUES(1, 1);.  }.
50e0: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
50f0: 79 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f  y mismatch}}.do_
5100: 74 65 73 74 20 66 6b 65 79 32 2d 31 30 2e 32 2e  test fkey2-10.2.
5110: 32 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c 5f 74  2 {.  drop_all_t
5120: 61 62 6c 65 73 0a 20 20 63 61 74 63 68 73 71 6c  ables.  catchsql
5130: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
5140: 42 4c 45 20 74 31 28 72 6f 77 69 64 20 50 52 49  BLE t1(rowid PRI
5150: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
5160: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5170: 32 28 63 2c 20 64 2c 20 46 4f 52 45 49 47 4e 20  2(c, d, FOREIGN 
5180: 4b 45 59 28 63 29 20 52 45 46 45 52 45 4e 43 45  KEY(c) REFERENCE
5190: 53 20 74 31 28 72 6f 77 69 64 29 29 3b 0a 20 20  S t1(rowid));.  
51a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
51b0: 28 72 6f 77 69 64 2c 20 62 29 20 56 41 4c 55 45  (rowid, b) VALUE
51c0: 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  S(1, 1);.    INS
51d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
51e0: 45 53 28 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20  ES(1, 1);.  }.} 
51f0: 7b 30 20 7b 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 {}}...#------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
5250: 69 6e 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32  ing tests, fkey2
5260: 2d 31 31 2e 2a 2c 20 74 65 73 74 20 43 41 53 43  -11.*, test CASC
5270: 41 44 45 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64  ADE actions..#.d
5280: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
5290: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 31 2e  o_test fkey2-11.
52a0: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
52b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
52c0: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
52d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
52e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
52f0: 45 20 74 32 28 63 2c 20 64 2c 20 46 4f 52 45 49  E t2(c, d, FOREI
5300: 47 4e 20 4b 45 59 28 63 29 20 52 45 46 45 52 45  GN KEY(c) REFERE
5310: 4e 43 45 53 20 74 31 28 61 29 20 4f 4e 20 55 50  NCES t1(a) ON UP
5320: 44 41 54 45 20 43 41 53 43 41 44 45 29 3b 0a 0a  DATE CASCADE);..
5330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5340: 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 31 30  t1 VALUES(10, 10
5350: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
5360: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 30  NTO t2 VALUES(10
5370: 2c 20 31 30 30 29 3b 0a 20 20 20 20 55 50 44 41  , 100);.    UPDA
5380: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 31 35  TE t1 SET a = 15
5390: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
53a0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
53b0: 35 20 31 30 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  5 100}..#-------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
5410: 6e 67 20 74 65 73 74 73 2c 20 66 6b 65 79 32 2d  ng tests, fkey2-
5420: 31 32 2e 2a 2c 20 74 65 73 74 20 52 45 53 54 52  12.*, test RESTR
5430: 49 43 54 20 61 63 74 69 6f 6e 73 2e 0a 23 0a 64  ICT actions..#.d
5440: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64  rop_all_tables.d
5450: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e  o_test fkey2-12.
5460: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
5470: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5480: 4c 45 20 74 31 28 61 2c 20 62 20 50 52 49 4d 41  LE t1(a, b PRIMA
5490: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
54a0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 0a 20 20  ATE TABLE t2(.  
54b0: 20 20 20 20 78 20 52 45 46 45 52 45 4e 43 45 53      x REFERENCES
54c0: 20 74 31 20 4f 4e 20 55 50 44 41 54 45 20 52 45   t1 ON UPDATE RE
54d0: 53 54 52 49 43 54 20 44 45 46 45 52 52 41 42 4c  STRICT DEFERRABL
54e0: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
54f0: 52 52 45 44 20 0a 20 20 20 20 29 3b 0a 20 20 20  RRED .    );.   
5500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5510: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
5520: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5530: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O t1 VALUES(2, '
5540: 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
5550: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5560: 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20  (3, 'three');.  
5570: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
5580: 66 6b 65 79 32 2d 31 32 2e 31 2e 32 20 7b 20 0a  fkey2-12.1.2 { .
5590: 20 20 65 78 65 63 73 71 6c 20 22 42 45 47 49 4e    execsql "BEGIN
55a0: 22 0a 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53  ".  execsql "INS
55b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
55c0: 45 53 28 27 74 77 6f 27 29 22 0a 7d 20 7b 7d 0a  ES('two')".} {}.
55d0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32  do_test fkey2-12
55e0: 2e 31 2e 33 20 7b 20 0a 20 20 65 78 65 63 73 71  .1.3 { .  execsq
55f0: 6c 20 22 55 50 44 41 54 45 20 74 31 20 53 45 54  l "UPDATE t1 SET
5600: 20 62 20 3d 20 27 66 6f 75 72 27 20 57 48 45 52   b = 'four' WHER
5610: 45 20 62 20 3d 20 27 6f 6e 65 27 22 0a 7d 20 7b  E b = 'one'".} {
5620: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
5630: 31 32 2e 31 2e 34 20 7b 20 0a 20 20 63 61 74 63  12.1.4 { .  catc
5640: 68 73 71 6c 20 22 55 50 44 41 54 45 20 74 31 20  hsql "UPDATE t1 
5650: 53 45 54 20 62 20 3d 20 27 66 69 76 65 27 20 57  SET b = 'five' W
5660: 48 45 52 45 20 62 20 3d 20 27 74 77 6f 27 22 0a  HERE b = 'two'".
5670: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
5680: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
5690: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
56a0: 65 79 32 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20  ey2-12.1.5 { .  
56b0: 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20  execsql "DELETE 
56c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
56d0: 3d 20 27 74 77 6f 27 22 0a 7d 20 7b 7d 0a 64 6f  = 'two'".} {}.do
56e0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32 2e 31  _test fkey2-12.1
56f0: 2e 36 20 7b 20 0a 20 20 63 61 74 63 68 73 71 6c  .6 { .  catchsql
5700: 20 22 43 4f 4d 4d 49 54 22 0a 7d 20 7b 31 20 7b   "COMMIT".} {1 {
5710: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
5720: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
5730: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 32  do_test fkey2-12
5740: 2e 31 2e 37 20 7b 20 0a 20 20 65 78 65 63 73 71  .1.7 { .  execsq
5750: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
5760: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
5770: 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 43 4f 4d   'two');.    COM
5780: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  MIT;.  }.} {}..#
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 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
57e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
57f0: 20 66 6b 65 79 32 2d 31 33 2e 2a 2c 20 74 65 73   fkey2-13.*, tes
5800: 74 20 74 68 61 74 20 46 4b 20 70 72 6f 63 65 73  t that FK proces
5810: 73 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  sing is performe
5820: 64 0a 23 20 77 68 65 6e 20 72 6f 77 73 20 61 72  d.# when rows ar
5830: 65 20 52 45 50 4c 41 43 45 64 2e 0a 23 0a 64 72  e REPLACEd..#.dr
5840: 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f  op_all_tables.do
5850: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31  _test fkey2-13.1
5860: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5870: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5880: 45 20 70 70 28 61 20 55 4e 49 51 55 45 2c 20 62  E pp(a UNIQUE, b
5890: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
58a0: 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 43 52 45  (b, c));.    CRE
58b0: 41 54 45 20 54 41 42 4c 45 20 63 63 28 64 2c 20  ATE TABLE cc(d, 
58c0: 65 2c 20 66 20 55 4e 49 51 55 45 2c 20 46 4f 52  e, f UNIQUE, FOR
58d0: 45 49 47 4e 20 4b 45 59 28 64 2c 20 65 29 20 52  EIGN KEY(d, e) R
58e0: 45 46 45 52 45 4e 43 45 53 20 70 70 29 3b 0a 20  EFERENCES pp);. 
58f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
5900: 70 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  p VALUES(1, 2, 3
5910: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5920: 54 4f 20 63 63 20 56 41 4c 55 45 53 28 32 2c 20  TO cc VALUES(2, 
5930: 33 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  3, 1);.  }.} {}.
5940: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 74 6d 74  foreach {tn stmt
5950: 7d 20 7b 0a 20 20 31 20 20 20 22 52 45 50 4c 41  } {.  1   "REPLA
5960: 43 45 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45  CE INTO pp VALUE
5970: 53 28 31 2c 20 34 2c 20 35 29 22 0a 20 20 32 20  S(1, 4, 5)".  2 
5980: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
5990: 70 70 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  pp(rowid, a, b, 
59a0: 63 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  c) VALUES(1, 2, 
59b0: 33 2c 20 34 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f  3, 4)".} {.  do_
59c0: 74 65 73 74 20 66 6b 65 79 32 2d 31 33 2e 31 2e  test fkey2-13.1.
59d0: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 63 61 74 63  $tn.1 {.    catc
59e0: 68 73 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20 7b  hsql $stmt.  } {
59f0: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
5a00: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
5a10: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }}.  do_test fke
5a20: 79 32 2d 31 33 2e 31 2e 24 74 6e 2e 32 20 7b 0a  y2-13.1.$tn.2 {.
5a30: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
5a40: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5a50: 4d 20 70 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  M pp;.      SELE
5a60: 43 54 20 2a 20 46 52 4f 4d 20 63 63 3b 0a 20 20  CT * FROM cc;.  
5a70: 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 32    }.  } {1 2 3 2
5a80: 20 33 20 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 1}.  do_test 
5a90: 66 6b 65 79 32 2d 31 33 2e 31 2e 24 74 6e 2e 33  fkey2-13.1.$tn.3
5aa0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 42   {.    execsql B
5ab0: 45 47 49 4e 3b 0a 20 20 20 20 63 61 74 63 68 73  EGIN;.    catchs
5ac0: 71 6c 20 24 73 74 6d 74 0a 20 20 7d 20 7b 31 20  ql $stmt.  } {1 
5ad0: 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  {foreign key con
5ae0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
5af0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
5b00: 2d 31 33 2e 31 2e 24 74 6e 2e 34 20 7b 0a 20 20  -13.1.$tn.4 {.  
5b10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5b20: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
5b30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 70  SELECT * FROM pp
5b40: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
5b50: 20 46 52 4f 4d 20 63 63 3b 0a 20 20 20 20 7d 0a   FROM cc;.    }.
5b60: 20 20 7d 20 7b 31 20 32 20 33 20 32 20 33 20 31    } {1 2 3 2 3 1
5b70: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  }.}.do_test fkey
5b80: 32 2d 31 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65  2-13.1.3 {.  exe
5b90: 63 73 71 6c 20 7b 20 0a 20 20 20 20 52 45 50 4c  csql { .    REPL
5ba0: 41 43 45 20 49 4e 54 4f 20 70 70 28 72 6f 77 69  ACE INTO pp(rowi
5bb0: 64 2c 20 61 2c 20 62 2c 20 63 29 20 56 41 4c 55  d, a, b, c) VALU
5bc0: 45 53 28 31 2c 20 32 2c 20 32 2c 20 33 29 3b 0a  ES(1, 2, 2, 3);.
5bd0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
5be0: 2c 20 2a 20 46 52 4f 4d 20 70 70 3b 0a 20 20 20  , * FROM pp;.   
5bf0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
5c00: 63 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 32 20  c;.  }.} {1 2 2 
5c10: 33 20 32 20 33 20 31 7d 0a 64 6f 5f 74 65 73 74  3 2 3 1}.do_test
5c20: 20 66 6b 65 79 32 2d 31 33 2e 31 2e 34 20 7b 0a   fkey2-13.1.4 {.
5c30: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
5c40: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 70 70   REPLACE INTO pp
5c50: 28 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 29  (rowid, a, b, c)
5c60: 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 32 2c   VALUES(2, 2, 2,
5c70: 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   3);.    SELECT 
5c80: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 70 70  rowid, * FROM pp
5c90: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
5ca0: 52 4f 4d 20 63 63 3b 0a 20 20 7d 0a 7d 20 7b 32  ROM cc;.  }.} {2
5cb0: 20 32 20 32 20 33 20 32 20 33 20 31 7d 0a 0a 23   2 2 3 2 3 1}..#
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
5d10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
5d20: 20 66 6b 65 79 32 2d 31 34 2e 2a 2c 20 74 65 73   fkey2-14.*, tes
5d30: 74 20 74 68 61 74 20 74 68 65 20 22 44 52 4f 50  t that the "DROP
5d40: 20 54 41 42 4c 45 22 20 61 6e 64 20 22 41 4c 54   TABLE" and "ALT
5d50: 45 52 0a 23 20 54 41 42 4c 45 22 20 63 6f 6d 6d  ER.# TABLE" comm
5d60: 61 6e 64 73 20 77 6f 72 6b 20 61 73 20 65 78 70  ands work as exp
5d70: 65 63 74 65 64 20 77 72 74 20 66 6f 72 65 69 67  ected wrt foreig
5d80: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
5d90: 73 2e 0a 23 0a 23 20 66 6b 65 79 32 2d 31 34 2e  s..#.# fkey2-14.
5da0: 31 2a 3a 20 41 4c 54 45 52 20 54 41 42 4c 45 20  1*: ALTER TABLE 
5db0: 41 44 44 20 43 4f 4c 55 4d 4e 0a 23 20 66 6b 65  ADD COLUMN.# fke
5dc0: 79 32 2d 31 34 2e 32 2a 3a 20 41 4c 54 45 52 20  y2-14.2*: ALTER 
5dd0: 54 41 42 4c 45 20 52 45 4e 41 4d 45 20 54 41 42  TABLE RENAME TAB
5de0: 4c 45 0a 23 20 66 6b 65 79 32 2d 31 34 2e 33 2a  LE.# fkey2-14.3*
5df0: 3a 20 44 52 4f 50 20 54 41 42 4c 45 0a 23 0a 64  : DROP TABLE.#.d
5e00: 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 69  rop_all_tables.i
5e10: 66 63 61 70 61 62 6c 65 20 61 6c 74 65 72 74 61  fcapable alterta
5e20: 62 6c 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ble {.  do_test 
5e30: 66 6b 65 79 32 2d 31 34 2e 31 2e 31 20 7b 0a 20  fkey2-14.1.1 {. 
5e40: 20 20 20 23 20 41 64 64 69 6e 67 20 61 20 63 6f     # Adding a co
5e50: 6c 75 6d 6e 20 77 69 74 68 20 61 20 52 45 46 45  lumn with a REFE
5e60: 52 45 4e 43 45 53 20 63 6c 61 75 73 65 20 69 73  RENCES clause is
5e70: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 0a   not supported..
5e80: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
5e90: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
5ea0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
5eb0: 45 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  EY);.      CREAT
5ec0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
5ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63  ;.    }.    catc
5ee0: 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42  hsql { ALTER TAB
5ef0: 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e  LE t2 ADD COLUMN
5f00: 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 74 31   c REFERENCES t1
5f10: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
5f20: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
5f30: 2e 31 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68  .1.2 {.    catch
5f40: 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c  sql { ALTER TABL
5f50: 45 20 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20  E t2 ADD COLUMN 
5f60: 64 20 44 45 46 41 55 4c 54 20 4e 55 4c 4c 20 52  d DEFAULT NULL R
5f70: 45 46 45 52 45 4e 43 45 53 20 74 31 20 7d 0a 20  EFERENCES t1 }. 
5f80: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
5f90: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 2e 33  est fkey2-14.1.3
5fa0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
5fb0: 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 32  { ALTER TABLE t2
5fc0: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 65 20 52 45   ADD COLUMN e RE
5fd0: 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 41  FERENCES t1 DEFA
5fe0: 55 4c 54 20 4e 55 4c 4c 7d 0a 20 20 7d 20 7b 30  ULT NULL}.  } {0
5ff0: 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66   {}}.  do_test f
6000: 6b 65 79 32 2d 31 34 2e 31 2e 34 20 7b 0a 20 20  key2-14.1.4 {.  
6010: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54    catchsql { ALT
6020: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
6030: 43 4f 4c 55 4d 4e 20 66 20 52 45 46 45 52 45 4e  COLUMN f REFEREN
6040: 43 45 53 20 74 31 20 44 45 46 41 55 4c 54 20 27  CES t1 DEFAULT '
6050: 74 65 78 74 27 7d 0a 20 20 7d 20 7b 31 20 7b 43  text'}.  } {1 {C
6060: 61 6e 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45  annot add a REFE
6070: 52 45 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69  RENCES column wi
6080: 74 68 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61  th non-NULL defa
6090: 75 6c 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f  ult value}}.  do
60a0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31  _test fkey2-14.1
60b0: 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .5 {.    catchsq
60c0: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
60d0: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 67 20  t2 ADD COLUMN g 
60e0: 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54 5f  DEFAULT CURRENT_
60f0: 54 49 4d 45 20 52 45 46 45 52 45 4e 43 45 53 20  TIME REFERENCES 
6100: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 7b 43 61 6e  t1 }.  } {1 {Can
6110: 6e 6f 74 20 61 64 64 20 61 20 52 45 46 45 52 45  not add a REFERE
6120: 4e 43 45 53 20 63 6f 6c 75 6d 6e 20 77 69 74 68  NCES column with
6130: 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c   non-NULL defaul
6140: 74 20 76 61 6c 75 65 7d 7d 0a 20 20 64 6f 5f 74  t value}}.  do_t
6150: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 31 2e 36  est fkey2-14.1.6
6160: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
6170: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66   .      PRAGMA f
6180: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 66  oreign_keys = of
6190: 66 3b 0a 20 20 20 20 20 20 41 4c 54 45 52 20 54  f;.      ALTER T
61a0: 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55  ABLE t2 ADD COLU
61b0: 4d 4e 20 68 20 44 45 46 41 55 4c 54 20 27 74 65  MN h DEFAULT 'te
61c0: 78 74 27 20 52 45 46 45 52 45 4e 43 45 53 20 74  xt' REFERENCES t
61d0: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
61e0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 6f  foreign_keys = o
61f0: 6e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  n;.      SELECT 
6200: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
6210: 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
6220: 65 3d 27 74 32 27 3b 0a 20 20 20 20 7d 0a 20 20  e='t2';.    }.  
6230: 7d 20 7b 7b 43 52 45 41 54 45 20 54 41 42 4c 45  } {{CREATE TABLE
6240: 20 74 32 28 61 2c 20 62 2c 20 63 20 52 45 46 45   t2(a, b, c REFE
6250: 52 45 4e 43 45 53 20 74 31 2c 20 64 20 44 45 46  RENCES t1, d DEF
6260: 41 55 4c 54 20 4e 55 4c 4c 20 52 45 46 45 52 45  AULT NULL REFERE
6270: 4e 43 45 53 20 74 31 2c 20 65 20 52 45 46 45 52  NCES t1, e REFER
6280: 45 4e 43 45 53 20 74 31 20 44 45 46 41 55 4c 54  ENCES t1 DEFAULT
6290: 20 4e 55 4c 4c 2c 20 68 20 44 45 46 41 55 4c 54   NULL, h DEFAULT
62a0: 20 27 74 65 78 74 27 20 52 45 46 45 52 45 4e 43   'text' REFERENC
62b0: 45 53 20 74 31 29 7d 7d 0a 20 20 0a 20 20 0a 20  ES t1)}}.  .  . 
62c0: 20 23 20 54 65 73 74 20 74 68 65 20 73 71 6c 69   # Test the sqli
62d0: 74 65 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e 74  te_rename_parent
62e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  () function dire
62f0: 63 74 6c 79 2e 0a 20 20 23 0a 20 20 70 72 6f 63  ctly..  #.  proc
6300: 20 74 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72   test_rename_par
6310: 65 6e 74 20 7b 7a 43 72 65 61 74 65 20 7a 4f 6c  ent {zCreate zOl
6320: 64 20 7a 4e 65 77 7d 20 7b 0a 20 20 20 20 64 62  d zNew} {.    db
6330: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73 71   eval {SELECT sq
6340: 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 70 61 72 65  lite_rename_pare
6350: 6e 74 28 24 7a 43 72 65 61 74 65 2c 20 24 7a 4f  nt($zCreate, $zO
6360: 6c 64 2c 20 24 7a 4e 65 77 29 7d 0a 20 20 7d 0a  ld, $zNew)}.  }.
6370: 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d    do_test fkey2-
6380: 31 34 2e 32 2e 31 2e 31 20 7b 0a 20 20 20 20 74  14.2.1.1 {.    t
6390: 65 73 74 5f 72 65 6e 61 6d 65 5f 70 61 72 65 6e  est_rename_paren
63a0: 74 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  t {CREATE TABLE 
63b0: 74 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t1(a REFERENCES 
63c0: 74 32 29 7d 20 74 32 20 74 33 0a 20 20 7d 20 7b  t2)} t2 t3.  } {
63d0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
63e0: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 22 74  (a REFERENCES "t
63f0: 33 22 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3")}}.  do_test 
6400: 66 6b 65 79 32 2d 31 34 2e 32 2e 31 2e 32 20 7b  fkey2-14.2.1.2 {
6410: 0a 20 20 20 20 74 65 73 74 5f 72 65 6e 61 6d 65  .    test_rename
6420: 5f 70 61 72 65 6e 74 20 7b 43 52 45 41 54 45 20  _parent {CREATE 
6430: 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45 52  TABLE t1(a REFER
6440: 45 4e 43 45 53 20 74 32 29 7d 20 74 34 20 74 33  ENCES t2)} t4 t3
6450: 0a 20 20 7d 20 7b 7b 43 52 45 41 54 45 20 54 41  .  } {{CREATE TA
6460: 42 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e  BLE t1(a REFEREN
6470: 43 45 53 20 74 32 29 7d 7d 0a 20 20 64 6f 5f 74  CES t2)}}.  do_t
6480: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 31  est fkey2-14.2.1
6490: 2e 33 20 7b 0a 20 20 20 20 74 65 73 74 5f 72 65  .3 {.    test_re
64a0: 6e 61 6d 65 5f 70 61 72 65 6e 74 20 7b 43 52 45  name_parent {CRE
64b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
64c0: 45 46 45 52 45 4e 43 45 53 20 22 74 32 22 29 7d  EFERENCES "t2")}
64d0: 20 74 32 20 74 33 0a 20 20 7d 20 7b 7b 43 52 45   t2 t3.  } {{CRE
64e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
64f0: 45 46 45 52 45 4e 43 45 53 20 22 74 33 22 29 7d  EFERENCES "t3")}
6500: 7d 0a 20 20 0a 20 20 23 20 54 65 73 74 20 41 4c  }.  .  # Test AL
6510: 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41 4d 45  TER TABLE RENAME
6520: 20 54 41 42 4c 45 20 61 20 62 69 74 2e 0a 20 20   TABLE a bit..  
6530: 23 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  #.  do_test fkey
6540: 32 2d 31 34 2e 32 2e 32 2e 31 20 7b 0a 20 20 20  2-14.2.2.1 {.   
6550: 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73   drop_all_tables
6560: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
6570: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
6580: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
6590: 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45 53  EY, b REFERENCES
65a0: 20 74 31 29 3b 0a 20 20 20 20 20 20 43 52 45 41   t1);.      CREA
65b0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52  TE TABLE t2(a PR
65c0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45 46  IMARY KEY, b REF
65d0: 45 52 45 4e 43 45 53 20 74 31 2c 20 63 20 52 45  ERENCES t1, c RE
65e0: 46 45 52 45 4e 43 45 53 20 74 32 29 3b 0a 20 20  FERENCES t2);.  
65f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6600: 20 74 33 28 61 20 52 45 46 45 52 45 4e 43 45 53   t3(a REFERENCES
6610: 20 74 31 2c 20 62 20 52 45 46 45 52 45 4e 43 45   t1, b REFERENCE
6620: 53 20 74 32 2c 20 63 20 52 45 46 45 52 45 4e 43  S t2, c REFERENC
6630: 45 53 20 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ES t1);.    }.  
6640: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
6650: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
6660: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
6670: 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a  type = 'table'}.
6680: 20 20 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20    } [list \.    
6690: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  {CREATE TABLE t1
66a0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
66b0: 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 29  b REFERENCES t1)
66c0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
66d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45        \.    {CRE
66e0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
66f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
6700: 46 45 52 45 4e 43 45 53 20 74 31 2c 20 63 20 52  FERENCES t1, c R
6710: 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d 20 20  EFERENCES t2)}  
6720: 20 20 5c 0a 20 20 20 20 7b 43 52 45 41 54 45 20    \.    {CREATE 
6730: 54 41 42 4c 45 20 74 33 28 61 20 52 45 46 45 52  TABLE t3(a REFER
6740: 45 4e 43 45 53 20 74 31 2c 20 62 20 52 45 46 45  ENCES t1, b REFE
6750: 52 45 4e 43 45 53 20 74 32 2c 20 63 20 52 45 46  RENCES t2, c REF
6760: 45 52 45 4e 43 45 53 20 74 31 29 7d 20 20 5c 0a  ERENCES t1)}  \.
6770: 20 20 5d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b    ].  do_test fk
6780: 65 79 32 2d 31 34 2e 32 2e 32 2e 32 20 7b 0a 20  ey2-14.2.2.2 {. 
6790: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 41 4c 54     execsql { ALT
67a0: 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41  ER TABLE t1 RENA
67b0: 4d 45 20 54 4f 20 74 34 20 7d 0a 20 20 20 20 65  ME TO t4 }.    e
67c0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
67d0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
67e0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
67f0: 65 20 3d 20 27 74 61 62 6c 65 27 7d 0a 20 20 7d  e = 'table'}.  }
6800: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 7b 43 52   [list \.    {CR
6810: 45 41 54 45 20 54 41 42 4c 45 20 22 74 34 22 28  EATE TABLE "t4"(
6820: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
6830: 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34 22   REFERENCES "t4"
6840: 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )}              
6850: 20 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45        \.    {CRE
6860: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
6870: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52 45  RIMARY KEY, b RE
6880: 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c 20 63  FERENCES "t4", c
6890: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 7d   REFERENCES t2)}
68a0: 20 20 20 20 20 5c 0a 20 20 20 20 7b 43 52 45 41       \.    {CREA
68b0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 52 45  TE TABLE t3(a RE
68c0: 46 45 52 45 4e 43 45 53 20 22 74 34 22 2c 20 62  FERENCES "t4", b
68d0: 20 52 45 46 45 52 45 4e 43 45 53 20 74 32 2c 20   REFERENCES t2, 
68e0: 63 20 52 45 46 45 52 45 4e 43 45 53 20 22 74 34  c REFERENCES "t4
68f0: 22 29 7d 20 5c 0a 20 20 5d 0a 20 20 64 6f 5f 74  ")} \.  ].  do_t
6900: 65 73 74 20 66 6b 65 79 32 2d 31 34 2e 32 2e 32  est fkey2-14.2.2
6910: 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .3 {.    catchsq
6920: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
6930: 74 33 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t3 VALUES(1, 2, 
6940: 33 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72  3) }.  } {1 {for
6950: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
6960: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64  int failed}}.  d
6970: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34 2e  o_test fkey2-14.
6980: 32 2e 32 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  2.2.4 {.    exec
6990: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
69a0: 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20 4e  O t4 VALUES(1, N
69b0: 55 4c 4c 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  ULL) }.  } {}.  
69c0: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 34  do_test fkey2-14
69d0: 2e 32 2e 32 2e 35 20 7b 0a 20 20 20 20 63 61 74  .2.2.5 {.    cat
69e0: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  chsql { UPDATE t
69f0: 34 20 53 45 54 20 62 20 3d 20 35 20 7d 0a 20 20  4 SET b = 5 }.  
6a00: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
6a10: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
6a20: 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  led}}.  do_test 
6a30: 66 6b 65 79 32 2d 31 34 2e 32 2e 32 2e 36 20 7b  fkey2-14.2.2.6 {
6a40: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
6a50: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 62 20  UPDATE t4 SET b 
6a60: 3d 20 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  = 1 }.  } {0 {}}
6a70: 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  .  do_test fkey2
6a80: 2d 31 34 2e 32 2e 32 2e 37 20 7b 0a 20 20 20 20  -14.2.2.7 {.    
6a90: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
6aa0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
6ab0: 31 2c 20 4e 55 4c 4c 2c 20 31 29 20 7d 0a 20 20  1, NULL, 1) }.  
6ac0: 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  } {}.}..do_test 
6ad0: 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 31 20 7b 0a  fkey-2.14.3.1 {.
6ae0: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
6af0: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
6b00: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6b10: 31 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  1(a, b REFERENCE
6b20: 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 29 3b 0a  S nosuchtable);.
6b30: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
6b40: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
6b50: 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e  est fkey-2.14.3.
6b60: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
6b70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6b80: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
6b90: 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  Y, b);.    INSER
6ba0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6bb0: 28 27 61 27 2c 20 31 29 3b 0a 20 20 20 20 43 52  ('a', 1);.    CR
6bc0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20  EATE TABLE t2(x 
6bd0: 52 45 46 45 52 45 4e 43 45 53 20 74 31 29 3b 0a  REFERENCES t1);.
6be0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6bf0: 74 32 20 56 41 4c 55 45 53 28 27 61 27 29 3b 0a  t2 VALUES('a');.
6c00: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
6c10: 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 33 20 7b   fkey-2.14.3.3 {
6c20: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52  .  catchsql { DR
6c30: 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 7d 20  OP TABLE t1 }.} 
6c40: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
6c50: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
6c60: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  d}}.do_test fkey
6c70: 2d 32 2e 31 34 2e 33 2e 34 20 7b 0a 20 20 65 78  -2.14.3.4 {.  ex
6c80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
6c90: 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  TE FROM t2;.    
6ca0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
6cb0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
6cc0: 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 34 20 7b 0a  fkey-2.14.3.4 {.
6cd0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
6ce0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6cf0: 45 53 28 27 78 27 29 20 7d 0a 7d 20 7b 31 20 7b  ES('x') }.} {1 {
6d00: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d  no such table: m
6d10: 61 69 6e 2e 74 31 7d 7d 0a 64 6f 5f 74 65 73 74  ain.t1}}.do_test
6d20: 20 66 6b 65 79 2d 32 2e 31 34 2e 33 2e 35 20 7b   fkey-2.14.3.5 {
6d30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6d40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6d50: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
6d60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6d70: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 29 3b   t1 VALUES('x');
6d80: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
6d90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
6da0: 56 41 4c 55 45 53 28 27 78 27 29 20 7d 0a 7d 20  VALUES('x') }.} 
6db0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d  {}.do_test fkey-
6dc0: 32 2e 31 34 2e 33 2e 36 20 7b 0a 20 20 63 61 74  2.14.3.6 {.  cat
6dd0: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
6de0: 4c 45 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66 6f  LE t1 }.} {1 {fo
6df0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
6e00: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
6e10: 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e 31 34 2e  _test fkey-2.14.
6e20: 33 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.7 {.  execsql 
6e30: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
6e40: 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t2;.    DROP TA
6e50: 42 4c 45 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE t1;.  }.} {}
6e60: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
6e70: 31 34 2e 33 2e 38 20 7b 0a 20 20 65 78 65 63 73  14.3.8 {.  execs
6e80: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
6e90: 54 41 42 4c 45 20 70 70 28 78 2c 20 79 2c 20 50  TABLE pp(x, y, P
6ea0: 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 20 79 29  RIMARY KEY(x, y)
6eb0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
6ec0: 42 4c 45 20 63 63 28 61 2c 20 62 2c 20 46 4f 52  BLE cc(a, b, FOR
6ed0: 45 49 47 4e 20 4b 45 59 28 61 2c 20 62 29 20 52  EIGN KEY(a, b) R
6ee0: 45 46 45 52 45 4e 43 45 53 20 70 70 28 78 2c 20  EFERENCES pp(x, 
6ef0: 7a 29 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68  z));.  }.  catch
6f00: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
6f10: 4f 20 63 63 20 56 41 4c 55 45 53 28 31 2c 20 32  O cc VALUES(1, 2
6f20: 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67  ) }.} {1 {foreig
6f30: 6e 20 6b 65 79 20 6d 69 73 6d 61 74 63 68 7d 7d  n key mismatch}}
6f40: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 2d 32 2e  .do_test fkey-2.
6f50: 31 34 2e 33 2e 39 20 7b 0a 20 20 65 78 65 63 73  14.3.9 {.  execs
6f60: 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20  ql { DROP TABLE 
6f70: 63 63 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  cc }.} {}..#----
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
6fd0: 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 66 6b 65  owing tests, fke
6fe0: 79 32 2d 31 35 2e 2a 2c 20 74 65 73 74 20 74 68  y2-15.*, test th
6ff0: 61 74 20 75 6e 6e 65 63 65 73 73 61 72 79 20 46  at unnecessary F
7000: 4b 20 72 65 6c 61 74 65 64 20 73 63 61 6e 73 20  K related scans 
7010: 0a 23 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  .# and lookups a
7020: 72 65 20 61 76 6f 69 64 65 64 20 77 68 65 6e 20  re avoided when 
7030: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  the constraint c
7040: 6f 75 6e 74 65 72 73 20 61 72 65 20 7a 65 72 6f  ounters are zero
7050: 2e 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  ..#.drop_all_tab
7060: 6c 65 73 0a 70 72 6f 63 20 65 78 65 63 73 71 6c  les.proc execsql
7070: 53 20 7b 7a 53 71 6c 7d 20 7b 0a 20 20 73 65 74  S {zSql} {.  set
7080: 20 3a 3a 73 71 6c 69 74 65 5f 73 65 61 72 63 68   ::sqlite_search
7090: 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 3a  _count 0.  set :
70a0: 3a 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f  :sqlite_found_co
70b0: 75 6e 74 20 30 0a 20 20 73 65 74 20 72 65 73 20  unt 0.  set res 
70c0: 5b 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 65  [uplevel [list e
70d0: 78 65 63 73 71 6c 20 24 7a 53 71 6c 5d 5d 0a 20  xecsql $zSql]]. 
70e0: 20 63 6f 6e 63 61 74 20 5b 65 78 70 72 20 24 3a   concat [expr $:
70f0: 3a 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f  :sqlite_found_co
7100: 75 6e 74 20 2b 20 24 3a 3a 73 71 6c 69 74 65 5f  unt + $::sqlite_
7110: 73 65 61 72 63 68 5f 63 6f 75 6e 74 5d 20 24 72  search_count] $r
7120: 65 73 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  es.}.do_test fke
7130: 79 32 2d 31 35 2e 31 2e 31 20 7b 0a 20 20 65 78  y2-15.1.1 {.  ex
7140: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
7150: 54 45 20 54 41 42 4c 45 20 70 70 28 61 20 50 52  TE TABLE pp(a PR
7160: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
7170: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7180: 63 63 28 78 2c 20 79 20 52 45 46 45 52 45 4e 43  cc(x, y REFERENC
7190: 45 53 20 70 70 20 44 45 46 45 52 52 41 42 4c 45  ES pp DEFERRABLE
71a0: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
71b0: 52 45 44 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  RED);.    INSERT
71c0: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
71d0: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  1, 'one');.    I
71e0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41  NSERT INTO pp VA
71f0: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
7200: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7210: 63 63 20 56 41 4c 55 45 53 28 27 6e 65 75 6e 67  cc VALUES('neung
7220: 27 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 1);.    INSER
7230: 54 20 49 4e 54 4f 20 63 63 20 56 41 4c 55 45 53  T INTO cc VALUES
7240: 28 27 73 6f 6e 67 27 2c 20 32 29 3b 0a 20 20 7d  ('song', 2);.  }
7250: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
7260: 65 79 32 2d 31 35 2e 31 2e 32 20 7b 0a 20 20 65  ey2-15.1.2 {.  e
7270: 78 65 63 73 71 6c 53 20 7b 20 49 4e 53 45 52 54  xecsqlS { INSERT
7280: 20 49 4e 54 4f 20 70 70 20 56 41 4c 55 45 53 28   INTO pp VALUES(
7290: 33 2c 20 27 74 68 72 65 65 27 29 20 7d 0a 7d 20  3, 'three') }.} 
72a0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  {0}.do_test fkey
72b0: 32 2d 31 35 2e 31 2e 33 20 7b 0a 20 20 65 78 65  2-15.1.3 {.  exe
72c0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
72d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
72e0: 4e 54 4f 20 63 63 20 56 41 4c 55 45 53 28 27 73  NTO cc VALUES('s
72f0: 65 65 27 2c 20 34 29 3b 20 20 20 20 2d 2d 20 56  ee', 4);    -- V
7300: 69 6f 6c 61 74 65 73 20 64 65 66 65 72 72 65 64  iolates deferred
7310: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 7d 0a   constraint.  }.
7320: 20 20 65 78 65 63 73 71 6c 53 20 7b 20 49 4e 53    execsqlS { INS
7330: 45 52 54 20 49 4e 54 4f 20 70 70 20 56 41 4c 55  ERT INTO pp VALU
7340: 45 53 28 35 2c 20 27 66 69 76 65 27 29 20 7d 0a  ES(5, 'five') }.
7350: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  } {2}.do_test fk
7360: 65 79 32 2d 31 35 2e 31 2e 34 20 7b 0a 20 20 65  ey2-15.1.4 {.  e
7370: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
7380: 46 52 4f 4d 20 63 63 20 57 48 45 52 45 20 78 20  FROM cc WHERE x 
7390: 3d 20 27 73 65 65 27 20 7d 0a 20 20 65 78 65 63  = 'see' }.  exec
73a0: 73 71 6c 53 20 7b 20 49 4e 53 45 52 54 20 49 4e  sqlS { INSERT IN
73b0: 54 4f 20 70 70 20 56 41 4c 55 45 53 28 36 2c 20  TO pp VALUES(6, 
73c0: 27 73 69 78 27 29 20 7d 0a 7d 20 7b 30 7d 0a 64  'six') }.} {0}.d
73d0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 35 2e  o_test fkey2-15.
73e0: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
73f0: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74  COMMIT.} {}.do_t
7400: 65 73 74 20 66 6b 65 79 32 2d 31 35 2e 31 2e 36  est fkey2-15.1.6
7410: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47   {.  execsql BEG
7420: 49 4e 0a 20 20 65 78 65 63 73 71 6c 53 20 7b 0a  IN.  execsqlS {.
7430: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7440: 63 63 20 57 48 45 52 45 20 78 20 3d 20 27 6e 65  cc WHERE x = 'ne
7450: 75 6e 67 27 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  ung';.    ROLLBA
7460: 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  CK;.  }.} {1}.do
7470: 5f 74 65 73 74 20 66 6b 65 79 32 2d 31 35 2e 31  _test fkey2-15.1
7480: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
7490: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
74a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 70 20   DELETE FROM pp 
74b0: 57 48 45 52 45 20 61 20 3d 20 32 3b 0a 20 20 7d  WHERE a = 2;.  }
74c0: 0a 20 20 65 78 65 63 73 71 6c 53 20 7b 0a 20 20  .  execsqlS {.  
74d0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 63    DELETE FROM cc
74e0: 20 57 48 45 52 45 20 78 20 3d 20 27 6e 65 75 6e   WHERE x = 'neun
74f0: 67 27 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  g';.    ROLLBACK
7500: 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 0a 23 2d 2d  ;.  }.} {2}..#--
7510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 6e  -------.# This n
7560: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ext block of tes
7570: 74 73 2c 20 66 6b 65 79 32 2d 31 36 2e 2a 2c 20  ts, fkey2-16.*, 
7580: 74 65 73 74 20 74 68 61 74 20 72 6f 77 73 20 74  test that rows t
7590: 68 61 74 20 72 65 66 65 72 20 74 6f 0a 23 20 74  hat refer to.# t
75a0: 68 65 6d 73 65 6c 76 65 73 20 6d 61 79 20 62 65  hemselves may be
75b0: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 65   inserted and de
75c0: 6c 65 74 65 64 2e 0a 23 0a 66 6f 72 65 61 63 68  leted..#.foreach
75d0: 20 7b 74 6e 20 7a 53 63 68 65 6d 61 7d 20 7b 0a   {tn zSchema} {.
75e0: 20 20 31 20 7b 20 43 52 45 41 54 45 20 54 41 42    1 { CREATE TAB
75f0: 4c 45 20 73 65 6c 66 28 61 20 49 4e 54 45 47 45  LE self(a INTEGE
7600: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
7610: 20 52 45 46 45 52 45 4e 43 45 53 20 73 65 6c 66   REFERENCES self
7620: 28 61 29 29 20 7d 0a 20 20 32 20 7b 20 43 52 45  (a)) }.  2 { CRE
7630: 41 54 45 20 54 41 42 4c 45 20 73 65 6c 66 28 61  ATE TABLE self(a
7640: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
7650: 52 45 46 45 52 45 4e 43 45 53 20 73 65 6c 66 28  REFERENCES self(
7660: 61 29 29 20 7d 0a 20 20 33 20 7b 20 43 52 45 41  a)) }.  3 { CREA
7670: 54 45 20 54 41 42 4c 45 20 73 65 6c 66 28 61 20  TE TABLE self(a 
7680: 55 4e 49 51 55 45 2c 20 62 20 49 4e 54 45 47 45  UNIQUE, b INTEGE
7690: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 52 45  R PRIMARY KEY RE
76a0: 46 45 52 45 4e 43 45 53 20 73 65 6c 66 28 61 29  FERENCES self(a)
76b0: 29 20 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70 5f 61  ) }.} {.  drop_a
76c0: 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 64 6f 5f 74  ll_tables.  do_t
76d0: 65 73 74 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24  est fkey2-16.1.$
76e0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.1 {.    execs
76f0: 71 6c 20 24 7a 53 63 68 65 6d 61 0a 20 20 20 20  ql $zSchema.    
7700: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
7710: 20 49 4e 54 4f 20 73 65 6c 66 20 56 41 4c 55 45   INTO self VALUE
7720: 53 28 31 33 2c 20 31 33 29 20 7d 0a 20 20 7d 20  S(13, 13) }.  } 
7730: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  {}.  do_test fke
7740: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 32 20 7b 0a  y2-16.1.$tn.2 {.
7750: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50      execsql { UP
7760: 44 41 54 45 20 73 65 6c 66 20 53 45 54 20 61 20  DATE self SET a 
7770: 3d 20 31 34 2c 20 62 20 3d 20 31 34 20 7d 0a 20  = 14, b = 14 }. 
7780: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
7790: 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e   fkey2-16.1.$tn.
77a0: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
77b0: 20 7b 20 55 50 44 41 54 45 20 73 65 6c 66 20 53   { UPDATE self S
77c0: 45 54 20 62 20 3d 20 31 35 20 7d 0a 20 20 7d 20  ET b = 15 }.  } 
77d0: 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20  {1 {foreign key 
77e0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
77f0: 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66  d}}..  do_test f
7800: 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 34 20  key2-16.1.$tn.4 
7810: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
7820: 20 55 50 44 41 54 45 20 73 65 6c 66 20 53 45 54   UPDATE self SET
7830: 20 61 20 3d 20 31 35 20 7d 0a 20 20 7d 20 7b 31   a = 15 }.  } {1
7840: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
7850: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
7860: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65  }..  do_test fke
7870: 79 32 2d 31 36 2e 31 2e 24 74 6e 2e 35 20 7b 0a  y2-16.1.$tn.5 {.
7880: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55      catchsql { U
7890: 50 44 41 54 45 20 73 65 6c 66 20 53 45 54 20 61  PDATE self SET a
78a0: 20 3d 20 31 35 2c 20 62 20 3d 20 31 36 20 7d 0a   = 15, b = 16 }.
78b0: 20 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20    } {1 {foreign 
78c0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
78d0: 61 69 6c 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65  ailed}}..  do_te
78e0: 73 74 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74  st fkey2-16.1.$t
78f0: 6e 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.6 {.    catchs
7900: 71 6c 20 7b 20 55 50 44 41 54 45 20 73 65 6c 66  ql { UPDATE self
7910: 20 53 45 54 20 61 20 3d 20 31 37 2c 20 62 20 3d   SET a = 17, b =
7920: 20 31 37 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d   17 }.  } {0 {}}
7930: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 66 6b 65 79  ..  do_test fkey
7940: 32 2d 31 36 2e 31 2e 24 74 6e 2e 37 20 7b 0a 20  2-16.1.$tn.7 {. 
7950: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c     execsql { DEL
7960: 45 54 45 20 46 52 4f 4d 20 73 65 6c 66 20 7d 0a  ETE FROM self }.
7970: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
7980: 20 66 6b 65 79 32 2d 31 36 2e 31 2e 24 74 6e 2e   fkey2-16.1.$tn.
7990: 38 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  8 {.    catchsql
79a0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73   { INSERT INTO s
79b0: 65 6c 66 20 56 41 4c 55 45 53 28 32 30 2c 20 32  elf VALUES(20, 2
79c0: 31 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 66 6f 72  1) }.  } {1 {for
79d0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
79e0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 7d 0a 0a  int failed}}.}..
79f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
7a40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
7a50: 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 68 6f 73  k of tests, thos
7a60: 65 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  e prefixed with 
7a70: 22 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 22  "fkey2-genfkey."
7a80: 2c 20 61 72 65 20 0a 23 20 74 68 65 20 73 61 6d  , are .# the sam
7a90: 65 20 74 65 73 74 73 20 74 68 61 74 20 77 65 72  e tests that wer
7aa0: 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  e used to test t
7ab0: 68 65 20 22 2e 67 65 6e 66 6b 65 79 22 20 63 6f  he ".genfkey" co
7ac0: 6d 6d 61 6e 64 20 70 72 6f 76 69 64 65 64 20 0a  mmand provided .
7ad0: 23 20 62 79 20 74 68 65 20 73 68 65 6c 6c 20 74  # by the shell t
7ae0: 6f 6f 6c 2e 20 53 6f 20 74 68 65 73 65 20 74 65  ool. So these te
7af0: 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
7b00: 65 20 62 75 69 6c 74 2d 69 6e 20 66 6f 72 65 69  e built-in forei
7b10: 67 6e 20 6b 65 79 20 0a 23 20 69 6d 70 6c 65 6d  gn key .# implem
7b20: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  entation is more
7b30: 20 6f 72 20 6c 65 73 73 20 63 6f 6d 70 61 74 69   or less compati
7b40: 62 6c 65 20 77 69 74 68 20 74 68 65 20 74 72 69  ble with the tri
7b50: 67 67 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  ggers generated 
7b60: 0a 23 20 62 79 20 67 65 6e 66 6b 65 79 2e 0a 23  .# by genfkey..#
7b70: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
7b80: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
7b90: 65 6e 66 6b 65 79 2e 31 2e 31 20 7b 0a 20 20 65  enfkey.1.1 {.  e
7ba0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
7bb0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
7bc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7bd0: 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45  EY, b, c, UNIQUE
7be0: 28 62 2c 20 63 29 29 3b 0a 20 20 20 20 43 52 45  (b, c));.    CRE
7bf0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 65 20 52  ATE TABLE t2(e R
7c00: 45 46 45 52 45 4e 43 45 53 20 74 31 2c 20 66 29  EFERENCES t1, f)
7c10: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7c20: 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 46  LE t3(g, h, i, F
7c30: 4f 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69  OREIGN KEY (h, i
7c40: 29 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 28  ) REFERENCES t1(
7c50: 62 2c 20 63 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  b, c));.  }.} {}
7c60: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
7c70: 65 6e 66 6b 65 79 2e 31 2e 32 20 7b 0a 20 20 63  enfkey.1.2 {.  c
7c80: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
7c90: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7ca0: 31 2c 20 32 29 20 7d 0a 7d 20 7b 31 20 7b 66 6f  1, 2) }.} {1 {fo
7cb0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
7cc0: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
7cd0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
7ce0: 6b 65 79 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  key.1.3 {.  exec
7cf0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
7d00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7d10: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
7d20: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7d30: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d  UES(1, 2);.  }.}
7d40: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   {}.do_test fkey
7d50: 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 34 20 7b 0a  2-genfkey.1.4 {.
7d60: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
7d70: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7d80: 53 28 4e 55 4c 4c 2c 20 33 29 20 7d 0a 7d 20 7b  S(NULL, 3) }.} {
7d90: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
7da0: 67 65 6e 66 6b 65 79 2e 31 2e 35 20 7b 0a 20 20  genfkey.1.5 {.  
7db0: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
7dc0: 45 20 74 32 20 53 45 54 20 65 20 3d 20 35 20 57  E t2 SET e = 5 W
7dd0: 48 45 52 45 20 65 20 49 53 20 4e 55 4c 4c 20 7d  HERE e IS NULL }
7de0: 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b  .} {1 {foreign k
7df0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
7e00: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
7e10: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 36  key2-genfkey.1.6
7e20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
7e30: 50 44 41 54 45 20 74 32 20 53 45 54 20 65 20 3d  PDATE t2 SET e =
7e40: 20 31 20 57 48 45 52 45 20 65 20 49 53 20 4e 55   1 WHERE e IS NU
7e50: 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  LL }.} {}.do_tes
7e60: 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e  t fkey2-genfkey.
7e70: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
7e80: 7b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  { UPDATE t2 SET 
7e90: 65 20 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 66  e = NULL WHERE f
7ea0: 20 3d 20 33 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   = 3 }.} {}.do_t
7eb0: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
7ec0: 79 2e 31 2e 38 20 7b 0a 20 20 63 61 74 63 68 73  y.1.8 {.  catchs
7ed0: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  ql { UPDATE t1 S
7ee0: 45 54 20 61 20 3d 20 31 30 20 7d 0a 7d 20 7b 31  ET a = 10 }.} {1
7ef0: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
7f00: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
7f10: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
7f20: 67 65 6e 66 6b 65 79 2e 31 2e 39 20 7b 0a 20 20  genfkey.1.9 {.  
7f30: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
7f40: 45 20 74 31 20 53 45 54 20 61 20 3d 20 4e 55 4c  E t1 SET a = NUL
7f50: 4c 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79  L }.} {1 {dataty
7f60: 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f  pe mismatch}}.do
7f70: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
7f80: 6b 65 79 2e 31 2e 31 30 20 7b 0a 20 20 63 61 74  key.1.10 {.  cat
7f90: 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  chsql { DELETE F
7fa0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 66  ROM t1 }.} {1 {f
7fb0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
7fc0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64  raint failed}}.d
7fd0: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
7fe0: 66 6b 65 79 2e 31 2e 31 31 20 7b 0a 20 20 65 78  fkey.1.11 {.  ex
7ff0: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  ecsql { UPDATE t
8000: 32 20 53 45 54 20 65 20 3d 20 4e 55 4c 4c 20 7d  2 SET e = NULL }
8010: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
8020: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 32  ey2-genfkey.1.12
8030: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
8040: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
8050: 54 20 61 20 3d 20 31 30 3b 0a 20 20 20 20 44 45  T a = 10;.    DE
8060: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
8070: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
8080: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
8090: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
80a0: 2e 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  .1.13 {.  execsq
80b0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
80c0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
80d0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
80e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
80f0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 4e 55   VALUES(1, 2, NU
8100: 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  LL);.    INSERT 
8110: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
8120: 2c 20 4e 55 4c 4c 2c 20 33 29 3b 0a 20 20 7d 0a  , NULL, 3);.  }.
8130: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  } {}.do_test fke
8140: 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 34 20  y2-genfkey.1.14 
8150: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
8160: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
8170: 4c 55 45 53 28 33 2c 20 31 2c 20 34 29 20 7d 0a  LUES(3, 1, 4) }.
8180: 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65  } {1 {foreign ke
8190: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  y constraint fai
81a0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  led}}.do_test fk
81b0: 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e 31 35  ey2-genfkey.1.15
81c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
81d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
81e0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20  t1 VALUES(1, 1, 
81f0: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
8200: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
8210: 20 31 2c 20 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d   1, 4);.  }.} {}
8220: 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67  .do_test fkey2-g
8230: 65 6e 66 6b 65 79 2e 31 2e 31 36 20 7b 0a 20 20  enfkey.1.16 {.  
8240: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
8250: 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  E FROM t1 }.} {1
8260: 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   {foreign key co
8270: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
8280: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
8290: 67 65 6e 66 6b 65 79 2e 31 2e 31 37 20 7b 0a 20  genfkey.1.17 {. 
82a0: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
82b0: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 31 30  TE t1 SET b = 10
82c0: 7d 0a 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20  }.} {1 {foreign 
82d0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
82e0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
82f0: 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 31 2e  fkey2-genfkey.1.
8300: 31 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  18 {.  execsql {
8310: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
8320: 20 3d 20 31 30 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74   = 10}.} {}.do_t
8330: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
8340: 79 2e 31 2e 31 39 20 7b 0a 20 20 63 61 74 63 68  y.1.19 {.  catch
8350: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 33 20  sql { UPDATE t3 
8360: 53 45 54 20 68 20 3d 20 27 68 65 6c 6c 6f 27 20  SET h = 'hello' 
8370: 57 48 45 52 45 20 69 20 3d 20 33 7d 0a 7d 20 7b  WHERE i = 3}.} {
8380: 31 20 7b 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  1 {foreign key c
8390: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
83a0: 7d 7d 0a 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62  }}..drop_all_tab
83b0: 6c 65 73 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79  les.do_test fkey
83c0: 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 31 20 7b 0a  2-genfkey.2.1 {.
83d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
83e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
83f0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
8400: 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49  Y KEY, b, c, UNI
8410: 51 55 45 28 62 2c 20 63 29 29 3b 0a 20 20 20 20  QUE(b, c));.    
8420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
8430: 65 20 52 45 46 45 52 45 4e 43 45 53 20 74 31 20  e REFERENCES t1 
8440: 4f 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44  ON UPDATE CASCAD
8450: 45 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  E ON DELETE CASC
8460: 41 44 45 2c 20 66 29 3b 0a 20 20 20 20 43 52 45  ADE, f);.    CRE
8470: 41 54 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20  ATE TABLE t3(g, 
8480: 68 2c 20 69 2c 20 0a 20 20 20 20 20 20 20 20 46  h, i, .        F
8490: 4f 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69  OREIGN KEY (h, i
84a0: 29 20 0a 20 20 20 20 20 20 20 20 52 45 46 45 52  ) .        REFER
84b0: 45 4e 43 45 53 20 74 31 28 62 2c 20 63 29 20 4f  ENCES t1(b, c) O
84c0: 4e 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45  N UPDATE CASCADE
84d0: 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41   ON DELETE CASCA
84e0: 44 45 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20  DE.    );.  }.} 
84f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32  {}.do_test fkey2
8500: 2d 67 65 6e 66 6b 65 79 2e 32 2e 32 20 7b 0a 20  -genfkey.2.2 {. 
8510: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
8520: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
8530: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
8540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8550: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36  1 VALUES(4, 5, 6
8560: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8570: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
8580: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'one');.    INSE
8590: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
85a0: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
85b0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66  }.} {}.do_test f
85c0: 6b 65 79 32 2d 67 65 6e 66 6b 65 79 2e 32 2e 33  key2-genfkey.2.3
85d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
85e0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
85f0: 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20 3d   a = 2 WHERE a =
8600: 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   1;.    SELECT *
8610: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
8620: 7b 32 20 6f 6e 65 20 34 20 66 6f 75 72 7d 0a 64  {2 one 4 four}.d
8630: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
8640: 66 6b 65 79 2e 32 2e 34 20 7b 0a 20 20 65 78 65  fkey.2.4 {.  exe
8650: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
8660: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
8670: 61 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43  a = 4;.    SELEC
8680: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
8690: 0a 7d 20 7b 32 20 6f 6e 65 7d 0a 0a 64 6f 5f 74  .} {2 one}..do_t
86a0: 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65  est fkey2-genfke
86b0: 79 2e 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  y.2.5 {.  execsq
86c0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
86d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 68  NTO t3 VALUES('h
86e0: 65 6c 6c 6f 27 2c 20 32 2c 20 33 29 3b 0a 20 20  ello', 2, 3);.  
86f0: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
8700: 63 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43  c = 2;.    SELEC
8710: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d  T * FROM t3;.  }
8720: 0a 7d 20 7b 68 65 6c 6c 6f 20 32 20 32 7d 0a 64  .} {hello 2 2}.d
8730: 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e  o_test fkey2-gen
8740: 66 6b 65 79 2e 32 2e 36 20 7b 0a 20 20 65 78 65  fkey.2.6 {.  exe
8750: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
8760: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  E FROM t1;.    S
8770: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
8780: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 72 6f 70 5f  .  }.} {}..drop_
8790: 61 6c 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 74 65  all_tables.do_te
87a0: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
87b0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
87c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
87d0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
87e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
87f0: 20 63 2c 20 55 4e 49 51 55 45 28 63 2c 20 62 29   c, UNIQUE(c, b)
8800: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
8810: 42 4c 45 20 74 32 28 65 20 52 45 46 45 52 45 4e  BLE t2(e REFEREN
8820: 43 45 53 20 74 31 20 4f 4e 20 55 50 44 41 54 45  CES t1 ON UPDATE
8830: 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45 4c   SET NULL ON DEL
8840: 45 54 45 20 53 45 54 20 4e 55 4c 4c 2c 20 66 29  ETE SET NULL, f)
8850: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8860: 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c 20 0a  LE t3(g, h, i, .
8870: 20 20 20 20 20 20 20 20 46 4f 52 45 49 47 4e 20          FOREIGN 
8880: 4b 45 59 20 28 68 2c 20 69 29 20 0a 20 20 20 20  KEY (h, i) .    
8890: 20 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 74      REFERENCES t
88a0: 31 28 62 2c 20 63 29 20 4f 4e 20 55 50 44 41 54  1(b, c) ON UPDAT
88b0: 45 20 53 45 54 20 4e 55 4c 4c 20 4f 4e 20 44 45  E SET NULL ON DE
88c0: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 0a 20 20  LETE SET NULL.  
88d0: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
88e0: 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65 6e 66  _test fkey2-genf
88f0: 6b 65 79 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63  key.3.2 {.  exec
8900: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
8910: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8920: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e  1, 2, 3);.    IN
8930: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8940: 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20  UES(4, 5, 6);.  
8950: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
8960: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
8970: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8980: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20  TO t2 VALUES(4, 
8990: 27 66 6f 75 72 27 29 3b 0a 20 20 7d 0a 7d 20 7b  'four');.  }.} {
89a0: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d  }.do_test fkey2-
89b0: 67 65 6e 66 6b 65 79 2e 33 2e 33 20 7b 0a 20 20  genfkey.3.3 {.  
89c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
89d0: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
89e0: 32 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  2 WHERE a = 1;. 
89f0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8a00: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f   t2;.  }.} {{} o
8a10: 6e 65 20 34 20 66 6f 75 72 7d 0a 64 6f 5f 74 65  ne 4 four}.do_te
8a20: 73 74 20 66 6b 65 79 32 2d 67 65 6e 66 6b 65 79  st fkey2-genfkey
8a30: 2e 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.4 {.  execsql
8a40: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
8a50: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
8a60: 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  4;.    SELECT * 
8a70: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
8a80: 7b 7d 20 6f 6e 65 20 7b 7d 20 66 6f 75 72 7d 0a  {} one {} four}.
8a90: 64 6f 5f 74 65 73 74 20 66 6b 65 79 32 2d 67 65  do_test fkey2-ge
8aa0: 6e 66 6b 65 79 2e 33 2e 35 20 7b 0a 20 20 65 78  nfkey.3.5 {.  ex
8ab0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
8ac0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
8ad0: 53 28 27 68 65 6c 6c 6f 27 2c 20 32 2c 20 33 29  S('hello', 2, 3)
8ae0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
8af0: 53 45 54 20 63 20 3d 20 32 3b 0a 20 20 20 20 53  SET c = 2;.    S
8b00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
8b10: 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20 7b 7d  .  }.} {hello {}
8b20: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65   {}}.do_test fke
8b30: 79 32 2d 67 65 6e 66 6b 65 79 2e 33 2e 36 20 7b  y2-genfkey.3.6 {
8b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8b50: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 68   UPDATE t3 SET h
8b60: 20 3d 20 32 2c 20 69 20 3d 20 32 3b 0a 20 20 20   = 2, i = 2;.   
8b70: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
8b80: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
8b90: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65  OM t3;.  }.} {he
8ba0: 6c 6c 6f 20 7b 7d 20 7b 7d 7d 0a 0a 66 69 6e 69  llo {} {}}..fini
8bb0: 73 68 5f 74 65 73 74 0a                          sh_test.