/ Hex Artifact Content
Login

Artifact 97556f5164ac29f2344b24bd7de6a3a35a95c390:


0000: 23 20 32 30 31 34 20 41 75 67 75 73 74 20 31 36  # 2014 August 16
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 2a 2a 0a 23 0a 23 0a 0a 69 66 20 7b  ******.#.#..if {
0170: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74 65  ![info exists te
0180: 73 74 64 69 72 5d 7d 20 7b 0a 20 20 73 65 74 20  stdir]} {.  set 
0190: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 6a 6f  testdir [file jo
01a0: 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  in [file dirname
01b0: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20   [info script]] 
01c0: 2e 2e 20 2e 2e 20 74 65 73 74 5d 0a 7d 20 0a 73  .. .. test].} .s
01d0: 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ource [file join
01e0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
01f0: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20 73 65  info script]] se
0200: 73 73 69 6f 6e 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c  ssion_common.tcl
0210: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0220: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69 66 63  r/tester.tcl.ifc
0230: 61 70 61 62 6c 65 20 21 73 65 73 73 69 6f 6e 20  apable !session 
0240: 7b 66 69 6e 69 73 68 5f 74 65 73 74 3b 20 72 65  {finish_test; re
0250: 74 75 72 6e 7d 0a 0a 73 65 74 20 74 65 73 74 70  turn}..set testp
0260: 72 65 66 69 78 20 73 65 73 73 69 6f 6e 43 0a 0a  refix sessionC..
0270: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
02c0: 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  t the outcome of
02d0: 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74   a DELETE operat
02e0: 69 6f 6e 20 6d 61 64 65 20 61 73 20 70 61 72 74  ion made as part
02f0: 20 6f 66 20 61 70 70 6c 79 69 6e 67 20 61 0a 23   of applying a.#
0300: 20 63 68 61 6e 67 65 73 65 74 20 66 61 69 6c 69   changeset faili
0310: 6e 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43  ng with SQLITE_C
0320: 4f 4e 53 54 52 41 49 4e 54 2e 20 54 68 69 73 20  ONSTRAINT. This 
0330: 6d 61 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  may happen if an
0340: 0a 23 20 4f 4e 20 44 45 4c 45 54 45 20 52 45 53  .# ON DELETE RES
0350: 54 52 49 43 54 20 66 6f 72 65 69 67 6e 20 6b 65  TRICT foreign ke
0360: 79 20 61 63 74 69 6f 6e 20 69 73 20 74 72 69 67  y action is trig
0370: 67 65 72 65 64 2c 20 6f 72 20 69 66 20 61 20 74  gered, or if a t
0380: 72 69 67 67 65 72 0a 23 20 70 72 6f 67 72 61 6d  rigger.# program
0390: 20 72 61 69 73 65 73 20 61 20 63 6f 6e 73 74 72   raises a constr
03a0: 61 69 6e 74 20 73 6f 6d 65 68 6f 77 2e 0a 23 0a  aint somehow..#.
03b0: 23 20 55 50 44 41 54 45 3a 20 54 68 65 20 61 62  # UPDATE: The ab
03c0: 6f 76 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ove is no longer
03d0: 20 74 72 75 65 2c 20 61 73 20 22 50 52 41 47 4d   true, as "PRAGM
03e0: 41 20 64 65 66 65 72 5f 66 6f 72 65 69 67 6e 5f  A defer_foreign_
03f0: 6b 65 79 73 22 0a 23 20 6e 6f 77 20 64 69 73 61  keys".# now disa
0400: 62 6c 65 73 20 22 52 45 53 54 52 49 43 54 22 20  bles "RESTRICT" 
0410: 70 72 6f 63 65 73 73 69 6e 67 2e 20 54 68 65 20  processing. The 
0420: 74 65 73 74 20 62 65 6c 6f 77 20 68 61 73 20 62  test below has b
0430: 65 65 6e 20 72 65 77 72 69 74 74 65 6e 20 0a 23  een rewritten .#
0440: 20 74 6f 20 75 73 65 20 61 20 74 72 69 67 67 65   to use a trigge
0450: 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  r instead of a f
0460: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 65  oreign key to te
0470: 73 74 20 74 68 69 73 20 63 61 73 65 2e 0a 23 0a  st this case..#.
0480: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0490: 31 2e 30 20 7b 0a 20 20 50 52 41 47 4d 41 20 66  1.0 {.  PRAGMA f
04a0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b  oreign_keys = 1;
04b0: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
04c0: 20 70 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59   p(a PRIMARY KEY
04d0: 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
04e0: 45 20 54 41 42 4c 45 20 63 28 64 20 50 52 49 4d  E TABLE c(d PRIM
04f0: 41 52 59 20 4b 45 59 2c 20 65 20 2f 2a 20 52 45  ARY KEY, e /* RE
0500: 46 45 52 45 4e 43 45 53 20 70 20 4f 4e 20 44 45  FERENCES p ON DE
0510: 4c 45 54 45 20 52 45 53 54 52 49 43 54 20 2a 2f  LETE RESTRICT */
0520: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49  );..  CREATE TRI
0530: 47 47 45 52 20 72 65 73 74 72 69 63 74 5f 74 72  GGER restrict_tr
0540: 69 67 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45  ig BEFORE DELETE
0550: 20 4f 4e 20 70 20 42 45 47 49 4e 0a 20 20 20 20   ON p BEGIN.    
0560: 53 45 4c 45 43 54 20 72 61 69 73 65 28 41 42 4f  SELECT raise(ABO
0570: 52 54 2c 20 27 65 72 72 6f 72 21 27 29 20 46 52  RT, 'error!') FR
0580: 4f 4d 20 63 20 57 48 45 52 45 20 65 3d 6f 6c 64  OM c WHERE e=old
0590: 2e 61 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 49 4e  .a;.  END;..  IN
05a0: 53 45 52 54 20 49 4e 54 4f 20 70 20 56 41 4c 55  SERT INTO p VALU
05b0: 45 53 28 27 6f 6e 65 27 2c 20 31 2c 20 31 29 3b  ES('one', 1, 1);
05c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
05d0: 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 32   VALUES('two', 2
05e0: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
05f0: 4e 54 4f 20 70 20 56 41 4c 55 45 53 28 27 74 68  NTO p VALUES('th
0600: 72 65 65 27 2c 20 33 2c 20 33 29 3b 0a 0a 20 20  ree', 3, 3);..  
0610: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
0620: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
0630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20    INSERT INTO c 
0640: 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
0650: 27 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 31  ');.}..do_test 1
0660: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42  .1 {.  execsql B
0670: 45 47 49 4e 0a 20 20 73 65 74 20 43 20 5b 63 68  EGIN.  set C [ch
0680: 61 6e 67 65 73 65 74 5f 66 72 6f 6d 5f 73 71 6c  angeset_from_sql
0690: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
06a0: 54 4f 20 63 20 56 41 4c 55 45 53 28 34 2c 20 27  TO c VALUES(4, '
06b0: 6f 6e 65 27 29 3b 0a 20 20 20 20 44 45 4c 45 54  one');.    DELET
06c0: 45 20 46 52 4f 4d 20 70 20 57 48 45 52 45 20 61  E FROM p WHERE a
06d0: 3d 27 74 77 6f 27 3b 0a 20 20 7d 5d 0a 20 20 65  ='two';.  }].  e
06e0: 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a  xecsql ROLLBACK.
06f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0700: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41  INSERT INTO c VA
0710: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
0720: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
0730: 74 20 31 2e 32 2e 31 20 7b 0a 20 20 70 72 6f 63  t 1.2.1 {.  proc
0740: 20 78 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73   xConflict {args
0750: 7d 20 7b 20 72 65 74 75 72 6e 20 22 41 42 4f 52  } { return "ABOR
0760: 54 22 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 73  T" }.  catch { s
0770: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
0780: 61 70 70 6c 79 20 64 62 20 24 43 20 78 43 6f 6e  apply db $C xCon
0790: 66 6c 69 63 74 20 7d 20 6d 73 67 0a 20 20 73 65  flict } msg.  se
07a0: 74 20 6d 73 67 0a 7d 20 7b 53 51 4c 49 54 45 5f  t msg.} {SQLITE_
07b0: 41 42 4f 52 54 7d 0a 64 6f 5f 65 78 65 63 73 71  ABORT}.do_execsq
07c0: 6c 5f 74 65 73 74 20 31 2e 32 2e 32 20 7b 20 53  l_test 1.2.2 { S
07d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d  ELECT * FROM c }
07e0: 20 7b 31 20 6f 6e 65 20 33 20 74 68 72 65 65 20   {1 one 3 three 
07f0: 32 20 74 77 6f 7d 0a 0a 64 6f 5f 74 65 73 74 20  2 two}..do_test 
0800: 31 2e 33 2e 31 20 7b 0a 20 20 70 72 6f 63 20 78  1.3.1 {.  proc x
0810: 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73 7d 20  Conflict {args} 
0820: 7b 20 72 65 74 75 72 6e 20 22 4f 4d 49 54 22 20  { return "OMIT" 
0830: 7d 0a 20 20 63 61 74 63 68 20 7b 20 73 71 6c 69  }.  catch { sqli
0840: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70  te3changeset_app
0850: 6c 79 20 64 62 20 24 43 20 78 43 6f 6e 66 6c 69  ly db $C xConfli
0860: 63 74 20 7d 20 6d 73 67 0a 20 20 73 65 74 20 6d  ct } msg.  set m
0870: 73 67 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73  sg.} {}.do_execs
0880: 71 6c 5f 74 65 73 74 20 31 2e 33 2e 32 20 7b 20  ql_test 1.3.2 { 
0890: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20  SELECT * FROM c 
08a0: 7d 20 7b 31 20 6f 6e 65 20 33 20 74 68 72 65 65  } {1 one 3 three
08b0: 20 32 20 74 77 6f 20 34 20 6f 6e 65 7d 0a 64 6f   2 two 4 one}.do
08c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
08d0: 33 2e 33 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  3.3 { .  SELECT 
08e0: 2a 20 46 52 4f 4d 20 70 3b 0a 7d 20 7b 6f 6e 65  * FROM p;.} {one
08f0: 20 31 20 31 20 74 77 6f 20 32 20 32 20 74 68 72   1 1 two 2 2 thr
0900: 65 65 20 33 20 33 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  ee 3 3}...#-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
0960: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 20 61   concatenating a
0970: 20 63 68 61 6e 67 65 73 65 74 20 77 69 74 68 20   changeset with 
0980: 61 20 70 61 74 63 68 73 65 74 20 64 6f 65 73 20  a patchset does 
0990: 6e 6f 74 20 77 6f 72 6b 2e 0a 23 20 41 6e 79 20  not work..# Any 
09a0: 61 74 74 65 6d 70 74 20 74 6f 20 64 6f 20 73 6f  attempt to do so
09b0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
09c0: 45 52 52 4f 52 2e 0a 23 0a 72 65 73 65 74 5f 64  ERROR..#.reset_d
09d0: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
09e0: 74 20 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 2.0 {.  CREATE
09f0: 20 54 41 42 4c 45 20 78 31 28 74 2c 20 76 20 50   TABLE x1(t, v P
0a00: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 49  RIMARY KEY);.  I
0a10: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
0a20: 4c 55 45 53 28 31 32 2c 20 35 35 29 3b 0a 20 20  LUES(12, 55);.  
0a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
0a40: 41 4c 55 45 53 28 35 35 2c 20 31 34 29 3b 0a 7d  ALUES(55, 14);.}
0a50: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 20 7b 0a  ..do_test 2.1 {.
0a60: 20 20 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a    execsql BEGIN.
0a70: 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
0a80: 6e 20 53 31 20 64 62 20 6d 61 69 6e 0a 20 20 53  n S1 db main.  S
0a90: 31 20 61 74 74 61 63 68 20 2a 0a 20 20 65 78 65  1 attach *.  exe
0aa0: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
0ab0: 45 20 78 31 20 53 45 54 20 74 3d 31 33 20 57 48  E x1 SET t=13 WH
0ac0: 45 52 45 20 76 3d 35 35 3b 0a 20 20 20 20 49 4e  ERE v=55;.    IN
0ad0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
0ae0: 55 45 53 28 39 39 2c 20 31 32 33 29 3b 0a 20 20  UES(99, 123);.  
0af0: 7d 0a 20 20 73 65 74 20 70 61 74 63 68 73 65 74  }.  set patchset
0b00: 20 5b 53 31 20 70 61 74 63 68 73 65 74 5d 0a 20   [S1 patchset]. 
0b10: 20 53 31 20 64 65 6c 65 74 65 0a 0a 20 20 73 71   S1 delete..  sq
0b20: 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 31 20  lite3session S1 
0b30: 64 62 20 6d 61 69 6e 0a 20 20 53 31 20 61 74 74  db main.  S1 att
0b40: 61 63 68 20 2a 0a 20 20 65 78 65 63 73 71 6c 20  ach *.  execsql 
0b50: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 78 31 20  {.    UPDATE x1 
0b60: 53 45 54 20 74 3d 35 36 20 57 48 45 52 45 20 76  SET t=56 WHERE v
0b70: 3d 31 34 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  =14;.    INSERT 
0b80: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 32  INTO x1 VALUES(2
0b90: 32 2c 20 39 39 38 29 3b 0a 20 20 7d 0a 20 20 73  2, 998);.  }.  s
0ba0: 65 74 20 63 68 61 6e 67 65 73 65 74 20 5b 53 31  et changeset [S1
0bb0: 20 63 68 61 6e 67 65 73 65 74 5d 0a 20 20 53 31   changeset].  S1
0bc0: 20 64 65 6c 65 74 65 0a 0a 20 20 65 78 65 63 73   delete..  execs
0bd0: 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d 20 7b 7d  ql ROLLBACK.} {}
0be0: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 32 20 7b 0a  ..do_test 2.2 {.
0bf0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
0c00: 7b 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  { sqlite3changes
0c10: 65 74 5f 63 6f 6e 63 61 74 20 24 70 61 74 63 68  et_concat $patch
0c20: 73 65 74 20 24 63 68 61 6e 67 65 73 65 74 20 7d  set $changeset }
0c30: 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63   msg].  list $rc
0c40: 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54   $msg.} {1 SQLIT
0c50: 45 5f 45 52 52 4f 52 7d 0a 0a 64 6f 5f 74 65 73  E_ERROR}..do_tes
0c60: 74 20 32 2e 33 20 7b 0a 20 20 73 65 74 20 72 63  t 2.3 {.  set rc
0c70: 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65   [catch { sqlite
0c80: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
0c90: 74 20 24 63 68 61 6e 67 65 73 65 74 20 24 70 61  t $changeset $pa
0ca0: 74 63 68 73 65 74 20 7d 20 6d 73 67 5d 0a 20 20  tchset } msg].  
0cb0: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20  list $rc $msg.} 
0cc0: 7b 31 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d  {1 SQLITE_ERROR}
0cd0: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 34 20 7b 0a  ..do_test 2.4 {.
0ce0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
0cf0: 7b 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  { sqlite3changes
0d00: 65 74 5f 63 6f 6e 63 61 74 20 7b 7d 20 24 70 61  et_concat {} $pa
0d10: 74 63 68 73 65 74 20 7d 20 6d 73 67 5d 0a 20 20  tchset } msg].  
0d20: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20  list $rc $msg.} 
0d30: 5b 6c 69 73 74 20 30 20 24 70 61 74 63 68 73 65  [list 0 $patchse
0d40: 74 5d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 35 20  t]..do_test 2.5 
0d50: 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63  {.  set rc [catc
0d60: 68 20 7b 20 73 71 6c 69 74 65 33 63 68 61 6e 67  h { sqlite3chang
0d70: 65 73 65 74 5f 63 6f 6e 63 61 74 20 24 70 61 74  eset_concat $pat
0d80: 63 68 73 65 74 20 7b 7d 20 7d 20 6d 73 67 5d 0a  chset {} } msg].
0d90: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
0da0: 7d 20 5b 6c 69 73 74 20 30 20 24 70 61 74 63 68  } [list 0 $patch
0db0: 73 65 74 5d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e  set]..do_test 2.
0dc0: 36 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61  6 {.  set rc [ca
0dd0: 74 63 68 20 7b 20 73 71 6c 69 74 65 33 63 68 61  tch { sqlite3cha
0de0: 6e 67 65 73 65 74 5f 63 6f 6e 63 61 74 20 7b 7d  ngeset_concat {}
0df0: 20 24 63 68 61 6e 67 65 73 65 74 20 7d 20 6d 73   $changeset } ms
0e00: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
0e10: 73 67 0a 7d 20 5b 6c 69 73 74 20 30 20 24 63 68  sg.} [list 0 $ch
0e20: 61 6e 67 65 73 65 74 5d 0a 0a 64 6f 5f 74 65 73  angeset]..do_tes
0e30: 74 20 32 2e 37 20 7b 0a 20 20 73 65 74 20 72 63  t 2.7 {.  set rc
0e40: 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65   [catch { sqlite
0e50: 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e 63 61  3changeset_conca
0e60: 74 20 24 63 68 61 6e 67 65 73 65 74 20 7b 7d 20  t $changeset {} 
0e70: 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72  } msg].  list $r
0e80: 63 20 24 6d 73 67 0a 7d 20 5b 6c 69 73 74 20 30  c $msg.} [list 0
0e90: 20 24 63 68 61 6e 67 65 73 65 74 5d 0a 0a 64 6f   $changeset]..do
0ea0: 5f 74 65 73 74 20 32 2e 38 20 7b 0a 20 20 73 65  _test 2.8 {.  se
0eb0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73 71  t rc [catch { sq
0ec0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63  lite3changeset_c
0ed0: 6f 6e 63 61 74 20 7b 7d 20 7b 7d 20 7d 20 6d 73  oncat {} {} } ms
0ee0: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
0ef0: 73 67 0a 7d 20 5b 6c 69 73 74 20 30 20 7b 7d 5d  sg.} [list 0 {}]
0f00: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0f50: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 78 46  Test that the xF
0f60: 69 6c 74 65 72 20 61 72 67 75 6d 65 6e 74 20 74  ilter argument t
0f70: 6f 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73  o sqlite3changes
0f80: 65 74 5f 61 70 70 6c 79 28 29 20 77 6f 72 6b 73  et_apply() works
0f90: 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f  ..#.reset_db.do_
0fa0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 30  execsql_test 3.0
0fb0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
0fc0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
0fd0: 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  EY, b);.  CREATE
0fe0: 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d   TABLE t2(a PRIM
0ff0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 43  ARY KEY, b);.  C
1000: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1010: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
1020: 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 31 20  ;.}.do_test 3.1 
1030: 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47 49  {.  execsql BEGI
1040: 4e 0a 20 20 73 65 74 20 63 68 61 6e 67 65 73 65  N.  set changese
1050: 74 20 5b 63 68 61 6e 67 65 73 65 74 5f 66 72 6f  t [changeset_fro
1060: 6d 5f 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  m_sql {.    INSE
1070: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1080: 53 28 31 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53  S(1, 1);.    INS
1090: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
10a0: 45 53 28 32 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(2, 2);.    IN
10b0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
10c0: 55 45 53 28 33 2c 20 33 29 3b 0a 20 20 7d 5d 0a  UES(3, 3);.  }].
10d0: 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
10e0: 43 4b 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  CK.} {}.do_test 
10f0: 33 2e 32 20 7b 0a 20 20 70 72 6f 63 20 78 46 69  3.2 {.  proc xFi
1100: 6c 74 65 72 20 7b 7a 4e 61 6d 65 7d 20 7b 0a 20  lter {zName} {. 
1110: 20 20 20 69 66 20 7b 24 7a 4e 61 6d 65 20 3d 3d     if {$zName ==
1120: 20 22 74 31 22 7d 20 7b 20 72 65 74 75 72 6e 20   "t1"} { return 
1130: 31 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30  1 }.    return 0
1140: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 63 68  .  }.  sqlite3ch
1150: 61 6e 67 65 73 65 74 5f 61 70 70 6c 79 20 64 62  angeset_apply db
1160: 20 24 63 68 61 6e 67 65 73 65 74 20 6e 6f 6f 70   $changeset noop
1170: 20 78 46 69 6c 74 65 72 0a 20 20 65 78 65 63 73   xFilter.  execs
1180: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1190: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  * FROM t1;.    S
11a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
11b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
11c0: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t3;.  }.} {1 
11d0: 31 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 33 20 7b  1}.do_test 3.3 {
11e0: 0a 20 20 70 72 6f 63 20 78 46 69 6c 74 65 72 20  .  proc xFilter 
11f0: 7b 7a 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 69 66  {zName} {.    if
1200: 20 7b 24 7a 4e 61 6d 65 20 3d 3d 20 22 74 33 22   {$zName == "t3"
1210: 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20  } { return 1 }. 
1220: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a     return 0.  }.
1230: 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73    sqlite3changes
1240: 65 74 5f 61 70 70 6c 79 20 64 62 20 24 63 68 61  et_apply db $cha
1250: 6e 67 65 73 65 74 20 6e 6f 6f 70 20 78 46 69 6c  ngeset noop xFil
1260: 74 65 72 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ter.  execsql {.
1270: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1280: 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t1;.    SELECT
1290: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
12a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
12b0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 33 20 33  ;.  }.} {1 1 3 3
12c0: 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  }....finish_test
12d0: 0a 0a                                            ..