/ Hex Artifact Content
Login

Artifact 863c6d84f0d289fd2c1a1c293abb9803f77efd35211d9012c0986c8f6ccf5d5a:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 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 73 65 74 20 74 65 73 74 70  er.tcl.set testp
0220: 72 65 66 69 78 20 66 6b 65 79 38 0a 0a 69 66 63  refix fkey8..ifc
0230: 61 70 61 62 6c 65 20 7b 21 66 6f 72 65 69 67 6e  apable {!foreign
0240: 6b 65 79 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f  key} {.  finish_
0250: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
0260: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0270: 31 2e 30 20 7b 20 50 52 41 47 4d 41 20 66 6f 72  1.0 { PRAGMA for
0280: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b 20 7d  eign_keys = 1; }
0290: 0a 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 75  ...foreach {tn u
02a0: 73 65 5f 73 74 6d 74 20 73 71 6c 20 73 63 68 65  se_stmt sql sche
02b0: 6d 61 7d 20 7b 0a 20 20 31 20 20 20 31 20 22 44  ma} {.  1   1 "D
02c0: 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 22 20 7b  ELETE FROM p1" {
02d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
02e0: 45 20 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E p1(a PRIMARY K
02f0: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
0300: 54 41 42 4c 45 20 63 31 28 62 20 52 45 46 45 52  TABLE c1(b REFER
0310: 45 4e 43 45 53 20 70 31 29 3b 0a 20 20 7d 0a 0a  ENCES p1);.  }..
0320: 20 20 32 2e 31 20 20 20 20 20 30 20 22 44 45 4c    2.1     0 "DEL
0330: 45 54 45 20 46 52 4f 4d 20 70 31 22 20 7b 0a 20  ETE FROM p1" {. 
0340: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0350: 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p1(a PRIMARY KEY
0360: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
0370: 42 4c 45 20 63 31 28 62 20 52 45 46 45 52 45 4e  BLE c1(b REFEREN
0380: 43 45 53 20 70 31 20 4f 4e 20 44 45 4c 45 54 45  CES p1 ON DELETE
0390: 20 43 41 53 43 41 44 45 29 3b 0a 20 20 7d 0a 20   CASCADE);.  }. 
03a0: 20 32 2e 32 20 20 20 30 20 22 44 45 4c 45 54 45   2.2   0 "DELETE
03b0: 20 46 52 4f 4d 20 70 31 22 20 7b 0a 20 20 20 20   FROM p1" {.    
03c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 31 28  CREATE TABLE p1(
03d0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  a PRIMARY KEY);.
03e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
03f0: 20 63 31 28 62 20 52 45 46 45 52 45 4e 43 45 53   c1(b REFERENCES
0400: 20 70 31 20 4f 4e 20 44 45 4c 45 54 45 20 53 45   p1 ON DELETE SE
0410: 54 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 32  T NULL);.  }.  2
0420: 2e 33 20 20 20 31 20 22 44 45 4c 45 54 45 20 46  .3   1 "DELETE F
0430: 52 4f 4d 20 70 31 22 20 7b 0a 20 20 20 20 43 52  ROM p1" {.    CR
0440: 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 20  EATE TABLE p1(a 
0450: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
0460: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
0470: 31 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(b REFERENCES p
0480: 31 20 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20  1 ON DELETE SET 
0490: 44 45 46 41 55 4c 54 29 3b 0a 20 20 7d 0a 0a 20  DEFAULT);.  }.. 
04a0: 20 33 20 20 20 31 20 22 44 45 4c 45 54 45 20 46   3   1 "DELETE F
04b0: 52 4f 4d 20 70 31 22 20 7b 0a 20 20 20 20 43 52  ROM p1" {.    CR
04c0: 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 20  EATE TABLE p1(a 
04d0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
04e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
04f0: 31 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(b REFERENCES p
0500: 31 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  1 ON DELETE CASC
0510: 41 44 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ADE);.    CREATE
0520: 20 54 52 49 47 47 45 52 20 63 74 31 20 41 46 54   TRIGGER ct1 AFT
0530: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 63 31 20  ER DELETE ON c1 
0540: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0550: 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45  RT INTO p1 VALUE
0560: 53 28 27 78 27 29 3b 0a 20 20 20 20 45 4e 44 3b  S('x');.    END;
0570: 0a 20 20 7d 0a 0a 20 20 34 20 20 20 31 20 22 44  .  }..  4   1 "D
0580: 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 22 20 7b  ELETE FROM p1" {
0590: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
05a0: 45 20 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E p1(a PRIMARY K
05b0: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
05c0: 54 41 42 4c 45 20 63 31 28 62 20 52 45 46 45 52  TABLE c1(b REFER
05d0: 45 4e 43 45 53 20 70 31 20 4f 4e 20 44 45 4c 45  ENCES p1 ON DELE
05e0: 54 45 20 43 41 53 43 41 44 45 2c 20 63 20 50 52  TE CASCADE, c PR
05f0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
0600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 31  CREATE TABLE cc1
0610: 28 64 20 52 45 46 45 52 45 4e 43 45 53 20 63 31  (d REFERENCES c1
0620: 29 3b 0a 20 20 7d 0a 0a 20 20 35 2e 31 20 20 20  );.  }..  5.1   
0630: 30 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 70  0 "DELETE FROM p
0640: 31 22 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  1" {.    CREATE 
0650: 54 41 42 4c 45 20 70 31 28 61 20 50 52 49 4d 41  TABLE p1(a PRIMA
0660: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43 52 45  RY KEY);.    CRE
0670: 41 54 45 20 54 41 42 4c 45 20 63 31 28 62 20 52  ATE TABLE c1(b R
0680: 45 46 45 52 45 4e 43 45 53 20 70 31 20 4f 4e 20  EFERENCES p1 ON 
0690: 44 45 4c 45 54 45 20 43 41 53 43 41 44 45 2c 20  DELETE CASCADE, 
06a0: 63 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  c PRIMARY KEY);.
06b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
06c0: 20 63 63 31 28 64 20 52 45 46 45 52 45 4e 43 45   cc1(d REFERENCE
06d0: 53 20 63 31 20 4f 4e 20 44 45 4c 45 54 45 20 43  S c1 ON DELETE C
06e0: 41 53 43 41 44 45 29 3b 0a 20 20 7d 0a 20 20 35  ASCADE);.  }.  5
06f0: 2e 32 20 20 20 30 20 22 44 45 4c 45 54 45 20 46  .2   0 "DELETE F
0700: 52 4f 4d 20 70 31 22 20 7b 0a 20 20 20 20 43 52  ROM p1" {.    CR
0710: 45 41 54 45 20 54 41 42 4c 45 20 70 31 28 61 20  EATE TABLE p1(a 
0720: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
0730: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
0740: 31 28 62 20 52 45 46 45 52 45 4e 43 45 53 20 70  1(b REFERENCES p
0750: 31 20 4f 4e 20 44 45 4c 45 54 45 20 43 41 53 43  1 ON DELETE CASC
0760: 41 44 45 2c 20 63 20 50 52 49 4d 41 52 59 20 4b  ADE, c PRIMARY K
0770: 45 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  EY);.    CREATE 
0780: 54 41 42 4c 45 20 63 63 31 28 64 20 52 45 46 45  TABLE cc1(d REFE
0790: 52 45 4e 43 45 53 20 63 31 20 4f 4e 20 44 45 4c  RENCES c1 ON DEL
07a0: 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a 20  ETE SET NULL);. 
07b0: 20 7d 0a 20 20 35 2e 33 20 20 20 31 20 22 44 45   }.  5.3   1 "DE
07c0: 4c 45 54 45 20 46 52 4f 4d 20 70 31 22 20 7b 0a  LETE FROM p1" {.
07d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
07e0: 20 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   p1(a PRIMARY KE
07f0: 59 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  Y);.    CREATE T
0800: 41 42 4c 45 20 63 31 28 62 20 52 45 46 45 52 45  ABLE c1(b REFERE
0810: 4e 43 45 53 20 70 31 20 4f 4e 20 44 45 4c 45 54  NCES p1 ON DELET
0820: 45 20 43 41 53 43 41 44 45 2c 20 63 20 50 52 49  E CASCADE, c PRI
0830: 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 43  MARY KEY);.    C
0840: 52 45 41 54 45 20 54 41 42 4c 45 20 63 63 31 28  REATE TABLE cc1(
0850: 64 20 52 45 46 45 52 45 4e 43 45 53 20 63 31 20  d REFERENCES c1 
0860: 4f 4e 20 44 45 4c 45 54 45 20 53 45 54 20 44 45  ON DELETE SET DE
0870: 46 41 55 4c 54 29 3b 0a 20 20 7d 0a 0a 20 20 36  FAULT);.  }..  6
0880: 2e 31 20 20 20 31 20 22 55 50 44 41 54 45 20 70  .1   1 "UPDATE p
0890: 31 20 53 45 54 20 61 20 3d 20 3f 22 20 7b 0a 20  1 SET a = ?" {. 
08a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
08b0: 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p1(a PRIMARY KEY
08c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
08d0: 42 4c 45 20 63 31 28 62 20 52 45 46 45 52 45 4e  BLE c1(b REFEREN
08e0: 43 45 53 20 70 31 20 4f 4e 20 55 50 44 41 54 45  CES p1 ON UPDATE
08f0: 20 53 45 54 20 4e 55 4c 4c 2c 20 63 29 3b 0a 20   SET NULL, c);. 
0900: 20 7d 0a 20 20 36 2e 32 20 20 20 30 20 22 55 50   }.  6.2   0 "UP
0910: 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45 20 70  DATE OR IGNORE p
0920: 31 20 53 45 54 20 61 20 3d 20 3f 22 20 7b 0a 20  1 SET a = ?" {. 
0930: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0940: 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p1(a PRIMARY KEY
0950: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
0960: 42 4c 45 20 63 31 28 62 20 52 45 46 45 52 45 4e  BLE c1(b REFEREN
0970: 43 45 53 20 70 31 20 4f 4e 20 55 50 44 41 54 45  CES p1 ON UPDATE
0980: 20 53 45 54 20 4e 55 4c 4c 2c 20 63 29 3b 0a 20   SET NULL, c);. 
0990: 20 7d 0a 20 20 36 2e 33 20 20 20 31 20 22 55 50   }.  6.3   1 "UP
09a0: 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45 20 70  DATE OR IGNORE p
09b0: 31 20 53 45 54 20 61 20 3d 20 3f 22 20 7b 0a 20  1 SET a = ?" {. 
09c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
09d0: 70 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  p1(a PRIMARY KEY
09e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
09f0: 42 4c 45 20 63 31 28 62 20 52 45 46 45 52 45 4e  BLE c1(b REFEREN
0a00: 43 45 53 20 70 31 20 4f 4e 20 55 50 44 41 54 45  CES p1 ON UPDATE
0a10: 20 43 41 53 43 41 44 45 2c 20 63 29 3b 0a 20 20   CASCADE, c);.  
0a20: 7d 0a 20 20 36 2e 34 20 20 20 31 20 22 55 50 44  }.  6.4   1 "UPD
0a30: 41 54 45 20 4f 52 20 49 47 4e 4f 52 45 20 70 31  ATE OR IGNORE p1
0a40: 20 53 45 54 20 61 20 3d 20 3f 22 20 7b 0a 20 20   SET a = ?" {.  
0a50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70    CREATE TABLE p
0a60: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(a PRIMARY KEY)
0a70: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
0a80: 4c 45 20 63 31 28 62 20 4e 4f 54 20 4e 55 4c 4c  LE c1(b NOT NULL
0a90: 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 20 4f   REFERENCES p1 O
0aa0: 4e 20 55 50 44 41 54 45 20 53 45 54 20 4e 55 4c  N UPDATE SET NUL
0ab0: 4c 2c 20 63 29 3b 0a 20 20 7d 0a 0a 7d 20 7b 0a  L, c);.  }..} {.
0ac0: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
0ad0: 73 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74  s.  do_test 1.$t
0ae0: 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  n {.    execsql 
0af0: 24 73 63 68 65 6d 61 0a 20 20 20 20 73 65 74 20  $schema.    set 
0b00: 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72  stmt [sqlite3_pr
0b10: 65 70 61 72 65 5f 76 32 20 64 62 20 24 73 71 6c  epare_v2 db $sql
0b20: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73   -1 dummy].    s
0b30: 65 74 20 72 65 74 20 5b 75 73 65 73 5f 73 74 6d  et ret [uses_stm
0b40: 74 5f 6a 6f 75 72 6e 61 6c 20 24 73 74 6d 74 5d  t_journal $stmt]
0b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
0b60: 61 6c 69 7a 65 20 24 73 74 6d 74 0a 20 20 20 20  alize $stmt.    
0b70: 73 65 74 20 72 65 74 0a 20 20 7d 20 24 75 73 65  set ret.  } $use
0b80: 5f 73 74 6d 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  _stmt.}..#------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
0be0: 69 6e 67 20 74 65 73 74 73 20 63 68 65 63 6b 20  ing tests check 
0bf0: 74 68 61 74 20 66 6f 72 65 69 67 6e 20 6b 65 79  that foreign key
0c00: 20 63 6f 6e 73 74 61 69 6e 74 20 63 6f 75 6e 74   constaint count
0c10: 65 72 73 20 61 72 65 0a 23 20 63 6f 72 72 65 63  ers are.# correc
0c20: 74 6c 79 20 75 70 64 61 74 65 64 20 66 6f 72 20  tly updated for 
0c30: 61 6e 79 20 69 6d 70 6c 69 63 69 74 20 44 45 4c  any implicit DEL
0c40: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  ETE operations t
0c50: 68 61 74 20 6f 63 63 75 72 0a 23 20 77 68 65 6e  hat occur.# when
0c60: 20 61 20 52 45 50 4c 41 43 45 20 63 6f 6d 6d 61   a REPLACE comma
0c70: 6e 64 20 69 73 20 65 78 65 63 75 74 65 64 20 61  nd is executed a
0c80: 67 61 69 6e 73 74 20 61 20 57 49 54 48 4f 55 54  gainst a WITHOUT
0c90: 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 23 20 74   ROWID table.# t
0ca0: 68 61 74 20 68 61 73 20 6e 6f 20 74 72 69 67 67  hat has no trigg
0cb0: 65 72 73 20 6f 72 20 61 75 78 69 6c 69 61 72 79  ers or auxiliary
0cc0: 20 69 6e 64 65 78 65 73 2e 0a 23 0a 72 65 73 65   indexes..#.rese
0cd0: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
0ce0: 74 65 73 74 20 32 2e 31 2e 30 20 7b 0a 20 20 50  test 2.1.0 {.  P
0cf0: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0d00: 79 73 20 3d 20 6f 6e 3b 0a 20 20 43 52 45 41 54  ys = on;.  CREAT
0d10: 45 20 54 41 42 4c 45 20 70 31 28 61 20 50 52 49  E TABLE p1(a PRI
0d20: 4d 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54  MARY KEY, b) WIT
0d30: 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43 52  HOUT ROWID;.  CR
0d40: 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 78 20  EATE TABLE c1(x 
0d50: 52 45 46 45 52 45 4e 43 45 53 20 70 31 20 44 45  REFERENCES p1 DE
0d60: 46 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c  FERRABLE INITIAL
0d70: 4c 59 20 44 45 46 45 52 52 45 44 29 3b 0a 0a 20  LY DEFERRED);.. 
0d80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20   INSERT INTO p1 
0d90: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
0da0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0db0: 70 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  p1 VALUES(2, 'tw
0dc0: 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
0dd0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 29 3b  TO c1 VALUES(1);
0de0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
0df0: 31 20 56 41 4c 55 45 53 28 32 29 3b 0a 7d 0a 0a  1 VALUES(2);.}..
0e00: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
0e10: 20 32 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49 4e   2.1.2 {.  BEGIN
0e20: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
0e30: 4d 20 70 31 20 57 48 45 52 45 20 61 3d 31 3b 0a  M p1 WHERE a=1;.
0e40: 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45      INSERT OR RE
0e50: 50 4c 41 43 45 20 49 4e 54 4f 20 70 31 20 56 41  PLACE INTO p1 VA
0e60: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
0e70: 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 31 20 7b    COMMIT;.} {1 {
0e80: 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
0e90: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
0ea0: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65  .reset_db.do_exe
0eb0: 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 30 20  csql_test 2.2.0 
0ec0: 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69  {.  PRAGMA forei
0ed0: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20  gn_keys = on;.  
0ee0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 32 28  CREATE TABLE p2(
0ef0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
0f00: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
0f10: 45 20 63 32 28 0a 20 20 20 20 78 20 50 52 49 4d  E c2(.    x PRIM
0f20: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 79 20 52  ARY KEY,.    y R
0f30: 45 46 45 52 45 4e 43 45 53 20 70 32 20 44 45 46  EFERENCES p2 DEF
0f40: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
0f50: 59 20 44 45 46 45 52 52 45 44 0a 20 20 29 20 57  Y DEFERRED.  ) W
0f60: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 7d 0a  ITHOUT ROWID;.}.
0f70: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
0f80: 74 20 32 2e 32 2e 31 20 7b 0a 20 20 42 45 47 49  t 2.2.1 {.  BEGI
0f90: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
0fa0: 54 4f 20 63 32 20 56 41 4c 55 45 53 28 31 33 2c  TO c2 VALUES(13,
0fb0: 20 31 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54   13);.    INSERT
0fc0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
0fd0: 20 63 32 20 56 41 4c 55 45 53 28 31 33 2c 20 31   c2 VALUES(13, 1
0fe0: 33 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  3);.    DELETE F
0ff0: 52 4f 4d 20 63 32 3b 0a 20 20 43 4f 4d 4d 49 54  ROM c2;.  COMMIT
1000: 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 72 65 73 65  ;.} {0 {}}..rese
1010: 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t_db.do_execsql_
1020: 74 65 73 74 20 32 2e 33 2e 30 20 7b 0a 20 20 50  test 2.3.0 {.  P
1030: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
1040: 79 73 20 3d 20 6f 6e 3b 0a 20 20 43 52 45 41 54  ys = on;.  CREAT
1050: 45 20 54 41 42 4c 45 20 70 33 28 61 20 50 52 49  E TABLE p3(a PRI
1060: 4d 41 52 59 20 4b 45 59 2c 20 62 29 20 57 49 54  MARY KEY, b) WIT
1070: 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43 52  HOUT ROWID;.  CR
1080: 45 41 54 45 20 54 41 42 4c 45 20 63 33 28 78 20  EATE TABLE c3(x 
1090: 52 45 46 45 52 45 4e 43 45 53 20 70 33 29 3b 0a  REFERENCES p3);.
10a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
10b0: 33 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  3 VALUES(1, 'one
10c0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
10d0: 4f 20 70 33 20 56 41 4c 55 45 53 28 32 2c 20 27  O p3 VALUES(2, '
10e0: 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  two');.  INSERT 
10f0: 49 4e 54 4f 20 63 33 20 56 41 4c 55 45 53 28 31  INTO c3 VALUES(1
1100: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1110: 20 63 33 20 56 41 4c 55 45 53 28 32 29 3b 0a 0a   c3 VALUES(2);..
1120: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
1130: 20 70 33 64 20 41 46 54 45 52 20 44 45 4c 45 54   p3d AFTER DELET
1140: 45 20 4f 4e 20 70 33 20 57 48 45 4e 20 6f 6c 64  E ON p3 WHEN old
1150: 2e 61 3d 31 20 42 45 47 49 4e 0a 20 20 20 20 49  .a=1 BEGIN.    I
1160: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
1170: 20 49 4e 54 4f 20 70 33 20 56 41 4c 55 45 53 28   INTO p3 VALUES(
1180: 32 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 45  2, 'three');.  E
1190: 4e 44 3b 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68 73  ND;.}..do_catchs
11a0: 71 6c 5f 74 65 73 74 20 32 2e 33 2e 31 20 7b 0a  ql_test 2.3.1 {.
11b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 33    DELETE FROM p3
11c0: 20 57 48 45 52 45 20 61 3d 31 0a 7d 20 7b 31 20   WHERE a=1.} {1 
11d0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
11e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
11f0: 0a 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ...do_execsql_te
1200: 73 74 20 33 2e 30 20 7b 0a 20 20 50 52 41 47 4d  st 3.0 {.  PRAGM
1210: 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f  A foreign_keys=O
1220: 4e 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  N;.  CREATE TABL
1230: 45 20 74 32 28 0a 20 20 20 20 61 20 50 52 49 4d  E t2(.    a PRIM
1240: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 64  ARY KEY, b, c, d
1250: 2c 20 65 2c 0a 20 20 20 20 20 20 46 4f 52 45 49  , e,.      FOREI
1260: 47 4e 20 4b 45 59 28 62 2c 20 63 29 20 52 45 46  GN KEY(b, c) REF
1270: 45 52 45 4e 43 45 53 20 74 32 28 64 2c 20 65 29  ERENCES t2(d, e)
1280: 0a 20 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57  .  ) WITHOUT ROW
1290: 49 44 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49  ID;.  CREATE UNI
12a0: 51 55 45 20 49 4e 44 45 58 20 69 64 78 20 4f 4e  QUE INDEX idx ON
12b0: 20 74 32 28 64 2c 20 65 29 3b 0a 0a 20 20 49 4e   t2(d, e);..  IN
12c0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
12d0: 55 45 53 28 31 2c 20 27 6f 6e 65 27 2c 20 27 6f  UES(1, 'one', 'o
12e0: 6e 65 27 2c 20 27 6f 6e 65 27 2c 20 27 6f 6e 65  ne', 'one', 'one
12f0: 27 29 3b 20 2d 2d 20 72 6f 77 20 69 73 20 70 61  '); -- row is pa
1300: 72 65 6e 74 20 6f 66 20 73 65 6c 66 0a 20 20 49  rent of self.  I
1310: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1320: 4c 55 45 53 28 32 2c 20 27 6f 6e 65 27 2c 20 27  LUES(2, 'one', '
1330: 6f 6e 65 27 2c 20 27 6f 6e 65 27 2c 20 4e 55 4c  one', 'one', NUL
1340: 4c 29 3b 20 20 2d 2d 20 70 61 72 65 6e 74 20 69  L);  -- parent i
1350: 73 20 72 6f 77 20 31 0a 7d 0a 0a 64 6f 5f 63 61  s row 1.}..do_ca
1360: 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31 20  tchsql_test 3.1 
1370: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
1380: 74 32 20 57 48 45 52 45 20 61 3d 31 3b 0a 7d 20  t2 WHERE a=1;.} 
1390: 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20  {1 {FOREIGN KEY 
13a0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
13b0: 64 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d}}..do_execsql_
13c0: 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 43 52 45  test 4.0 {.  CRE
13d0: 41 54 45 20 54 41 42 4c 45 20 74 31 20 28 0a 20  ATE TABLE t1 (. 
13e0: 20 20 20 20 20 63 31 20 50 52 49 4d 41 52 59 20       c1 PRIMARY 
13f0: 4b 45 59 2c 0a 20 20 20 20 20 20 63 32 20 4e 55  KEY,.      c2 NU
1400: 4d 45 52 49 43 2c 0a 20 20 20 20 20 20 46 4f 52  MERIC,.      FOR
1410: 45 49 47 4e 20 4b 45 59 28 63 31 29 20 52 45 46  EIGN KEY(c1) REF
1420: 45 52 45 4e 43 45 53 20 74 31 28 63 32 29 0a 20  ERENCES t1(c2). 
1430: 20 20 20 20 20 29 20 57 49 54 48 4f 55 54 20 52       ) WITHOUT R
1440: 4f 57 49 44 20 3b 0a 20 20 43 52 45 41 54 45 20  OWID ;.  CREATE 
1450: 49 4e 44 45 58 20 74 31 63 31 20 4f 4e 20 74 31  INDEX t1c1 ON t1
1460: 28 63 31 29 3b 0a 20 20 43 52 45 41 54 45 20 55  (c1);.  CREATE U
1470: 4e 49 51 55 45 20 49 4e 44 45 58 20 74 31 63 31  NIQUE INDEX t1c1
1480: 75 6e 69 71 75 65 20 4f 4e 20 74 31 28 63 32 29  unique ON t1(c2)
1490: 3b 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  ;.}.do_catchsql_
14a0: 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 49 4e 53  test 4.1 {.  INS
14b0: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
14c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30  NTO t1 VALUES(10
14d0: 30 30 30 2c 20 32 30 30 30 30 29 3b 0a 7d 20 7b  000, 20000);.} {
14e0: 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  1 {FOREIGN KEY c
14f0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1500: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
1510: 73 74 20 34 2e 32 20 7b 0a 20 20 49 4e 53 45 52  st 4.2 {.  INSER
1520: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
1530: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 30 30 30  O t1 VALUES(2000
1540: 30 2c 20 32 30 30 30 30 29 3b 0a 7d 0a 0a 66 69  0, 20000);.}..fi
1550: 6e 69 73 68 5f 74 65 73 74 0a 0a                 nish_test..