/ Hex Artifact Content
Login

Artifact d078a1e323a740062bed38df32b8a736fd320dc0:


0000: 23 20 32 30 31 32 20 44 65 63 65 6d 62 65 72 20  # 2012 December 
0010: 31 37 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  17.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2a 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 0a 23 20 54 68 69 73 20  ********.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
0190: 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72   for SQLite libr
01a0: 61 72 79 2e 0a 23 0a 23 20 54 68 69 73 20 66 69  ary..#.# This fi
01b0: 6c 65 20 74 65 73 74 73 20 74 68 65 20 50 52 41  le tests the PRA
01c0: 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67  GMA defer_foreig
01d0: 6e 5f 6b 65 79 73 20 61 6e 64 20 0a 23 20 53 51  n_keys and .# SQ
01e0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 44 45  LITE_DBSTATUS_DE
01f0: 46 45 52 52 45 44 5f 46 4b 53 0a 23 0a 23 20 45  FERRED_FKS.#.# E
0200: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
0210: 39 38 31 2d 31 36 32 39 32 20 57 68 65 6e 20 74  981-16292 When t
0220: 68 65 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e  he defer_foreign
0230: 5f 6b 65 79 73 20 50 52 41 47 4d 41 20 69 73 20  _keys PRAGMA is 
0240: 6f 6e 2c 0a 23 20 65 6e 66 6f 72 63 65 6d 65 6e  on,.# enforcemen
0250: 74 20 6f 66 20 61 6c 6c 20 66 6f 72 65 69 67 6e  t of all foreign
0260: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
0270: 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
0280: 6c 20 74 68 65 0a 23 20 6f 75 74 65 72 6d 6f 73  l the.# outermos
0290: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
02a0: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 23 20   committed..#.# 
02b0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
02c0: 38 39 31 31 2d 35 37 35 30 31 20 54 68 65 20 64  8911-57501 The d
02d0: 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79  efer_foreign_key
02e0: 73 20 70 72 61 67 6d 61 20 64 65 66 61 75 6c 74  s pragma default
02f0: 73 20 74 6f 0a 23 20 4f 46 46 20 73 6f 20 74 68  s to.# OFF so th
0300: 61 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  at foreign key c
0310: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6f  onstraints are o
0320: 6e 6c 79 20 64 65 66 65 72 72 65 64 20 69 66 20  nly deferred if 
0330: 74 68 65 79 20 61 72 65 0a 23 20 63 72 65 61 74  they are.# creat
0340: 65 64 20 61 73 20 22 44 45 46 45 52 52 41 42 4c  ed as "DEFERRABL
0350: 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  E INITIALLY DEFE
0360: 52 52 45 44 22 2e 0a 0a 73 65 74 20 74 65 73 74  RRED"...set test
0370: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0380: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0390: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
03a0: 2e 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65  .tcl.set testpre
03b0: 66 69 78 20 66 6b 65 79 36 0a 0a 69 66 63 61 70  fix fkey6..ifcap
03c0: 61 62 6c 65 20 7b 21 66 6f 72 65 69 67 6e 6b 65  able {!foreignke
03d0: 79 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  y} {.  finish_te
03e0: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64  st.  return.}..d
03f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66  o_execsql_test f
0400: 6b 65 79 36 2d 31 2e 30 20 7b 0a 20 20 50 52 41  key6-1.0 {.  PRA
0410: 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67  GMA defer_foreig
0420: 6e 5f 6b 65 79 73 3b 0a 7d 20 7b 30 7d 0a 0a 64  n_keys;.} {0}..d
0430: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66  o_execsql_test f
0440: 6b 65 79 36 2d 31 2e 31 20 7b 0a 20 20 50 52 41  key6-1.1 {.  PRA
0450: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
0460: 3d 4f 4e 3b 0a 20 20 43 52 45 41 54 45 20 54 41  =ON;.  CREATE TA
0470: 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45 52  BLE t1(x INTEGER
0480: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
0490: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
04a0: 28 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (y INTEGER PRIMA
04b0: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20  RY KEY,.        
04c0: 20 20 7a 20 49 4e 54 45 47 45 52 20 52 45 46 45    z INTEGER REFE
04d0: 52 45 4e 43 45 53 20 74 31 28 78 29 20 44 45 46  RENCES t1(x) DEF
04e0: 45 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c  ERRABLE INITIALL
04f0: 59 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 43  Y DEFERRED);.  C
0500: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 7a 20  REATE INDEX t2z 
0510: 4f 4e 20 74 32 28 7a 29 3b 0a 20 20 43 52 45 41  ON t2(z);.  CREA
0520: 54 45 20 54 41 42 4c 45 20 74 33 28 75 20 49 4e  TE TABLE t3(u IN
0530: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0540: 59 2c 20 76 20 49 4e 54 45 47 45 52 20 52 45 46  Y, v INTEGER REF
0550: 45 52 45 4e 43 45 53 20 74 31 28 78 29 29 3b 0a  ERENCES t1(x));.
0560: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
0570: 33 76 20 4f 4e 20 74 33 28 76 29 3b 0a 20 20 49  3v ON t3(v);.  I
0580: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0590: 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 2c  LUES(1),(2),(3),
05a0: 28 34 29 2c 28 35 29 3b 0a 20 20 49 4e 53 45 52  (4),(5);.  INSER
05b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
05c0: 28 31 2c 31 29 2c 28 32 2c 32 29 3b 0a 20 20 49  (1,1),(2,2);.  I
05d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
05e0: 4c 55 45 53 28 33 2c 33 29 2c 28 34 2c 34 29 3b  LUES(3,3),(4,4);
05f0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
0600: 65 79 36 2d 31 2e 32 20 7b 0a 20 20 63 61 74 63  ey6-1.2 {.  catc
0610: 68 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f  hsql {DELETE FRO
0620: 4d 20 74 31 20 57 48 45 52 45 20 78 3d 32 3b 7d  M t1 WHERE x=2;}
0630: 0a 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b  .} {1 {FOREIGN K
0640: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
0650: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  iled}}.do_test f
0660: 6b 65 79 36 2d 31 2e 33 20 7b 0a 20 20 73 71 6c  key6-1.3 {.  sql
0670: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64  ite3_db_status d
0680: 62 20 44 42 53 54 41 54 55 53 5f 44 45 46 45 52  b DBSTATUS_DEFER
0690: 52 45 44 5f 46 4b 53 20 30 0a 7d 20 7b 30 20 30  RED_FKS 0.} {0 0
06a0: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   0}.do_test fkey
06b0: 36 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  6-1.4 {.  execsq
06c0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
06d0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
06e0: 31 20 57 48 45 52 45 20 78 3d 31 3b 0a 20 20 7d  1 WHERE x=1;.  }
06f0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 6b  .} {}.do_test fk
0700: 65 79 36 2d 31 2e 35 2e 31 20 7b 0a 20 20 73 71  ey6-1.5.1 {.  sq
0710: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20  lite3_db_status 
0720: 64 62 20 44 42 53 54 41 54 55 53 5f 44 45 46 45  db DBSTATUS_DEFE
0730: 52 52 45 44 5f 46 4b 53 20 31 0a 7d 20 7b 30 20  RRED_FKS 1.} {0 
0740: 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65  1 0}.do_test fke
0750: 79 36 2d 31 2e 35 2e 32 20 7b 0a 20 20 73 71 6c  y6-1.5.2 {.  sql
0760: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64  ite3_db_status d
0770: 62 20 44 42 53 54 41 54 55 53 5f 44 45 46 45 52  b DBSTATUS_DEFER
0780: 52 45 44 5f 46 4b 53 20 30 0a 7d 20 7b 30 20 31  RED_FKS 0.} {0 1
0790: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79   0}.do_test fkey
07a0: 36 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  6-1.6 {.  execsq
07b0: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
07c0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
07d0: 73 74 20 66 6b 65 79 36 2d 31 2e 37 20 7b 0a 20  st fkey6-1.7 {. 
07e0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
07f0: 75 73 20 64 62 20 44 42 53 54 41 54 55 53 5f 44  us db DBSTATUS_D
0800: 45 46 45 52 52 45 44 5f 46 4b 53 20 30 0a 7d 20  EFERRED_FKS 0.} 
0810: 7b 30 20 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20  {0 0 0}.do_test 
0820: 66 6b 65 79 36 2d 31 2e 38 20 7b 0a 20 20 65 78  fkey6-1.8 {.  ex
0830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
0840: 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e  MA defer_foreign
0850: 5f 6b 65 79 73 3d 4f 4e 3b 0a 20 20 20 20 42 45  _keys=ON;.    BE
0860: 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  GIN;.    DELETE 
0870: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3d  FROM t1 WHERE x=
0880: 33 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  3;.  }.} {}.do_t
0890: 65 73 74 20 66 6b 65 79 36 2d 31 2e 39 20 7b 0a  est fkey6-1.9 {.
08a0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
08b0: 74 75 73 20 64 62 20 44 42 53 54 41 54 55 53 5f  tus db DBSTATUS_
08c0: 44 45 46 45 52 52 45 44 5f 46 4b 53 20 30 0a 7d  DEFERRED_FKS 0.}
08d0: 20 7b 30 20 31 20 30 7d 0a 0a 23 20 45 56 49 44   {0 1 0}..# EVID
08e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 37 35 32  ENCE-OF: R-21752
08f0: 2d 32 36 39 31 33 20 54 68 65 20 64 65 66 65 72  -26913 The defer
0900: 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 70 72  _foreign_keys pr
0910: 61 67 6d 61 20 69 73 0a 23 20 61 75 74 6f 6d 61  agma is.# automa
0920: 74 69 63 61 6c 6c 79 20 73 77 69 74 63 68 65 64  tically switched
0930: 20 6f 66 66 20 61 74 20 65 61 63 68 20 43 4f 4d   off at each COM
0940: 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
0950: 20 48 65 6e 63 65 2c 20 74 68 65 0a 23 20 64 65   Hence, the.# de
0960: 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73  fer_foreign_keys
0970: 20 70 72 61 67 6d 61 20 6d 75 73 74 20 62 65 20   pragma must be 
0980: 73 65 70 61 72 61 74 65 6c 79 20 65 6e 61 62 6c  separately enabl
0990: 65 64 20 66 6f 72 20 65 61 63 68 0a 23 20 74 72  ed for each.# tr
09a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 65 78  ansaction..do_ex
09b0: 65 63 73 71 6c 5f 74 65 73 74 20 66 6b 65 79 36  ecsql_test fkey6
09c0: 2d 31 2e 31 30 2e 31 20 7b 0a 20 20 50 52 41 47  -1.10.1 {.  PRAG
09d0: 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e  MA defer_foreign
09e0: 5f 6b 65 79 73 3b 0a 20 20 52 4f 4c 4c 42 41 43  _keys;.  ROLLBAC
09f0: 4b 3b 0a 20 20 50 52 41 47 4d 41 20 64 65 66 65  K;.  PRAGMA defe
0a00: 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a  r_foreign_keys;.
0a10: 20 20 42 45 47 49 4e 3b 0a 20 20 50 52 41 47 4d    BEGIN;.  PRAGM
0a20: 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f  A defer_foreign_
0a30: 6b 65 79 73 3d 4f 4e 3b 0a 20 20 50 52 41 47 4d  keys=ON;.  PRAGM
0a40: 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f  A defer_foreign_
0a50: 6b 65 79 73 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a  keys;.  COMMIT;.
0a60: 20 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f 66    PRAGMA defer_f
0a70: 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 42  oreign_keys;.  B
0a80: 45 47 49 4e 3b 0a 7d 20 7b 31 20 30 20 31 20 30  EGIN;.} {1 0 1 0
0a90: 7d 0a 64 6f 5f 74 65 73 74 20 66 6b 65 79 36 2d  }.do_test fkey6-
0aa0: 31 2e 31 30 2e 32 20 7b 0a 20 20 63 61 74 63 68  1.10.2 {.  catch
0ab0: 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  sql {DELETE FROM
0ac0: 20 74 31 20 57 48 45 52 45 20 78 3d 33 7d 0a 7d   t1 WHERE x=3}.}
0ad0: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
0ae0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
0af0: 65 64 7d 7d 0a 64 62 20 65 76 61 6c 20 7b 52 4f  ed}}.db eval {RO
0b00: 4c 4c 42 41 43 4b 7d 0a 0a 64 6f 5f 74 65 73 74  LLBACK}..do_test
0b10: 20 66 6b 65 79 36 2d 31 2e 32 30 20 7b 0a 20 20   fkey6-1.20 {.  
0b20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
0b30: 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  GIN;.    DELETE 
0b40: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3d  FROM t1 WHERE x=
0b50: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
0b60: 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20 44 42  _db_status db DB
0b70: 53 54 41 54 55 53 5f 44 45 46 45 52 52 45 44 5f  STATUS_DEFERRED_
0b80: 46 4b 53 20 30 0a 7d 20 7b 30 20 31 20 30 7d 0a  FKS 0.} {0 1 0}.
0b90: 64 6f 5f 74 65 73 74 20 66 6b 65 79 36 2d 31 2e  do_test fkey6-1.
0ba0: 32 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  21 {.  execsql {
0bb0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0bc0: 20 74 32 20 57 48 45 52 45 20 79 3d 31 3b 0a 20   t2 WHERE y=1;. 
0bd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f   }.  sqlite3_db_
0be0: 73 74 61 74 75 73 20 64 62 20 44 42 53 54 41 54  status db DBSTAT
0bf0: 55 53 5f 44 45 46 45 52 52 45 44 5f 46 4b 53 20  US_DEFERRED_FKS 
0c00: 30 0a 7d 20 7b 30 20 30 20 30 7d 0a 64 6f 5f 74  0.} {0 0 0}.do_t
0c10: 65 73 74 20 66 6b 65 79 36 2d 31 2e 32 32 20 7b  est fkey6-1.22 {
0c20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0c30: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
0c40: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
0c50: 73 74 20 66 6b 65 79 36 2d 32 2e 31 20 7b 0a 20  st fkey6-2.1 {. 
0c60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 31   CREATE TABLE p1
0c70: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (a PRIMARY KEY);
0c80: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
0c90: 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29 2c  1 VALUES('one'),
0ca0: 20 28 27 74 77 6f 27 29 3b 0a 20 20 43 52 45 41   ('two');.  CREA
0cb0: 54 45 20 54 41 42 4c 45 20 63 31 28 78 20 52 45  TE TABLE c1(x RE
0cc0: 46 45 52 45 4e 43 45 53 20 70 31 29 3b 0a 20 20  FERENCES p1);.  
0cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
0ce0: 41 4c 55 45 53 28 27 74 77 6f 27 29 2c 20 28 27  ALUES('two'), ('
0cf0: 6f 6e 65 27 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65  one');.}..do_exe
0d00: 63 73 71 6c 5f 74 65 73 74 20 66 6b 65 79 36 2d  csql_test fkey6-
0d10: 32 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  2.2 {.  BEGIN;. 
0d20: 20 20 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f     PRAGMA defer_
0d30: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31  foreign_keys = 1
0d40: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
0d50: 4d 20 70 31 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  M p1;.  ROLLBACK
0d60: 3b 0a 20 20 50 52 41 47 4d 41 20 64 65 66 65 72  ;.  PRAGMA defer
0d70: 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 7d  _foreign_keys;.}
0d80: 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   {0}..do_execsql
0d90: 5f 74 65 73 74 20 66 6b 65 79 36 2d 32 2e 33 20  _test fkey6-2.3 
0da0: 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 50  {.  BEGIN;.    P
0db0: 52 41 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65  RAGMA defer_fore
0dc0: 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b 0a 20 20  ign_keys = 1;.  
0dd0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 70 31 3b    DROP TABLE p1;
0de0: 0a 20 20 20 20 50 52 41 47 4d 41 20 76 64 62 65  .    PRAGMA vdbe
0df0: 5f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 52 4f  _trace = 0;.  RO
0e00: 4c 4c 42 41 43 4b 3b 0a 20 20 50 52 41 47 4d 41  LLBACK;.  PRAGMA
0e10: 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b   defer_foreign_k
0e20: 65 79 73 3b 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 65  eys;.} {0}..do_e
0e30: 78 65 63 73 71 6c 5f 74 65 73 74 20 66 6b 65 79  xecsql_test fkey
0e40: 36 2d 32 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b  6-2.4 {.  BEGIN;
0e50: 0a 20 20 20 20 50 52 41 47 4d 41 20 64 65 66 65  .    PRAGMA defe
0e60: 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d  r_foreign_keys =
0e70: 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46   1;.    DELETE F
0e80: 52 4f 4d 20 70 31 3b 0a 20 20 20 20 44 52 4f 50  ROM p1;.    DROP
0e90: 20 54 41 42 4c 45 20 63 31 3b 0a 20 20 43 4f 4d   TABLE c1;.  COM
0ea0: 4d 49 54 3b 0a 20 20 50 52 41 47 4d 41 20 64 65  MIT;.  PRAGMA de
0eb0: 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73  fer_foreign_keys
0ec0: 3b 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63  ;.} {0}..do_exec
0ed0: 73 71 6c 5f 74 65 73 74 20 66 6b 65 79 36 2d 32  sql_test fkey6-2
0ee0: 2e 35 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  .5 {.  DROP TABL
0ef0: 45 20 70 31 3b 0a 20 20 43 52 45 41 54 45 20 54  E p1;.  CREATE T
0f00: 41 42 4c 45 20 70 31 28 61 20 50 52 49 4d 41 52  ABLE p1(a PRIMAR
0f10: 59 20 4b 45 59 29 3b 0a 20 20 49 4e 53 45 52 54  Y KEY);.  INSERT
0f20: 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
0f30: 27 6f 6e 65 27 29 2c 20 28 27 74 77 6f 27 29 3b  'one'), ('two');
0f40: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0f50: 63 31 28 78 20 52 45 46 45 52 45 4e 43 45 53 20  c1(x REFERENCES 
0f60: 70 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  p1);.  INSERT IN
0f70: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 27 74 77  TO c1 VALUES('tw
0f80: 6f 27 29 2c 20 28 27 6f 6e 65 27 29 3b 0a 7d 0a  o'), ('one');.}.
0f90: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0fa0: 20 66 6b 65 79 36 2d 32 2e 36 20 7b 0a 20 20 42   fkey6-2.6 {.  B
0fb0: 45 47 49 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41  EGIN;.    PRAGMA
0fc0: 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b   defer_foreign_k
0fd0: 65 79 73 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53  eys = 1;.    INS
0fe0: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
0ff0: 45 53 28 27 74 68 72 65 65 27 29 3b 0a 20 20 20  ES('three');.   
1000: 20 44 52 4f 50 20 54 41 42 4c 45 20 63 31 3b 0a   DROP TABLE c1;.
1010: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 50 52 41 47    COMMIT;.  PRAG
1020: 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e  MA defer_foreign
1030: 5f 6b 65 79 73 3b 0a 7d 20 7b 30 7d 0a 0a 23 2d  _keys;.} {0}..#-
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
1090: 20 74 68 61 74 20 64 65 66 65 72 5f 66 6f 72 65   that defer_fore
10a0: 69 67 6e 5f 6b 65 79 73 20 64 69 73 61 62 6c 65  ign_keys disable
10b0: 73 20 52 45 53 54 52 49 43 54 2e 0a 23 0a 64 6f  s RESTRICT..#.do
10c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
10d0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
10e0: 4c 45 20 70 32 28 61 20 50 52 49 4d 41 52 59 20  LE p2(a PRIMARY 
10f0: 4b 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  KEY, b);.  CREAT
1100: 45 20 54 41 42 4c 45 20 63 32 28 78 2c 20 79 20  E TABLE c2(x, y 
1110: 52 45 46 45 52 45 4e 43 45 53 20 70 32 20 4f 4e  REFERENCES p2 ON
1120: 20 44 45 4c 45 54 45 20 52 45 53 54 52 49 43 54   DELETE RESTRICT
1130: 20 4f 4e 20 55 50 44 41 54 45 20 52 45 53 54 52   ON UPDATE RESTR
1140: 49 43 54 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ICT);.  INSERT I
1150: 4e 54 4f 20 70 32 20 56 41 4c 55 45 53 28 31 2c  NTO p2 VALUES(1,
1160: 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52   'one');.  INSER
1170: 54 20 49 4e 54 4f 20 70 32 20 56 41 4c 55 45 53  T INTO p2 VALUES
1180: 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e  (2, 'two');.  IN
1190: 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56 41 4c  SERT INTO c2 VAL
11a0: 55 45 53 28 27 69 27 2c 20 31 29 3b 0a 7d 0a 0a  UES('i', 1);.}..
11b0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
11c0: 20 33 2e 32 2e 31 20 7b 0a 20 20 42 45 47 49 4e   3.2.1 {.  BEGIN
11d0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 70 32 20  ;.    UPDATE p2 
11e0: 53 45 54 20 61 3d 61 2d 31 3b 0a 7d 20 7b 31 20  SET a=a-1;.} {1 
11f0: 7b 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  {FOREIGN KEY con
1200: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
1210: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1220: 20 33 2e 32 2e 32 20 7b 20 43 4f 4d 4d 49 54 20   3.2.2 { COMMIT 
1230: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1240: 73 74 20 33 2e 32 2e 33 20 7b 0a 20 20 42 45 47  st 3.2.3 {.  BEG
1250: 49 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 64  IN;.    PRAGMA d
1260: 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79  efer_foreign_key
1270: 73 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  s = 1;.    UPDAT
1280: 45 20 70 32 20 53 45 54 20 61 3d 61 2d 31 3b 0a  E p2 SET a=a-1;.
1290: 20 20 43 4f 4d 4d 49 54 3b 0a 7d 0a 0a 64 6f 5f    COMMIT;.}..do_
12a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32  execsql_test 3.2
12b0: 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .4 {.  BEGIN;.  
12c0: 20 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f 66    PRAGMA defer_f
12d0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b  oreign_keys = 1;
12e0: 0a 20 20 20 20 55 50 44 41 54 45 20 70 32 20 53  .    UPDATE p2 S
12f0: 45 54 20 61 3d 61 2d 31 3b 0a 7d 0a 64 6f 5f 63  ET a=a-1;.}.do_c
1300: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 32  atchsql_test 3.2
1310: 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d  .5 {.  COMMIT;.}
1320: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
1330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
1340: 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ed}}.do_execsql_
1350: 74 65 73 74 20 33 2e 32 2e 36 20 7b 20 52 4f 4c  test 3.2.6 { ROL
1360: 4c 42 41 43 4b 20 7d 0a 0a 64 6f 5f 65 78 65 63  LBACK }..do_exec
1370: 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e 31 20 7b  sql_test 3.3.1 {
1380: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
1390: 52 20 70 32 74 20 41 46 54 45 52 20 44 45 4c 45  R p2t AFTER DELE
13a0: 54 45 20 4f 4e 20 70 32 20 42 45 47 49 4e 0a 20  TE ON p2 BEGIN. 
13b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70     INSERT INTO p
13c0: 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 2c 20  2 VALUES(old.a, 
13d0: 27 64 65 6c 65 74 65 64 21 27 29 3b 0a 20 20 45  'deleted!');.  E
13e0: 4e 44 3b 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ND;.}.do_catchsq
13f0: 6c 5f 74 65 73 74 20 33 2e 33 2e 32 20 7b 0a 20  l_test 3.3.2 {. 
1400: 20 42 45 47 49 4e 3b 0a 20 20 20 20 44 45 4c 45   BEGIN;.    DELE
1410: 54 45 20 46 52 4f 4d 20 70 32 20 57 48 45 52 45  TE FROM p2 WHERE
1420: 20 61 3d 31 3b 0a 7d 20 7b 31 20 7b 46 4f 52 45   a=1;.} {1 {FORE
1430: 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
1440: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65  nt failed}}.do_e
1450: 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e  xecsql_test 3.3.
1460: 33 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 0a 64 6f  3 { COMMIT }..do
1470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
1480: 33 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  3.4 {.  BEGIN;. 
1490: 20 20 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f     PRAGMA defer_
14a0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31  foreign_keys = 1
14b0: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
14c0: 4d 20 70 32 20 57 48 45 52 45 20 61 3d 31 3b 0a  M p2 WHERE a=1;.
14d0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
14e0: 43 54 20 2a 20 46 52 4f 4d 20 70 32 3b 0a 7d 20  CT * FROM p2;.} 
14f0: 7b 30 20 6f 6e 65 20 31 20 64 65 6c 65 74 65 64  {0 one 1 deleted
1500: 21 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  !}...finish_test
1510: 0a                                               .