107d0f15eSdan# 2015-07-31 207d0f15eSdan# 307d0f15eSdan# The author disclaims copyright to this source code. In place of 407d0f15eSdan# a legal notice, here is a blessing: 507d0f15eSdan# 607d0f15eSdan# May you do good and not evil. 707d0f15eSdan# May you find forgiveness for yourself and forgive others. 807d0f15eSdan# May you share freely, never taking more than you give. 907d0f15eSdan# 1007d0f15eSdan#*********************************************************************** 1107d0f15eSdan# 1207d0f15eSdan# Tests for the [sqldiff --changeset] command. 1307d0f15eSdan# 1407d0f15eSdan# 1507d0f15eSdanif {![info exists testdir]} { 1607d0f15eSdan set testdir [file join [file dirname [info script]] .. .. test] 1707d0f15eSdan} 1807d0f15eSdansource $testdir/tester.tcl 19*e46c63d5Sdrhifcapable !session {finish_test; return} 2007d0f15eSdanset testprefix sessiondiff 2107d0f15eSdan 2207d0f15eSdanset PROG [test_find_sqldiff] 2307d0f15eSdandb close 2407d0f15eSdan 2507d0f15eSdanproc sqlesc {id} { 2607d0f15eSdan set ret "'[string map {' ''} $id]'" 2707d0f15eSdan set ret 2807d0f15eSdan} 2907d0f15eSdan 3007d0f15eSdanproc database_cksum {db1} { 3107d0f15eSdan set txt "" 3207d0f15eSdan 3307d0f15eSdan sqlite3 dbtmp $db1 3407d0f15eSdan foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { 3507d0f15eSdan set cols [list] 3607d0f15eSdan dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" { 3707d0f15eSdan lappend cols "quote( $name )" 3807d0f15eSdan } 3907d0f15eSdan append txt [dbtmp eval \ 4007d0f15eSdan "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1" 4107d0f15eSdan ] 4207d0f15eSdan } 4307d0f15eSdan dbtmp close 4407d0f15eSdan 4507d0f15eSdan md5 $txt 4607d0f15eSdan} 4707d0f15eSdan 4807d0f15eSdanproc readfile {filename} { 4907d0f15eSdan set fd [open $filename] 5007d0f15eSdan fconfigure $fd -translation binary -encoding binary 5107d0f15eSdan set data [read $fd] 5207d0f15eSdan close $fd 5307d0f15eSdan set data 5407d0f15eSdan} 5507d0f15eSdan 5607d0f15eSdanproc get_changeset {db1 db2} { 5707d0f15eSdan exec $::PROG --changeset changeset.bin $db1 $db2 5807d0f15eSdan set bin [readfile changeset.bin] 5907d0f15eSdan return $bin 6007d0f15eSdan} 6107d0f15eSdan 6207d0f15eSdanproc xConflict {args} { 6307d0f15eSdan return "" 6407d0f15eSdan} 6507d0f15eSdan 6607d0f15eSdanproc do_changeset_test {tn sql1 sql2} { 6707d0f15eSdan forcedelete test.db123 test.db124 6807d0f15eSdan 6907d0f15eSdan sqlite3 db test.db123 7007d0f15eSdan db eval $sql1 7107d0f15eSdan db close 7207d0f15eSdan 7307d0f15eSdan sqlite3 db test.db124 7407d0f15eSdan db eval $sql2 7507d0f15eSdan 7607d0f15eSdan set cs [get_changeset test.db124 test.db123] 7707d0f15eSdan sqlite3changeset_apply db $cs xConflict 7807d0f15eSdan db close 7907d0f15eSdan 8007d0f15eSdan set database_cksum1 [database_cksum test.db123] 8107d0f15eSdan set database_cksum2 [database_cksum test.db124] 8207d0f15eSdan 8307d0f15eSdan uplevel [list \ 8407d0f15eSdan do_test $tn [list string compare $database_cksum1 $database_cksum2] 0 8507d0f15eSdan ] 8607d0f15eSdan} 8707d0f15eSdan 8807d0f15eSdando_changeset_test 1.0 { 8907d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 9007d0f15eSdan} { 9107d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 9207d0f15eSdan} 9307d0f15eSdan 9407d0f15eSdando_changeset_test 1.1 { 9507d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 9607d0f15eSdan CREATE TABLE t2(x PRIMARY KEY, y); 9707d0f15eSdan INSERT INTO t2 VALUES(1, 2); 9807d0f15eSdan} { 9907d0f15eSdan CREATE TABLE t1(x PRIMARY KEY); 10007d0f15eSdan CREATE TABLE t2(x PRIMARY KEY, y); 10107d0f15eSdan INSERT INTO t2 VALUES(3, 4); 10207d0f15eSdan} 10307d0f15eSdan 10407d0f15eSdando_changeset_test 1.2 { 10507d0f15eSdan CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 10607d0f15eSdan INSERT INTO t2 VALUES(1, 2, 3); 10707d0f15eSdan INSERT INTO t2 VALUES(4, 5, 6); 10807d0f15eSdan} { 10907d0f15eSdan CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 11007d0f15eSdan INSERT INTO t2 VALUES(1, 2, 11); 11107d0f15eSdan INSERT INTO t2 VALUES(7, 8, 9); 11207d0f15eSdan} 11307d0f15eSdan 11407d0f15eSdanfinish_test 115