--- /dev/null
+# 2015-07-31
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Tests for the [sqldiff --changeset] command.
+#
+#
+if {![info exists testdir]} {
+ set testdir [file join [file dirname [info script]] .. .. test]
+}
+source $testdir/tester.tcl
+set testprefix sessiondiff
+
+set PROG [test_find_sqldiff]
+db close
+
+proc sqlesc {id} {
+ set ret "'[string map {' ''} $id]'"
+ set ret
+}
+
+proc database_cksum {db1} {
+ set txt ""
+
+ sqlite3 dbtmp $db1
+ foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] {
+ set cols [list]
+ dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" {
+ lappend cols "quote( $name )"
+ }
+ append txt [dbtmp eval \
+ "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1"
+ ]
+ }
+ dbtmp close
+
+ md5 $txt
+}
+
+proc readfile {filename} {
+ set fd [open $filename]
+ fconfigure $fd -translation binary -encoding binary
+ set data [read $fd]
+ close $fd
+ set data
+}
+
+proc get_changeset {db1 db2} {
+ exec $::PROG --changeset changeset.bin $db1 $db2
+ set bin [readfile changeset.bin]
+ return $bin
+}
+
+proc xConflict {args} {
+ return ""
+}
+
+proc do_changeset_test {tn sql1 sql2} {
+ forcedelete test.db123 test.db124
+
+ sqlite3 db test.db123
+ db eval $sql1
+ db close
+
+ sqlite3 db test.db124
+ db eval $sql2
+
+ set cs [get_changeset test.db124 test.db123]
+ sqlite3changeset_apply db $cs xConflict
+ db close
+
+ set database_cksum1 [database_cksum test.db123]
+ set database_cksum2 [database_cksum test.db124]
+
+ uplevel [list \
+ do_test $tn [list string compare $database_cksum1 $database_cksum2] 0
+ ]
+}
+
+do_changeset_test 1.0 {
+ CREATE TABLE t1(x PRIMARY KEY);
+} {
+ CREATE TABLE t1(x PRIMARY KEY);
+}
+
+do_changeset_test 1.1 {
+ CREATE TABLE t1(x PRIMARY KEY);
+ CREATE TABLE t2(x PRIMARY KEY, y);
+ INSERT INTO t2 VALUES(1, 2);
+} {
+ CREATE TABLE t1(x PRIMARY KEY);
+ CREATE TABLE t2(x PRIMARY KEY, y);
+ INSERT INTO t2 VALUES(3, 4);
+}
+
+do_changeset_test 1.2 {
+ CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
+ INSERT INTO t2 VALUES(1, 2, 3);
+ INSERT INTO t2 VALUES(4, 5, 6);
+} {
+ CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c));
+ INSERT INTO t2 VALUES(1, 2, 11);
+ INSERT INTO t2 VALUES(7, 8, 9);
+}
+
+finish_test
+
p->in.iCurrent = p->in.iNext;
op = p->in.aData[p->in.iNext++];
- if( op=='T' || op=='P' ){
+ while( op=='T' || op=='P' ){
p->bPatchset = (op=='P');
if( sessionChangesetReadTblhdr(p) ) return p->rc;
if( (p->rc = sessionInputBuffer(&p->in, 2)) ) return p->rc;
p->in.iCurrent = p->in.iNext;
+ if( p->in.iNext>=p->in.nData ) return SQLITE_DONE;
op = p->in.aData[p->in.iNext++];
}
-C Add\sthe\s".cd"\scommand\sto\sthe\scommand-line\sshell.
-D 2017-05-22T18:00:34.366
+C Fix\sincompatibilities\sbetween\sthe\s"sqldiff\s--changeset"\scommand\sand\sthe\nsessions\smodule.\sSpecifically,\sallow\ssessions\sto\sprocess\schangesets\scontaining\ntables\swith\szero\soperations\son\sthem\sand\shave\ssqldiff\soutput\sthe\sexpected\noutput\sfor\stables\swith\smulti-column\sprimary\skeys.
+D 2017-05-22T18:09:00.314
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc
F ext/session/session_common.tcl 7776eda579773113b30c7abfd4545c445228cb73
F ext/session/session_speed_test.c edc1f96fd5e0e4b16eb03e2a73041013d59e8723
F ext/session/sessionat.test b25d61d663ebc795506bf74079dc4ba0092fad25
+F ext/session/sessiondiff.test 7889d8e84cd130fe3712ed7c511f883e0b2a398ed2905d54e48a24edce49bfab
F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0
F ext/session/sessionwor.test 2f3744236dc8b170a695b7d8ddc8c743c7e79fdc
-F ext/session/sqlite3session.c 13642d9c754cc18f17e141f82860d269e2adf920
+F ext/session/sqlite3session.c cc127222a9ea6f4eaa31281aa9da924f5244f6099be0ee526c950684fb3513a6
F ext/session/sqlite3session.h d4db650adfcc7a4360e9f12a09c2d117b1db6b53
F ext/session/test_session.c eb0bd6c1ea791c1d66ee4ef94c16500dad936386
F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
-F tool/sqldiff.c 3fb48a6c6669d2d2c59a7f072a410dd2583579b4
+F tool/sqldiff.c 30879bbc8de686df4624e86adce2d8981f500904c1cfb55b5d1eea2ffd9341eb
F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f
F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43
F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P ab471f61ef7d9ed1bf937d5e458f720d12209712a015786434edc818a98168c9
-R cac670b792c55b8eecc1a284a755f203
-U drh
-Z c2c82ac037c73e1a656500d3e1322e3f
+P 5fe28e15b1d6d8a588fcaf93c6035c0e0ab7bcad1067c7933cd430d2e04bbbd8
+R 2d56bb57c0e0c8bd5e55aee1a5f807c8
+U dan
+Z 7418f4c983b5d3f6cb32f89acb7a72f6
-5fe28e15b1d6d8a588fcaf93c6035c0e0ab7bcad1067c7933cd430d2e04bbbd8
\ No newline at end of file
+0bb23c48064cc64134697469f3f4d2d3610b9e6c7a0dc54a3c47a00bd6c2a860
\ No newline at end of file
putc('T', out);
putsVarint(out, (sqlite3_uint64)nCol);
- for(i=0; i<nCol; i++) putc(aiFlg[i]!=0, out);
+ for(i=0; i<nCol; i++) putc(aiFlg[i], out);
fwrite(zTab, 1, strlen(zTab), out);
putc(0, out);