mirror of
https://github.com/sqlite/sqlite.git
synced 2025-06-04 20:42:35 +03:00
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
This commit is contained in:
parent
453ca043a2
commit
07d0f15e93
114
ext/session/sessiondiff.test
Normal file
114
ext/session/sessiondiff.test
Normal file
@ -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
|
||||
|
@ -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++];
|
||||
}
|
||||
|
||||
|
17
manifest
17
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
|
||||
|
@ -1 +1 @@
|
||||
5fe28e15b1d6d8a588fcaf93c6035c0e0ab7bcad1067c7933cd430d2e04bbbd8
|
||||
0bb23c48064cc64134697469f3f4d2d3610b9e6c7a0dc54a3c47a00bd6c2a860
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user