]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix incompatibilities between the "sqldiff --changeset" command and the
authordan <dan@noemail.net>
Mon, 22 May 2017 18:09:00 +0000 (18:09 +0000)
committerdan <dan@noemail.net>
Mon, 22 May 2017 18:09:00 +0000 (18:09 +0000)
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

ext/session/sessiondiff.test [new file with mode: 0644]
ext/session/sqlite3session.c
manifest
manifest.uuid
tool/sqldiff.c

diff --git a/ext/session/sessiondiff.test b/ext/session/sessiondiff.test
new file mode 100644 (file)
index 0000000..f2a8a2c
--- /dev/null
@@ -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
+
index 8dde8501a3967349821f159b1a283d431103f49d..d5cb4673747c9cbd1483b4bd3b782e8c4e524ad3 100644 (file)
@@ -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++];
   }
 
index 7a8007036c841f0ffe6a902056a03c8414e0233e..8a8a5ca0ee771d35a1c5d961cc29c9759008a321 100644 (file)
--- 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
index b9752fa7151db76616f5681710dea37b276b43ac..d874546437821051c13dfe8e4f6cc871ba523bd4 100644 (file)
@@ -1 +1 @@
-5fe28e15b1d6d8a588fcaf93c6035c0e0ab7bcad1067c7933cd430d2e04bbbd8
\ No newline at end of file
+0bb23c48064cc64134697469f3f4d2d3610b9e6c7a0dc54a3c47a00bd6c2a860
\ No newline at end of file
index 67f3197bbfeb75a04a75fa43a84a9b59ae9642d5..b31489bfd7d318eedbdb824cac29ead629b3f6a9 100644 (file)
@@ -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<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);