1*07d0f15eSdan# 2015-07-31 2*07d0f15eSdan# 3*07d0f15eSdan# The author disclaims copyright to this source code. In place of 4*07d0f15eSdan# a legal notice, here is a blessing: 5*07d0f15eSdan# 6*07d0f15eSdan# May you do good and not evil. 7*07d0f15eSdan# May you find forgiveness for yourself and forgive others. 8*07d0f15eSdan# May you share freely, never taking more than you give. 9*07d0f15eSdan# 10*07d0f15eSdan#*********************************************************************** 11*07d0f15eSdan# 12*07d0f15eSdan# Tests for the [sqldiff --changeset] command. 13*07d0f15eSdan# 14*07d0f15eSdan# 15*07d0f15eSdanif {![info exists testdir]} { 16*07d0f15eSdan set testdir [file join [file dirname [info script]] .. .. test] 17*07d0f15eSdan} 18*07d0f15eSdansource $testdir/tester.tcl 19*07d0f15eSdanset testprefix sessiondiff 20*07d0f15eSdan 21*07d0f15eSdanset PROG [test_find_sqldiff] 22*07d0f15eSdandb close 23*07d0f15eSdan 24*07d0f15eSdanproc sqlesc {id} { 25*07d0f15eSdan set ret "'[string map {' ''} $id]'" 26*07d0f15eSdan set ret 27*07d0f15eSdan} 28*07d0f15eSdan 29*07d0f15eSdanproc database_cksum {db1} { 30*07d0f15eSdan set txt "" 31*07d0f15eSdan 32*07d0f15eSdan sqlite3 dbtmp $db1 33*07d0f15eSdan foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { 34*07d0f15eSdan set cols [list] 35*07d0f15eSdan dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" { 36*07d0f15eSdan lappend cols "quote( $name )" 37*07d0f15eSdan } 38*07d0f15eSdan append txt [dbtmp eval \ 39*07d0f15eSdan "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1" 40*07d0f15eSdan ] 41*07d0f15eSdan } 42*07d0f15eSdan dbtmp close 43*07d0f15eSdan 44*07d0f15eSdan md5 $txt 45*07d0f15eSdan} 46*07d0f15eSdan 47*07d0f15eSdanproc readfile {filename} { 48*07d0f15eSdan set fd [open $filename] 49*07d0f15eSdan fconfigure $fd -translation binary -encoding binary 50*07d0f15eSdan set data [read $fd] 51*07d0f15eSdan close $fd 52*07d0f15eSdan set data 53*07d0f15eSdan} 54*07d0f15eSdan 55*07d0f15eSdanproc get_changeset {db1 db2} { 56*07d0f15eSdan exec $::PROG --changeset changeset.bin $db1 $db2 57*07d0f15eSdan set bin [readfile changeset.bin] 58*07d0f15eSdan return $bin 59*07d0f15eSdan} 60*07d0f15eSdan 61*07d0f15eSdanproc xConflict {args} { 62*07d0f15eSdan return "" 63*07d0f15eSdan} 64*07d0f15eSdan 65*07d0f15eSdanproc do_changeset_test {tn sql1 sql2} { 66*07d0f15eSdan forcedelete test.db123 test.db124 67*07d0f15eSdan 68*07d0f15eSdan sqlite3 db test.db123 69*07d0f15eSdan db eval $sql1 70*07d0f15eSdan db close 71*07d0f15eSdan 72*07d0f15eSdan sqlite3 db test.db124 73*07d0f15eSdan db eval $sql2 74*07d0f15eSdan 75*07d0f15eSdan set cs [get_changeset test.db124 test.db123] 76*07d0f15eSdan sqlite3changeset_apply db $cs xConflict 77*07d0f15eSdan db close 78*07d0f15eSdan 79*07d0f15eSdan set database_cksum1 [database_cksum test.db123] 80*07d0f15eSdan set database_cksum2 [database_cksum test.db124] 81*07d0f15eSdan 82*07d0f15eSdan uplevel [list \ 83*07d0f15eSdan do_test $tn [list string compare $database_cksum1 $database_cksum2] 0 84*07d0f15eSdan ] 85*07d0f15eSdan} 86*07d0f15eSdan 87*07d0f15eSdando_changeset_test 1.0 { 88*07d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 89*07d0f15eSdan} { 90*07d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 91*07d0f15eSdan} 92*07d0f15eSdan 93*07d0f15eSdando_changeset_test 1.1 { 94*07d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 95*07d0f15eSdan CREATE TABLE t2(x PRIMARY KEY, y); 96*07d0f15eSdan INSERT INTO t2 VALUES(1, 2); 97*07d0f15eSdan} { 98*07d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 99*07d0f15eSdan CREATE TABLE t2(x PRIMARY KEY, y); 100*07d0f15eSdan INSERT INTO t2 VALUES(3, 4); 101*07d0f15eSdan} 102*07d0f15eSdan 103*07d0f15eSdando_changeset_test 1.2 { 104*07d0f15eSdan CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 105*07d0f15eSdan INSERT INTO t2 VALUES(1, 2, 3); 106*07d0f15eSdan INSERT INTO t2 VALUES(4, 5, 6); 107*07d0f15eSdan} { 108*07d0f15eSdan CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 109*07d0f15eSdan INSERT INTO t2 VALUES(1, 2, 11); 110*07d0f15eSdan INSERT INTO t2 VALUES(7, 8, 9); 111*07d0f15eSdan} 112*07d0f15eSdan 113*07d0f15eSdanfinish_test 114*07d0f15eSdan 115