1# 2018 November 08
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12
13if {![info exists testdir]} {
14  set testdir [file join [file dirname [info script]] .. .. test]
15}
16source [file join [file dirname [info script]] session_common.tcl]
17source $testdir/tester.tcl
18ifcapable !session {finish_test; return}
19set testprefix changesetfuzz1
20
21
22set CF [test_find_binary changesetfuzz]
23if {$CF==""} {
24  finish_test
25  return
26}
27
28proc writefile {zFile data} {
29  set fd [open $zFile w]
30  fconfigure $fd -translation binary -encoding binary
31  puts -nonewline $fd $data
32  close $fd
33}
34
35do_execsql_test 1.0 {
36  CREATE TABLE t1(a, b, c, d, PRIMARY KEY(c, d));
37  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
38
39  INSERT INTO t1 VALUES ('one', 'two', 'three', 'four'),
40                        ('five', 'six', 'seven', 'eight'),
41                        ('nine', 'ten', 'eleven', 'twelve');
42  INSERT INTO t2 VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
43}
44
45set C [changeset_from_sql {
46  INSERT INTO t2 VALUES(10, 11, 12);
47  DELETE FROM t2 WHERE a=1;
48  UPDATE t1 SET b='forty-five' WHERE a='one';
49  UPDATE t1 SET a='twenty-nine', b='seventy' WHERE a='five';
50}]
51writefile c1.changeset $C
52
53do_test 1.1 {
54  for {set j 0} {$j < 200} {incr j} {
55    forcecopy c1.changeset input.changeset
56    for {set i 0} {$i < 6} {incr i} {
57      exec $CF input.changeset $i 1
58      exec $CF input.changeset-0
59      forcecopy input.changeset-0 input.changeset
60    }
61  }
62} {}
63
64set P [patchset_from_sql {
65  INSERT INTO t2 VALUES(13, 14, 15);
66  DELETE FROM t2 WHERE a=4;
67  UPDATE t1 SET b='thirteen' WHERE a='one';
68  UPDATE t1 SET a='ninety-seven', b='twenty' WHERE a='five';
69}]
70writefile p1.patchset $P
71do_test 1.2 {
72  for {set j 0} {$j < 200} {incr j} {
73    forcecopy p1.patchset input.patchset
74    for {set i 0} {$i < 6} {incr i} {
75      exec $CF input.patchset $i 1
76      exec $CF input.patchset-0
77      forcecopy input.patchset-0 input.patchset
78    }
79  }
80} {}
81
82
83finish_test
84
85