xref: /sqlite-3.40.0/ext/session/sessionD.test (revision cf8e9144)
1# 2014 August 16
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# This file focuses on the sqlite3session_diff() function.
12#
13
14if {![info exists testdir]} {
15  set testdir [file join [file dirname [info script]] .. .. test]
16}
17source [file join [file dirname [info script]] session_common.tcl]
18source $testdir/tester.tcl
19ifcapable !session {finish_test; return}
20
21set testprefix sessionD
22
23proc scksum {db dbname} {
24
25  if {$dbname=="temp"} {
26    set master sqlite_temp_master
27  } else {
28    set master $dbname.sqlite_master
29  }
30
31  set alltab [$db eval "SELECT name FROM $master WHERE type='table'"]
32  set txt [$db eval "SELECT * FROM $master ORDER BY type,name,sql"]
33  foreach tab $alltab {
34    set cols [list]
35    db eval "PRAGMA $dbname.table_info = $tab" x {
36      lappend cols "quote($x(name))"
37    }
38    set cols [join $cols ,]
39    append txt [db eval "SELECT $cols FROM $tab ORDER BY $cols"]
40  }
41  return [md5 $txt]
42}
43
44proc do_diff_test {tn setup} {
45  reset_db
46  forcedelete test.db2
47  execsql { ATTACH 'test.db2' AS aux }
48  execsql $setup
49
50  sqlite3session S db main
51  foreach tbl [db eval {SELECT name FROM sqlite_master WHERE type='table'}] {
52    S attach $tbl
53    S diff aux $tbl
54  }
55
56  set C [S changeset]
57  S delete
58
59  sqlite3 db2 test.db2
60  sqlite3changeset_apply db2 $C ""
61  uplevel do_test $tn.1 [list {execsql { PRAGMA integrity_check } db2}] ok
62  db2 close
63
64  set cksum [scksum db main]
65  uplevel do_test $tn.2 [list {scksum db aux}] [list $cksum]
66}
67
68
69forcedelete test.db2
70do_execsql_test 1.0 {
71  CREATE TABLE t2(a PRIMARY KEY, b);
72  INSERT INTO t2 VALUES(1, 'one');
73  INSERT INTO t2 VALUES(2, 'two');
74
75  ATTACH 'test.db2' AS aux;
76  CREATE TABLE aux.t2(a PRIMARY KEY, b);
77}
78
79do_test 1.1 {
80  sqlite3session S db main
81  S attach t2
82  S diff aux t2
83  set C [S changeset]
84  S delete
85} {}
86
87do_test 1.2 {
88  sqlite3 db2 test.db2
89  sqlite3changeset_apply db2 $C ""
90  db2 close
91  db eval { SELECT * FROM aux.t2 }
92} {1 one 2 two}
93
94do_diff_test 2.1 {
95  CREATE TABLE aux.t1(x, y, PRIMARY KEY(y));
96  CREATE TABLE t1(x, y, PRIMARY KEY(y));
97
98  INSERT INTO t1 VALUES(1, 2);
99  INSERT INTO t1 VALUES(NULL, 'xyz');
100  INSERT INTO t1 VALUES(4.5, 5.5);
101}
102
103do_diff_test 2.2 {
104  CREATE TABLE aux.t1(x, y, PRIMARY KEY(y));
105  CREATE TABLE t1(x, y, PRIMARY KEY(y));
106
107  INSERT INTO aux.t1 VALUES(1, 2);
108  INSERT INTO aux.t1 VALUES(NULL, 'xyz');
109  INSERT INTO aux.t1 VALUES(4.5, 5.5);
110}
111
112do_diff_test 2.3 {
113  CREATE TABLE aux.t1(a PRIMARY KEY, b TEXT);
114  CREATE TABLE t1(a PRIMARY KEY, b TEXT);
115
116  INSERT INTO aux.t1 VALUES(1, 'one');
117  INSERT INTO aux.t1 VALUES(2, 'two');
118  INSERT INTO aux.t1 VALUES(3, 'three');
119
120  INSERT INTO t1 VALUES(1, 'I');
121  INSERT INTO t1 VALUES(2, 'two');
122  INSERT INTO t1 VALUES(3, 'III');
123}
124
125do_diff_test 2.4 {
126  CREATE TABLE aux.t1(a, b, c, d, PRIMARY KEY(c, b, a));
127  CREATE TABLE t1(a, b, c, d, PRIMARY KEY(c, b, a));
128
129  INSERT INTO t1 VALUES('hvkzyipambwdqlvwv','',-458331.50,X'DA51ED5E84');
130  INSERT INTO t1 VALUES(X'C5C6B5DD','jjxrath',40917,830244);
131  INSERT INTO t1 VALUES(-204877.54,X'1704C253D5F3AFA8',155120.88,NULL);
132  INSERT INTO t1
133  VALUES('ckmqmzoeuvxisxqy',X'EB5A5D3A1DD22FD1','tidhjcbvbppdt',-642987.37);
134  INSERT INTO t1 VALUES(-851726,-161992,-469943,-159541);
135  INSERT INTO t1 VALUES(X'4A6A667F858938',185083,X'7A',NULL);
136
137  INSERT INTO aux.t1 VALUES(415075.74,'auawczkb',X'',X'57B4FAAF2595');
138  INSERT INTO aux.t1 VALUES(727637,711560,-181340,'hphuo');
139  INSERT INTO aux.t1
140  VALUES(-921322.81,662959,'lvlgwdgxaurr','ajjrzrbhqflsutnymgc');
141  INSERT INTO aux.t1 VALUES(-146061,-377892,X'4E','gepvpvvuhszpxabbb');
142  INSERT INTO aux.t1 VALUES(-851726,-161992,-469943,-159541);
143  INSERT INTO aux.t1 VALUES(X'4A6A667F858938',185083,X'7A',NULL);
144  INSERT INTO aux.t1 VALUES(-204877.54,X'1704C253D5F3AFA8',155120.88, 4);
145  INSERT INTO aux.t1
146  VALUES('ckmqmzoeuvxisxqy',X'EB5A5D3A1DD22FD1','tidgtsplhjcbvbppdt',-642987.3);
147}
148
149finish_test
150
151