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