From: dan Date: Mon, 22 May 2017 18:09:00 +0000 (+0000) Subject: Fix incompatibilities between the "sqldiff --changeset" command and the X-Git-Tag: version-3.20.0~255 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=07d0f15e9354e668510095fd85fa83ac36dd82d2;p=thirdparty%2Fsqlite.git Fix incompatibilities between the "sqldiff --changeset" command and the sessions module. Specifically, allow sessions to process changesets containing tables with zero operations on them and have sqldiff output the expected output for tables with multi-column primary keys. FossilOrigin-Name: 0bb23c48064cc64134697469f3f4d2d3610b9e6c7a0dc54a3c47a00bd6c2a860 --- diff --git a/ext/session/sessiondiff.test b/ext/session/sessiondiff.test new file mode 100644 index 0000000000..f2a8a2c724 --- /dev/null +++ b/ext/session/sessiondiff.test @@ -0,0 +1,114 @@ +# 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 + diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 8dde8501a3..d5cb467374 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -2836,11 +2836,12 @@ static int sessionChangesetNext( 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++]; } diff --git a/manifest b/manifest index 7a8007036c..8a8a5ca0ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 @@ -315,10 +315,11 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 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 @@ -1547,7 +1548,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff 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 @@ -1580,7 +1581,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 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 diff --git a/manifest.uuid b/manifest.uuid index b9752fa715..d874546437 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5fe28e15b1d6d8a588fcaf93c6035c0e0ab7bcad1067c7933cd430d2e04bbbd8 \ No newline at end of file +0bb23c48064cc64134697469f3f4d2d3610b9e6c7a0dc54a3c47a00bd6c2a860 \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 67f3197bbf..b31489bfd7 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -1667,7 +1667,7 @@ static void changeset_one_table(const char *zTab, FILE *out){ putc('T', out); putsVarint(out, (sqlite3_uint64)nCol); - for(i=0; i