/ Hex Artifact Content
Login

Artifact 5409d90d8141881d08285ed1c2c0d8d10fb92069:


0000: 23 20 32 30 31 33 20 4a 75 6c 79 20 30 34 0a 23  # 2013 July 04.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 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 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 74 65 73 74 73 20 74 68 61 74 20 74 68  le tests that th
0180: 65 20 73 65 73 73 69 6f 6e 73 20 6d 6f 64 75 6c  e sessions modul
0190: 65 20 68 61 6e 64 6c 65 73 20 66 6f 72 65 69 67  e handles foreig
01a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
01b0: 0a 23 20 76 69 6f 6c 61 74 69 6f 6e 73 20 77 68  .# violations wh
01c0: 65 6e 20 61 70 70 6c 79 69 6e 67 20 63 68 61 6e  en applying chan
01d0: 67 65 73 65 74 73 20 61 73 20 72 65 71 75 69 72  gesets as requir
01e0: 65 64 2e 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66  ed..#..if {![inf
01f0: 6f 20 65 78 69 73 74 73 20 74 65 73 74 64 69 72  o exists testdir
0200: 5d 7d 20 7b 0a 20 20 73 65 74 20 74 65 73 74 64  ]} {.  set testd
0210: 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66  ir [file join [f
0220: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
0230: 6f 20 73 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e  o script]] .. ..
0240: 20 74 65 73 74 5d 0a 7d 20 0a 73 6f 75 72 63 65   test].} .source
0250: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
0260: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
0270: 73 63 72 69 70 74 5d 5d 20 73 65 73 73 69 6f 6e  script]] session
0280: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 6f 75  _common.tcl].sou
0290: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
02a0: 74 65 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c  ter.tcl.ifcapabl
02b0: 65 20 21 73 65 73 73 69 6f 6e 20 7b 66 69 6e 69  e !session {fini
02c0: 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 7d  sh_test; return}
02d0: 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20  .set testprefix 
02e0: 73 65 73 73 69 6f 6e 39 0a 0a 0a 23 2d 2d 2d 2d  session9...#----
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 0a 23 20 42 61 73 69 63 20 74 65 73 74 73 2e 0a  .# Basic tests..
0340: 23 0a 70 72 6f 63 20 70 6f 70 75 6c 61 74 65 5f  #.proc populate_
0350: 64 62 20 7b 7d 20 7b 0a 20 20 64 72 6f 70 5f 61  db {} {.  drop_a
0360: 6c 6c 5f 74 61 62 6c 65 73 0a 20 20 65 78 65 63  ll_tables.  exec
0370: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
0380: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20   foreign_keys = 
0390: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
03a0: 42 4c 45 20 70 31 28 61 20 50 52 49 4d 41 52 59  BLE p1(a PRIMARY
03b0: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
03c0: 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 20  EATE TABLE c1(a 
03d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 52  PRIMARY KEY, b R
03e0: 45 46 45 52 45 4e 43 45 53 20 70 31 29 3b 0a 20  EFERENCES p1);. 
03f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0400: 63 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  c2(a PRIMARY KEY
0410: 2c 20 0a 20 20 20 20 20 20 20 20 62 20 52 45 46  , .        b REF
0420: 45 52 45 4e 43 45 53 20 70 31 20 44 45 46 45 52  ERENCES p1 DEFER
0430: 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20  RABLE INITIALLY 
0440: 44 45 46 45 52 52 45 44 0a 20 20 20 20 29 3b 0a  DEFERRED.    );.
0450: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0460: 20 70 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   p1 VALUES(1, 'o
0470: 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ne');.    INSERT
0480: 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28   INTO p1 VALUES(
0490: 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 49  2, 'two');.    I
04a0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
04b0: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
04c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04d0: 4f 20 70 31 20 56 41 4c 55 45 53 28 34 2c 20 27  O p1 VALUES(4, '
04e0: 66 6f 75 72 27 29 3b 0a 20 20 7d 0a 7d 0a 0a 70  four');.  }.}..p
04f0: 72 6f 63 20 63 61 70 74 75 72 65 5f 63 68 61 6e  roc capture_chan
0500: 67 65 73 65 74 20 7b 73 71 6c 7d 20 7b 0a 20 20  geset {sql} {.  
0510: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53  sqlite3session S
0520: 20 64 62 20 6d 61 69 6e 0a 0a 20 20 66 6f 72 65   db main..  fore
0530: 61 63 68 20 74 20 5b 64 62 20 65 76 61 6c 20 7b  ach t [db eval {
0540: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
0550: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
0560: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
0570: 27 7d 5d 20 7b 0a 20 20 20 20 53 20 61 74 74 61  '}] {.    S atta
0580: 63 68 20 24 74 0a 20 20 7d 0a 20 20 65 78 65 63  ch $t.  }.  exec
0590: 73 71 6c 20 24 73 71 6c 0a 20 20 73 65 74 20 72  sql $sql.  set r
05a0: 65 74 20 5b 53 20 63 68 61 6e 67 65 73 65 74 5d  et [S changeset]
05b0: 0a 20 20 53 20 64 65 6c 65 74 65 0a 0a 20 20 72  .  S delete..  r
05c0: 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 64 6f  eturn $ret.}..do
05d0: 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 70 6f  _test 1.1 {.  po
05e0: 70 75 6c 61 74 65 5f 64 62 0a 20 20 73 65 74 20  pulate_db.  set 
05f0: 63 63 20 5b 63 61 70 74 75 72 65 5f 63 68 61 6e  cc [capture_chan
0600: 67 65 73 65 74 20 7b 0a 20 20 20 20 49 4e 53 45  geset {.    INSE
0610: 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45  RT INTO c1 VALUE
0620: 53 28 27 69 69 27 2c 20 32 29 3b 0a 20 20 20 20  S('ii', 2);.    
0630: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 32 20 56  INSERT INTO c2 V
0640: 41 4c 55 45 53 28 27 69 69 69 27 2c 20 33 29 3b  ALUES('iii', 3);
0650: 0a 20 20 7d 5d 0a 20 20 73 65 74 20 7b 7d 20 7b  .  }].  set {} {
0660: 7d 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 78 43 6f  }.} {}..proc xCo
0670: 6e 66 6c 69 63 74 20 7b 61 72 67 73 7d 20 7b 0a  nflict {args} {.
0680: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 78 43 6f 6e    lappend ::xCon
0690: 66 6c 69 63 74 20 7b 2a 7d 24 61 72 67 73 0a 20  flict {*}$args. 
06a0: 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6e 66 6c   return $::confl
06b0: 69 63 74 72 65 74 0a 7d 0a 0a 66 6f 72 65 61 63  ictret.}..foreac
06c0: 68 20 7b 74 6e 20 64 65 6c 72 6f 77 20 74 72 61  h {tn delrow tra
06d0: 6e 73 20 63 6f 6e 66 6c 69 63 74 61 72 67 73 20  ns conflictargs 
06e0: 63 6f 6e 66 6c 69 63 74 72 65 74 7d 20 7b 0a 20  conflictret} {. 
06f0: 20 31 20 20 20 32 20 30 20 7b 46 4f 52 45 49 47   1   2 0 {FOREIG
0700: 4e 5f 4b 45 59 20 31 7d 20 4f 4d 49 54 0a 20 20  N_KEY 1} OMIT.  
0710: 32 20 20 20 33 20 30 20 7b 46 4f 52 45 49 47 4e  2   3 0 {FOREIGN
0720: 5f 4b 45 59 20 31 7d 20 4f 4d 49 54 0a 20 20 33  _KEY 1} OMIT.  3
0730: 20 20 20 32 20 31 20 7b 46 4f 52 45 49 47 4e 5f     2 1 {FOREIGN_
0740: 4b 45 59 20 31 7d 20 4f 4d 49 54 0a 20 20 34 20  KEY 1} OMIT.  4 
0750: 20 20 33 20 31 20 7b 46 4f 52 45 49 47 4e 5f 4b    3 1 {FOREIGN_K
0760: 45 59 20 31 7d 20 4f 4d 49 54 0a 20 20 35 20 20  EY 1} OMIT.  5  
0770: 20 32 20 30 20 7b 46 4f 52 45 49 47 4e 5f 4b 45   2 0 {FOREIGN_KE
0780: 59 20 31 7d 20 41 42 4f 52 54 0a 20 20 36 20 20  Y 1} ABORT.  6  
0790: 20 33 20 30 20 7b 46 4f 52 45 49 47 4e 5f 4b 45   3 0 {FOREIGN_KE
07a0: 59 20 31 7d 20 41 42 4f 52 54 0a 20 20 37 20 20  Y 1} ABORT.  7  
07b0: 20 32 20 31 20 7b 46 4f 52 45 49 47 4e 5f 4b 45   2 1 {FOREIGN_KE
07c0: 59 20 31 7d 20 41 42 4f 52 54 0a 20 20 38 20 20  Y 1} ABORT.  8  
07d0: 20 33 20 31 20 7b 46 4f 52 45 49 47 4e 5f 4b 45   3 1 {FOREIGN_KE
07e0: 59 20 31 7d 20 41 42 4f 52 54 0a 7d 20 7b 0a 0a  Y 1} ABORT.} {..
07f0: 20 20 73 65 74 20 41 28 4f 4d 49 54 29 20 20 7b    set A(OMIT)  {
0800: 30 20 7b 7d 7d 0a 20 20 73 65 74 20 41 28 41 42  0 {}}.  set A(AB
0810: 4f 52 54 29 20 7b 31 20 53 51 4c 49 54 45 5f 43  ORT) {1 SQLITE_C
0820: 4f 4e 53 54 52 41 49 4e 54 7d 0a 20 20 64 6f 5f  ONSTRAINT}.  do_
0830: 74 65 73 74 20 31 2e 32 2e 24 74 6e 2e 31 20 7b  test 1.2.$tn.1 {
0840: 0a 20 20 20 20 70 6f 70 75 6c 61 74 65 5f 64 62  .    populate_db
0850: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44  .    execsql { D
0860: 45 4c 45 54 45 20 46 52 4f 4d 20 70 31 20 57 48  ELETE FROM p1 WH
0870: 45 52 45 20 61 3d 28 24 64 65 6c 72 6f 77 2b 30  ERE a=($delrow+0
0880: 29 20 7d 0a 20 20 20 20 69 66 20 7b 24 74 72 61  ) }.    if {$tra
0890: 6e 73 7d 20 7b 20 65 78 65 63 73 71 6c 20 42 45  ns} { execsql BE
08a0: 47 49 4e 20 7d 0a 0a 20 20 20 20 73 65 74 20 3a  GIN }..    set :
08b0: 3a 78 43 6f 6e 66 6c 69 63 74 20 5b 6c 69 73 74  :xConflict [list
08c0: 5d 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63  ].    list [catc
08d0: 68 20 7b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  h {sqlite3change
08e0: 73 65 74 5f 61 70 70 6c 79 20 64 62 20 24 3a 3a  set_apply db $::
08f0: 63 63 20 78 43 6f 6e 66 6c 69 63 74 7d 20 6d 73  cc xConflict} ms
0900: 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 41 28 24  g] $msg.  } $A($
0910: 63 6f 6e 66 6c 69 63 74 72 65 74 29 0a 0a 20 20  conflictret)..  
0920: 64 6f 5f 74 65 73 74 20 31 2e 32 2e 24 74 6e 2e  do_test 1.2.$tn.
0930: 32 20 7b 20 73 65 74 20 3a 3a 78 43 6f 6e 66 6c  2 { set ::xConfl
0940: 69 63 74 20 7d 20 24 63 6f 6e 66 6c 69 63 74 61  ict } $conflicta
0950: 72 67 73 0a 0a 20 20 73 65 74 20 41 28 4f 4d 49  rgs..  set A(OMI
0960: 54 29 20 20 7b 31 20 31 7d 0a 20 20 73 65 74 20  T)  {1 1}.  set 
0970: 41 28 41 42 4f 52 54 29 20 7b 30 20 30 7d 0a 20  A(ABORT) {0 0}. 
0980: 20 64 6f 5f 74 65 73 74 20 31 2e 32 2e 24 74 6e   do_test 1.2.$tn
0990: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
09a0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
09b0: 2a 29 20 46 52 4f 4d 20 63 31 20 55 4e 49 4f 4e  *) FROM c1 UNION
09c0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 63 6f 75 6e   ALL SELECT coun
09d0: 74 28 2a 29 20 46 52 4f 4d 20 63 32 20 7d 0a 20  t(*) FROM c2 }. 
09e0: 20 7d 20 24 41 28 24 63 6f 6e 66 6c 69 63 74 72   } $A($conflictr
09f0: 65 74 29 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31  et)..  do_test 1
0a00: 2e 32 2e 24 74 6e 2e 34 20 7b 20 65 78 70 72 20  .2.$tn.4 { expr 
0a10: 21 5b 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  ![sqlite3_get_au
0a20: 74 6f 63 6f 6d 6d 69 74 20 64 62 5d 20 7d 20 24  tocommit db] } $
0a30: 74 72 61 6e 73 0a 20 20 64 6f 5f 74 65 73 74 20  trans.  do_test 
0a40: 31 2e 32 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  1.2.$tn.5 {.    
0a50: 69 66 20 7b 20 24 74 72 61 6e 73 20 7d 20 7b 20  if { $trans } { 
0a60: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 7d  execsql COMMIT }
0a70: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 63 6c 6f  .# Test that clo
0ad0: 73 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  sing a transacti
0ae0: 6f 6e 20 63 6c 65 61 72 73 20 74 68 65 20 64 65  on clears the de
0af0: 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73  fer_foreign_keys
0b00: 20 66 6c 61 67 2e 0a 23 0a 66 6f 72 65 61 63 68   flag..#.foreach
0b10: 20 7b 74 6e 20 6f 70 65 6e 20 6e 6f 63 6c 6f 73   {tn open noclos
0b20: 65 20 63 6c 6f 73 65 7d 20 7b 0a 20 20 31 20 42  e close} {.  1 B
0b30: 45 47 49 4e 20 7b 7d 20 43 4f 4d 4d 49 54 0a 20  EGIN {} COMMIT. 
0b40: 20 32 20 42 45 47 49 4e 20 7b 7d 20 52 4f 4c 4c   2 BEGIN {} ROLL
0b50: 42 41 43 4b 0a 0a 20 20 33 20 7b 53 41 56 45 50  BACK..  3 {SAVEP
0b60: 4f 49 4e 54 20 6f 6e 65 7d 20 7b 7d 20 20 20 20  OINT one} {}    
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 52 45 4c              {REL
0b80: 45 41 53 45 20 6f 6e 65 7d 0a 20 20 34 20 7b 53  EASE one}.  4 {S
0b90: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 7d 20 7b 52  AVEPOINT one} {R
0ba0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 7d 20  OLLBACK TO one} 
0bb0: 7b 52 45 4c 45 41 53 45 20 6f 6e 65 7d 0a 7d 20  {RELEASE one}.} 
0bc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 6f 70 65  {.  execsql $ope
0bd0: 6e 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  n.  do_execsql_t
0be0: 65 73 74 20 32 2e 24 74 6e 2e 31 20 7b 20 50 52  est 2.$tn.1 { PR
0bf0: 41 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69  AGMA defer_forei
0c00: 67 6e 5f 6b 65 79 73 20 7d 20 7b 30 7d 0a 0a 20  gn_keys } {0}.. 
0c10: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0c20: 20 32 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 50   2.$tn.2 {.    P
0c30: 52 41 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65  RAGMA defer_fore
0c40: 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b 0a 20 20  ign_keys = 1;.  
0c50: 20 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f 66    PRAGMA defer_f
0c60: 6f 72 65 69 67 6e 5f 6b 65 79 73 3b 0a 20 20 7d  oreign_keys;.  }
0c70: 20 7b 31 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20   {1}..  execsql 
0c80: 24 6e 6f 63 6c 6f 73 65 0a 20 20 64 6f 5f 65 78  $noclose.  do_ex
0c90: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 24 74 6e  ecsql_test 2.$tn
0ca0: 2e 33 20 7b 20 50 52 41 47 4d 41 20 64 65 66 65  .3 { PRAGMA defe
0cb0: 72 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d  r_foreign_keys }
0cc0: 20 7b 31 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20   {1}..  execsql 
0cd0: 24 63 6c 6f 73 65 0a 20 20 64 6f 5f 65 78 65 63  $close.  do_exec
0ce0: 73 71 6c 5f 74 65 73 74 20 32 2e 24 74 6e 2e 34  sql_test 2.$tn.4
0cf0: 20 7b 20 50 52 41 47 4d 41 20 64 65 66 65 72 5f   { PRAGMA defer_
0d00: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 7d 20 7b  foreign_keys } {
0d10: 30 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}.}..#---------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0d60: 73 74 20 74 68 61 74 20 61 20 63 79 63 6c 69 63  st that a cyclic
0d70: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 63 61   relationship ca
0d80: 6e 20 62 65 20 69 6e 73 65 72 74 65 64 20 61 6e  n be inserted an
0d90: 64 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 54  d deleted..#.# T
0da0: 68 69 73 20 73 69 74 75 61 74 69 6f 6e 20 64 6f  his situation do
0db0: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 69  es not come up i
0dc0: 6e 20 70 72 61 63 74 69 63 65 2c 20 62 75 74 20  n practice, but 
0dd0: 74 65 73 74 69 6e 67 20 69 74 20 73 65 72 76 65  testing it serve
0de0: 73 20 74 6f 20 0a 23 20 73 68 6f 77 20 74 68 61  s to .# show tha
0df0: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  t it does not ma
0e00: 74 74 65 72 20 77 68 69 63 68 20 6f 72 64 65 72  tter which order
0e10: 20 70 61 72 65 6e 74 20 61 6e 64 20 63 68 69 6c   parent and chil
0e20: 64 20 6b 65 79 73 20 0a 23 20 61 72 65 20 70 72  d keys .# are pr
0e30: 6f 63 65 73 73 65 64 20 69 6e 20 69 6e 74 65 72  ocessed in inter
0e40: 6e 61 6c 6c 79 20 77 68 65 6e 20 61 70 70 6c 79  nally when apply
0e50: 69 6e 67 20 61 20 63 68 61 6e 67 65 73 65 74 2e  ing a changeset.
0e60: 0a 23 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c  .#.drop_all_tabl
0e70: 65 73 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  es..do_execsql_t
0e80: 65 73 74 20 33 2e 31 20 7b 0a 20 20 43 52 45 41  est 3.1 {.  CREA
0e90: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
0ea0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
0eb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
0ec0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
0ed0: 79 29 3b 0a 7d 0a 0a 23 20 43 72 65 61 74 65 20  y);.}..# Create 
0ee0: 63 68 61 6e 67 65 73 65 74 73 20 61 73 20 66 6f  changesets as fo
0ef0: 6c 6c 6f 77 73 3a 0a 23 20 0a 23 20 20 20 24 63  llows:.# .#   $c
0f00: 63 31 20 20 20 20 2d 20 49 6e 73 65 72 74 20 61  c1    - Insert a
0f10: 20 72 6f 77 20 69 6e 74 6f 20 74 31 2e 0a 23 20   row into t1..# 
0f20: 20 20 24 63 63 32 20 20 20 20 2d 20 49 6e 73 65    $cc2    - Inse
0f30: 72 74 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 32  rt a row into t2
0f40: 2e 0a 23 20 20 20 24 63 63 20 20 20 20 20 2d 20  ..#   $cc     - 
0f50: 43 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 24  Combination of $
0f60: 63 63 31 20 61 6e 64 20 24 63 63 32 2e 0a 23 0a  cc1 and $cc2..#.
0f70: 23 20 20 20 24 63 63 64 65 6c 31 20 2d 20 44 65  #   $ccdel1 - De
0f80: 6c 65 74 65 20 74 68 65 20 72 6f 77 20 66 72 6f  lete the row fro
0f90: 6d 20 74 31 2e 0a 23 20 20 20 24 63 63 64 65 6c  m t1..#   $ccdel
0fa0: 32 20 2d 20 44 65 6c 65 74 65 20 74 68 65 20 72  2 - Delete the r
0fb0: 6f 77 20 66 72 6f 6d 20 74 32 2e 0a 23 20 20 20  ow from t2..#   
0fc0: 24 63 63 64 65 6c 20 20 2d 20 43 6f 6d 62 69 6e  $ccdel  - Combin
0fd0: 61 74 69 6f 6e 20 6f 66 20 24 63 63 31 20 61 6e  ation of $cc1 an
0fe0: 64 20 24 63 63 32 2e 0a 23 0a 64 6f 5f 74 65 73  d $cc2..#.do_tes
0ff0: 74 20 33 2e 32 20 7b 0a 20 20 73 65 74 20 63 63  t 3.2 {.  set cc
1000: 31 20 5b 63 61 70 74 75 72 65 5f 63 68 61 6e 67  1 [capture_chang
1010: 65 73 65 74 20 7b 0a 20 20 20 20 49 4e 53 45 52  eset {.    INSER
1020: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1030: 28 27 6f 6e 65 27 2c 20 27 76 61 6c 75 65 20 6f  ('one', 'value o
1040: 6e 65 27 29 3b 0a 20 20 7d 5d 0a 20 20 73 65 74  ne');.  }].  set
1050: 20 63 63 64 65 6c 31 20 5b 63 61 70 74 75 72 65   ccdel1 [capture
1060: 5f 63 68 61 6e 67 65 73 65 74 20 7b 20 44 45 4c  _changeset { DEL
1070: 45 54 45 20 46 52 4f 4d 20 74 31 3b 20 7d 5d 0a  ETE FROM t1; }].
1080: 20 20 73 65 74 20 63 63 32 20 5b 63 61 70 74 75    set cc2 [captu
1090: 72 65 5f 63 68 61 6e 67 65 73 65 74 20 7b 0a 20  re_changeset {. 
10a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10b0: 32 20 56 41 4c 55 45 53 28 27 76 61 6c 75 65 20  2 VALUES('value 
10c0: 6f 6e 65 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20  one', 'one');.  
10d0: 7d 5d 0a 20 20 73 65 74 20 63 63 64 65 6c 32 20  }].  set ccdel2 
10e0: 5b 63 61 70 74 75 72 65 5f 63 68 61 6e 67 65 73  [capture_changes
10f0: 65 74 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  et { DELETE FROM
1100: 20 74 32 3b 20 7d 5d 0a 20 20 73 65 74 20 63 63   t2; }].  set cc
1110: 20 5b 63 61 70 74 75 72 65 5f 63 68 61 6e 67 65   [capture_change
1120: 73 65 74 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  set {.    INSERT
1130: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1140: 27 6f 6e 65 27 2c 20 27 76 61 6c 75 65 20 6f 6e  'one', 'value on
1150: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
1160: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
1170: 76 61 6c 75 65 20 6f 6e 65 27 2c 20 27 6f 6e 65  value one', 'one
1180: 27 29 3b 0a 20 20 7d 5d 0a 20 20 73 65 74 20 63  ');.  }].  set c
1190: 63 64 65 6c 20 5b 63 61 70 74 75 72 65 5f 63 68  cdel [capture_ch
11a0: 61 6e 67 65 73 65 74 20 7b 0a 20 20 20 20 44 45  angeset {.    DE
11b0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
11c0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
11d0: 3b 0a 20 20 7d 5d 0a 20 20 73 65 74 20 7b 7d 20  ;.  }].  set {} 
11e0: 7b 7d 0a 7d 20 7b 7d 0a 0a 23 20 4e 6f 77 20 6d  {}.} {}..# Now m
11f0: 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
1200: 73 65 20 73 63 68 65 6d 61 20 74 6f 20 63 72 65  se schema to cre
1210: 61 74 65 20 61 20 63 79 63 6c 69 63 20 66 6f 72  ate a cyclic for
1220: 65 69 67 6e 20 6b 65 79 20 64 65 70 65 6e 64 65  eign key depende
1230: 6e 63 79 0a 23 20 62 65 74 77 65 65 6e 20 74 61  ncy.# between ta
1240: 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 2e 20  bles t1 and t2. 
1250: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1260: 61 6c 74 68 6f 75 67 68 20 63 68 61 6e 67 65 73  although changes
1270: 65 74 73 20 24 63 63 20 61 6e 64 0a 23 20 24 63  ets $cc and.# $c
1280: 63 64 65 6c 20 63 61 6e 20 62 65 20 61 70 70 6c  cdel can be appl
1290: 69 65 64 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65  ied, none of the
12a0: 20 6f 74 68 65 72 73 20 6d 61 79 20 77 69 74 68   others may with
12b0: 6f 75 74 20 76 69 6f 6c 61 74 69 6e 67 20 74 68  out violating th
12c0: 65 0a 23 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  e.# foreign key 
12d0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 0a 23 20  constraints. .# 
12e0: 0a 64 6f 5f 74 65 73 74 20 33 2e 33 20 7b 0a 0a  .do_test 3.3 {..
12f0: 20 20 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65    drop_all_table
1300: 73 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  s.  execsql {.  
1310: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1320: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
1330: 20 62 20 52 45 46 45 52 45 4e 43 45 53 20 74 32   b REFERENCES t2
1340: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
1350: 42 4c 45 20 74 32 28 78 20 50 52 49 4d 41 52 59  BLE t2(x PRIMARY
1360: 20 4b 45 59 2c 20 79 20 52 45 46 45 52 45 4e 43   KEY, y REFERENC
1370: 45 53 20 74 31 29 3b 0a 20 20 7d 0a 0a 0a 20 20  ES t1);.  }...  
1380: 70 72 6f 63 20 63 6f 6e 66 6c 69 63 74 5f 68 61  proc conflict_ha
1390: 6e 64 6c 65 72 20 7b 61 72 67 73 7d 20 7b 20 72  ndler {args} { r
13a0: 65 74 75 72 6e 20 22 41 42 4f 52 54 22 20 7d 0a  eturn "ABORT" }.
13b0: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
13c0: 65 74 5f 61 70 70 6c 79 20 64 62 20 24 63 63 20  et_apply db $cc 
13d0: 63 6f 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72  conflict_handler
13e0: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
13f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1400: 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t1;.    SELECT *
1410: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
1420: 7b 6f 6e 65 20 7b 76 61 6c 75 65 20 6f 6e 65 7d  {one {value one}
1430: 20 7b 76 61 6c 75 65 20 6f 6e 65 7d 20 6f 6e 65   {value one} one
1440: 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 33 2e 31  }..do_test 3.3.1
1450: 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68   {.  list [catch
1460: 20 7b 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73   {sqlite3changes
1470: 65 74 5f 61 70 70 6c 79 20 64 62 20 24 3a 3a 63  et_apply db $::c
1480: 63 64 65 6c 31 20 63 6f 6e 66 6c 69 63 74 5f 68  cdel1 conflict_h
1490: 61 6e 64 6c 65 72 7d 20 6d 73 67 5d 20 24 6d 73  andler} msg] $ms
14a0: 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 43 4f  g.} {1 SQLITE_CO
14b0: 4e 53 54 52 41 49 4e 54 7d 0a 0a 64 6f 5f 74 65  NSTRAINT}..do_te
14c0: 73 74 20 33 2e 33 2e 32 20 7b 0a 20 20 6c 69 73  st 3.3.2 {.  lis
14d0: 74 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65  t [catch {sqlite
14e0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
14f0: 20 64 62 20 24 3a 3a 63 63 64 65 6c 32 20 63 6f   db $::ccdel2 co
1500: 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72 7d 20  nflict_handler} 
1510: 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53  msg] $msg.} {1 S
1520: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1530: 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 33 2e 34  }..do_test 3.3.4
1540: 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74  .1 {.  list [cat
1550: 63 68 20 7b 73 71 6c 69 74 65 33 63 68 61 6e 67  ch {sqlite3chang
1560: 65 73 65 74 5f 61 70 70 6c 79 20 64 62 20 24 3a  eset_apply db $:
1570: 3a 63 63 64 65 6c 20 63 6f 6e 66 6c 69 63 74 5f  :ccdel conflict_
1580: 68 61 6e 64 6c 65 72 7d 20 6d 73 67 5d 20 24 6d  handler} msg] $m
1590: 73 67 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65  sg.} {0 {}}.do_e
15a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e  xecsql_test 3.3.
15b0: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  4.2 {.  SELECT *
15c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
15d0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
15e0: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 35 2e  {}..do_test 3.5.
15f0: 31 20 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63  1 {.  list [catc
1600: 68 20 7b 73 71 6c 69 74 65 33 63 68 61 6e 67 65  h {sqlite3change
1610: 73 65 74 5f 61 70 70 6c 79 20 64 62 20 24 3a 3a  set_apply db $::
1620: 63 63 31 20 63 6f 6e 66 6c 69 63 74 5f 68 61 6e  cc1 conflict_han
1630: 64 6c 65 72 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  dler} msg] $msg.
1640: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 43 4f 4e 53  } {1 SQLITE_CONS
1650: 54 52 41 49 4e 54 7d 0a 64 6f 5f 74 65 73 74 20  TRAINT}.do_test 
1660: 33 2e 35 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b  3.5.2 {.  list [
1670: 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 63 68  catch {sqlite3ch
1680: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 20 64 62  angeset_apply db
1690: 20 24 3a 3a 63 63 32 20 63 6f 6e 66 6c 69 63 74   $::cc2 conflict
16a0: 5f 68 61 6e 64 6c 65 72 7d 20 6d 73 67 5d 20 24  _handler} msg] $
16b0: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
16c0: 43 4f 4e 53 54 52 41 49 4e 54 7d 0a 0a 23 2d 2d  CONSTRAINT}..#--
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  --.# Test that i
1720: 66 20 61 20 63 68 61 6e 67 65 20 74 68 61 74 20  f a change that 
1730: 61 66 66 65 63 74 73 20 46 4b 20 70 72 6f 63 65  affects FK proce
1740: 73 73 69 6e 67 20 69 73 20 6e 6f 74 20 61 70 70  ssing is not app
1750: 6c 69 65 64 20 0a 23 20 64 75 65 20 74 6f 20 61  lied .# due to a
1760: 20 73 65 70 61 72 61 74 65 20 63 6f 6e 73 74 72   separate constr
1770: 61 69 6e 74 2c 20 53 51 4c 69 74 65 20 64 6f 65  aint, SQLite doe
1780: 73 20 6e 6f 74 20 67 65 74 20 63 6f 6e 66 75 73  s not get confus
1790: 65 64 20 61 6e 64 0a 23 20 69 6e 63 72 65 6d 65  ed and.# increme
17a0: 6e 74 20 46 4b 20 63 6f 75 6e 74 65 72 73 20 61  nt FK counters a
17b0: 6e 79 77 61 79 2e 0a 23 0a 64 72 6f 70 5f 61 6c  nyway..#.drop_al
17c0: 6c 5f 74 61 62 6c 65 73 0a 64 6f 5f 65 78 65 63  l_tables.do_exec
17d0: 73 71 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a 20  sql_test 4.1 {. 
17e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 31   CREATE TABLE p1
17f0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1800: 79 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  y);.  CREATE TAB
1810: 4c 45 20 63 31 28 61 20 50 52 49 4d 41 52 59 20  LE c1(a PRIMARY 
1820: 4b 45 59 2c 20 62 20 52 45 46 45 52 45 4e 43 45  KEY, b REFERENCE
1830: 53 20 70 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  S p1);.  INSERT 
1840: 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 31  INTO p1 VALUES(1
1850: 2c 31 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  ,1);.}..do_execs
1860: 71 6c 5f 74 65 73 74 20 34 2e 32 2e 31 20 7b 0a  ql_test 4.2.1 {.
1870: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 50 52 41    BEGIN;.    PRA
1880: 47 4d 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67  GMA defer_foreig
1890: 6e 5f 6b 65 79 73 20 3d 20 31 3b 0a 20 20 20 20  n_keys = 1;.    
18a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56  INSERT INTO c1 V
18b0: 41 4c 55 45 53 28 27 78 27 2c 20 27 78 27 29 3b  ALUES('x', 'x');
18c0: 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .}.do_catchsql_t
18d0: 65 73 74 20 34 2e 32 2e 32 20 7b 20 43 4f 4d 4d  est 4.2.2 { COMM
18e0: 49 54 20 7d 20 7b 31 20 7b 46 4f 52 45 49 47 4e  IT } {1 {FOREIGN
18f0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1900: 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 63 61 74 63  failed}}.do_catc
1910: 68 73 71 6c 5f 74 65 73 74 20 34 2e 32 2e 33 20  hsql_test 4.2.3 
1920: 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 20 7b 30 20  { ROLLBACK } {0 
1930: 7b 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {}}..do_execsql_
1940: 74 65 73 74 20 34 2e 33 2e 31 20 7b 0a 20 20 42  test 4.3.1 {.  B
1950: 45 47 49 4e 3b 0a 20 20 20 20 50 52 41 47 4d 41  EGIN;.    PRAGMA
1960: 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f 6b   defer_foreign_k
1970: 65 79 73 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53  eys = 1;.    INS
1980: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
1990: 45 53 28 31 2c 20 31 29 3b 0a 7d 0a 64 6f 5f 63  ES(1, 1);.}.do_c
19a0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34 2e 33  atchsql_test 4.3
19b0: 2e 32 20 7b 20 0a 20 20 49 4e 53 45 52 54 20 49  .2 { .  INSERT I
19c0: 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c  NTO c1 VALUES(1,
19d0: 20 27 78 27 29 20 0a 7d 20 7b 31 20 7b 55 4e 49   'x') .} {1 {UNI
19e0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
19f0: 61 69 6c 65 64 3a 20 63 31 2e 61 7d 7d 0a 0a 64  ailed: c1.a}}..d
1a00: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
1a10: 34 2e 33 2e 33 20 7b 20 43 4f 4d 4d 49 54 20 7d  4.3.3 { COMMIT }
1a20: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 63 61 74 63 68   {0 {}}.do_catch
1a30: 73 71 6c 5f 74 65 73 74 20 34 2e 33 2e 34 20 7b  sql_test 4.3.4 {
1a40: 20 42 45 47 49 4e 20 3b 20 43 4f 4d 4d 49 54 20   BEGIN ; COMMIT 
1a50: 7d 20 7b 30 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  } {0 {}}..#-----
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1aa0: 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
1ab0: 20 44 45 4c 45 54 45 20 63 68 61 6e 67 65 20 63   DELETE change c
1ac0: 61 6e 6e 6f 74 20 62 65 20 61 70 70 6c 69 65 64  annot be applied
1ad0: 20 64 75 65 20 74 6f 20 61 6e 20 0a 23 20 53 51   due to an .# SQ
1ae0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1af0: 65 72 72 6f 72 20 74 68 72 6f 77 6e 20 62 79 20  error thrown by 
1b00: 61 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  a trigger progra
1b10: 6d 2c 20 74 68 69 6e 67 73 20 64 6f 20 6e 6f 74  m, things do not
1b20: 0a 23 20 67 6f 20 61 77 72 79 2e 0a 0a 64 72 6f  .# go awry...dro
1b30: 70 5f 61 6c 6c 5f 74 61 62 6c 65 73 0a 72 65 73  p_all_tables.res
1b40: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
1b50: 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 43 52  _test 5.1 {.  CR
1b60: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 20  EATE TABLE x1(x 
1b70: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1b80: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1b90: 78 32 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  x2(x PRIMARY KEY
1ba0: 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , y);.  INSERT I
1bb0: 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 31 2c  NTO x2 VALUES(1,
1bc0: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
1bd0: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 31 2c 20  TO x1 VALUES(1, 
1be0: 31 29 3b 0a 7d 0a 0a 73 65 74 20 3a 3a 63 63 20  1);.}..set ::cc 
1bf0: 5b 63 68 61 6e 67 65 73 65 74 5f 66 72 6f 6d 5f  [changeset_from_
1c00: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
1c10: 4d 20 78 31 3b 20 7d 5d 0a 0a 64 6f 5f 65 78 65  M x1; }]..do_exe
1c20: 63 73 71 6c 5f 74 65 73 74 20 35 2e 32 20 7b 0a  csql_test 5.2 {.
1c30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
1c40: 20 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20   VALUES(1, 1);. 
1c50: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1c60: 74 72 31 20 41 46 54 45 52 20 44 45 4c 45 54 45  tr1 AFTER DELETE
1c70: 20 4f 4e 20 78 31 20 42 45 47 49 4e 0a 20 20 20   ON x1 BEGIN.   
1c80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
1c90: 56 41 4c 55 45 53 28 6f 6c 64 2e 78 2c 20 6f 6c  VALUES(old.x, ol
1ca0: 64 2e 79 29 3b 0a 20 20 45 4e 44 3b 0a 7d 20 7b  d.y);.  END;.} {
1cb0: 7d 0a 0a 70 72 6f 63 20 63 6f 6e 66 6c 69 63 74  }..proc conflict
1cc0: 5f 68 61 6e 64 6c 65 72 20 7b 61 72 67 73 7d 20  _handler {args} 
1cd0: 7b 20 72 65 74 75 72 6e 20 22 41 42 4f 52 54 22  { return "ABORT"
1ce0: 20 7d 0a 64 6f 5f 74 65 73 74 20 35 2e 33 20 7b   }.do_test 5.3 {
1cf0: 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b  .  list [catch {
1d00: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
1d10: 5f 61 70 70 6c 79 20 64 62 20 24 3a 3a 63 63 20  _apply db $::cc 
1d20: 63 6f 6e 66 6c 69 63 74 5f 68 61 6e 64 6c 65 72  conflict_handler
1d30: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31  } msg] $msg.} {1
1d40: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 7d 0a 0a   SQLITE_ABORT}..
1d50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1d60: 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.4 {.  SELECT *
1d70: 20 46 52 4f 4d 20 58 31 3b 0a 7d 20 7b 31 20 31   FROM X1;.} {1 1
1d80: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.