/ Hex Artifact Content
Login

Artifact c2f178d4dfd723a5fd94a730ea2ccb44c669e3ce:


0000: 23 20 32 30 31 35 20 4a 75 6e 65 20 30 32 0a 23  # 2015 June 02.#
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 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20  or the sessions 
01a0: 6d 6f 64 75 6c 65 2e 0a 23 20 53 70 65 63 69 66  module..# Specif
01b0: 69 63 61 6c 6c 79 2c 20 69 74 20 74 65 73 74 73  ically, it tests
01c0: 20 74 68 61 74 20 74 61 62 6c 65 73 20 61 70 70   that tables app
01d0: 65 61 72 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ear in the corre
01e0: 63 74 20 6f 72 64 65 72 0a 23 20 77 69 74 68 69  ct order.# withi
01f0: 6e 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64  n changesets and
0200: 20 70 61 74 63 68 73 65 74 73 2e 0a 23 0a 0a 0a   patchsets..#...
0210: 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73  .if {![info exis
0220: 74 73 20 74 65 73 74 64 69 72 5d 7d 20 7b 0a 20  ts testdir]} {. 
0230: 20 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69   set testdir [fi
0240: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
0250: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
0260: 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74 65 73 74 5d  pt]] .. .. test]
0270: 0a 7d 20 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65  .} .source [file
0280: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
0290: 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
02a0: 5d 5d 20 73 65 73 73 69 6f 6e 5f 63 6f 6d 6d 6f  ]] session_commo
02b0: 6e 2e 74 63 6c 5d 0a 73 6f 75 72 63 65 20 24 74  n.tcl].source $t
02c0: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
02d0: 6c 0a 69 66 63 61 70 61 62 6c 65 20 21 73 65 73  l.ifcapable !ses
02e0: 73 69 6f 6e 20 7b 66 69 6e 69 73 68 5f 74 65 73  sion {finish_tes
02f0: 74 3b 20 72 65 74 75 72 6e 7d 0a 73 65 74 20 74  t; return}.set t
0300: 65 73 74 70 72 65 66 69 78 20 73 65 73 73 69 6f  estprefix sessio
0310: 6e 46 0a 0a 23 0a 23 20 54 65 73 74 20 70 6c 61  nF..#.# Test pla
0320: 6e 3a 0a 23 0a 23 20 20 20 20 31 2e 2a 3a 20 54  n:.#.#    1.*: T
0330: 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33  est that sqlite3
0340: 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
0350: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 73  t() and sqlite3s
0360: 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28  ession_patchset(
0370: 29 0a 23 20 20 20 20 20 20 20 20 20 6f 75 74 70  ).#         outp
0380: 75 74 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ut tables in the
0390: 20 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 23 0a   right order..#.
03a0: 23 20 20 20 20 32 2e 2a 3a 20 54 65 73 74 20 74  #    2.*: Test t
03b0: 68 61 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  hat sqlite3sessi
03c0: 6f 6e 5f 69 6e 76 65 72 74 28 29 20 64 6f 65 73  on_invert() does
03d0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20   not modify the 
03e0: 6f 72 64 65 72 20 6f 66 0a 23 20 20 20 20 20 20  order of.#      
03f0: 20 20 20 74 61 62 6c 65 73 20 77 69 74 68 69 6e     tables within
0400: 20 61 20 63 68 61 6e 67 65 73 65 74 2e 0a 23 0a   a changeset..#.
0410: 23 20 20 20 20 33 2e 2a 3a 20 54 65 73 74 20 74  #    3.*: Test t
0420: 68 61 74 20 73 71 6c 69 74 65 33 73 65 73 73 69  hat sqlite3sessi
0430: 6f 6e 5f 63 6f 6e 63 61 74 20 6f 75 74 70 75 74  on_concat output
0440: 73 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  s tables in the 
0450: 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 23 0a 0a  right order..#..
0460: 23 20 43 72 65 61 74 65 20 61 20 64 62 20 73 63  # Create a db sc
0470: 68 65 6d 61 20 74 6f 20 75 73 65 2e 0a 23 0a 64  hema to use..#.d
0480: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0490: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
04a0: 42 4c 45 20 74 33 28 65 20 50 52 49 4d 41 52 59  BLE t3(e PRIMARY
04b0: 20 4b 45 59 2c 20 66 29 3b 0a 20 20 43 52 45 41   KEY, f);.  CREA
04c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
04d0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
04e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
04f0: 28 63 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (c PRIMARY KEY, 
0500: 64 29 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  d);.}..#--------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0550: 23 20 31 2e 2a 20 2d 20 63 68 61 6e 67 65 73 65  # 1.* - changese
0560: 74 28 29 20 61 6e 64 20 70 61 74 63 68 73 65 74  t() and patchset
0570: 28 29 2e 0a 23 0a 0a 66 6f 72 65 61 63 68 20 7b  ()..#..foreach {
0580: 74 6e 20 73 65 74 75 70 20 72 65 73 75 6c 74 7d  tn setup result}
0590: 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20 53 20 61   {.  1 {.    S a
05a0: 74 74 61 63 68 20 2a 0a 20 20 7d 20 7b 0a 20 20  ttach *.  } {.  
05b0: 20 20 7b 49 4e 53 45 52 54 20 74 32 20 30 20 58    {INSERT t2 0 X
05c0: 2e 20 7b 7d 20 7b 69 20 32 20 74 20 74 77 6f 7d  . {} {i 2 t two}
05d0: 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74  } .    {INSERT t
05e0: 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31 20 74  1 0 X. {} {i 1 t
05f0: 20 6f 6e 65 7d 7d 20 0a 20 20 20 20 7b 49 4e 53   one}} .    {INS
0600: 45 52 54 20 74 33 20 30 20 58 2e 20 7b 7d 20 7b  ERT t3 0 X. {} {
0610: 69 20 33 20 74 20 74 68 72 65 65 7d 7d 0a 20 20  i 3 t three}}.  
0620: 7d 0a 0a 20 20 32 20 7b 0a 20 20 20 20 53 20 61  }..  2 {.    S a
0630: 74 74 61 63 68 20 74 31 0a 20 20 20 20 53 20 61  ttach t1.    S a
0640: 74 74 61 63 68 20 2a 0a 20 20 7d 20 7b 0a 20 20  ttach *.  } {.  
0650: 20 20 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58    {INSERT t1 0 X
0660: 2e 20 7b 7d 20 7b 69 20 31 20 74 20 6f 6e 65 7d  . {} {i 1 t one}
0670: 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74  } .    {INSERT t
0680: 32 20 30 20 58 2e 20 7b 7d 20 7b 69 20 32 20 74  2 0 X. {} {i 2 t
0690: 20 74 77 6f 7d 7d 20 0a 20 20 20 20 7b 49 4e 53   two}} .    {INS
06a0: 45 52 54 20 74 33 20 30 20 58 2e 20 7b 7d 20 7b  ERT t3 0 X. {} {
06b0: 69 20 33 20 74 20 74 68 72 65 65 7d 7d 0a 20 20  i 3 t three}}.  
06c0: 7d 0a 0a 20 20 33 20 7b 0a 20 20 20 20 53 20 61  }..  3 {.    S a
06d0: 74 74 61 63 68 20 74 33 0a 20 20 20 20 53 20 61  ttach t3.    S a
06e0: 74 74 61 63 68 20 74 32 0a 20 20 20 20 53 20 61  ttach t2.    S a
06f0: 74 74 61 63 68 20 74 31 0a 20 20 7d 20 7b 0a 20  ttach t1.  } {. 
0700: 20 20 20 7b 49 4e 53 45 52 54 20 74 33 20 30 20     {INSERT t3 0 
0710: 58 2e 20 7b 7d 20 7b 69 20 33 20 74 20 74 68 72  X. {} {i 3 t thr
0720: 65 65 7d 7d 0a 20 20 20 20 7b 49 4e 53 45 52 54  ee}}.    {INSERT
0730: 20 74 32 20 30 20 58 2e 20 7b 7d 20 7b 69 20 32   t2 0 X. {} {i 2
0740: 20 74 20 74 77 6f 7d 7d 20 0a 20 20 20 20 7b 49   t two}} .    {I
0750: 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d  NSERT t1 0 X. {}
0760: 20 7b 69 20 31 20 74 20 6f 6e 65 7d 7d 20 0a 20   {i 1 t one}} . 
0770: 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c   }.} {.  execsql
0780: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
0790: 4f 4d 20 74 31 3b 0a 20 20 20 20 44 45 4c 45 54  OM t1;.    DELET
07a0: 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44  E FROM t2;.    D
07b0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b 0a 20  ELETE FROM t3;. 
07c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73   }.  sqlite3sess
07d0: 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20  ion S db main.  
07e0: 65 76 61 6c 20 24 73 65 74 75 70 0a 0a 20 20 64  eval $setup..  d
07f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0800: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 49 4e 53  .$tn.1 {.    INS
0810: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
0820: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
0830: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0840: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
0850: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0860: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20  TO t3 VALUES(3, 
0870: 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a 0a 20  'three');.  }.. 
0880: 20 64 6f 5f 63 68 61 6e 67 65 73 65 74 5f 74 65   do_changeset_te
0890: 73 74 20 31 2e 31 2e 24 74 6e 2e 32 20 53 20 24  st 1.1.$tn.2 S $
08a0: 72 65 73 75 6c 74 0a 20 20 64 6f 5f 70 61 74 63  result.  do_patc
08b0: 68 73 65 74 5f 74 65 73 74 20 20 31 2e 31 2e 24  hset_test  1.1.$
08c0: 74 6e 2e 33 20 53 20 24 72 65 73 75 6c 74 0a 0a  tn.3 S $result..
08d0: 20 20 53 20 64 65 6c 65 74 65 0a 7d 0a 0a 66 6f    S delete.}..fo
08e0: 72 65 61 63 68 20 7b 74 6e 20 73 65 74 75 70 20  reach {tn setup 
08f0: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 31 20 7b 0a  result} {.  1 {.
0900: 20 20 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20      S attach *. 
0910: 20 7d 20 7b 0a 20 20 20 20 7b 49 4e 53 45 52 54   } {.    {INSERT
0920: 20 74 32 20 30 20 58 2e 20 7b 7d 20 7b 69 20 34   t2 0 X. {} {i 4
0930: 20 74 20 66 6f 75 72 7d 7d 20 0a 20 20 20 20 7b   t four}} .    {
0940: 49 4e 53 45 52 54 20 74 32 20 30 20 58 2e 20 7b  INSERT t2 0 X. {
0950: 7d 20 7b 69 20 35 20 74 20 66 69 76 65 7d 7d 0a  } {i 5 t five}}.
0960: 20 20 20 20 7b 49 4e 53 45 52 54 20 74 31 20 30      {INSERT t1 0
0970: 20 58 2e 20 7b 7d 20 7b 69 20 31 20 74 20 6f 6e   X. {} {i 1 t on
0980: 65 7d 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54  e}} .    {INSERT
0990: 20 74 33 20 30 20 58 2e 20 7b 7d 20 7b 69 20 36   t3 0 X. {} {i 6
09a0: 20 74 20 73 69 78 7d 7d 0a 20 20 7d 0a 0a 20 20   t six}}.  }..  
09b0: 32 20 7b 0a 20 20 20 20 53 20 61 74 74 61 63 68  2 {.    S attach
09c0: 20 74 31 0a 20 20 20 20 53 20 61 74 74 61 63 68   t1.    S attach
09d0: 20 2a 0a 20 20 7d 20 7b 0a 20 20 20 20 7b 49 4e   *.  } {.    {IN
09e0: 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20  SERT t1 0 X. {} 
09f0: 7b 69 20 31 20 74 20 6f 6e 65 7d 7d 20 0a 20 20  {i 1 t one}} .  
0a00: 20 20 7b 49 4e 53 45 52 54 20 74 32 20 30 20 58    {INSERT t2 0 X
0a10: 2e 20 7b 7d 20 7b 69 20 34 20 74 20 66 6f 75 72  . {} {i 4 t four
0a20: 7d 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54 20  }} .    {INSERT 
0a30: 74 32 20 30 20 58 2e 20 7b 7d 20 7b 69 20 35 20  t2 0 X. {} {i 5 
0a40: 74 20 66 69 76 65 7d 7d 0a 20 20 20 20 7b 49 4e  t five}}.    {IN
0a50: 53 45 52 54 20 74 33 20 30 20 58 2e 20 7b 7d 20  SERT t3 0 X. {} 
0a60: 7b 69 20 36 20 74 20 73 69 78 7d 7d 0a 20 20 7d  {i 6 t six}}.  }
0a70: 0a 0a 20 20 33 20 7b 0a 20 20 20 20 53 20 61 74  ..  3 {.    S at
0a80: 74 61 63 68 20 74 33 0a 20 20 20 20 53 20 61 74  tach t3.    S at
0a90: 74 61 63 68 20 74 32 0a 20 20 20 20 53 20 61 74  tach t2.    S at
0aa0: 74 61 63 68 20 74 31 0a 20 20 7d 20 7b 0a 20 20  tach t1.  } {.  
0ab0: 20 20 7b 49 4e 53 45 52 54 20 74 33 20 30 20 58    {INSERT t3 0 X
0ac0: 2e 20 7b 7d 20 7b 69 20 36 20 74 20 73 69 78 7d  . {} {i 6 t six}
0ad0: 7d 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74 32  }.    {INSERT t2
0ae0: 20 30 20 58 2e 20 7b 7d 20 7b 69 20 34 20 74 20   0 X. {} {i 4 t 
0af0: 66 6f 75 72 7d 7d 20 0a 20 20 20 20 7b 49 4e 53  four}} .    {INS
0b00: 45 52 54 20 74 32 20 30 20 58 2e 20 7b 7d 20 7b  ERT t2 0 X. {} {
0b10: 69 20 35 20 74 20 66 69 76 65 7d 7d 0a 20 20 20  i 5 t five}}.   
0b20: 20 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e   {INSERT t1 0 X.
0b30: 20 7b 7d 20 7b 69 20 31 20 74 20 6f 6e 65 7d 7d   {} {i 1 t one}}
0b40: 20 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63   .  }.} {.  exec
0b50: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
0b60: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44 45   FROM t1;.    DE
0b70: 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20  LETE FROM t2;.  
0b80: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33    DELETE FROM t3
0b90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 73  ;.  }.  sqlite3s
0ba0: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
0bb0: 0a 20 20 65 76 61 6c 20 24 73 65 74 75 70 0a 0a  .  eval $setup..
0bc0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0bd0: 74 20 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  t 1.$tn.1 {.    
0be0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0bf0: 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b  ALUES(2, 'two');
0c00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0c10: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   t1 VALUES(1, 'o
0c20: 6e 65 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45  ne');.    DELETE
0c30: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e   FROM t2;.    IN
0c40: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0c50: 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a  UES(4, 'four');.
0c60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0c70: 74 32 20 56 41 4c 55 45 53 28 35 2c 20 27 66 69  t2 VALUES(5, 'fi
0c80: 76 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ve');.    INSERT
0c90: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
0ca0: 36 2c 20 27 73 69 78 27 29 3b 0a 20 20 7d 0a 0a  6, 'six');.  }..
0cb0: 20 20 64 6f 5f 63 68 61 6e 67 65 73 65 74 5f 74    do_changeset_t
0cc0: 65 73 74 20 31 2e 32 2e 24 74 6e 2e 32 20 53 20  est 1.2.$tn.2 S 
0cd0: 24 72 65 73 75 6c 74 0a 20 20 64 6f 5f 70 61 74  $result.  do_pat
0ce0: 63 68 73 65 74 5f 74 65 73 74 20 31 2e 32 2e 24  chset_test 1.2.$
0cf0: 74 6e 2e 32 20 53 20 24 72 65 73 75 6c 74 0a 0a  tn.2 S $result..
0d00: 20 20 53 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d    S delete.}..#-
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 32 2e 2a 20 2d  --------.# 2.* -
0d60: 20 69 6e 76 65 72 74 28 29 0a 23 0a 0a 66 6f 72   invert().#..for
0d70: 65 61 63 68 20 7b 74 6e 20 73 65 74 75 70 20 72  each {tn setup r
0d80: 65 73 75 6c 74 7d 20 7b 0a 20 20 31 20 7b 0a 20  esult} {.  1 {. 
0d90: 20 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20 20     S attach *.  
0da0: 7d 20 7b 0a 20 20 20 20 7b 44 45 4c 45 54 45 20  } {.    {DELETE 
0db0: 74 32 20 30 20 58 2e 20 7b 69 20 34 20 74 20 66  t2 0 X. {i 4 t f
0dc0: 6f 75 72 7d 20 7b 7d 7d 20 0a 20 20 20 20 7b 44  our} {}} .    {D
0dd0: 45 4c 45 54 45 20 74 32 20 30 20 58 2e 20 7b 69  ELETE t2 0 X. {i
0de0: 20 35 20 74 20 66 69 76 65 7d 20 7b 7d 7d 20 0a   5 t five} {}} .
0df0: 20 20 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30      {DELETE t1 0
0e00: 20 58 2e 20 7b 69 20 31 20 74 20 6f 6e 65 7d 20   X. {i 1 t one} 
0e10: 7b 7d 7d 0a 20 20 20 20 7b 44 45 4c 45 54 45 20  {}}.    {DELETE 
0e20: 74 33 20 30 20 58 2e 20 7b 69 20 36 20 74 20 73  t3 0 X. {i 6 t s
0e30: 69 78 7d 20 7b 7d 7d 20 0a 20 20 7d 0a 0a 20 20  ix} {}} .  }..  
0e40: 32 20 7b 0a 20 20 20 20 53 20 61 74 74 61 63 68  2 {.    S attach
0e50: 20 74 31 0a 20 20 20 20 53 20 61 74 74 61 63 68   t1.    S attach
0e60: 20 2a 0a 20 20 7d 20 7b 0a 20 20 20 20 7b 44 45   *.  } {.    {DE
0e70: 4c 45 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20  LETE t1 0 X. {i 
0e80: 31 20 74 20 6f 6e 65 7d 20 7b 7d 7d 0a 20 20 20  1 t one} {}}.   
0e90: 20 7b 44 45 4c 45 54 45 20 74 32 20 30 20 58 2e   {DELETE t2 0 X.
0ea0: 20 7b 69 20 34 20 74 20 66 6f 75 72 7d 20 7b 7d   {i 4 t four} {}
0eb0: 7d 20 0a 20 20 20 20 7b 44 45 4c 45 54 45 20 74  } .    {DELETE t
0ec0: 32 20 30 20 58 2e 20 7b 69 20 35 20 74 20 66 69  2 0 X. {i 5 t fi
0ed0: 76 65 7d 20 7b 7d 7d 20 0a 20 20 20 20 7b 44 45  ve} {}} .    {DE
0ee0: 4c 45 54 45 20 74 33 20 30 20 58 2e 20 7b 69 20  LETE t3 0 X. {i 
0ef0: 36 20 74 20 73 69 78 7d 20 7b 7d 7d 20 0a 20 20  6 t six} {}} .  
0f00: 7d 0a 0a 20 20 33 20 7b 0a 20 20 20 20 53 20 61  }..  3 {.    S a
0f10: 74 74 61 63 68 20 74 33 0a 20 20 20 20 53 20 61  ttach t3.    S a
0f20: 74 74 61 63 68 20 74 32 0a 20 20 20 20 53 20 61  ttach t2.    S a
0f30: 74 74 61 63 68 20 74 31 0a 20 20 7d 20 7b 0a 20  ttach t1.  } {. 
0f40: 20 20 20 7b 44 45 4c 45 54 45 20 74 33 20 30 20     {DELETE t3 0 
0f50: 58 2e 20 7b 69 20 36 20 74 20 73 69 78 7d 20 7b  X. {i 6 t six} {
0f60: 7d 7d 20 0a 20 20 20 20 7b 44 45 4c 45 54 45 20  }} .    {DELETE 
0f70: 74 32 20 30 20 58 2e 20 7b 69 20 34 20 74 20 66  t2 0 X. {i 4 t f
0f80: 6f 75 72 7d 20 7b 7d 7d 20 0a 20 20 20 20 7b 44  our} {}} .    {D
0f90: 45 4c 45 54 45 20 74 32 20 30 20 58 2e 20 7b 69  ELETE t2 0 X. {i
0fa0: 20 35 20 74 20 66 69 76 65 7d 20 7b 7d 7d 20 0a   5 t five} {}} .
0fb0: 20 20 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30      {DELETE t1 0
0fc0: 20 58 2e 20 7b 69 20 31 20 74 20 6f 6e 65 7d 20   X. {i 1 t one} 
0fd0: 7b 7d 7d 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 78  {}}.  }.} {.  ex
0fe0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
0ff0: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  TE FROM t1;.    
1000: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
1010: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
1020: 74 33 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t3;.  }.  sqlite
1030: 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61  3session S db ma
1040: 69 6e 0a 20 20 65 76 61 6c 20 24 73 65 74 75 70  in.  eval $setup
1050: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
1060: 65 73 74 20 31 2e 24 74 6e 2e 31 20 7b 0a 20 20  est 1.$tn.1 {.  
1070: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1080: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
1090: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
10a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
10b0: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 44 45 4c 45  'one');.    DELE
10c0: 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  TE FROM t2;.    
10d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
10e0: 41 4c 55 45 53 28 34 2c 20 27 66 6f 75 72 27 29  ALUES(4, 'four')
10f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1100: 4f 20 74 32 20 56 41 4c 55 45 53 28 35 2c 20 27  O t2 VALUES(5, '
1110: 66 69 76 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  five');.    INSE
1120: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1130: 53 28 36 2c 20 27 73 69 78 27 29 3b 0a 20 20 7d  S(6, 'six');.  }
1140: 0a 0a 20 20 64 6f 5f 63 68 61 6e 67 65 73 65 74  ..  do_changeset
1150: 5f 69 6e 76 65 72 74 5f 74 65 73 74 20 32 2e 24  _invert_test 2.$
1160: 74 6e 2e 32 20 53 20 24 72 65 73 75 6c 74 0a 0a  tn.2 S $result..
1170: 20 20 53 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d    S delete.}..#-
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 33 2e 2a 20 2d  --------.# 3.* -
11d0: 20 63 6f 6e 63 61 74 28 29 0a 23 0a 66 6f 72 65   concat().#.fore
11e0: 61 63 68 20 7b 74 6e 20 73 65 74 75 70 31 20 73  ach {tn setup1 s
11f0: 71 6c 31 20 73 65 74 75 70 32 20 73 71 6c 32 20  ql1 setup2 sql2 
1200: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 31 20 7b 0a  result} {.  1 {.
1210: 20 20 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20      S attach *. 
1220: 20 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20   } {.    INSERT 
1230: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
1240: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e  , 'one');.    IN
1250: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1260: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
1270: 20 7d 20 7b 0a 20 20 20 20 53 20 61 74 74 61 63   } {.    S attac
1280: 68 20 74 32 0a 20 20 20 20 53 20 61 74 74 61 63  h t2.    S attac
1290: 68 20 74 31 0a 20 20 7d 20 7b 0a 20 20 20 20 49  h t1.  } {.    I
12a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
12b0: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
12c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12d0: 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27  O t2 VALUES(4, '
12e0: 66 6f 75 72 27 29 3b 0a 20 20 7d 20 7b 0a 20 20  four');.  } {.  
12f0: 20 20 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58    {INSERT t1 0 X
1300: 2e 20 7b 7d 20 7b 69 20 31 20 74 20 6f 6e 65 7d  . {} {i 1 t one}
1310: 7d 20 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74  } .    {INSERT t
1320: 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 33 20 74  1 0 X. {} {i 3 t
1330: 20 74 68 72 65 65 7d 7d 20 0a 20 20 20 20 7b 49   three}} .    {I
1340: 4e 53 45 52 54 20 74 32 20 30 20 58 2e 20 7b 7d  NSERT t2 0 X. {}
1350: 20 7b 69 20 32 20 74 20 74 77 6f 7d 7d 0a 20 20   {i 2 t two}}.  
1360: 20 20 7b 49 4e 53 45 52 54 20 74 32 20 30 20 58    {INSERT t2 0 X
1370: 2e 20 7b 7d 20 7b 69 20 34 20 74 20 66 6f 75 72  . {} {i 4 t four
1380: 7d 7d 0a 20 20 7d 0a 0a 20 20 31 20 7b 0a 20 20  }}.  }..  1 {.  
1390: 20 20 53 20 61 74 74 61 63 68 20 74 32 0a 20 20    S attach t2.  
13a0: 20 20 53 20 61 74 74 61 63 68 20 74 31 0a 20 20    S attach t1.  
13b0: 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  } {.    INSERT I
13c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
13d0: 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53   'one');.    INS
13e0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
13f0: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
1400: 7d 20 7b 0a 20 20 20 20 53 20 61 74 74 61 63 68  } {.    S attach
1410: 20 2a 0a 20 20 7d 20 7b 0a 20 20 20 20 49 4e 53   *.  } {.    INS
1420: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1430: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
1440: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1450: 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f  t2 VALUES(4, 'fo
1460: 75 72 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20  ur');.  } {.    
1470: 7b 49 4e 53 45 52 54 20 74 32 20 30 20 58 2e 20  {INSERT t2 0 X. 
1480: 7b 7d 20 7b 69 20 32 20 74 20 74 77 6f 7d 7d 0a  {} {i 2 t two}}.
1490: 20 20 20 20 7b 49 4e 53 45 52 54 20 74 32 20 30      {INSERT t2 0
14a0: 20 58 2e 20 7b 7d 20 7b 69 20 34 20 74 20 66 6f   X. {} {i 4 t fo
14b0: 75 72 7d 7d 0a 20 20 20 20 7b 49 4e 53 45 52 54  ur}}.    {INSERT
14c0: 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31   t1 0 X. {} {i 1
14d0: 20 74 20 6f 6e 65 7d 7d 20 0a 20 20 20 20 7b 49   t one}} .    {I
14e0: 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d  NSERT t1 0 X. {}
14f0: 20 7b 69 20 33 20 74 20 74 68 72 65 65 7d 7d 20   {i 3 t three}} 
1500: 0a 20 20 7d 0a 0a 20 20 31 20 7b 0a 20 20 20 20  .  }..  1 {.    
1510: 53 20 61 74 74 61 63 68 20 2a 0a 20 20 7d 20 7b  S attach *.  } {
1520: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1530: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t2 VALUES(2, 't
1540: 77 6f 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20  wo');.  } {.    
1550: 53 20 61 74 74 61 63 68 20 2a 0a 20 20 7d 20 7b  S attach *.  } {
1560: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1570: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74   t1 VALUES(3, 't
1580: 68 72 65 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  hree');.    INSE
1590: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
15a0: 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20  S(4, 'four');.  
15b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
15c0: 20 56 41 4c 55 45 53 28 35 2c 20 27 66 69 76 65   VALUES(5, 'five
15d0: 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 7b 49  ');.  } {.    {I
15e0: 4e 53 45 52 54 20 74 32 20 30 20 58 2e 20 7b 7d  NSERT t2 0 X. {}
15f0: 20 7b 69 20 32 20 74 20 74 77 6f 7d 7d 0a 20 20   {i 2 t two}}.  
1600: 20 20 7b 49 4e 53 45 52 54 20 74 32 20 30 20 58    {INSERT t2 0 X
1610: 2e 20 7b 7d 20 7b 69 20 34 20 74 20 66 6f 75 72  . {} {i 4 t four
1620: 7d 7d 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74  }}.    {INSERT t
1630: 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 33 20 74  1 0 X. {} {i 3 t
1640: 20 74 68 72 65 65 7d 7d 20 0a 20 20 20 20 7b 49   three}} .    {I
1650: 4e 53 45 52 54 20 74 33 20 30 20 58 2e 20 7b 7d  NSERT t3 0 X. {}
1660: 20 7b 69 20 35 20 74 20 66 69 76 65 7d 7d 20 0a   {i 5 t five}} .
1670: 20 20 7d 0a 0a 7d 20 7b 0a 20 20 65 78 65 63 73    }..} {.  execs
1680: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
1690: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44 45 4c  FROM t1;.    DEL
16a0: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ETE FROM t2;.   
16b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b   DELETE FROM t3;
16c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 73 65  .  }.  sqlite3se
16d0: 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a  ssion S db main.
16e0: 20 20 65 76 61 6c 20 24 73 65 74 75 70 31 0a 20    eval $setup1. 
16f0: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 31 0a 20   execsql $sql1. 
1700: 20 73 65 74 20 63 31 20 5b 53 20 63 68 61 6e 67   set c1 [S chang
1710: 65 73 65 74 5d 0a 20 20 53 20 64 65 6c 65 74 65  eset].  S delete
1720: 0a 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69  ..  sqlite3sessi
1730: 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 65  on S db main.  e
1740: 76 61 6c 20 24 73 65 74 75 70 32 0a 20 20 65 78  val $setup2.  ex
1750: 65 63 73 71 6c 20 24 73 71 6c 32 0a 20 20 73 65  ecsql $sql2.  se
1760: 74 20 63 32 20 5b 53 20 63 68 61 6e 67 65 73 65  t c2 [S changese
1770: 74 5d 0a 20 20 53 20 64 65 6c 65 74 65 0a 0a 20  t].  S delete.. 
1780: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a   set res [list].
1790: 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
17a0: 5f 66 6f 72 65 61 63 68 20 78 20 5b 73 71 6c 69  _foreach x [sqli
17b0: 74 65 33 63 68 61 6e 67 65 73 65 74 5f 63 6f 6e  te3changeset_con
17c0: 63 61 74 20 24 63 31 20 24 63 32 5d 20 7b 0a 20  cat $c1 $c2] {. 
17d0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 24     lappend res $
17e0: 78 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  x.  }..  do_test
17f0: 20 33 2e 24 74 6e 20 7b 20 73 65 74 20 72 65 73   3.$tn { set res
1800: 20 7d 20 5b 6c 69 73 74 20 7b 2a 7d 24 72 65 73   } [list {*}$res
1810: 75 6c 74 5d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f  ult].}...finish_
1820: 74 65 73 74 0a 0a                                test..