/ Hex Artifact Content
Login

Artifact b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f:


0000: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
0010: 20 73 71 6c 69 74 65 33 0a 0a 70 72 6f 63 20 64   sqlite3..proc d
0020: 6f 5f 74 65 73 74 20 7b 6e 61 6d 65 20 63 6d 64  o_test {name cmd
0030: 20 65 78 70 65 63 74 65 64 7d 20 7b 0a 20 20 70   expected} {.  p
0040: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22  uts -nonewline "
0050: 24 6e 61 6d 65 20 2e 2e 2e 22 0a 20 20 73 65 74  $name ...".  set
0060: 20 72 65 73 20 5b 75 70 6c 65 76 65 6c 20 24 63   res [uplevel $c
0070: 6d 64 5d 0a 20 20 69 66 20 7b 24 72 65 73 20 65  md].  if {$res e
0080: 71 20 24 65 78 70 65 63 74 65 64 7d 20 7b 0a 20  q $expected} {. 
0090: 20 20 20 70 75 74 73 20 4f 6b 0a 20 20 7d 20 65     puts Ok.  } e
00a0: 6c 73 65 20 7b 0a 20 20 20 20 70 75 74 73 20 45  lse {.    puts E
00b0: 72 72 6f 72 0a 20 20 20 20 70 75 74 73 20 22 20  rror.    puts " 
00c0: 20 47 6f 74 3a 20 24 72 65 73 22 0a 20 20 20 20   Got: $res".    
00d0: 70 75 74 73 20 22 20 20 45 78 70 65 63 74 65 64  puts "  Expected
00e0: 3a 20 24 65 78 70 65 63 74 65 64 22 0a 20 20 20  : $expected".   
00f0: 20 65 78 69 74 0a 20 20 7d 0a 7d 0a 0a 70 72 6f   exit.  }.}..pro
0100: 63 20 65 78 65 63 73 71 6c 20 7b 73 71 6c 7d 20  c execsql {sql} 
0110: 7b 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73  {.  uplevel [lis
0120: 74 20 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 0a  t db eval $sql].
0130: 7d 0a 0a 70 72 6f 63 20 63 61 74 63 68 73 71 6c  }..proc catchsql
0140: 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20 72   {sql} {.  set r
0150: 63 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65  c [catch {upleve
0160: 6c 20 5b 6c 69 73 74 20 64 62 20 65 76 61 6c 20  l [list db eval 
0170: 24 73 71 6c 5d 7d 20 6d 73 67 5d 0a 20 20 6c 69  $sql]} msg].  li
0180: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 0a 0a 66  st $rc $msg.}..f
0190: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
01a0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
01b0: 62 2e 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65  b.journal.sqlite
01c0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20  3 db test.db..# 
01d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
01e0: 73 74 73 20 2d 20 67 65 6e 66 6b 65 79 2d 31 2e  sts - genfkey-1.
01f0: 2a 20 2d 20 74 65 73 74 20 52 45 53 54 52 49 43  * - test RESTRIC
0200: 54 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  T foreign keys..
0210: 23 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65  #.do_test genfke
0220: 79 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  y-1.1 {.  execsq
0230: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0240: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
0250: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
0260: 2c 20 63 2c 20 55 4e 49 51 55 45 28 62 2c 20 63  , c, UNIQUE(b, c
0270: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ));.    CREATE T
0280: 41 42 4c 45 20 74 32 28 65 20 52 45 46 45 52 45  ABLE t2(e REFERE
0290: 4e 43 45 53 20 74 31 2c 20 66 29 3b 0a 20 20 20  NCES t1, f);.   
02a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
02b0: 28 67 2c 20 68 2c 20 69 2c 20 46 4f 52 45 49 47  (g, h, i, FOREIG
02c0: 4e 20 4b 45 59 20 28 68 2c 20 69 29 20 52 45 46  N KEY (h, i) REF
02d0: 45 52 45 4e 43 45 53 20 74 31 28 62 2c 20 63 29  ERENCES t1(b, c)
02e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
02f0: 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e 32 20  est genfkey-1.2 
0300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 5b 65 78 65  {.  execsql [exe
0310: 63 20 2e 2f 73 71 6c 69 74 65 33 20 74 65 73 74  c ./sqlite3 test
0320: 2e 64 62 20 2e 67 65 6e 66 6b 65 79 5d 0a 7d 20  .db .genfkey].} 
0330: 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b  {}.do_test genfk
0340: 65 79 2d 31 2e 33 20 7b 0a 20 20 63 61 74 63 68  ey-1.3 {.  catch
0350: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0360: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
0370: 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72  ) }.} {1 {constr
0380: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
0390: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e  _test genfkey-1.
03a0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
03b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
03c0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t1 VALUES(1, 2, 
03d0: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
03e0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
03f0: 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   2);.  }.} {}.do
0400: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e  _test genfkey-1.
0410: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0420: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0430: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 33 29 20 7d  ALUES(NULL, 3) }
0440: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65  .} {}.do_test ge
0450: 6e 66 6b 65 79 2d 31 2e 36 20 7b 0a 20 20 63 61  nfkey-1.6 {.  ca
0460: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
0470: 74 32 20 53 45 54 20 65 20 3d 20 35 20 57 48 45  t2 SET e = 5 WHE
0480: 52 45 20 65 20 49 53 20 4e 55 4c 4c 20 7d 0a 7d  RE e IS NULL }.}
0490: 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20   {1 {constraint 
04a0: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
04b0: 20 67 65 6e 66 6b 65 79 2d 31 2e 37 20 7b 0a 20   genfkey-1.7 {. 
04c0: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
04d0: 45 20 74 32 20 53 45 54 20 65 20 3d 20 31 20 57  E t2 SET e = 1 W
04e0: 48 45 52 45 20 65 20 49 53 20 4e 55 4c 4c 20 7d  HERE e IS NULL }
04f0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65  .} {}.do_test ge
0500: 6e 66 6b 65 79 2d 31 2e 38 20 7b 0a 20 20 65 78  nfkey-1.8 {.  ex
0510: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74  ecsql { UPDATE t
0520: 32 20 53 45 54 20 65 20 3d 20 4e 55 4c 4c 20 57  2 SET e = NULL W
0530: 48 45 52 45 20 66 20 3d 20 33 20 7d 0a 7d 20 7b  HERE f = 3 }.} {
0540: 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65  }.do_test genfke
0550: 79 2d 31 2e 39 20 7b 0a 20 20 63 61 74 63 68 73  y-1.9 {.  catchs
0560: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  ql { UPDATE t1 S
0570: 45 54 20 61 20 3d 20 31 30 20 7d 0a 7d 20 7b 31  ET a = 10 }.} {1
0580: 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   {constraint fai
0590: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 67 65  led}}.do_test ge
05a0: 6e 66 6b 65 79 2d 31 2e 39 61 20 7b 0a 20 20 63  nfkey-1.9a {.  c
05b0: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
05c0: 20 74 31 20 53 45 54 20 61 20 3d 20 4e 55 4c 4c   t1 SET a = NULL
05d0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79 70   }.} {1 {datatyp
05e0: 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f  e mismatch}}.do_
05f0: 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e 31  test genfkey-1.1
0600: 30 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  0 {.  catchsql {
0610: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
0620: 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69  }.} {1 {constrai
0630: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
0640: 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e 31 31  est genfkey-1.11
0650: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
0660: 50 44 41 54 45 20 74 32 20 53 45 54 20 65 20 3d  PDATE t2 SET e =
0670: 20 4e 55 4c 4c 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   NULL }.} {}.do_
0680: 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e 31  test genfkey-1.1
0690: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
06a0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
06b0: 45 54 20 61 20 3d 20 31 30 20 3b 0a 20 20 20 20  ET a = 10 ;.    
06c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
06d0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
06e0: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  t2;.  }.} {}..do
06f0: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e  _test genfkey-1.
0700: 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  13 {.  execsql {
0710: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0720: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e 55   t3 VALUES(1, NU
0730: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49  LL, NULL);.    I
0740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0750: 4c 55 45 53 28 31 2c 20 32 2c 20 4e 55 4c 4c 29  LUES(1, 2, NULL)
0760: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0770: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 4e  O t3 VALUES(1, N
0780: 55 4c 4c 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b  ULL, 3);.  }.} {
0790: 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65  }.do_test genfke
07a0: 79 2d 31 2e 31 34 20 7b 0a 20 20 63 61 74 63 68  y-1.14 {.  catch
07b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
07c0: 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20 31  O t3 VALUES(3, 1
07d0: 2c 20 34 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e  , 4) }.} {1 {con
07e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
07f0: 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65 79  .do_test genfkey
0800: 2d 31 2e 31 35 20 7b 0a 20 20 65 78 65 63 73 71  -1.15 {.  execsq
0810: 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  l { .    INSERT 
0820: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0830: 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53  , 1, 4);.    INS
0840: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
0850: 45 53 28 33 2c 20 31 2c 20 34 29 3b 0a 20 20 7d  ES(3, 1, 4);.  }
0860: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65  .} {}.do_test ge
0870: 6e 66 6b 65 79 2d 31 2e 31 36 20 7b 0a 20 20 63  nfkey-1.16 {.  c
0880: 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45  atchsql { DELETE
0890: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
08a0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
08b0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e  ed}}.do_test gen
08c0: 66 6b 65 79 2d 31 2e 31 37 20 7b 0a 20 20 63 61  fkey-1.17 {.  ca
08d0: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
08e0: 74 31 20 53 45 54 20 62 20 3d 20 31 30 7d 0a 7d  t1 SET b = 10}.}
08f0: 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20   {1 {constraint 
0900: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
0910: 20 67 65 6e 66 6b 65 79 2d 31 2e 31 38 20 7b 0a   genfkey-1.18 {.
0920: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
0930: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 31 30  TE t1 SET a = 10
0940: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67  }.} {}.do_test g
0950: 65 6e 66 6b 65 79 2d 31 2e 31 39 20 7b 0a 20 20  enfkey-1.19 {.  
0960: 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54  catchsql { UPDAT
0970: 45 20 74 33 20 53 45 54 20 68 20 3d 20 27 68 65  E t3 SET h = 'he
0980: 6c 6c 6f 27 20 57 48 45 52 45 20 69 20 3d 20 33  llo' WHERE i = 3
0990: 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69  }.} {1 {constrai
09a0: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 64 6f 5f  nt failed}}..do_
09b0: 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 31 2e 58  test genfkey-1.X
09c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
09d0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
09e0: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
09f0: 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t2;.    DROP TA
0a00: 42 4c 45 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE t3;.  }.} {}
0a10: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
0a20: 67 20 74 65 73 74 73 20 2d 20 67 65 6e 66 6b 65  g tests - genfke
0a30: 79 2d 32 2e 2a 20 2d 20 74 65 73 74 20 43 41 53  y-2.* - test CAS
0a40: 43 41 44 45 20 66 6f 72 65 69 67 6e 20 6b 65 79  CADE foreign key
0a50: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 67 65 6e  s..#.do_test gen
0a60: 66 6b 65 79 2d 32 2e 31 20 7b 0a 20 20 65 78 65  fkey-2.1 {.  exe
0a70: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0a80: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
0a90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0aa0: 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45 28 62  , b, c, UNIQUE(b
0ab0: 2c 20 63 29 29 3b 0a 20 20 20 20 43 52 45 41 54  , c));.    CREAT
0ac0: 45 20 54 41 42 4c 45 20 74 32 28 65 20 52 45 46  E TABLE t2(e REF
0ad0: 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20 55 50  ERENCES t1 ON UP
0ae0: 44 41 54 45 20 43 41 53 43 41 44 45 20 4f 4e 20  DATE CASCADE ON 
0af0: 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20  DELETE CASCADE, 
0b00: 66 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  f);.    CREATE T
0b10: 41 42 4c 45 20 74 33 28 67 2c 20 68 2c 20 69 2c  ABLE t3(g, h, i,
0b20: 20 0a 20 20 20 20 20 20 20 20 46 4f 52 45 49 47   .        FOREIG
0b30: 4e 20 4b 45 59 20 28 68 2c 20 69 29 20 0a 20 20  N KEY (h, i) .  
0b40: 20 20 20 20 20 20 52 45 46 45 52 45 4e 43 45 53        REFERENCES
0b50: 20 74 31 28 62 2c 20 63 29 20 4f 4e 20 55 50 44   t1(b, c) ON UPD
0b60: 41 54 45 20 43 41 53 43 41 44 45 20 4f 4e 20 44  ATE CASCADE ON D
0b70: 45 4c 45 54 45 20 43 41 53 43 41 44 45 0a 20 20  ELETE CASCADE.  
0b80: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f    );.  }.} {}.do
0b90: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 32 2e  _test genfkey-2.
0ba0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 5b 65  2 {.  execsql [e
0bb0: 78 65 63 20 2e 2f 73 71 6c 69 74 65 33 20 74 65  xec ./sqlite3 te
0bc0: 73 74 2e 64 62 20 2e 67 65 6e 66 6b 65 79 5d 0a  st.db .genfkey].
0bd0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e  } {}.do_test gen
0be0: 66 6b 65 79 2d 32 2e 33 20 7b 0a 20 20 65 78 65  fkey-2.3 {.  exe
0bf0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
0c00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0c10: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49  (1, 2, 3);.    I
0c20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0c30: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20  LUES(4, 5, 6);. 
0c40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0c50: 32 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  2 VALUES(1, 'one
0c60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0c70: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c  NTO t2 VALUES(4,
0c80: 20 27 66 6f 75 72 27 29 3b 0a 20 20 7d 0a 7d 20   'four');.  }.} 
0c90: 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b  {}.do_test genfk
0ca0: 65 79 2d 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  ey-2.4 {.  execs
0cb0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
0cc0: 74 31 20 53 45 54 20 61 20 3d 20 32 20 57 48 45  t1 SET a = 2 WHE
0cd0: 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45  RE a = 1;.    SE
0ce0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
0cf0: 20 20 7d 0a 7d 20 7b 32 20 6f 6e 65 20 34 20 66    }.} {2 one 4 f
0d00: 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e  our}.do_test gen
0d10: 66 6b 65 79 2d 32 2e 35 20 7b 0a 20 20 65 78 65  fkey-2.5 {.  exe
0d20: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
0d30: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
0d40: 61 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43  a = 4;.    SELEC
0d50: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
0d60: 0a 7d 20 7b 32 20 6f 6e 65 7d 0a 64 6f 5f 74 65  .} {2 one}.do_te
0d70: 73 74 20 67 65 6e 66 6b 65 79 2d 32 2e 36 20 7b  st genfkey-2.6 {
0d80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0d90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
0da0: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20  VALUES('hello', 
0db0: 32 2c 20 33 29 3b 0a 20 20 20 20 55 50 44 41 54  2, 3);.    UPDAT
0dc0: 45 20 74 31 20 53 45 54 20 63 20 3d 20 32 3b 0a  E t1 SET c = 2;.
0dd0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0de0: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c  M t3;.  }.} {hel
0df0: 6c 6f 20 32 20 32 7d 0a 64 6f 5f 74 65 73 74 20  lo 2 2}.do_test 
0e00: 67 65 6e 66 6b 65 79 2d 32 2e 37 20 7b 0a 20 20  genfkey-2.7 {.  
0e10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
0e20: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
0e30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0e40: 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  t3;.  }.} {}.do_
0e50: 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 32 2e 58  test genfkey-2.X
0e60: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0e70: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
0e80: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
0e90: 20 74 32 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t2;.    DROP TA
0ea0: 42 4c 45 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE t3;.  }.} {}
0eb0: 0a 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ...# The followi
0ec0: 6e 67 20 74 65 73 74 73 20 2d 20 67 65 6e 66 6b  ng tests - genfk
0ed0: 65 79 2d 33 2e 2a 20 2d 20 74 65 73 74 20 53 45  ey-3.* - test SE
0ee0: 54 20 4e 55 4c 4c 20 66 6f 72 65 69 67 6e 20 6b  T NULL foreign k
0ef0: 65 79 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 67  eys..#.do_test g
0f00: 65 6e 66 6b 65 79 2d 33 2e 31 20 7b 0a 20 20 65  enfkey-3.1 {.  e
0f10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
0f20: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
0f30: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0f40: 45 59 2c 20 62 2c 20 63 2c 20 55 4e 49 51 55 45  EY, b, c, UNIQUE
0f50: 28 63 2c 20 62 29 29 3b 0a 20 20 20 20 43 52 45  (c, b));.    CRE
0f60: 41 54 45 20 54 41 42 4c 45 20 74 32 28 65 20 52  ATE TABLE t2(e R
0f70: 45 46 45 52 45 4e 43 45 53 20 74 31 20 4f 4e 20  EFERENCES t1 ON 
0f80: 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c 20  UPDATE SET NULL 
0f90: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e 55  ON DELETE SET NU
0fa0: 4c 4c 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41  LL, f);.    CREA
0fb0: 54 45 20 54 41 42 4c 45 20 74 33 28 67 2c 20 68  TE TABLE t3(g, h
0fc0: 2c 20 69 2c 20 0a 20 20 20 20 20 20 20 20 46 4f  , i, .        FO
0fd0: 52 45 49 47 4e 20 4b 45 59 20 28 68 2c 20 69 29  REIGN KEY (h, i)
0fe0: 20 0a 20 20 20 20 20 20 20 20 52 45 46 45 52 45   .        REFERE
0ff0: 4e 43 45 53 20 74 31 28 62 2c 20 63 29 20 4f 4e  NCES t1(b, c) ON
1000: 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c 4c   UPDATE SET NULL
1010: 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 4e   ON DELETE SET N
1020: 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  ULL.    );.  }.}
1030: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66   {}.do_test genf
1040: 6b 65 79 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63  key-3.2 {.  exec
1050: 73 71 6c 20 5b 65 78 65 63 20 2e 2f 73 71 6c 69  sql [exec ./sqli
1060: 74 65 33 20 74 65 73 74 2e 64 62 20 2e 67 65 6e  te3 test.db .gen
1070: 66 6b 65 79 5d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  fkey].} {}.do_te
1080: 73 74 20 67 65 6e 66 6b 65 79 2d 33 2e 33 20 7b  st genfkey-3.3 {
1090: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
10b0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
10c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10d0: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c   t1 VALUES(4, 5,
10e0: 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   6);.    INSERT 
10f0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
1100: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e  , 'one');.    IN
1110: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1120: 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a  UES(4, 'four');.
1130: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
1140: 20 67 65 6e 66 6b 65 79 2d 33 2e 34 20 7b 0a 20   genfkey-3.4 {. 
1150: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
1160: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
1170: 20 32 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a   2 WHERE a = 1;.
1180: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1190: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  M t2;.  }.} {{} 
11a0: 6f 6e 65 20 34 20 66 6f 75 72 7d 0a 64 6f 5f 74  one 4 four}.do_t
11b0: 65 73 74 20 67 65 6e 66 6b 65 79 2d 33 2e 35 20  est genfkey-3.5 
11c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11d0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
11e0: 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20   WHERE a = 4;.  
11f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1200: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 6f 6e  t2;.  }.} {{} on
1210: 65 20 7b 7d 20 66 6f 75 72 7d 0a 64 6f 5f 74 65  e {} four}.do_te
1220: 73 74 20 67 65 6e 66 6b 65 79 2d 33 2e 36 20 7b  st genfkey-3.6 {
1230: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1240: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
1250: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20  VALUES('hello', 
1260: 32 2c 20 33 29 3b 0a 20 20 20 20 55 50 44 41 54  2, 3);.    UPDAT
1270: 45 20 74 31 20 53 45 54 20 63 20 3d 20 32 3b 0a  E t1 SET c = 2;.
1280: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1290: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c  M t3;.  }.} {hel
12a0: 6c 6f 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  lo {} {}}.do_tes
12b0: 74 20 67 65 6e 66 6b 65 79 2d 32 2e 37 20 7b 0a  t genfkey-2.7 {.
12c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
12d0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 68 20  UPDATE t3 SET h 
12e0: 3d 20 32 2c 20 69 20 3d 20 32 3b 0a 20 20 20 20  = 2, i = 2;.    
12f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
1300: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1310: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c  M t3;.  }.} {hel
1320: 6c 6f 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  lo {} {}}.do_tes
1330: 74 20 67 65 6e 66 6b 65 79 2d 33 2e 58 20 7b 0a  t genfkey-3.X {.
1340: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1350: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
1360: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32     DROP TABLE t2
1370: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
1380: 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23   t3;.  }.} {}..#
1390: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
13a0: 65 73 74 73 20 2d 20 67 65 6e 66 6b 65 79 2d 34  ests - genfkey-4
13b0: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 65  .* - test that e
13c0: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 63 68  rrors in the sch
13d0: 65 6d 61 0a 23 20 61 72 65 20 64 65 74 65 63 74  ema.# are detect
13e0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a  ed correctly..#.
13f0: 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d  do_test genfkey-
1400: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
1410: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1420: 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43  LE t1(a REFERENC
1430: 45 53 20 6e 6f 73 75 63 68 74 61 62 6c 65 2c 20  ES nosuchtable, 
1440: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
1450: 41 42 4c 45 20 74 32 28 61 20 52 45 46 45 52 45  ABLE t2(a REFERE
1460: 4e 43 45 53 20 74 31 2c 20 62 29 3b 0a 0a 20 20  NCES t1, b);..  
1470: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1480: 33 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41  3(a, b, c, PRIMA
1490: 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20  RY KEY(a, b));. 
14a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14b0: 74 34 28 61 2c 20 62 2c 20 63 2c 20 46 4f 52 45  t4(a, b, c, FORE
14c0: 49 47 4e 20 4b 45 59 28 63 2c 20 62 29 20 52 45  IGN KEY(c, b) RE
14d0: 46 45 52 45 4e 43 45 53 20 74 33 29 3b 0a 0a 20  FERENCES t3);.. 
14e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
14f0: 74 35 28 61 20 52 45 46 45 52 45 4e 43 45 53 20  t5(a REFERENCES 
1500: 74 34 28 64 29 2c 20 62 2c 20 63 29 3b 0a 20 20  t4(d), b, c);.  
1510: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1520: 36 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  6(a REFERENCES t
1530: 34 28 61 29 2c 20 62 2c 20 63 29 3b 0a 20 20 20  4(a), b, c);.   
1540: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
1550: 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74 33  (a REFERENCES t3
1560: 28 61 29 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  (a), b, c);.    
1570: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28  CREATE TABLE t8(
1580: 61 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6f 73  a REFERENCES nos
1590: 75 63 68 74 61 62 6c 65 28 61 29 2c 20 62 2c 20  uchtable(a), b, 
15a0: 63 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  c);.  }.} {}..do
15b0: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 34 2e  _test genfkey-4.
15c0: 58 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61  X {.  set rc [ca
15d0: 74 63 68 20 7b 65 78 65 63 20 2e 2f 73 71 6c 69  tch {exec ./sqli
15e0: 74 65 33 20 74 65 73 74 2e 64 62 20 2e 67 65 6e  te3 test.db .gen
15f0: 66 6b 65 79 7d 20 6d 73 67 5d 0a 20 20 6c 69 73  fkey} msg].  lis
1600: 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 22 31 20  t $rc $msg.} "1 
1610: 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a  {[string trim {.
1620: 45 72 72 6f 72 20 69 6e 20 74 61 62 6c 65 20 74  Error in table t
1630: 35 3a 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  5: foreign key c
1640: 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
1650: 69 73 74 0a 45 72 72 6f 72 20 69 6e 20 74 61 62  ist.Error in tab
1660: 6c 65 20 74 38 3a 20 66 6f 72 65 69 67 6e 20 6b  le t8: foreign k
1670: 65 79 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f  ey columns do no
1680: 74 20 65 78 69 73 74 0a 45 72 72 6f 72 20 69 6e  t exist.Error in
1690: 20 74 61 62 6c 65 20 74 34 3a 20 69 6d 70 6c 69   table t4: impli
16a0: 63 69 74 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  cit mapping to c
16b0: 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79  omposite primary
16c0: 20 6b 65 79 0a 45 72 72 6f 72 20 69 6e 20 74 61   key.Error in ta
16d0: 62 6c 65 20 74 31 3a 20 69 6d 70 6c 69 63 69 74  ble t1: implicit
16e0: 20 6d 61 70 70 69 6e 67 20 74 6f 20 6e 6f 6e 2d   mapping to non-
16f0: 65 78 69 73 74 61 6e 74 20 70 72 69 6d 61 72 79  existant primary
1700: 20 6b 65 79 0a 45 72 72 6f 72 20 69 6e 20 74 61   key.Error in ta
1710: 62 6c 65 20 74 32 3a 20 69 6d 70 6c 69 63 69 74  ble t2: implicit
1720: 20 6d 61 70 70 69 6e 67 20 74 6f 20 6e 6f 6e 2d   mapping to non-
1730: 65 78 69 73 74 61 6e 74 20 70 72 69 6d 61 72 79  existant primary
1740: 20 6b 65 79 0a 45 72 72 6f 72 20 69 6e 20 74 61   key.Error in ta
1750: 62 6c 65 20 74 36 3a 20 66 6f 72 65 69 67 6e 20  ble t6: foreign 
1760: 6b 65 79 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  key is not uniqu
1770: 65 0a 45 72 72 6f 72 20 69 6e 20 74 61 62 6c 65  e.Error in table
1780: 20 74 37 3a 20 66 6f 72 65 69 67 6e 20 6b 65 79   t7: foreign key
1790: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 0a 7d   is not unique.}
17a0: 5d 7d 22 0a 0a 23 20 54 65 73 74 20 74 68 61 74  ]}"..# Test that
17b0: 20 74 69 63 6b 65 74 20 23 33 38 30 30 20 68 61   ticket #3800 ha
17c0: 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  s been resolved.
17d0: 0a 23 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b  .#.do_test genfk
17e0: 65 79 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  ey-5.1 {.  execs
17f0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
1800: 42 4c 45 20 74 31 3b 20 44 52 4f 50 20 54 41 42  BLE t1; DROP TAB
1810: 4c 45 20 74 32 3b 20 44 52 4f 50 20 54 41 42 4c  LE t2; DROP TABL
1820: 45 20 74 33 3b 0a 20 20 20 20 44 52 4f 50 20 54  E t3;.    DROP T
1830: 41 42 4c 45 20 74 34 3b 20 44 52 4f 50 20 54 41  ABLE t4; DROP TA
1840: 42 4c 45 20 74 35 3b 20 44 52 4f 50 20 54 41 42  BLE t5; DROP TAB
1850: 4c 45 20 74 36 3b 0a 20 20 20 20 44 52 4f 50 20  LE t6;.    DROP 
1860: 54 41 42 4c 45 20 74 37 3b 20 44 52 4f 50 20 54  TABLE t7; DROP T
1870: 41 42 4c 45 20 74 38 3b 0a 20 20 7d 0a 7d 20 7b  ABLE t8;.  }.} {
1880: 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65  }.do_test genfke
1890: 79 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  y-5.2 {.  execsq
18a0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
18b0: 41 42 4c 45 20 22 74 2e 33 22 20 28 63 31 20 50  ABLE "t.3" (c1 P
18c0: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
18d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
18e0: 33 20 28 63 31 2c 20 66 6f 72 65 69 67 6e 20 6b  3 (c1, foreign k
18f0: 65 79 28 63 31 29 20 72 65 66 65 72 65 6e 63 65  ey(c1) reference
1900: 73 20 22 74 2e 33 22 28 63 31 29 29 3b 0a 20 20  s "t.3"(c1));.  
1910: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67  }.} {}.do_test g
1920: 65 6e 66 6b 65 79 2d 35 2e 33 20 7b 0a 20 20 73  enfkey-5.3 {.  s
1930: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 65 78  et rc [catch {ex
1940: 65 63 20 2e 2f 73 71 6c 69 74 65 33 20 74 65 73  ec ./sqlite3 tes
1950: 74 2e 64 62 20 2e 67 65 6e 66 6b 65 79 7d 20 6d  t.db .genfkey} m
1960: 73 67 5d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  sg].} {0}.do_tes
1970: 74 20 67 65 6e 66 6b 65 79 2d 35 2e 34 20 7b 0a  t genfkey-5.4 {.
1980: 20 20 64 62 20 65 76 61 6c 20 24 6d 73 67 0a 7d    db eval $msg.}
1990: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66   {}.do_test genf
19a0: 6b 65 79 2d 35 2e 35 20 7b 0a 20 20 63 61 74 63  key-5.5 {.  catc
19b0: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
19c0: 54 4f 20 74 31 33 20 56 41 4c 55 45 53 28 31 29  TO t13 VALUES(1)
19d0: 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61   }.} {1 {constra
19e0: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
19f0: 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 35 2e 35  test genfkey-5.5
1a00: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
1a10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1a20: 20 22 74 2e 33 22 20 56 41 4c 55 45 53 28 31 29   "t.3" VALUES(1)
1a30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1a40: 4f 20 74 31 33 20 56 41 4c 55 45 53 28 31 29 3b  O t13 VALUES(1);
1a50: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 23  .  }.} {0 {}}..#
1a60: 20 54 65 73 74 20 61 6c 73 6f 20 63 6f 6c 75 6d   Test also colum
1a70: 6e 20 6e 61 6d 65 73 20 74 68 61 74 20 72 65 71  n names that req
1a80: 75 69 72 65 20 71 75 6f 74 69 6e 67 2e 0a 64 6f  uire quoting..do
1a90: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 36 2e  _test genfkey-6.
1aa0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1ab0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 22      DROP TABLE "
1ac0: 74 2e 33 22 3b 0a 20 20 20 20 44 52 4f 50 20 54  t.3";.    DROP T
1ad0: 41 42 4c 45 20 74 31 33 3b 0a 20 20 20 20 43 52  ABLE t13;.    CR
1ae0: 45 41 54 45 20 54 41 42 4c 45 20 70 28 0a 20 20  EATE TABLE p(.  
1af0: 20 20 20 20 22 61 2e 31 20 66 69 72 73 74 22 2c      "a.1 first",
1b00: 20 22 62 2e 32 20 73 65 63 6f 6e 64 22 2c 20 0a   "b.2 second", .
1b10: 20 20 20 20 20 20 55 4e 49 51 55 45 28 22 61 2e        UNIQUE("a.
1b20: 31 20 66 69 72 73 74 22 2c 20 22 62 2e 32 20 73  1 first", "b.2 s
1b30: 65 63 6f 6e 64 22 29 0a 20 20 20 20 29 3b 0a 20  econd").    );. 
1b40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1b50: 63 28 0a 20 20 20 20 20 20 22 63 2e 31 20 49 22  c(.      "c.1 I"
1b60: 2c 20 22 64 2e 32 20 49 49 22 2c 20 0a 20 20 20  , "d.2 II", .   
1b70: 20 20 20 20 20 46 4f 52 45 49 47 4e 20 4b 45 59       FOREIGN KEY
1b80: 28 22 63 2e 31 20 49 22 2c 20 22 64 2e 32 20 49  ("c.1 I", "d.2 I
1b90: 49 22 29 20 0a 20 20 20 20 20 20 20 20 52 45 46  I") .        REF
1ba0: 45 52 45 4e 43 45 53 20 70 28 22 61 2e 31 20 66  ERENCES p("a.1 f
1bb0: 69 72 73 74 22 2c 20 22 62 2e 32 20 73 65 63 6f  irst", "b.2 seco
1bc0: 6e 64 22 29 0a 20 20 20 20 20 20 20 20 4f 4e 20  nd").        ON 
1bd0: 55 50 44 41 54 45 20 43 41 53 43 41 44 45 20 4f  UPDATE CASCADE O
1be0: 4e 20 44 45 4c 45 54 45 20 43 41 53 43 41 44 45  N DELETE CASCADE
1bf0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  .    );.  }.} {}
1c00: 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65 79  .do_test genfkey
1c10: 2d 36 2e 32 20 7b 0a 20 20 73 65 74 20 72 63 20  -6.2 {.  set rc 
1c20: 5b 63 61 74 63 68 20 7b 65 78 65 63 20 2e 2f 73  [catch {exec ./s
1c30: 71 6c 69 74 65 33 20 74 65 73 74 2e 64 62 20 2e  qlite3 test.db .
1c40: 67 65 6e 66 6b 65 79 7d 20 6d 73 67 5d 0a 7d 20  genfkey} msg].} 
1c50: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66  {0}.do_test genf
1c60: 6b 65 79 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63  key-6.3 {.  exec
1c70: 73 71 6c 20 24 6d 73 67 0a 20 20 65 78 65 63 73  sql $msg.  execs
1c80: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
1c90: 49 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 41  INTO p VALUES('A
1ca0: 27 2c 20 27 42 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'B');.    INS
1cb0: 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55 45  ERT INTO p VALUE
1cc0: 53 28 27 43 27 2c 20 27 44 27 29 3b 0a 20 20 20  S('C', 'D');.   
1cd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56   INSERT INTO c V
1ce0: 41 4c 55 45 53 28 27 41 27 2c 20 27 42 27 29 3b  ALUES('A', 'B');
1cf0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1d00: 20 63 20 56 41 4c 55 45 53 28 27 43 27 2c 20 27   c VALUES('C', '
1d10: 44 27 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  D');.    UPDATE 
1d20: 70 20 53 45 54 20 22 61 2e 31 20 66 69 72 73 74  p SET "a.1 first
1d30: 22 20 3d 20 27 58 27 20 57 48 45 52 45 20 72 6f  " = 'X' WHERE ro
1d40: 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c  wid = 1;.    DEL
1d50: 45 54 45 20 46 52 4f 4d 20 70 20 57 48 45 52 45  ETE FROM p WHERE
1d60: 20 72 6f 77 69 64 20 3d 20 32 3b 0a 20 20 7d 0a   rowid = 2;.  }.
1d70: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1d80: 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20  CT * FROM c }.} 
1d90: 7b 58 20 42 7d 0a 0a 64 6f 5f 74 65 73 74 20 67  {X B}..do_test g
1da0: 65 6e 66 6b 65 79 2d 36 2e 34 20 7b 0a 20 20 65  enfkey-6.4 {.  e
1db0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
1dc0: 50 20 54 41 42 4c 45 20 70 3b 0a 20 20 20 20 44  P TABLE p;.    D
1dd0: 52 4f 50 20 54 41 42 4c 45 20 63 3b 0a 20 20 20  ROP TABLE c;.   
1de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 61   CREATE TABLE pa
1df0: 72 65 6e 74 28 22 61 2e 31 22 2c 20 50 52 49 4d  rent("a.1", PRIM
1e00: 41 52 59 20 4b 45 59 28 22 61 2e 31 22 29 29 3b  ARY KEY("a.1"));
1e10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1e20: 45 20 63 68 69 6c 64 28 22 62 2e 32 22 2c 20 46  E child("b.2", F
1e30: 4f 52 45 49 47 4e 20 4b 45 59 28 22 62 2e 32 22  OREIGN KEY("b.2"
1e40: 29 20 52 45 46 45 52 45 4e 43 45 53 20 70 61 72  ) REFERENCES par
1e50: 65 6e 74 28 22 61 2e 31 22 29 29 3b 0a 20 20 7d  ent("a.1"));.  }
1e60: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
1e70: 20 7b 65 78 65 63 20 2e 2f 73 71 6c 69 74 65 33   {exec ./sqlite3
1e80: 20 74 65 73 74 2e 64 62 20 2e 67 65 6e 66 6b 65   test.db .genfke
1e90: 79 7d 20 6d 73 67 5d 0a 7d 20 7b 30 7d 0a 64 6f  y} msg].} {0}.do
1ea0: 5f 74 65 73 74 20 67 65 6e 66 6b 65 79 2d 36 2e  _test genfkey-6.
1eb0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 6d  5 {.  execsql $m
1ec0: 73 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  sg.  execsql {. 
1ed0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
1ee0: 61 72 65 6e 74 20 56 41 4c 55 45 53 28 31 29 3b  arent VALUES(1);
1ef0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1f00: 20 63 68 69 6c 64 20 56 41 4c 55 45 53 28 31 29   child VALUES(1)
1f10: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
1f20: 20 7b 20 55 50 44 41 54 45 20 70 61 72 65 6e 74   { UPDATE parent
1f30: 20 53 45 54 20 22 61 2e 31 22 3d 30 20 7d 0a 7d   SET "a.1"=0 }.}
1f40: 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20   {1 {constraint 
1f50: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  failed}}.do_test
1f60: 20 67 65 6e 66 6b 65 79 2d 36 2e 36 20 7b 0a 20   genfkey-6.6 {. 
1f70: 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41   catchsql { UPDA
1f80: 54 45 20 63 68 69 6c 64 20 53 45 54 20 22 62 2e  TE child SET "b.
1f90: 32 22 3d 37 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e  2"=7 }.} {1 {con
1fa0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
1fb0: 0a 64 6f 5f 74 65 73 74 20 67 65 6e 66 6b 65 79  .do_test genfkey
1fc0: 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.7 {.  execsql
1fd0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1fe0: 46 52 4f 4d 20 70 61 72 65 6e 74 3b 0a 20 20 20  FROM parent;.   
1ff0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
2000: 68 69 6c 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31  hild;.  }.} {1 1
2010: 7d 0a                                            }.